Ignore:
Timestamp:
Jan 3, 2022, 8:50:30 AM (3 years ago)
Author:
[email protected]
Message:

[JSC] Read-modify-write operation's second put-to-scope should not throw error if binding does not exist
https://bugs.webkit.org/show_bug.cgi?id=234813

Reviewed by Alexey Shvayka.

JSTests:

  • stress/global-object-read-modify-write-remove-at-get-strict.js: Added.

(shouldThrow):

  • stress/global-object-read-modify-write-remove-at-get.js: Added.

(shouldBe):

  • test262/expectations.yaml:

Source/JavaScriptCore:

This patch fixes a bug throwing RefereceError when read-modify-write's read operation removes binding from object.
Throwing error should happen only when evaluating it under strict mode.

  • bytecompiler/NodesCodegen.cpp:

(JSC::PostfixNode::emitResolve):
(JSC::PrefixNode::emitResolve):
(JSC::ReadModifyResolveNode::emitBytecode):
(JSC::ShortCircuitReadModifyResolveNode::emitBytecode):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r287531 r287544  
    23672367    RefPtr<RegisterID> oldValue = emitPostIncOrDec(generator, generator.finalDestination(dst), value.get(), m_operator);
    23682368    if (!var.isReadOnly()) {
    2369         generator.emitPutToScope(scope.get(), var, value.get(), ThrowIfNotFound, InitializationMode::NotInitialization);
     2369        generator.emitPutToScope(scope.get(), var, value.get(), generator.ecmaMode().isStrict() ? ThrowIfNotFound : DoNotThrowIfNotFound, InitializationMode::NotInitialization);
    23702370        generator.emitProfileType(value.get(), var, divotStart(), divotEnd());
    23712371    }
     
    26642664    emitIncOrDec(generator, value.get(), m_operator);
    26652665    if (!var.isReadOnly()) {
    2666         generator.emitPutToScope(scope.get(), var, value.get(), ThrowIfNotFound, InitializationMode::NotInitialization);
     2666        generator.emitPutToScope(scope.get(), var, value.get(), generator.ecmaMode().isStrict() ? ThrowIfNotFound : DoNotThrowIfNotFound, InitializationMode::NotInitialization);
    26672667        generator.emitProfileType(value.get(), var, divotStart(), divotEnd());
    26682668    }
     
    34513451    RegisterID* returnResult = result.get();
    34523452    if (!var.isReadOnly()) {
    3453         returnResult = generator.emitPutToScope(scope.get(), var, result.get(), ThrowIfNotFound, InitializationMode::NotInitialization);
     3453        returnResult = generator.emitPutToScope(scope.get(), var, result.get(), generator.ecmaMode().isStrict() ? ThrowIfNotFound : DoNotThrowIfNotFound, InitializationMode::NotInitialization);
    34543454        generator.emitProfileType(result.get(), var, divotStart(), divotEnd());
    34553455    }
     
    35523552
    35533553    if (!isReadOnly) {
    3554         generator.emitPutToScope(scope.get(), var, uncheckedResult.get(), ThrowIfNotFound, InitializationMode::NotInitialization);
     3554        generator.emitPutToScope(scope.get(), var, uncheckedResult.get(), generator.ecmaMode().isStrict() ? ThrowIfNotFound : DoNotThrowIfNotFound, InitializationMode::NotInitialization);
    35553555        generator.emitProfileType(uncheckedResult.get(), var, divotStart(), divotEnd());
    35563556    }
Note: See TracChangeset for help on using the changeset viewer.