Changeset 37160 in webkit for trunk/JavaScriptCore/VM
- Timestamp:
- Oct 1, 2008, 3:18:50 PM (17 years ago)
- Location:
- trunk/JavaScriptCore/VM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/VM/CTI.cpp
r37138 r37160 1191 1191 } 1192 1192 case op_ret: { 1193 // Check for an activation - if there is one, jump to the hook below. 1194 m_jit.cmpl_i32m(0, RegisterFile::OptionalCalleeActivation * static_cast<int>(sizeof(Register)), X86::edi); 1193 // If there is an activation or an 'arguments' object, we tear it 1194 // off by jumping to the hook below. 1195 m_jit.movl_mr(RegisterFile::OptionalCalleeActivation * static_cast<int>(sizeof(Register)), X86::edi, X86::eax); 1196 m_jit.orl_mr(RegisterFile::OptionalCalleeArguments * static_cast<int>(sizeof(Register)), X86::edi, X86::eax); 1197 m_jit.cmpl_i32r(0, X86::eax); 1195 1198 X86Assembler::JmpSrc activation = m_jit.emitUnlinkedJne(); 1196 1199 X86Assembler::JmpDst activated = m_jit.label(); … … 1222 1225 m_jit.ret(); 1223 1226 1224 // Activation hook1227 // Activation and 'arguments' hook 1225 1228 m_jit.link(activation, m_jit.label()); 1226 emitCall(i, Machine::cti_op_ret_activation );1229 emitCall(i, Machine::cti_op_ret_activation_arguments); 1227 1230 m_jit.link(m_jit.emitUnlinkedJmp(), activated); 1228 1231 -
trunk/JavaScriptCore/VM/CodeBlock.h
r36821 r37160 242 242 bool needsFullScopeChain; 243 243 bool usesEval; 244 bool usesArguments; 244 245 CodeType codeType; 245 246 RefPtr<SourceProvider> source; -
trunk/JavaScriptCore/VM/CodeGenerator.cpp
r37117 r37160 293 293 codeBlock->globalData = m_globalData; 294 294 295 if (functionBody->usesArguments()) { 295 bool usesArguments = functionBody->usesArguments(); 296 codeBlock->usesArguments = usesArguments; 297 if (usesArguments) { 296 298 emitOpcode(op_init_arguments); 297 m_codeBlock->needsFullScopeChain = true;298 299 m_argumentsRegister.setIndex(RegisterFile::OptionalCalleeArguments); 299 symbolTable->add(propertyNames().arguments.ustring().rep(), SymbolTableEntry(RegisterFile::OptionalCalleeArguments));300 addVar(propertyNames().arguments, false); 300 301 } 301 302 -
trunk/JavaScriptCore/VM/Machine.cpp
r37125 r37160 802 802 scopeChain->deref(); 803 803 804 // If this call frame created an activation , tear it off.805 if (JSActivation* activation = static_cast<JSActivation*>(r[RegisterFile::OptionalCalleeActivation]. jsValue(exec))) {804 // If this call frame created an activation or an 'arguments' object, tear it off. 805 if (JSActivation* activation = static_cast<JSActivation*>(r[RegisterFile::OptionalCalleeActivation].getJSValue())) { 806 806 ASSERT(activation->isObject(&JSActivation::info)); 807 activation->copyRegisters(); 807 activation->copyRegisters(r[RegisterFile::OptionalCalleeArguments].getJSValue()); 808 } else if (Arguments* arguments = static_cast<Arguments*>(r[RegisterFile::OptionalCalleeArguments].getJSValue())) { 809 ASSERT(arguments->isObject(&Arguments::info)); 810 arguments->copyRegisters(); 808 811 } 809 812 … … 3361 3364 int result = (++vPC)->u.operand; 3362 3365 3363 if (JSActivation* activation = static_cast<JSActivation*>(r[RegisterFile::OptionalCalleeActivation].jsValue(exec))) { 3366 // If this call frame created an activation or an 'arguments' object, tear it off. 3367 if (JSActivation* activation = static_cast<JSActivation*>(r[RegisterFile::OptionalCalleeActivation].getJSValue())) { 3364 3368 ASSERT(!codeBlock(r)->needsFullScopeChain || scopeChain(r)->object == activation); 3365 3369 ASSERT(activation->isObject(&JSActivation::info)); 3366 activation->copyRegisters(); 3370 activation->copyRegisters(r[RegisterFile::OptionalCalleeArguments].getJSValue()); 3371 } else if (Arguments* arguments = static_cast<Arguments*>(r[RegisterFile::OptionalCalleeArguments].getJSValue())) { 3372 ASSERT(arguments->isObject(&Arguments::info)); 3373 arguments->copyRegisters(); 3367 3374 } 3368 3375 … … 3418 3425 } 3419 3426 BEGIN_OPCODE(op_init_arguments) { 3420 JSActivation* activation = static_cast<JSActivation*>(r[RegisterFile::OptionalCalleeActivation].getJSValue()); 3421 r[RegisterFile::OptionalCalleeArguments] = activation->createArgumentsObject(exec); 3427 JSValue* activation = r[RegisterFile::OptionalCalleeActivation].getJSValue(); 3428 Arguments* arguments; 3429 if (activation) { 3430 ASSERT(activation->isObject(&JSActivation::info)); 3431 arguments = new (exec) Arguments(exec, static_cast<JSActivation*>(activation)); 3432 } else 3433 arguments = new (exec) Arguments(exec, r); 3434 r[RegisterFile::OptionalCalleeArguments] = arguments; 3435 r[RegisterFile::ArgumentsRegister] = arguments; 3436 3422 3437 ++vPC; 3423 3438 NEXT_OPCODE; … … 3849 3864 return jsNull(); 3850 3865 3851 Arguments* arguments = static_cast<Arguments*>(r[RegisterFile::OptionalCalleeArguments].jsValue(exec)); 3852 if (!arguments) { 3853 JSActivation* activation = static_cast<JSActivation*>(r[RegisterFile::OptionalCalleeActivation].getJSValue()); 3854 if (!activation) { 3855 activation = new (exec) JSActivation(exec, function->m_body, r); 3856 r[RegisterFile::OptionalCalleeActivation] = activation; 3857 } 3858 3859 arguments = activation->createArgumentsObject(exec); 3860 r[RegisterFile::OptionalCalleeArguments] = arguments; 3866 JSValue* arguments; 3867 CodeBlock* codeBlock = Machine::codeBlock(r); 3868 if (codeBlock->usesArguments) { 3869 ASSERT(codeBlock->codeType == FunctionCode); 3870 SymbolTable& symbolTable = static_cast<FunctionBodyNode*>(codeBlock->ownerNode)->symbolTable(); 3871 int argumentsIndex = symbolTable.get(exec->propertyNames().arguments.ustring().rep()).getIndex(); 3872 arguments = r[argumentsIndex].jsValue(exec); 3873 } else { 3874 arguments = r[RegisterFile::OptionalCalleeArguments].getJSValue(); 3875 if (!arguments) { 3876 JSActivation* activation = static_cast<JSActivation*>(r[RegisterFile::OptionalCalleeActivation].getJSValue()); 3877 if (activation) 3878 arguments = new (exec) Arguments(exec, activation); 3879 else 3880 arguments = new (exec) Arguments(exec, r); 3881 r[RegisterFile::OptionalCalleeArguments] = arguments; 3882 } 3883 ASSERT(arguments->isObject(&Arguments::info)); 3861 3884 } 3862 3885 … … 4600 4623 ExecState* exec = ARG_exec; 4601 4624 Register* r = ARG_r; 4602 JSActivation* activation = static_cast<JSActivation*>(r[RegisterFile::OptionalCalleeActivation].getJSValue()); 4603 r[RegisterFile::OptionalCalleeArguments] = activation->createArgumentsObject(exec); 4604 } 4605 4606 void Machine::cti_op_ret_activation(CTI_ARGS) 4607 { 4608 ExecState* exec = ARG_exec; 4625 4626 JSValue* activation = r[RegisterFile::OptionalCalleeActivation].getJSValue(); 4627 Arguments* arguments; 4628 if (activation) { 4629 ASSERT(activation->isObject(&JSActivation::info)); 4630 arguments = new (exec) Arguments(exec, static_cast<JSActivation*>(activation)); 4631 } else 4632 arguments = new (exec) Arguments(exec, r); 4633 r[RegisterFile::OptionalCalleeArguments] = arguments; 4634 r[RegisterFile::ArgumentsRegister] = arguments; 4635 } 4636 4637 void Machine::cti_op_ret_activation_arguments(CTI_ARGS) 4638 { 4609 4639 Register* r = ARG_r; 4610 4640 4611 JSActivation* activation = static_cast<JSActivation*>(r[RegisterFile::OptionalCalleeActivation].jsValue(exec)); 4612 ASSERT(activation); 4613 4614 ASSERT(!codeBlock(r)->needsFullScopeChain || scopeChain(r)->object == activation); 4615 ASSERT(activation->isObject(&JSActivation::info)); 4616 activation->copyRegisters(); 4641 // If this call frame created an activation or an 'arguments' object, tear it off. 4642 if (JSActivation* activation = static_cast<JSActivation*>(r[RegisterFile::OptionalCalleeActivation].getJSValue())) { 4643 ASSERT(!codeBlock(r)->needsFullScopeChain || scopeChain(r)->object == activation); 4644 ASSERT(activation->isObject(&JSActivation::info)); 4645 activation->copyRegisters(r[RegisterFile::OptionalCalleeArguments].getJSValue()); 4646 } else if (Arguments* arguments = static_cast<Arguments*>(r[RegisterFile::OptionalCalleeArguments].getJSValue())) { 4647 ASSERT(arguments->isObject(&Arguments::info)); 4648 arguments->copyRegisters(); 4649 } 4617 4650 } 4618 4651 -
trunk/JavaScriptCore/VM/Machine.h
r37086 r37160 164 164 static JSValue* SFX_CALL cti_op_call_NotJSFunction(CTI_ARGS); 165 165 static void SFX_CALL cti_op_init_arguments(CTI_ARGS); 166 static void SFX_CALL cti_op_ret_activation (CTI_ARGS);166 static void SFX_CALL cti_op_ret_activation_arguments(CTI_ARGS); 167 167 static void SFX_CALL cti_op_ret_profiler(CTI_ARGS); 168 168 static void SFX_CALL cti_op_ret_scopeChain(CTI_ARGS); -
trunk/JavaScriptCore/VM/RegisterFile.h
r37086 r37160 105 105 106 106 enum { ProgramCodeThisRegister = -CallFrameHeaderSize - 1 }; 107 enum { ArgumentsRegister = 0 }; 107 108 108 109 enum { DefaultCapacity = 2 * 1024 * 1024 / sizeof(Register) };
Note:
See TracChangeset
for help on using the changeset viewer.