Ignore:
Timestamp:
Nov 12, 2008, 4:48:23 PM (17 years ago)
Author:
[email protected]
Message:

2008-11-12 Geoffrey Garen <[email protected]>

Reviewed by Sam Weinig.


Fixed https://bugs.webkit.org/show_bug.cgi?id=22192
+37 failures in fast/profiler


along with Darin's review comments in
https://bugs.webkit.org/show_bug.cgi?id=22174
Simplified op_call by nixing its responsibility for moving the value of
"this" into the first argument slot

  • VM/Machine.cpp: (JSC::returnToThrowTrampoline): (JSC::throwStackOverflowError): (JSC::Machine::cti_register_file_check): (JSC::Machine::cti_op_call_arityCheck): (JSC::Machine::cti_vm_throw): Moved the throw logic into a function, since functions are better than macros.
  • bytecompiler/CodeGenerator.cpp: (JSC::CodeGenerator::emitCall): (JSC::CodeGenerator::emitConstruct): Ensure that the function register is preserved if profiling is enabled, since the profiler uses that register.
  • runtime/JSGlobalData.h: Renamed throwReturnAddress to exceptionLocation, because I had a hard time understanding what "throwReturnAddress" meant.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/parser/Nodes.cpp

    r38330 r38349  
    586586RegisterID* EvalFunctionCallNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    587587{
    588     RefPtr<RegisterID> base = generator.tempDestination(dst);
    589     RefPtr<RegisterID> func = generator.newTemporary();
    590     generator.emitResolveWithBase(base.get(), func.get(), generator.propertyNames().eval);
    591     return generator.emitCallEval(generator.finalDestination(dst, base.get()), func.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset());
     588    RefPtr<RegisterID> func = generator.tempDestination(dst);
     589    RefPtr<RegisterID> thisRegister = generator.newTemporary();
     590    generator.emitResolveWithBase(thisRegister.get(), func.get(), generator.propertyNames().eval);
     591    return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());
    592592}
    593593
     
    608608{
    609609    RefPtr<RegisterID> func = generator.emitNode(m_expr.get());
    610     return generator.emitCall(generator.finalDestination(dst), func.get(), 0, m_args.get(), divot(), startOffset(), endOffset());
     610    RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(), jsNull());
     611    return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());
    611612}
    612613
     
    625626RegisterID* FunctionCallResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst)
    626627{
    627     if (RefPtr<RegisterID> local = generator.registerFor(m_ident))
    628         return generator.emitCall(generator.finalDestination(dst), local.get(), 0, m_args.get(), divot(), startOffset(), endOffset());
     628    if (RefPtr<RegisterID> local = generator.registerFor(m_ident)) {
     629        RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(), jsNull());
     630        return generator.emitCall(generator.finalDestination(dst, thisRegister.get()), local.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());
     631    }
    629632
    630633    int index = 0;
     
    633636    if (generator.findScopedProperty(m_ident, index, depth, false, globalObject) && index != missingSymbolMarker()) {
    634637        RefPtr<RegisterID> func = generator.emitGetScopedVar(generator.newTemporary(), depth, index, globalObject);
    635         return generator.emitCall(generator.finalDestination(dst), func.get(), 0, m_args.get(), divot(), startOffset(), endOffset());
    636     }
    637 
    638     RefPtr<RegisterID> base = generator.tempDestination(dst);
    639     RefPtr<RegisterID> func = generator.newTemporary();
     638        RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(), jsNull());
     639        return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());
     640    }
     641
     642    RefPtr<RegisterID> func = generator.tempDestination(dst);
     643    RefPtr<RegisterID> thisRegister = generator.newTemporary();
    640644    int identifierStart = divot() - startOffset();
    641645    generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(), 0);
    642     generator.emitResolveFunction(base.get(), func.get(), m_ident);
    643     return generator.emitCall(generator.finalDestination(dst, base.get()), func.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset());
     646    generator.emitResolveFunction(thisRegister.get(), func.get(), m_ident);
     647    return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());
    644648}
    645649
     
    663667    RegisterID* property = generator.emitNode(m_subscript.get());
    664668    generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset);
    665     RefPtr<RegisterID> function = generator.emitGetByVal(generator.newTemporary(), base.get(), property);
    666     return generator.emitCall(generator.finalDestination(dst, base.get()), function.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset());
     669    RefPtr<RegisterID> function = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property);
     670    RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(), base.get());
     671    return generator.emitCall(generator.finalDestination(dst, function.get()), function.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());
    667672}
    668673
     
    684689    RefPtr<RegisterID> base = generator.emitNode(m_base.get());
    685690    generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset);
    686     RefPtr<RegisterID> function = generator.emitGetById(generator.newTemporary(), base.get(), m_ident);
    687     return generator.emitCall(generator.finalDestination(dst, base.get()), function.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset());
     691    RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident);
     692    RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(), base.get());
     693    return generator.emitCall(generator.finalDestination(dst, function.get()), function.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset());
    688694}
    689695
Note: See TracChangeset for help on using the changeset viewer.