Changeset 37257 in webkit for trunk/JavaScriptCore
- Timestamp:
- Oct 3, 2008, 2:39:16 PM (17 years ago)
- Location:
- trunk/JavaScriptCore
- Files:
-
- 37 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/API/JSCallbackFunction.cpp
r36766 r37257 42 42 43 43 JSCallbackFunction::JSCallbackFunction(ExecState* exec, JSObjectCallAsFunctionCallback callback, const Identifier& name) 44 : InternalFunction( exec, exec->lexicalGlobalObject()->callbackFunctionStructure(), name)44 : InternalFunction(&exec->globalData(), exec->lexicalGlobalObject()->callbackFunctionStructure(), name) 45 45 , m_callback(callback) 46 46 { -
trunk/JavaScriptCore/API/OpaqueJSString.cpp
r36263 r37257 28 28 29 29 #include <kjs/ExecState.h> 30 #include <kjs/JSGlobalObject.h> 30 31 #include <kjs/identifier.h> 31 32 -
trunk/JavaScriptCore/ChangeLog
r37253 r37257 1 2008-10-03 Darin Adler <[email protected]> 2 3 Reviewed by Geoff Garen. 4 5 - next step of https://bugs.webkit.org/show_bug.cgi?id=21295 6 Turn ExecState into a call frame pointer. 7 8 Remove m_globalObject and m_globalData from ExecState. 9 10 SunSpider says this is a wash (slightly faster but not statistically 11 significant); which is good enough since it's a preparation step and 12 not supposed to be a spedup. 13 14 * API/JSCallbackFunction.cpp: 15 (JSC::JSCallbackFunction::JSCallbackFunction): 16 * kjs/ArrayConstructor.cpp: 17 (JSC::ArrayConstructor::ArrayConstructor): 18 * kjs/BooleanConstructor.cpp: 19 (JSC::BooleanConstructor::BooleanConstructor): 20 * kjs/DateConstructor.cpp: 21 (JSC::DateConstructor::DateConstructor): 22 * kjs/ErrorConstructor.cpp: 23 (JSC::ErrorConstructor::ErrorConstructor): 24 * kjs/FunctionPrototype.cpp: 25 (JSC::FunctionPrototype::FunctionPrototype): 26 * kjs/JSFunction.cpp: 27 (JSC::JSFunction::JSFunction): 28 * kjs/NativeErrorConstructor.cpp: 29 (JSC::NativeErrorConstructor::NativeErrorConstructor): 30 * kjs/NumberConstructor.cpp: 31 (JSC::NumberConstructor::NumberConstructor): 32 * kjs/ObjectConstructor.cpp: 33 (JSC::ObjectConstructor::ObjectConstructor): 34 * kjs/PrototypeFunction.cpp: 35 (JSC::PrototypeFunction::PrototypeFunction): 36 * kjs/RegExpConstructor.cpp: 37 (JSC::RegExpConstructor::RegExpConstructor): 38 * kjs/StringConstructor.cpp: 39 (JSC::StringConstructor::StringConstructor): 40 Pass JSGlobalData* instead of ExecState* to the InternalFunction 41 constructor. 42 43 * API/OpaqueJSString.cpp: Added now-needed include. 44 45 * JavaScriptCore.exp: Updated. 46 47 * VM/CTI.cpp: 48 (JSC::CTI::emitSlowScriptCheck): Changed to use ARGS_globalData 49 instead of ARGS_exec. 50 51 * VM/CTI.h: Added a new argument to the CTI, the global data pointer. 52 While it's possible to get to the global data pointer using the 53 ExecState pointer, it's slow enough that it's better to just keep 54 it around in the CTI arguments. 55 56 * VM/CodeBlock.h: Moved the CodeType enum here from ExecState.h. 57 58 * VM/Machine.cpp: 59 (JSC::Machine::execute): Pass fewer arguments when constructing 60 ExecState, and pass the global data pointer when invoking CTI. 61 (JSC::Machine::firstCallFrame): Added. Used to get the dynamic global 62 object, which is in the scope chain of the first call frame. 63 (JSC::Machine::cti_op_add): Use globalData instead of exec when 64 possible, to keep fast cases fast, since it's now more expensive to 65 get to it through the exec pointer. 66 (JSC::Machine::cti_timeout_check): Ditto. 67 (JSC::Machine::cti_op_put_by_id_second): Ditto. 68 (JSC::Machine::cti_op_get_by_id_second): Ditto. 69 (JSC::Machine::cti_op_mul): Ditto. 70 (JSC::Machine::cti_vm_compile): Ditto. 71 (JSC::Machine::cti_op_get_by_val): Ditto. 72 (JSC::Machine::cti_op_sub): Ditto. 73 (JSC::Machine::cti_op_put_by_val): Ditto. 74 (JSC::Machine::cti_op_put_by_val_array): Ditto. 75 (JSC::Machine::cti_op_negate): Ditto. 76 (JSC::Machine::cti_op_div): Ditto. 77 (JSC::Machine::cti_op_pre_dec): Ditto. 78 (JSC::Machine::cti_op_post_inc): Ditto. 79 (JSC::Machine::cti_op_lshift): Ditto. 80 (JSC::Machine::cti_op_bitand): Ditto. 81 (JSC::Machine::cti_op_rshift): Ditto. 82 (JSC::Machine::cti_op_bitnot): Ditto. 83 (JSC::Machine::cti_op_mod): Ditto. 84 (JSC::Machine::cti_op_post_dec): Ditto. 85 (JSC::Machine::cti_op_urshift): Ditto. 86 (JSC::Machine::cti_op_bitxor): Ditto. 87 (JSC::Machine::cti_op_bitor): Ditto. 88 (JSC::Machine::cti_op_call_eval): Ditto. 89 (JSC::Machine::cti_op_throw): Ditto. 90 (JSC::Machine::cti_op_is_string): Ditto. 91 (JSC::Machine::cti_op_debug): Ditto. 92 (JSC::Machine::cti_vm_throw): Ditto. 93 94 * VM/Machine.h: Added firstCallFrame. 95 96 * kjs/DebuggerCallFrame.cpp: 97 (JSC::DebuggerCallFrame::evaluate): Pass fewer arguments when 98 constructing ExecState. 99 100 * kjs/ExecState.cpp: Deleted contents. Later we'll remove the 101 file altogether. 102 103 * kjs/ExecState.h: Removed m_globalObject and m_globalData. 104 Moved CodeType into another header. 105 (JSC::ExecState::ExecState): Take only a single argument, a 106 call frame pointer. 107 (JSC::ExecState::dynamicGlobalObject): Get the object from 108 the first call frame since it's no longer stored. 109 (JSC::ExecState::globalData): Get the global data from the 110 scope chain, since we no longer store a pointer to it here. 111 (JSC::ExecState::identifierTable): Ditto. 112 (JSC::ExecState::propertyNames): Ditto. 113 (JSC::ExecState::emptyList): Ditto. 114 (JSC::ExecState::lexer): Ditto. 115 (JSC::ExecState::parser): Ditto. 116 (JSC::ExecState::machine): Ditto. 117 (JSC::ExecState::arrayTable): Ditto. 118 (JSC::ExecState::dateTable): Ditto. 119 (JSC::ExecState::mathTable): Ditto. 120 (JSC::ExecState::numberTable): Ditto. 121 (JSC::ExecState::regExpTable): Ditto. 122 (JSC::ExecState::regExpConstructorTable): Ditto. 123 (JSC::ExecState::stringTable): Ditto. 124 (JSC::ExecState::heap): Ditto. 125 126 * kjs/FunctionConstructor.cpp: 127 (JSC::FunctionConstructor::FunctionConstructor): Pass 128 JSGlobalData* instead of ExecState* to the InternalFunction 129 constructor. 130 (JSC::constructFunction): Pass the global data pointer when 131 constructing a new scope chain. 132 133 * kjs/InternalFunction.cpp: 134 (JSC::InternalFunction::InternalFunction): Take a JSGlobalData* 135 instead of an ExecState*. Later we can change more places to 136 work this way -- it's more efficient to take the type you need 137 since the caller might already have it. 138 * kjs/InternalFunction.h: Ditto. 139 140 * kjs/JSCell.h: 141 (JSC::JSCell::operator new): Added an overload that takes a 142 JSGlobalData* so you can construct without an ExecState*. 143 144 * kjs/JSGlobalObject.cpp: 145 (JSC::JSGlobalObject::init): Moved creation of the global scope 146 chain in here, since it now requires a pointer to the global data. 147 Moved the initialization of the call frame in here since it requires 148 the global scope chain node. Removed the extra argument to ExecState 149 when creating the global ExecState*. 150 * kjs/JSGlobalObject.h: Removed initialization of globalScopeChain 151 and the call frame from the JSGlobalObjectData constructor. Added 152 a thisValue argument to the init function. 153 154 * kjs/JSNumberCell.cpp: Added versions of jsNumberCell that take 155 JSGlobalData* rather than ExecState*. 156 * kjs/JSNumberCell.h: 157 (JSC::JSNumberCell::operator new): Added a version that takes 158 JSGlobalData*. 159 (JSC::JSNumberCell::JSNumberCell): Ditto. 160 (JSC::jsNumber): Ditto. 161 * kjs/JSString.cpp: 162 (JSC::jsString): Ditto. 163 (JSC::jsSubstring): Ditto. 164 (JSC::jsOwnedString): Ditto. 165 * kjs/JSString.h: 166 (JSC::JSString::JSString): Changed to take JSGlobalData*. 167 (JSC::jsEmptyString): Added a version that takes JSGlobalData*. 168 (JSC::jsSingleCharacterString): Ditto. 169 (JSC::jsSingleCharacterSubstring): Ditto. 170 (JSC::jsNontrivialString): Ditto. 171 (JSC::JSString::getIndex): Ditto. 172 (JSC::jsString): Ditto. 173 (JSC::jsSubstring): Ditto. 174 (JSC::jsOwnedString): Ditto. 175 176 * kjs/ScopeChain.h: Added a globalData pointer to each node. 177 (JSC::ScopeChainNode::ScopeChainNode): Initialize the globalData 178 pointer. 179 (JSC::ScopeChainNode::push): Set the global data pointer in the 180 new node. 181 (JSC::ScopeChain::ScopeChain): Take a globalData argument. 182 183 * kjs/SmallStrings.cpp: 184 (JSC::SmallStrings::createEmptyString): Take JSGlobalData* instead of 185 ExecState*. 186 (JSC::SmallStrings::createSingleCharacterString): Ditto. 187 * kjs/SmallStrings.h: 188 (JSC::SmallStrings::emptyString): Ditto. 189 (JSC::SmallStrings::singleCharacterString): Ditto. 190 1 191 2008-10-03 Cameron Zwarich <[email protected]> 2 192 -
trunk/JavaScriptCore/JavaScriptCore.exp
r37193 r37257 125 125 __ZN3JSC12SamplingTool4stopEv 126 126 __ZN3JSC12SamplingTool5startEj 127 __ZN3JSC12SmallStrings17createEmptyStringEPNS_ 9ExecStateE127 __ZN3JSC12SmallStrings17createEmptyStringEPNS_12JSGlobalDataE 128 128 __ZN3JSC12StringObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE 129 129 __ZN3JSC12StringObject14toThisJSStringEPNS_9ExecStateE … … 137 137 __ZN3JSC13CodeGenerator21setDumpsGeneratedCodeEb 138 138 __ZN3JSC13StatementNode6setLocEii 139 __ZN3JSC13jsOwnedStringEPNS_ 9ExecStateERKNS_7UStringE139 __ZN3JSC13jsOwnedStringEPNS_12JSGlobalDataERKNS_7UStringE 140 140 __ZN3JSC14JSGlobalObject10globalExecEv 141 141 __ZN3JSC14JSGlobalObject12defineGetterEPNS_9ExecStateERKNS_10IdentifierEPNS_8JSObjectE … … 146 146 __ZN3JSC14JSGlobalObject17startTimeoutCheckEv 147 147 __ZN3JSC14JSGlobalObject3putEPNS_9ExecStateERKNS_10IdentifierEPNS_7JSValueERNS_15PutPropertySlotE 148 __ZN3JSC14JSGlobalObject4initE v148 __ZN3JSC14JSGlobalObject4initEPNS_8JSObjectE 149 149 __ZN3JSC14JSGlobalObject4markEv 150 150 __ZN3JSC14JSGlobalObjectD2Ev … … 153 153 __ZN3JSC15JSWrapperObject4markEv 154 154 __ZN3JSC16InternalFunction4infoE 155 __ZN3JSC16InternalFunctionC2EPNS_ 9ExecStateEN3WTF10PassRefPtrINS_11StructureIDEEERKNS_10IdentifierE155 __ZN3JSC16InternalFunctionC2EPNS_12JSGlobalDataEN3WTF10PassRefPtrINS_11StructureIDEEERKNS_10IdentifierE 156 156 __ZN3JSC16JSVariableObject14deletePropertyEPNS_9ExecStateERKNS_10IdentifierE 157 157 __ZN3JSC16JSVariableObject16getPropertyNamesEPNS_9ExecStateERNS_17PropertyNameArrayE … … 207 207 __ZN3JSC7CStringaSERKS0_ 208 208 __ZN3JSC7JSArray4infoE 209 __ZN3JSC7Machine14firstCallFrameEPKNS_8RegisterE 209 210 __ZN3JSC7Profile10restoreAllEv 210 211 __ZN3JSC7Profile5focusEPKNS_11ProfileNodeE … … 246 247 __ZN3JSC8Profiler14startProfilingEPNS_9ExecStateERKNS_7UStringE 247 248 __ZN3JSC8Profiler8profilerEv 248 __ZN3JSC8jsStringEPNS_ 9ExecStateERKNS_7UStringE249 __ZN3JSC8jsStringEPNS_12JSGlobalDataERKNS_7UStringE 249 250 __ZN3JSC9CodeBlockD1Ev 250 251 __ZN3JSC9CodeBlockD2Ev -
trunk/JavaScriptCore/VM/CTI.cpp
r37235 r37257 628 628 emitCall(opcodeIndex, Machine::cti_timeout_check); 629 629 630 emitGetCTIParam(CTI_ARGS_exec, X86::ecx); 631 m_jit.movl_mr(OBJECT_OFFSET(ExecState, m_globalData), X86::ecx, X86::ecx); 630 emitGetCTIParam(CTI_ARGS_globalData, X86::ecx); 632 631 m_jit.movl_mr(OBJECT_OFFSET(JSGlobalData, machine), X86::ecx, X86::ecx); 633 632 m_jit.movl_mr(OBJECT_OFFSET(Machine, m_ticksUntilNextTimeoutCheck), X86::ecx, X86::esi); -
trunk/JavaScriptCore/VM/CTI.h
r37138 r37257 58 58 #define CTI_ARGS_exception 0x10 59 59 #define CTI_ARGS_profilerReference 0x11 60 #define CTI_ARGS_globalData 0x12 60 61 #define ARG_exec ((ExecState*)(ARGS)[CTI_ARGS_exec]) 61 62 #define ARG_registerFile ((RegisterFile*)(ARGS)[CTI_ARGS_registerFile]) … … 63 64 #define ARG_exception ((JSValue**)(ARGS)[CTI_ARGS_exception]) 64 65 #define ARG_profilerReference ((Profiler**)(ARGS)[CTI_ARGS_profilerReference]) 66 #define ARG_globalData ((JSGlobalData*)(ARGS)[CTI_ARGS_globalData]) 65 67 66 68 #define ARG_setR(newR) (*(volatile Register**)&(ARGS)[CTI_ARGS_r] = newR) … … 233 235 234 236 extern "C" { 235 JSValue* ctiTrampoline(void* code, ExecState* exec, RegisterFile* registerFile, Register* r, JSValue** exception, Profiler**);237 JSValue* ctiTrampoline(void* code, ExecState*, RegisterFile*, Register* callFrame, JSValue** exception, Profiler**, JSGlobalData*); 236 238 void ctiVMThrowTrampoline(); 237 239 }; … … 322 324 } 323 325 324 inline static JSValue* execute(void* code, ExecState* exec, RegisterFile* registerFile, Register* r, JS Value** exception)325 { 326 JSValue* value = ctiTrampoline(code, exec, registerFile, r, exception, Profiler::enabledProfilerReference() );326 inline static JSValue* execute(void* code, ExecState* exec, RegisterFile* registerFile, Register* r, JSGlobalData* globalData, JSValue** exception) 327 { 328 JSValue* value = ctiTrampoline(code, exec, registerFile, r, exception, Profiler::enabledProfilerReference(), globalData); 327 329 #if ENABLE(SAMPLING_TOOL) 328 330 currentOpcodeID = static_cast<OpcodeID>(-1); -
trunk/JavaScriptCore/VM/CodeBlock.h
r37184 r37257 44 44 class ExecState; 45 45 46 enum CodeType { GlobalCode, EvalCode, FunctionCode }; 47 46 48 static ALWAYS_INLINE int missingThisObjectMarker() { return std::numeric_limits<int>::max(); } 47 49 -
trunk/JavaScriptCore/VM/Machine.cpp
r37213 r37257 905 905 scopeChain = scopeChain->copy(); 906 906 907 ExecState newExec( exec,r);907 ExecState newExec(r); 908 908 909 909 Profiler** profiler = Profiler::enabledProfilerReference(); … … 915 915 if (!codeBlock->ctiCode) 916 916 CTI::compile(this, exec, codeBlock); 917 JSValue* result = CTI::execute(codeBlock->ctiCode, &newExec, &m_registerFile, r, exception);917 JSValue* result = CTI::execute(codeBlock->ctiCode, &newExec, &m_registerFile, r, &newExec.globalData(), exception); 918 918 #else 919 919 JSValue* result = privateExecute(Normal, &newExec, &m_registerFile, r, exception); … … 967 967 initializeCallFrame(r, codeBlock, 0, scopeChain, makeHostCallFramePointer(exec->m_callFrame), 0, argc, function); 968 968 969 ExecState newExec( exec,r);969 ExecState newExec(r); 970 970 971 971 Profiler** profiler = Profiler::enabledProfilerReference(); … … 977 977 if (!codeBlock->ctiCode) 978 978 CTI::compile(this, exec, codeBlock); 979 JSValue* result = CTI::execute(codeBlock->ctiCode, &newExec, &m_registerFile, r, exception);979 JSValue* result = CTI::execute(codeBlock->ctiCode, &newExec, &m_registerFile, r, &newExec.globalData(), exception); 980 980 #else 981 981 JSValue* result = privateExecute(Normal, &newExec, &m_registerFile, r, exception); … … 1053 1053 scopeChain = scopeChain->copy(); 1054 1054 1055 ExecState newExec( exec,r);1055 ExecState newExec(r); 1056 1056 1057 1057 Profiler** profiler = Profiler::enabledProfilerReference(); … … 1063 1063 if (!codeBlock->ctiCode) 1064 1064 CTI::compile(this, exec, codeBlock); 1065 JSValue* result = CTI::execute(codeBlock->ctiCode, &newExec, &m_registerFile, r, exception);1065 JSValue* result = CTI::execute(codeBlock->ctiCode, &newExec, &m_registerFile, r, &newExec.globalData(), exception); 1066 1066 #else 1067 1067 JSValue* result = privateExecute(Normal, &newExec, &m_registerFile, r, exception); … … 2817 2817 result = jsArray->JSArray::get(exec, i); 2818 2818 } else if (isJSString(baseValue) && static_cast<JSString*>(baseValue)->canGetIndex(i)) 2819 result = static_cast<JSString*>(baseValue)->getIndex( exec, i);2819 result = static_cast<JSString*>(baseValue)->getIndex(&exec->globalData(), i); 2820 2820 else 2821 2821 result = baseValue->get(exec, i); … … 3911 3911 3912 3912 function = caller; 3913 } 3914 3915 const Register* Machine::firstCallFrame(const Register* callFrame) 3916 { 3917 const Register* first = 0; 3918 for (const Register* frame = callFrame; frame; frame = stripHostCallFrameBit(frame[RegisterFile::CallerRegisters].r())) 3919 first = frame; 3920 return first; 3913 3921 } 3914 3922 … … 4206 4214 JSValue* v2 = ARG_src2; 4207 4215 4208 ExecState* exec = ARG_exec;4209 4216 double left; 4210 4217 double right = 0.0; … … 4212 4219 bool rightIsNumber = fastIsNumber(v2, right); 4213 4220 if (rightIsNumber && fastIsNumber(v1, left)) 4214 return jsNumber( exec, left + right);4221 return jsNumber(ARG_globalData, left + right); 4215 4222 4223 ExecState* exec = ARG_exec; 4224 4216 4225 bool leftIsString = v1->isString(); 4217 4226 if (leftIsString && v2->isString()) { … … 4223 4232 } 4224 4233 4225 return jsString( exec, value.release());4234 return jsString(ARG_globalData, value.release()); 4226 4235 } 4227 4236 … … 4236 4245 return result; 4237 4246 } 4238 return jsString( exec, value.release());4247 return jsString(ARG_globalData, value.release()); 4239 4248 } 4240 4249 … … 4259 4268 ExecState* exec = ARG_exec; 4260 4269 4261 if ( exec->machine()->checkTimeout(exec->dynamicGlobalObject()))4270 if (ARG_globalData->machine->checkTimeout(exec->dynamicGlobalObject())) 4262 4271 exec->setException(createInterruptedExecutionException(exec)); 4263 4272 4264 4273 VM_CHECK_EXCEPTION_AT_END(); 4265 4274 } 4266 4267 4275 4268 4276 int Machine::cti_op_loop_if_less(CTI_ARGS) … … 4316 4324 4317 4325 Register* r = ARG_r; 4318 exec->machine()->tryCTICachePutByID(exec, codeBlock(r), CTI_RETURN_ADDRESS, baseValue, slot);4326 ARG_globalData->machine->tryCTICachePutByID(exec, codeBlock(r), CTI_RETURN_ADDRESS, baseValue, slot); 4319 4327 4320 4328 VM_CHECK_EXCEPTION_AT_END(); … … 4371 4379 4372 4380 Register* r = ARG_r; 4373 exec->machine()->tryCTICacheGetByID(exec, codeBlock(r), CTI_RETURN_ADDRESS, baseValue, ident, slot);4381 ARG_globalData->machine->tryCTICacheGetByID(exec, codeBlock(r), CTI_RETURN_ADDRESS, baseValue, ident, slot); 4374 4382 4375 4383 VM_CHECK_EXCEPTION_AT_END(); … … 4461 4469 JSValue* Machine::cti_op_mul(CTI_ARGS) 4462 4470 { 4463 ExecState* exec = ARG_exec;4464 4471 JSValue* src1 = ARG_src1; 4465 4472 JSValue* src2 = ARG_src2; … … 4468 4475 double right; 4469 4476 if (fastIsNumber(src1, left) && fastIsNumber(src2, right)) 4470 return jsNumber( exec, left * right);4471 else { 4472 JSValue* result = jsNumber(exec, src1->toNumber(exec) * src2->toNumber(exec));4473 VM_CHECK_EXCEPTION_AT_END();4474 return result;4475 }4477 return jsNumber(ARG_globalData, left * right); 4478 4479 ExecState* exec = ARG_exec; 4480 JSValue* result = jsNumber(ARG_globalData, src1->toNumber(exec) * src2->toNumber(exec)); 4481 VM_CHECK_EXCEPTION_AT_END(); 4482 return result; 4476 4483 } 4477 4484 … … 4535 4542 4536 4543 if (!codeBlock->ctiCode) 4537 CTI::compile( exec->machine(), exec, codeBlock);4544 CTI::compile(ARG_globalData->machine, exec, codeBlock); 4538 4545 4539 4546 return codeBlock->ctiCode; … … 4780 4787 { 4781 4788 ExecState* exec = ARG_exec; 4782 Machine* machine = exec->machine();4789 Machine* machine = ARG_globalData->machine; 4783 4790 4784 4791 JSValue* baseValue = ARG_src1; … … 4797 4804 result = jsArray->JSArray::get(exec, i); 4798 4805 } else if (machine->isJSString(baseValue) && static_cast<JSString*>(baseValue)->canGetIndex(i)) 4799 result = static_cast<JSString*>(baseValue)->getIndex( exec, i);4806 result = static_cast<JSString*>(baseValue)->getIndex(ARG_globalData, i); 4800 4807 else 4801 4808 result = baseValue->get(exec, i); … … 4862 4869 double right; 4863 4870 if (fastIsNumber(src1, left) && fastIsNumber(src2, right)) 4864 return jsNumber(ARG_exec, left - right); 4865 else { 4866 ExecState* exec = ARG_exec; 4867 JSValue* result = jsNumber(exec, src1->toNumber(exec) - src2->toNumber(exec)); 4868 VM_CHECK_EXCEPTION_AT_END(); 4869 return result; 4870 } 4871 return jsNumber(ARG_globalData, left - right); 4872 4873 ExecState* exec = ARG_exec; 4874 JSValue* result = jsNumber(ARG_globalData, src1->toNumber(exec) - src2->toNumber(exec)); 4875 VM_CHECK_EXCEPTION_AT_END(); 4876 return result; 4871 4877 } 4872 4878 … … 4874 4880 { 4875 4881 ExecState* exec = ARG_exec; 4876 Machine* machine = exec->machine();4882 Machine* machine = ARG_globalData->machine; 4877 4883 4878 4884 JSValue* baseValue = ARG_src1; … … 4911 4917 JSValue* value = ARG_src3; 4912 4918 4913 ASSERT( exec->machine()->isJSArray(baseValue));4919 ASSERT(ARG_globalData->machine->isJSArray(baseValue)); 4914 4920 4915 4921 if (LIKELY(i >= 0)) … … 4950 4956 JSValue* src = ARG_src1; 4951 4957 4952 ExecState* exec = ARG_exec;4953 4954 4958 double v; 4955 4959 if (fastIsNumber(src, v)) 4956 return jsNumber( exec, -v);4957 else { 4958 JSValue* result = jsNumber(exec, -src->toNumber(exec));4959 VM_CHECK_EXCEPTION_AT_END();4960 return result;4961 }4960 return jsNumber(ARG_globalData, -v); 4961 4962 ExecState* exec = ARG_exec; 4963 JSValue* result = jsNumber(ARG_globalData, -src->toNumber(exec)); 4964 VM_CHECK_EXCEPTION_AT_END(); 4965 return result; 4962 4966 } 4963 4967 … … 5035 5039 JSValue* Machine::cti_op_div(CTI_ARGS) 5036 5040 { 5037 ExecState* exec = ARG_exec;5038 5041 JSValue* src1 = ARG_src1; 5039 5042 JSValue* src2 = ARG_src2; … … 5042 5045 double right; 5043 5046 if (fastIsNumber(src1, left) && fastIsNumber(src2, right)) 5044 return jsNumber( exec, left / right);5045 else { 5046 JSValue* result = jsNumber(exec, src1->toNumber(exec) / src2->toNumber(exec));5047 VM_CHECK_EXCEPTION_AT_END();5048 return result;5049 }5047 return jsNumber(ARG_globalData, left / right); 5048 5049 ExecState* exec = ARG_exec; 5050 JSValue* result = jsNumber(ARG_globalData, src1->toNumber(exec) / src2->toNumber(exec)); 5051 VM_CHECK_EXCEPTION_AT_END(); 5052 return result; 5050 5053 } 5051 5054 … … 5055 5058 5056 5059 ExecState* exec = ARG_exec; 5057 JSValue* result = jsNumber( exec, v->toNumber(exec) - 1);5060 JSValue* result = jsNumber(ARG_globalData, v->toNumber(exec) - 1); 5058 5061 VM_CHECK_EXCEPTION_AT_END(); 5059 5062 return result; … … 5101 5104 JSValue* number = v->toJSNumber(exec); 5102 5105 VM_CHECK_EXCEPTION(JSValue*); 5103 ARG_set2ndResult(jsNumber( exec, number->uncheckedGetNumber() + 1));5106 ARG_set2ndResult(jsNumber(ARG_globalData, number->uncheckedGetNumber() + 1)); 5104 5107 return number; 5105 5108 } … … 5123 5126 JSValue* shift = ARG_src2; 5124 5127 5125 ExecState* exec = ARG_exec;5126 5127 5128 int32_t left; 5128 5129 uint32_t right; 5129 5130 if (JSImmediate::areBothImmediateNumbers(val, shift)) 5130 return jsNumber( exec, JSImmediate::getTruncatedInt32(val) << (JSImmediate::getTruncatedUInt32(shift) & 0x1f));5131 elseif (fastToInt32(val, left) && fastToUInt32(shift, right))5132 return jsNumber( exec, left << (right & 0x1f));5133 else { 5134 JSValue* result = jsNumber(exec, (val->toInt32(exec)) << (shift->toUInt32(exec) & 0x1f));5135 VM_CHECK_EXCEPTION_AT_END();5136 return result;5137 }5131 return jsNumber(ARG_globalData, JSImmediate::getTruncatedInt32(val) << (JSImmediate::getTruncatedUInt32(shift) & 0x1f)); 5132 if (fastToInt32(val, left) && fastToUInt32(shift, right)) 5133 return jsNumber(ARG_globalData, left << (right & 0x1f)); 5134 5135 ExecState* exec = ARG_exec; 5136 JSValue* result = jsNumber(ARG_globalData, (val->toInt32(exec)) << (shift->toUInt32(exec) & 0x1f)); 5137 VM_CHECK_EXCEPTION_AT_END(); 5138 return result; 5138 5139 } 5139 5140 … … 5142 5143 JSValue* src1 = ARG_src1; 5143 5144 JSValue* src2 = ARG_src2; 5144 5145 ExecState* exec = ARG_exec;5146 5145 5147 5146 int32_t left; 5148 5147 int32_t right; 5149 5148 if (fastToInt32(src1, left) && fastToInt32(src2, right)) 5150 return jsNumber( exec, left & right);5151 else { 5152 JSValue* result = jsNumber(exec, src1->toInt32(exec) & src2->toInt32(exec));5153 VM_CHECK_EXCEPTION_AT_END();5154 return result;5155 }5149 return jsNumber(ARG_globalData, left & right); 5150 5151 ExecState* exec = ARG_exec; 5152 JSValue* result = jsNumber(ARG_globalData, src1->toInt32(exec) & src2->toInt32(exec)); 5153 VM_CHECK_EXCEPTION_AT_END(); 5154 return result; 5156 5155 } 5157 5156 … … 5160 5159 JSValue* val = ARG_src1; 5161 5160 JSValue* shift = ARG_src2; 5162 5163 ExecState* exec = ARG_exec;5164 5161 5165 5162 int32_t left; … … 5167 5164 if (JSImmediate::areBothImmediateNumbers(val, shift)) 5168 5165 return JSImmediate::rightShiftImmediateNumbers(val, shift); 5169 elseif (fastToInt32(val, left) && fastToUInt32(shift, right))5170 return jsNumber( exec, left >> (right & 0x1f));5171 else { 5172 JSValue* result = jsNumber(exec, (val->toInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));5173 VM_CHECK_EXCEPTION_AT_END();5174 return result;5175 }5166 if (fastToInt32(val, left) && fastToUInt32(shift, right)) 5167 return jsNumber(ARG_globalData, left >> (right & 0x1f)); 5168 5169 ExecState* exec = ARG_exec; 5170 JSValue* result = jsNumber(ARG_globalData, (val->toInt32(exec)) >> (shift->toUInt32(exec) & 0x1f)); 5171 VM_CHECK_EXCEPTION_AT_END(); 5172 return result; 5176 5173 } 5177 5174 … … 5179 5176 { 5180 5177 JSValue* src = ARG_src1; 5181 5182 ExecState* exec = ARG_exec;5183 5178 5184 5179 int value; 5185 5180 if (fastToInt32(src, value)) 5186 return jsNumber( exec, ~value);5181 return jsNumber(ARG_globalData, ~value); 5187 5182 5188 JSValue* result = jsNumber(exec, ~src->toInt32(exec)); 5183 ExecState* exec = ARG_exec; 5184 JSValue* result = jsNumber(ARG_globalData, ~src->toInt32(exec)); 5189 5185 VM_CHECK_EXCEPTION_AT_END(); 5190 5186 return result; … … 5239 5235 ExecState* exec = ARG_exec; 5240 5236 double d = dividendValue->toNumber(exec); 5241 JSValue* result = jsNumber( exec, fmod(d, divisorValue->toNumber(exec)));5237 JSValue* result = jsNumber(ARG_globalData, fmod(d, divisorValue->toNumber(exec))); 5242 5238 VM_CHECK_EXCEPTION_AT_END(); 5243 5239 return result; … … 5274 5270 VM_CHECK_EXCEPTION(JSValue*); 5275 5271 5276 ARG_set2ndResult(jsNumber( exec, number->uncheckedGetNumber() - 1));5272 ARG_set2ndResult(jsNumber(ARG_globalData, number->uncheckedGetNumber() - 1)); 5277 5273 return number; 5278 5274 } … … 5288 5284 return JSImmediate::rightShiftImmediateNumbers(val, shift); 5289 5285 else { 5290 JSValue* result = jsNumber( exec, (val->toUInt32(exec)) >> (shift->toUInt32(exec) & 0x1f));5286 JSValue* result = jsNumber(ARG_globalData, (val->toUInt32(exec)) >> (shift->toUInt32(exec) & 0x1f)); 5291 5287 VM_CHECK_EXCEPTION_AT_END(); 5292 5288 return result; … … 5301 5297 ExecState* exec = ARG_exec; 5302 5298 5303 JSValue* result = jsNumber( exec, src1->toInt32(exec) ^ src2->toInt32(exec));5299 JSValue* result = jsNumber(ARG_globalData, src1->toInt32(exec) ^ src2->toInt32(exec)); 5304 5300 VM_CHECK_EXCEPTION_AT_END(); 5305 5301 return result; … … 5318 5314 ExecState* exec = ARG_exec; 5319 5315 5320 JSValue* result = jsNumber( exec, src1->toInt32(exec) | src2->toInt32(exec));5316 JSValue* result = jsNumber(ARG_globalData, src1->toInt32(exec) | src2->toInt32(exec)); 5321 5317 VM_CHECK_EXCEPTION_AT_END(); 5322 5318 return result; … … 5331 5327 ScopeChainNode* scopeChain = Machine::scopeChain(r); 5332 5328 5333 Machine* machine = exec->machine();5329 Machine* machine = ARG_globalData->machine; 5334 5330 5335 5331 JSValue* funcVal = ARG_src1; … … 5359 5355 5360 5356 JSValue* exceptionValue = ARG_src1; 5361 Instruction* handlerVPC = ARG_ exec->machine()->throwException(exec, exceptionValue, codeBlock->instructions.begin() + vPCIndex, r, true);5357 Instruction* handlerVPC = ARG_globalData->machine->throwException(exec, exceptionValue, codeBlock->instructions.begin() + vPCIndex, r, true); 5362 5358 5363 5359 if (handlerVPC) { … … 5431 5427 JSValue* Machine::cti_op_is_string(CTI_ARGS) 5432 5428 { 5433 return jsBoolean(ARG_ exec->machine()->isJSString(ARG_src1));5429 return jsBoolean(ARG_globalData->machine->isJSString(ARG_src1)); 5434 5430 } 5435 5431 … … 5649 5645 int lastLine = ARG_int3; 5650 5646 5651 exec->machine()->debug(exec, r, static_cast<DebugHookID>(debugHookID), firstLine, lastLine);5647 ARG_globalData->machine->debug(exec, r, static_cast<DebugHookID>(debugHookID), firstLine, lastLine); 5652 5648 } 5653 5649 … … 5665 5661 JSValue* exceptionValue = exec->exception(); 5666 5662 5667 Instruction* handlerVPC = ARG_ exec->machine()->throwException(exec, exceptionValue, codeBlock->instructions.begin() + vPCIndex, r, false);5663 Instruction* handlerVPC = ARG_globalData->machine->throwException(exec, exceptionValue, codeBlock->instructions.begin() + vPCIndex, r, false); 5668 5664 5669 5665 if (handlerVPC) { -
trunk/JavaScriptCore/VM/Machine.h
r37192 r37257 104 104 void retrieveLastCaller(ExecState* exec, int& lineNumber, intptr_t& sourceID, UString& sourceURL, JSValue*& function) const; 105 105 106 static const Register* firstCallFrame(const Register* callFrame); 106 107 static ScopeChainNode* scopeChain(const Register* r) { return r[RegisterFile::ScopeChain].scopeChain(); } 107 108 static CodeBlock* codeBlock(const Register* r) { return r[RegisterFile::CodeBlock].codeBlock(); } -
trunk/JavaScriptCore/kjs/ArrayConstructor.cpp
r36726 r37257 34 34 35 35 ArrayConstructor::ArrayConstructor(ExecState* exec, PassRefPtr<StructureID> structure, ArrayPrototype* arrayPrototype) 36 : InternalFunction( exec, structure, Identifier(exec, arrayPrototype->classInfo()->className))36 : InternalFunction(&exec->globalData(), structure, Identifier(exec, arrayPrototype->classInfo()->className)) 37 37 { 38 38 // ECMA 15.4.3.1 Array.prototype -
trunk/JavaScriptCore/kjs/BooleanConstructor.cpp
r36726 r37257 30 30 31 31 BooleanConstructor::BooleanConstructor(ExecState* exec, PassRefPtr<StructureID> structure, BooleanPrototype* booleanPrototype) 32 : InternalFunction( exec, structure, Identifier(exec, booleanPrototype->classInfo()->className))32 : InternalFunction(&exec->globalData(), structure, Identifier(exec, booleanPrototype->classInfo()->className)) 33 33 { 34 34 putDirect(exec->propertyNames().prototype, booleanPrototype, DontEnum | DontDelete | ReadOnly); -
trunk/JavaScriptCore/kjs/DateConstructor.cpp
r36784 r37257 53 53 54 54 DateConstructor::DateConstructor(ExecState* exec, PassRefPtr<StructureID> structure, StructureID* prototypeFunctionStructure, DatePrototype* datePrototype) 55 : InternalFunction( exec, structure, Identifier(exec, datePrototype->classInfo()->className))55 : InternalFunction(&exec->globalData(), structure, Identifier(exec, datePrototype->classInfo()->className)) 56 56 { 57 57 putDirect(exec->propertyNames().prototype, datePrototype, DontEnum|DontDelete|ReadOnly); -
trunk/JavaScriptCore/kjs/DebuggerCallFrame.cpp
r37184 r37257 69 69 return 0; 70 70 71 ExecState newExec(m_ scopeChain->globalObject(), m_registers);71 ExecState newExec(m_registers); 72 72 73 73 int errLine; -
trunk/JavaScriptCore/kjs/ErrorConstructor.cpp
r36784 r37257 31 31 32 32 ErrorConstructor::ErrorConstructor(ExecState* exec, PassRefPtr<StructureID> structure, ErrorPrototype* errorPrototype) 33 : InternalFunction( exec, structure, Identifier(exec, errorPrototype->classInfo()->className))33 : InternalFunction(&exec->globalData(), structure, Identifier(exec, errorPrototype->classInfo()->className)) 34 34 { 35 35 // ECMA 15.11.3.1 Error.prototype -
trunk/JavaScriptCore/kjs/ExecState.cpp
r37125 r37257 1 /* 2 * Copyright (C) 1999-2001 Harri Porten ([email protected]) 3 * Copyright (C) 2001 Peter Kelly ([email protected]) 4 * Copyright (C) 2003, 2007, 2008 Apple Inc. All rights reserved. 5 * 6 * This library is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Library General Public 8 * License as published by the Free Software Foundation; either 9 * version 2 of the License, or (at your option) any later version. 10 * 11 * This library is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Library General Public License for more details. 15 * 16 * You should have received a copy of the GNU Library General Public License 17 * along with this library; see the file COPYING.LIB. If not, write to 18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301, USA. 20 * 21 */ 22 23 #include "config.h" 24 #include "ExecState.h" 25 26 #include "JSGlobalObject.h" 27 #include "JSString.h" 28 #include "ScopeChainMark.h" 29 30 namespace JSC { 31 32 ExecState::ExecState(JSGlobalObject* globalObject, Register* callFrame) 33 : m_globalObject(globalObject) 34 , m_exception(0) 35 , m_globalData(globalObject->globalData()) 36 , m_callFrame(callFrame) 37 { 38 } 39 40 ExecState::ExecState(ExecState* exec, Register* callFrame) 41 : m_globalObject(exec->m_globalObject) 42 , m_exception(0) 43 , m_globalData(exec->m_globalData) 44 , m_callFrame(callFrame) 45 { 46 ASSERT(!exec->m_exception); 47 } 48 49 } // namespace JSC 1 /* delete me */ -
trunk/JavaScriptCore/kjs/ExecState.h
r37215 r37257 42 42 friend class DebuggerCallFrame; 43 43 public: 44 ExecState(JSGlobalObject*, Register* callFrame); 44 explicit ExecState(Register* callFrame) 45 : m_exception(0) 46 , m_callFrame(callFrame) 47 { 48 } 45 49 46 50 // Global object in which execution began. 47 JSGlobalObject* dynamicGlobalObject() const { return m_globalObject; } 48 51 JSGlobalObject* dynamicGlobalObject() const 52 { 53 return Machine::scopeChain(Machine::firstCallFrame(m_callFrame))->globalObject(); 54 } 55 49 56 // Global object in which the current script was defined. (Can differ 50 57 // from dynamicGlobalObject() during function calls across frames.) … … 53 60 return Machine::scopeChain(m_callFrame)->globalObject(); 54 61 } 55 56 JSObject* globalThisValue() const { return Machine::scopeChain(m_callFrame)->globalThisObject(); } 57 62 63 JSObject* globalThisValue() const 64 { 65 return Machine::scopeChain(m_callFrame)->globalThisObject(); 66 } 67 58 68 // Exception propogation. 59 69 void setException(JSValue* exception) { m_exception = exception; } … … 67 77 #endif 68 78 69 JSGlobalData& globalData() { return *m_globalData; } 79 JSGlobalData& globalData() const 80 { 81 return *Machine::scopeChain(m_callFrame)->globalData; 82 } 70 83 71 IdentifierTable* identifierTable() { return m_globalData->identifierTable; }72 const CommonIdentifiers& propertyNames() const { return * m_globalData->propertyNames; }73 const ArgList& emptyList() const { return * m_globalData->emptyList; }74 Lexer* lexer() { return m_globalData->lexer; }75 Parser* parser() { return m_globalData->parser; }76 Machine* machine() const { return m_globalData->machine; }77 static const HashTable* arrayTable(ExecState* exec) { return exec-> m_globalData->arrayTable; }78 static const HashTable* dateTable(ExecState* exec) { return exec-> m_globalData->dateTable; }79 static const HashTable* mathTable(ExecState* exec) { return exec-> m_globalData->mathTable; }80 static const HashTable* numberTable(ExecState* exec) { return exec-> m_globalData->numberTable; }81 static const HashTable* regExpTable(ExecState* exec) { return exec-> m_globalData->regExpTable; }82 static const HashTable* regExpConstructorTable(ExecState* exec) { return exec-> m_globalData->regExpConstructorTable; }83 static const HashTable* stringTable(ExecState* exec) { return exec-> m_globalData->stringTable; }84 IdentifierTable* identifierTable() { return globalData().identifierTable; } 85 const CommonIdentifiers& propertyNames() const { return *globalData().propertyNames; } 86 const ArgList& emptyList() const { return *globalData().emptyList; } 87 Lexer* lexer() { return globalData().lexer; } 88 Parser* parser() { return globalData().parser; } 89 Machine* machine() const { return globalData().machine; } 90 static const HashTable* arrayTable(ExecState* exec) { return exec->globalData().arrayTable; } 91 static const HashTable* dateTable(ExecState* exec) { return exec->globalData().dateTable; } 92 static const HashTable* mathTable(ExecState* exec) { return exec->globalData().mathTable; } 93 static const HashTable* numberTable(ExecState* exec) { return exec->globalData().numberTable; } 94 static const HashTable* regExpTable(ExecState* exec) { return exec->globalData().regExpTable; } 95 static const HashTable* regExpConstructorTable(ExecState* exec) { return exec->globalData().regExpConstructorTable; } 96 static const HashTable* stringTable(ExecState* exec) { return exec->globalData().stringTable; } 84 97 85 Heap* heap() const { return & m_globalData->heap; }98 Heap* heap() const { return &globalData().heap; } 86 99 87 100 private: … … 89 102 ExecState() { } 90 103 91 ExecState(ExecState*, Register* callFrame);92 93 104 bool isGlobalObject(JSObject*) const; 94 95 JSGlobalObject* m_globalObject;96 105 97 106 JSValue* m_exception; … … 99 108 void* m_ctiReturnAddress; 100 109 #endif 101 JSGlobalData* m_globalData;102 103 110 Register* m_callFrame; // The most recent call frame. 104 111 }; 105 106 enum CodeType { GlobalCode, EvalCode, FunctionCode };107 112 108 113 } // namespace JSC -
trunk/JavaScriptCore/kjs/FunctionConstructor.cpp
r37184 r37257 36 36 37 37 FunctionConstructor::FunctionConstructor(ExecState* exec, PassRefPtr<StructureID> structure, FunctionPrototype* functionPrototype) 38 : InternalFunction( exec, structure, Identifier(exec, functionPrototype->classInfo()->className))38 : InternalFunction(&exec->globalData(), structure, Identifier(exec, functionPrototype->classInfo()->className)) 39 39 { 40 40 putDirect(exec->propertyNames().prototype, functionPrototype, DontEnum | DontDelete | ReadOnly); … … 128 128 functionBody->finishParsing(source, parameters.releaseBuffer(), count); 129 129 130 ScopeChain scopeChain(exec->lexicalGlobalObject(), exec->globalThisValue()); 130 JSGlobalObject* globalObject = exec->lexicalGlobalObject(); 131 ScopeChain scopeChain(globalObject, globalObject->globalData(), exec->globalThisValue()); 131 132 JSFunction* function = new (exec) JSFunction(exec, functionName, functionBody.get(), scopeChain.node()); 132 133 -
trunk/JavaScriptCore/kjs/FunctionPrototype.cpp
r36875 r37257 38 38 39 39 FunctionPrototype::FunctionPrototype(ExecState* exec) 40 : InternalFunction( exec)40 : InternalFunction(&exec->globalData()) 41 41 { 42 42 putDirect(exec->propertyNames().length, jsNumber(exec, 0), DontDelete | ReadOnly | DontEnum); -
trunk/JavaScriptCore/kjs/InternalFunction.cpp
r37103 r37257 38 38 } 39 39 40 InternalFunction::InternalFunction( ExecState* exec)41 : JSObject( exec->globalData().nullProtoStructureID)40 InternalFunction::InternalFunction(JSGlobalData* globalData) 41 : JSObject(globalData->nullProtoStructureID) 42 42 { 43 putDirect( exec->propertyNames().name, jsString(exec, exec->propertyNames().nullIdentifier.ustring()), DontDelete | ReadOnly | DontEnum);43 putDirect(globalData->propertyNames->name, jsString(globalData, globalData->propertyNames->nullIdentifier.ustring()), DontDelete | ReadOnly | DontEnum); 44 44 } 45 45 46 InternalFunction::InternalFunction( ExecState* exec, PassRefPtr<StructureID> structure, const Identifier& name)46 InternalFunction::InternalFunction(JSGlobalData* globalData, PassRefPtr<StructureID> structure, const Identifier& name) 47 47 : JSObject(structure) 48 48 { 49 putDirect( exec->propertyNames().name, jsString(exec, name.ustring()), DontDelete | ReadOnly | DontEnum);49 putDirect(globalData->propertyNames->name, jsString(globalData, name.ustring()), DontDelete | ReadOnly | DontEnum); 50 50 } 51 51 -
trunk/JavaScriptCore/kjs/InternalFunction.h
r37103 r37257 46 46 protected: 47 47 InternalFunction(PassRefPtr<StructureID> structure) : JSObject(structure) { } 48 InternalFunction( ExecState*);49 InternalFunction( ExecState*, PassRefPtr<StructureID>, const Identifier&);48 InternalFunction(JSGlobalData*); 49 InternalFunction(JSGlobalData*, PassRefPtr<StructureID>, const Identifier&); 50 50 51 51 private: -
trunk/JavaScriptCore/kjs/JSCell.h
r36764 r37257 80 80 // Garbage collection. 81 81 void* operator new(size_t, ExecState*); 82 void* operator new(size_t, JSGlobalData*); 82 83 void* operator new(size_t, void* placementNewDestination) { return placementNewDestination; } 83 84 virtual void mark(); … … 156 157 } 157 158 159 inline void* JSCell::operator new(size_t size, JSGlobalData* globalData) 160 { 161 #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE 162 return globalData->heap.inlineAllocate(size); 163 #else 164 return globalData->heap.allocate(size); 165 #endif 166 } 158 167 159 168 // --- JSValue inlines ---------------------------- -
trunk/JavaScriptCore/kjs/JSFunction.cpp
r37184 r37257 46 46 47 47 JSFunction::JSFunction(ExecState* exec, const Identifier& name, FunctionBodyNode* body, ScopeChainNode* scopeChainNode) 48 : Base( exec, exec->lexicalGlobalObject()->functionStructure(), name)48 : Base(&exec->globalData(), exec->lexicalGlobalObject()->functionStructure(), name) 49 49 , m_body(body) 50 50 , m_scopeChain(scopeChainNode) -
trunk/JavaScriptCore/kjs/JSGlobalObject.cpp
r37215 r37257 123 123 } 124 124 125 void JSGlobalObject::init( )125 void JSGlobalObject::init(JSObject* thisValue) 126 126 { 127 127 ASSERT(JSLock::currentThreadIsHoldingLock()); 128 128 129 129 d()->globalData = Heap::heap(this)->globalData(); 130 d()->globalScopeChain = ScopeChain(this, d()->globalData.get(), thisValue); 131 132 Machine::initializeCallFrame(d()->globalCallFrame + RegisterFile::CallFrameHeaderSize, 0, 0, d()->globalScopeChain.node(), makeHostCallFramePointer(0), 0, 0, 0); 130 133 131 134 if (JSGlobalObject*& headObject = head()) { … … 140 143 d()->debugger = 0; 141 144 142 d()->globalExec.set(new ExecState( this,d()->globalCallFrame + RegisterFile::CallFrameHeaderSize));145 d()->globalExec.set(new ExecState(d()->globalCallFrame + RegisterFile::CallFrameHeaderSize)); 143 146 144 147 d()->profileGroup = 0; -
trunk/JavaScriptCore/kjs/JSGlobalObject.h
r37191 r37257 55 55 56 56 struct JSGlobalObjectData : public JSVariableObjectData { 57 JSGlobalObjectData( JSGlobalObject* globalObject, JSObject* thisValue)57 JSGlobalObjectData() 58 58 : JSVariableObjectData(&symbolTable, 0) 59 59 , registerArraySize(0) 60 , globalScopeChain( globalObject, thisValue)60 , globalScopeChain(NoScopeChain()) 61 61 , regExpConstructor(0) 62 62 , errorConstructor(0) … … 77 77 , regExpPrototype(0) 78 78 { 79 Machine::initializeCallFrame(globalCallFrame + RegisterFile::CallFrameHeaderSize, 0, 0, globalScopeChain.node(), makeHostCallFramePointer(0), 0, 0, 0);80 79 } 81 80 … … 144 143 void* operator new(size_t, JSGlobalData*); 145 144 146 JSGlobalObject(JSGlobalData* globalData)147 : JSVariableObject(globalData->nullProtoStructureID, new JSGlobalObjectData (this, this))145 explicit JSGlobalObject(JSGlobalData* globalData) 146 : JSVariableObject(globalData->nullProtoStructureID, new JSGlobalObjectData) 148 147 { 149 init( );148 init(this); 150 149 } 151 150 152 151 protected: 153 JSGlobalObject(PassRefPtr<StructureID> structure, JSGlobalObjectData* data )152 JSGlobalObject(PassRefPtr<StructureID> structure, JSGlobalObjectData* data, JSObject* thisValue) 154 153 : JSVariableObject(structure, data) 155 154 { 156 init( );155 init(thisValue); 157 156 } 158 157 … … 268 267 private: 269 268 // FIXME: Fold reset into init. 270 void init( );269 void init(JSObject* thisValue); 271 270 void reset(JSValue* prototype); 272 271 … … 333 332 } 334 333 335 336 334 } // namespace JSC 337 335 -
trunk/JavaScriptCore/kjs/JSNumberCell.cpp
r36726 r37257 112 112 } 113 113 114 NEVER_INLINE JSValue* jsNumberCell(JSGlobalData* globalData, double d) 115 { 116 return new (globalData) JSNumberCell(globalData, d); 117 } 118 119 NEVER_INLINE JSValue* jsNaN(JSGlobalData* globalData) 120 { 121 return new (globalData) JSNumberCell(globalData, NaN); 122 } 123 114 124 } // namespace JSC -
trunk/JavaScriptCore/kjs/JSNumberCell.h
r36976 r37257 44 44 class JSNumberCell : public JSCell { 45 45 friend class CTI; 46 friend JSValue* jsNumberCell(JSGlobalData*, double); 47 friend JSValue* jsNaN(JSGlobalData*); 46 48 friend JSValue* jsNumberCell(ExecState*, double); 47 49 friend JSValue* jsNaN(ExecState*); … … 72 74 } 73 75 76 void* operator new(size_t size, JSGlobalData* globalData) 77 { 78 #ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE 79 return globalData->heap.inlineAllocateNumber(size); 80 #else 81 return globalData->heap.allocateNumber(size); 82 #endif 83 } 84 74 85 static PassRefPtr<StructureID> createStructureID(JSValue* proto) { return StructureID::create(proto, TypeInfo(NumberType)); } 75 86 76 87 private: 88 JSNumberCell(JSGlobalData* globalData, double value) 89 : JSCell(globalData->numberStructureID.get()) 90 , m_value(value) 91 { 92 } 93 77 94 JSNumberCell(ExecState* exec, double value) 78 95 : JSCell(exec->globalData().numberStructureID.get()) … … 100 117 } 101 118 119 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, short i) 120 { 121 JSValue* v = JSImmediate::from(i); 122 return v ? v : jsNumberCell(exec, i); 123 } 124 125 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, unsigned short i) 126 { 127 JSValue* v = JSImmediate::from(i); 128 return v ? v : jsNumberCell(exec, i); 129 } 130 102 131 ALWAYS_INLINE JSValue* jsNumber(ExecState* exec, int i) 103 132 { … … 134 163 JSValue* v = JSImmediate::from(i); 135 164 return v ? v : jsNumberCell(exec, static_cast<double>(i)); 165 } 166 167 ALWAYS_INLINE JSValue* jsNumber(JSGlobalData* globalData, double d) 168 { 169 JSValue* v = JSImmediate::from(d); 170 return v ? v : jsNumberCell(globalData, d); 171 } 172 173 ALWAYS_INLINE JSValue* jsNumber(JSGlobalData* globalData, short i) 174 { 175 JSValue* v = JSImmediate::from(i); 176 return v ? v : jsNumberCell(globalData, i); 177 } 178 179 ALWAYS_INLINE JSValue* jsNumber(JSGlobalData* globalData, unsigned short i) 180 { 181 JSValue* v = JSImmediate::from(i); 182 return v ? v : jsNumberCell(globalData, i); 183 } 184 185 ALWAYS_INLINE JSValue* jsNumber(JSGlobalData* globalData, int i) 186 { 187 JSValue* v = JSImmediate::from(i); 188 return v ? v : jsNumberCell(globalData, i); 189 } 190 191 ALWAYS_INLINE JSValue* jsNumber(JSGlobalData* globalData, unsigned i) 192 { 193 JSValue* v = JSImmediate::from(i); 194 return v ? v : jsNumberCell(globalData, i); 195 } 196 197 ALWAYS_INLINE JSValue* jsNumber(JSGlobalData* globalData, long i) 198 { 199 JSValue* v = JSImmediate::from(i); 200 return v ? v : jsNumberCell(globalData, i); 201 } 202 203 ALWAYS_INLINE JSValue* jsNumber(JSGlobalData* globalData, unsigned long i) 204 { 205 JSValue* v = JSImmediate::from(i); 206 return v ? v : jsNumberCell(globalData, i); 207 } 208 209 ALWAYS_INLINE JSValue* jsNumber(JSGlobalData* globalData, long long i) 210 { 211 JSValue* v = JSImmediate::from(i); 212 return v ? v : jsNumberCell(globalData, static_cast<double>(i)); 213 } 214 215 ALWAYS_INLINE JSValue* jsNumber(JSGlobalData* globalData, unsigned long long i) 216 { 217 JSValue* v = JSImmediate::from(i); 218 return v ? v : jsNumberCell(globalData, static_cast<double>(i)); 136 219 } 137 220 -
trunk/JavaScriptCore/kjs/JSString.cpp
r36726 r37257 110 110 } 111 111 112 JSString* jsString( ExecState* exec, const UString& s)112 JSString* jsString(JSGlobalData* globalData, const UString& s) 113 113 { 114 114 int size = s.size(); 115 115 if (!size) 116 return exec->globalData().smallStrings.emptyString(exec);116 return globalData->smallStrings.emptyString(globalData); 117 117 if (size == 1) { 118 118 UChar c = s.data()[0]; 119 119 if (c <= 0xFF) 120 return exec->globalData().smallStrings.singleCharacterString(exec, c);120 return globalData->smallStrings.singleCharacterString(globalData, c); 121 121 } 122 return new ( exec) JSString(exec, s);122 return new (globalData) JSString(globalData, s); 123 123 } 124 124 125 JSString* jsSubstring( ExecState* exec, const UString& s, unsigned offset, unsigned length)125 JSString* jsSubstring(JSGlobalData* globalData, const UString& s, unsigned offset, unsigned length) 126 126 { 127 127 ASSERT(offset <= static_cast<unsigned>(s.size())); … … 129 129 ASSERT(offset + length <= static_cast<unsigned>(s.size())); 130 130 if (!length) 131 return exec->globalData().smallStrings.emptyString(exec);131 return globalData->smallStrings.emptyString(globalData); 132 132 if (length == 1) { 133 133 UChar c = s.data()[offset]; 134 134 if (c <= 0xFF) 135 return exec->globalData().smallStrings.singleCharacterString(exec, c);135 return globalData->smallStrings.singleCharacterString(globalData, c); 136 136 } 137 return new ( exec) JSString(exec, UString::Rep::create(s.rep(), offset, length));137 return new (globalData) JSString(globalData, UString::Rep::create(s.rep(), offset, length)); 138 138 } 139 139 140 JSString* jsOwnedString( ExecState* exec, const UString& s)140 JSString* jsOwnedString(JSGlobalData* globalData, const UString& s) 141 141 { 142 142 int size = s.size(); 143 143 if (!size) 144 return exec->globalData().smallStrings.emptyString(exec);144 return globalData->smallStrings.emptyString(globalData); 145 145 if (size == 1) { 146 146 UChar c = s.data()[0]; 147 147 if (c <= 0xFF) 148 return exec->globalData().smallStrings.singleCharacterString(exec, c);148 return globalData->smallStrings.singleCharacterString(globalData, c); 149 149 } 150 return new ( exec) JSString(exec, s, JSString::HasOtherOwner);150 return new (globalData) JSString(globalData, s, JSString::HasOtherOwner); 151 151 } 152 152 -
trunk/JavaScriptCore/kjs/JSString.h
r36755 r37257 34 34 class JSString; 35 35 36 JSString* jsEmptyString(JSGlobalData*); 36 37 JSString* jsEmptyString(ExecState*); 38 JSString* jsString(JSGlobalData*, const UString&); // returns empty string if passed null string 37 39 JSString* jsString(ExecState*, const UString&); // returns empty string if passed null string 38 40 41 JSString* jsSingleCharacterString(JSGlobalData*, UChar); 39 42 JSString* jsSingleCharacterString(ExecState*, UChar); 43 JSString* jsSingleCharacterSubstring(JSGlobalData*, const UString&, unsigned offset); 40 44 JSString* jsSingleCharacterSubstring(ExecState*, const UString&, unsigned offset); 45 JSString* jsSubstring(JSGlobalData*, const UString&, unsigned offset, unsigned length); 41 46 JSString* jsSubstring(ExecState*, const UString&, unsigned offset, unsigned length); 42 47 43 48 // Non-trivial strings are two or more characters long. 44 49 // These functions are faster than just calling jsString. 50 JSString* jsNontrivialString(JSGlobalData*, const UString&); 45 51 JSString* jsNontrivialString(ExecState*, const UString&); 52 JSString* jsNontrivialString(JSGlobalData*, const char*); 46 53 JSString* jsNontrivialString(ExecState*, const char*); 47 54 … … 49 56 // likely outlive the JSValue this makes, such as the parse tree or a 50 57 // DOM object that contains a UString 58 JSString* jsOwnedString(JSGlobalData*, const UString&); 51 59 JSString* jsOwnedString(ExecState*, const UString&); 52 60 … … 56 64 57 65 public: 58 JSString( ExecState* exec, const UString& value)59 : JSCell( exec->globalData().stringStructureID.get())66 JSString(JSGlobalData* globalData, const UString& value) 67 : JSCell(globalData->stringStructureID.get()) 60 68 , m_value(value) 61 69 { … … 64 72 65 73 enum HasOtherOwnerType { HasOtherOwner }; 66 JSString( ExecState* exec, const UString& value, HasOtherOwnerType)67 : JSCell( exec->globalData().stringStructureID.get())74 JSString(JSGlobalData* globalData, const UString& value, HasOtherOwnerType) 75 : JSCell(globalData->stringStructureID.get()) 68 76 , m_value(value) 69 77 { 70 78 } 71 JSString( ExecState* exec, PassRefPtr<UString::Rep> value, HasOtherOwnerType)72 : JSCell( exec->globalData().stringStructureID.get())79 JSString(JSGlobalData* globalData, PassRefPtr<UString::Rep> value, HasOtherOwnerType) 80 : JSCell(globalData->stringStructureID.get()) 73 81 , m_value(value) 74 82 { … … 81 89 82 90 bool canGetIndex(unsigned i) { return i < static_cast<unsigned>(m_value.size()); } 83 JSString* getIndex( ExecState*, unsigned);91 JSString* getIndex(JSGlobalData*, unsigned); 84 92 85 93 static PassRefPtr<StructureID> createStructureID(JSValue* proto) { return StructureID::create(proto, TypeInfo(StringType)); } … … 110 118 }; 111 119 112 inline JSString* jsEmptyString( ExecState* exec)113 { 114 return exec->globalData().smallStrings.emptyString(exec);115 } 116 117 inline JSString* jsSingleCharacterString( ExecState* exec, UChar c)120 inline JSString* jsEmptyString(JSGlobalData* globalData) 121 { 122 return globalData->smallStrings.emptyString(globalData); 123 } 124 125 inline JSString* jsSingleCharacterString(JSGlobalData* globalData, UChar c) 118 126 { 119 127 if (c <= 0xFF) 120 return exec->globalData().smallStrings.singleCharacterString(exec, c);121 return new ( exec) JSString(exec, UString(&c, 1));122 } 123 124 inline JSString* jsSingleCharacterSubstring( ExecState* exec, const UString& s, unsigned offset)128 return globalData->smallStrings.singleCharacterString(globalData, c); 129 return new (globalData) JSString(globalData, UString(&c, 1)); 130 } 131 132 inline JSString* jsSingleCharacterSubstring(JSGlobalData* globalData, const UString& s, unsigned offset) 125 133 { 126 134 ASSERT(offset < static_cast<unsigned>(s.size())); 127 135 UChar c = s.data()[offset]; 128 136 if (c <= 0xFF) 129 return exec->globalData().smallStrings.singleCharacterString(exec, c);130 return new ( exec) JSString(exec, UString::Rep::create(s.rep(), offset, 1));131 } 132 133 inline JSString* jsNontrivialString( ExecState* exec, const char* s)137 return globalData->smallStrings.singleCharacterString(globalData, c); 138 return new (globalData) JSString(globalData, UString::Rep::create(s.rep(), offset, 1)); 139 } 140 141 inline JSString* jsNontrivialString(JSGlobalData* globalData, const char* s) 134 142 { 135 143 ASSERT(s); 136 144 ASSERT(s[0]); 137 145 ASSERT(s[1]); 138 return new ( exec) JSString(exec, s);139 } 140 141 inline JSString* jsNontrivialString( ExecState* exec, const UString& s)146 return new (globalData) JSString(globalData, s); 147 } 148 149 inline JSString* jsNontrivialString(JSGlobalData* globalData, const UString& s) 142 150 { 143 151 ASSERT(s.size() > 1); 144 return new ( exec) JSString(exec, s);145 } 146 147 inline JSString* JSString::getIndex( ExecState* exec, unsigned i)152 return new (globalData) JSString(globalData, s); 153 } 154 155 inline JSString* JSString::getIndex(JSGlobalData* globalData, unsigned i) 148 156 { 149 157 ASSERT(canGetIndex(i)); 150 return jsSingleCharacterSubstring(exec, m_value, i); 151 } 158 return jsSingleCharacterSubstring(globalData, m_value, i); 159 } 160 161 inline JSString* jsEmptyString(ExecState* exec) { return jsEmptyString(&exec->globalData()); } 162 inline JSString* jsString(ExecState* exec, const UString& s) { return jsString(&exec->globalData(), s); } 163 inline JSString* jsSingleCharacterString(ExecState* exec, UChar c) { return jsSingleCharacterString(&exec->globalData(), c); } 164 inline JSString* jsSingleCharacterSubstring(ExecState* exec, const UString& s, unsigned offset) { return jsSingleCharacterSubstring(&exec->globalData(), s, offset); } 165 inline JSString* jsSubstring(ExecState* exec, const UString& s, unsigned offset, unsigned length) { return jsSubstring(&exec->globalData(), s, offset, length); } 166 inline JSString* jsNontrivialString(ExecState* exec, const UString& s) { return jsNontrivialString(&exec->globalData(), s); } 167 inline JSString* jsNontrivialString(ExecState* exec, const char* s) { return jsNontrivialString(&exec->globalData(), s); } 168 inline JSString* jsOwnedString(ExecState* exec, const UString& s) { return jsOwnedString(&exec->globalData(), s); } 152 169 153 170 ALWAYS_INLINE bool JSString::getStringPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot) -
trunk/JavaScriptCore/kjs/NativeErrorConstructor.cpp
r36755 r37257 33 33 34 34 NativeErrorConstructor::NativeErrorConstructor(ExecState* exec, PassRefPtr<StructureID> structure, NativeErrorPrototype* nativeErrorPrototype) 35 : InternalFunction( exec, structure, Identifier(exec, nativeErrorPrototype->getDirect(exec->propertyNames().name)->getString()))35 : InternalFunction(&exec->globalData(), structure, Identifier(exec, nativeErrorPrototype->getDirect(exec->propertyNames().name)->getString())) 36 36 , m_errorStructure(ErrorInstance::createStructureID(nativeErrorPrototype)) 37 37 { -
trunk/JavaScriptCore/kjs/NumberConstructor.cpp
r36977 r37257 55 55 56 56 NumberConstructor::NumberConstructor(ExecState* exec, PassRefPtr<StructureID> structure, NumberPrototype* numberPrototype) 57 : InternalFunction( exec, structure, Identifier(exec, numberPrototype->info.className))57 : InternalFunction(&exec->globalData(), structure, Identifier(exec, numberPrototype->info.className)) 58 58 { 59 59 // Number.Prototype -
trunk/JavaScriptCore/kjs/ObjectConstructor.cpp
r36726 r37257 30 30 31 31 ObjectConstructor::ObjectConstructor(ExecState* exec, PassRefPtr<StructureID> structure, ObjectPrototype* objectPrototype) 32 : InternalFunction( exec, structure, Identifier(exec, "Object"))32 : InternalFunction(&exec->globalData(), structure, Identifier(exec, "Object")) 33 33 { 34 34 // ECMA 15.2.3.1 -
trunk/JavaScriptCore/kjs/PrototypeFunction.cpp
r36726 r37257 34 34 35 35 PrototypeFunction::PrototypeFunction(ExecState* exec, int length, const Identifier& name, NativeFunction function) 36 : InternalFunction( exec, exec->lexicalGlobalObject()->prototypeFunctionStructure(), name)36 : InternalFunction(&exec->globalData(), exec->lexicalGlobalObject()->prototypeFunctionStructure(), name) 37 37 , m_function(function) 38 38 { … … 42 42 43 43 PrototypeFunction::PrototypeFunction(ExecState* exec, PassRefPtr<StructureID> prototypeFunctionStructure, int length, const Identifier& name, NativeFunction function) 44 : InternalFunction( exec, prototypeFunctionStructure, name)44 : InternalFunction(&exec->globalData(), prototypeFunctionStructure, name) 45 45 , m_function(function) 46 46 { -
trunk/JavaScriptCore/kjs/RegExpConstructor.cpp
r36977 r37257 105 105 106 106 RegExpConstructor::RegExpConstructor(ExecState* exec, PassRefPtr<StructureID> structure, RegExpPrototype* regExpPrototype) 107 : InternalFunction( exec, structure, Identifier(exec, "RegExp"))107 : InternalFunction(&exec->globalData(), structure, Identifier(exec, "RegExp")) 108 108 , d(new RegExpConstructorPrivate) 109 109 { -
trunk/JavaScriptCore/kjs/ScopeChain.h
r36263 r37257 32 32 class ScopeChainNode { 33 33 public: 34 ScopeChainNode(ScopeChainNode* n, JSObject* o, JSObject* gt) 35 : next(n) 36 , object(o) 37 , globalThis(gt) 34 ScopeChainNode(ScopeChainNode* next, JSObject* object, JSGlobalData* globalData, JSObject* globalThis) 35 : next(next) 36 , object(object) 37 , globalData(globalData) 38 , globalThis(globalThis) 38 39 , refCount(1) 39 40 { 41 ASSERT(globalData); 40 42 } 41 43 42 44 ScopeChainNode* next; 43 45 JSObject* object; 46 JSGlobalData* globalData; 44 47 JSObject* globalThis; 45 48 int refCount; … … 79 82 { 80 83 ASSERT(o); 81 return new ScopeChainNode(this, o, global This);84 return new ScopeChainNode(this, o, globalData, globalThis); 82 85 } 83 86 … … 156 159 } 157 160 158 ScopeChain(JSObject* o, JS Object* globalThis)159 : m_node(new ScopeChainNode(0, o, global This))161 ScopeChain(JSObject* o, JSGlobalData* globalData, JSObject* globalThis) 162 : m_node(new ScopeChainNode(0, o, globalData, globalThis)) 160 163 { 161 164 } -
trunk/JavaScriptCore/kjs/SmallStrings.cpp
r36316 r37257 27 27 #include "SmallStrings.h" 28 28 29 #include "JSGlobalObject.h" 29 30 #include "JSString.h" 30 31 … … 88 89 } 89 90 90 void SmallStrings::createEmptyString( ExecState* exec)91 void SmallStrings::createEmptyString(JSGlobalData* globalData) 91 92 { 92 93 ASSERT(!m_emptyString); 93 m_emptyString = new ( exec) JSString(exec, "", JSString::HasOtherOwner);94 m_emptyString = new (globalData) JSString(globalData, "", JSString::HasOtherOwner); 94 95 } 95 96 96 void SmallStrings::createSingleCharacterString( ExecState* exec, unsigned char character)97 void SmallStrings::createSingleCharacterString(JSGlobalData* globalData, unsigned char character) 97 98 { 98 99 if (!m_storage) 99 100 m_storage.set(new SmallStringsStorage); 100 101 ASSERT(!m_singleCharacterStrings[character]); 101 m_singleCharacterStrings[character] = new ( exec) JSString(exec, m_storage->rep(character), JSString::HasOtherOwner);102 m_singleCharacterStrings[character] = new (globalData) JSString(globalData, m_storage->rep(character), JSString::HasOtherOwner); 102 103 } 103 104 -
trunk/JavaScriptCore/kjs/SmallStrings.h
r36263 r37257 32 32 namespace JSC { 33 33 34 class ExecState;34 class JSGlobalData; 35 35 class JSString; 36 36 … … 42 42 ~SmallStrings(); 43 43 44 JSString* emptyString( ExecState* exec)44 JSString* emptyString(JSGlobalData* globalData) 45 45 { 46 46 if (!m_emptyString) 47 createEmptyString( exec);47 createEmptyString(globalData); 48 48 return m_emptyString; 49 49 } 50 JSString* singleCharacterString( ExecState* exec, unsigned char character)50 JSString* singleCharacterString(JSGlobalData* globalData, unsigned char character) 51 51 { 52 52 if (!m_singleCharacterStrings[character]) 53 createSingleCharacterString( exec, character);53 createSingleCharacterString(globalData, character); 54 54 return m_singleCharacterStrings[character]; 55 55 } … … 60 60 61 61 private: 62 void createEmptyString( ExecState*);63 void createSingleCharacterString( ExecState*, unsigned char);62 void createEmptyString(JSGlobalData*); 63 void createSingleCharacterString(JSGlobalData*, unsigned char); 64 64 65 65 JSString* m_emptyString; -
trunk/JavaScriptCore/kjs/StringConstructor.cpp
r36726 r37257 48 48 49 49 StringConstructor::StringConstructor(ExecState* exec, PassRefPtr<StructureID> structure, StructureID* prototypeFunctionStructure, StringPrototype* stringPrototype) 50 : InternalFunction( exec, structure, Identifier(exec, stringPrototype->classInfo()->className))50 : InternalFunction(&exec->globalData(), structure, Identifier(exec, stringPrototype->classInfo()->className)) 51 51 { 52 52 // ECMA 15.5.3.1 String.prototype
Note:
See TracChangeset
for help on using the changeset viewer.