diff options
Diffstat (limited to 'deps/v8/src/d8.cc')
-rw-r--r-- | deps/v8/src/d8.cc | 97 |
1 files changed, 71 insertions, 26 deletions
diff --git a/deps/v8/src/d8.cc b/deps/v8/src/d8.cc index d1929b071f..fb24bcce58 100644 --- a/deps/v8/src/d8.cc +++ b/deps/v8/src/d8.cc @@ -177,33 +177,77 @@ const char* Shell::ToCString(const v8::String::Utf8Value& value) { } +ScriptCompiler::CachedData* CompileForCachedData( + Local<String> source, Local<Value> name, + ScriptCompiler::CompileOptions compile_options) { + int source_length = source->Length(); + uint16_t* source_buffer = new uint16_t[source_length]; + source->Write(source_buffer, 0, source_length); + int name_length = 0; + uint16_t* name_buffer = NULL; + if (name->IsString()) { + Local<String> name_string = Local<String>::Cast(name); + name_length = name_string->Length(); + name_buffer = new uint16_t[name_length]; + name_string->Write(name_buffer, 0, name_length); + } + Isolate* temp_isolate = Isolate::New(); + ScriptCompiler::CachedData* result = NULL; + { + Isolate::Scope isolate_scope(temp_isolate); + HandleScope handle_scope(temp_isolate); + Context::Scope context_scope(Context::New(temp_isolate)); + Local<String> source_copy = v8::String::NewFromTwoByte( + temp_isolate, source_buffer, v8::String::kNormalString, source_length); + Local<Value> name_copy; + if (name_buffer) { + name_copy = v8::String::NewFromTwoByte( + temp_isolate, name_buffer, v8::String::kNormalString, name_length); + } else { + name_copy = v8::Undefined(temp_isolate); + } + ScriptCompiler::Source script_source(source_copy, ScriptOrigin(name_copy)); + ScriptCompiler::CompileUnbound(temp_isolate, &script_source, + compile_options); + if (script_source.GetCachedData()) { + int length = script_source.GetCachedData()->length; + uint8_t* cache = new uint8_t[length]; + memcpy(cache, script_source.GetCachedData()->data, length); + result = new ScriptCompiler::CachedData( + cache, length, ScriptCompiler::CachedData::BufferOwned); + } + } + temp_isolate->Dispose(); + delete[] source_buffer; + delete[] name_buffer; + return result; +} + + // Compile a string within the current v8 context. Local<UnboundScript> Shell::CompileString( Isolate* isolate, Local<String> source, Local<Value> name, - v8::ScriptCompiler::CompileOptions compile_options) { + ScriptCompiler::CompileOptions compile_options) { ScriptOrigin origin(name); - ScriptCompiler::Source script_source(source, origin); - Local<UnboundScript> script = - ScriptCompiler::CompileUnbound(isolate, &script_source, compile_options); - - // Was caching requested & successful? Then compile again, now with cache. - if (script_source.GetCachedData()) { - if (compile_options == ScriptCompiler::kProduceCodeCache) { - compile_options = ScriptCompiler::kConsumeCodeCache; - } else if (compile_options == ScriptCompiler::kProduceParserCache) { - compile_options = ScriptCompiler::kConsumeParserCache; - } else { - DCHECK(false); // A new compile option? - } - ScriptCompiler::Source cached_source( - source, origin, new v8::ScriptCompiler::CachedData( - script_source.GetCachedData()->data, - script_source.GetCachedData()->length, - v8::ScriptCompiler::CachedData::BufferNotOwned)); - script = ScriptCompiler::CompileUnbound(isolate, &cached_source, - compile_options); + if (compile_options == ScriptCompiler::kNoCompileOptions) { + ScriptCompiler::Source script_source(source, origin); + return ScriptCompiler::CompileUnbound(isolate, &script_source, + compile_options); + } + + ScriptCompiler::CachedData* data = + CompileForCachedData(source, name, compile_options); + ScriptCompiler::Source cached_source(source, origin, data); + if (compile_options == ScriptCompiler::kProduceCodeCache) { + compile_options = ScriptCompiler::kConsumeCodeCache; + } else if (compile_options == ScriptCompiler::kProduceParserCache) { + compile_options = ScriptCompiler::kConsumeParserCache; + } else { + DCHECK(false); // A new compile option? } - return script; + if (data == NULL) compile_options = ScriptCompiler::kNoCompileOptions; + return ScriptCompiler::CompileUnbound(isolate, &cached_source, + compile_options); } @@ -366,7 +410,7 @@ void Shell::RealmOwner(const v8::FunctionCallbackInfo<v8::Value>& args) { Throw(args.GetIsolate(), "Invalid argument"); return; } - int index = data->RealmFind(args[0]->ToObject()->CreationContext()); + int index = data->RealmFind(args[0]->ToObject(isolate)->CreationContext()); if (index == -1) return; args.GetReturnValue().Set(index); } @@ -436,7 +480,7 @@ void Shell::RealmEval(const v8::FunctionCallbackInfo<v8::Value>& args) { Throw(args.GetIsolate(), "Invalid argument"); return; } - ScriptCompiler::Source script_source(args[1]->ToString()); + ScriptCompiler::Source script_source(args[1]->ToString(isolate)); Handle<UnboundScript> script = ScriptCompiler::CompileUnbound( isolate, &script_source); if (script.IsEmpty()) return; @@ -482,7 +526,7 @@ void Shell::Write(const v8::FunctionCallbackInfo<v8::Value>& args) { // Explicitly catch potential exceptions in toString(). v8::TryCatch try_catch; - Handle<String> str_obj = args[i]->ToString(); + Handle<String> str_obj = args[i]->ToString(args.GetIsolate()); if (try_catch.HasCaught()) { try_catch.ReThrow(); return; @@ -1625,6 +1669,7 @@ int Shell::Main(int argc, char* argv[]) { StartupDataHandler startup_data(options.natives_blob, options.snapshot_blob); #endif SetFlagsFromString("--trace-hydrogen-file=hydrogen.cfg"); + SetFlagsFromString("--trace-turbo-cfg-file=turbo.cfg"); SetFlagsFromString("--redirect-code-traces-to=code.asm"); ShellArrayBufferAllocator array_buffer_allocator; MockArrayBufferAllocator mock_arraybuffer_allocator; @@ -1641,7 +1686,7 @@ int Shell::Main(int argc, char* argv[]) { } #endif #ifdef ENABLE_VTUNE_JIT_INTERFACE - vTune::InitializeVtuneForV8(create_params); + create_params.code_event_handler = vTune::GetVtuneCodeEventHandler(); #endif #ifndef V8_SHARED create_params.constraints.ConfigureDefaults( |