Index: src/api.cc |
diff --git a/src/api.cc b/src/api.cc |
index e2f3fcdc1accb40deb37e567810729efc2452336..1a422fb73861a319e5d66a3c2603116767378f09 100644 |
--- a/src/api.cc |
+++ b/src/api.cc |
@@ -1438,55 +1438,95 @@ Local<ObjectTemplate> ObjectTemplate::New( |
// Ensure that the object template has a constructor. If no |
// constructor is available we create one. |
-static void EnsureConstructor(ObjectTemplate* object_template) { |
- if (Utils::OpenHandle(object_template)->constructor()->IsUndefined()) { |
- Local<FunctionTemplate> templ = FunctionTemplate::New(); |
- i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); |
- constructor->set_instance_template(*Utils::OpenHandle(object_template)); |
- Utils::OpenHandle(object_template)->set_constructor(*constructor); |
+static i::Handle<i::FunctionTemplateInfo> EnsureConstructor( |
+ ObjectTemplate* object_template) { |
+ i::Object* obj = Utils::OpenHandle(object_template)->constructor(); |
+ if (!obj ->IsUndefined()) { |
+ i::FunctionTemplateInfo* info = i::FunctionTemplateInfo::cast(obj); |
+ return i::Handle<i::FunctionTemplateInfo>(info, info->GetIsolate()); |
} |
+ Local<FunctionTemplate> templ = FunctionTemplate::New(); |
+ i::Handle<i::FunctionTemplateInfo> constructor = Utils::OpenHandle(*templ); |
+ constructor->set_instance_template(*Utils::OpenHandle(object_template)); |
+ Utils::OpenHandle(object_template)->set_constructor(*constructor); |
+ return constructor; |
} |
-static inline void AddPropertyToFunctionTemplate( |
- i::Handle<i::FunctionTemplateInfo> cons, |
+static inline void AddPropertyToTemplate( |
+ i::Handle<i::TemplateInfo> info, |
i::Handle<i::AccessorInfo> obj) { |
- i::Handle<i::Object> list(cons->property_accessors(), cons->GetIsolate()); |
+ i::Handle<i::Object> list(info->property_accessors(), info->GetIsolate()); |
if (list->IsUndefined()) { |
list = NeanderArray().value(); |
- cons->set_property_accessors(*list); |
+ info->set_property_accessors(*list); |
} |
NeanderArray array(list); |
array.add(obj); |
} |
-template<typename Setter, typename Getter, typename Data> |
-static bool ObjectTemplateSetAccessor( |
- ObjectTemplate* object_template, |
- v8::Handle<String> name, |
+static inline i::Handle<i::TemplateInfo> GetTemplateInfo( |
+ Template* template_obj) { |
+ return Utils::OpenHandle(template_obj); |
+} |
+ |
+ |
+// TODO(dcarney): remove this with ObjectTemplate::SetAccessor |
+static inline i::Handle<i::TemplateInfo> GetTemplateInfo( |
+ ObjectTemplate* object_template) { |
+ EnsureConstructor(object_template); |
+ return Utils::OpenHandle(object_template); |
+} |
+ |
+ |
+template<typename Setter, typename Getter, typename Data, typename Template> |
+static bool TemplateSetAccessor( |
+ Template* template_obj, |
+ v8::Local<String> name, |
Getter getter, |
Setter setter, |
Data data, |
AccessControl settings, |
PropertyAttribute attribute, |
- v8::Handle<AccessorSignature> signature) { |
- i::Isolate* isolate = Utils::OpenHandle(object_template)->GetIsolate(); |
+ v8::Local<AccessorSignature> signature) { |
+ i::Isolate* isolate = Utils::OpenHandle(template_obj)->GetIsolate(); |
if (IsDeadCheck(isolate, "v8::ObjectTemplate::SetAccessor()")) return false; |
ENTER_V8(isolate); |
i::HandleScope scope(isolate); |
- EnsureConstructor(object_template); |
- i::FunctionTemplateInfo* constructor = i::FunctionTemplateInfo::cast( |
- Utils::OpenHandle(object_template)->constructor()); |
- i::Handle<i::FunctionTemplateInfo> cons(constructor); |
i::Handle<i::AccessorInfo> obj = MakeAccessorInfo( |
name, getter, setter, data, settings, attribute, signature); |
if (obj.is_null()) return false; |
- AddPropertyToFunctionTemplate(cons, obj); |
+ i::Handle<i::TemplateInfo> info = GetTemplateInfo(template_obj); |
+ AddPropertyToTemplate(info, obj); |
return true; |
} |
+bool Template::SetDeclaredAccessor( |
+ Local<String> name, |
+ Local<DeclaredAccessorDescriptor> descriptor, |
+ PropertyAttribute attribute, |
+ Local<AccessorSignature> signature, |
+ AccessControl settings) { |
+ void* null = NULL; |
+ return TemplateSetAccessor( |
+ this, name, descriptor, null, null, settings, attribute, signature); |
+} |
+ |
+ |
+void Template::SetNativeDataProperty(v8::Local<String> name, |
+ AccessorGetterCallback getter, |
+ AccessorSetterCallback setter, |
+ v8::Handle<Value> data, |
+ PropertyAttribute attribute, |
+ v8::Local<AccessorSignature> signature, |
+ AccessControl settings) { |
+ TemplateSetAccessor( |
+ this, name, getter, setter, data, settings, attribute, signature); |
+} |
+ |
+ |
void ObjectTemplate::SetAccessor(v8::Handle<String> name, |
AccessorGetterCallback getter, |
AccessorSetterCallback setter, |
@@ -1494,22 +1534,11 @@ void ObjectTemplate::SetAccessor(v8::Handle<String> name, |
AccessControl settings, |
PropertyAttribute attribute, |
v8::Handle<AccessorSignature> signature) { |
- ObjectTemplateSetAccessor( |
+ TemplateSetAccessor( |
this, name, getter, setter, data, settings, attribute, signature); |
} |
-bool ObjectTemplate::SetAccessor(Handle<String> name, |
- Handle<DeclaredAccessorDescriptor> descriptor, |
- AccessControl settings, |
- PropertyAttribute attribute, |
- Handle<AccessorSignature> signature) { |
- void* null = NULL; |
- return ObjectTemplateSetAccessor( |
- this, name, descriptor, null, null, settings, attribute, signature); |
-} |
- |
- |
void ObjectTemplate::SetNamedPropertyHandler( |
NamedPropertyGetterCallback getter, |
NamedPropertySetterCallback setter, |
@@ -3638,10 +3667,10 @@ bool Object::SetAccessor(Handle<String> name, |
} |
-bool Object::SetAccessor(Handle<String> name, |
- Handle<DeclaredAccessorDescriptor> descriptor, |
- AccessControl settings, |
- PropertyAttribute attributes) { |
+bool Object::SetDeclaredAccessor(Local<String> name, |
+ Local<DeclaredAccessorDescriptor> descriptor, |
+ PropertyAttribute attributes, |
+ AccessControl settings) { |
void* null = NULL; |
return ObjectSetAccessor( |
this, name, descriptor, null, null, settings, attributes); |
@@ -5314,18 +5343,6 @@ const char* v8::V8::GetVersion() { |
} |
-static i::Handle<i::FunctionTemplateInfo> |
- EnsureConstructor(i::Handle<i::ObjectTemplateInfo> templ) { |
- if (templ->constructor()->IsUndefined()) { |
- Local<FunctionTemplate> constructor = FunctionTemplate::New(); |
- Utils::OpenHandle(*constructor)->set_instance_template(*templ); |
- templ->set_constructor(*Utils::OpenHandle(*constructor)); |
- } |
- return i::Handle<i::FunctionTemplateInfo>( |
- i::FunctionTemplateInfo::cast(templ->constructor())); |
-} |
- |
- |
static i::Handle<i::Context> CreateEnvironment( |
i::Isolate* isolate, |
v8::ExtensionConfiguration* extensions, |
@@ -5342,13 +5359,11 @@ static i::Handle<i::Context> CreateEnvironment( |
if (!global_template.IsEmpty()) { |
// Make sure that the global_template has a constructor. |
- global_constructor = |
- EnsureConstructor(Utils::OpenHandle(*global_template)); |
+ global_constructor = EnsureConstructor(*global_template); |
// Create a fresh template for the global proxy object. |
proxy_template = ObjectTemplate::New(); |
- proxy_constructor = |
- EnsureConstructor(Utils::OpenHandle(*proxy_template)); |
+ proxy_constructor = EnsureConstructor(*proxy_template); |
// Set the global template to be the prototype template of |
// global proxy template. |