OLD | NEW |
---|---|
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 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
506 my $idlFilename = Cwd::abs_path(IDLFileForInterface($interfaceName)) or die("Could NOT find IDL file for interface \"$interfaceName\" $!\n"); | 506 my $idlFilename = Cwd::abs_path(IDLFileForInterface($interfaceName)) or die("Could NOT find IDL file for interface \"$interfaceName\" $!\n"); |
507 my $idlRelPath = File::Spec->abs2rel($idlFilename, $sourceRoot); | 507 my $idlRelPath = File::Spec->abs2rel($idlFilename, $sourceRoot); |
508 push(@includes, dirname($idlRelPath) . "/" . $implClassName . ".h"); | 508 push(@includes, dirname($idlRelPath) . "/" . $implClassName . ".h"); |
509 } | 509 } |
510 return @includes; | 510 return @includes; |
511 } | 511 } |
512 | 512 |
513 sub NeedsVisitDOMWrapper | 513 sub NeedsVisitDOMWrapper |
514 { | 514 { |
515 my $interface = shift; | 515 my $interface = shift; |
516 return ExtendedAttributeContains($interface->extendedAttributes->{"Custom"}, "VisitDOMWrapper") || $interface->extendedAttributes->{"SetWrapperReferenceFrom "} || $interface->extendedAttributes->{"SetWrapperReferenceFromReference"} || $i nterface->extendedAttributes->{"SetWrapperReferenceTo"} || SVGTypeNeedsToHoldCon textElement($interface->name); | 516 return ExtendedAttributeContains($interface->extendedAttributes->{"Custom"}, "VisitDOMWrapper") || $interface->extendedAttributes->{"SetWrapperReferenceFrom "} || $interface->extendedAttributes->{"SetWrapperReferenceTo"} || SVGTypeNeedsT oHoldContextElement($interface->name); |
517 } | 517 } |
518 | 518 |
519 sub GenerateVisitDOMWrapper | 519 sub GenerateVisitDOMWrapper |
520 { | 520 { |
521 my $interface = shift; | 521 my $interface = shift; |
522 my $implClassName = GetImplName($interface); | 522 my $implClassName = GetImplName($interface); |
523 my $v8ClassName = GetV8ClassName($interface); | 523 my $v8ClassName = GetV8ClassName($interface); |
524 | 524 |
525 if (ExtendedAttributeContains($interface->extendedAttributes->{"Custom"}, "V isitDOMWrapper")) { | 525 if (ExtendedAttributeContains($interface->extendedAttributes->{"Custom"}, "V isitDOMWrapper")) { |
526 return; | 526 return; |
(...skipping 28 matching lines...) Expand all Loading... | |
555 $code .= <<END; | 555 $code .= <<END; |
556 ${setReferenceImplType}* ${setReferenceName} = impl->${setReferenceName}(); | 556 ${setReferenceImplType}* ${setReferenceName} = impl->${setReferenceName}(); |
557 if (${setReferenceName}) { | 557 if (${setReferenceName}) { |
558 if (!DOMDataStore::containsWrapper<${setReferenceV8Type}>(${setReference Name}, isolate)) | 558 if (!DOMDataStore::containsWrapper<${setReferenceV8Type}>(${setReference Name}, isolate)) |
559 wrap(${setReferenceName}, creationContext, isolate); | 559 wrap(${setReferenceName}, creationContext, isolate); |
560 DOMDataStore::setWrapperReference<${setReferenceV8Type}>(wrapper, ${setR eferenceName}, isolate); | 560 DOMDataStore::setWrapperReference<${setReferenceV8Type}>(wrapper, ${setR eferenceName}, isolate); |
561 } | 561 } |
562 END | 562 END |
563 } | 563 } |
564 | 564 |
565 my $isReachableMethod = $interface->extendedAttributes->{"SetWrapperReferenc eFrom"}; | 565 my $setWrapperReferenceMethod = $interface->extendedAttributes->{"SetWrapper ReferenceFrom"}; |
566 my $isReachableReferenceMethod = $interface->extendedAttributes->{"SetWrappe rReferenceFromReference"}; | 566 if ($setWrapperReferenceMethod) { |
567 | |
568 if ($isReachableMethod || $isReachableReferenceMethod) { | |
569 AddToImplIncludes("bindings/v8/V8GCController.h"); | 567 AddToImplIncludes("bindings/v8/V8GCController.h"); |
570 AddToImplIncludes("core/dom/Element.h"); | 568 AddToImplIncludes("core/dom/Element.h"); |
571 if ($isReachableMethod) { | 569 $code .= <<END; |
572 $code .= <<END; | 570 // The ${setWrapperReferenceMethod}() method may return a reference or a poi nter but |
573 if (Node* owner = impl->${isReachableMethod}()) { | 571 // RefPtr can be constructed from either. |
574 Node* root = V8GCController::opaqueRootForGC(owner, isolate); | 572 if (RefPtr<Node> owner = PassRefPtr<Node>(impl->${setWrapperReferenceMethod} ())) { |
adamk
2014/02/26 17:55:38
Why make a RefPTr here when we didn't make one bef
Inactive
2014/02/26 18:01:56
Yes, this is the trick, we construct a RefPtr beca
| |
573 Node* root = V8GCController::opaqueRootForGC(owner.get(), isolate); | |
575 isolate->SetReferenceFromGroup(v8::UniqueId(reinterpret_cast<intptr_t>(r oot)), wrapper); | 574 isolate->SetReferenceFromGroup(v8::UniqueId(reinterpret_cast<intptr_t>(r oot)), wrapper); |
576 return; | 575 return; |
577 } | 576 } |
578 END | 577 END |
579 } else { | |
580 $code .= <<END; | |
581 Node* root = V8GCController::opaqueRootForGC(&impl->${isReachableReferenceMe thod}(), isolate); | |
582 isolate->SetReferenceFromGroup(v8::UniqueId(reinterpret_cast<intptr_t>(root) ), wrapper); | |
583 } | |
584 | |
585 END | |
586 } | |
587 } | 578 } |
588 | 579 |
589 if (!$isReachableReferenceMethod) { | 580 $code .= <<END; |
590 $code .= <<END; | |
591 setObjectGroup(object, wrapper, isolate); | 581 setObjectGroup(object, wrapper, isolate); |
592 } | 582 } |
593 | 583 |
594 END | 584 END |
595 } | |
596 | 585 |
597 $implementation{nameSpaceWebCore}->add($code); | 586 $implementation{nameSpaceWebCore}->add($code); |
598 } | 587 } |
599 | 588 |
600 sub GetSVGPropertyTypes | 589 sub GetSVGPropertyTypes |
601 { | 590 { |
602 my $implType = shift; | 591 my $implType = shift; |
603 | 592 |
604 my $svgPropertyType; | 593 my $svgPropertyType; |
605 my $svgListPropertyType; | 594 my $svgListPropertyType; |
(...skipping 5862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6468 if ($parameter->type eq "SerializedScriptValue") { | 6457 if ($parameter->type eq "SerializedScriptValue") { |
6469 return 1; | 6458 return 1; |
6470 } elsif (IsIntegerType($parameter->type)) { | 6459 } elsif (IsIntegerType($parameter->type)) { |
6471 return 1; | 6460 return 1; |
6472 } | 6461 } |
6473 } | 6462 } |
6474 return 0; | 6463 return 0; |
6475 } | 6464 } |
6476 | 6465 |
6477 1; | 6466 1; |
OLD | NEW |