[pypy-svn] r7522 - pypy/trunk/src/pypy/translator

bob at codespeak.net bob at codespeak.net
Sat Nov 20 18:13:06 CET 2004


Author: bob
Date: Sat Nov 20 18:13:05 2004
New Revision: 7522

Modified:
   pypy/trunk/src/pypy/translator/genc.h
   pypy/trunk/src/pypy/translator/genc.py
Log:
locals as of the opcode that failed are now available in the frame dict



Modified: pypy/trunk/src/pypy/translator/genc.h
==============================================================================
--- pypy/trunk/src/pypy/translator/genc.h	(original)
+++ pypy/trunk/src/pypy/translator/genc.h	Sat Nov 20 18:13:05 2004
@@ -8,17 +8,6 @@
 #include "structmember.h"
 #include "traceback.h"
 
-#if PY_VERSION_HEX < 0x02040000   /* 2.4 */
-struct _frame;
-typedef struct _traceback {
-	PyObject_HEAD
-	struct _traceback *tb_next;
-	struct _frame *tb_frame;
-	int tb_lasti;
-	int tb_lineno;
-} PyTracebackObject;
-#endif
-
 #if !defined(MIN)
 #define MIN(a,b) (((a)<(b))?(a):(b))
 #endif /* MIN */
@@ -161,7 +150,7 @@
 
 #if defined(USE_CALL_TRACE)
 
-#define FAIL(err) { __f->f_lineno = __LINE__; goto err; }
+#define FAIL(err) { __f->f_lineno = __f->f_code->co_firstlineno = __LINE__; goto err; }
 
 #define FUNCTION_HEAD(signature, self, args, names, file, line) \
 	PyThreadState *__tstate = PyThreadState_GET(); \
@@ -171,6 +160,8 @@
 #define FUNCTION_CHECK() \
 	assert (__f != NULL);
 
+#define ERR_DECREF(arg) { if (__f->f_locals) { PyDict_SetItemString(__f->f_locals, #arg, arg); } Py_DECREF(arg); }
+
 #define FUNCTION_RETURN(rval) return traced_function_tail(rval, __f, __tstate);
 
 #else /* !defined(USE_CALL_TRACE) */
@@ -179,6 +170,7 @@
 
 #define FUNCTION_HEAD(signature, self, args, names, file, line)
 
+#define ERR_DECREF(arg) { Py_DECREF(arg); }
 #define FUNCTION_CHECK()
 
 #define FUNCTION_RETURN(rval) return rval;
@@ -463,10 +455,7 @@
 	}
 	if (rval == NULL) {
 		if (tstate->curexc_traceback == NULL) {
-			if (PyTraceBack_Here(f) != -1) {
-				/* XXX - this is probably evil */
-				((PyTracebackObject*)tstate->curexc_traceback)->tb_lineno = f->f_lineno;
-			}
+			PyTraceBack_Here(f);
 		}
 		if (trace_frame_exc(tstate, f) < 0) {
 			goto end;

Modified: pypy/trunk/src/pypy/translator/genc.py
==============================================================================
--- pypy/trunk/src/pypy/translator/genc.py	(original)
+++ pypy/trunk/src/pypy/translator/genc.py	Sat Nov 20 18:13:05 2004
@@ -53,8 +53,8 @@
                                #   for later in initxxx() -- for recursive
                                #   objects
         self.globaldecl = []
+        self.globalobjects = []
         self.pendingfunctions = []
-        self.initglobals = []
         self.debugstack = ()  # linked list of nested nameof()
         self.gen_source()
 
@@ -98,9 +98,8 @@
         if type(value) is not object:
             raise Exception, "nameof(%r)" % (value,)
         name = self.uniquename('g_object')
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.initcode.append('INITCHK(%s = PyObject_CallFunction((PyObject*)&PyBaseObject_Type, ""))'%name)
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         return name
 
     def nameof_module(self, value):
@@ -108,9 +107,8 @@
                not (value.__file__.endswith('.pyc') or value.__file__.endswith('.py') or value.__file__.endswith('.pyo')), \
                "%r is not a builtin module (probably :)"%value
         name = self.uniquename('mod%s'%value.__name__)
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.initcode.append('INITCHK(%s = PyImport_Import("%s"))'%(name, value.__name__))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         return name
         
 
@@ -119,10 +117,9 @@
             name = 'gint_%d' % value
         else:
             name = 'gint_minus%d' % abs(value)
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.initcode.append('INITCHK(%s = '
                              'PyInt_FromLong(%d))' % (name, value))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         return name
 
     def nameof_long(self, value):
@@ -131,10 +128,9 @@
             name = 'glong%d' % value
         else:
             name = 'glong_minus%d' % abs(value)
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.initcode.append('INITCHK(%s = '
                              'PyLong_FromLong(%d))' % (name, value))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         return name
 
     def nameof_float(self, value):
@@ -147,10 +143,9 @@
                                     '_' == c )]
         name = ''.join(chrs)
         name = self.uniquename(name)
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.initcode.append('INITCHK(%s = '
                              'PyFloat_FromFloat(%r))' % (name, value))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         return name
 
     def nameof_str(self, value):
@@ -159,7 +154,7 @@
                                      '0' <= c <='9' or
                                      '_' == c )]
         name = self.uniquename('gstr_' + ''.join(chrs))
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         if [c for c in value if not (' '<=c<='~')]:
             # non-printable string
             s = 'chr_%s' % name
@@ -170,20 +165,18 @@
             s = '"%s"' % value
         self.initcode.append('INITCHK(%s = PyString_FromStringAndSize('
                              '%s, %d))' % (name, s, len(value)))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         return name
 
     def skipped_function(self, func):
         # debugging only!  Generates a placeholder for missing functions
         # that raises an exception when called.
         name = self.uniquename('gskippedfunc_' + func.__name__)
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.globaldecl.append('static PyMethodDef ml_%s = { "%s", &skipped, METH_VARARGS };' % (name, name))
         self.initcode.append('INITCHK(%s = PyCFunction_New('
                              '&ml_%s, NULL))' % (name, name))
         self.initcode.append('\tPy_INCREF(%s);' % name)
         self.initcode.append('\tPyCFunction_GET_SELF(%s) = %s;' % (name, name))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         return name
 
     def nameof_function(self, func):
@@ -202,11 +195,10 @@
                 return self.skipped_function(func)
             #print "nameof", printable_name
         name = self.uniquename('gfunc_' + func.__name__)
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.initcode.append('INITCHK(%s = PyCFunction_New('
                              '&ml_%s, NULL))' % (name, name))
         self.initcode.append('\t%s->ob_type = &PyGenCFunction_Type;' % name)
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         self.pendingfunctions.append(func)
         return name
 
@@ -217,10 +209,9 @@
             assert func in self.translator.flowgraphs, func
             
         name = self.uniquename('gsm_' + func.__name__)
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.initcode.append('INITCHK(%s = PyCFunction_New('
                              '&ml_%s, NULL))' % (name, name))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         self.pendingfunctions.append(func)
         return name
 
@@ -234,11 +225,10 @@
             func = self.nameof(meth.im_func)
             typ = self.nameof(meth.im_class)
             name = self.uniquename('gmeth_'+meth.im_func.__name__)
-            self.globaldecl.append('static PyObject* %s;'%(name,))
+            self.globalobjects.append(name)
             self.initcode.append(
                 'INITCHK(%s = gencfunc_descr_get(%s, %s, %s))'%(
                 name, func, ob, typ))
-            self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
             return name
 
     def should_translate_attr(self, pbc, attr):
@@ -270,10 +260,9 @@
                 if self.should_translate_attr(instance, key):
                     yield 'INITCHK(SETUP_INSTANCE_ATTR(%s, "%s", %s))' % (
                         name, key, self.nameof(value))
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.initcode.append('INITCHK(SETUP_INSTANCE(%s, %s))' % (
             name, cls))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         self.later(initinstance())
         return name
 
@@ -292,7 +281,7 @@
             else:
                 raise Exception, '%r not found in any built-in module' % (func,)
             name = self.uniquename('gbltin_' + func.__name__)
-            self.globaldecl.append('static PyObject* %s;' % name)
+            self.globalobjects.append(name)
             if modname == '__builtin__':
                 self.initcode.append('INITCHK(%s = PyMapping_GetItemString('
                                      'PyEval_GetBuiltins(), "%s"))' % (
@@ -301,15 +290,13 @@
                 self.initcode.append('INITCHK(%s = PyObject_GetAttrString('
                                      '%s, "%s"))' % (
                     name, self.nameof(module), func.__name__))
-            self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         else:
             # builtin (bound) method
             name = self.uniquename('gbltinmethod_' + func.__name__)
-            self.globaldecl.append('static PyObject* %s;' % name)
+            self.globalobjects.append(name)
             self.initcode.append('INITCHK(%s = PyObject_GetAttrString('
                                  '%s, "%s"))' % (
                 name, self.nameof(func.__self__), func.__name__))
-            self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         return name
 
     def nameof_classobj(self, cls):
@@ -345,7 +332,7 @@
                     
                 yield 'INITCHK(SETUP_CLASS_ATTR(%s, "%s", %s))' % (
                     name, key, self.nameof(value))
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
 
         baseargs = ", ".join(basenames)
         if baseargs:
@@ -355,7 +342,6 @@
         self.initcode.append('\t\t"s(%s){}", "%s"%s))'
                              %("O"*len(basenames), cls.__name__, baseargs))
         
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         self.later(initclassobj())
         return name
 
@@ -406,12 +392,11 @@
 
     def nameof_tuple(self, tup):
         name = self.uniquename('g%dtuple' % len(tup))
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         args = [self.nameof(x) for x in tup]
         args.insert(0, '%d' % len(tup))
         args = ', '.join(args)
         self.initcode.append('INITCHK(%s = PyTuple_Pack(%s))' % (name, args))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         return name
 
     def nameof_list(self, lis):
@@ -421,9 +406,8 @@
                 item = self.nameof(lis[i])
                 yield '\tPy_INCREF(%s);' % item
                 yield '\tPyList_SET_ITEM(%s, %d, %s);' % (name, i, item)
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.initcode.append('INITCHK(%s = PyList_New(%d))' % (name, len(lis)))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         self.later(initlist())
         return name
 
@@ -442,9 +426,8 @@
                     yield ('\tINITCHK(PyDict_SetItem'
                            '(%s, %s, %s) >= 0)'%(
                                name, self.nameof(k), self.nameof(dic[k])))
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         self.initcode.append('INITCHK(%s = PyDict_New())' % (name,))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         self.later(initdict())
         return name
 
@@ -453,14 +436,13 @@
     def nameof_member_descriptor(self, md):
         name = self.uniquename('gdescriptor_%s_%s' % (
             md.__objclass__.__name__, md.__name__))
-        self.globaldecl.append('static PyObject* %s;' % name)
+        self.globalobjects.append(name)
         cls = self.nameof(md.__objclass__)
         self.initcode.append('INITCHK(PyType_Ready((PyTypeObject*) %s) >= 0)' %
                              cls)
         self.initcode.append('INITCHK(%s = PyMapping_GetItemString('
                              '((PyTypeObject*) %s)->tp_dict, "%s"))' %
                                 (name, cls, md.__name__))
-        self.initglobals.append('REGISTER_GLOBAL(%s)' % (name,))
         return name
     nameof_getset_descriptor  = nameof_member_descriptor
     nameof_method_descriptor  = nameof_member_descriptor
@@ -502,12 +484,14 @@
         print >> f, self.C_INIT_HEADER % info
         for codeline in self.initcode:
             print >> f, '\t' + codeline
-        for codeline in self.initglobals:
-            print >> f, '\t' + codeline
+        for name in self.globalobjects:
+            print >> f, '\t' + 'REGISTER_GLOBAL(%s)' % (name,)
         print >> f, self.C_INIT_FOOTER % info
 
     def gen_global_declarations(self):
         g = self.globaldecl
+        for name in self.globalobjects:
+            g.append('static PyObject *%s;' % (name,))
         if g:
             f = self.f
             print >> f, '/* global declaration%s */' % ('s'*(len(g)>1))
@@ -564,12 +548,12 @@
             print >> f, '\targs = PyTuple_GetSlice(args, 0, %d);' % (
                 len(positional_args),)
             print >> f, '\tif (args == NULL) {'
-            print >> f, '\t\tPy_DECREF(%s);' % vararg
+            print >> f, '\t\tERR_DECREF(%s)' % vararg
             print >> f, '\t\tFUNCTION_RETURN(NULL)'
             print >> f, '\t}'
             tail = """{
-\t\tPy_DECREF(args);
-\t\tPy_DECREF(%s);
+\t\tERR_DECREF(args)
+\t\tERR_DECREF(%s)
 \t\tFUNCTION_RETURN(NULL);
 \t}
 \tPy_DECREF(args);""" % vararg
@@ -729,7 +713,7 @@
             while to_release:
                 v = to_release.pop()
                 if err_reachable:
-                    yield 'Py_DECREF(%s);' % v.name
+                    yield 'ERR_DECREF(%s)' % v.name
                 yield 'err%d_%d:' % (blocknum[block], len(to_release))
                 err_reachable = True
             if err_reachable:



More information about the Pypy-commit mailing list