From f7a97d85d77ec8eb16597d19b020221a413eaf2a Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 6 Nov 2012 08:00:57 -0800 Subject: [PATCH] Bug 804738 part 1. Fix codegen for named operations to be consistent about the naming of the string argument. r=peterv --- dom/bindings/Bindings.conf | 5 ++ dom/bindings/Codegen.py | 86 ++++++++++----------------- dom/bindings/test/TestBindingHeader.h | 16 +++++ dom/bindings/test/TestCodeGen.webidl | 8 ++- 4 files changed, 58 insertions(+), 57 deletions(-) diff --git a/dom/bindings/Bindings.conf b/dom/bindings/Bindings.conf index e13568c98f5f..6a1993cd64b4 100644 --- a/dom/bindings/Bindings.conf +++ b/dom/bindings/Bindings.conf @@ -564,6 +564,11 @@ DOMInterfaces = { 'register': False }, +'TestIndexedGetterAndSetterAndNamedGetterInterface' : { + 'headerFile': 'TestBindingHeader.h', + 'register': False + }, + 'TestIndexedAndNamedGetterInterface' : { 'headerFile': 'TestBindingHeader.h', 'register': False diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 38faf69351a5..a581c283a934 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -5077,7 +5077,27 @@ class CGProxyIndexedSetter(CGProxySpecialOperation): def __init__(self, descriptor): CGProxySpecialOperation.__init__(self, descriptor, 'IndexedSetter') -class CGProxyNamedGetter(CGProxySpecialOperation): +class CGProxyNamedOperation(CGProxySpecialOperation): + """ + Class to generate a call to a named operation. + """ + def __init__(self, descriptor, name): + CGProxySpecialOperation.__init__(self, descriptor, name) + def define(self): + # Our first argument is the id we're getting. + argName = self.arguments[0].identifier.name + return (("JS::Value nameVal = STRING_TO_JSVAL(JSID_TO_STRING(id));\n" + "FakeDependentString %s;\n" + "if (!ConvertJSValueToString(cx, nameVal, &nameVal,\n" + " eStringify, eStringify, %s)) {\n" + " return false;\n" + "}\n" + "\n" + "%s* self = UnwrapProxy(proxy);\n" % + (argName, argName, self.descriptor.nativeType)) + + CGProxySpecialOperation.define(self)) + +class CGProxyNamedGetter(CGProxyNamedOperation): """ Class to generate a call to an named getter. If templateValues is not None the returned value will be wrapped with wrapForType using templateValues. @@ -5095,7 +5115,7 @@ class CGProxyNamedPresenceChecker(CGProxyNamedGetter): def __init__(self, descriptor): CGProxyNamedGetter.__init__(self, descriptor) -class CGProxyNamedSetter(CGProxySpecialOperation): +class CGProxyNamedSetter(CGProxyNamedOperation): """ Class to generate a call to a named setter. """ @@ -5109,7 +5129,7 @@ class CGProxyIndexedDeleter(CGProxySpecialOperation): def __init__(self, descriptor): CGProxySpecialOperation.__init__(self, descriptor, 'IndexedDeleter') -class CGProxyNamedDeleter(CGProxySpecialOperation): +class CGProxyNamedDeleter(CGProxyNamedOperation): """ Class to generate a call to a named deleter. """ @@ -5218,16 +5238,8 @@ class CGDOMJSProxyHandler_getOwnPropertyDescriptor(ClassMethod): # properties that shadow prototype properties. namedGet = ("\n" + "if (!set && JSID_IS_STRING(id) && !HasPropertyOnPrototype(cx, proxy, this, id)) {\n" + - " JS::Value nameVal = STRING_TO_JSVAL(JSID_TO_STRING(id));\n" + - " FakeDependentString name;\n" - " if (!ConvertJSValueToString(cx, nameVal, &nameVal,\n" + - " eStringify, eStringify, name)) {\n" + - " return false;\n" + - " }\n" + - "\n" + - " %s* self = UnwrapProxy(proxy);\n" + CGIndenter(CGProxyNamedGetter(self.descriptor, templateValues)).define() + "\n" + - "}\n") % (self.descriptor.nativeType) + "}\n") else: namedGet = "" @@ -5277,31 +5289,16 @@ class CGDOMJSProxyHandler_defineProperty(ClassMethod): if not self.descriptor.operations['NamedCreator'] is namedSetter: raise TypeError("Can't handle creator that's different from the setter") set += ("if (JSID_IS_STRING(id)) {\n" + - " JS::Value nameVal = STRING_TO_JSVAL(JSID_TO_STRING(id));\n" + - " FakeDependentString name;\n" - " if (!ConvertJSValueToString(cx, nameVal, &nameVal,\n" + - " eStringify, eStringify, name)) {\n" + - " return false;\n" + - " }\n" + - "\n" + - " %s* self = UnwrapProxy(proxy);\n" + CGIndenter(CGProxyNamedSetter(self.descriptor)).define() + "\n" + " return true;\n" + - "}\n") % (self.descriptor.nativeType) + "}\n") elif self.descriptor.supportsNamedProperties(): set += ("if (JSID_IS_STRING(id)) {\n" + - " JS::Value nameVal = STRING_TO_JSVAL(JSID_TO_STRING(id));\n" + - " FakeDependentString name;\n" - " if (!ConvertJSValueToString(cx, nameVal, &nameVal,\n" + - " eStringify, eStringify, name)) {\n" + - " return false;\n" + - " }\n" + - " %s* self = UnwrapProxy(proxy);\n" + CGIndenter(CGProxyNamedPresenceChecker(self.descriptor)).define() + " if (found) {\n" " return ThrowErrorMessage(cx, MSG_NO_PROPERTY_SETTER, \"%s\");\n" + " }\n" + - "}\n") % (self.descriptor.nativeType, self.descriptor.name) + "}\n") % (self.descriptor.name) return set + """return mozilla::dom::DOMProxyHandler::defineProperty(%s);""" % ", ".join(a.name for a in self.args) class CGDOMJSProxyHandler_delete(ClassMethod): @@ -5359,19 +5356,12 @@ class CGDOMJSProxyHandler_delete(ClassMethod): namedBody = getDeleterBody("Named") if namedBody is not None: - delete += ("if (JSID_IS_STRING(id) && !HasPropertyOnPrototype(cx, proxy, this, id)) {\n" - " jsval nameVal = STRING_TO_JSVAL(JSID_TO_STRING(id));\n" + - " FakeDependentString name;\n" - " if (!ConvertJSValueToString(cx, nameVal, &nameVal,\n" + - " eStringify, eStringify, name)) {\n" + - " return false;\n" + - " }\n" + - " %s* self = UnwrapProxy(proxy);\n" + + delete += ("if (JSID_IS_STRING(id) && !HasPropertyOnPrototype(cx, proxy, this, id)) {\n" + CGIndenter(CGGeneric(namedBody)).define() + "\n" " if (found) {\n" " return true;\n" " }\n" - "}\n") % self.descriptor.nativeType + "}\n") delete += "return dom::DOMProxyHandler::delete_(cx, proxy, id, bp);"; @@ -5437,19 +5427,11 @@ class CGDOMJSProxyHandler_hasOwn(ClassMethod): if self.descriptor.supportsNamedProperties(): named = ("if (JSID_IS_STRING(id) && !HasPropertyOnPrototype(cx, proxy, this, id)) {\n" + - " jsval nameVal = STRING_TO_JSVAL(JSID_TO_STRING(id));\n" + - " FakeDependentString name;\n" - " if (!ConvertJSValueToString(cx, nameVal, &nameVal,\n" + - " eStringify, eStringify, name)) {\n" + - " return false;\n" + - " }\n" + - "\n" + - " %s* self = UnwrapProxy(proxy);\n" + CGIndenter(CGProxyNamedPresenceChecker(self.descriptor)).define() + "\n" + " *bp = found;\n" " return true;\n" "}\n" + - "\n") % (self.descriptor.nativeType) + "\n") else: named = "" @@ -5505,16 +5487,8 @@ if (expando) { if self.descriptor.supportsNamedProperties(): getNamed = ("if (JSID_IS_STRING(id)) {\n" + - " JS::Value nameVal = STRING_TO_JSVAL(JSID_TO_STRING(id));\n" + - " FakeDependentString name;\n" - " if (!ConvertJSValueToString(cx, nameVal, &nameVal,\n" + - " eStringify, eStringify, name)) {\n" + - " return false;\n" + - " }\n" + - "\n" + - " %s* self = UnwrapProxy(proxy);\n" + CGIndenter(CGProxyNamedGetter(self.descriptor, templateValues)).define() + - "}\n") % (self.descriptor.nativeType) + "}\n") else: getNamed = "" diff --git a/dom/bindings/test/TestBindingHeader.h b/dom/bindings/test/TestBindingHeader.h index 51b00e44787e..91d45958a669 100644 --- a/dom/bindings/test/TestBindingHeader.h +++ b/dom/bindings/test/TestBindingHeader.h @@ -616,6 +616,22 @@ public: void GetSupportedNames(nsTArray&); }; +class TestIndexedGetterAndSetterAndNamedGetterInterface : public nsISupports, + public nsWrapperCache +{ +public: + NS_DECL_ISUPPORTS + + // We need a GetParentObject to make binding codegen happy + virtual nsISupports* GetParentObject(); + + void NamedGetter(const nsAString&, bool&, nsAString&); + void GetSupportedNames(nsTArray&); + int32_t IndexedGetter(uint32_t, bool&); + void IndexedSetter(uint32_t, int32_t); + uint32_t Length(); +}; + class TestIndexedAndNamedGetterInterface : public nsISupports, public nsWrapperCache { diff --git a/dom/bindings/test/TestCodeGen.webidl b/dom/bindings/test/TestCodeGen.webidl index e0fb1f4a8df6..494441545d61 100644 --- a/dom/bindings/test/TestCodeGen.webidl +++ b/dom/bindings/test/TestCodeGen.webidl @@ -432,6 +432,12 @@ interface TestNamedGetterInterface { getter DOMString (DOMString name); }; +interface TestIndexedGetterAndSetterAndNamedGetterInterface { + getter DOMString (DOMString myName); + getter long (unsigned long index); + setter creator void (unsigned long index, long arg); +}; + interface TestIndexedAndNamedGetterInterface { getter long (unsigned long index); getter DOMString namedItem(DOMString name); @@ -444,7 +450,7 @@ interface TestIndexedSetterInterface { }; interface TestNamedSetterInterface { - setter creator void (DOMString name, TestIndexedSetterInterface item); + setter creator void (DOMString myName, TestIndexedSetterInterface item); getter TestIndexedSetterInterface (DOMString name); };