Changeset 99898 in webkit for trunk/Source/JavaScriptCore/runtime/Executable.cpp
- Timestamp:
- Nov 10, 2011, 1:59:39 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/runtime/Executable.cpp
r99374 r99898 157 157 JSGlobalData* globalData = &exec->globalData(); 158 158 JSGlobalObject* lexicalGlobalObject = exec->lexicalGlobalObject(); 159 if (!lexicalGlobalObject->evalEnabled()) 160 return throwError(exec, createEvalError(exec, "Eval is disabled")); 161 RefPtr<EvalNode> evalNode = parse<EvalNode>(globalData, lexicalGlobalObject, m_source, 0, isStrictMode() ? JSParseStrict : JSParseNormal, EvalNode::isFunctionNode ? JSParseFunctionCode : JSParseProgramCode, lexicalGlobalObject->debugger(), exec, &exception); 162 if (!evalNode) { 163 ASSERT(exception); 164 return exception; 165 } 166 recordParse(evalNode->features(), evalNode->hasCapturedVariables(), evalNode->lineNo(), evalNode->lastLine()); 167 168 JSGlobalObject* globalObject = scopeChainNode->globalObject.get(); 169 170 OwnPtr<CodeBlock> previousCodeBlock = m_evalCodeBlock.release(); 171 ASSERT((jitType == JITCode::bottomTierJIT()) == !previousCodeBlock); 172 m_evalCodeBlock = adoptPtr(new EvalCodeBlock(this, globalObject, source().provider(), scopeChainNode->localDepth(), previousCodeBlock.release())); 173 OwnPtr<BytecodeGenerator> generator(adoptPtr(new BytecodeGenerator(evalNode.get(), scopeChainNode, m_evalCodeBlock->symbolTable(), m_evalCodeBlock.get(), !!m_evalCodeBlock->alternative() ? OptimizingCompilation : FirstCompilation))); 174 if ((exception = generator->generate())) { 175 m_evalCodeBlock = static_pointer_cast<EvalCodeBlock>(m_evalCodeBlock->releaseAlternative()); 159 160 if (!!m_evalCodeBlock && m_evalCodeBlock->canProduceCopyWithBytecode()) { 161 BytecodeDestructionBlocker blocker(m_evalCodeBlock.get()); 162 OwnPtr<EvalCodeBlock> newCodeBlock = adoptPtr(new EvalCodeBlock(CodeBlock::CopyParsedBlock, *m_evalCodeBlock)); 163 newCodeBlock->setAlternative(static_pointer_cast<CodeBlock>(m_evalCodeBlock.release())); 164 m_evalCodeBlock = newCodeBlock.release(); 165 } else { 166 if (!lexicalGlobalObject->evalEnabled()) 167 return throwError(exec, createEvalError(exec, "Eval is disabled")); 168 RefPtr<EvalNode> evalNode = parse<EvalNode>(globalData, lexicalGlobalObject, m_source, 0, isStrictMode() ? JSParseStrict : JSParseNormal, EvalNode::isFunctionNode ? JSParseFunctionCode : JSParseProgramCode, lexicalGlobalObject->debugger(), exec, &exception); 169 if (!evalNode) { 170 ASSERT(exception); 171 return exception; 172 } 173 recordParse(evalNode->features(), evalNode->hasCapturedVariables(), evalNode->lineNo(), evalNode->lastLine()); 174 175 JSGlobalObject* globalObject = scopeChainNode->globalObject.get(); 176 177 OwnPtr<CodeBlock> previousCodeBlock = m_evalCodeBlock.release(); 178 ASSERT((jitType == JITCode::bottomTierJIT()) == !previousCodeBlock); 179 m_evalCodeBlock = adoptPtr(new EvalCodeBlock(this, globalObject, source().provider(), scopeChainNode->localDepth(), previousCodeBlock.release())); 180 OwnPtr<BytecodeGenerator> generator(adoptPtr(new BytecodeGenerator(evalNode.get(), scopeChainNode, m_evalCodeBlock->symbolTable(), m_evalCodeBlock.get(), !!m_evalCodeBlock->alternative() ? OptimizingCompilation : FirstCompilation))); 181 if ((exception = generator->generate())) { 182 m_evalCodeBlock = static_pointer_cast<EvalCodeBlock>(m_evalCodeBlock->releaseAlternative()); 183 evalNode->destroyData(); 184 return exception; 185 } 186 176 187 evalNode->destroyData(); 177 return exception; 178 } 179 180 evalNode->destroyData(); 181 m_evalCodeBlock->copyDataFromAlternative(); 188 m_evalCodeBlock->copyPostParseDataFromAlternative(); 189 } 182 190 183 191 #if ENABLE(JIT) … … 199 207 #if !ENABLE(OPCODE_SAMPLING) 200 208 if (!BytecodeGenerator::dumpsGeneratedCode()) 201 m_evalCodeBlock-> discardBytecode();209 m_evalCodeBlock->handleBytecodeDiscardingOpportunity(); 202 210 #endif 203 211 m_evalCodeBlock->setJITCode(m_jitCodeForCall, MacroAssemblerCodePtr()); … … 291 299 JSGlobalData* globalData = &exec->globalData(); 292 300 JSGlobalObject* lexicalGlobalObject = exec->lexicalGlobalObject(); 293 RefPtr<ProgramNode> programNode = parse<ProgramNode>(globalData, lexicalGlobalObject, m_source, 0, isStrictMode() ? JSParseStrict : JSParseNormal, ProgramNode::isFunctionNode ? JSParseFunctionCode : JSParseProgramCode, lexicalGlobalObject->debugger(), exec, &exception); 294 if (!programNode) { 295 ASSERT(exception); 296 return exception; 297 } 298 recordParse(programNode->features(), programNode->hasCapturedVariables(), programNode->lineNo(), programNode->lastLine()); 299 300 JSGlobalObject* globalObject = scopeChainNode->globalObject.get(); 301 302 OwnPtr<CodeBlock> previousCodeBlock = m_programCodeBlock.release(); 303 ASSERT((jitType == JITCode::bottomTierJIT()) == !previousCodeBlock); 304 m_programCodeBlock = adoptPtr(new ProgramCodeBlock(this, GlobalCode, globalObject, source().provider(), previousCodeBlock.release())); 305 OwnPtr<BytecodeGenerator> generator(adoptPtr(new BytecodeGenerator(programNode.get(), scopeChainNode, &globalObject->symbolTable(), m_programCodeBlock.get(), !!m_programCodeBlock->alternative() ? OptimizingCompilation : FirstCompilation))); 306 if ((exception = generator->generate())) { 307 m_programCodeBlock = static_pointer_cast<ProgramCodeBlock>(m_programCodeBlock->releaseAlternative()); 301 302 if (!!m_programCodeBlock && m_programCodeBlock->canProduceCopyWithBytecode()) { 303 BytecodeDestructionBlocker blocker(m_programCodeBlock.get()); 304 OwnPtr<ProgramCodeBlock> newCodeBlock = adoptPtr(new ProgramCodeBlock(CodeBlock::CopyParsedBlock, *m_programCodeBlock)); 305 newCodeBlock->setAlternative(static_pointer_cast<CodeBlock>(m_programCodeBlock.release())); 306 m_programCodeBlock = newCodeBlock.release(); 307 } else { 308 RefPtr<ProgramNode> programNode = parse<ProgramNode>(globalData, lexicalGlobalObject, m_source, 0, isStrictMode() ? JSParseStrict : JSParseNormal, ProgramNode::isFunctionNode ? JSParseFunctionCode : JSParseProgramCode, lexicalGlobalObject->debugger(), exec, &exception); 309 if (!programNode) { 310 ASSERT(exception); 311 return exception; 312 } 313 recordParse(programNode->features(), programNode->hasCapturedVariables(), programNode->lineNo(), programNode->lastLine()); 314 315 JSGlobalObject* globalObject = scopeChainNode->globalObject.get(); 316 317 OwnPtr<CodeBlock> previousCodeBlock = m_programCodeBlock.release(); 318 ASSERT((jitType == JITCode::bottomTierJIT()) == !previousCodeBlock); 319 m_programCodeBlock = adoptPtr(new ProgramCodeBlock(this, GlobalCode, globalObject, source().provider(), previousCodeBlock.release())); 320 OwnPtr<BytecodeGenerator> generator(adoptPtr(new BytecodeGenerator(programNode.get(), scopeChainNode, &globalObject->symbolTable(), m_programCodeBlock.get(), !!m_programCodeBlock->alternative() ? OptimizingCompilation : FirstCompilation))); 321 if ((exception = generator->generate())) { 322 m_programCodeBlock = static_pointer_cast<ProgramCodeBlock>(m_programCodeBlock->releaseAlternative()); 323 programNode->destroyData(); 324 return exception; 325 } 326 308 327 programNode->destroyData(); 309 return exception; 310 } 311 312 programNode->destroyData(); 313 m_programCodeBlock->copyDataFromAlternative(); 328 m_programCodeBlock->copyPostParseDataFromAlternative(); 329 } 314 330 315 331 #if ENABLE(JIT) … … 330 346 #if !ENABLE(OPCODE_SAMPLING) 331 347 if (!BytecodeGenerator::dumpsGeneratedCode()) 332 m_programCodeBlock-> discardBytecode();348 m_programCodeBlock->handleBytecodeDiscardingOpportunity(); 333 349 #endif 334 350 m_programCodeBlock->setJITCode(m_jitCodeForCall, MacroAssemblerCodePtr()); … … 389 405 } 390 406 391 CodeBlock* FunctionExecutable::baselineCodeBlockFor(CodeSpecializationKind kind)392 { 393 CodeBlock* result;407 FunctionCodeBlock* FunctionExecutable::baselineCodeBlockFor(CodeSpecializationKind kind) 408 { 409 FunctionCodeBlock* result; 394 410 if (kind == CodeForCall) 395 411 result = m_codeBlockForCall.get(); … … 401 417 return 0; 402 418 while (result->alternative()) 403 result = result->alternative();419 result = static_cast<FunctionCodeBlock*>(result->alternative()); 404 420 ASSERT(result); 405 421 ASSERT(result->getJITType() == JITCode::BaselineJIT); … … 429 445 } 430 446 447 FunctionCodeBlock* FunctionExecutable::codeBlockWithBytecodeFor(CodeSpecializationKind kind) 448 { 449 FunctionCodeBlock* codeBlock = baselineCodeBlockFor(kind); 450 if (codeBlock->canProduceCopyWithBytecode()) 451 return codeBlock; 452 return 0; 453 } 454 431 455 PassOwnPtr<FunctionCodeBlock> FunctionExecutable::produceCodeBlockFor(ScopeChainNode* scopeChainNode, CompilationKind compilationKind, CodeSpecializationKind specializationKind, JSObject*& exception) 432 456 { 457 if (!!codeBlockFor(specializationKind) && codeBlockFor(specializationKind)->canProduceCopyWithBytecode()) { 458 BytecodeDestructionBlocker blocker(codeBlockFor(specializationKind).get()); 459 return adoptPtr(new FunctionCodeBlock(CodeBlock::CopyParsedBlock, *codeBlockFor(specializationKind))); 460 } 461 433 462 exception = 0; 434 463 JSGlobalData* globalData = scopeChainNode->globalData; … … 454 483 return nullptr; 455 484 456 result->copy DataFrom(codeBlockFor(specializationKind).get());485 result->copyPostParseDataFrom(codeBlockFor(specializationKind).get()); 457 486 return result.release(); 458 487 } … … 499 528 #if !ENABLE(OPCODE_SAMPLING) 500 529 if (!BytecodeGenerator::dumpsGeneratedCode()) 501 m_codeBlockForCall-> discardBytecode();530 m_codeBlockForCall->handleBytecodeDiscardingOpportunity(); 502 531 #endif 503 532 … … 562 591 #if !ENABLE(OPCODE_SAMPLING) 563 592 if (!BytecodeGenerator::dumpsGeneratedCode()) 564 m_codeBlockForConstruct-> discardBytecode();593 m_codeBlockForConstruct->handleBytecodeDiscardingOpportunity(); 565 594 #endif 566 595
Note:
See TracChangeset
for help on using the changeset viewer.