[pypy-commit] pypy concurrent-marksweep: Kill the explicit C code manipulating GC strings and lists at
arigo
noreply at buildbot.pypy.org
Sun Oct 9 20:00:30 CEST 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: concurrent-marksweep
Changeset: r47907:c682e7a8ccce
Date: 2011-10-09 19:59 +0200
http://bitbucket.org/pypy/pypy/changeset/c682e7a8ccce/
Log: Kill the explicit C code manipulating GC strings and lists at start-
up, and replace it with RPython code.
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
@@ -417,6 +417,7 @@
split = True
executable_name = None
shared_library_name = None
+ _entrypoint_wrapper = None
def getprofbased(self):
profbased = None
@@ -439,8 +440,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();
More information about the pypy-commit
mailing list