diff options
author | Ben Noordhuis <info@bnoordhuis.nl> | 2014-03-31 14:38:28 +0200 |
---|---|---|
committer | Fedor Indutny <fedor@indutny.com> | 2014-04-02 00:05:24 +0400 |
commit | 67e078094b53861a5aa7e9354e33487d0bd4f73b (patch) | |
tree | 09a706adee1ddb59c1507ee3320de9cb6896135b /deps/v8/src/d8.cc | |
parent | f984555d47298cfb01b3e55c2861066379306fc3 (diff) | |
download | android-node-v8-67e078094b53861a5aa7e9354e33487d0bd4f73b.tar.gz android-node-v8-67e078094b53861a5aa7e9354e33487d0bd4f73b.tar.bz2 android-node-v8-67e078094b53861a5aa7e9354e33487d0bd4f73b.zip |
deps: upgrade v8 to 3.25.30
Diffstat (limited to 'deps/v8/src/d8.cc')
-rw-r--r-- | deps/v8/src/d8.cc | 82 |
1 files changed, 45 insertions, 37 deletions
diff --git a/deps/v8/src/d8.cc b/deps/v8/src/d8.cc index 76ff4f9431..7ac0c6546a 100644 --- a/deps/v8/src/d8.cc +++ b/deps/v8/src/d8.cc @@ -119,6 +119,8 @@ class PerIsolateData { Persistent<Context>* realms_; Persistent<Value> realm_shared_; + int RealmIndexOrThrow(const v8::FunctionCallbackInfo<v8::Value>& args, + int arg_offset); int RealmFind(Handle<Context> context); }; @@ -203,7 +205,10 @@ bool Shell::ExecuteString(Isolate* isolate, // When debugging make exceptions appear to be uncaught. try_catch.SetVerbose(true); } - Handle<Script> script = Script::New(source, name); + ScriptOrigin origin(name); + ScriptCompiler::Source script_source(source, origin); + Handle<UnboundScript> script = + ScriptCompiler::CompileUnbound(isolate, &script_source); if (script.IsEmpty()) { // Print errors that happened during compilation. if (report_exceptions && !FLAG_debugger) @@ -214,7 +219,7 @@ bool Shell::ExecuteString(Isolate* isolate, Local<Context> realm = Local<Context>::New(isolate, data->realms_[data->realm_current_]); realm->Enter(); - Handle<Value> result = script->Run(); + Handle<Value> result = script->BindToCurrentContext()->Run(); realm->Exit(); data->realm_current_ = data->realm_switch_; if (result.IsEmpty()) { @@ -288,6 +293,24 @@ int PerIsolateData::RealmFind(Handle<Context> context) { } +int PerIsolateData::RealmIndexOrThrow( + const v8::FunctionCallbackInfo<v8::Value>& args, + int arg_offset) { + if (args.Length() < arg_offset || !args[arg_offset]->IsNumber()) { + Throw(args.GetIsolate(), "Invalid argument"); + return -1; + } + int index = args[arg_offset]->Int32Value(); + if (index < 0 || + index >= realm_count_ || + realms_[index].IsEmpty()) { + Throw(args.GetIsolate(), "Invalid realm index"); + return -1; + } + return index; +} + + #ifndef V8_SHARED // performance.now() returns a time stamp as double, measured in milliseconds. void Shell::PerformanceNow(const v8::FunctionCallbackInfo<v8::Value>& args) { @@ -325,15 +348,8 @@ void Shell::RealmOwner(const v8::FunctionCallbackInfo<v8::Value>& args) { // (Note that properties of global objects cannot be read/written cross-realm.) void Shell::RealmGlobal(const v8::FunctionCallbackInfo<v8::Value>& args) { PerIsolateData* data = PerIsolateData::Get(args.GetIsolate()); - if (args.Length() < 1 || !args[0]->IsNumber()) { - Throw(args.GetIsolate(), "Invalid argument"); - return; - } - int index = args[0]->Uint32Value(); - if (index >= data->realm_count_ || data->realms_[index].IsEmpty()) { - Throw(args.GetIsolate(), "Invalid realm index"); - return; - } + int index = data->RealmIndexOrThrow(args, 0); + if (index == -1) return; args.GetReturnValue().Set( Local<Context>::New(args.GetIsolate(), data->realms_[index])->Global()); } @@ -361,13 +377,9 @@ void Shell::RealmCreate(const v8::FunctionCallbackInfo<v8::Value>& args) { void Shell::RealmDispose(const v8::FunctionCallbackInfo<v8::Value>& args) { Isolate* isolate = args.GetIsolate(); PerIsolateData* data = PerIsolateData::Get(isolate); - if (args.Length() < 1 || !args[0]->IsNumber()) { - Throw(args.GetIsolate(), "Invalid argument"); - return; - } - int index = args[0]->Uint32Value(); - if (index >= data->realm_count_ || data->realms_[index].IsEmpty() || - index == 0 || + int index = data->RealmIndexOrThrow(args, 0); + if (index == -1) return; + if (index == 0 || index == data->realm_current_ || index == data->realm_switch_) { Throw(args.GetIsolate(), "Invalid realm index"); return; @@ -380,15 +392,8 @@ void Shell::RealmDispose(const v8::FunctionCallbackInfo<v8::Value>& args) { void Shell::RealmSwitch(const v8::FunctionCallbackInfo<v8::Value>& args) { Isolate* isolate = args.GetIsolate(); PerIsolateData* data = PerIsolateData::Get(isolate); - if (args.Length() < 1 || !args[0]->IsNumber()) { - Throw(args.GetIsolate(), "Invalid argument"); - return; - } - int index = args[0]->Uint32Value(); - if (index >= data->realm_count_ || data->realms_[index].IsEmpty()) { - Throw(args.GetIsolate(), "Invalid realm index"); - return; - } + int index = data->RealmIndexOrThrow(args, 0); + if (index == -1) return; data->realm_switch_ = index; } @@ -397,20 +402,19 @@ void Shell::RealmSwitch(const v8::FunctionCallbackInfo<v8::Value>& args) { void Shell::RealmEval(const v8::FunctionCallbackInfo<v8::Value>& args) { Isolate* isolate = args.GetIsolate(); PerIsolateData* data = PerIsolateData::Get(isolate); - if (args.Length() < 2 || !args[0]->IsNumber() || !args[1]->IsString()) { + int index = data->RealmIndexOrThrow(args, 0); + if (index == -1) return; + if (args.Length() < 2 || !args[1]->IsString()) { Throw(args.GetIsolate(), "Invalid argument"); return; } - int index = args[0]->Uint32Value(); - if (index >= data->realm_count_ || data->realms_[index].IsEmpty()) { - Throw(args.GetIsolate(), "Invalid realm index"); - return; - } - Handle<Script> script = Script::New(args[1]->ToString()); + ScriptCompiler::Source script_source(args[1]->ToString()); + Handle<UnboundScript> script = ScriptCompiler::CompileUnbound( + isolate, &script_source); if (script.IsEmpty()) return; Local<Context> realm = Local<Context>::New(isolate, data->realms_[index]); realm->Enter(); - Handle<Value> result = script->Run(); + Handle<Value> result = script->BindToCurrentContext()->Run(); realm->Exit(); args.GetReturnValue().Set(result); } @@ -807,7 +811,8 @@ void Shell::InstallUtilityScript(Isolate* isolate) { Handle<String> name = String::NewFromUtf8(isolate, shell_source_name.start(), String::kNormalString, shell_source_name.length()); - Handle<Script> script = Script::Compile(source, name); + ScriptOrigin origin(name); + Handle<Script> script = Script::Compile(source, &origin); script->Run(); // Mark the d8 shell script as native to avoid it showing up as normal source // in the debugger. @@ -1435,6 +1440,9 @@ bool Shell::SetOptions(int argc, char* argv[]) { } else if (strcmp(argv[i], "--throws") == 0) { options.expected_to_throw = true; argv[i] = NULL; + } else if (strncmp(argv[i], "--icu-data-file=", 16) == 0) { + options.icu_data_file = argv[i] + 16; + argv[i] = NULL; } #ifdef V8_SHARED else if (strcmp(argv[i], "--dump-counters") == 0) { @@ -1669,7 +1677,7 @@ class MockArrayBufferAllocator : public v8::ArrayBuffer::Allocator { int Shell::Main(int argc, char* argv[]) { if (!SetOptions(argc, argv)) return 1; - v8::V8::InitializeICU(); + v8::V8::InitializeICU(options.icu_data_file); #ifndef V8_SHARED i::FLAG_trace_hydrogen_file = "hydrogen.cfg"; i::FLAG_redirect_code_traces_to = "code.asm"; |