| Index: Source/WebCore/bindings/scripts/CodeGeneratorV8.pm
|
| ===================================================================
|
| --- Source/WebCore/bindings/scripts/CodeGeneratorV8.pm (revision 142703)
|
| +++ Source/WebCore/bindings/scripts/CodeGeneratorV8.pm (working copy)
|
| @@ -2618,6 +2618,9 @@
|
| my $visibleInterfaceName = $codeGenerator->GetVisibleInterfaceName($interface);
|
| my $v8InterfaceName = "V8$interfaceName";
|
| my $nativeType = GetNativeTypeForConversions($interface);
|
| + my $vtableNameGnu = GetGnuVTableNameForInterface($interface);
|
| + my $vtableRefGnu = GetGnuVTableRefForInterface($interface);
|
| + my $vtableRefWin = GetWinVTableRefForInterface($interface);
|
|
|
| # - Add default header template
|
| push(@implContentHeader, GenerateImplementationContentHeader($interface));
|
| @@ -2643,7 +2646,39 @@
|
| $parentClassTemplate = $parentClass . "::GetTemplate()";
|
| last;
|
| }
|
| +
|
| + push(@implContentDecls, <<END) if $vtableNameGnu;
|
| +#if ENABLE(BINDING_INTEGRITY)
|
| +#if defined(OS_WIN)
|
| +#pragma warning(disable: 4483)
|
| +extern "C" { extern void (*const ${vtableRefWin}[])(); }
|
| +#else
|
| +extern "C" { extern void* ${vtableNameGnu}[]; }
|
| +#endif
|
| +#endif // ENABLE(BINDING_INTEGRITY)
|
| +
|
| +END
|
| +
|
| push(@implContentDecls, "namespace WebCore {\n\n");
|
| +
|
| + push(@implContentDecls, <<END) if $vtableNameGnu;
|
| +#if ENABLE(BINDING_INTEGRITY)
|
| +inline void checkTypeOrDieTrying(${nativeType}* object)
|
| +{
|
| + void* actualVTablePointer = *(reinterpret_cast<void**>(object));
|
| +#if defined(OS_WIN)
|
| + void* expectedVTablePointer = reinterpret_cast<void*>(${vtableRefWin});
|
| +#else
|
| + void* expectedVTablePointer = ${vtableRefGnu};
|
| +#endif
|
| + if (actualVTablePointer != expectedVTablePointer)
|
| + CRASH();
|
| +}
|
| +#endif // ENABLE(BINDING_INTEGRITY)
|
| +
|
| +END
|
| +
|
| +
|
| my $parentClassInfo = $parentClass ? "&${parentClass}::info" : "0";
|
|
|
| my $WrapperTypePrototype = $interface->isException ? "WrapperTypeErrorPrototype" : "WrapperTypeObjectPrototype";
|
| @@ -3459,6 +3494,8 @@
|
| return;
|
| }
|
|
|
| + AddToImplIncludes("Frame.h");
|
| +
|
| my $createWrapperArgumentType = GetPassRefPtrType($nativeType);
|
| my $baseType = BaseInterfaceName($interface);
|
|
|
| @@ -3469,14 +3506,19 @@
|
| ASSERT(impl.get());
|
| ASSERT(DOMDataStore::getWrapper(impl.get(), isolate).IsEmpty());
|
| END
|
| - if ($baseType ne $interfaceName) {
|
| - push(@implContent, <<END);
|
| +
|
| + my $vtableNameGnu = GetGnuVTableNameForInterface($interface);
|
| + push(@implContent, <<END) if $vtableNameGnu;
|
| +
|
| +#if ENABLE(BINDING_INTEGRITY)
|
| + checkTypeOrDieTrying(impl.get());
|
| +#endif
|
| +END
|
| +
|
| + push(@implContent, <<END) if ($baseType ne $interfaceName);
|
| ASSERT(static_cast<void*>(static_cast<${baseType}*>(impl.get())) == static_cast<void*>(impl.get()));
|
| END
|
| - }
|
|
|
| - AddToImplIncludes("Frame.h");
|
| -
|
| if ($codeGenerator->IsSubType($interface, "Document")) {
|
| push(@implContent, <<END);
|
| if (Frame* frame = impl->frame()) {
|
| @@ -3509,11 +3551,123 @@
|
| {
|
| my $interface = shift;
|
| my $interfaceName = $interface->name;
|
| -
|
| $interfaceName = $codeGenerator->GetSVGTypeNeedingTearOff($interfaceName) if $codeGenerator->IsSVGTypeNeedingTearOff($interfaceName);
|
| - return $interfaceName;;
|
| + return $interfaceName;
|
| }
|
|
|
| +# See http://refspecs.linux-foundation.org/cxxabi-1.83.html.
|
| +sub GetGnuVTableRefForInterface
|
| +{
|
| + my $interface = shift;
|
| + my $vtableName = GetGnuVTableNameForInterface($interface);
|
| + if (!$vtableName) {
|
| + return "0";
|
| + }
|
| + my $typename = GetNativeTypeForConversions($interface);
|
| + my $offset = GetGnuVTableOffsetForType($typename);
|
| + return "&" . $vtableName . "[" . $offset . "]";
|
| +}
|
| +
|
| +sub GetGnuVTableNameForInterface
|
| +{
|
| + my $interface = shift;
|
| + my $typename = GetNativeTypeForConversions($interface);
|
| + my $templatePosition = index($typename, "<");
|
| + return "" if $templatePosition != -1;
|
| + return "" if GetImplementationLacksVTableForInterface($interface);
|
| + return "" if GetV8SkipVTableValidationForInterface($interface);
|
| + return "_ZTV" . GetGnuMangledNameForInterface($interface);
|
| +}
|
| +
|
| +sub GetGnuMangledNameForInterface
|
| +{
|
| + my $interface = shift;
|
| + my $typename = GetNativeTypeForConversions($interface);
|
| + my $templatePosition = index($typename, "<");
|
| + if ($templatePosition != -1) {
|
| + return "";
|
| + }
|
| + my $mangledType = length($typename) . $typename;
|
| + my $namespace = GetNamespaceForInterface($interface);
|
| + my $mangledNamespace = "N" . length($namespace) . $namespace;
|
| + return $mangledNamespace . $mangledType . "E";
|
| +}
|
| +
|
| +sub GetGnuVTableOffsetForType
|
| +{
|
| + my $typename = shift;
|
| + if ($typename eq "SVGAElement"
|
| + || $typename eq "SVGCircleElement"
|
| + || $typename eq "SVGClipPathElement"
|
| + || $typename eq "SVGDefsElement"
|
| + || $typename eq "SVGEllipseElement"
|
| + || $typename eq "SVGForeignObjectElement"
|
| + || $typename eq "SVGGElement"
|
| + || $typename eq "SVGImageElement"
|
| + || $typename eq "SVGLineElement"
|
| + || $typename eq "SVGPathElement"
|
| + || $typename eq "SVGPolyElement"
|
| + || $typename eq "SVGPolygonElement"
|
| + || $typename eq "SVGPolylineElement"
|
| + || $typename eq "SVGRectElement"
|
| + || $typename eq "SVGSVGElement"
|
| + || $typename eq "SVGStyledLocatableElement"
|
| + || $typename eq "SVGStyledTransformableElement"
|
| + || $typename eq "SVGSwitchElement"
|
| + || $typename eq "SVGTextElement"
|
| + || $typename eq "SVGTransformable"
|
| + || $typename eq "SVGUseElement") {
|
| + return "3";
|
| + }
|
| + return "2";
|
| +}
|
| +
|
| +# See http://en.wikipedia.org/wiki/Microsoft_Visual_C%2B%2B_Name_Mangling.
|
| +sub GetWinVTableRefForInterface
|
| +{
|
| + my $interface = shift;
|
| + my $vtableName = GetWinVTableNameForInterface($interface);
|
| + return 0 if !$vtableName;
|
| + return "__identifier(\"" . $vtableName . "\")";
|
| +}
|
| +
|
| +sub GetWinVTableNameForInterface
|
| +{
|
| + my $interface = shift;
|
| + my $typename = GetNativeTypeForConversions($interface);
|
| + my $templatePosition = index($typename, "<");
|
| + return "" if $templatePosition != -1;
|
| + return "" if GetImplementationLacksVTableForInterface($interface);
|
| + return "" if GetV8SkipVTableValidationForInterface($interface);
|
| + return "??_7" . GetWinMangledNameForInterface($interface) . "6B@";
|
| +}
|
| +
|
| +sub GetWinMangledNameForInterface
|
| +{
|
| + my $interface = shift;
|
| + my $typename = GetNativeTypeForConversions($interface);
|
| + my $namespace = GetNamespaceForInterface($interface);
|
| + return $typename . "@" . $namespace . "@@";
|
| +}
|
| +
|
| +sub GetNamespaceForInterface
|
| +{
|
| + my $interface = shift;
|
| + return $interface->extendedAttributes->{"ImplementationNamespace"} || "WebCore";
|
| +}
|
| +
|
| +sub GetImplementationLacksVTableForInterface
|
| +{
|
| + my $interface = shift;
|
| + return $interface->extendedAttributes->{"ImplementationLacksVTable"};
|
| +}
|
| +
|
| +sub GetV8SkipVTableValidationForInterface
|
| +{
|
| + my $interface = shift;
|
| + return $interface->extendedAttributes->{"V8SkipVTableValidation"};
|
| +}
|
| +
|
| sub GenerateFunctionCallString()
|
| {
|
| my $function = shift;
|
|
|