author | Eric Faust <efaustbmo@gmail.com> |
Wed, 28 Nov 2012 16:28:36 -0500 | |
changeset 114408 | 70c54d5c94b7b3914690c3a73dd0ab1a1a93b7d2 |
parent 114407 | 1e5943b28e49f94576118317c8da548593a9d990 |
child 114409 | c5c30b93ee5e109f9b3d7d55aafa1763c066f6c6 |
push id | 23917 |
push user | emorley@mozilla.com |
push date | Thu, 29 Nov 2012 14:20:29 +0000 |
treeherder | mozilla-central@c72d38e7a212 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | bz |
bugs | 747289 |
milestone | 20.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -4389,41 +4389,43 @@ class CGMemberJITInfo(CGThing): """ def __init__(self, descriptor, member): self.member = member self.descriptor = descriptor def declare(self): return "" - def defineJitInfo(self, infoName, opName, infallible): + def defineJitInfo(self, infoName, opName, infallible, constant): protoID = "prototypes::id::%s" % self.descriptor.name depth = "PrototypeTraits<%s>::Depth" % protoID - failstr = "true" if infallible else "false" + failstr = toStringBool(infallible) + conststr = toStringBool(constant) return ("\n" "const JSJitInfo %s = {\n" " %s,\n" " %s,\n" " %s,\n" " %s, /* isInfallible. False in setters. */\n" - " false /* isConstant. Only relevant for getters. */\n" - "};\n" % (infoName, opName, protoID, depth, failstr)) + " %s /* isConstant. Only relevant for getters. */\n" + "};\n" % (infoName, opName, protoID, depth, failstr, conststr)) def define(self): if self.member.isAttr(): getterinfo = ("%s_getterinfo" % self.member.identifier.name) getter = ("(JSJitPropertyOp)get_%s" % self.member.identifier.name) getterinfal = "infallible" in self.descriptor.getExtendedAttributes(self.member, getter=True) getterinfal = getterinfal and infallibleForMember(self.member, self.member.type, self.descriptor) - result = self.defineJitInfo(getterinfo, getter, getterinfal) + getterconst = self.member.getExtendedAttribute("Constant") + result = self.defineJitInfo(getterinfo, getter, getterinfal, getterconst) if not self.member.readonly or self.member.getExtendedAttribute("PutForwards") is not None: setterinfo = ("%s_setterinfo" % self.member.identifier.name) setter = ("(JSJitPropertyOp)set_%s" % self.member.identifier.name) # Setters are always fallible, since they have to do a typed unwrap. - result += self.defineJitInfo(setterinfo, setter, False) + result += self.defineJitInfo(setterinfo, setter, False, False) return result if self.member.isMethod(): methodinfo = ("%s_methodinfo" % self.member.identifier.name) name = CppKeywords.checkMethodName(self.member.identifier.name) # Actually a JSJitMethodOp, but JSJitPropertyOp by struct definition. method = ("(JSJitPropertyOp)%s" % name) # Methods are infallible if they are infallible, have no arguments @@ -4434,17 +4436,17 @@ class CGMemberJITInfo(CGThing): if len(sigs) == 1: # Don't handle overloading. If there's more than one signature, # one of them must take arguments. sig = sigs[0] if len(sig[1]) == 0 and infallibleForMember(self.member, sig[0], self.descriptor): # No arguments and infallible return boxing methodInfal = True - result = self.defineJitInfo(methodinfo, method, methodInfal) + result = self.defineJitInfo(methodinfo, method, methodInfal, False) return result raise TypeError("Illegal member type to CGPropertyJITInfo") def getEnumValueName(value): # Some enum values can be empty strings. Others might have weird # characters in them. Deal with the former by returning "_empty", # deal with possible name collisions from that by throwing if the # enum value is actually "_empty", and throw on any value
--- a/dom/bindings/parser/WebIDL.py +++ b/dom/bindings/parser/WebIDL.py @@ -2138,16 +2138,19 @@ class IDLAttribute(IDLInterfaceMember): raise WebIDLError("[LenientThis] is only allowed on non-static " "attributes", [attr.location, self.location]) self.lenientThis = True elif identifier == "Unforgeable": if not self.readonly: raise WebIDLError("[Unforgeable] is only allowed on readonly " "attributes", [attr.location, self.location]) self._unforgeable = True + elif identifier == "Constant" and not self.readonly: + raise WebIDLError("[Constant] only allowed on readonly attributes", + [attr.location, self.location]) elif identifier == "PutForwards": if not self.readonly: raise WebIDLError("[PutForwards] is only allowed on readonly " "attributes", [attr.location, self.location]) if self.isStatic(): raise WebIDLError("[PutForwards] is only allowed on non-static " "attributes", [attr.location, self.location]) if self.getExtendedAttribute("Replaceable") is not None: @@ -2636,16 +2639,20 @@ class IDLMethod(IDLInterfaceMember, IDLS elif identifier == "SetterThrows": raise WebIDLError("Methods must not be flagged as " "[SetterThrows]", [attr.location, self.location]) elif identifier == "Unforgeable": raise WebIDLError("Methods must not be flagged as " "[Unforgeable]", [attr.location, self.location]) + elif identifier == "Constant": + raise WebIDLError("Methods must not be flagged as " + "[Constant]", + [attr.location, self.location]); elif identifier == "PutForwards": raise WebIDLError("Only attributes support [PutForwards]", [attr.location, self.location]) elif identifier == "LenientFloat": # This is called before we've done overload resolution assert len(self.signatures()) == 1 sig = self.signatures()[0] if not sig[0].isVoid():
--- a/dom/webidl/ImageData.webidl +++ b/dom/webidl/ImageData.webidl @@ -8,10 +8,10 @@ * * © Copyright 2004-2011 Apple Computer, Inc., Mozilla Foundation, and Opera Software ASA. * You are granted a license to use, reproduce and create derivative works of this document. */ interface ImageData { readonly attribute unsigned long width; readonly attribute unsigned long height; - readonly attribute Uint8ClampedArray data; + [Constant] readonly attribute Uint8ClampedArray data; };