Ignore:
Timestamp:
Oct 18, 2010, 11:32:39 AM (15 years ago)
Author:
[email protected]
Message:

2010-10-18 Oliver Hunt <[email protected]>

Reviewed by Darin Adler.

Strict mode: |this| should be undefined if it is not explicitly provided
https://bugs.webkit.org/show_bug.cgi?id=47833

To make strict mode behave correctly we want to pass undefined instead of null
as the default this value. This has no impact on behaviour outside of strict
mode as both values are replaced with the global object if necessary.

  • bytecompiler/NodesCodegen.cpp: (JSC::FunctionCallValueNode::emitBytecode): (JSC::FunctionCallResolveNode::emitBytecode): (JSC::CallFunctionCallDotNode::emitBytecode): (JSC::ApplyFunctionCallDotNode::emitBytecode):

2010-10-18 Oliver Hunt <[email protected]>

Reviewed by Darin Adler.

Strict mode: |this| should be undefined if it is not explicitly provided
https://bugs.webkit.org/show_bug.cgi?id=47833

Add tests to ensure that |this| is undefined rather than null when it has
not been explicitly provided.

  • fast/js/basic-strict-mode-expected.txt:
  • fast/js/script-tests/basic-strict-mode.js:
File:
1 edited

Legend:

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

    r69940 r69977  
    372372    RefPtr<RegisterID> func = generator.emitNode(m_expr);
    373373    CallArguments callArguments(generator, m_args);
    374     generator.emitLoad(callArguments.thisRegister(), jsNull());
     374    generator.emitLoad(callArguments.thisRegister(), jsUndefined());
    375375    return generator.emitCall(generator.finalDestinationOrIgnored(dst, func.get()), func.get(), callArguments, divot(), startOffset(), endOffset());
    376376}
     
    382382    if (RefPtr<RegisterID> local = generator.registerFor(m_ident)) {
    383383        CallArguments callArguments(generator, m_args);
    384         generator.emitLoad(callArguments.thisRegister(), jsNull());
     384        generator.emitLoad(callArguments.thisRegister(), jsUndefined());
    385385        return generator.emitCall(generator.finalDestinationOrIgnored(dst, callArguments.thisRegister()), local.get(), callArguments, divot(), startOffset(), endOffset());
    386386    }
     
    393393        RefPtr<RegisterID> func = generator.emitGetScopedVar(generator.newTemporary(), depth, index, globalObject);
    394394        CallArguments callArguments(generator, m_args);
    395         generator.emitLoad(callArguments.thisRegister(), jsNull());
     395        generator.emitLoad(callArguments.thisRegister(), jsUndefined());
    396396        return generator.emitCall(generator.finalDestinationOrIgnored(dst, func.get()), func.get(), callArguments, divot(), startOffset(), endOffset());
    397397    }
     
    456456            RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get());
    457457            CallArguments callArguments(generator, m_args);
    458             generator.emitLoad(callArguments.thisRegister(), jsNull());
     458            generator.emitLoad(callArguments.thisRegister(), jsUndefined());
    459459            generator.emitCall(finalDestinationOrIgnored.get(), realFunction.get(), callArguments, divot(), startOffset(), endOffset());
    460460            generator.emitJump(end.get());
     
    514514                RefPtr<RegisterID> realFunction = generator.emitMove(generator.tempDestination(dst), base.get());
    515515                CallArguments callArguments(generator, m_args);
    516                 generator.emitLoad(callArguments.thisRegister(), jsNull());
     516                generator.emitLoad(callArguments.thisRegister(), jsUndefined());
    517517                generator.emitCall(finalDestinationOrIgnored.get(), realFunction.get(), callArguments, divot(), startOffset(), endOffset());
    518518            }
Note: See TracChangeset for help on using the changeset viewer.