| Index: src/d8.cc
|
| diff --git a/src/d8.cc b/src/d8.cc
|
| index 564aafe0050263b5128c1693ac9a0845bd2fab1e..76ff4f94318890a4cd3b23b3b42208fec4c3d409 100644
|
| --- a/src/d8.cc
|
| +++ b/src/d8.cc
|
| @@ -119,8 +119,6 @@ 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);
|
| };
|
|
|
| @@ -290,24 +288,6 @@ 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) {
|
| @@ -345,8 +325,15 @@ 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());
|
| - int index = data->RealmIndexOrThrow(args, 0);
|
| - if (index == -1) return;
|
| + 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;
|
| + }
|
| args.GetReturnValue().Set(
|
| Local<Context>::New(args.GetIsolate(), data->realms_[index])->Global());
|
| }
|
| @@ -374,9 +361,13 @@ 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);
|
| - int index = data->RealmIndexOrThrow(args, 0);
|
| - if (index == -1) return;
|
| - if (index == 0 ||
|
| + 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 ||
|
| index == data->realm_current_ || index == data->realm_switch_) {
|
| Throw(args.GetIsolate(), "Invalid realm index");
|
| return;
|
| @@ -389,8 +380,15 @@ 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);
|
| - int index = data->RealmIndexOrThrow(args, 0);
|
| - if (index == -1) return;
|
| + 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;
|
| + }
|
| data->realm_switch_ = index;
|
| }
|
|
|
| @@ -399,12 +397,15 @@ 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);
|
| - int index = data->RealmIndexOrThrow(args, 0);
|
| - if (index == -1) return;
|
| - if (args.Length() < 2 || !args[1]->IsString()) {
|
| + if (args.Length() < 2 || !args[0]->IsNumber() || !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());
|
| if (script.IsEmpty()) return;
|
| Local<Context> realm = Local<Context>::New(isolate, data->realms_[index]);
|
|
|