Chromium Code Reviews| Index: Source/bindings/scripts/code_generator_v8.pm |
| diff --git a/Source/bindings/scripts/code_generator_v8.pm b/Source/bindings/scripts/code_generator_v8.pm |
| index 867e653790dc0a635d5877009dde6a8a6c713f37..fb8b37acc9914a3e231626a55b5de855ef0e11a3 100644 |
| --- a/Source/bindings/scripts/code_generator_v8.pm |
| +++ b/Source/bindings/scripts/code_generator_v8.pm |
| @@ -454,13 +454,13 @@ sub HeaderFilesForInterface |
| return @includes; |
| } |
| -sub NeedsOpaqueRootForGC |
| +sub NeedsResolveWrapperReachability |
| { |
| my $interface = shift; |
| - return $interface->extendedAttributes->{"GenerateIsReachable"} || $interface->extendedAttributes->{"CustomIsReachable"}; |
| + return $interface->extendedAttributes->{"GenerateIsReachable"} || $interface->extendedAttributes->{"CustomIsReachable"} || $interface->extendedAttributes->{"ReachableTo"}; |
| } |
| -sub GenerateOpaqueRootForGC |
| +sub GenerateResolveWrapperReachability |
| { |
| my $interface = shift; |
| my $implClassName = GetImplName($interface); |
| @@ -471,22 +471,43 @@ sub GenerateOpaqueRootForGC |
| } |
| my $code = <<END; |
| -void* ${v8ClassName}::opaqueRootForGC(void* object, v8::Isolate* isolate) |
| +void ${v8ClassName}::resolveWrapperReachability(void* object, const v8::Persistent<v8::Object>& wrapper, v8::Isolate* isolate) |
| { |
| ${implClassName}* impl = fromInternalPointer(object); |
| END |
| + if ($interface->extendedAttributes->{"ReachableTo"}) { |
| + $code .= " v8::Local<v8::Object> creationContext = v8::Local<v8::Object>::New(isolate, wrapper);\n"; |
| + } |
| + for my $reachableTo (@{$interface->extendedAttributes->{"ReachableTo"}}) { |
| + my $reachableToType = $reachableTo->type; |
| + my $reachableToName = $reachableTo->name; |
| + my $reachableToV8Type = "V8".$reachableToType; |
| + |
| + AddIncludesForType($reachableToType); |
| + $code .= <<END; |
| + ${reachableToType}* ${reachableToName} = impl->${reachableToName}(); |
| + if (${reachableToName}) { |
| + if(! DOMDataStore::containsWrapper<${reachableToV8Type}>(${reachableToName}, isolate)) |
|
haraken
2013/10/16 04:46:38
Nit: Unnecessary space after '!'.
kouhei (in TOK)
2013/10/17 02:30:09
Done.
|
| + wrap(${reachableToName}, creationContext, isolate); |
| + DOMDataStore::setWrapperReferenceFrom<${reachableToV8Type}>(wrapper, ${reachableToName}, isolate); |
| + } |
| +END |
| + } |
| + |
| my $isReachableMethod = $interface->extendedAttributes->{"GenerateIsReachable"}; |
| if ($isReachableMethod) { |
| AddToImplIncludes("bindings/v8/V8GCController.h"); |
| AddToImplIncludes("core/dom/Element.h"); |
| $code .= <<END; |
| - if (Node* owner = impl->${isReachableMethod}()) |
| - return V8GCController::opaqueRootForGC(owner, isolate); |
| + if (Node* owner = impl->${isReachableMethod}()) { |
| + setObjectGroup(V8GCController::opaqueRootForGC(owner, isolate), wrapper, isolate); |
| + return; |
| + } |
| END |
| } |
| $code .= <<END; |
| - return object; |
| + setObjectGroup(object, wrapper, isolate); |
| } |
| END |
| @@ -669,8 +690,8 @@ END |
| static WrapperTypeInfo info; |
| END |
| - if (NeedsOpaqueRootForGC($interface)) { |
| - $header{classPublic}->add(" static void* opaqueRootForGC(void*, v8::Isolate*);\n"); |
| + if (NeedsResolveWrapperReachability($interface)) { |
| + $header{classPublic}->add(" static void resolveWrapperReachability(void*, const v8::Persistent<v8::Object>&, v8::Isolate*);\n"); |
| } |
| if (InheritsExtendedAttribute($interface, "ActiveDOMObject")) { |
| @@ -3962,7 +3983,7 @@ sub GenerateImplementation |
| my $toActiveDOMObject = InheritsExtendedAttribute($interface, "ActiveDOMObject") ? "${v8ClassName}::toActiveDOMObject" : "0"; |
| my $toEventTarget = InheritsInterface($interface, "EventTarget") ? "${v8ClassName}::toEventTarget" : "0"; |
| - my $rootForGC = NeedsOpaqueRootForGC($interface) ? "${v8ClassName}::opaqueRootForGC" : "0"; |
| + my $resolveWrapperReachability = NeedsResolveWrapperReachability($interface) ? "${v8ClassName}::resolveWrapperReachability" : "0"; |
| # Find the super descriptor. |
| my $parentClass = ""; |
| @@ -4012,7 +4033,7 @@ END |
| } |
| my $code = "WrapperTypeInfo ${v8ClassName}::info = { ${v8ClassName}::GetTemplate, ${v8ClassName}::derefObject, $toActiveDOMObject, $toEventTarget, "; |
| - $code .= "$rootForGC, ${v8ClassName}::installPerContextPrototypeProperties, $parentClassInfo, $WrapperTypePrototype };\n"; |
| + $code .= "$resolveWrapperReachability, ${v8ClassName}::installPerContextPrototypeProperties, $parentClassInfo, $WrapperTypePrototype };\n"; |
| $implementation{nameSpaceWebCore}->addHeader($code); |
| $implementation{nameSpaceInternal}->add("template <typename T> void V8_USE(T) { }\n\n"); |
| @@ -4069,8 +4090,8 @@ END |
| GenerateReplaceableAttributeSetterCallback($interface); |
| } |
| - if (NeedsOpaqueRootForGC($interface)) { |
| - GenerateOpaqueRootForGC($interface); |
| + if (NeedsResolveWrapperReachability($interface)) { |
| + GenerateResolveWrapperReachability($interface); |
| } |
| if ($interface->extendedAttributes->{"CheckSecurity"} && $interface->name ne "Window") { |
| @@ -4879,8 +4900,7 @@ sub GenerateToV8Converters |
| my $wrapperConfiguration = "WrapperConfiguration::Independent"; |
| if (InheritsExtendedAttribute($interface, "ActiveDOMObject") |
| || InheritsExtendedAttribute($interface, "DependentLifetime") |
| - || InheritsExtendedAttribute($interface, "GenerateIsReachable") |
| - || InheritsExtendedAttribute($interface, "CustomIsReachable") |
| + || NeedsResolveWrapperReachability($interface) |
| || $v8ClassName =~ /SVG/) { |
| $wrapperConfiguration = "WrapperConfiguration::Dependent"; |
| } |