Ejemplo n.º 1
0
    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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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