Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(121)

Side by Side Diff: Source/bindings/scripts/code_generator_v8.pm

Issue 26792002: Reland: Reland: Implement new Blink IDL attribute [SetReference] (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: mark NodeFilter Dependent Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/bindings/scripts/IDLAttributes.txt ('k') | Source/bindings/tests/idls/TestInterface.idl » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (C) 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org> 1 # Copyright (C) 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
2 # Copyright (C) 2006 Anders Carlsson <andersca@mac.com> 2 # Copyright (C) 2006 Anders Carlsson <andersca@mac.com>
3 # Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com> 3 # Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com>
4 # Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org> 4 # Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org>
5 # Copyright (C) 2006 Apple Computer, Inc. 5 # Copyright (C) 2006 Apple Computer, Inc.
6 # Copyright (C) 2007, 2008, 2009, 2012 Google Inc. 6 # Copyright (C) 2007, 2008, 2009, 2012 Google Inc.
7 # Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> 7 # Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au>
8 # Copyright (C) Research In Motion Limited 2010. All rights reserved. 8 # Copyright (C) Research In Motion Limited 2010. All rights reserved.
9 # Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 9 # Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
10 # Copyright (C) 2012 Ericsson AB. All rights reserved. 10 # Copyright (C) 2012 Ericsson AB. All rights reserved.
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 } elsif (IsTypedArrayType($interfaceName)) { 444 } elsif (IsTypedArrayType($interfaceName)) {
445 push(@includes, "wtf/${interfaceName}.h"); 445 push(@includes, "wtf/${interfaceName}.h");
446 } else { 446 } else {
447 my $idlFilename = Cwd::abs_path(IDLFileForInterface($interfaceName)) or die("Could NOT find IDL file for interface \"$interfaceName\" $!\n"); 447 my $idlFilename = Cwd::abs_path(IDLFileForInterface($interfaceName)) or die("Could NOT find IDL file for interface \"$interfaceName\" $!\n");
448 my $idlRelPath = File::Spec->abs2rel($idlFilename, $sourceRoot); 448 my $idlRelPath = File::Spec->abs2rel($idlFilename, $sourceRoot);
449 push(@includes, dirname($idlRelPath) . "/" . $implClassName . ".h"); 449 push(@includes, dirname($idlRelPath) . "/" . $implClassName . ".h");
450 } 450 }
451 return @includes; 451 return @includes;
452 } 452 }
453 453
454 sub NeedsOpaqueRootForGC 454 sub NeedsResolveWrapperReachability
455 { 455 {
456 my $interface = shift; 456 my $interface = shift;
457 return $interface->extendedAttributes->{"GenerateIsReachable"} || $interface ->extendedAttributes->{"CustomIsReachable"}; 457 return $interface->extendedAttributes->{"GenerateIsReachable"} || $interface ->extendedAttributes->{"CustomIsReachable"} || $interface->extendedAttributes->{ "SetReference"};
458 } 458 }
459 459
460 sub GenerateOpaqueRootForGC 460 sub GenerateResolveWrapperReachability
461 { 461 {
462 my $interface = shift; 462 my $interface = shift;
463 my $implClassName = GetImplName($interface); 463 my $implClassName = GetImplName($interface);
464 my $v8ClassName = GetV8ClassName($interface); 464 my $v8ClassName = GetV8ClassName($interface);
465 465
466 if ($interface->extendedAttributes->{"CustomIsReachable"}) { 466 if ($interface->extendedAttributes->{"CustomIsReachable"}) {
467 return; 467 return;
468 } 468 }
469 469
470 my $code = <<END; 470 my $code = <<END;
471 void* ${v8ClassName}::opaqueRootForGC(void* object, v8::Isolate* isolate) 471 void ${v8ClassName}::resolveWrapperReachability(void* object, const v8::Persiste nt<v8::Object>& wrapper, v8::Isolate* isolate)
472 { 472 {
473 ${implClassName}* impl = fromInternalPointer(object); 473 ${implClassName}* impl = fromInternalPointer(object);
474 END 474 END
475 if ($interface->extendedAttributes->{"SetReference"}) {
476 $code .= <<END;
477 v8::Local<v8::Object> creationContext = v8::Local<v8::Object>::New(isolate, wrapper);
478 V8WrapperInstantiationScope scope(creationContext, isolate);
479 END
480 }
481 for my $setReference (@{$interface->extendedAttributes->{"SetReference"}}) {
482 my $setReferenceType = $setReference->type;
483 my $setReferenceName = $setReference->name;
484 my $setReferenceV8Type = "V8".$setReferenceType;
485
486 AddIncludesForType($setReferenceType);
487 $code .= <<END;
488 ${setReferenceType}* ${setReferenceName} = impl->${setReferenceName}();
489 if (${setReferenceName}) {
490 if (!DOMDataStore::containsWrapper<${setReferenceV8Type}>(${setReference Name}, isolate))
491 wrap(${setReferenceName}, creationContext, isolate);
492 DOMDataStore::setWrapperReference<${setReferenceV8Type}>(wrapper, ${setR eferenceName}, isolate);
493 }
494 END
495 }
496
475 my $isReachableMethod = $interface->extendedAttributes->{"GenerateIsReachabl e"}; 497 my $isReachableMethod = $interface->extendedAttributes->{"GenerateIsReachabl e"};
476 if ($isReachableMethod) { 498 if ($isReachableMethod) {
477 AddToImplIncludes("bindings/v8/V8GCController.h"); 499 AddToImplIncludes("bindings/v8/V8GCController.h");
478 AddToImplIncludes("core/dom/Element.h"); 500 AddToImplIncludes("core/dom/Element.h");
479 $code .= <<END; 501 $code .= <<END;
480 if (Node* owner = impl->${isReachableMethod}()) 502 if (Node* owner = impl->${isReachableMethod}()) {
481 return V8GCController::opaqueRootForGC(owner, isolate); 503 setObjectGroup(V8GCController::opaqueRootForGC(owner, isolate), wrapper, isolate);
504 return;
505 }
482 END 506 END
483 } 507 }
484 508
485 $code .= <<END; 509 $code .= <<END;
486 return object; 510 setObjectGroup(object, wrapper, isolate);
487 } 511 }
488 512
489 END 513 END
490 $implementation{nameSpaceWebCore}->add($code); 514 $implementation{nameSpaceWebCore}->add($code);
491 } 515 }
492 516
493 sub GetSVGPropertyTypes 517 sub GetSVGPropertyTypes
494 { 518 {
495 my $implType = shift; 519 my $implType = shift;
496 520
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 static bool HasInstanceInAnyWorld(v8::Handle<v8::Value>, v8::Isolate*); 683 static bool HasInstanceInAnyWorld(v8::Handle<v8::Value>, v8::Isolate*);
660 static v8::Handle<v8::FunctionTemplate> GetTemplate(v8::Isolate*, WrapperWor ldType); 684 static v8::Handle<v8::FunctionTemplate> GetTemplate(v8::Isolate*, WrapperWor ldType);
661 static ${nativeType}* toNative(v8::Handle<v8::Object> object) 685 static ${nativeType}* toNative(v8::Handle<v8::Object> object)
662 { 686 {
663 return fromInternalPointer(object->GetAlignedPointerFromInternalField(v8 DOMWrapperObjectIndex)); 687 return fromInternalPointer(object->GetAlignedPointerFromInternalField(v8 DOMWrapperObjectIndex));
664 } 688 }
665 static void derefObject(void*); 689 static void derefObject(void*);
666 static const WrapperTypeInfo wrapperTypeInfo; 690 static const WrapperTypeInfo wrapperTypeInfo;
667 END 691 END
668 692
669 if (NeedsOpaqueRootForGC($interface)) { 693 if (NeedsResolveWrapperReachability($interface)) {
670 $header{classPublic}->add(" static void* opaqueRootForGC(void*, v8::I solate*);\n"); 694 $header{classPublic}->add(" static void resolveWrapperReachability(vo id*, const v8::Persistent<v8::Object>&, v8::Isolate*);\n");
671 } 695 }
672 696
673 if (InheritsExtendedAttribute($interface, "ActiveDOMObject")) { 697 if (InheritsExtendedAttribute($interface, "ActiveDOMObject")) {
674 $header{classPublic}->add(" static ActiveDOMObject* toActiveDOMObject (v8::Handle<v8::Object>);\n"); 698 $header{classPublic}->add(" static ActiveDOMObject* toActiveDOMObject (v8::Handle<v8::Object>);\n");
675 } 699 }
676 700
677 if (InheritsInterface($interface, "EventTarget")) { 701 if (InheritsInterface($interface, "EventTarget")) {
678 $header{classPublic}->add(" static EventTarget* toEventTarget(v8::Han dle<v8::Object>);\n"); 702 $header{classPublic}->add(" static EventTarget* toEventTarget(v8::Han dle<v8::Object>);\n");
679 } 703 }
680 704
(...skipping 3353 matching lines...) Expand 10 before | Expand all | Expand 10 after
4034 AddToImplIncludes("bindings/v8/V8DOMWrapper.h"); 4058 AddToImplIncludes("bindings/v8/V8DOMWrapper.h");
4035 AddToImplIncludes("core/dom/ContextFeatures.h"); 4059 AddToImplIncludes("core/dom/ContextFeatures.h");
4036 AddToImplIncludes("core/dom/Document.h"); 4060 AddToImplIncludes("core/dom/Document.h");
4037 AddToImplIncludes("RuntimeEnabledFeatures.h"); 4061 AddToImplIncludes("RuntimeEnabledFeatures.h");
4038 AddToImplIncludes("platform/TraceEvent.h"); 4062 AddToImplIncludes("platform/TraceEvent.h");
4039 4063
4040 AddIncludesForType($interfaceName); 4064 AddIncludesForType($interfaceName);
4041 4065
4042 my $toActiveDOMObject = InheritsExtendedAttribute($interface, "ActiveDOMObje ct") ? "${v8ClassName}::toActiveDOMObject" : "0"; 4066 my $toActiveDOMObject = InheritsExtendedAttribute($interface, "ActiveDOMObje ct") ? "${v8ClassName}::toActiveDOMObject" : "0";
4043 my $toEventTarget = InheritsInterface($interface, "EventTarget") ? "${v8Clas sName}::toEventTarget" : "0"; 4067 my $toEventTarget = InheritsInterface($interface, "EventTarget") ? "${v8Clas sName}::toEventTarget" : "0";
4044 my $rootForGC = NeedsOpaqueRootForGC($interface) ? "${v8ClassName}::opaqueRo otForGC" : "0"; 4068 my $resolveWrapperReachability = NeedsResolveWrapperReachability($interface) ? "${v8ClassName}::resolveWrapperReachability" : "0";
4045 4069
4046 # Find the super descriptor. 4070 # Find the super descriptor.
4047 my $parentClass = ""; 4071 my $parentClass = "";
4048 my $parentClassTemplate = ""; 4072 my $parentClassTemplate = "";
4049 if ($interface->parent) { 4073 if ($interface->parent) {
4050 my $parent = $interface->parent; 4074 my $parent = $interface->parent;
4051 AddToImplIncludes("V8${parent}.h"); 4075 AddToImplIncludes("V8${parent}.h");
4052 $parentClass = "V8" . $parent; 4076 $parentClass = "V8" . $parent;
4053 $parentClassTemplate = $parentClass . "::GetTemplate(isolate, currentWor ldType)"; 4077 $parentClassTemplate = $parentClass . "::GetTemplate(isolate, currentWor ldType)";
4054 } 4078 }
(...skipping 29 matching lines...) Expand all
4084 { 4108 {
4085 WebCore::initializeScriptWrappableForInterface(object); 4109 WebCore::initializeScriptWrappableForInterface(object);
4086 } 4110 }
4087 4111
4088 namespace WebCore { 4112 namespace WebCore {
4089 END 4113 END
4090 $implementation{nameSpaceWebCore}->addHeader($code); 4114 $implementation{nameSpaceWebCore}->addHeader($code);
4091 } 4115 }
4092 4116
4093 my $code = "const WrapperTypeInfo ${v8ClassName}::wrapperTypeInfo = { ${v8Cl assName}::GetTemplate, ${v8ClassName}::derefObject, $toActiveDOMObject, $toEvent Target, "; 4117 my $code = "const WrapperTypeInfo ${v8ClassName}::wrapperTypeInfo = { ${v8Cl assName}::GetTemplate, ${v8ClassName}::derefObject, $toActiveDOMObject, $toEvent Target, ";
4094 $code .= "$rootForGC, ${v8ClassName}::installPerContextEnabledPrototypePrope rties, $parentClassInfo, $WrapperTypePrototype };\n"; 4118 $code .= "$resolveWrapperReachability, ${v8ClassName}::installPerContextEnab ledPrototypeProperties, $parentClassInfo, $WrapperTypePrototype };\n";
4095 $implementation{nameSpaceWebCore}->addHeader($code); 4119 $implementation{nameSpaceWebCore}->addHeader($code);
4096 4120
4097 $implementation{nameSpaceInternal}->add("template <typename T> void V8_USE(T ) { }\n\n"); 4121 $implementation{nameSpaceInternal}->add("template <typename T> void V8_USE(T ) { }\n\n");
4098 4122
4099 my $hasConstructors = 0; 4123 my $hasConstructors = 0;
4100 my $hasReplaceable = 0; 4124 my $hasReplaceable = 0;
4101 4125
4102 # Generate property accessors for attributes. 4126 # Generate property accessors for attributes.
4103 for (my $index = 0; $index < @{$interface->attributes}; $index++) { 4127 for (my $index = 0; $index < @{$interface->attributes}; $index++) {
4104 my $attribute = @{$interface->attributes}[$index]; 4128 my $attribute = @{$interface->attributes}[$index];
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4143 4167
4144 if ($hasConstructors) { 4168 if ($hasConstructors) {
4145 GenerateConstructorGetter($interface); 4169 GenerateConstructorGetter($interface);
4146 } 4170 }
4147 4171
4148 if ($hasConstructors || $hasReplaceable) { 4172 if ($hasConstructors || $hasReplaceable) {
4149 GenerateReplaceableAttributeSetter($interface); 4173 GenerateReplaceableAttributeSetter($interface);
4150 GenerateReplaceableAttributeSetterCallback($interface); 4174 GenerateReplaceableAttributeSetterCallback($interface);
4151 } 4175 }
4152 4176
4153 if (NeedsOpaqueRootForGC($interface)) { 4177 if (NeedsResolveWrapperReachability($interface)) {
4154 GenerateOpaqueRootForGC($interface); 4178 GenerateResolveWrapperReachability($interface);
4155 } 4179 }
4156 4180
4157 if ($interface->extendedAttributes->{"CheckSecurity"} && $interface->name ne "Window") { 4181 if ($interface->extendedAttributes->{"CheckSecurity"} && $interface->name ne "Window") {
4158 GenerateSecurityCheckFunctions($interface); 4182 GenerateSecurityCheckFunctions($interface);
4159 } 4183 }
4160 4184
4161 if (IsConstructorTemplate($interface, "TypedArray")) { 4185 if (IsConstructorTemplate($interface, "TypedArray")) {
4162 my ($nativeType, $arrayType) = GetNativeTypeOfTypedArray($interface); 4186 my ($nativeType, $arrayType) = GetNativeTypeOfTypedArray($interface);
4163 $implementation{nameSpaceWebCore}->add(<<END); 4187 $implementation{nameSpaceWebCore}->add(<<END);
4164 v8::Handle<v8::Object> wrap($implClassName* impl, v8::Handle<v8::Object> creatio nContext, v8::Isolate* isolate) 4188 v8::Handle<v8::Object> wrap($implClassName* impl, v8::Handle<v8::Object> creatio nContext, v8::Isolate* isolate)
(...skipping 801 matching lines...) Expand 10 before | Expand all | Expand 10 after
4966 GenerateSpecialWrap($interface, $v8ClassName, $nativeType); 4990 GenerateSpecialWrap($interface, $v8ClassName, $nativeType);
4967 4991
4968 my $createWrapperArgumentType = GetPassRefPtrType($nativeType); 4992 my $createWrapperArgumentType = GetPassRefPtrType($nativeType);
4969 my $baseType = BaseInterfaceName($interface); 4993 my $baseType = BaseInterfaceName($interface);
4970 4994
4971 # FIXME: Do we really need to treat "GenerateIsReachable", "CustomIsReachabl e" and /SVG/ 4995 # FIXME: Do we really need to treat "GenerateIsReachable", "CustomIsReachabl e" and /SVG/
4972 # as dependent DOM objects? 4996 # as dependent DOM objects?
4973 my $wrapperConfiguration = "WrapperConfiguration::Independent"; 4997 my $wrapperConfiguration = "WrapperConfiguration::Independent";
4974 if (InheritsExtendedAttribute($interface, "ActiveDOMObject") 4998 if (InheritsExtendedAttribute($interface, "ActiveDOMObject")
4975 || InheritsExtendedAttribute($interface, "DependentLifetime") 4999 || InheritsExtendedAttribute($interface, "DependentLifetime")
4976 || InheritsExtendedAttribute($interface, "GenerateIsReachable") 5000 || NeedsResolveWrapperReachability($interface)
4977 || InheritsExtendedAttribute($interface, "CustomIsReachable")
4978 || $v8ClassName =~ /SVG/) { 5001 || $v8ClassName =~ /SVG/) {
4979 $wrapperConfiguration = "WrapperConfiguration::Dependent"; 5002 $wrapperConfiguration = "WrapperConfiguration::Dependent";
4980 } 5003 }
4981 5004
4982 my $code = ""; 5005 my $code = "";
4983 $code .= <<END; 5006 $code .= <<END;
4984 v8::Handle<v8::Object> ${v8ClassName}::createWrapper(${createWrapperArgumentType } impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) 5007 v8::Handle<v8::Object> ${v8ClassName}::createWrapper(${createWrapperArgumentType } impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate)
4985 { 5008 {
4986 ASSERT(impl); 5009 ASSERT(impl);
4987 ASSERT(!DOMDataStore::containsWrapper<${v8ClassName}>(impl.get(), isolate)); 5010 ASSERT(!DOMDataStore::containsWrapper<${v8ClassName}>(impl.get(), isolate));
(...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after
6274 6297
6275 return 1 if $interface->extendedAttributes->{"CustomToV8"}; 6298 return 1 if $interface->extendedAttributes->{"CustomToV8"};
6276 return 1 if $interface->extendedAttributes->{"SpecialWrapFor"}; 6299 return 1 if $interface->extendedAttributes->{"SpecialWrapFor"};
6277 return 1 if InheritsInterface($interface, "Document"); 6300 return 1 if InheritsInterface($interface, "Document");
6278 return 1 if SVGTypeNeedsToHoldContextElement($interface->name); 6301 return 1 if SVGTypeNeedsToHoldContextElement($interface->name);
6279 6302
6280 return 0; 6303 return 0;
6281 } 6304 }
6282 6305
6283 1; 6306 1;
OLDNEW
« no previous file with comments | « Source/bindings/scripts/IDLAttributes.txt ('k') | Source/bindings/tests/idls/TestInterface.idl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698