def definition(wrapper, arguments, traverser): """Wraps an XPCOM class instantiation function.""" if not arguments: return None traverser._debug('(XPCOM Encountered)') if not pretraversed: arguments = [traverser._traverse_node(x) for x in arguments] argz = arguments[0] if not argz.is_global or 'xpcom_map' not in argz.value: argz = JSWrapper(traverser=traverser) argz.value = {'xpcom_map': lambda: {'value': {}}} traverser._debug('(Building XPCOM...)') inst = traverser._build_global( method, argz.value['xpcom_map']()) inst.value['overwritable'] = True if extend or mutate: # FIXME: There should be a way to get this without # traversing the call chain twice. parent = actions.trace_member(traverser, wrapper['callee']['object']) if mutate and not (parent.is_global and isinstance(parent.value, dict) and 'value' in parent.value): # Assume that the parent object is a first class # wrapped native parent.value = inst.value # FIXME: Only objects marked as global are processed # as XPCOM instances parent.is_global = True if isinstance(parent.value, dict): if extend and mutate: if callable(parent.value['value']): parent.value['value'] = \ parent.value['value'](t=traverser) parent.value['value'].update(inst.value['value']) return parent if extend: inst.value['value'].update(parent.value['value']) if mutate: parent.value = inst.value return inst
def definition(wrapper, arguments, traverser): """Wraps an XPCOM class instantiation function.""" if not arguments: return None traverser._debug('(XPCOM Encountered)') if not pretraversed: arguments = [traverser._traverse_node(x) for x in arguments] argz = arguments[0] if not argz.is_global or 'xpcom_map' not in argz.value: argz = JSWrapper(traverser=traverser) argz.value = {'xpcom_map': lambda: {'value': {}}} traverser._debug('(Building XPCOM...)') inst = traverser._build_global(method, argz.value['xpcom_map']()) inst.value['overwritable'] = True if extend or mutate: # FIXME: There should be a way to get this without # traversing the call chain twice. parent = actions.trace_member(traverser, wrapper['callee']['object']) if mutate and not (parent.is_global and isinstance( parent.value, dict) and 'value' in parent.value): # Assume that the parent object is a first class # wrapped native parent.value = inst.value # FIXME: Only objects marked as global are processed # as XPCOM instances parent.is_global = True if isinstance(parent.value, dict): if extend and mutate: if callable(parent.value['value']): parent.value['value'] = \ parent.value['value'](t=traverser) parent.value['value'].update(inst.value['value']) return parent if extend: inst.value['value'].update(parent.value['value']) if mutate: parent.value = inst.value return inst
def _new(traverser, node): 'Returns a new copy of a node.' # We don't actually process the arguments as part of the flow because of # the Angry T-Rex effect. For now, we just traverse them to ensure they # don't contain anything dangerous. args = node['arguments'] if isinstance(args, list): for arg in args: traverser._traverse_node(arg, source='arguments') else: traverser._traverse_node(args) elem = traverser._traverse_node(node['callee']) if not isinstance(elem, JSWrapper): elem = JSWrapper(elem, traverser=traverser) if elem.is_global: traverser._debug('Making overwritable') elem.value = deepcopy(elem.value) elem.value['overwritable'] = True return elem
def _new(traverser, node): "Returns a new copy of a node." # We don't actually process the arguments as part of the flow because of # the Angry T-Rex effect. For now, we just traverse them to ensure they # don't contain anything dangerous. args = node["arguments"] if isinstance(args, list): for arg in args: traverser._traverse_node(arg, source="arguments") else: traverser._traverse_node(args) elem = traverser._traverse_node(node["callee"]) if not isinstance(elem, JSWrapper): elem = JSWrapper(elem, traverser=traverser) if elem.is_global: traverser._debug("Making overwritable") elem.value = copy.deepcopy(elem.value) elem.value["overwritable"] = True return elem