Index: third_party/WebKit/JavaScriptCore/parser/Nodes.cpp |
=================================================================== |
--- third_party/WebKit/JavaScriptCore/parser/Nodes.cpp (revision 5296) |
+++ third_party/WebKit/JavaScriptCore/parser/Nodes.cpp (working copy) |
@@ -585,10 +585,10 @@ |
RegisterID* EvalFunctionCallNode::emitCode(CodeGenerator& generator, RegisterID* dst) |
{ |
- RefPtr<RegisterID> base = generator.tempDestination(dst); |
- RefPtr<RegisterID> func = generator.newTemporary(); |
- generator.emitResolveWithBase(base.get(), func.get(), generator.propertyNames().eval); |
- return generator.emitCallEval(generator.finalDestination(dst, base.get()), func.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); |
+ RefPtr<RegisterID> func = generator.tempDestination(dst); |
+ RefPtr<RegisterID> thisRegister = generator.newTemporary(); |
+ generator.emitResolveWithBase(thisRegister.get(), func.get(), generator.propertyNames().eval); |
+ return generator.emitCallEval(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); |
} |
// ------------------------------ FunctionCallValueNode ---------------------------------- |
@@ -607,7 +607,8 @@ |
RegisterID* FunctionCallValueNode::emitCode(CodeGenerator& generator, RegisterID* dst) |
{ |
RefPtr<RegisterID> func = generator.emitNode(m_expr.get()); |
- return generator.emitCall(generator.finalDestination(dst), func.get(), 0, m_args.get(), divot(), startOffset(), endOffset()); |
+ RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(), jsNull()); |
+ return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); |
} |
// ------------------------------ FunctionCallResolveNode ---------------------------------- |
@@ -624,23 +625,26 @@ |
RegisterID* FunctionCallResolveNode::emitCode(CodeGenerator& generator, RegisterID* dst) |
{ |
- if (RefPtr<RegisterID> local = generator.registerFor(m_ident)) |
- return generator.emitCall(generator.finalDestination(dst), local.get(), 0, m_args.get(), divot(), startOffset(), endOffset()); |
+ if (RefPtr<RegisterID> local = generator.registerFor(m_ident)) { |
+ RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(), jsNull()); |
+ return generator.emitCall(generator.finalDestination(dst, thisRegister.get()), local.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); |
+ } |
int index = 0; |
size_t depth = 0; |
JSObject* globalObject = 0; |
if (generator.findScopedProperty(m_ident, index, depth, false, globalObject) && index != missingSymbolMarker()) { |
RefPtr<RegisterID> func = generator.emitGetScopedVar(generator.newTemporary(), depth, index, globalObject); |
- return generator.emitCall(generator.finalDestination(dst), func.get(), 0, m_args.get(), divot(), startOffset(), endOffset()); |
+ RefPtr<RegisterID> thisRegister = generator.emitLoad(generator.newTemporary(), jsNull()); |
+ return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); |
} |
- RefPtr<RegisterID> base = generator.tempDestination(dst); |
- RefPtr<RegisterID> func = generator.newTemporary(); |
+ RefPtr<RegisterID> func = generator.tempDestination(dst); |
+ RefPtr<RegisterID> thisRegister = generator.newTemporary(); |
int identifierStart = divot() - startOffset(); |
generator.emitExpressionInfo(identifierStart + m_ident.size(), m_ident.size(), 0); |
- generator.emitResolveFunction(base.get(), func.get(), m_ident); |
- return generator.emitCall(generator.finalDestination(dst, base.get()), func.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); |
+ generator.emitResolveFunction(thisRegister.get(), func.get(), m_ident); |
+ return generator.emitCall(generator.finalDestination(dst, func.get()), func.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); |
} |
// ------------------------------ FunctionCallBracketNode ---------------------------------- |
@@ -662,8 +666,9 @@ |
RefPtr<RegisterID> base = generator.emitNode(m_base.get()); |
RegisterID* property = generator.emitNode(m_subscript.get()); |
generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); |
- RefPtr<RegisterID> function = generator.emitGetByVal(generator.newTemporary(), base.get(), property); |
- return generator.emitCall(generator.finalDestination(dst, base.get()), function.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); |
+ RefPtr<RegisterID> function = generator.emitGetByVal(generator.tempDestination(dst), base.get(), property); |
+ RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(), base.get()); |
+ return generator.emitCall(generator.finalDestination(dst, function.get()), function.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); |
} |
// ------------------------------ FunctionCallDotNode ---------------------------------- |
@@ -683,8 +688,9 @@ |
{ |
RefPtr<RegisterID> base = generator.emitNode(m_base.get()); |
generator.emitExpressionInfo(divot() - m_subexpressionDivotOffset, startOffset() - m_subexpressionDivotOffset, m_subexpressionEndOffset); |
- RefPtr<RegisterID> function = generator.emitGetById(generator.newTemporary(), base.get(), m_ident); |
- return generator.emitCall(generator.finalDestination(dst, base.get()), function.get(), base.get(), m_args.get(), divot(), startOffset(), endOffset()); |
+ RefPtr<RegisterID> function = generator.emitGetById(generator.tempDestination(dst), base.get(), m_ident); |
+ RefPtr<RegisterID> thisRegister = generator.emitMove(generator.newTemporary(), base.get()); |
+ return generator.emitCall(generator.finalDestination(dst, function.get()), function.get(), thisRegister.get(), m_args.get(), divot(), startOffset(), endOffset()); |
} |
// ------------------------------ PostfixResolveNode ---------------------------------- |