| Index: src/api.cc
|
| diff --git a/src/api.cc b/src/api.cc
|
| index 987032324d415c25411631a9af59b1b991a3010d..18da41b7f1691738d9b604028f9efa7d188a637f 100644
|
| --- a/src/api.cc
|
| +++ b/src/api.cc
|
| @@ -797,10 +797,19 @@ Local<ObjectTemplate> FunctionTemplate::PrototypeTemplate() {
|
| }
|
|
|
|
|
| +static void EnsureNotInstantiated(i::Handle<i::FunctionTemplateInfo> info,
|
| + const char* func) {
|
| + Utils::ApiCheck(!info->instantiated(), func,
|
| + "FunctionTemplate already instantiated");
|
| +}
|
| +
|
| +
|
| void FunctionTemplate::Inherit(v8::Handle<FunctionTemplate> value) {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| + auto info = Utils::OpenHandle(this);
|
| + EnsureNotInstantiated(info, "v8::FunctionTemplate::Inherit");
|
| + i::Isolate* isolate = info->GetIsolate();
|
| ENTER_V8(isolate);
|
| - Utils::OpenHandle(this)->set_parent_template(*Utils::OpenHandle(*value));
|
| + info->set_parent_template(*Utils::OpenHandle(*value));
|
| }
|
|
|
|
|
| @@ -910,7 +919,9 @@ int TypeSwitch::match(v8::Handle<Value> value) {
|
|
|
| void FunctionTemplate::SetCallHandler(FunctionCallback callback,
|
| v8::Handle<Value> data) {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| + auto info = Utils::OpenHandle(this);
|
| + EnsureNotInstantiated(info, "v8::FunctionTemplate::SetCallHandler");
|
| + i::Isolate* isolate = info->GetIsolate();
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| i::Handle<i::Struct> struct_obj =
|
| @@ -922,7 +933,7 @@ void FunctionTemplate::SetCallHandler(FunctionCallback callback,
|
| data = v8::Undefined(reinterpret_cast<v8::Isolate*>(isolate));
|
| }
|
| obj->set_data(*Utils::OpenHandle(*data));
|
| - Utils::OpenHandle(this)->set_call_code(*obj);
|
| + info->set_call_code(*obj);
|
| }
|
|
|
|
|
| @@ -986,37 +997,47 @@ Local<ObjectTemplate> FunctionTemplate::InstanceTemplate() {
|
|
|
|
|
| void FunctionTemplate::SetLength(int length) {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| + auto info = Utils::OpenHandle(this);
|
| + EnsureNotInstantiated(info, "v8::FunctionTemplate::SetLength");
|
| + auto isolate = info->GetIsolate();
|
| ENTER_V8(isolate);
|
| - Utils::OpenHandle(this)->set_length(length);
|
| + info->set_length(length);
|
| }
|
|
|
|
|
| void FunctionTemplate::SetClassName(Handle<String> name) {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| + auto info = Utils::OpenHandle(this);
|
| + EnsureNotInstantiated(info, "v8::FunctionTemplate::SetClassName");
|
| + auto isolate = info->GetIsolate();
|
| ENTER_V8(isolate);
|
| - Utils::OpenHandle(this)->set_class_name(*Utils::OpenHandle(*name));
|
| + info->set_class_name(*Utils::OpenHandle(*name));
|
| }
|
|
|
|
|
| void FunctionTemplate::SetHiddenPrototype(bool value) {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| + auto info = Utils::OpenHandle(this);
|
| + EnsureNotInstantiated(info, "v8::FunctionTemplate::SetHiddenPrototype");
|
| + auto isolate = info->GetIsolate();
|
| ENTER_V8(isolate);
|
| - Utils::OpenHandle(this)->set_hidden_prototype(value);
|
| + info->set_hidden_prototype(value);
|
| }
|
|
|
|
|
| void FunctionTemplate::ReadOnlyPrototype() {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| + auto info = Utils::OpenHandle(this);
|
| + EnsureNotInstantiated(info, "v8::FunctionTemplate::ReadOnlyPrototype");
|
| + auto isolate = info->GetIsolate();
|
| ENTER_V8(isolate);
|
| - Utils::OpenHandle(this)->set_read_only_prototype(true);
|
| + info->set_read_only_prototype(true);
|
| }
|
|
|
|
|
| void FunctionTemplate::RemovePrototype() {
|
| - i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| + auto info = Utils::OpenHandle(this);
|
| + EnsureNotInstantiated(info, "v8::FunctionTemplate::RemovePrototype");
|
| + auto isolate = info->GetIsolate();
|
| ENTER_V8(isolate);
|
| - Utils::OpenHandle(this)->set_remove_prototype(true);
|
| + info->set_remove_prototype(true);
|
| }
|
|
|
|
|
| @@ -1183,10 +1204,8 @@ static void ObjectTemplateSetNamedPropertyHandler(ObjectTemplate* templ,
|
| i::Isolate* isolate = Utils::OpenHandle(templ)->GetIsolate();
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| - EnsureConstructor(isolate, templ);
|
| - i::FunctionTemplateInfo* constructor =
|
| - i::FunctionTemplateInfo::cast(Utils::OpenHandle(templ)->constructor());
|
| - i::Handle<i::FunctionTemplateInfo> cons(constructor);
|
| + auto cons = EnsureConstructor(isolate, templ);
|
| + EnsureNotInstantiated(cons, "ObjectTemplateSetNamedPropertyHandler");
|
| i::Handle<i::Struct> struct_obj =
|
| isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE);
|
| i::Handle<i::InterceptorInfo> obj =
|
| @@ -1229,10 +1248,8 @@ void ObjectTemplate::MarkAsUndetectable() {
|
| i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| - EnsureConstructor(isolate, this);
|
| - i::FunctionTemplateInfo* constructor =
|
| - i::FunctionTemplateInfo::cast(Utils::OpenHandle(this)->constructor());
|
| - i::Handle<i::FunctionTemplateInfo> cons(constructor);
|
| + auto cons = EnsureConstructor(isolate, this);
|
| + EnsureNotInstantiated(cons, "v8::ObjectTemplate::MarkAsUndetectable");
|
| cons->set_undetectable(true);
|
| }
|
|
|
| @@ -1245,7 +1262,8 @@ void ObjectTemplate::SetAccessCheckCallbacks(
|
| i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| - EnsureConstructor(isolate, this);
|
| + auto cons = EnsureConstructor(isolate, this);
|
| + EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetAccessCheckCallbacks");
|
|
|
| i::Handle<i::Struct> struct_info =
|
| isolate->factory()->NewStruct(i::ACCESS_CHECK_INFO_TYPE);
|
| @@ -1260,9 +1278,6 @@ void ObjectTemplate::SetAccessCheckCallbacks(
|
| }
|
| info->set_data(*Utils::OpenHandle(*data));
|
|
|
| - i::FunctionTemplateInfo* constructor =
|
| - i::FunctionTemplateInfo::cast(Utils::OpenHandle(this)->constructor());
|
| - i::Handle<i::FunctionTemplateInfo> cons(constructor);
|
| cons->set_access_check_info(*info);
|
| cons->set_needs_access_check(turned_on_by_default);
|
| }
|
| @@ -1273,10 +1288,8 @@ void ObjectTemplate::SetHandler(
|
| i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| - EnsureConstructor(isolate, this);
|
| - i::FunctionTemplateInfo* constructor = i::FunctionTemplateInfo::cast(
|
| - Utils::OpenHandle(this)->constructor());
|
| - i::Handle<i::FunctionTemplateInfo> cons(constructor);
|
| + auto cons = EnsureConstructor(isolate, this);
|
| + EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetHandler");
|
| i::Handle<i::Struct> struct_obj =
|
| isolate->factory()->NewStruct(i::INTERCEPTOR_INFO_TYPE);
|
| i::Handle<i::InterceptorInfo> obj =
|
| @@ -1305,10 +1318,8 @@ void ObjectTemplate::SetCallAsFunctionHandler(FunctionCallback callback,
|
| i::Isolate* isolate = Utils::OpenHandle(this)->GetIsolate();
|
| ENTER_V8(isolate);
|
| i::HandleScope scope(isolate);
|
| - EnsureConstructor(isolate, this);
|
| - i::FunctionTemplateInfo* constructor = i::FunctionTemplateInfo::cast(
|
| - Utils::OpenHandle(this)->constructor());
|
| - i::Handle<i::FunctionTemplateInfo> cons(constructor);
|
| + auto cons = EnsureConstructor(isolate, this);
|
| + EnsureNotInstantiated(cons, "v8::ObjectTemplate::SetCallAsFunctionHandler");
|
| i::Handle<i::Struct> struct_obj =
|
| isolate->factory()->NewStruct(i::CALL_HANDLER_INFO_TYPE);
|
| i::Handle<i::CallHandlerInfo> obj =
|
|
|