Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (127392 => 127393)
--- trunk/Source/_javascript_Core/ChangeLog 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/ChangeLog 2012-09-02 21:27:23 UTC (rev 127393)
@@ -1,3 +1,31 @@
+2012-09-02 Geoffrey Garen <[email protected]>
+
+ Refactored scope chain opcodes to support optimization for named function expressions
+ https://bugs.webkit.org/show_bug.cgi?id=95658
+
+ Reviewed by Sam Weinig.
+
+ Renamed
+ push_scope => push_with_scope
+ push_new_scope => push_name_scope
+ to clarify the difference between them.
+
+ Changed push_with_scope and push_name_scope not to save the new scope in
+ a temporary register, since doing so made optimization harder.
+
+ (The old behavior was a hold-over from when the scope chain wasn't
+ a GC object, and wouldn't be marked otherwise. Now, the scope chain is
+ marked because it is a GC object pointed to by the call frame.)
+
+ Changed push_name_scope to accept an operand specifying the attributes
+ for the named property, instead of assuming DontDelete, because a named
+ function _expression_ needs ReadOnly|DontDelete.
+
+ * bytecompiler/BytecodeGenerator.cpp:
+ (JSC::BytecodeGenerator::highestUsedRegister): Removed this function,
+ which used to be related to preserving saved scope object temporaries,
+ because it had no callers.
+
2012-09-01 Geoffrey Garen <[email protected]>
Rolled back out a piece of <http://trac.webkit.org/changeset/127293>
Modified: trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp (127392 => 127393)
--- trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp 2012-09-02 21:27:23 UTC (rev 127393)
@@ -1479,9 +1479,9 @@
it += OPCODE_LENGTH(op_next_pname) - 1;
break;
}
- case op_push_scope: {
+ case op_push_with_scope: {
int r0 = (++it)->u.operand;
- dataLog("[%4d] push_scope\t %s", location, registerName(exec, r0).data());
+ dataLog("[%4d] push_with_scope\t %s", location, registerName(exec, r0).data());
dumpBytecodeCommentAndNewLine(location);
break;
}
@@ -1490,11 +1490,11 @@
dumpBytecodeCommentAndNewLine(location);
break;
}
- case op_push_new_scope: {
- int r0 = (++it)->u.operand;
+ case op_push_name_scope: {
int id0 = (++it)->u.operand;
int r1 = (++it)->u.operand;
- dataLog("[%4d] push_new_scope \t%s, %s, %s", location, registerName(exec, r0).data(), idName(id0, m_identifiers[id0]).data(), registerName(exec, r1).data());
+ unsigned attributes = (++it)->u.operand;
+ dataLog("[%4d] push_name_scope \t%s, %s, %u", location, idName(id0, m_identifiers[id0]).data(), registerName(exec, r1).data(), attributes);
dumpBytecodeCommentAndNewLine(location);
break;
}
Modified: trunk/Source/_javascript_Core/bytecode/Opcode.h (127392 => 127393)
--- trunk/Source/_javascript_Core/bytecode/Opcode.h 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/bytecode/Opcode.h 2012-09-02 21:27:23 UTC (rev 127393)
@@ -188,9 +188,9 @@
macro(op_get_pnames, 6) \
macro(op_next_pname, 7) \
\
- macro(op_push_scope, 2) \
+ macro(op_push_with_scope, 2) \
macro(op_pop_scope, 1) \
- macro(op_push_new_scope, 4) \
+ macro(op_push_name_scope, 4) \
\
macro(op_catch, 2) \
macro(op_throw, 2) \
Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp (127392 => 127393)
--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.cpp 2012-09-02 21:27:23 UTC (rev 127393)
@@ -642,14 +642,6 @@
return result;
}
-RegisterID* BytecodeGenerator::highestUsedRegister()
-{
- size_t count = m_codeBlock->m_numCalleeRegisters;
- while (m_calleeRegisters.size() < count)
- newRegister();
- return &m_calleeRegisters.last();
-}
-
PassRefPtr<LabelScope> BytecodeGenerator::newLabelScope(LabelScope::Type type, const Identifier* name)
{
// Reclaim free label scopes.
@@ -2093,15 +2085,14 @@
instructions().append(src->index());
}
-RegisterID* BytecodeGenerator::emitPushScope(RegisterID* scope)
+RegisterID* BytecodeGenerator::emitPushWithScope(RegisterID* scope)
{
- ASSERT(scope->isTemporary());
ControlFlowContext context;
context.isFinallyBlock = false;
m_scopeContextStack.append(context);
m_dynamicScopeDepth++;
- return emitUnaryNoDstOp(op_push_scope, scope);
+ return emitUnaryNoDstOp(op_push_with_scope, scope);
}
void BytecodeGenerator::emitPopScope()
@@ -2452,17 +2443,17 @@
instructions().append(addConstantValue(jsString(globalData(), message))->index());
}
-void BytecodeGenerator::emitPushNewScope(RegisterID* dst, const Identifier& property, RegisterID* value)
+void BytecodeGenerator::emitPushNameScope(const Identifier& property, RegisterID* value, unsigned attributes)
{
ControlFlowContext context;
context.isFinallyBlock = false;
m_scopeContextStack.append(context);
m_dynamicScopeDepth++;
- emitOpcode(op_push_new_scope);
- instructions().append(dst->index());
+ emitOpcode(op_push_name_scope);
instructions().append(addConstant(property));
instructions().append(value->index());
+ instructions().append(attributes);
}
void BytecodeGenerator::beginSwitch(RegisterID* scrutineeRegister, SwitchInfo::SwitchType type)
Modified: trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h (127392 => 127393)
--- trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/bytecompiler/BytecodeGenerator.h 2012-09-02 21:27:23 UTC (rev 127393)
@@ -296,8 +296,6 @@
// the next instruction may overwrite it.
RegisterID* newTemporary();
- RegisterID* highestUsedRegister();
-
// The same as newTemporary(), but this function returns "suggestion" if
// "suggestion" is a temporary. This function is helpful in situations
// where you've put "suggestion" in a RefPtr, but you'd like to allow
@@ -522,9 +520,9 @@
void emitThrowReferenceError(const String& message);
- void emitPushNewScope(RegisterID* dst, const Identifier& property, RegisterID* value);
+ void emitPushNameScope(const Identifier& property, RegisterID* value, unsigned attributes);
- RegisterID* emitPushScope(RegisterID* scope);
+ RegisterID* emitPushWithScope(RegisterID* scope);
void emitPopScope();
void emitDebugHook(DebugHookID, int firstLine, int lastLine, int column);
Modified: trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp (127392 => 127393)
--- trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/bytecompiler/NodesCodegen.cpp 2012-09-02 21:27:23 UTC (rev 127393)
@@ -1756,11 +1756,10 @@
RegisterID* WithNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst)
{
generator.emitDebugHook(WillExecuteStatement, firstLine(), lastLine(), column());
-
- RefPtr<RegisterID> scope = generator.newTemporary();
- generator.emitNode(scope.get(), m_expr); // scope must be protected until popped
+
+ RefPtr<RegisterID> scope = generator.emitNode(m_expr);
generator.emitExpressionInfo(m_divot, m_expressionLength, 0);
- generator.emitPushScope(scope.get());
+ generator.emitPushWithScope(scope.get());
RegisterID* result = generator.emitNode(dst, m_statement);
generator.emitPopScope();
return result;
@@ -1996,7 +1995,7 @@
tryData = generator.pushTry(here.get());
}
- generator.emitPushNewScope(exceptionRegister.get(), m_exceptionIdent, exceptionRegister.get());
+ generator.emitPushNameScope(m_exceptionIdent, exceptionRegister.get(), DontDelete);
generator.emitNode(dst, m_catchBlock);
generator.emitPopScope();
generator.emitLabel(catchEndLabel.get());
Modified: trunk/Source/_javascript_Core/interpreter/Interpreter.cpp (127392 => 127393)
--- trunk/Source/_javascript_Core/interpreter/Interpreter.cpp 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/interpreter/Interpreter.cpp 2012-09-02 21:27:23 UTC (rev 127393)
@@ -1426,14 +1426,13 @@
}
#if ENABLE(CLASSIC_INTERPRETER)
-NEVER_INLINE JSScope* Interpreter::createExceptionScope(CallFrame* callFrame, const Instruction* vPC)
+NEVER_INLINE JSScope* Interpreter::createNameScope(CallFrame* callFrame, const Instruction* vPC)
{
- int dst = vPC[1].u.operand;
CodeBlock* codeBlock = callFrame->codeBlock();
- Identifier& property = codeBlock->identifier(vPC[2].u.operand);
- JSValue value = callFrame->r(vPC[3].u.operand).jsValue();
- JSNameScope* scope = JSNameScope::create(callFrame, property, value, DontDelete);
- callFrame->uncheckedR(dst) = JSValue(scope);
+ Identifier& property = codeBlock->identifier(vPC[1].u.operand);
+ JSValue value = callFrame->r(vPC[2].u.operand).jsValue();
+ unsigned attributes = vPC[3].u.operand;
+ JSNameScope* scope = JSNameScope::create(callFrame, property, value, attributes);
return scope;
}
@@ -4814,22 +4813,20 @@
NEXT_INSTRUCTION();
}
- DEFINE_OPCODE(op_push_scope) {
- /* push_scope scope(r)
+ DEFINE_OPCODE(op_push_with_scope) {
+ /* push_with_scope scope(r)
Converts register scope to object, and pushes it onto the top
- of the current scope chain. The contents of the register scope
- are replaced by the result of toObject conversion of the scope.
+ of the scope chain.
*/
int scope = vPC[1].u.operand;
JSValue v = callFrame->r(scope).jsValue();
JSObject* o = v.toObject(callFrame);
CHECK_FOR_EXCEPTION();
- callFrame->uncheckedR(scope) = JSValue(o);
callFrame->setScope(JSWithScope::create(callFrame, o));
- vPC += OPCODE_LENGTH(op_push_scope);
+ vPC += OPCODE_LENGTH(op_push_with_scope);
NEXT_INSTRUCTION();
}
DEFINE_OPCODE(op_pop_scope) {
@@ -4927,16 +4924,15 @@
// Appease GCC
goto *(&&skip_new_scope);
#endif
- DEFINE_OPCODE(op_push_new_scope) {
- /* new_scope dst(r) property(id) value(r)
+ DEFINE_OPCODE(op_push_name_scope) {
+ /* new_scope property(id) value(r) attributes(unsigned)
- Constructs a new NameScopeObject with property set to value. That scope
- object is then pushed onto the ScopeChain. The scope object is then stored
- in dst for GC.
+ Constructs a name scope of the form { property<attributes>: value },
+ and pushes it onto the scope chain.
*/
- callFrame->setScope(createExceptionScope(callFrame, vPC));
+ callFrame->setScope(createNameScope(callFrame, vPC));
- vPC += OPCODE_LENGTH(op_push_new_scope);
+ vPC += OPCODE_LENGTH(op_push_name_scope);
NEXT_INSTRUCTION();
}
#if ENABLE(COMPUTED_GOTO_CLASSIC_INTERPRETER)
Modified: trunk/Source/_javascript_Core/jit/JIT.cpp (127392 => 127393)
--- trunk/Source/_javascript_Core/jit/JIT.cpp 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/jit/JIT.cpp 2012-09-02 21:27:23 UTC (rev 127393)
@@ -318,8 +318,8 @@
DEFINE_OP(op_pre_inc)
DEFINE_OP(op_profile_did_call)
DEFINE_OP(op_profile_will_call)
- DEFINE_OP(op_push_new_scope)
- DEFINE_OP(op_push_scope)
+ DEFINE_OP(op_push_name_scope)
+ DEFINE_OP(op_push_with_scope)
case op_put_by_id_out_of_line:
case op_put_by_id_transition_direct:
case op_put_by_id_transition_normal:
Modified: trunk/Source/_javascript_Core/jit/JIT.h (127392 => 127393)
--- trunk/Source/_javascript_Core/jit/JIT.h 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/jit/JIT.h 2012-09-02 21:27:23 UTC (rev 127393)
@@ -671,8 +671,8 @@
void emit_op_pre_inc(Instruction*);
void emit_op_profile_did_call(Instruction*);
void emit_op_profile_will_call(Instruction*);
- void emit_op_push_new_scope(Instruction*);
- void emit_op_push_scope(Instruction*);
+ void emit_op_push_name_scope(Instruction*);
+ void emit_op_push_with_scope(Instruction*);
void emit_op_put_by_id(Instruction*);
void emit_op_put_by_index(Instruction*);
void emit_op_put_by_val(Instruction*);
Modified: trunk/Source/_javascript_Core/jit/JITOpcodes.cpp (127392 => 127393)
--- trunk/Source/_javascript_Core/jit/JITOpcodes.cpp 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/jit/JITOpcodes.cpp 2012-09-02 21:27:23 UTC (rev 127393)
@@ -1003,9 +1003,9 @@
end.link(this);
}
-void JIT::emit_op_push_scope(Instruction* currentInstruction)
+void JIT::emit_op_push_with_scope(Instruction* currentInstruction)
{
- JITStubCall stubCall(this, cti_op_push_scope);
+ JITStubCall stubCall(this, cti_op_push_with_scope);
stubCall.addArgument(currentInstruction[1].u.operand, regT2);
stubCall.call(currentInstruction[1].u.operand);
}
@@ -1072,12 +1072,13 @@
emitPutVirtualRegister(currentInstruction[1].u.operand);
}
-void JIT::emit_op_push_new_scope(Instruction* currentInstruction)
+void JIT::emit_op_push_name_scope(Instruction* currentInstruction)
{
- JITStubCall stubCall(this, cti_op_push_new_scope);
- stubCall.addArgument(TrustedImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand)));
- stubCall.addArgument(currentInstruction[3].u.operand, regT2);
- stubCall.call(currentInstruction[1].u.operand);
+ JITStubCall stubCall(this, cti_op_push_name_scope);
+ stubCall.addArgument(TrustedImmPtr(&m_codeBlock->identifier(currentInstruction[1].u.operand)));
+ stubCall.addArgument(currentInstruction[2].u.operand, regT2);
+ stubCall.addArgument(TrustedImm32(currentInstruction[3].u.operand));
+ stubCall.call();
}
void JIT::emit_op_catch(Instruction* currentInstruction)
Modified: trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp (127392 => 127393)
--- trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/jit/JITOpcodes32_64.cpp 2012-09-02 21:27:23 UTC (rev 127393)
@@ -1358,9 +1358,9 @@
end.link(this);
}
-void JIT::emit_op_push_scope(Instruction* currentInstruction)
+void JIT::emit_op_push_with_scope(Instruction* currentInstruction)
{
- JITStubCall stubCall(this, cti_op_push_scope);
+ JITStubCall stubCall(this, cti_op_push_with_scope);
stubCall.addArgument(currentInstruction[1].u.operand);
stubCall.call(currentInstruction[1].u.operand);
}
@@ -1397,12 +1397,13 @@
stubCall.call(dst);
}
-void JIT::emit_op_push_new_scope(Instruction* currentInstruction)
+void JIT::emit_op_push_name_scope(Instruction* currentInstruction)
{
- JITStubCall stubCall(this, cti_op_push_new_scope);
- stubCall.addArgument(TrustedImmPtr(&m_codeBlock->identifier(currentInstruction[2].u.operand)));
- stubCall.addArgument(currentInstruction[3].u.operand);
- stubCall.call(currentInstruction[1].u.operand);
+ JITStubCall stubCall(this, cti_op_push_name_scope);
+ stubCall.addArgument(TrustedImmPtr(&m_codeBlock->identifier(currentInstruction[1].u.operand)));
+ stubCall.addArgument(currentInstruction[2].u.operand);
+ stubCall.addArgument(TrustedImm32(currentInstruction[3].u.operand));
+ stubCall.call();
}
void JIT::emit_op_catch(Instruction* currentInstruction)
Modified: trunk/Source/_javascript_Core/jit/JITStubs.cpp (127392 => 127393)
--- trunk/Source/_javascript_Core/jit/JITStubs.cpp 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/jit/JITStubs.cpp 2012-09-02 21:27:23 UTC (rev 127393)
@@ -3141,7 +3141,7 @@
return result;
}
-DEFINE_STUB_FUNCTION(JSObject*, op_push_scope)
+DEFINE_STUB_FUNCTION(JSObject*, op_push_with_scope)
{
STUB_INIT_STACK_FRAME(stackFrame);
@@ -3258,15 +3258,14 @@
return JSValue::encode(jsBoolean(baseObj->hasProperty(callFrame, property)));
}
-DEFINE_STUB_FUNCTION(JSObject*, op_push_new_scope)
+DEFINE_STUB_FUNCTION(void, op_push_name_scope)
{
STUB_INIT_STACK_FRAME(stackFrame);
- JSNameScope* scope = JSNameScope::create(stackFrame.callFrame, stackFrame.args[0].identifier(), stackFrame.args[1].jsValue(), DontDelete);
+ JSNameScope* scope = JSNameScope::create(stackFrame.callFrame, stackFrame.args[0].identifier(), stackFrame.args[1].jsValue(), stackFrame.args[2].int32());
CallFrame* callFrame = stackFrame.callFrame;
callFrame->setScope(scope);
- return scope;
}
DEFINE_STUB_FUNCTION(void, op_jmp_scopes)
Modified: trunk/Source/_javascript_Core/jit/JITStubs.h (127392 => 127393)
--- trunk/Source/_javascript_Core/jit/JITStubs.h 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/jit/JITStubs.h 2012-09-02 21:27:23 UTC (rev 127393)
@@ -417,8 +417,8 @@
JSObject* JIT_STUB cti_op_new_object(STUB_ARGS_DECLARATION) WTF_INTERNAL;
JSObject* JIT_STUB cti_op_new_regexp(STUB_ARGS_DECLARATION) WTF_INTERNAL;
JSObject* JIT_STUB cti_op_push_activation(STUB_ARGS_DECLARATION) WTF_INTERNAL;
- JSObject* JIT_STUB cti_op_push_new_scope(STUB_ARGS_DECLARATION) WTF_INTERNAL;
- JSObject* JIT_STUB cti_op_push_scope(STUB_ARGS_DECLARATION) WTF_INTERNAL;
+ void JIT_STUB cti_op_push_name_scope(STUB_ARGS_DECLARATION) WTF_INTERNAL;
+ JSObject* JIT_STUB cti_op_push_with_scope(STUB_ARGS_DECLARATION) WTF_INTERNAL;
JSObject* JIT_STUB cti_op_put_by_id_transition_realloc(STUB_ARGS_DECLARATION) WTF_INTERNAL;
JSPropertyNameIterator* JIT_STUB cti_op_get_pnames(STUB_ARGS_DECLARATION) WTF_INTERNAL;
int JIT_STUB cti_op_eq(STUB_ARGS_DECLARATION) WTF_INTERNAL;
Modified: trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp (127392 => 127393)
--- trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/llint/LLIntSlowPaths.cpp 2012-09-02 21:27:23 UTC (rev 127393)
@@ -1530,14 +1530,13 @@
LLINT_END();
}
-LLINT_SLOW_PATH_DECL(slow_path_push_scope)
+LLINT_SLOW_PATH_DECL(slow_path_push_with_scope)
{
LLINT_BEGIN();
- JSValue v = LLINT_OP(1).jsValue();
+ JSValue v = LLINT_OP_C(1).jsValue();
JSObject* o = v.toObject(exec);
LLINT_CHECK_EXCEPTION();
- LLINT_OP(1) = o;
exec->setScope(JSWithScope::create(exec, o));
LLINT_END();
@@ -1550,13 +1549,13 @@
LLINT_END();
}
-LLINT_SLOW_PATH_DECL(slow_path_push_new_scope)
+LLINT_SLOW_PATH_DECL(slow_path_push_name_scope)
{
LLINT_BEGIN();
CodeBlock* codeBlock = exec->codeBlock();
- JSNameScope* scope = JSNameScope::create(exec, codeBlock->identifier(pc[2].u.operand), LLINT_OP(3).jsValue(), DontDelete);
+ JSNameScope* scope = JSNameScope::create(exec, codeBlock->identifier(pc[1].u.operand), LLINT_OP(2).jsValue(), pc[3].u.operand);
exec->setScope(scope);
- LLINT_RETURN(scope);
+ LLINT_END();
}
LLINT_SLOW_PATH_DECL(slow_path_throw)
Modified: trunk/Source/_javascript_Core/llint/LLIntSlowPaths.h (127392 => 127393)
--- trunk/Source/_javascript_Core/llint/LLIntSlowPaths.h 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/llint/LLIntSlowPaths.h 2012-09-02 21:27:23 UTC (rev 127393)
@@ -202,9 +202,9 @@
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_to_primitive);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_get_pnames);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_next_pname);
-LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_scope);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_with_scope);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_pop_scope);
-LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_new_scope);
+LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_push_name_scope);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_throw);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_throw_reference_error);
LLINT_SLOW_PATH_HIDDEN_DECL(slow_path_debug);
Modified: trunk/Source/_javascript_Core/llint/LowLevelInterpreter.asm (127392 => 127393)
--- trunk/Source/_javascript_Core/llint/LowLevelInterpreter.asm 2012-09-02 20:26:26 UTC (rev 127392)
+++ trunk/Source/_javascript_Core/llint/LowLevelInterpreter.asm 2012-09-02 21:27:23 UTC (rev 127393)
@@ -773,9 +773,9 @@
dispatch(0) # The slow_path either advances the PC or jumps us to somewhere else.
-_llint_op_push_scope:
+_llint_op_push_with_scope:
traceExecution()
- callSlowPath(_llint_slow_path_push_scope)
+ callSlowPath(_llint_slow_path_push_with_scope)
dispatch(2)
@@ -785,9 +785,9 @@
dispatch(1)
-_llint_op_push_new_scope:
+_llint_op_push_name_scope:
traceExecution()
- callSlowPath(_llint_slow_path_push_new_scope)
+ callSlowPath(_llint_slow_path_push_name_scope)
dispatch(4)