| Index: src/d8.cc
|
| diff --git a/src/d8.cc b/src/d8.cc
|
| index a36ec5e527237a2c36350f226c67afdcecff6ce5..fb24bcce585c802450a500b8b5000c5aa445058b 100644
|
| --- a/src/d8.cc
|
| +++ b/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;
|
| @@ -1642,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(
|
|
|