Ignore:
Timestamp:
Oct 18, 2020, 6:24:38 AM (5 years ago)
Author:
Caio Lima
Message:

[ESNext][JIT] Add support for UntypedUse on PutPrivateName's base operand
https://bugs.webkit.org/show_bug.cgi?id=217373

Reviewed by Yusuke Suzuki.

JSTests:

  • stress/get-private-name-with-primitive.js: Added.
  • stress/put-private-name-untyped-use.js: Added.
  • stress/put-private-name-with-primitive.js: Added.

Source/JavaScriptCore:

This patch is adding UntypedUse for PutPrivateName's base operand to
avoid a OSR when we have a non-cell base.
Also, it is fixing a bug on private field operations get_private_name and
put_private_name to call ToObject on base to properly support
class fields spec text[1][2].

[1] - https://tc39.es/proposal-class-fields/#sec-getvalue
[2] - https://tc39.es/proposal-class-fields/#sec-putvalue

  • dfg/DFGFixupPhase.cpp:

(JSC::DFG::FixupPhase::fixupNode):

  • dfg/DFGSpeculativeJIT.cpp:

(JSC::DFG::SpeculativeJIT::compilePutPrivateName):

  • ftl/FTLLowerDFGToB3.cpp:

(JSC::FTL::DFG::LowerDFGToB3::compilePutPrivateName):

  • jit/JITOperations.cpp:

(JSC::setPrivateField):
(JSC::definePrivateField):
(JSC::JSC_DEFINE_JIT_OPERATION):
(JSC::getPrivateName):

  • jit/JITPropertyAccess.cpp:

(JSC::JIT::emit_op_put_private_name):

  • jit/JITPropertyAccess32_64.cpp:

(JSC::JIT::emit_op_put_private_name):

  • llint/LLIntSlowPaths.cpp:

(JSC::LLInt::LLINT_SLOW_PATH_DECL):

  • runtime/CommonSlowPaths.cpp:

Previous implementation was wrongly considering that base was always
an object, causing segmentation fault when base was not an object.
We changed this to handle cases when base is not and object, following
what spec text specifies.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp

    r268247 r268656  
    10881088    ASSERT(subscript.isSymbol());
    10891089
    1090     baseValue.requireObjectCoercible(globalObject);
     1090    JSObject* baseObject = baseValue.toObject(globalObject);
    10911091    LLINT_CHECK_EXCEPTION();
    10921092    auto property = subscript.toPropertyKey(globalObject);
     
    10941094    ASSERT(property.isPrivateName());
    10951095
    1096     PropertySlot slot(baseValue, PropertySlot::InternalMethodType::GetOwnProperty);
    1097     asObject(baseValue)->getPrivateField(globalObject, property, slot);
     1096    PropertySlot slot(baseObject, PropertySlot::InternalMethodType::GetOwnProperty);
     1097    baseObject->getPrivateField(globalObject, property, slot);
    10981098    LLINT_CHECK_EXCEPTION();
    10991099
    1100     if (!LLINT_ALWAYS_ACCESS_SLOW && slot.isCacheable() && !slot.isUnset()) {
     1100    if (!LLINT_ALWAYS_ACCESS_SLOW && baseValue.isCell() && slot.isCacheable() && !slot.isUnset()) {
    11011101        auto& metadata = bytecode.metadata(codeBlock);
    11021102        {
     
    12081208    JSValue value = getOperand(callFrame, bytecode.m_value);
    12091209
     1210    JSObject* baseObject = baseValue.toObject(globalObject);
     1211    LLINT_CHECK_EXCEPTION();
     1212
    12101213    auto property = subscript.toPropertyKey(globalObject);
    12111214    LLINT_CHECK_EXCEPTION();
     
    12171220    // and class methods are always in strict mode
    12181221    const bool isStrictMode = true;
    1219     auto baseObject = asObject(baseValue);
    12201222    PutPropertySlot slot(baseObject, isStrictMode);
    12211223    if (bytecode.m_putKind.isDefine())
Note: See TracChangeset for help on using the changeset viewer.