summaryrefslogtreecommitdiffstats
path: root/WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm
diff options
context:
space:
mode:
Diffstat (limited to 'WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm')
-rw-r--r--WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm530
1 files changed, 0 insertions, 530 deletions
diff --git a/WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm b/WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm
deleted file mode 100644
index 0de2fd0..0000000
--- a/WebKitTools/WebKitTestRunner/InjectedBundle/Bindings/CodeGeneratorTestRunner.pm
+++ /dev/null
@@ -1,530 +0,0 @@
-# Copyright (C) 2010 Apple Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
-# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
-# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
-# THE POSSIBILITY OF SUCH DAMAGE.
-
-use strict;
-use warnings;
-use File::Spec;
-
-package CodeGeneratorTestRunner;
-
-sub new
-{
- my ($class, $codeGenerator, $outputDir) = @_;
-
- my $reference = {
- codeGenerator => $codeGenerator,
- outputDir => $outputDir,
- };
-
- bless($reference, $class);
- return $reference;
-}
-
-sub GenerateModule
-{
-}
-
-sub GenerateInterface
-{
- my ($self, $interface, $defines) = @_;
-
- foreach my $file ($self->_generateHeaderFile($interface), $self->_generateImplementationFile($interface)) {
- open(FILE, ">", File::Spec->catfile($$self{outputDir}, $$file{name})) or die "Failed to open $$file{name} for writing: $!";
- print FILE @{$$file{contents}};
- close(FILE) or die "Failed to close $$file{name} after writing: $!";
- }
-}
-
-sub finish
-{
-}
-
-sub _className
-{
- my ($idlType) = @_;
-
- return "JS" . _implementationClassName($idlType);
-}
-
-sub _classRefGetter
-{
- my ($self, $idlType) = @_;
- return $$self{codeGenerator}->WK_lcfirst(_implementationClassName($idlType)) . "Class";
-}
-
-sub _fileHeaderString
-{
- my ($filename) = @_;
-
- # FIXME: We should pull header out of the IDL file to get the copyright
- # year(s) right.
- return <<EOF;
-/*
- * Copyright (C) 2010 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-EOF
-}
-
-sub _generateHeaderFile
-{
- my ($self, $interface) = @_;
-
- my @contents = ();
-
- my $idlType = $interface->name;
- my $className = _className($idlType);
- my $implementationClassName = _implementationClassName($idlType);
- my $filename = $className . ".h";
-
- push(@contents, _fileHeaderString($filename));
-
- my $parentClassName = _parentClassName($interface);
-
- push(@contents, <<EOF);
-
-#ifndef ${className}_h
-#define ${className}_h
-
-#include "${parentClassName}.h"
-EOF
- push(@contents, <<EOF);
-
-namespace WTR {
-
-class ${implementationClassName};
-
-class ${className} : public ${parentClassName} {
-public:
- static JSClassRef @{[$self->_classRefGetter($idlType)]}();
-
-private:
- static const JSStaticFunction* staticFunctions();
- static const JSStaticValue* staticValues();
-EOF
-
- if (my @functions = @{$interface->functions}) {
- push(@contents, "\n // Functions\n\n");
- foreach my $function (@functions) {
- push(@contents, " static JSValueRef @{[$function->signature->name]}(JSContextRef, JSObjectRef, JSObjectRef, size_t, const JSValueRef[], JSValueRef*);\n");
- }
- }
-
- if (my @attributes = @{$interface->attributes}) {
- push(@contents, "\n // Attributes\n\n");
- foreach my $attribute (@attributes) {
- push(@contents, " static JSValueRef @{[$self->_getterName($attribute)]}(JSContextRef, JSObjectRef, JSStringRef, JSValueRef*);\n");
- push(@contents, " static bool @{[$self->_setterName($attribute)]}(JSContextRef, JSObjectRef, JSStringRef, JSValueRef, JSValueRef*);\n") unless $attribute->type =~ /^readonly/;
- }
- }
-
- push(@contents, <<EOF);
-};
-
-${implementationClassName}* to${implementationClassName}(JSContextRef, JSValueRef);
-
-} // namespace WTR
-
-#endif // ${className}_h
-EOF
-
- return { name => $filename, contents => \@contents };
-}
-
-sub _generateImplementationFile
-{
- my ($self, $interface) = @_;
-
- my @contentsPrefix = ();
- my %contentsIncludes = ();
- my @contents = ();
-
- my $idlType = $interface->name;
- my $className = _className($idlType);
- my $implementationClassName = _implementationClassName($idlType);
- my $filename = $className . ".cpp";
-
- push(@contentsPrefix, _fileHeaderString($filename));
-
- my $classRefGetter = $self->_classRefGetter($idlType);
- my $parentClassName = _parentClassName($interface);
-
- $contentsIncludes{"${className}.h"} = 1;
- $contentsIncludes{"${implementationClassName}.h"} = 1;
-
- push(@contentsPrefix, <<EOF);
-
-EOF
-
- push(@contents, <<EOF);
-#include <JavaScriptCore/JSRetainPtr.h>
-#include <wtf/GetPtr.h>
-
-namespace WTR {
-
-${implementationClassName}* to${implementationClassName}(JSContextRef context, JSValueRef value)
-{
- if (!context || !value || !${className}::${classRefGetter}() || !JSValueIsObjectOfClass(context, value, ${className}::${classRefGetter}()))
- return 0;
- return static_cast<${implementationClassName}*>(JSWrapper::unwrap(context, value));
-}
-
-JSClassRef ${className}::${classRefGetter}()
-{
- static JSClassRef jsClass;
- if (!jsClass) {
- JSClassDefinition definition = kJSClassDefinitionEmpty;
- definition.className = "${idlType}";
- definition.parentClass = @{[$self->_parentClassRefGetterExpression($interface)]};
- definition.staticValues = staticValues();
- definition.staticFunctions = staticFunctions();
-EOF
-
- push(@contents, " definition.initialize = initialize;\n") unless _parentInterface($interface);
- push(@contents, " definition.finalize = finalize;\n") unless _parentInterface($interface);
-
- push(@contents, <<EOF);
- jsClass = JSClassCreate(&definition);
- }
- return jsClass;
-}
-
-EOF
-
- push(@contents, $self->_staticFunctionsGetterImplementation($interface), "\n");
- push(@contents, $self->_staticValuesGetterImplementation($interface));
-
- if (my @functions = @{$interface->functions}) {
- push(@contents, "\n// Functions\n");
-
- foreach my $function (@functions) {
- push(@contents, <<EOF);
-
-JSValueRef ${className}::@{[$function->signature->name]}(JSContextRef context, JSObjectRef, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef* exception)
-{
- ${implementationClassName}* impl = to${implementationClassName}(context, thisObject);
- if (!impl)
- return JSValueMakeUndefined(context);
-
-EOF
- my $functionCall;
- if ($function->signature->extendedAttributes->{"CustomArgumentHandling"}) {
- $functionCall = "impl->" . $function->signature->name . "(context, argumentCount, arguments, exception)";
- } else {
- my @parameters = ();
- my @specifiedParameters = @{$function->parameters};
-
- $self->_includeHeaders(\%contentsIncludes, $function->signature->type, $function->signature);
-
- foreach my $i (0..$#specifiedParameters) {
- my $parameter = $specifiedParameters[$i];
-
- $self->_includeHeaders(\%contentsIncludes, $idlType, $parameter);
-
- push(@contents, " " . $self->_platformTypeVariableDeclaration($parameter, $parameter->name, "arguments[$i]", "argumentCount > $i") . "\n");
-
- push(@parameters, $self->_parameterExpression($parameter));
- }
-
- $functionCall = "impl->" . $function->signature->name . "(" . join(", ", @parameters) . ")";
- }
-
- push(@contents, " ${functionCall};\n\n") if $function->signature->type eq "void";
- push(@contents, " return " . $self->_returnExpression($function->signature, $functionCall) . ";\n}\n");
- }
- }
-
- if (my @attributes = @{$interface->attributes}) {
- push(@contents, "\n// Attributes\n");
- foreach my $attribute (@attributes) {
- $self->_includeHeaders(\%contentsIncludes, $attribute->signature->type, $attribute->signature);
-
- my $getterName = $self->_getterName($attribute);
- my $getterExpression = "impl->${getterName}()";
-
- push(@contents, <<EOF);
-
-JSValueRef ${className}::${getterName}(JSContextRef context, JSObjectRef object, JSStringRef, JSValueRef* exception)
-{
- ${implementationClassName}* impl = to${implementationClassName}(context, object);
- if (!impl)
- return JSValueMakeUndefined(context);
-
- return @{[$self->_returnExpression($attribute->signature, $getterExpression)]};
-}
-EOF
-
- unless ($attribute->type =~ /^readonly/) {
- push(@contents, <<EOF);
-
-bool ${className}::@{[$self->_setterName($attribute)]}(JSContextRef context, JSObjectRef object, JSStringRef, JSValueRef value, JSValueRef* exception)
-{
- ${implementationClassName}* impl = to${implementationClassName}(context, object);
- if (!impl)
- return false;
-
-EOF
-
- my $platformValue = $self->_platformTypeConstructor($attribute->signature, "value");
-
- push(@contents, <<EOF);
- impl->@{[$self->_setterName($attribute)]}(${platformValue});
-
- return true;
-}
-EOF
- }
- }
- }
-
- push(@contents, <<EOF);
-
-} // namespace WTR
-
-EOF
-
- unshift(@contents, map { "#include \"$_\"\n" } sort keys(%contentsIncludes));
- unshift(@contents, @contentsPrefix);
-
- return { name => $filename, contents => \@contents };
-}
-
-sub _getterName
-{
- my ($self, $attribute) = @_;
-
- my $signature = $attribute->signature;
- my $name = $signature->name;
-
- return $name;
-}
-
-sub _includeHeaders
-{
- my ($self, $headers, $idlType, $signature) = @_;
-
- return unless defined $idlType;
- return if $idlType eq "boolean";
- return if $idlType eq "object";
- return if $$self{codeGenerator}->IsNonPointerType($idlType);
- return if $$self{codeGenerator}->IsStringType($idlType);
-
- $$headers{_className($idlType) . ".h"} = 1;
- $$headers{_implementationClassName($idlType) . ".h"} = 1;
-}
-
-sub _implementationClassName
-{
- my ($idlType) = @_;
-
- return $idlType;
-}
-
-sub _parentClassName
-{
- my ($interface) = @_;
-
- my $parentInterface = _parentInterface($interface);
- return $parentInterface ? _className($parentInterface) : "JSWrapper";
-}
-
-sub _parentClassRefGetterExpression
-{
- my ($self, $interface) = @_;
-
- my $parentInterface = _parentInterface($interface);
- return $parentInterface ? $self->_classRefGetter($parentInterface) . "()" : "0";
-}
-
-sub _parentInterface
-{
- my ($interface) = @_;
- return $interface->parents->[0];
-}
-
-sub _platformType
-{
- my ($self, $idlType, $signature) = @_;
-
- return undef unless defined $idlType;
-
- return "bool" if $idlType eq "boolean";
- return "JSValueRef" if $idlType eq "object";
- return "JSRetainPtr<JSStringRef>" if $$self{codeGenerator}->IsStringType($idlType);
- return "double" if $$self{codeGenerator}->IsNonPointerType($idlType);
- return _implementationClassName($idlType);
-}
-
-sub _platformTypeConstructor
-{
- my ($self, $signature, $argumentName) = @_;
-
- my $idlType = $signature->type;
-
- return "JSValueToBoolean(context, $argumentName)" if $idlType eq "boolean";
- return "$argumentName" if $idlType eq "object";
- return "JSRetainPtr<JSStringRef>(Adopt, JSValueToStringCopy(context, $argumentName, 0))" if $$self{codeGenerator}->IsStringType($idlType);
- return "JSValueToNumber(context, $argumentName, 0)" if $$self{codeGenerator}->IsNonPointerType($idlType);
- return "to" . _implementationClassName($idlType) . "(context, $argumentName)";
-}
-
-sub _platformTypeVariableDeclaration
-{
- my ($self, $signature, $variableName, $argumentName, $condition) = @_;
-
- my $platformType = $self->_platformType($signature->type, $signature);
- my $constructor = $self->_platformTypeConstructor($signature, $argumentName);
-
- my %nonPointerTypes = (
- "bool" => 1,
- "double" => 1,
- "JSRetainPtr<JSStringRef>" => 1,
- "JSValueRef" => 1,
- );
-
- my $nullValue = "0";
- $nullValue = "$platformType()" if defined $nonPointerTypes{$platformType} && $platformType ne "double";
-
- $platformType .= "*" unless defined $nonPointerTypes{$platformType};
-
- return "$platformType $variableName = $condition && $constructor;" if $condition && $platformType eq "bool";
- return "$platformType $variableName = $condition ? $constructor : $nullValue;" if $condition;
- return "$platformType $variableName = $constructor;";
-}
-
-sub _returnExpression
-{
- my ($self, $signature, $expression) = @_;
-
- my $returnIDLType = $signature->type;
-
- return "JSValueMakeUndefined(context)" if $returnIDLType eq "void";
- return "JSValueMakeBoolean(context, ${expression})" if $returnIDLType eq "boolean";
- return "${expression}" if $returnIDLType eq "object";
- return "JSValueMakeNumber(context, ${expression})" if $$self{codeGenerator}->IsNonPointerType($returnIDLType);
- return "JSValueMakeStringOrNull(context, ${expression}.get())" if $$self{codeGenerator}->IsStringType($returnIDLType);
- return "toJS(context, WTF::getPtr(${expression}))";
-}
-
-sub _parameterExpression
-{
- my ($self, $parameter) = @_;
-
- my $idlType = $parameter->type;
- my $name = $parameter->name;
-
- return "${name}.get()" if $$self{codeGenerator}->IsStringType($idlType);
- return $name;
-}
-
-sub _setterName
-{
- my ($self, $attribute) = @_;
-
- my $name = $attribute->signature->name;
-
- return "set" . $$self{codeGenerator}->WK_ucfirst($name);
-}
-
-sub _staticFunctionsGetterImplementation
-{
- my ($self, $interface) = @_;
-
- my $mapFunction = sub {
- my $name = $_->signature->name;
- my @attributes = qw(kJSPropertyAttributeDontDelete kJSPropertyAttributeReadOnly);
- push(@attributes, "kJSPropertyAttributeDontEnum") if $_->signature->extendedAttributes->{"DontEnum"};
-
- return "{ \"$name\", $name, " . join(" | ", @attributes) . " }";
- };
-
- return $self->_staticFunctionsOrValuesGetterImplementation($interface, "function", "{ 0, 0, 0 }", $mapFunction, $interface->functions);
-}
-
-sub _staticFunctionsOrValuesGetterImplementation
-{
- my ($self, $interface, $functionOrValue, $arrayTerminator, $mapFunction, $functionsOrAttributes) = @_;
-
- my $className = _className($interface->name);
- my $uppercaseFunctionOrValue = $$self{codeGenerator}->WK_ucfirst($functionOrValue);
-
- my $result = <<EOF;
-const JSStatic${uppercaseFunctionOrValue}* ${className}::static${uppercaseFunctionOrValue}s()
-{
-EOF
-
- my @initializers = map(&$mapFunction, @{$functionsOrAttributes});
- return $result . " return 0;\n}\n" unless @initializers;
-
- $result .= <<EOF
- static const JSStatic${uppercaseFunctionOrValue} ${functionOrValue}s[] = {
- @{[join(",\n ", @initializers)]},
- ${arrayTerminator}
- };
- return ${functionOrValue}s;
-}
-EOF
-}
-
-sub _staticValuesGetterImplementation
-{
- my ($self, $interface) = @_;
-
- my $mapFunction = sub {
- return if $_->signature->extendedAttributes->{"NoImplementation"};
-
- my $attributeName = $_->signature->name;
- my $attributeIsReadonly = $_->type =~ /^readonly/;
- my $getterName = $self->_getterName($_);
- my $setterName = $attributeIsReadonly ? "0" : $self->_setterName($_);
- my @attributes = qw(kJSPropertyAttributeDontDelete);
- push(@attributes, "kJSPropertyAttributeReadOnly") if $attributeIsReadonly;
- push(@attributes, "kJSPropertyAttributeDontEnum") if $_->signature->extendedAttributes->{"DontEnum"};
-
- return "{ \"$attributeName\", $getterName, $setterName, " . join(" | ", @attributes) . " }";
- };
-
- return $self->_staticFunctionsOrValuesGetterImplementation($interface, "value", "{ 0, 0, 0, 0 }", $mapFunction, $interface->attributes);
-}
-
-1;