| Index: Source/bindings/scripts/CodeGeneratorV8.pm
|
| diff --git a/Source/bindings/scripts/CodeGeneratorV8.pm b/Source/bindings/scripts/CodeGeneratorV8.pm
|
| index a10985f8c2887ea61b27fedf8b0bb16dab36aab6..8f51cff35da52eb1065feede5e089496347c50e3 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 = fromInternalPointer(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 fromInternalPointer(object->GetAlignedPointerFromInternalField(v8DOMWrapperObjectIndex));
|
| }
|
| static void derefObject(void*);
|
| static WrapperTypeInfo info;
|
| @@ -748,6 +748,29 @@ END
|
| GenerateHeaderLegacyCall($interface);
|
| GenerateHeaderCustomInternalFieldIndices($interface);
|
|
|
| + my $toWrappedType;
|
| + my $fromWrappedType;
|
| + if ($interface->parent) {
|
| + my $v8ParentClassName = "V8" . $interface->parent;
|
| + $toWrappedType = "${v8ParentClassName}::toInternalPointer(impl)";
|
| + $fromWrappedType = "static_cast<${nativeType}*>(${v8ParentClassName}::fromInternalPointer(object))";
|
| + } else {
|
| + $toWrappedType = "impl";
|
| + $fromWrappedType = "static_cast<${nativeType}*>(object)";
|
| + }
|
| +
|
| + $header{classPublic}->add(<<END);
|
| + static inline void* toInternalPointer(${nativeType}* impl)
|
| + {
|
| + return $toWrappedType;
|
| + }
|
| +
|
| + static inline ${nativeType}* fromInternalPointer(void* object)
|
| + {
|
| + return $fromWrappedType;
|
| + }
|
| +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 +877,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 +895,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 +906,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 +917,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 +929,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());
|
| @@ -1518,11 +1541,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.
|
| @@ -2565,7 +2589,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);
|
| }
|
|
|
| @@ -2673,7 +2697,7 @@ END
|
| 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);
|
| v8SetReturnValue(args, wrapper);
|
| }
|
| END
|
| @@ -2831,7 +2855,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);
|
| }
|
|
|
| @@ -4494,7 +4518,7 @@ END
|
| $implementation{nameSpaceWebCore}->add(<<END);
|
| void ${v8ClassName}::derefObject(void* object)
|
| {
|
| - static_cast<${nativeType}*>(object)->deref();
|
| + fromInternalPointer(object)->deref();
|
| }
|
|
|
| END
|
| @@ -4740,11 +4764,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")) {
|
| @@ -4752,7 +4775,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;
|
| }
|
| @@ -4762,7 +4785,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, toInternalPointer(impl.get()), isolate);
|
| if (UNLIKELY(wrapper.IsEmpty()))
|
| return wrapper;
|
| END
|
| @@ -4778,7 +4801,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
|
|
|