mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-12 04:45:45 +00:00
Bug 781387 - Codegen infallibility data for Paris bindings methods. (r=peterv)
This commit is contained in:
parent
b6a6faa07f
commit
c14c8ad7e4
@ -2759,7 +2759,7 @@ def wrapForType(type, descriptorProvider, templateValues):
|
||||
defaultValues = {'obj': 'obj'}
|
||||
return string.Template(wrap).substitute(defaultValues, **templateValues)
|
||||
|
||||
def infallibleForAttr(attr, descriptorProvider):
|
||||
def infallibleForMember(member, type, descriptorProvider):
|
||||
"""
|
||||
Determine the fallibility of changing a C++ value of IDL type "type" into
|
||||
JS for the given attribute. Apart from isCreator, all the defaults are used,
|
||||
@ -2770,8 +2770,8 @@ def infallibleForAttr(attr, descriptorProvider):
|
||||
We assume that successCode for wrapping up return values cannot contain
|
||||
failure conditions.
|
||||
"""
|
||||
return getWrapTemplateForType(attr.type, descriptorProvider, 'result', None,\
|
||||
memberIsCreator(attr))[1]
|
||||
return getWrapTemplateForType(type, descriptorProvider, 'result', None,\
|
||||
memberIsCreator(member))[1]
|
||||
|
||||
def typeNeedsCx(type):
|
||||
return (type is not None and
|
||||
@ -3501,7 +3501,7 @@ class CGMemberJITInfo(CGThing):
|
||||
" %s,\n"
|
||||
" %s,\n"
|
||||
" %s,\n"
|
||||
" %s, /* isInfallible. Only relevant for getters. */\n"
|
||||
" %s, /* isInfallible. False in setters. */\n"
|
||||
" false /* isConstant. Only relevant for getters. */\n"
|
||||
"};\n" % (infoName, opName, protoID, depth, failstr))
|
||||
|
||||
@ -3510,7 +3510,7 @@ class CGMemberJITInfo(CGThing):
|
||||
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 infallibleForAttr(self.member, self.descriptor)
|
||||
getterinfal = getterinfal and infallibleForMember(self.member, self.member.type, self.descriptor)
|
||||
result = self.defineJitInfo(getterinfo, getter, getterinfal)
|
||||
if not self.member.readonly:
|
||||
setterinfo = ("%s_setterinfo" % self.member.identifier.name)
|
||||
@ -3522,8 +3522,21 @@ class CGMemberJITInfo(CGThing):
|
||||
methodinfo = ("%s_methodinfo" % self.member.identifier.name)
|
||||
# Actually a JSJitMethodOp, but JSJitPropertyOp by struct definition.
|
||||
method = ("(JSJitPropertyOp)%s" % self.member.identifier.name)
|
||||
# Method, much like setters, are always fallible
|
||||
result = self.defineJitInfo(methodinfo, method, False)
|
||||
|
||||
# Methods are infallible if they are infallible, have no arguments
|
||||
# to unwrap, and have a return type that's infallible to wrap up for
|
||||
# return.
|
||||
methodInfal = False
|
||||
sigs = self.member.signatures()
|
||||
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)
|
||||
return result
|
||||
raise TypeError("Illegal member type to CGPropertyJITInfo")
|
||||
|
||||
|
@ -1372,7 +1372,7 @@ struct JSJitInfo {
|
||||
JSJitPropertyOp op;
|
||||
uint32_t protoID;
|
||||
uint32_t depth;
|
||||
bool isInfallible; /* Is op fallible? Getters only */
|
||||
bool isInfallible; /* Is op fallible? False in setters. */
|
||||
bool isConstant; /* Getting a construction-time constant? */
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user