Index: Source/bindings/core/v8/V8ScriptRunner.cpp |
diff --git a/Source/bindings/core/v8/V8ScriptRunner.cpp b/Source/bindings/core/v8/V8ScriptRunner.cpp |
index 3fea6fa726713b638b60812b545344e3fa949178..71a86becbd9539d4911793591189016ed0bade6c 100644 |
--- a/Source/bindings/core/v8/V8ScriptRunner.cpp |
+++ b/Source/bindings/core/v8/V8ScriptRunner.cpp |
@@ -37,7 +37,6 @@ |
#include "core/fetch/ScriptResource.h" |
#include "platform/ScriptForbiddenScope.h" |
#include "platform/TraceEvent.h" |
-#include "third_party/snappy/src/snappy.h" |
namespace blink { |
@@ -65,49 +64,29 @@ v8::Local<v8::Value> throwStackOverflowExceptionIfNeeded(v8::Isolate* isolate) |
return result; |
} |
-void writeToCache(ScriptResource* resource, unsigned cacheTag, Resource::MetadataCacheType cacheType, const v8::ScriptCompiler::CachedData* cachedData, bool compressed) |
-{ |
- const char* data = reinterpret_cast<const char*>(cachedData->data); |
- int length = cachedData->length; |
- std::string compressedOutput; |
- if (compressed) { |
- snappy::Compress(data, length, &compressedOutput); |
- data = compressedOutput.data(); |
- length = compressedOutput.length(); |
- } |
- resource->clearCachedMetadata(); |
- resource->setCachedMetadata( |
- cacheTag, |
- data, |
- length, |
- cacheType); |
-} |
- |
-v8::Local<v8::Script> compileAndProduceCache(v8::Isolate* isolate, v8::Handle<v8::String> code, v8::ScriptOrigin origin, ScriptResource* resource, v8::ScriptCompiler::CompileOptions options, unsigned cacheTag, Resource::MetadataCacheType cacheType, bool compressed) |
+v8::Local<v8::Script> compileAndProduceCache(v8::Isolate* isolate, v8::Handle<v8::String> code, v8::ScriptOrigin origin, ScriptResource* resource, v8::ScriptCompiler::CompileOptions options, unsigned cacheTag, Resource::MetadataCacheType cacheType) |
{ |
v8::ScriptCompiler::Source source(code, origin); |
v8::Local<v8::Script> script = v8::ScriptCompiler::Compile(isolate, &source, options); |
const v8::ScriptCompiler::CachedData* cachedData = source.GetCachedData(); |
- if (resource && cachedData) |
- writeToCache(resource, cacheTag, cacheType, cachedData, compressed); |
+ if (resource && cachedData) { |
+ resource->clearCachedMetadata(); |
+ resource->setCachedMetadata( |
+ cacheTag, |
+ reinterpret_cast<const char*>(cachedData->data), |
+ cachedData->length, |
+ cacheType); |
+ } |
return script; |
} |
-v8::Local<v8::Script> compileAndConsumeCache(v8::Isolate* isolate, v8::Handle<v8::String> code, v8::ScriptOrigin origin, ScriptResource* resource, v8::ScriptCompiler::CompileOptions options, unsigned cacheTag, bool compressed) |
+v8::Local<v8::Script> compileAndConsumeCache(v8::Isolate* isolate, v8::Handle<v8::String> code, v8::ScriptOrigin origin, ScriptResource* resource, v8::ScriptCompiler::CompileOptions options, unsigned cacheTag) |
{ |
// Consume existing cache data: |
CachedMetadata* cachedMetadata = resource->cachedMetadata(cacheTag); |
- const char* data = cachedMetadata->data(); |
- int length = cachedMetadata->size(); |
- std::string uncompressedOutput; |
- if (compressed) { |
- snappy::Uncompress(data, length, &uncompressedOutput); |
- data = uncompressedOutput.data(); |
- length = uncompressedOutput.length(); |
- } |
v8::ScriptCompiler::CachedData* cachedData = new v8::ScriptCompiler::CachedData( |
- reinterpret_cast<const uint8_t*>(data), |
- length, |
+ reinterpret_cast<const uint8_t*>(cachedMetadata->data()), |
+ cachedMetadata->size(), |
v8::ScriptCompiler::CachedData::BufferNotOwned); |
v8::ScriptCompiler::Source source(code, origin, cachedData); |
return v8::ScriptCompiler::Compile(isolate, &source, options); |
@@ -135,7 +114,6 @@ v8::Local<v8::Script> V8ScriptRunner::compileScript(v8::Handle<v8::String> code, |
v8::Local<v8::Script> script; |
unsigned cacheTag = 0; |
- bool compressed = cacheOptions == V8CacheOptionsCodeCompressed; |
if (streamer) { |
// We don't stream scripts which don't have a Resource. |
ASSERT(resource); |
@@ -148,38 +126,37 @@ v8::Local<v8::Script> V8ScriptRunner::compileScript(v8::Handle<v8::String> code, |
// streamer is started. Here we only need to get the data out. |
const v8::ScriptCompiler::CachedData* newCachedData = streamer->source()->GetCachedData(); |
if (newCachedData) { |
- // TODO(yangguo,vogelheim): code cache should use Resource::SendToPlatform. |
- writeToCache(resource, streamer->cachedDataType(), Resource::CacheLocally, newCachedData, compressed); |
+ resource->clearCachedMetadata(); |
+ resource->setCachedMetadata(streamer->cachedDataType(), reinterpret_cast<const char*>(newCachedData->data), newCachedData->length, Resource::CacheLocally); |
} |
} else if (!resource || !resource->url().protocolIsInHTTPFamily() || code->Length() < 1024) { |
v8::ScriptCompiler::Source source(code, origin); |
script = v8::ScriptCompiler::Compile(isolate, &source, v8::ScriptCompiler::kNoCompileOptions); |
} else { |
- Resource::MetadataCacheType cacheType = Resource::CacheLocally; |
- v8::ScriptCompiler::CompileOptions consumeOption = v8::ScriptCompiler::kConsumeParserCache; |
- v8::ScriptCompiler::CompileOptions produceOption = v8::ScriptCompiler::kProduceParserCache; |
switch (cacheOptions) { |
- case V8CacheOptionsOff: |
- // Use default. |
- cacheTag = tagForParserCache(); |
- break; |
case V8CacheOptionsParse: |
cacheTag = tagForParserCache(); |
- cacheType = Resource::SendToPlatform; |
- consumeOption = v8::ScriptCompiler::kConsumeParserCache; |
- produceOption = v8::ScriptCompiler::kProduceParserCache; |
+ script = resource->cachedMetadata(cacheTag) |
+ ? compileAndConsumeCache(isolate, code, origin, resource, v8::ScriptCompiler::kConsumeParserCache, cacheTag) |
+ : compileAndProduceCache(isolate, code, origin, resource, v8::ScriptCompiler::kProduceParserCache, cacheTag, Resource::SendToPlatform); |
break; |
- case V8CacheOptionsCodeCompressed: |
case V8CacheOptionsCode: |
cacheTag = tagForCodeCache(); |
- cacheType = Resource::SendToPlatform; |
- consumeOption = v8::ScriptCompiler::kConsumeCodeCache; |
- produceOption = v8::ScriptCompiler::kProduceCodeCache; |
+ script = resource->cachedMetadata(cacheTag) |
+ ? compileAndConsumeCache(isolate, code, origin, resource, v8::ScriptCompiler::kConsumeCodeCache, cacheTag) |
+ : compileAndProduceCache(isolate, code, origin, resource, v8::ScriptCompiler::kProduceCodeCache, cacheTag, Resource::SendToPlatform); |
+ break; |
+ case V8CacheOptionsOff: |
+ // Previous behaviour was to always generate an in-memory parser |
+ // cache. We emulate this here. |
+ // FIXME: Determine whether this should get its own setting, so we |
+ // can also have a true 'off'. |
+ cacheTag = tagForParserCache(); |
+ script = resource->cachedMetadata(cacheTag) |
+ ? compileAndConsumeCache(isolate, code, origin, resource, v8::ScriptCompiler::kConsumeParserCache, cacheTag) |
+ : compileAndProduceCache(isolate, code, origin, resource, v8::ScriptCompiler::kProduceParserCache, cacheTag, Resource::CacheLocally); |
break; |
} |
- script = resource->cachedMetadata(cacheTag) |
- ? compileAndConsumeCache(isolate, code, origin, resource, consumeOption, cacheTag, compressed) |
- : compileAndProduceCache(isolate, code, origin, resource, produceOption, cacheTag, cacheType, compressed); |
} |
return script; |
} |