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