mirror of
https://github.com/servo/servo.git
synced 2025-07-24 15:50:21 +01:00
Add stringifier method support to CodegenRust.py (fixes #1986)
Add a stringifier to URLUtils (Location). (fixes #4605) wpt metadata updates for #4605
This commit is contained in:
parent
d1c8ed4359
commit
00f863b4fe
6 changed files with 69 additions and 52 deletions
|
@ -68,6 +68,13 @@ def stripTrailingWhitespace(text):
|
|||
return '\n'.join(lines) + tail
|
||||
|
||||
def MakeNativeName(name):
|
||||
# The gecko counterpart to this file uses the BinaryName machinery
|
||||
# for this purpose (#4435 is the servo issue for BinaryName).
|
||||
replacements = {
|
||||
"__stringifier": "Stringify",
|
||||
}
|
||||
if name in replacements:
|
||||
return replacements[name]
|
||||
return name[0].upper() + name[1:]
|
||||
|
||||
builtinNames = {
|
||||
|
@ -1182,13 +1189,25 @@ class MethodDefiner(PropertyDefiner):
|
|||
"length": 0,
|
||||
"flags": "JSPROP_ENUMERATE" })
|
||||
|
||||
if not static:
|
||||
stringifier = descriptor.operations['Stringifier']
|
||||
if stringifier:
|
||||
self.regular.append({
|
||||
"name": "toString",
|
||||
"nativeName": stringifier.identifier.name,
|
||||
"length": 0,
|
||||
"flags": "JSPROP_ENUMERATE"
|
||||
})
|
||||
|
||||
|
||||
def generateArray(self, array, name):
|
||||
if len(array) == 0:
|
||||
return ""
|
||||
|
||||
def specData(m):
|
||||
if m.get("methodInfo", True):
|
||||
jitinfo = ("&%s_methodinfo" % m["name"])
|
||||
identifier = m.get("nativeName", m["name"])
|
||||
jitinfo = "&%s_methodinfo" % identifier
|
||||
accessor = "genericMethod as NonNullJSNative"
|
||||
else:
|
||||
jitinfo = "0 as *const JSJitInfo"
|
||||
|
@ -4056,8 +4075,8 @@ class CGInterfaceTrait(CGThing):
|
|||
|
||||
def members():
|
||||
for m in descriptor.interface.members:
|
||||
if m.isMethod() and not m.isStatic() \
|
||||
and not m.isIdentifierLess():
|
||||
if (m.isMethod() and not m.isStatic() and
|
||||
(not m.isIdentifierLess() or m.isStringifier())):
|
||||
name = CGSpecializedMethod.makeNativeName(descriptor, m)
|
||||
infallible = 'infallible' in descriptor.getExtendedAttributes(m)
|
||||
for idx, (rettype, arguments) in enumerate(m.signatures()):
|
||||
|
@ -4125,7 +4144,8 @@ class CGDescriptor(CGThing):
|
|||
(hasMethod, hasGetter, hasLenientGetter,
|
||||
hasSetter, hasLenientSetter) = False, False, False, False, False
|
||||
for m in descriptor.interface.members:
|
||||
if m.isMethod() and not m.isIdentifierLess():
|
||||
if (m.isMethod() and
|
||||
(not m.isIdentifierLess() or m == descriptor.operations["Stringifier"])):
|
||||
if m.isStatic():
|
||||
assert descriptor.interface.hasInterfaceObject()
|
||||
cgThings.append(CGStaticMethod(descriptor, m))
|
||||
|
@ -4134,6 +4154,11 @@ class CGDescriptor(CGThing):
|
|||
cgThings.append(CGMemberJITInfo(descriptor, m))
|
||||
hasMethod = True
|
||||
elif m.isAttr():
|
||||
if m.stringifier:
|
||||
raise TypeError("Stringifier attributes not supported yet. "
|
||||
"See bug 824857.\n"
|
||||
"%s" % m.location)
|
||||
|
||||
if m.isStatic():
|
||||
assert descriptor.interface.hasInterfaceObject()
|
||||
cgThings.append(CGStaticGetter(descriptor, m))
|
||||
|
|
|
@ -166,28 +166,37 @@ class Descriptor(DescriptorProvider):
|
|||
# If we're concrete, we need to crawl our ancestor interfaces and mark
|
||||
# them as having a concrete descendant.
|
||||
self.concrete = desc.get('concrete', True)
|
||||
|
||||
self.operations = {
|
||||
'IndexedGetter': None,
|
||||
'IndexedSetter': None,
|
||||
'IndexedCreator': None,
|
||||
'IndexedDeleter': None,
|
||||
'NamedGetter': None,
|
||||
'NamedSetter': None,
|
||||
'NamedCreator': None,
|
||||
'NamedDeleter': None,
|
||||
'Stringifier': None,
|
||||
}
|
||||
|
||||
def addOperation(operation, m):
|
||||
if not self.operations[operation]:
|
||||
self.operations[operation] = m
|
||||
|
||||
# Since stringifiers go on the prototype, we only need to worry
|
||||
# about our own stringifier, not those of our ancestor interfaces.
|
||||
for m in self.interface.members:
|
||||
if m.isMethod() and m.isStringifier():
|
||||
addOperation('Stringifier', m)
|
||||
|
||||
if self.concrete:
|
||||
self.proxy = False
|
||||
operations = {
|
||||
'IndexedGetter': None,
|
||||
'IndexedSetter': None,
|
||||
'IndexedCreator': None,
|
||||
'IndexedDeleter': None,
|
||||
'NamedGetter': None,
|
||||
'NamedSetter': None,
|
||||
'NamedCreator': None,
|
||||
'NamedDeleter': None,
|
||||
'Stringifier': None
|
||||
}
|
||||
iface = self.interface
|
||||
while iface:
|
||||
for m in iface.members:
|
||||
if not m.isMethod():
|
||||
continue
|
||||
|
||||
def addOperation(operation, m):
|
||||
if not operations[operation]:
|
||||
operations[operation] = m
|
||||
def addIndexedOrNamedOperation(operation, m):
|
||||
self.proxy = True
|
||||
if m.isIndexed():
|
||||
|
@ -196,24 +205,20 @@ class Descriptor(DescriptorProvider):
|
|||
assert m.isNamed()
|
||||
operation = 'Named' + operation
|
||||
addOperation(operation, m)
|
||||
|
||||
if m.isStringifier():
|
||||
addOperation('Stringifier', m)
|
||||
else:
|
||||
if m.isGetter():
|
||||
addIndexedOrNamedOperation('Getter', m)
|
||||
if m.isSetter():
|
||||
addIndexedOrNamedOperation('Setter', m)
|
||||
if m.isCreator():
|
||||
addIndexedOrNamedOperation('Creator', m)
|
||||
if m.isDeleter():
|
||||
addIndexedOrNamedOperation('Deleter', m)
|
||||
|
||||
if m.isGetter():
|
||||
addIndexedOrNamedOperation('Getter', m)
|
||||
if m.isSetter():
|
||||
addIndexedOrNamedOperation('Setter', m)
|
||||
if m.isCreator():
|
||||
addIndexedOrNamedOperation('Creator', m)
|
||||
if m.isDeleter():
|
||||
addIndexedOrNamedOperation('Deleter', m)
|
||||
|
||||
iface.setUserData('hasConcreteDescendant', True)
|
||||
iface = iface.parent
|
||||
|
||||
if self.proxy:
|
||||
self.operations = operations
|
||||
iface = self.interface
|
||||
while iface:
|
||||
iface.setUserData('hasProxyDescendant', True)
|
||||
|
|
|
@ -47,6 +47,10 @@ impl<'a> LocationMethods for JSRef<'a, Location> {
|
|||
UrlHelper::Href(&self.page.get_url())
|
||||
}
|
||||
|
||||
fn Stringify(self) -> DOMString {
|
||||
self.Href()
|
||||
}
|
||||
|
||||
fn Search(self) -> DOMString {
|
||||
UrlHelper::Search(&self.page.get_url())
|
||||
}
|
||||
|
|
|
@ -9,7 +9,6 @@ interface URLUtils {
|
|||
//stringifier attribute ScalarValueString href;
|
||||
readonly attribute DOMString href;
|
||||
//readonly attribute ScalarValueString origin;
|
||||
|
||||
// attribute ScalarValueString protocol;
|
||||
// attribute ScalarValueString username;
|
||||
// attribute ScalarValueString password;
|
||||
|
@ -22,4 +21,8 @@ interface URLUtils {
|
|||
// attribute URLSearchParams searchParams;
|
||||
// attribute ScalarValueString hash;
|
||||
readonly attribute DOMString hash;
|
||||
|
||||
// This is only doing as well as gecko right now, bug 824857 is on file for
|
||||
// adding attribute stringifier support.
|
||||
stringifier;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue