Changeset 37160 in webkit for trunk/JavaScriptCore/VM/Machine.cpp
- Timestamp:
- Oct 1, 2008, 3:18:50 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.