Author: Armin Rigo <ar...@tunes.org> Branch: stm Changeset: r48608:b66d9e6e0eed Date: 2011-10-09 19:59 +0200 http://bitbucket.org/pypy/pypy/changeset/b66d9e6e0eed/
Log: Kill the explicit C code manipulating GC strings and lists at start- up, and replace it with RPython code. (transplanted from c682e7a8ccce6595773aaaafc28eeafab75eee51) diff --git a/pypy/translator/c/extfunc.py b/pypy/translator/c/extfunc.py --- a/pypy/translator/c/extfunc.py +++ b/pypy/translator/c/extfunc.py @@ -32,47 +32,19 @@ def predeclare_utility_functions(db, rtyper): # Common utility functions + # (nowadays we are left with only this one function) def RPyString_New(length=lltype.Signed): return mallocstr(length) - # !!! - # be extremely careful passing a gc tracked object - # from such an helper result to another one - # as argument, this could result in leaks - # Such result should be only from C code - # returned directly as results - - LIST_OF_STR = find_list_of_str(rtyper) - if LIST_OF_STR is not None: - p = lltype.Ptr(LIST_OF_STR) - - def _RPyListOfString_New(length=lltype.Signed): - return LIST_OF_STR.ll_newlist(length) - - def _RPyListOfString_New(length=lltype.Signed): - return LIST_OF_STR.ll_newlist(length) - - def _RPyListOfString_SetItem(l=p, - index=lltype.Signed, - newstring=lltype.Ptr(STR)): - rlist.ll_setitem_nonneg(rlist.dum_nocheck, l, index, newstring) - - def _RPyListOfString_GetItem(l=p, - index=lltype.Signed): - return rlist.ll_getitem_fast(l, index) - - def _RPyListOfString_Length(l=p): - return rlist.ll_length(l) - for fname, f in locals().items(): if isinstance(f, types.FunctionType): # XXX this is painful :( - if (LIST_OF_STR, fname) in db.helper2ptr: - yield (fname, db.helper2ptr[LIST_OF_STR, fname]) + if ("utility", fname) in db.helper2ptr: + yield (fname, db.helper2ptr["utility", fname]) else: # hack: the defaults give the type of the arguments graph = rtyper.annotate_helper(f, f.func_defaults) - db.helper2ptr[LIST_OF_STR, fname] = graph + db.helper2ptr["utility", fname] = graph yield (fname, graph) diff --git a/pypy/translator/c/genc.py b/pypy/translator/c/genc.py --- a/pypy/translator/c/genc.py +++ b/pypy/translator/c/genc.py @@ -427,6 +427,7 @@ split = True executable_name = None shared_library_name = None + _entrypoint_wrapper = None def getprofbased(self): profbased = None @@ -449,8 +450,29 @@ def getentrypointptr(self): # XXX check that the entrypoint has the correct # signature: list-of-strings -> int - bk = self.translator.annotator.bookkeeper - return getfunctionptr(bk.getdesc(self.entrypoint).getuniquegraph()) + if self._entrypoint_wrapper is not None: + return self._entrypoint_wrapper + # + from pypy.annotation import model as annmodel + from pypy.rpython.lltypesystem import rffi + from pypy.rpython.annlowlevel import MixLevelHelperAnnotator + entrypoint = self.entrypoint + # + def entrypoint_wrapper(argc, argv): + list = [""] * argc + i = 0 + while i < argc: + list[i] = rffi.charp2str(argv[i]) + i += 1 + return entrypoint(list) + # + mix = MixLevelHelperAnnotator(self.translator.rtyper) + args_s = [annmodel.SomeInteger(), + annmodel.lltype_to_annotation(rffi.CCHARPP)] + s_result = annmodel.SomeInteger() + graph = mix.getgraph(entrypoint_wrapper, args_s, s_result) + mix.finish() + return getfunctionptr(graph) def cmdexec(self, args='', env=None, err=False, expect_crash=False): assert self._compiled diff --git a/pypy/translator/c/src/main.h b/pypy/translator/c/src/main.h --- a/pypy/translator/c/src/main.h +++ b/pypy/translator/c/src/main.h @@ -51,15 +51,7 @@ errmsg = RPython_StartupCode(); if (errmsg) goto error; - list = _RPyListOfString_New(argc); - if (RPyExceptionOccurred()) goto memory_out; - for (i=0; i<argc; i++) { - RPyString *s = RPyString_FromString(argv[i]); - if (RPyExceptionOccurred()) goto memory_out; - _RPyListOfString_SetItem(list, i, s); - } - - exitcode = STANDALONE_ENTRY_POINT(list); + exitcode = STANDALONE_ENTRY_POINT(argc, argv); #ifdef RPY_ASSERT pypy_debug_alloc_results(); _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit