Title: [202328] trunk/Source/WebCore
Revision
202328
Author
[email protected]
Date
2016-06-22 01:59:31 -0700 (Wed, 22 Jun 2016)

Log Message

[GTK] Add support for variadic parameters to GObject DOM bindings
https://bugs.webkit.org/show_bug.cgi?id=158942

Reviewed by Michael Catanzaro.

Generate code for functions having variadic parameters.

* bindings/scripts/CodeGeneratorGObject.pm:
(GenerateFunction):
(SkipFunction):
* bindings/scripts/test/GObject/WebKitDOMTestObj.cpp:
(webkit_dom_test_obj_variadic_string_method):
* bindings/scripts/test/GObject/WebKitDOMTestObj.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (202327 => 202328)


--- trunk/Source/WebCore/ChangeLog	2016-06-22 08:35:03 UTC (rev 202327)
+++ trunk/Source/WebCore/ChangeLog	2016-06-22 08:59:31 UTC (rev 202328)
@@ -1,3 +1,19 @@
+2016-06-22  Carlos Garcia Campos  <[email protected]>
+
+        [GTK] Add support for variadic parameters to GObject DOM bindings
+        https://bugs.webkit.org/show_bug.cgi?id=158942
+
+        Reviewed by Michael Catanzaro.
+
+        Generate code for functions having variadic parameters.
+
+        * bindings/scripts/CodeGeneratorGObject.pm:
+        (GenerateFunction):
+        (SkipFunction):
+        * bindings/scripts/test/GObject/WebKitDOMTestObj.cpp:
+        (webkit_dom_test_obj_variadic_string_method):
+        * bindings/scripts/test/GObject/WebKitDOMTestObj.h:
+
 2016-06-21  Benjamin Poulain  <[email protected]>
 
         :hover CSS pseudo-class sometimes keeps matching ever after mouse has left the element

Modified: trunk/Source/WebCore/bindings/scripts/CodeGeneratorGObject.pm (202327 => 202328)


--- trunk/Source/WebCore/bindings/scripts/CodeGeneratorGObject.pm	2016-06-22 08:35:03 UTC (rev 202327)
+++ trunk/Source/WebCore/bindings/scripts/CodeGeneratorGObject.pm	2016-06-22 08:59:31 UTC (rev 202328)
@@ -320,7 +320,6 @@
     # how to auto-generate callbacks.  Skip functions that have "MediaQueryListListener" or
     # sequence<T> parameters, because this code generator doesn't know how to auto-generate
     # MediaQueryListListener or sequence<T>. Skip EventListeners because they are handled elsewhere.
-    # Skip functions that have variadic parameters because not supported yet.
     foreach my $param (@{$function->parameters}) {
         return 1 if $codeGenerator->IsFunctionOnlyCallbackInterface($param->type);
         return 1 if $param->extendedAttributes->{"Clamp"};
@@ -327,7 +326,6 @@
         return 1 if $param->type eq "MediaQueryListListener";
         return 1 if $param->type eq "EventListener";
         return 1 if $codeGenerator->GetSequenceType($param->type);
-        return 1 if $param->isVariadic;
     }
 
     # This is for DataTransferItemList.idl add(File) method
@@ -1090,6 +1088,7 @@
     my $functionSig = "${className}* self";
     my $symbolSig = "${className}*";
 
+    my $hasVariadic = 0;
     my @callImplParams;
     foreach my $param (@{$function->parameters}) {
         my $paramIDLType = $param->type;
@@ -1099,8 +1098,12 @@
         my $const = $paramType eq "gchar*" ? "const " : "";
         my $paramName = $param->name;
 
-        $functionSig .= ", ${const}$paramType $paramName";
-        $symbolSig .= ", ${const}$paramType";
+        if ($param->isVariadic) {
+            $hasVariadic = 1;
+        } else {
+            $functionSig .= ", ${const}$paramType $paramName";
+            $symbolSig .= ", ${const}$paramType";
+        }
 
         my $paramIsGDOMType = IsGDOMClassType($paramIDLType);
         if ($paramIsGDOMType) {
@@ -1108,9 +1111,10 @@
                 $implIncludes{"WebKitDOM${paramIDLType}Private.h"} = 1;
             }
         }
-        if ($paramIsGDOMType || ($paramIDLType eq "DOMString")) {
+        if ($paramIsGDOMType || ($paramIDLType eq "DOMString") || $param->isVariadic) {
             $paramName = "converted" . $codeGenerator->WK_ucfirst($paramName);
             $paramName = "*$paramName" if $codeGenerator->ShouldPassWrapperByReference($param, $parentNode);
+            $paramName = "WTFMove($paramName)" if $param->isVariadic;
         }
         if ($paramIDLType eq "NodeFilter" || $paramIDLType eq "XPathNSResolver") {
             $paramName = "WTF::getPtr(" . $paramName . ")";
@@ -1129,6 +1133,17 @@
     $functionSig .= ", GError** error" if $raisesException || $usedToRaiseException;
     $symbolSig .= ", GError**" if $raisesException || $usedToRaiseException;
 
+    if ($hasVariadic) {
+        my $param = @{$function->parameters}[-1];
+        if ($codeGenerator->IsNonPointerType($param->type)) {
+            my $paramName = $param->name;
+            $functionSig .= ", guint n_$paramName";
+            $symbolSig .= ", guint";
+        }
+        $functionSig .= ", ...";
+        $symbolSig .= ", ...";
+    }
+
     my $symbol = "$returnType $functionName($symbolSig)";
     my $isStableClass = scalar(@stableSymbols);
     my ($stableSymbol) = grep {$_ =~ /^\Q$symbol/} @stableSymbols;
@@ -1145,6 +1160,9 @@
     push(@functionHeader, " * \@self: A #${className}");
 
     foreach my $param (@{$function->parameters}) {
+        if ($param->isVariadic) {
+            last;
+        }
         my $paramIDLType = $param->type;
         my $arrayOrSequenceType = $codeGenerator->GetArrayOrSequenceType($paramIDLType);
         $paramIDLType = $arrayOrSequenceType if $arrayOrSequenceType ne "";
@@ -1159,6 +1177,18 @@
         push(@functionHeader, " * \@${paramName}:${paramAnnotations} A #${paramType}");
     }
     push(@functionHeader, " * \@error: #GError") if $raisesException || $usedToRaiseException;
+    if ($hasVariadic) {
+        my $param = @{$function->parameters}[-1];
+        my $paramName = $param->name;
+        my $paramType = GetGlibTypeName($param->type);
+        $paramType =~ s/\*$//;
+        if ($codeGenerator->IsNonPointerType($param->type)) {
+            push(@functionHeader, " * \@n_${paramName}: number of ${paramName} that will be passed");
+            push(@functionHeader, " * \@...: list of #${paramType}");
+        } else {
+            push(@functionHeader, " * \@...: list of #${paramType} ended by %NULL.");
+        }
+    }
     push(@functionHeader, " *");
     my $returnTypeName = $returnType;
     my $hasReturnTag = 0;
@@ -1206,7 +1236,7 @@
         my $paramName = $param->name;
         my $paramIDLType = $param->type;
         my $paramTypeIsPointer = !$codeGenerator->IsNonPointerType($paramIDLType);
-        if ($paramTypeIsPointer) {
+        if ($paramTypeIsPointer && !$param->isVariadic) {
             $gReturnMacro = GetGReturnMacro($paramName, $paramIDLType, $returnType, $functionName);
             push(@cBody, $gReturnMacro);
         }
@@ -1223,20 +1253,54 @@
     push(@cBody, "    WebCore::${interfaceName}* item = WebKit::core(self);\n");
 
     $returnParamName = "";
+    my $currentParameterIndex = 0;
     foreach my $param (@{$function->parameters}) {
         my $paramIDLType = $param->type;
         my $paramName = $param->name;
+        my $paramType = GetGlibTypeName($paramIDLType);
+        my $paramIsGDOMType = IsGDOMClassType($paramIDLType);
+        my $paramTypeIsPointer = !$codeGenerator->IsNonPointerType($paramIDLType);
+        my $convertedParamName = "converted" . $codeGenerator->WK_ucfirst($paramName);
 
-        my $paramIsGDOMType = IsGDOMClassType($paramIDLType);
-        $convertedParamName = "converted" . $codeGenerator->WK_ucfirst($paramName);
+        my $paramCoreType = $paramType;
+        my $paramConversionFunction = "";
         if ($paramIDLType eq "DOMString") {
-            push(@cBody, "    WTF::String ${convertedParamName} = WTF::String::fromUTF8($paramName);\n");
+            $paramCoreType = "WTF::String";
+            $paramConversionFunction = "WTF::String::fromUTF8";
         } elsif ($paramIDLType eq "NodeFilter" || $paramIDLType eq "XPathNSResolver") {
-            push(@cBody, "    RefPtr<WebCore::$paramIDLType> ${convertedParamName} = WebKit::core($paramName);\n");
+            $paramCoreType = "RefPtr<WebCore::$paramIDLType>";
+            $paramConversionFunction = "WebKit::core"
         } elsif ($paramIsGDOMType) {
-            push(@cBody, "    WebCore::${paramIDLType}* ${convertedParamName} = WebKit::core($paramName);\n");
+            $paramCoreType = "WebCore::${paramIDLType}*";
+            $paramConversionFunction = "WebKit::core"
         }
+
+        if ($param->isVariadic) {
+            my $previousParamName;
+            if ($raisesException) {
+                $previousParamName = "error";
+            } elsif ($currentParameterIndex == 0) {
+                $previousParamName = "self";
+            } else {
+                $previousParamName = @{$function->parameters}[$currentParameterIndex - 1]->name;
+            }
+            push(@cBody, "    va_list variadicParameterList;\n");
+            push(@cBody, "    Vector<$paramCoreType> $convertedParamName;\n");
+            push(@cBody, "    va_start(variadicParameterList, $previousParamName);\n");
+            if ($paramTypeIsPointer) {
+                push(@cBody, "    while ($paramType variadicParameter = va_arg(variadicParameterList, $paramType))\n");
+                push(@cBody, "        ${convertedParamName}.append(${paramConversionFunction}(variadicParameter));\n");
+            } else {
+                push(@cBody, "    ${convertedParamName}.reserveInitialCapacity(n_$paramName);\n");
+                push(@cBody, "    for (unsigned i = 0; i < n_$paramName; ++i) {\n");
+                push(@cBody, "        ${convertedParamName}.uncheckedAppend(va_arg(variadicParameterList, $paramType));\n");
+            }
+            push(@cBody, "    va_end(variadicParameterList);\n");
+        } elsif ($paramCoreType ne $paramType) {
+            push(@cBody, "    $paramCoreType $convertedParamName = ${paramConversionFunction}($paramName);\n");
+        }
         $returnParamName = $convertedParamName if $param->extendedAttributes->{"CustomReturn"};
+        $currentParameterIndex++;
     }
 
     my $assign = "";

Modified: trunk/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.cpp (202327 => 202328)


--- trunk/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.cpp	2016-06-22 08:35:03 UTC (rev 202327)
+++ trunk/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.cpp	2016-06-22 08:59:31 UTC (rev 202328)
@@ -31,6 +31,7 @@
 #include "SerializedScriptValue.h"
 #include "WebKitDOMDictionaryPrivate.h"
 #include "WebKitDOMDocumentPrivate.h"
+#include "WebKitDOMNodePrivate.h"
 #include "WebKitDOMPrivate.h"
 #include "WebKitDOMSVGPointPrivate.h"
 #include "WebKitDOMTestDictionaryPrivate.h"
@@ -2002,6 +2003,53 @@
     return result;
 }
 
+void webkit_dom_test_obj_variadic_string_method(WebKitDOMTestObj* self, const gchar* head, ...)
+{
+    WebCore::JSMainThreadNullState state;
+    g_return_if_fail(WEBKIT_DOM_IS_TEST_OBJ(self));
+    g_return_if_fail(head);
+    WebCore::TestObj* item = WebKit::core(self);
+    WTF::String convertedHead = WTF::String::fromUTF8(head);
+    va_list variadicParameterList;
+    Vector<WTF::String> convertedTail;
+    va_start(variadicParameterList, head);
+    while (gchar* variadicParameter = va_arg(variadicParameterList, gchar*))
+        convertedTail.append(WTF::String::fromUTF8(variadicParameter));
+    va_end(variadicParameterList);
+    item->variadicStringMethod(convertedHead, WTFMove(convertedTail));
+}
+
+void webkit_dom_test_obj_variadic_double_method(WebKitDOMTestObj* self, gdouble head, guint n_tail, ...)
+{
+    WebCore::JSMainThreadNullState state;
+    g_return_if_fail(WEBKIT_DOM_IS_TEST_OBJ(self));
+    WebCore::TestObj* item = WebKit::core(self);
+    va_list variadicParameterList;
+    Vector<gdouble> convertedTail;
+    va_start(variadicParameterList, head);
+    convertedTail.reserveInitialCapacity(n_tail);
+    for (unsigned i = 0; i < n_tail; ++i) {
+        convertedTail.uncheckedAppend(va_arg(variadicParameterList, gdouble));
+    va_end(variadicParameterList);
+    item->variadicDoubleMethod(head, WTFMove(convertedTail));
+}
+
+void webkit_dom_test_obj_variadic_node_method(WebKitDOMTestObj* self, WebKitDOMNode* head, ...)
+{
+    WebCore::JSMainThreadNullState state;
+    g_return_if_fail(WEBKIT_DOM_IS_TEST_OBJ(self));
+    g_return_if_fail(WEBKIT_DOM_IS_NODE(head));
+    WebCore::TestObj* item = WebKit::core(self);
+    WebCore::Node* convertedHead = WebKit::core(head);
+    va_list variadicParameterList;
+    Vector<WebCore::Node*> convertedTail;
+    va_start(variadicParameterList, head);
+    while (WebKitDOMNode* variadicParameter = va_arg(variadicParameterList, WebKitDOMNode*))
+        convertedTail.append(WebKit::core(variadicParameter));
+    va_end(variadicParameterList);
+    item->variadicNodeMethod(*convertedHead, WTFMove(convertedTail));
+}
+
 void webkit_dom_test_obj_any(WebKitDOMTestObj* self, gfloat a, glong b)
 {
     WebCore::JSMainThreadNullState state;

Modified: trunk/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.h (202327 => 202328)


--- trunk/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.h	2016-06-22 08:35:03 UTC (rev 202327)
+++ trunk/Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.h	2016-06-22 08:59:31 UTC (rev 202328)
@@ -911,6 +911,40 @@
 webkit_dom_test_obj_strict_function_with_array(WebKitDOMTestObj* self, WebKitDOMTestObj* objArg, glong array, GError** error);
 
 /**
+ * webkit_dom_test_obj_variadic_string_method:
+ * @self: A #WebKitDOMTestObj
+ * @head: A #gchar
+ * @...: list of #gchar ended by %NULL.
+ *
+ * Stability: Unstable
+**/
+WEBKIT_API void
+webkit_dom_test_obj_variadic_string_method(WebKitDOMTestObj* self, const gchar* head, ...);
+
+/**
+ * webkit_dom_test_obj_variadic_double_method:
+ * @self: A #WebKitDOMTestObj
+ * @head: A #gdouble
+ * @n_tail: number of tail that will be passed
+ * @...: list of #gdouble
+ *
+ * Stability: Unstable
+**/
+WEBKIT_API void
+webkit_dom_test_obj_variadic_double_method(WebKitDOMTestObj* self, gdouble head, guint n_tail, ...);
+
+/**
+ * webkit_dom_test_obj_variadic_node_method:
+ * @self: A #WebKitDOMTestObj
+ * @head: A #WebKitDOMNode
+ * @...: list of #WebKitDOMNode ended by %NULL.
+ *
+ * Stability: Unstable
+**/
+WEBKIT_API void
+webkit_dom_test_obj_variadic_node_method(WebKitDOMTestObj* self, WebKitDOMNode* head, ...);
+
+/**
  * webkit_dom_test_obj_any:
  * @self: A #WebKitDOMTestObj
  * @a: A #gfloat
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to