Changeset 47738 in webkit for trunk/JavaScriptCore/runtime/Executable.cpp
- Timestamp:
- Aug 24, 2009, 7:53:51 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/Executable.cpp
r47660 r47738 31 31 #include "JIT.h" 32 32 #include "Parser.h" 33 #include "Vector.h" 33 34 34 35 namespace JSC { … … 56 57 FunctionExecutable::~FunctionExecutable() 57 58 { 59 for (int i = 0; i < m_parameterCount; ++i) 60 m_parameters[i].~Identifier(); 61 fastFree(m_parameters); 58 62 delete m_codeBlock; 59 63 } 60 64 61 void EvalExecutable::generateBytecode(ScopeChainNode* scopeChainNode) 62 { 65 JSObject* EvalExecutable::compile(ExecState* exec, ScopeChainNode* scopeChainNode) 66 { 67 int errLine; 68 UString errMsg; 69 RefPtr<EvalNode> evalNode = exec->globalData().parser->parse<EvalNode>(&exec->globalData(), exec->lexicalGlobalObject()->debugger(), exec, m_source, &errLine, &errMsg); 70 if (!evalNode) 71 return Error::create(exec, SyntaxError, errMsg, errLine, m_source.provider()->asID(), m_source.provider()->url()); 72 recordParse(evalNode->features(), evalNode->lineNo(), evalNode->lastLine()); 73 63 74 ScopeChain scopeChain(scopeChainNode); 64 75 JSGlobalObject* globalObject = scopeChain.globalObject(); … … 66 77 ASSERT(!m_evalCodeBlock); 67 78 m_evalCodeBlock = new EvalCodeBlock(this, globalObject, source().provider(), scopeChain.localDepth()); 68 OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(evalNode (), globalObject->debugger(), scopeChain, m_evalCodeBlock->symbolTable(), m_evalCodeBlock));79 OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(evalNode.get(), globalObject->debugger(), scopeChain, m_evalCodeBlock->symbolTable(), m_evalCodeBlock)); 69 80 generator->generate(); 70 81 71 evalNode()->destroyData(); 72 } 73 74 void ProgramExecutable::generateBytecode(ScopeChainNode* scopeChainNode) 75 { 82 evalNode->destroyData(); 83 return 0; 84 } 85 86 JSObject* ProgramExecutable::checkSyntax(ExecState* exec) 87 { 88 int errLine; 89 UString errMsg; 90 RefPtr<ProgramNode> programNode = exec->globalData().parser->parse<ProgramNode>(&exec->globalData(), exec->lexicalGlobalObject()->debugger(), exec, m_source, &errLine, &errMsg); 91 if (!programNode) 92 return Error::create(exec, SyntaxError, errMsg, errLine, m_source.provider()->asID(), m_source.provider()->url()); 93 return 0; 94 } 95 96 JSObject* ProgramExecutable::compile(ExecState* exec, ScopeChainNode* scopeChainNode) 97 { 98 int errLine; 99 UString errMsg; 100 RefPtr<ProgramNode> programNode = exec->globalData().parser->parse<ProgramNode>(&exec->globalData(), exec->lexicalGlobalObject()->debugger(), exec, m_source, &errLine, &errMsg); 101 if (!programNode) 102 return Error::create(exec, SyntaxError, errMsg, errLine, m_source.provider()->asID(), m_source.provider()->url()); 103 recordParse(programNode->features(), programNode->lineNo(), programNode->lastLine()); 104 76 105 ScopeChain scopeChain(scopeChainNode); 77 106 JSGlobalObject* globalObject = scopeChain.globalObject(); … … 79 108 ASSERT(!m_programCodeBlock); 80 109 m_programCodeBlock = new ProgramCodeBlock(this, GlobalCode, globalObject, source().provider()); 81 OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(programNode(), globalObject->debugger(), scopeChain, &globalObject->symbolTable(), m_programCodeBlock)); 82 generator->generate(); 83 84 programNode()->destroyData(); 85 } 86 87 void FunctionExecutable::generateBytecode(ScopeChainNode* scopeChainNode) 88 { 89 body()->reparseDataIfNecessary(scopeChainNode); 110 OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(programNode.get(), globalObject->debugger(), scopeChain, &globalObject->symbolTable(), m_programCodeBlock)); 111 generator->generate(); 112 113 programNode->destroyData(); 114 return 0; 115 } 116 117 void FunctionExecutable::compile(ExecState*, ScopeChainNode* scopeChainNode) 118 { 119 JSGlobalData* globalData = scopeChainNode->globalData; 120 RefPtr<FunctionBodyNode> body = globalData->parser->parse<FunctionBodyNode>(globalData, 0, 0, m_source); 121 if (m_forceUsesArguments) 122 body->setUsesArguments(); 123 body->finishParsing(copyParameters(), m_parameterCount, m_name); 124 recordParse(body->features(), body->lineNo(), body->lastLine()); 90 125 91 126 ScopeChain scopeChain(scopeChainNode); … … 94 129 ASSERT(!m_codeBlock); 95 130 m_codeBlock = new FunctionCodeBlock(this, FunctionCode, source().provider(), source().startOffset()); 96 OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(body (), globalObject->debugger(), scopeChain, m_codeBlock->symbolTable(), m_codeBlock));131 OwnPtr<BytecodeGenerator> generator(new BytecodeGenerator(body.get(), globalObject->debugger(), scopeChain, m_codeBlock->symbolTable(), m_codeBlock)); 97 132 generator->generate(); 98 133 m_numParameters = m_codeBlock->m_numParameters; … … 100 135 m_numVariables = m_codeBlock->m_numVars; 101 136 102 body ()->destroyData();103 } 104 105 #if ENABLE(JIT) 106 107 void EvalExecutable::generateJITCode( ScopeChainNode* scopeChainNode)108 { 109 CodeBlock* codeBlock = &bytecode( scopeChainNode);137 body->destroyData(); 138 } 139 140 #if ENABLE(JIT) 141 142 void EvalExecutable::generateJITCode(ExecState* exec, ScopeChainNode* scopeChainNode) 143 { 144 CodeBlock* codeBlock = &bytecode(exec, scopeChainNode); 110 145 m_jitCode = JIT::compile(scopeChainNode->globalData, codeBlock); 111 146 … … 116 151 } 117 152 118 void ProgramExecutable::generateJITCode( ScopeChainNode* scopeChainNode)119 { 120 CodeBlock* codeBlock = &bytecode( scopeChainNode);153 void ProgramExecutable::generateJITCode(ExecState* exec, ScopeChainNode* scopeChainNode) 154 { 155 CodeBlock* codeBlock = &bytecode(exec, scopeChainNode); 121 156 m_jitCode = JIT::compile(scopeChainNode->globalData, codeBlock); 122 157 … … 127 162 } 128 163 129 void FunctionExecutable::generateJITCode( ScopeChainNode* scopeChainNode)130 { 131 CodeBlock* codeBlock = &bytecode( scopeChainNode);164 void FunctionExecutable::generateJITCode(ExecState* exec, ScopeChainNode* scopeChainNode) 165 { 166 CodeBlock* codeBlock = &bytecode(exec, scopeChainNode); 132 167 m_jitCode = JIT::compile(scopeChainNode->globalData, codeBlock); 133 168 … … 148 183 ExceptionInfo* FunctionExecutable::reparseExceptionInfo(JSGlobalData* globalData, ScopeChainNode* scopeChainNode, CodeBlock* codeBlock) 149 184 { 150 RefPtr<FunctionBodyNode> newFunctionBody = globalData->parser->reparse<FunctionBodyNode>(globalData, body()); 151 ASSERT(newFunctionBody); 152 newFunctionBody->finishParsing(body()->copyParameters(), body()->parameterCount(), body()->ident()); 185 RefPtr<FunctionBodyNode> newFunctionBody = globalData->parser->parse<FunctionBodyNode>(globalData, 0, 0, m_source); 186 if (m_forceUsesArguments) 187 newFunctionBody->setUsesArguments(); 188 newFunctionBody->finishParsing(copyParameters(), m_parameterCount, m_name); 153 189 154 190 ScopeChain scopeChain(scopeChainNode); … … 176 212 ExceptionInfo* EvalExecutable::reparseExceptionInfo(JSGlobalData* globalData, ScopeChainNode* scopeChainNode, CodeBlock* codeBlock) 177 213 { 178 RefPtr<EvalNode> newEvalBody = globalData->parser-> reparse<EvalNode>(globalData, evalNode());214 RefPtr<EvalNode> newEvalBody = globalData->parser->parse<EvalNode>(globalData, 0, 0, m_source); 179 215 180 216 ScopeChain scopeChain(scopeChainNode); … … 197 233 } 198 234 199 void FunctionExecutable::recompile(ExecState* exec) 200 { 201 FunctionBodyNode* oldBody = body(); 202 RefPtr<FunctionBodyNode> newBody = exec->globalData().parser->parse<FunctionBodyNode>(exec, 0, m_source); 203 ASSERT(newBody); 204 newBody->finishParsing(oldBody->copyParameters(), oldBody->parameterCount(), oldBody->ident()); 205 m_node = newBody; 235 void FunctionExecutable::recompile(ExecState*) 236 { 206 237 delete m_codeBlock; 207 238 m_codeBlock = 0; … … 212 243 } 213 244 245 PassRefPtr<FunctionExecutable> FunctionExecutable::fromGlobalCode(const Identifier& functionName, ExecState* exec, Debugger* debugger, const SourceCode& source, int* errLine, UString* errMsg) 246 { 247 RefPtr<ProgramNode> program = exec->globalData().parser->parse<ProgramNode>(&exec->globalData(), debugger, exec, source, errLine, errMsg); 248 if (!program) 249 return 0; 250 251 StatementNode* exprStatement = program->singleStatement(); 252 ASSERT(exprStatement); 253 ASSERT(exprStatement->isExprStatement()); 254 if (!exprStatement || !exprStatement->isExprStatement()) 255 return 0; 256 257 ExpressionNode* funcExpr = static_cast<ExprStatementNode*>(exprStatement)->expr(); 258 ASSERT(funcExpr); 259 ASSERT(funcExpr->isFuncExprNode()); 260 if (!funcExpr || !funcExpr->isFuncExprNode()) 261 return 0; 262 263 FunctionBodyNode* body = static_cast<FuncExprNode*>(funcExpr)->body(); 264 ASSERT(body); 265 return adoptRef(new FunctionExecutable(functionName, body->source(), body->usesArguments(), body->copyParameters(), body->parameterCount(), body->lineNo(), body->lastLine())); 266 } 267 268 Identifier* FunctionExecutable::copyParameters() 269 { 270 // This code uses the internal vector copier to make copy-constructed copies of the data in the array 271 // (the array contains Identfiers which reference count Ustring::Reps, which must be ref'ed correctly). 272 Identifier* parameters = static_cast<Identifier*>(fastMalloc(m_parameterCount * sizeof(Identifier))); 273 WTF::VectorCopier<false, Identifier>::uninitializedCopy(m_parameters, m_parameters + m_parameterCount, parameters); 274 return parameters; 275 } 276 277 UString FunctionExecutable::paramString() const 278 { 279 UString s(""); 280 for (int pos = 0; pos < m_parameterCount; ++pos) { 281 if (!s.isEmpty()) 282 s += ", "; 283 s += m_parameters[pos].ustring(); 284 } 285 286 return s; 287 } 288 214 289 }; 215 290
Note:
See TracChangeset
for help on using the changeset viewer.