diff --git a/dom/bindings/parser/WebIDL.py b/dom/bindings/parser/WebIDL.py index a786baf8df6..7173f389d97 100644 --- a/dom/bindings/parser/WebIDL.py +++ b/dom/bindings/parser/WebIDL.py @@ -1892,7 +1892,7 @@ class IDLMethod(IDLInterfaceMember, IDLScope): assert self._arguments[0][0].type == BuiltinTypes[IDLBuiltinType.Types.domstring] or \ self._arguments[0][0].type == BuiltinTypes[IDLBuiltinType.Types.unsigned_long] assert not self._arguments[0][0].optional and not self._arguments[0][0].variadic - assert not self._returnType[0].isVoid() + assert not self._getter or not self._returnType[0].isVoid() if self._setter or self._creator: assert len(self._arguments[0]) == 2 @@ -1900,7 +1900,6 @@ class IDLMethod(IDLInterfaceMember, IDLScope): self._arguments[0][0].type == BuiltinTypes[IDLBuiltinType.Types.unsigned_long] assert not self._arguments[0][0].optional and not self._arguments[0][0].variadic assert not self._arguments[0][1].optional and not self._arguments[0][1].variadic - assert self._arguments[0][1].type == self._returnType[0] if self._stringifier: assert len(self._arguments[0]) == 0 @@ -2573,13 +2572,6 @@ class Parser(Tokenizer): """ p[0] = False - def p_AttributeOrOperationStringifier(self, p): - """ - AttributeOrOperation : STRINGIFIER StringifierAttributeOrOperation - """ - assert False # Not implemented - pass - def p_AttributeOrOperation(self, p): """ AttributeOrOperation : Attribute @@ -2587,14 +2579,6 @@ class Parser(Tokenizer): """ p[0] = p[1] - def p_StringifierAttributeOrOperation(self, p): - """ - StringifierAttributeOrOperation : Attribute - | OperationRest - | SEMICOLON - """ - pass - def p_Attribute(self, p): """ Attribute : Inherit ReadOnly ATTRIBUTE AttributeType IDENTIFIER SEMICOLON @@ -2651,6 +2635,7 @@ class Parser(Tokenizer): creator = True if IDLMethod.Special.Creator in p[1] else False deleter = True if IDLMethod.Special.Deleter in p[1] else False legacycaller = True if IDLMethod.Special.LegacyCaller in p[1] else False + stringifier = True if IDLMethod.Special.Stringifier in p[1] else False if getter or deleter: if setter or creator: @@ -2682,9 +2667,9 @@ class Parser(Tokenizer): ("getter" if getter else "deleter", "optional" if arguments[0].optional else "variadic"), arguments[0].location) + if getter: if returnType.isVoid(): - raise WebIDLError("%s cannot have void return type" % - ("getter" if getter else "deleter"), + raise WebIDLError("getter cannot have void return type", self.getLocation(p, 2)) if setter or creator: if len(arguments) != 2: @@ -2710,13 +2695,13 @@ class Parser(Tokenizer): ("setter" if setter else "creator", "optional" if arguments[1].optional else "variadic"), arguments[1].location) - if returnType.isVoid(): - raise WebIDLError("%s cannot have void return type" % - ("setter" if setter else "creator"), + + if stringifier: + if len(arguments) != 0: + raise WebIDLError("stringifier has wrong number of arguments", self.getLocation(p, 2)) - if not arguments[1].type == returnType: - raise WebIDLError("%s return type and second argument type must match" % - ("setter" if setter else "creator"), + if not returnType.isString(): + raise WebIDLError("stringifier must have string return type", self.getLocation(p, 2)) inOptionalArguments = False @@ -2735,27 +2720,27 @@ class Parser(Tokenizer): variadicArgument = argument if argument.variadic else None # identifier might be None. This is only permitted for special methods. - # NB: Stringifiers are handled elsewhere. if not identifier: if not getter and not setter and not creator and \ - not deleter and not legacycaller: + not deleter and not legacycaller and not stringifier: raise WebIDLError("Identifier required for non-special methods", self.getLocation(p, 2)) location = BuiltinLocation("") - identifier = IDLUnresolvedIdentifier(location, "__%s%s%s%s%s%s" % + identifier = IDLUnresolvedIdentifier(location, "__%s%s%s%s%s%s%s" % ("named" if specialType == IDLMethod.NamedOrIndexed.Named else \ "indexed" if specialType == IDLMethod.NamedOrIndexed.Indexed else "", "getter" if getter else "", "setter" if setter else "", "deleter" if deleter else "", "creator" if creator else "", - "legacycaller" if legacycaller else ""), allowDoubleUnderscore=True) + "legacycaller" if legacycaller else "", + "stringifier" if stringifier else ""), allowDoubleUnderscore=True) method = IDLMethod(self.getLocation(p, 2), identifier, returnType, arguments, static=static, getter=getter, setter=setter, creator=creator, deleter=deleter, specialType=specialType, - legacycaller=legacycaller, stringifier=False) + legacycaller=legacycaller, stringifier=stringifier) p[0] = method def p_QualifiersStatic(self, p): @@ -2813,6 +2798,12 @@ class Parser(Tokenizer): """ p[0] = IDLMethod.Special.LegacyCaller + def p_SpecialStringifier(self, p): + """ + Special : STRINGIFIER + """ + p[0] = IDLMethod.Special.Stringifier + def p_OperationRest(self, p): """ OperationRest : ReturnType OptionalIdentifier LPAREN ArgumentList RPAREN SEMICOLON diff --git a/dom/bindings/parser/tests/test_special_method_signature_mismatch.py b/dom/bindings/parser/tests/test_special_method_signature_mismatch.py index f6033db9239..5ea1743d36a 100644 --- a/dom/bindings/parser/tests/test_special_method_signature_mismatch.py +++ b/dom/bindings/parser/tests/test_special_method_signature_mismatch.py @@ -97,20 +97,6 @@ def WebIDLTest(parser, harness): harness.ok(threw, "Should have thrown.") - threw = False - try: - parser.parse(""" - interface SpecialMethodSignatureMismatch8 { - deleter void foo(unsigned long index); - }; - """) - - results = parser.finish() - except: - threw = True - - harness.ok(threw, "Should have thrown.") - threw = False try: parser.parse(""" @@ -181,20 +167,6 @@ def WebIDLTest(parser, harness): harness.ok(threw, "Should have thrown.") - threw = False - try: - parser.parse(""" - interface SpecialMethodSignatureMismatch14 { - setter void foo(unsigned long index, long long value); - }; - """) - - results = parser.finish() - except: - threw = True - - harness.ok(threw, "Should have thrown.") - threw = False try: parser.parse(""" @@ -251,20 +223,6 @@ def WebIDLTest(parser, harness): harness.ok(threw, "Should have thrown.") - threw = False - try: - parser.parse(""" - interface SpecialMethodSignatureMismatch19 { - setter boolean foo(unsigned long index, long long value); - }; - """) - - results = parser.finish() - except: - threw = True - - harness.ok(threw, "Should have thrown.") - threw = False try: parser.parse(""" @@ -279,20 +237,6 @@ def WebIDLTest(parser, harness): harness.ok(threw, "Should have thrown.") - threw = False - try: - parser.parse(""" - interface SpecialMethodSignatureMismatch21 { - creator void foo(unsigned long index, long long value); - }; - """) - - results = parser.finish() - except: - threw = True - - harness.ok(threw, "Should have thrown.") - threw = False try: parser.parse(""" @@ -348,17 +292,3 @@ def WebIDLTest(parser, harness): threw = True harness.ok(threw, "Should have thrown.") - - threw = False - try: - parser.parse(""" - interface SpecialMethodSignatureMismatch26 { - creator boolean foo(unsigned long index, long long value); - }; - """) - - results = parser.finish() - except: - threw = True - - harness.ok(threw, "Should have thrown.") \ No newline at end of file