Changeset 130726 in webkit for trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp
- Timestamp:
- Oct 9, 2012, 12:12:56 AM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp
r129453 r130726 89 89 } 90 90 91 ALWAYS_INLINE CallFrame* Interpreter::slideRegisterWindowForCall(CodeBlock* newCodeBlock, RegisterFile* registerFile, CallFrame* callFrame, size_t registerOffset, int argumentCountIncludingThis)91 ALWAYS_INLINE CallFrame* Interpreter::slideRegisterWindowForCall(CodeBlock* newCodeBlock, JSStack* stack, CallFrame* callFrame, size_t registerOffset, int argumentCountIncludingThis) 92 92 { 93 93 // This ensures enough space for the worst case scenario of zero arguments passed by the caller. 94 if (! registerFile->grow(callFrame->registers() + registerOffset + newCodeBlock->numParameters() + newCodeBlock->m_numCalleeRegisters))94 if (!stack->grow(callFrame->registers() + registerOffset + newCodeBlock->numParameters() + newCodeBlock->m_numCalleeRegisters)) 95 95 return 0; 96 96 … … 164 164 ASSERT(isValidThisObject(thisValue, callFrame)); 165 165 Interpreter* interpreter = callFrame->globalData().interpreter; 166 return interpreter->execute(eval, callFrame, thisValue, callerScopeChain, callFrame->registers() - interpreter-> registerFile().begin() + 1 + RegisterFile::CallFrameHeaderSize);167 } 168 169 CallFrame* loadVarargs(CallFrame* callFrame, RegisterFile* registerFile, JSValue thisValue, JSValue arguments, int firstFreeRegister)166 return interpreter->execute(eval, callFrame, thisValue, callerScopeChain, callFrame->registers() - interpreter->stack().begin() + 1 + JSStack::CallFrameHeaderSize); 167 } 168 169 CallFrame* loadVarargs(CallFrame* callFrame, JSStack* stack, JSValue thisValue, JSValue arguments, int firstFreeRegister) 170 170 { 171 171 if (!arguments) { // f.apply(x, arguments), with arguments unmodified. 172 172 unsigned argumentCountIncludingThis = callFrame->argumentCountIncludingThis(); 173 CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + firstFreeRegister + argumentCountIncludingThis + RegisterFile::CallFrameHeaderSize);174 if (argumentCountIncludingThis > Arguments::MaxArguments + 1 || ! registerFile->grow(newCallFrame->registers())) {173 CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + firstFreeRegister + argumentCountIncludingThis + JSStack::CallFrameHeaderSize); 174 if (argumentCountIncludingThis > Arguments::MaxArguments + 1 || !stack->grow(newCallFrame->registers())) { 175 175 callFrame->globalData().exception = createStackOverflowError(callFrame); 176 176 return 0; … … 185 185 186 186 if (arguments.isUndefinedOrNull()) { 187 CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + firstFreeRegister + 1 + RegisterFile::CallFrameHeaderSize);188 if (! registerFile->grow(newCallFrame->registers())) {187 CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + firstFreeRegister + 1 + JSStack::CallFrameHeaderSize); 188 if (!stack->grow(newCallFrame->registers())) { 189 189 callFrame->globalData().exception = createStackOverflowError(callFrame); 190 190 return 0; … … 204 204 unsigned argCount = argsObject->length(callFrame); 205 205 CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + firstFreeRegister + CallFrame::offsetFor(argCount + 1)); 206 if (argCount > Arguments::MaxArguments || ! registerFile->grow(newCallFrame->registers())) {206 if (argCount > Arguments::MaxArguments || !stack->grow(newCallFrame->registers())) { 207 207 callFrame->globalData().exception = createStackOverflowError(callFrame); 208 208 return 0; … … 218 218 unsigned argCount = array->length(); 219 219 CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + firstFreeRegister + CallFrame::offsetFor(argCount + 1)); 220 if (argCount > Arguments::MaxArguments || ! registerFile->grow(newCallFrame->registers())) {220 if (argCount > Arguments::MaxArguments || !stack->grow(newCallFrame->registers())) { 221 221 callFrame->globalData().exception = createStackOverflowError(callFrame); 222 222 return 0; … … 231 231 unsigned argCount = argObject->get(callFrame, callFrame->propertyNames().length).toUInt32(callFrame); 232 232 CallFrame* newCallFrame = CallFrame::create(callFrame->registers() + firstFreeRegister + CallFrame::offsetFor(argCount + 1)); 233 if (argCount > Arguments::MaxArguments || ! registerFile->grow(newCallFrame->registers())) {233 if (argCount > Arguments::MaxArguments || !stack->grow(newCallFrame->registers())) { 234 234 callFrame->globalData().exception = createStackOverflowError(callFrame); 235 235 return 0; … … 302 302 const Register* end; 303 303 304 it = callFrame->registers() - RegisterFile::CallFrameHeaderSize - callFrame->argumentCountIncludingThis();305 end = callFrame->registers() - RegisterFile::CallFrameHeaderSize;304 it = callFrame->registers() - JSStack::CallFrameHeaderSize - callFrame->argumentCountIncludingThis(); 305 end = callFrame->registers() - JSStack::CallFrameHeaderSize; 306 306 while (it < end) { 307 307 JSValue v = it->jsValue(); … … 711 711 highWaterMark = max(highWaterMark, callerHighWaterMark); 712 712 } 713 m_ registerFile.shrink(highWaterMark);713 m_stack.shrink(highWaterMark); 714 714 715 715 // Unwind the scope chain within the exception handler's call frame. … … 864 864 865 865 // Reserve stack space for this invocation: 866 Register* oldEnd = m_ registerFile.end();867 Register* newEnd = oldEnd + codeBlock->numParameters() + RegisterFile::CallFrameHeaderSize + codeBlock->m_numCalleeRegisters;868 if (!m_ registerFile.grow(newEnd))866 Register* oldEnd = m_stack.end(); 867 Register* newEnd = oldEnd + codeBlock->numParameters() + JSStack::CallFrameHeaderSize + codeBlock->m_numCalleeRegisters; 868 if (!m_stack.grow(newEnd)) 869 869 return checkedReturn(throwStackOverflowError(callFrame)); 870 870 871 871 // Push the call frame for this invocation: 872 CallFrame* newCallFrame = CallFrame::create(oldEnd + codeBlock->numParameters() + RegisterFile::CallFrameHeaderSize);872 CallFrame* newCallFrame = CallFrame::create(oldEnd + codeBlock->numParameters() + JSStack::CallFrameHeaderSize); 873 873 ASSERT(codeBlock->numParameters() == 1); // 1 parameter for 'this'. 874 874 newCallFrame->init(codeBlock, 0, scope, CallFrame::noCaller(), codeBlock->numParameters(), 0); … … 884 884 SamplingTool::CallRecord callRecord(m_sampler.get()); 885 885 886 m_reentryDepth++; 886 m_reentryDepth++; 887 887 #if ENABLE(LLINT_C_LOOP) 888 888 result = LLInt::CLoop::execute(newCallFrame, llint_program_prologue); 889 889 #elif ENABLE(JIT) 890 result = program->generatedJITCode().execute(&m_ registerFile, newCallFrame, scope->globalData());890 result = program->generatedJITCode().execute(&m_stack, newCallFrame, scope->globalData()); 891 891 #endif // ENABLE(JIT) 892 892 … … 897 897 profiler->didExecute(callFrame, program->sourceURL(), program->lineNo()); 898 898 899 m_ registerFile.shrink(oldEnd);899 m_stack.shrink(oldEnd); 900 900 901 901 return checkedReturn(result); … … 913 913 return checkedReturn(throwStackOverflowError(callFrame)); 914 914 915 Register* oldEnd = m_ registerFile.end();915 Register* oldEnd = m_stack.end(); 916 916 ASSERT(callFrame->frameExtent() <= oldEnd || callFrame == callFrame->scope()->globalObject()->globalExec()); 917 917 int argCount = 1 + args.size(); // implicit "this" parameter 918 size_t registerOffset = argCount + RegisterFile::CallFrameHeaderSize;918 size_t registerOffset = argCount + JSStack::CallFrameHeaderSize; 919 919 920 920 CallFrame* newCallFrame = CallFrame::create(oldEnd + registerOffset); 921 if (!m_ registerFile.grow(newCallFrame->registers()))921 if (!m_stack.grow(newCallFrame->registers())) 922 922 return checkedReturn(throwStackOverflowError(callFrame)); 923 923 … … 933 933 JSObject* compileError = callData.js.functionExecutable->compileForCall(callFrame, callDataScope); 934 934 if (UNLIKELY(!!compileError)) { 935 m_ registerFile.shrink(oldEnd);935 m_stack.shrink(oldEnd); 936 936 return checkedReturn(throwError(callFrame, compileError)); 937 937 } 938 938 939 939 CodeBlock* newCodeBlock = &callData.js.functionExecutable->generatedBytecodeForCall(); 940 newCallFrame = slideRegisterWindowForCall(newCodeBlock, &m_ registerFile, newCallFrame, 0, argCount);940 newCallFrame = slideRegisterWindowForCall(newCodeBlock, &m_stack, newCallFrame, 0, argCount); 941 941 if (UNLIKELY(!newCallFrame)) { 942 m_ registerFile.shrink(oldEnd);942 m_stack.shrink(oldEnd); 943 943 return checkedReturn(throwStackOverflowError(callFrame)); 944 944 } … … 959 959 result = LLInt::CLoop::execute(newCallFrame, llint_function_for_call_prologue); 960 960 #elif ENABLE(JIT) 961 result = callData.js.functionExecutable->generatedJITCodeForCall().execute(&m_ registerFile, newCallFrame, callDataScope->globalData());961 result = callData.js.functionExecutable->generatedJITCodeForCall().execute(&m_stack, newCallFrame, callDataScope->globalData()); 962 962 #endif // ENABLE(JIT) 963 963 … … 968 968 profiler->didExecute(callFrame, function); 969 969 970 m_ registerFile.shrink(oldEnd);970 m_stack.shrink(oldEnd); 971 971 return checkedReturn(result); 972 972 } … … 992 992 profiler->didExecute(callFrame, function); 993 993 994 m_ registerFile.shrink(oldEnd);994 m_stack.shrink(oldEnd); 995 995 return checkedReturn(result); 996 996 } … … 1008 1008 return checkedReturn(throwStackOverflowError(callFrame)); 1009 1009 1010 Register* oldEnd = m_ registerFile.end();1010 Register* oldEnd = m_stack.end(); 1011 1011 int argCount = 1 + args.size(); // implicit "this" parameter 1012 size_t registerOffset = argCount + RegisterFile::CallFrameHeaderSize;1013 1014 if (!m_ registerFile.grow(oldEnd + registerOffset))1012 size_t registerOffset = argCount + JSStack::CallFrameHeaderSize; 1013 1014 if (!m_stack.grow(oldEnd + registerOffset)) 1015 1015 return checkedReturn(throwStackOverflowError(callFrame)); 1016 1016 … … 1027 1027 JSObject* compileError = constructData.js.functionExecutable->compileForConstruct(callFrame, constructDataScope); 1028 1028 if (UNLIKELY(!!compileError)) { 1029 m_ registerFile.shrink(oldEnd);1029 m_stack.shrink(oldEnd); 1030 1030 return checkedReturn(throwError(callFrame, compileError)); 1031 1031 } 1032 1032 1033 1033 CodeBlock* newCodeBlock = &constructData.js.functionExecutable->generatedBytecodeForConstruct(); 1034 newCallFrame = slideRegisterWindowForCall(newCodeBlock, &m_ registerFile, newCallFrame, 0, argCount);1034 newCallFrame = slideRegisterWindowForCall(newCodeBlock, &m_stack, newCallFrame, 0, argCount); 1035 1035 if (UNLIKELY(!newCallFrame)) { 1036 m_ registerFile.shrink(oldEnd);1036 m_stack.shrink(oldEnd); 1037 1037 return checkedReturn(throwStackOverflowError(callFrame)); 1038 1038 } … … 1053 1053 result = LLInt::CLoop::execute(newCallFrame, llint_function_for_construct_prologue); 1054 1054 #elif ENABLE(JIT) 1055 result = constructData.js.functionExecutable->generatedJITCodeForConstruct().execute(&m_ registerFile, newCallFrame, constructDataScope->globalData());1055 result = constructData.js.functionExecutable->generatedJITCodeForConstruct().execute(&m_stack, newCallFrame, constructDataScope->globalData()); 1056 1056 #endif // ENABLE(JIT) 1057 1057 m_reentryDepth--; … … 1061 1061 profiler->didExecute(callFrame, constructor); 1062 1062 1063 m_ registerFile.shrink(oldEnd);1063 m_stack.shrink(oldEnd); 1064 1064 if (callFrame->hadException()) 1065 1065 return 0; … … 1088 1088 profiler->didExecute(callFrame, constructor); 1089 1089 1090 m_ registerFile.shrink(oldEnd);1090 m_stack.shrink(oldEnd); 1091 1091 if (callFrame->hadException()) 1092 1092 return 0; … … 1107 1107 } 1108 1108 1109 Register* oldEnd = m_ registerFile.end();1110 size_t registerOffset = argumentCountIncludingThis + RegisterFile::CallFrameHeaderSize;1109 Register* oldEnd = m_stack.end(); 1110 size_t registerOffset = argumentCountIncludingThis + JSStack::CallFrameHeaderSize; 1111 1111 1112 1112 CallFrame* newCallFrame = CallFrame::create(oldEnd + registerOffset); 1113 if (!m_ registerFile.grow(newCallFrame->registers())) {1113 if (!m_stack.grow(newCallFrame->registers())) { 1114 1114 throwStackOverflowError(callFrame); 1115 1115 return CallFrameClosure(); … … 1119 1119 if (error) { 1120 1120 throwError(callFrame, error); 1121 m_ registerFile.shrink(oldEnd);1121 m_stack.shrink(oldEnd); 1122 1122 return CallFrameClosure(); 1123 1123 } 1124 1124 CodeBlock* codeBlock = &functionExecutable->generatedBytecodeForCall(); 1125 1125 1126 newCallFrame = slideRegisterWindowForCall(codeBlock, &m_ registerFile, newCallFrame, 0, argumentCountIncludingThis);1126 newCallFrame = slideRegisterWindowForCall(codeBlock, &m_stack, newCallFrame, 0, argumentCountIncludingThis); 1127 1127 if (UNLIKELY(!newCallFrame)) { 1128 1128 throwStackOverflowError(callFrame); 1129 m_ registerFile.shrink(oldEnd);1129 m_stack.shrink(oldEnd); 1130 1130 return CallFrameClosure(); 1131 1131 } … … 1155 1155 result = LLInt::CLoop::execute(closure.newCallFrame, llint_function_for_call_prologue); 1156 1156 #elif ENABLE(JIT) 1157 result = closure.functionExecutable->generatedJITCodeForCall().execute(&m_ registerFile, closure.newCallFrame, closure.globalData);1157 result = closure.functionExecutable->generatedJITCodeForCall().execute(&m_stack, closure.newCallFrame, closure.globalData); 1158 1158 #endif // ENABLE(JIT) 1159 1159 m_reentryDepth--; … … 1168 1168 { 1169 1169 closure.globalData->topCallFrame = closure.oldCallFrame; 1170 m_ registerFile.shrink(closure.oldEnd);1170 m_stack.shrink(closure.oldEnd); 1171 1171 } 1172 1172 … … 1223 1223 } 1224 1224 1225 Register* oldEnd = m_ registerFile.end();1226 Register* newEnd = m_ registerFile.begin() + globalRegisterOffset + codeBlock->m_numCalleeRegisters;1227 if (!m_ registerFile.grow(newEnd))1225 Register* oldEnd = m_stack.end(); 1226 Register* newEnd = m_stack.begin() + globalRegisterOffset + codeBlock->m_numCalleeRegisters; 1227 if (!m_stack.grow(newEnd)) 1228 1228 return checkedReturn(throwStackOverflowError(callFrame)); 1229 1229 1230 CallFrame* newCallFrame = CallFrame::create(m_ registerFile.begin() + globalRegisterOffset);1230 CallFrame* newCallFrame = CallFrame::create(m_stack.begin() + globalRegisterOffset); 1231 1231 1232 1232 ASSERT(codeBlock->numParameters() == 1); // 1 parameter for 'this'. … … 1248 1248 result = LLInt::CLoop::execute(newCallFrame, llint_eval_prologue); 1249 1249 #elif ENABLE(JIT) 1250 result = eval->generatedJITCode().execute(&m_ registerFile, newCallFrame, scope->globalData());1250 result = eval->generatedJITCode().execute(&m_stack, newCallFrame, scope->globalData()); 1251 1251 #endif // ENABLE(JIT) 1252 1252 m_reentryDepth--; … … 1256 1256 profiler->didExecute(callFrame, eval->sourceURL(), eval->lineNo()); 1257 1257 1258 m_ registerFile.shrink(oldEnd);1258 m_stack.shrink(oldEnd); 1259 1259 return checkedReturn(result); 1260 1260 }
Note:
See TracChangeset
for help on using the changeset viewer.