Beispiel #1
0
 def __init__(self, genoo):
     self._pending_nodes = set()
     self.genoo = genoo
     self._rendered_nodes = set()
     self.classes = {}  # classdef --> class_name
     self.functions = {}  # graph --> function_name
     self.function_names = {}  # graph --> real_name
     self.methods = {}  # graph --> method_name
     self.consts = {}  # value --> const_name
     self.reverse_consts = {}
     self.const_names = set()
     self.rendered = set()
     self.const_var = Variable("__consts")
     self.name_manager = JavascriptNameManager(self)
     self.pending_consts = []
     self.cts = self.genoo.TypeSystem(self)
     self.proxies = []
Beispiel #2
0
 def __init__(self, genoo):
     self._pending_nodes = set()
     self.genoo = genoo
     self._rendered_nodes = set()
     self.classes = {} # classdef --> class_name
     self.functions = {} # graph --> function_name
     self.function_names = {} # graph --> real_name
     self.methods = {} # graph --> method_name
     self.consts = {}  # value --> const_name
     self.reverse_consts = {}
     self.const_names = set()
     self.rendered = set()
     self.const_var = Variable("__consts")
     self.name_manager = JavascriptNameManager(self)
     self.pending_consts = []
     self.cts = self.genoo.TypeSystem(self)
     self.proxies = []
Beispiel #3
0
class LowLevelDatabase(object):
    def __init__(self, genoo):
        self._pending_nodes = set()
        self.genoo = genoo
        self._rendered_nodes = set()
        self.classes = {}  # classdef --> class_name
        self.functions = {}  # graph --> function_name
        self.function_names = {}  # graph --> real_name
        self.methods = {}  # graph --> method_name
        self.consts = {}  # value --> const_name
        self.reverse_consts = {}
        self.const_names = set()
        self.rendered = set()
        self.const_var = Variable("__consts")
        self.name_manager = JavascriptNameManager(self)
        self.pending_consts = []
        self.cts = self.genoo.TypeSystem(self)
        self.proxies = []

    def is_primitive(self, type_):
        if type_ in [Void, Bool, Float, Signed, Unsigned, SignedLongLong, UnsignedLongLong, Char, UniChar, ootype.StringBuilder] or \
            isinstance(type_,ootype.StaticMethod):
            return True
        return False

    def pending_function(self, graph):
        self.pending_node(self.genoo.Function(self, graph))

    def pending_abstract_function(self, name):
        pass
        # XXX we want to implement it at some point (maybe...)

    def pending_class(self, classdef):
        c = Class(self, classdef)
        self.pending_node(c)
        return c

    def pending_record(self, record):
        r = Record(self, record)
        self.pending_node(r)
        return r.get_name()

    def pending_node(self, node):
        if node in self._pending_nodes or node in self._rendered_nodes:
            return
        self._pending_nodes.add(node)

    def record_function(self, graph, name):
        self.functions[graph] = name

    def get_uniquename(self, graph, name):
        try:
            return self.function_names[graph]
        except KeyError:
            real_name = self.name_manager.uniquename(name, lenmax=1111111)
            self.function_names[graph] = real_name
            return real_name

    def record_class(self, classdef, name):
        self.classes[classdef] = name

    def register_comm_proxy(self, proxy_const, *args):
        """ Register external object which should be rendered as
        method call
        """
        self.proxies.append(XmlHttp(proxy_const, *args))

    def graph_name(self, graph):
        return self.functions.get(graph, None)

    def class_name(self, classdef):
        return self.classes.get(classdef, None)

    def record_const(self, value, type_=None, retval='name'):
        if type_ is None:
            type_ = typeOf(value)
        if self.is_primitive(type_):
            return None
        const = AbstractConst.make(self, value)
        if not const:
            return None
        try:
            if retval == 'name':
                return self.consts[const]
            else:
                self.consts[const]
                return self.reverse_consts[self.consts[const]]
        except KeyError:
            if self.genoo.config.translation.verbose:
                log("New const:%r" % value)
                if isinstance(value, ootype._string):
                    log(value._str)
            else:
                log.dot()
            name = const.get_name()
            if name in self.const_names:
                name += '__%d' % len(self.consts)
            self.consts[const] = name
            self.reverse_consts[name] = const
            self.const_names.add(name)
            self.pending_consts.append((const, name))
        if retval == 'name':
            return name
        else:
            return const

    def gen_constants(self, ilasm, pending):
        try:
            while True:
                const, name = self.pending_consts.pop()
                const.record_fields()
        except IndexError:
            pass

        if pending:
            return

        if not self.rendered:
            ilasm.begin_consts(self.const_var.name)

        def generate_constants(consts):
            all_c = [const for const, name in consts.iteritems()]
            dep_ok = set()
            while len(all_c) > 0:
                const = all_c.pop()
                if const not in self.rendered:
                    to_render = True
                    if hasattr(const, 'depends_on') and const.depends_on:
                        for i in const.depends_on:
                            if i not in self.rendered and i not in dep_ok:
                                assert i.depends is None or const in i.depends
                                to_render = False
                                continue

                    if to_render and (not hasattr(const, 'depends')) or (
                            not const.depends) or const in dep_ok:
                        yield const, consts[const]
                        self.rendered.add(const)
                    else:
                        all_c.append(const)
                        for i in const.depends:
                            all_c.append(i)
                        dep_ok.add(const)

        # We need to keep track of fields to make sure
        # our items appear earlier than us
        to_init = []
        for const, name in generate_constants(self.consts):
            if self.genoo.config.translation.verbose:
                log("Recording %r %r" % (const, name))
            else:
                log.dot()
            ilasm.load_local(self.const_var)
            const.init(ilasm)
            ilasm.set_field(None, name)
            ilasm.store_void()
            to_init.append((const, name))
            #ilasm.field(name, const.get_type(), static=True)
        for const, name in to_init:
            const.init_fields(ilasm, self.const_var, name)

    def load_const(self, type_, value, ilasm):
        if self.is_primitive(type_):
            ilasm.load_const(self.cts.primitive_repr(type_, value))
        else:
            try:
                return self.consts[BuiltinConst(value)]
            except KeyError:
                name = self.record_const(value)
                ilasm.load_local(self.const_var)
                ilasm.get_field(name)
Beispiel #4
0
class LowLevelDatabase(object):
    def __init__(self, genoo):
        self._pending_nodes = set()
        self.genoo = genoo
        self._rendered_nodes = set()
        self.classes = {} # classdef --> class_name
        self.functions = {} # graph --> function_name
        self.function_names = {} # graph --> real_name
        self.methods = {} # graph --> method_name
        self.consts = {}  # value --> const_name
        self.reverse_consts = {}
        self.const_names = set()
        self.rendered = set()
        self.const_var = Variable("__consts")
        self.name_manager = JavascriptNameManager(self)
        self.pending_consts = []
        self.cts = self.genoo.TypeSystem(self)
        self.proxies = []
    
    def is_primitive(self, type_):
        if type_ in [Void, Bool, Float, Signed, Unsigned, SignedLongLong, UnsignedLongLong, Char, UniChar, ootype.StringBuilder] or \
            isinstance(type_,ootype.StaticMethod):
            return True
        return False

    def pending_function(self, graph):
        self.pending_node(self.genoo.Function(self, graph))

    def pending_abstract_function(self, name):
        pass
        # XXX we want to implement it at some point (maybe...)

    def pending_class(self, classdef):
        c = Class(self, classdef)
        self.pending_node(c)
        return c

    def pending_record(self, record):
        r = Record(self, record)
        self.pending_node(r)
        return r.get_name()

    def pending_node(self, node):
        if node in self._pending_nodes or node in self._rendered_nodes:
            return
        self._pending_nodes.add(node)

    def record_function(self, graph, name):
        self.functions[graph] = name
    
    def get_uniquename(self, graph, name):
        try:
            return self.function_names[graph]
        except KeyError:
            real_name = self.name_manager.uniquename(name, lenmax=1111111)
            self.function_names[graph] = real_name
            return real_name

    def record_class(self, classdef, name):
        self.classes[classdef] = name
    
    def register_comm_proxy(self, proxy_const, *args):
        """ Register external object which should be rendered as
        method call
        """
        self.proxies.append(XmlHttp(proxy_const, *args))

    def graph_name(self, graph):
        return self.functions.get(graph, None)

    def class_name(self, classdef):
        return self.classes.get(classdef, None)

    def record_const(self, value, type_ = None, retval='name'):
        if type_ is None:
            type_ = typeOf(value)
        if self.is_primitive(type_):
            return None
        const = AbstractConst.make(self, value)
        if not const:
            return None
        try:
            if retval == 'name':
                return self.consts[const]
            else:
                self.consts[const]
                return self.reverse_consts[self.consts[const]]
        except KeyError:
            if self.genoo.config.translation.verbose:
                log("New const:%r"%value)
                if isinstance(value, ootype._string):
                    log(value._str)
            else:
                log.dot()
            name = const.get_name()
            if name in self.const_names:
                name += '__%d' % len(self.consts)
            self.consts[const] = name
            self.reverse_consts[name] = const
            self.const_names.add(name)
            self.pending_consts.append((const,name))
        if retval == 'name':
            return name
        else:
            return const

    def gen_constants(self, ilasm, pending):
        try:
            while True:
                const,name = self.pending_consts.pop()
                const.record_fields()
        except IndexError:
            pass

        if pending:
            return

        if not self.rendered:
            ilasm.begin_consts(self.const_var.name)
        
        def generate_constants(consts):
            all_c = [const for const,name in consts.iteritems()]
            dep_ok = set()
            while len(all_c) > 0:
                const = all_c.pop()
                if const not in self.rendered:
                    to_render = True
                    if hasattr(const, 'depends_on') and const.depends_on:
                        for i in const.depends_on:
                            if i not in self.rendered and i not in dep_ok:
                                assert i.depends is None or const in i.depends
                                to_render = False
                                continue
                    
                    if to_render and (not hasattr(const, 'depends')) or (not const.depends) or const in dep_ok:
                        yield const,consts[const]
                        self.rendered.add(const)
                    else:
                        all_c.append(const)
                        for i in const.depends:
                            all_c.append(i)
                        dep_ok.add(const)

        # We need to keep track of fields to make sure
        # our items appear earlier than us
        to_init = []
        for const, name in generate_constants(self.consts):
            if self.genoo.config.translation.verbose:
                log("Recording %r %r"%(const,name))
            else:
                log.dot()
            ilasm.load_local(self.const_var)
            const.init(ilasm)
            ilasm.set_field(None, name)
            ilasm.store_void()
            to_init.append((const, name))
            #ilasm.field(name, const.get_type(), static=True)
        for const, name in to_init:
            const.init_fields(ilasm, self.const_var, name)

    def load_const(self, type_, value, ilasm):
        if self.is_primitive(type_):
            ilasm.load_const(self.cts.primitive_repr(type_, value))
        else:
            try:
                return self.consts[BuiltinConst(value)]
            except KeyError:
                name = self.record_const(value)
                ilasm.load_local(self.const_var)
                ilasm.get_field(name)