Bug 804738 part 1. Fix codegen for named operations to be consistent about the naming of the string argument. r=peterv

This commit is contained in:
Boris Zbarsky 2012-11-06 08:00:57 -08:00
parent 2bceb7136d
commit f7a97d85d7
4 changed files with 58 additions and 57 deletions

View File

@ -564,6 +564,11 @@ DOMInterfaces = {
'register': False
},
'TestIndexedGetterAndSetterAndNamedGetterInterface' : {
'headerFile': 'TestBindingHeader.h',
'register': False
},
'TestIndexedAndNamedGetterInterface' : {
'headerFile': 'TestBindingHeader.h',
'register': False

View File

@ -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 = ""

View File

@ -616,6 +616,22 @@ public:
void GetSupportedNames(nsTArray<nsString>&);
};
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<nsString>&);
int32_t IndexedGetter(uint32_t, bool&);
void IndexedSetter(uint32_t, int32_t);
uint32_t Length();
};
class TestIndexedAndNamedGetterInterface : public nsISupports,
public nsWrapperCache
{

View File

@ -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);
};