Bug 781387 - Codegen infallibility data for Paris bindings methods. (r=peterv)

This commit is contained in:
Eric Faust 2012-09-04 14:46:38 -04:00
parent b6a6faa07f
commit c14c8ad7e4
2 changed files with 21 additions and 8 deletions

View File

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

View File

@ -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? */
};