From 70420bfdf4fb498abbc1be3b7ab049d530f901b7 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Fri, 23 May 2014 17:32:39 -0400 Subject: [PATCH] Bug 1007878 part 5. Implement callback codegen for MozMap. r=khuey --- dom/bindings/Codegen.py | 35 ++++++++++++++---- dom/bindings/test/TestCodeGen.webidl | 2 ++ dom/bindings/test/TestExampleGen.webidl | 46 ++++++++++++++++++++++++ dom/bindings/test/TestJSImplGen.webidl | 48 +++++++++++++++++++++++++ 4 files changed, 125 insertions(+), 6 deletions(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 1bf2b282a24a..b75382df313d 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -3874,19 +3874,25 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, "${declName}.SetNull();\n", notMozMap) + declType = typeName + declArgs = None + holderType = None + holderArgs = None # MozMap arguments that might contain traceable things need # to get traced - if not isMember and typeNeedsRooting(valueType): + if not isMember and isCallbackReturnValue: + # Go ahead and just convert directly into our actual return value + declType = CGWrapper(declType, post="&") + declArgs = "aRetVal" + elif not isMember and typeNeedsRooting(valueType): holderType = CGTemplatedType("MozMapRooter", valueInfo.declType) # If our MozMap is nullable, this will set the Nullable to be # not-null, but that's ok because we make an explicit SetNull() call # on it as needed if our JS value is actually null. holderArgs = "cx, &%s" % mozMapRef - else: - holderType = None - holderArgs = None - return JSToNativeConversionInfo(templateBody, declType=typeName, + return JSToNativeConversionInfo(templateBody, declType=declType, + declArgs=declArgs, holderType=holderType, dealWithOptional=isOptional, holderArgs=holderArgs) @@ -11534,6 +11540,13 @@ class CGNativeMember(ClassMethod): else: returnCode = "aRetVal.SwapElements(${declName});\n" return "void", "", returnCode + if type.isMozMap(): + # If we want to handle MozMap-of-MozMap return values, we're + # going to need to fix example codegen to not produce MozMap + # for the relevant argument... + assert not isMember + # In this case we convert directly into our outparam to start with + return "void", "", "" if type.isDate(): result = CGGeneric("Date") if type.nullable(): @@ -11628,7 +11641,8 @@ class CGNativeMember(ClassMethod): is a const ref, as well as whether the type should be wrapped in Nullable as needed. - isMember can be false or one of the strings "Sequence" or "Variadic" + isMember can be false or one of the strings "Sequence", "Variadic", + "MozMap" """ if type.isArray(): raise TypeError("Can't handle array arguments yet") @@ -11642,6 +11656,15 @@ class CGNativeMember(ClassMethod): decl = CGTemplatedType("Sequence", argType) return decl.define(), True, True + if type.isMozMap(): + nullable = type.nullable() + if nullable: + type = type.inner + elementType = type.inner + argType = self.getArgType(elementType, False, "MozMap")[0] + decl = CGTemplatedType("MozMap", argType) + return decl.define(), True, True + if type.isUnion(): # unionTypeDecl will handle nullable types, so return False for # auto-wrapping in Nullable diff --git a/dom/bindings/test/TestCodeGen.webidl b/dom/bindings/test/TestCodeGen.webidl index c9881d215457..252e2c5fd1a0 100644 --- a/dom/bindings/test/TestCodeGen.webidl +++ b/dom/bindings/test/TestCodeGen.webidl @@ -21,6 +21,7 @@ callback interface TestCallbackInterface { long doSomethingElse(DOMString arg, TestInterface otherArg); void doSequenceLongArg(sequence arg); void doSequenceStringArg(sequence arg); + void doMozMapLongArg(MozMap arg); sequence getSequenceOfLong(); sequence getSequenceOfInterfaces(); sequence? getNullableSequenceOfInterfaces(); @@ -30,6 +31,7 @@ callback interface TestCallbackInterface { sequence? getNullableSequenceOfCallbackInterfaces(); sequence getSequenceOfNullableCallbackInterfaces(); sequence? getNullableSequenceOfNullableCallbackInterfaces(); + MozMap getMozMapOfLong(); Dict? getDictionary(); }; diff --git a/dom/bindings/test/TestExampleGen.webidl b/dom/bindings/test/TestExampleGen.webidl index 9ce65191d8a1..157de5bd9343 100644 --- a/dom/bindings/test/TestExampleGen.webidl +++ b/dom/bindings/test/TestExampleGen.webidl @@ -255,6 +255,33 @@ interface TestExampleInterface { //XXXbz No support for sequence of sequence return values yet. //sequence> receiveSequenceOfSequences(); + // MozMap types + void passMozMap(MozMap arg); + void passNullableMozMap(MozMap? arg); + void passMozMapOfNullableInts(MozMap arg); + void passOptionalMozMapOfNullableInts(optional MozMap arg); + void passOptionalNullableMozMapOfNullableInts(optional MozMap? arg); + void passCastableObjectMozMap(MozMap arg); + void passNullableCastableObjectMozMap(MozMap arg); + void passCastableObjectNullableMozMap(MozMap? arg); + void passNullableCastableObjectNullableMozMap(MozMap? arg); + void passOptionalMozMap(optional MozMap arg); + void passOptionalNullableMozMap(optional MozMap? arg); + void passOptionalNullableMozMapWithDefaultValue(optional MozMap? arg = null); + void passOptionalObjectMozMap(optional MozMap arg); + void passExternalInterfaceMozMap(MozMap arg); + void passNullableExternalInterfaceMozMap(MozMap arg); + void passStringMozMap(MozMap arg); + void passByteStringMozMap(MozMap arg); + void passMozMapOfMozMaps(MozMap> arg); + MozMap receiveMozMap(); + MozMap? receiveNullableMozMap(); + MozMap receiveMozMapOfNullableInts(); + MozMap? receiveNullableMozMapOfNullableInts(); + //XXXbz No support for MozMap of MozMaps return values yet. + //MozMap> receiveMozMapOfMozMaps(); + MozMap receiveAnyMozMap(); + // Typed array types void passArrayBuffer(ArrayBuffer arg); void passNullableArrayBuffer(ArrayBuffer? arg); @@ -273,6 +300,8 @@ interface TestExampleInterface { void passFloat64Array(Float64Array arg); void passSequenceOfArrayBuffers(sequence arg); void passSequenceOfNullableArrayBuffers(sequence arg); + void passMozMapOfArrayBuffers(MozMap arg); + void passMozMapOfNullableArrayBuffers(MozMap arg); void passVariadicTypedArray(Float32Array... arg); void passVariadicNullableTypedArray(Float32Array?... arg); Uint8Array receiveUint8Array(); @@ -332,6 +361,17 @@ interface TestExampleInterface { void passSequenceOfNullableSequenceOfAny(sequence?> arg); void passNullableSequenceOfNullableSequenceOfAny(sequence?>? arg); void passOptionalNullableSequenceOfNullableSequenceOfAny(optional sequence?>? arg); + void passMozMapOfAny(MozMap arg); + void passNullableMozMapOfAny(MozMap? arg); + void passOptionalMozMapOfAny(optional MozMap arg); + void passOptionalNullableMozMapOfAny(optional MozMap? arg); + void passOptionalMozMapOfAnyWithDefaultValue(optional MozMap? arg = null); + void passMozMapOfMozMapOfAny(MozMap> arg); + void passMozMapOfNullableMozMapOfAny(MozMap?> arg); + void passNullableMozMapOfNullableMozMapOfAny(MozMap?>? arg); + void passOptionalNullableMozMapOfNullableMozMapOfAny(optional MozMap?>? arg); + void passOptionalNullableMozMapOfNullableSequenceOfAny(optional MozMap?>? arg); + void passOptionalNullableSequenceOfNullableMozMapOfAny(optional sequence?>? arg); any receiveAny(); // object types @@ -347,6 +387,7 @@ interface TestExampleInterface { void passNullableSequenceOfObject(sequence? arg); void passOptionalNullableSequenceOfNullableSequenceOfObject(optional sequence?>? arg); void passOptionalNullableSequenceOfNullableSequenceOfNullableObject(optional sequence?>? arg); + void passMozMapOfObject(MozMap arg); object receiveObject(); object? receiveNullableObject(); @@ -420,6 +461,9 @@ interface TestExampleInterface { void passSequenceOfNullableUnions(sequence<(CanvasPattern or CanvasGradient)?> arg); void passVariadicNullableUnion((CanvasPattern or CanvasGradient)?... arg); + void passMozMapOfUnions(MozMap<(CanvasPattern or CanvasGradient)> arg); + // XXXbz no move constructor on some unions + // void passMozMapOfUnions2(MozMap<(object or long)> arg); //(CanvasPattern or CanvasGradient) receiveUnion(); //(object or long) receiveUnion2(); @@ -439,6 +483,7 @@ interface TestExampleInterface { void passOptionalNullableDateWithDefaultValue(optional Date? arg = null); void passDateSequence(sequence arg); void passNullableDateSequence(sequence arg); + void passDateMozMap(MozMap arg); Date receiveDate(); Date? receiveNullableDate(); @@ -465,6 +510,7 @@ interface TestExampleInterface { Dict? receiveNullableDictionary(); void passOtherDictionary(optional GrandparentDict x); void passSequenceOfDictionaries(sequence x); + void passMozMapOfDictionaries(MozMap x); // No support for nullable dictionaries inside a sequence (nor should there be) // void passSequenceOfNullableDictionaries(sequence x); void passDictionaryOrLong(optional Dict x); diff --git a/dom/bindings/test/TestJSImplGen.webidl b/dom/bindings/test/TestJSImplGen.webidl index 016b67333c56..fad6a1703312 100644 --- a/dom/bindings/test/TestJSImplGen.webidl +++ b/dom/bindings/test/TestJSImplGen.webidl @@ -271,8 +271,36 @@ interface TestJSImplInterface { sequence receiveNullableObjectSequence(); void passSequenceOfSequences(sequence> arg); + //XXXbz No support for sequence of sequence return values yet. //sequence> receiveSequenceOfSequences(); + // MozMap types + void passMozMap(MozMap arg); + void passNullableMozMap(MozMap? arg); + void passMozMapOfNullableInts(MozMap arg); + void passOptionalMozMapOfNullableInts(optional MozMap arg); + void passOptionalNullableMozMapOfNullableInts(optional MozMap? arg); + void passCastableObjectMozMap(MozMap arg); + void passNullableCastableObjectMozMap(MozMap arg); + void passCastableObjectNullableMozMap(MozMap? arg); + void passNullableCastableObjectNullableMozMap(MozMap? arg); + void passOptionalMozMap(optional MozMap arg); + void passOptionalNullableMozMap(optional MozMap? arg); + void passOptionalNullableMozMapWithDefaultValue(optional MozMap? arg = null); + void passOptionalObjectMozMap(optional MozMap arg); + void passExternalInterfaceMozMap(MozMap arg); + void passNullableExternalInterfaceMozMap(MozMap arg); + void passStringMozMap(MozMap arg); + void passByteStringMozMap(MozMap arg); + void passMozMapOfMozMaps(MozMap> arg); + MozMap receiveMozMap(); + MozMap? receiveNullableMozMap(); + MozMap receiveMozMapOfNullableInts(); + MozMap? receiveNullableMozMapOfNullableInts(); + //XXXbz No support for MozMap of MozMaps return values yet. + //MozMap> receiveMozMapOfMozMaps(); + MozMap receiveAnyMozMap(); + // ArrayBuffer is handled differently in callback interfaces and the example generator. // Need to figure out what should be done there. Seems like other typed array stuff is // similarly not working in the JS implemented generator. Probably some other issues @@ -295,6 +323,8 @@ interface TestJSImplInterface { //void passFloat64Array(Float64Array arg); //void passSequenceOfArrayBuffers(sequence arg); //void passSequenceOfNullableArrayBuffers(sequence arg); + //void passMozMapOfArrayBuffers(MozMap arg); + //void passMozMapOfNullableArrayBuffers(MozMap arg); //void passVariadicTypedArray(Float32Array... arg); //void passVariadicNullableTypedArray(Float32Array?... arg); //Uint8Array receiveUint8Array(); @@ -355,8 +385,20 @@ interface TestJSImplInterface { void passSequenceOfNullableSequenceOfAny(sequence?> arg); void passNullableSequenceOfNullableSequenceOfAny(sequence?>? arg); void passOptionalNullableSequenceOfNullableSequenceOfAny(optional sequence?>? arg); + void passMozMapOfAny(MozMap arg); + void passNullableMozMapOfAny(MozMap? arg); + void passOptionalMozMapOfAny(optional MozMap arg); + void passOptionalNullableMozMapOfAny(optional MozMap? arg); + void passOptionalMozMapOfAnyWithDefaultValue(optional MozMap? arg = null); + void passMozMapOfMozMapOfAny(MozMap> arg); + void passMozMapOfNullableMozMapOfAny(MozMap?> arg); + void passNullableMozMapOfNullableMozMapOfAny(MozMap?>? arg); + void passOptionalNullableMozMapOfNullableMozMapOfAny(optional MozMap?>? arg); + void passOptionalNullableMozMapOfNullableSequenceOfAny(optional MozMap?>? arg); + void passOptionalNullableSequenceOfNullableMozMapOfAny(optional sequence?>? arg); any receiveAny(); + // object types void passObject(object arg); void passVariadicObject(object... arg); void passNullableObject(object? arg); @@ -369,6 +411,7 @@ interface TestJSImplInterface { void passNullableSequenceOfObject(sequence? arg); void passOptionalNullableSequenceOfNullableSequenceOfObject(optional sequence?>? arg); void passOptionalNullableSequenceOfNullableSequenceOfNullableObject(optional sequence?>? arg); + void passMozMapOfObject(MozMap arg); object receiveObject(); object? receiveNullableObject(); @@ -442,6 +485,9 @@ interface TestJSImplInterface { void passSequenceOfNullableUnions(sequence<(CanvasPattern or CanvasGradient)?> arg); void passVariadicNullableUnion((CanvasPattern or CanvasGradient)?... arg); + void passMozMapOfUnions(MozMap<(CanvasPattern or CanvasGradient)> arg); + // XXXbz no move constructor on some unions + // void passMozMapOfUnions2(MozMap<(object or long)> arg); //(CanvasPattern or CanvasGradient) receiveUnion(); //(object or long) receiveUnion2(); @@ -461,6 +507,7 @@ interface TestJSImplInterface { void passOptionalNullableDateWithDefaultValue(optional Date? arg = null); void passDateSequence(sequence arg); void passNullableDateSequence(sequence arg); + void passDateMozMap(MozMap arg); Date receiveDate(); Date? receiveNullableDate(); @@ -487,6 +534,7 @@ interface TestJSImplInterface { Dict? receiveNullableDictionary(); void passOtherDictionary(optional GrandparentDict x); void passSequenceOfDictionaries(sequence x); + void passMozMapOfDictionaries(MozMap x); // No support for nullable dictionaries inside a sequence (nor should there be) // void passSequenceOfNullableDictionaries(sequence x); void passDictionaryOrLong(optional Dict x);