Author: Ronan Lamy <ronan.l...@gmail.com> Branch: exctrans Changeset: r81869:ced39321ee69 Date: 2016-01-19 20:58 +0000 http://bitbucket.org/pypy/pypy/changeset/ced39321ee69/
Log: Simplify: split off ExternalFuncNode class from FuncNode diff --git a/rpython/translator/c/database.py b/rpython/translator/c/database.py --- a/rpython/translator/c/database.py +++ b/rpython/translator/c/database.py @@ -9,9 +9,9 @@ from rpython.rtyper.lltypesystem import llgroup from rpython.tool.sourcetools import valid_identifier from rpython.translator.c.primitive import PrimitiveName, PrimitiveType -from rpython.translator.c.node import StructDefNode, ArrayDefNode -from rpython.translator.c.node import FixedSizeArrayDefNode, BareBoneArrayDefNode -from rpython.translator.c.node import ContainerNodeFactory, ExtTypeOpaqueDefNode +from rpython.translator.c.node import ( + StructDefNode, ArrayDefNode, FixedSizeArrayDefNode, BareBoneArrayDefNode, + ContainerNodeFactory, ExtTypeOpaqueDefNode, FuncNode) from rpython.translator.c.support import cdecl, CNameManager from rpython.translator.c.support import log, barebonearray from rpython.translator.c.extfunc import do_the_getting @@ -383,7 +383,7 @@ def all_graphs(self): graphs = [] for node in self.containerlist: - if node.nodekind == 'func': + if isinstance(node, FuncNode): for graph in node.graphs_to_patch(): graphs.append(graph) return graphs diff --git a/rpython/translator/c/node.py b/rpython/translator/c/node.py --- a/rpython/translator/c/node.py +++ b/rpython/translator/c/node.py @@ -807,23 +807,17 @@ # ____________________________________________________________ -class FuncNode(ContainerNode): +class FuncNodeBase(ContainerNode): nodekind = 'func' eci_name = 'compilation_info' # there not so many node of this kind, slots should not # be necessary - def __init__(self, db, T, obj, ptrname): Node.__init__(self, db) self.globalcontainer = True self.T = T self.obj = obj self.name = ptrname - self.funcgen = select_function_code_generators(obj, db, ptrname) - if self.funcgen: - argnames = self.funcgen.argnames() - self.implementationtypename = db.gettype(T, argnames=argnames) - self._funccodegen_owner = self.funcgen self.typename = db.gettype(T) #, who_asks=self) def getptrname(self): @@ -832,30 +826,32 @@ def basename(self): return self.obj._name + +class FuncNode(FuncNodeBase): + def __init__(self, db, T, obj, ptrname): + FuncNodeBase.__init__(self, db, T, obj, ptrname) + exception_policy = getattr(obj, 'exception_policy', None) + self.funcgen = make_funcgen(obj.graph, db, exception_policy, ptrname) + argnames = self.funcgen.argnames() + self.implementationtypename = db.gettype(T, argnames=argnames) + self._funccodegen_owner = self.funcgen + def enum_dependencies(self): - if self.funcgen is None: - return [] return self.funcgen.allconstantvalues() def forward_declaration(self): callable = getattr(self.obj, '_callable', None) is_exported = getattr(callable, 'exported_symbol', False) - if self.funcgen: - yield '%s;' % ( - forward_cdecl(self.implementationtypename, - self.name, self.db.standalone, is_exported=is_exported)) + yield '%s;' % ( + forward_cdecl(self.implementationtypename, + self.name, self.db.standalone, is_exported=is_exported)) + + def graphs_to_patch(self): + for i in self.funcgen.graphs_to_patch(): + yield i def implementation(self): - if self.funcgen: - for s in self.funcgen_implementation(self.funcgen): - yield s - - def graphs_to_patch(self): - if self.funcgen: - for i in self.funcgen.graphs_to_patch(): - yield i - - def funcgen_implementation(self, funcgen): + funcgen = self.funcgen funcgen.implementation_begin() # recompute implementationtypename as the argnames may have changed argnames = funcgen.argnames() @@ -902,6 +898,20 @@ del bodyiter funcgen.implementation_end() +class ExternalFuncNode(FuncNodeBase): + def __init__(self, db, T, obj, ptrname): + FuncNodeBase.__init__(self, db, T, obj, ptrname) + self._funccodegen_owner = None + + def enum_dependencies(self): + return [] + + def forward_declaration(self): + return [] + + def implementation(self): + return [] + def new_funcnode(db, T, obj, forcename=None): if db.sandbox: if (getattr(obj, 'external', None) is not None and @@ -911,26 +921,22 @@ obj, db.translator.rtyper) obj.__dict__.pop('_safe_not_sandboxed', None) obj.__dict__.pop('external', None) - if forcename: name = forcename else: name = _select_name(db, obj) - return FuncNode(db, T, obj, name) + if hasattr(obj, 'graph'): + return FuncNode(db, T, obj, name) + elif getattr(obj, 'external', None) is not None: + assert obj.external == 'C' + if db.sandbox: + assert obj._safe_not_sandboxed + return ExternalFuncNode(db, T, obj, name) + elif hasattr(obj._callable, "c_name"): + return ExternalFuncNode(db, T, obj, name) # this case should only be used for entrypoints + else: + raise ValueError("don't know how to generate code for %r" % (obj,)) -def select_function_code_generators(fnobj, db, functionname): - if hasattr(fnobj, 'graph'): - exception_policy = getattr(fnobj, 'exception_policy', None) - return make_funcgen(fnobj.graph, db, exception_policy, functionname) - elif getattr(fnobj, 'external', None) is not None: - assert fnobj.external == 'C' - if db.sandbox: - assert fnobj._safe_not_sandboxed - return None - elif hasattr(fnobj._callable, "c_name"): - return None # this case should only be used for entrypoints - else: - raise ValueError("don't know how to generate code for %r" % (fnobj,)) def _select_name(db, obj): try: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit