| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 // not invoke v8::Function::Call. | 95 // not invoke v8::Function::Call. |
| 96 return v8::Undefined(isolate); | 96 return v8::Undefined(isolate); |
| 97 } | 97 } |
| 98 V8PerIsolateData::from(isolate)->setIsHandlingRecursionLevelError(true); | 98 V8PerIsolateData::from(isolate)->setIsHandlingRecursionLevelError(true); |
| 99 v8::Local<v8::Value> result = v8::Function::New(isolate, throwStackOverflowE
xception)->Call(v8::Undefined(isolate), 0, 0); | 99 v8::Local<v8::Value> result = v8::Function::New(isolate, throwStackOverflowE
xception)->Call(v8::Undefined(isolate), 0, 0); |
| 100 V8PerIsolateData::from(isolate)->setIsHandlingRecursionLevelError(false); | 100 V8PerIsolateData::from(isolate)->setIsHandlingRecursionLevelError(false); |
| 101 return result; | 101 return result; |
| 102 } | 102 } |
| 103 | 103 |
| 104 // Compile a script without any caching or compile options. | 104 // Compile a script without any caching or compile options. |
| 105 v8::Local<v8::Script> compileWithoutOptions(V8CompileHistogram::Cacheability cac
heability, v8::Isolate* isolate, v8::Handle<v8::String> code, v8::ScriptOrigin o
rigin) | 105 v8::MaybeLocal<v8::Script> compileWithoutOptions(V8CompileHistogram::Cacheabilit
y cacheability, v8::Isolate* isolate, v8::Handle<v8::String> code, v8::ScriptOri
gin origin) |
| 106 { | 106 { |
| 107 V8CompileHistogram histogramScope(cacheability); | 107 V8CompileHistogram histogramScope(cacheability); |
| 108 v8::ScriptCompiler::Source source(code, origin); | 108 v8::ScriptCompiler::Source source(code, origin); |
| 109 return v8::ScriptCompiler::Compile(isolate, &source, v8::ScriptCompiler::kNo
CompileOptions); | 109 return v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &source, v8
::ScriptCompiler::kNoCompileOptions); |
| 110 } | 110 } |
| 111 | 111 |
| 112 // Compile a script, and consume a V8 cache that was generated previously. | 112 // Compile a script, and consume a V8 cache that was generated previously. |
| 113 v8::Local<v8::Script> compileAndConsumeCache(CachedMetadataHandler* cacheHandler
, unsigned tag, v8::ScriptCompiler::CompileOptions compileOptions, bool compress
ed, v8::Isolate* isolate, v8::Handle<v8::String> code, v8::ScriptOrigin origin) | 113 v8::MaybeLocal<v8::Script> compileAndConsumeCache(CachedMetadataHandler* cacheHa
ndler, unsigned tag, v8::ScriptCompiler::CompileOptions compileOptions, bool com
pressed, v8::Isolate* isolate, v8::Handle<v8::String> code, v8::ScriptOrigin ori
gin) |
| 114 { | 114 { |
| 115 V8CompileHistogram histogramScope(V8CompileHistogram::Cacheable); | 115 V8CompileHistogram histogramScope(V8CompileHistogram::Cacheable); |
| 116 CachedMetadata* cachedMetadata = cacheHandler->cachedMetadata(tag); | 116 CachedMetadata* cachedMetadata = cacheHandler->cachedMetadata(tag); |
| 117 const char* data = cachedMetadata->data(); | 117 const char* data = cachedMetadata->data(); |
| 118 int length = cachedMetadata->size(); | 118 int length = cachedMetadata->size(); |
| 119 std::string uncompressedOutput; | 119 std::string uncompressedOutput; |
| 120 bool invalidCache = false; | 120 bool invalidCache = false; |
| 121 if (compressed) { | 121 if (compressed) { |
| 122 if (snappy::Uncompress(data, length, &uncompressedOutput)) { | 122 if (snappy::Uncompress(data, length, &uncompressedOutput)) { |
| 123 data = uncompressedOutput.data(); | 123 data = uncompressedOutput.data(); |
| 124 length = uncompressedOutput.length(); | 124 length = uncompressedOutput.length(); |
| 125 } else { | 125 } else { |
| 126 invalidCache = true; | 126 invalidCache = true; |
| 127 } | 127 } |
| 128 } | 128 } |
| 129 v8::Local<v8::Script> script; | 129 v8::MaybeLocal<v8::Script> script; |
| 130 if (invalidCache) { | 130 if (invalidCache) { |
| 131 v8::ScriptCompiler::Source source(code, origin); | 131 v8::ScriptCompiler::Source source(code, origin); |
| 132 script = v8::ScriptCompiler::Compile(isolate, &source, v8::ScriptCompile
r::kNoCompileOptions); | 132 script = v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &sour
ce, v8::ScriptCompiler::kNoCompileOptions); |
| 133 } else { | 133 } else { |
| 134 v8::ScriptCompiler::CachedData* cachedData = new v8::ScriptCompiler::Cac
hedData( | 134 v8::ScriptCompiler::CachedData* cachedData = new v8::ScriptCompiler::Cac
hedData( |
| 135 reinterpret_cast<const uint8_t*>(data), length, v8::ScriptCompiler::
CachedData::BufferNotOwned); | 135 reinterpret_cast<const uint8_t*>(data), length, v8::ScriptCompiler::
CachedData::BufferNotOwned); |
| 136 v8::ScriptCompiler::Source source(code, origin, cachedData); | 136 v8::ScriptCompiler::Source source(code, origin, cachedData); |
| 137 script = v8::ScriptCompiler::Compile(isolate, &source, compileOptions); | 137 script = v8::ScriptCompiler::Compile(isolate->GetCurrentContext(), &sour
ce, compileOptions); |
| 138 invalidCache = cachedData->rejected; | 138 invalidCache = cachedData->rejected; |
| 139 } | 139 } |
| 140 if (invalidCache) | 140 if (invalidCache) |
| 141 cacheHandler->clearCachedMetadata(CachedMetadataHandler::SendToPlatform)
; | 141 cacheHandler->clearCachedMetadata(CachedMetadataHandler::SendToPlatform)
; |
| 142 return script; | 142 return script; |
| 143 } | 143 } |
| 144 | 144 |
| 145 // Compile a script, and produce a V8 cache for future use. | 145 // Compile a script, and produce a V8 cache for future use. |
| 146 v8::Local<v8::Script> compileAndProduceCache(CachedMetadataHandler* cacheHandler
, unsigned tag, v8::ScriptCompiler::CompileOptions compileOptions, bool compress
ed, CachedMetadataHandler::CacheType cacheType, v8::Isolate* isolate, v8::Handle
<v8::String> code, v8::ScriptOrigin origin) | 146 v8::MaybeLocal<v8::Script> compileAndProduceCache(CachedMetadataHandler* cacheHa
ndler, unsigned tag, v8::ScriptCompiler::CompileOptions compileOptions, bool com
pressed, CachedMetadataHandler::CacheType cacheType, v8::Isolate* isolate, v8::H
andle<v8::String> code, v8::ScriptOrigin origin) |
| 147 { | 147 { |
| 148 V8CompileHistogram histogramScope(V8CompileHistogram::Cacheable); | 148 V8CompileHistogram histogramScope(V8CompileHistogram::Cacheable); |
| 149 v8::ScriptCompiler::Source source(code, origin); | 149 v8::ScriptCompiler::Source source(code, origin); |
| 150 v8::Local<v8::Script> script = v8::ScriptCompiler::Compile(isolate, &source,
compileOptions); | 150 v8::MaybeLocal<v8::Script> script = v8::ScriptCompiler::Compile(isolate->Get
CurrentContext(), &source, compileOptions); |
| 151 const v8::ScriptCompiler::CachedData* cachedData = source.GetCachedData(); | 151 const v8::ScriptCompiler::CachedData* cachedData = source.GetCachedData(); |
| 152 if (cachedData) { | 152 if (cachedData) { |
| 153 const char* data = reinterpret_cast<const char*>(cachedData->data); | 153 const char* data = reinterpret_cast<const char*>(cachedData->data); |
| 154 int length = cachedData->length; | 154 int length = cachedData->length; |
| 155 std::string compressedOutput; | 155 std::string compressedOutput; |
| 156 if (compressed) { | 156 if (compressed) { |
| 157 snappy::Compress(data, length, &compressedOutput); | 157 snappy::Compress(data, length, &compressedOutput); |
| 158 data = compressedOutput.data(); | 158 data = compressedOutput.data(); |
| 159 length = compressedOutput.length(); | 159 length = compressedOutput.length(); |
| 160 } | 160 } |
| 161 if (length > 1024) { | 161 if (length > 1024) { |
| 162 // Omit histogram samples for small cache data to avoid outliers. | 162 // Omit histogram samples for small cache data to avoid outliers. |
| 163 int cacheSizeRatio = static_cast<int>(100.0 * length / code->Length(
)); | 163 int cacheSizeRatio = static_cast<int>(100.0 * length / code->Length(
)); |
| 164 blink::Platform::current()->histogramCustomCounts("V8.CodeCacheSizeR
atio", cacheSizeRatio, 0, 10000, 50); | 164 blink::Platform::current()->histogramCustomCounts("V8.CodeCacheSizeR
atio", cacheSizeRatio, 0, 10000, 50); |
| 165 } | 165 } |
| 166 cacheHandler->clearCachedMetadata(CachedMetadataHandler::CacheLocally); | 166 cacheHandler->clearCachedMetadata(CachedMetadataHandler::CacheLocally); |
| 167 cacheHandler->setCachedMetadata(tag, data, length, cacheType); | 167 cacheHandler->setCachedMetadata(tag, data, length, cacheType); |
| 168 } | 168 } |
| 169 return script; | 169 return script; |
| 170 } | 170 } |
| 171 | 171 |
| 172 // Compile a script, and consume or produce a V8 Cache, depending on whether the | 172 // Compile a script, and consume or produce a V8 Cache, depending on whether the |
| 173 // given resource already has cached data available. | 173 // given resource already has cached data available. |
| 174 v8::Local<v8::Script> compileAndConsumeOrProduce(CachedMetadataHandler* cacheHan
dler, unsigned tag, v8::ScriptCompiler::CompileOptions consumeOptions, v8::Scrip
tCompiler::CompileOptions produceOptions, bool compressed, CachedMetadataHandler
::CacheType cacheType, v8::Isolate* isolate, v8::Handle<v8::String> code, v8::Sc
riptOrigin origin) | 174 v8::MaybeLocal<v8::Script> compileAndConsumeOrProduce(CachedMetadataHandler* cac
heHandler, unsigned tag, v8::ScriptCompiler::CompileOptions consumeOptions, v8::
ScriptCompiler::CompileOptions produceOptions, bool compressed, CachedMetadataHa
ndler::CacheType cacheType, v8::Isolate* isolate, v8::Handle<v8::String> code, v
8::ScriptOrigin origin) |
| 175 { | 175 { |
| 176 return cacheHandler->cachedMetadata(tag) | 176 return cacheHandler->cachedMetadata(tag) |
| 177 ? compileAndConsumeCache(cacheHandler, tag, consumeOptions, compressed,
isolate, code, origin) | 177 ? compileAndConsumeCache(cacheHandler, tag, consumeOptions, compressed,
isolate, code, origin) |
| 178 : compileAndProduceCache(cacheHandler, tag, produceOptions, compressed,
cacheType, isolate, code, origin); | 178 : compileAndProduceCache(cacheHandler, tag, produceOptions, compressed,
cacheType, isolate, code, origin); |
| 179 } | 179 } |
| 180 | 180 |
| 181 enum CacheTagKind { | 181 enum CacheTagKind { |
| 182 CacheTagParser = 0, | 182 CacheTagParser = 0, |
| 183 CacheTagCode = 1, | 183 CacheTagCode = 1, |
| 184 CacheTagCodeCompressed = 2, | 184 CacheTagCodeCompressed = 2, |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 return false; | 220 return false; |
| 221 double timeStamp; | 221 double timeStamp; |
| 222 const int size = sizeof(timeStamp); | 222 const int size = sizeof(timeStamp); |
| 223 ASSERT(cachedMetadata->size() == size); | 223 ASSERT(cachedMetadata->size() == size); |
| 224 memcpy(&timeStamp, cachedMetadata->data(), size); | 224 memcpy(&timeStamp, cachedMetadata->data(), size); |
| 225 return (WTF::currentTime() - timeStamp) < kCacheWithinSeconds; | 225 return (WTF::currentTime() - timeStamp) < kCacheWithinSeconds; |
| 226 } | 226 } |
| 227 | 227 |
| 228 // Final compile call for a streamed compilation. Most decisions have already | 228 // Final compile call for a streamed compilation. Most decisions have already |
| 229 // been made, but we need to write back data into the cache. | 229 // been made, but we need to write back data into the cache. |
| 230 v8::Local<v8::Script> postStreamCompile(CachedMetadataHandler* cacheHandler, Scr
iptStreamer* streamer, v8::Isolate* isolate, v8::Handle<v8::String> code, v8::Sc
riptOrigin origin) | 230 v8::MaybeLocal<v8::Script> postStreamCompile(CachedMetadataHandler* cacheHandler
, ScriptStreamer* streamer, v8::Isolate* isolate, v8::Handle<v8::String> code, v
8::ScriptOrigin origin) |
| 231 { | 231 { |
| 232 V8CompileHistogram histogramScope(V8CompileHistogram::Noncacheable); | 232 V8CompileHistogram histogramScope(V8CompileHistogram::Noncacheable); |
| 233 v8::Local<v8::Script> script = v8::ScriptCompiler::Compile(isolate, streamer
->source(), code, origin); | 233 v8::MaybeLocal<v8::Script> script = v8::ScriptCompiler::Compile(isolate->Get
CurrentContext(), streamer->source(), code, origin); |
| 234 | 234 |
| 235 if (!cacheHandler) | 235 if (!cacheHandler) |
| 236 return script; | 236 return script; |
| 237 | 237 |
| 238 // Whether to produce the cached data or not is decided when the | 238 // Whether to produce the cached data or not is decided when the |
| 239 // streamer is started. Here we only need to get the data out. | 239 // streamer is started. Here we only need to get the data out. |
| 240 const v8::ScriptCompiler::CachedData* newCachedData = streamer->source()->Ge
tCachedData(); | 240 const v8::ScriptCompiler::CachedData* newCachedData = streamer->source()->Ge
tCachedData(); |
| 241 if (newCachedData) { | 241 if (newCachedData) { |
| 242 cacheHandler->clearCachedMetadata(CachedMetadataHandler::CacheLocally); | 242 cacheHandler->clearCachedMetadata(CachedMetadataHandler::CacheLocally); |
| 243 v8::ScriptCompiler::CompileOptions options = streamer->compileOptions(); | 243 v8::ScriptCompiler::CompileOptions options = streamer->compileOptions(); |
| 244 switch (options) { | 244 switch (options) { |
| 245 case v8::ScriptCompiler::kProduceParserCache: | 245 case v8::ScriptCompiler::kProduceParserCache: |
| 246 cacheHandler->setCachedMetadata(cacheTag(CacheTagParser, cacheHandle
r), reinterpret_cast<const char*>(newCachedData->data), newCachedData->length, C
achedMetadataHandler::CacheLocally); | 246 cacheHandler->setCachedMetadata(cacheTag(CacheTagParser, cacheHandle
r), reinterpret_cast<const char*>(newCachedData->data), newCachedData->length, C
achedMetadataHandler::CacheLocally); |
| 247 break; | 247 break; |
| 248 case v8::ScriptCompiler::kProduceCodeCache: | 248 case v8::ScriptCompiler::kProduceCodeCache: |
| 249 cacheHandler->setCachedMetadata(cacheTag(CacheTagCode, cacheHandler)
, reinterpret_cast<const char*>(newCachedData->data), newCachedData->length, Cac
hedMetadataHandler::SendToPlatform); | 249 cacheHandler->setCachedMetadata(cacheTag(CacheTagCode, cacheHandler)
, reinterpret_cast<const char*>(newCachedData->data), newCachedData->length, Cac
hedMetadataHandler::SendToPlatform); |
| 250 break; | 250 break; |
| 251 default: | 251 default: |
| 252 break; | 252 break; |
| 253 } | 253 } |
| 254 } | 254 } |
| 255 | 255 |
| 256 return script; | 256 return script; |
| 257 } | 257 } |
| 258 | 258 |
| 259 typedef Function<v8::Local<v8::Script>(v8::Isolate*, v8::Handle<v8::String>, v8:
:ScriptOrigin)> CompileFn; | 259 typedef Function<v8::MaybeLocal<v8::Script>(v8::Isolate*, v8::Handle<v8::String>
, v8::ScriptOrigin)> CompileFn; |
| 260 | 260 |
| 261 // A notation convenience: WTF::bind<...> needs to be given the right argument | 261 // A notation convenience: WTF::bind<...> needs to be given the right argument |
| 262 // types. We have an awful lot of bind calls below, all with the same types, so | 262 // types. We have an awful lot of bind calls below, all with the same types, so |
| 263 // this local bind lets WTF::bind to all the work, but 'knows' the right | 263 // this local bind lets WTF::bind to all the work, but 'knows' the right |
| 264 // parameter types. | 264 // parameter types. |
| 265 // This version isn't quite as smart as the real WTF::bind, though, so you | 265 // This version isn't quite as smart as the real WTF::bind, though, so you |
| 266 // sometimes may still have to call the original. | 266 // sometimes may still have to call the original. |
| 267 template<typename... A> | 267 template<typename... A> |
| 268 PassOwnPtr<CompileFn> bind(const A&... args) | 268 PassOwnPtr<CompileFn> bind(const A&... args) |
| 269 { | 269 { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 // We don't stream scripts which don't have a Resource. | 353 // We don't stream scripts which don't have a Resource. |
| 354 ASSERT(resource); | 354 ASSERT(resource); |
| 355 // Failed resources should never get this far. | 355 // Failed resources should never get this far. |
| 356 ASSERT(!resource->errorOccurred()); | 356 ASSERT(!resource->errorOccurred()); |
| 357 ASSERT(streamer->isFinished()); | 357 ASSERT(streamer->isFinished()); |
| 358 ASSERT(!streamer->streamingSuppressed()); | 358 ASSERT(!streamer->streamingSuppressed()); |
| 359 return WTF::bind<v8::Isolate*, v8::Handle<v8::String>, v8::ScriptOrigin>(pos
tStreamCompile, resource->cacheHandler(), streamer); | 359 return WTF::bind<v8::Isolate*, v8::Handle<v8::String>, v8::ScriptOrigin>(pos
tStreamCompile, resource->cacheHandler(), streamer); |
| 360 } | 360 } |
| 361 } // namespace | 361 } // namespace |
| 362 | 362 |
| 363 v8::Local<v8::Script> V8ScriptRunner::compileScript(const ScriptSourceCode& sour
ce, v8::Isolate* isolate, AccessControlStatus corsStatus, V8CacheOptions cacheOp
tions) | 363 v8::MaybeLocal<v8::Script> V8ScriptRunner::compileScript(const ScriptSourceCode&
source, v8::Isolate* isolate, AccessControlStatus corsStatus, V8CacheOptions ca
cheOptions) |
| 364 { | 364 { |
| 365 return compileScript(v8String(isolate, source.source()), source.url(), sourc
e.sourceMapUrl(), source.startPosition(), isolate, source.resource(), source.str
eamer(), source.resource() ? source.resource()->cacheHandler() : nullptr, corsSt
atus, cacheOptions); | 365 return compileScript(v8String(isolate, source.source()), source.url(), sourc
e.sourceMapUrl(), source.startPosition(), isolate, source.resource(), source.str
eamer(), source.resource() ? source.resource()->cacheHandler() : nullptr, corsSt
atus, cacheOptions); |
| 366 } | 366 } |
| 367 | 367 |
| 368 v8::Local<v8::Script> V8ScriptRunner::compileScript(v8::Handle<v8::String> code,
const String& fileName, const String& sourceMapUrl, const TextPosition& scriptS
tartPosition, v8::Isolate* isolate, ScriptResource* resource, ScriptStreamer* st
reamer, CachedMetadataHandler* cacheHandler, AccessControlStatus corsStatus, V8C
acheOptions cacheOptions, bool isInternalScript) | 368 v8::MaybeLocal<v8::Script> V8ScriptRunner::compileScript(v8::Handle<v8::String>
code, const String& fileName, const String& sourceMapUrl, const TextPosition& sc
riptStartPosition, v8::Isolate* isolate, ScriptResource* resource, ScriptStreame
r* streamer, CachedMetadataHandler* cacheHandler, AccessControlStatus corsStatus
, V8CacheOptions cacheOptions, bool isInternalScript) |
| 369 { | 369 { |
| 370 TRACE_EVENT1("v8", "v8.compile", "fileName", fileName.utf8()); | 370 TRACE_EVENT1("v8", "v8.compile", "fileName", fileName.utf8()); |
| 371 TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Compile"); | 371 TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Compile"); |
| 372 | 372 |
| 373 ASSERT(!streamer || resource); | 373 ASSERT(!streamer || resource); |
| 374 ASSERT(!resource || resource->cacheHandler() == cacheHandler); | 374 ASSERT(!resource || resource->cacheHandler() == cacheHandler); |
| 375 | 375 |
| 376 // NOTE: For compatibility with WebCore, ScriptSourceCode's line starts at | 376 // NOTE: For compatibility with WebCore, ScriptSourceCode's line starts at |
| 377 // 1, whereas v8 starts at 0. | 377 // 1, whereas v8 starts at 0. |
| 378 v8::ScriptOrigin origin( | 378 v8::ScriptOrigin origin( |
| 379 v8String(isolate, fileName), | 379 v8String(isolate, fileName), |
| 380 v8::Integer::New(isolate, scriptStartPosition.m_line.zeroBasedInt()), | 380 v8::Integer::New(isolate, scriptStartPosition.m_line.zeroBasedInt()), |
| 381 v8::Integer::New(isolate, scriptStartPosition.m_column.zeroBasedInt()), | 381 v8::Integer::New(isolate, scriptStartPosition.m_column.zeroBasedInt()), |
| 382 v8Boolean(corsStatus == SharableCrossOrigin, isolate), | 382 v8Boolean(corsStatus == SharableCrossOrigin, isolate), |
| 383 v8::Handle<v8::Integer>(), | 383 v8::Handle<v8::Integer>(), |
| 384 v8Boolean(isInternalScript, isolate), | 384 v8Boolean(isInternalScript, isolate), |
| 385 v8String(isolate, sourceMapUrl)); | 385 v8String(isolate, sourceMapUrl)); |
| 386 | 386 |
| 387 OwnPtr<CompileFn> compileFn = streamer | 387 OwnPtr<CompileFn> compileFn = streamer |
| 388 ? selectCompileFunction(resource, streamer) | 388 ? selectCompileFunction(resource, streamer) |
| 389 : selectCompileFunction(cacheOptions, cacheHandler, code); | 389 : selectCompileFunction(cacheOptions, cacheHandler, code); |
| 390 | 390 |
| 391 return (*compileFn)(isolate, code, origin); | 391 return (*compileFn)(isolate, code, origin); |
| 392 } | 392 } |
| 393 | 393 |
| 394 v8::Local<v8::Value> V8ScriptRunner::runCompiledScript(v8::Isolate* isolate, v8:
:Handle<v8::Script> script, ExecutionContext* context) | 394 v8::MaybeLocal<v8::Value> V8ScriptRunner::runCompiledScript(v8::Isolate* isolate
, v8::Local<v8::Script> script, ExecutionContext* context) |
| 395 { | 395 { |
| 396 if (script.IsEmpty()) | 396 if (script.IsEmpty()) |
| 397 return v8::Local<v8::Value>(); | 397 return v8::MaybeLocal<v8::Value>(); |
| 398 TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Execution"); | 398 TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Execution"); |
| 399 TRACE_EVENT1("v8", "v8.run", "fileName", TRACE_STR_COPY(*v8::String::Utf8Val
ue(script->GetUnboundScript()->GetScriptName()))); | 399 TRACE_EVENT1("v8", "v8.run", "fileName", TRACE_STR_COPY(*v8::String::Utf8Val
ue(script->GetUnboundScript()->GetScriptName()))); |
| 400 | 400 |
| 401 if (V8RecursionScope::recursionLevel(isolate) >= kMaxRecursionDepth) | 401 if (V8RecursionScope::recursionLevel(isolate) >= kMaxRecursionDepth) |
| 402 return throwStackOverflowExceptionIfNeeded(isolate); | 402 return throwStackOverflowExceptionIfNeeded(isolate); |
| 403 | 403 |
| 404 RELEASE_ASSERT(!context->isIteratingOverObservers()); | 404 RELEASE_ASSERT(!context->isIteratingOverObservers()); |
| 405 | 405 |
| 406 // Run the script and keep track of the current recursion depth. | 406 // Run the script and keep track of the current recursion depth. |
| 407 v8::Local<v8::Value> result; | 407 v8::MaybeLocal<v8::Value> result; |
| 408 { | 408 { |
| 409 if (ScriptForbiddenScope::isScriptForbidden()) | 409 if (ScriptForbiddenScope::isScriptForbidden()) |
| 410 return v8::Local<v8::Value>(); | 410 return v8::Local<v8::Value>(); |
| 411 V8RecursionScope recursionScope(isolate); | 411 V8RecursionScope recursionScope(isolate); |
| 412 result = script->Run(); | 412 result = script->Run(isolate->GetCurrentContext()); |
| 413 } | 413 } |
| 414 | 414 |
| 415 if (result.IsEmpty()) | |
| 416 return v8::Local<v8::Value>(); | |
| 417 | |
| 418 crashIfV8IsDead(); | 415 crashIfV8IsDead(); |
| 419 return result; | 416 return result; |
| 420 } | 417 } |
| 421 | 418 |
| 422 v8::Local<v8::Value> V8ScriptRunner::compileAndRunInternalScript(v8::Handle<v8::
String> source, v8::Isolate* isolate, const String& fileName, const TextPosition
& scriptStartPosition) | 419 v8::MaybeLocal<v8::Value> V8ScriptRunner::compileAndRunInternalScript(v8::Handle
<v8::String> source, v8::Isolate* isolate, const String& fileName, const TextPos
ition& scriptStartPosition) |
| 423 { | 420 { |
| 424 v8::Handle<v8::Script> script = V8ScriptRunner::compileScript(source, fileNa
me, String(), scriptStartPosition, isolate, nullptr, nullptr, nullptr, SharableC
rossOrigin, V8CacheOptionsDefault, true); | 421 v8::Local<v8::Script> script; |
| 425 if (script.IsEmpty()) | 422 if (!V8ScriptRunner::compileScript(source, fileName, String(), scriptStartPo
sition, isolate, nullptr, nullptr, nullptr, SharableCrossOrigin, V8CacheOptionsD
efault, true).ToLocal(&script)) |
| 426 return v8::Local<v8::Value>(); | 423 return v8::MaybeLocal<v8::Value>(); |
| 427 | 424 |
| 428 TRACE_EVENT0("v8", "v8.run"); | 425 TRACE_EVENT0("v8", "v8.run"); |
| 429 TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Execution"); | 426 TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Execution"); |
| 430 V8RecursionScope::MicrotaskSuppression recursionScope(isolate); | 427 V8RecursionScope::MicrotaskSuppression recursionScope(isolate); |
| 431 v8::Local<v8::Value> result = script->Run(); | 428 v8::MaybeLocal<v8::Value> result = script->Run(isolate->GetCurrentContext())
; |
| 432 crashIfV8IsDead(); | 429 crashIfV8IsDead(); |
| 433 return result; | 430 return result; |
| 434 } | 431 } |
| 435 | 432 |
| 436 v8::Local<v8::Value> V8ScriptRunner::runCompiledInternalScript(v8::Isolate* isol
ate, v8::Handle<v8::Script> script) | 433 v8::MaybeLocal<v8::Value> V8ScriptRunner::runCompiledInternalScript(v8::Isolate*
isolate, v8::Local<v8::Script> script) |
| 437 { | 434 { |
| 438 TRACE_EVENT0("v8", "v8.run"); | 435 TRACE_EVENT0("v8", "v8.run"); |
| 439 TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Execution"); | 436 TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Execution"); |
| 440 V8RecursionScope::MicrotaskSuppression recursionScope(isolate); | 437 V8RecursionScope::MicrotaskSuppression recursionScope(isolate); |
| 441 v8::Local<v8::Value> result = script->Run(); | 438 v8::MaybeLocal<v8::Value> result = script->Run(isolate->GetCurrentContext())
; |
| 442 crashIfV8IsDead(); | 439 crashIfV8IsDead(); |
| 443 return result; | 440 return result; |
| 444 } | 441 } |
| 445 | 442 |
| 446 v8::Local<v8::Value> V8ScriptRunner::callFunction(v8::Handle<v8::Function> funct
ion, ExecutionContext* context, v8::Handle<v8::Value> receiver, int argc, v8::Ha
ndle<v8::Value> args[], v8::Isolate* isolate) | 443 v8::Local<v8::Value> V8ScriptRunner::callFunction(v8::Handle<v8::Function> funct
ion, ExecutionContext* context, v8::Handle<v8::Value> receiver, int argc, v8::Ha
ndle<v8::Value> args[], v8::Isolate* isolate) |
| 447 { | 444 { |
| 448 TRACE_EVENT0("v8", "v8.callFunction"); | 445 TRACE_EVENT0("v8", "v8.callFunction"); |
| 449 TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Execution"); | 446 TRACE_EVENT_SCOPED_SAMPLING_STATE("v8", "V8Execution"); |
| 450 | 447 |
| 451 if (V8RecursionScope::recursionLevel(isolate) >= kMaxRecursionDepth) | 448 if (V8RecursionScope::recursionLevel(isolate) >= kMaxRecursionDepth) |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 { | 506 { |
| 510 return cacheTag(CacheTagParser, cacheHandler); | 507 return cacheTag(CacheTagParser, cacheHandler); |
| 511 } | 508 } |
| 512 | 509 |
| 513 unsigned V8ScriptRunner::tagForCodeCache(CachedMetadataHandler* cacheHandler) | 510 unsigned V8ScriptRunner::tagForCodeCache(CachedMetadataHandler* cacheHandler) |
| 514 { | 511 { |
| 515 return cacheTag(CacheTagCode, cacheHandler); | 512 return cacheTag(CacheTagCode, cacheHandler); |
| 516 } | 513 } |
| 517 | 514 |
| 518 } // namespace blink | 515 } // namespace blink |
| OLD | NEW |