Chromium Code Reviews| Index: Source/bindings/scripts/CodeGeneratorV8.pm |
| diff --git a/Source/bindings/scripts/CodeGeneratorV8.pm b/Source/bindings/scripts/CodeGeneratorV8.pm |
| index 0e3b0fc2686f449437091aa2f483aadd82eeb1ae..a588f03214b0bf6fe384a52b2098d77b51a9e545 100644 |
| --- a/Source/bindings/scripts/CodeGeneratorV8.pm |
| +++ b/Source/bindings/scripts/CodeGeneratorV8.pm |
| @@ -491,7 +491,7 @@ sub GenerateOpaqueRootForGC |
| my $code = <<END; |
| void* ${v8ClassName}::opaqueRootForGC(void* object, v8::Isolate* isolate) |
| { |
| - ${implClassName}* impl = static_cast<${implClassName}*>(object); |
| + ${implClassName}* impl = fromWrappedType(object); |
| END |
| my $isReachableMethod = $interface->extendedAttributes->{"GenerateIsReachable"}; |
| if ($isReachableMethod) { |
| @@ -669,7 +669,7 @@ END |
| static v8::Handle<v8::FunctionTemplate> GetTemplate(v8::Isolate*, WrapperWorldType); |
| static ${nativeType}* toNative(v8::Handle<v8::Object> object) |
| { |
| - return reinterpret_cast<${nativeType}*>(object->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex)); |
| + return fromWrappedType(object->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex)); |
| } |
| static void derefObject(void*); |
| static WrapperTypeInfo info; |
| @@ -748,6 +748,32 @@ END |
| GenerateHeaderLegacyCall($interface); |
| GenerateHeaderCustomInternalFieldIndices($interface); |
| + $header{classPublic}->add(<<END); |
| + static inline void* toWrappedType(${nativeType}* impl) |
| + { |
| +END |
| + if ($interface->parent) { |
| + my $v8ParentClassName = "V8" . $interface->parent; |
| + $header{classPublic}->add(" return ${v8ParentClassName}::toWrappedType(impl);\n"); |
|
arv (Not doing code reviews)
2013/07/08 15:51:46
How about storing the return expression in a varia
|
| + } else { |
| + $header{classPublic}->add(" return impl;\n"); |
| + } |
| + $header{classPublic}->add(<<END); |
| + } |
| + |
| + static inline ${nativeType}* fromWrappedType(void* object) |
| + { |
| +END |
| + if ($interface->parent) { |
| + my $v8ParentClassName = "V8" . $interface->parent; |
| + $header{classPublic}->add(" return static_cast<${nativeType}*>(${v8ParentClassName}::fromWrappedType(object));\n"); |
|
arv (Not doing code reviews)
2013/07/08 15:51:46
same here, extract the argument to a variable.
|
| + } else { |
| + $header{classPublic}->add(" return static_cast<${nativeType}*>(object);\n"); |
| + } |
| + $header{classPublic}->add(<<END); |
| + } |
| +END |
| + |
| if ($interface->name eq "Window") { |
| $header{classPublic}->add(<<END); |
| static bool namedSecurityCheckCustom(v8::Local<v8::Object> host, v8::Local<v8::Value> key, v8::AccessType, v8::Local<v8::Value> data); |
| @@ -854,7 +880,7 @@ END |
| inline v8::Handle<v8::Object> wrap(${nativeType}* impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) |
| { |
| ASSERT(impl); |
| - ASSERT(DOMDataStore::getWrapper(impl, isolate).IsEmpty()); |
| + ASSERT(DOMDataStore::getWrapper<${v8ClassName}>(impl, isolate).IsEmpty()); |
| if (ScriptWrappable::wrapperCanBeStoredInObject(impl)) { |
| const WrapperTypeInfo* actualInfo = ScriptWrappable::getTypeInfoFromObject(impl); |
| // Might be a XXXConstructor::info instead of an XXX::info. These will both have |
| @@ -872,7 +898,7 @@ inline v8::Handle<v8::Value> toV8(${nativeType}* impl, v8::Handle<v8::Object> cr |
| { |
| if (UNLIKELY(!impl)) |
| return v8NullWithCheck(isolate); |
| - v8::Handle<v8::Value> wrapper = DOMDataStore::getWrapper(impl, isolate); |
| + v8::Handle<v8::Value> wrapper = DOMDataStore::getWrapper<${v8ClassName}>(impl, isolate); |
| if (!wrapper.IsEmpty()) |
| return wrapper; |
| return wrap(impl, creationContext, isolate); |
| @@ -883,7 +909,7 @@ inline v8::Handle<v8::Value> toV8ForMainWorld(${nativeType}* impl, v8::Handle<v8 |
| ASSERT(worldType(isolate) == MainWorld); |
| if (UNLIKELY(!impl)) |
| return v8NullWithCheck(isolate); |
| - v8::Handle<v8::Value> wrapper = DOMDataStore::getWrapperForMainWorld(impl); |
| + v8::Handle<v8::Value> wrapper = DOMDataStore::getWrapperForMainWorld<${v8ClassName}>(impl); |
| if (!wrapper.IsEmpty()) |
| return wrapper; |
| return wrap(impl, creationContext, isolate); |
| @@ -894,7 +920,7 @@ inline v8::Handle<v8::Value> toV8Fast(${nativeType}* impl, const HolderContainer |
| { |
| if (UNLIKELY(!impl)) |
| return v8::Null(container.GetIsolate()); |
| - v8::Handle<v8::Object> wrapper = DOMDataStore::getWrapperFast(impl, container, wrappable); |
| + v8::Handle<v8::Object> wrapper = DOMDataStore::getWrapperFast<${v8ClassName}>(impl, container, wrappable); |
| if (!wrapper.IsEmpty()) |
| return wrapper; |
| return wrap(impl, container.Holder(), container.GetIsolate()); |
| @@ -906,7 +932,7 @@ inline v8::Handle<v8::Value> toV8FastForMainWorld(${nativeType}* impl, const Hol |
| ASSERT(worldType(container.GetIsolate()) == MainWorld); |
| if (UNLIKELY(!impl)) |
| return v8::Null(container.GetIsolate()); |
| - v8::Handle<v8::Object> wrapper = DOMDataStore::getWrapperForMainWorld(impl); |
| + v8::Handle<v8::Object> wrapper = DOMDataStore::getWrapperForMainWorld<${v8ClassName}>(impl); |
| if (!wrapper.IsEmpty()) |
| return wrapper; |
| return wrap(impl, container.Holder(), container.GetIsolate()); |
| @@ -1514,11 +1540,12 @@ END |
| # Check for a wrapper in the wrapper cache. If there is one, we know that a hidden reference has already |
| # been created. If we don't find a wrapper, we create both a wrapper and a hidden reference. |
| my $nativeReturnType = GetNativeType($returnType); |
| + my $v8ReturnType = "V8" . $returnType; |
| $code .= " $nativeReturnType result = ${getterString};\n"; |
| if ($forMainWorldSuffix) { |
| - $code .= " v8::Handle<v8::Value> wrapper = result.get() ? v8::Handle<v8::Value>(DOMDataStore::getWrapper${forMainWorldSuffix}(result.get())) : v8Undefined();\n"; |
| + $code .= " v8::Handle<v8::Value> wrapper = result.get() ? v8::Handle<v8::Value>(DOMDataStore::getWrapper${forMainWorldSuffix}<${v8ReturnType}>(result.get())) : v8Undefined();\n"; |
| } else { |
| - $code .= " v8::Handle<v8::Value> wrapper = result.get() ? v8::Handle<v8::Value>(DOMDataStore::getWrapper(result.get(), info.GetIsolate())) : v8Undefined();\n"; |
| + $code .= " v8::Handle<v8::Value> wrapper = result.get() ? v8::Handle<v8::Value>(DOMDataStore::getWrapper<${v8ReturnType}>(result.get(), info.GetIsolate())) : v8Undefined();\n"; |
| } |
| $code .= " if (wrapper.IsEmpty()) {\n"; |
| $code .= " wrapper = toV8(result.get(), info.Holder(), info.GetIsolate());\n"; # FIXME: Could use wrap here since the wrapper is empty. |
| @@ -2569,7 +2596,7 @@ END |
| $code .= <<END; |
| - V8DOMWrapper::associateObjectWithWrapper(impl.release(), &${v8ClassName}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent); |
| + V8DOMWrapper::associateObjectWithWrapper<${v8ClassName}>(impl.release(), &${v8ClassName}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent); |
| args.GetReturnValue().Set(wrapper); |
| } |
| @@ -2663,7 +2690,7 @@ static void constructor(const v8::FunctionCallbackInfo<v8::Value>& args) |
| RefPtr<${implClassName}> event = ${implClassName}::create(type, eventInit); |
| v8::Handle<v8::Object> wrapper = args.Holder(); |
| - V8DOMWrapper::associateObjectWithWrapper(event.release(), &${v8ClassName}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent); |
| + V8DOMWrapper::associateObjectWithWrapper<${v8ClassName}>(event.release(), &${v8ClassName}::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent); |
| args.GetReturnValue().Set(wrapper); |
| } |
| END |
| @@ -2818,7 +2845,7 @@ END |
| $code .= <<END; |
| - V8DOMWrapper::associateObjectWithWrapper(impl.release(), &${v8ClassName}Constructor::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent); |
| + V8DOMWrapper::associateObjectWithWrapper<${v8ClassName}>(impl.release(), &${v8ClassName}Constructor::info, wrapper, args.GetIsolate(), WrapperConfiguration::Dependent); |
| args.GetReturnValue().Set(wrapper); |
| } |
| @@ -4481,7 +4508,7 @@ END |
| $implementation{nameSpaceWebCore}->add(<<END); |
| void ${v8ClassName}::derefObject(void* object) |
| { |
| - static_cast<${nativeType}*>(object)->deref(); |
| + fromWrappedType(object)->deref(); |
| } |
| END |
| @@ -4727,11 +4754,10 @@ sub GenerateToV8Converters |
| v8::Handle<v8::Object> ${v8ClassName}::createWrapper(${createWrapperArgumentType} impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) |
| { |
| ASSERT(impl.get()); |
| - ASSERT(DOMDataStore::getWrapper(impl.get(), isolate).IsEmpty()); |
| + ASSERT(DOMDataStore::getWrapper<${v8ClassName}>(impl.get(), isolate).IsEmpty()); |
| END |
| $code .= <<END if ($baseType ne $interfaceName); |
| - ASSERT(static_cast<void*>(static_cast<${baseType}*>(impl.get())) == static_cast<void*>(impl.get())); |
| END |
| if (InheritsInterface($interface, "Document")) { |
| @@ -4739,7 +4765,7 @@ END |
| if (Frame* frame = impl->frame()) { |
| if (frame->script()->initializeMainWorld()) { |
| // initializeMainWorld may have created a wrapper for the object, retry from the start. |
| - v8::Handle<v8::Object> wrapper = DOMDataStore::getWrapper(impl.get(), isolate); |
| + v8::Handle<v8::Object> wrapper = DOMDataStore::getWrapper<${v8ClassName}>(impl.get(), isolate); |
| if (!wrapper.IsEmpty()) |
| return wrapper; |
| } |
| @@ -4749,7 +4775,7 @@ END |
| $code .= <<END; |
| - v8::Handle<v8::Object> wrapper = V8DOMWrapper::createWrapper(creationContext, &info, impl.get(), isolate); |
| + v8::Handle<v8::Object> wrapper = V8DOMWrapper::createWrapper(creationContext, &info, toWrappedType(impl.get()), isolate); |
| if (UNLIKELY(wrapper.IsEmpty())) |
| return wrapper; |
| END |
| @@ -4765,7 +4791,7 @@ END |
| $code .= <<END; |
| installPerContextProperties(wrapper, impl.get(), isolate); |
| - V8DOMWrapper::associateObjectWithWrapper(impl, &info, wrapper, isolate, $wrapperConfiguration); |
| + V8DOMWrapper::associateObjectWithWrapper<$v8ClassName>(impl, &info, wrapper, isolate, $wrapperConfiguration); |
| return wrapper; |
| } |
| END |