Hi folks!

For getting a plan how a stack-based VM like Python works, I added a
function that prints out the current object stack. Unfortunately, it
crashes the VM. Could someone here take a look at it? What's wrong with
it?:

--- snip ---
static PyObject *
sys_stack(PyObject *self)
{
        PyFrameObject *f = PyThreadState_GET()->frame;
        PyObject
                **i,
                **begin = f->f_localsplus,
                **end = f->f_valuestack;
        
        end += f->f_code->co_stacksize;
        flog(   "co_name: %s\n"
                "co_stacksize: %d\n"
                "localsplus: %d\n"
                "valuestack: %d\n",
                PyString_AsString(f->f_code->co_name), f->f_code->co_stacksize,
                f->f_localsplus, f->f_valuestack);
        flog("locals:\n");
        {
                PyObject *list = f->f_code->co_names;
                int len,i;
                
                len = PyList_Size(list);
                for (i=0; i<len; i++) {
                        PyObject *obi;
                        char *strval;
                        obi = PyList_GetItem(list, i);
                        if ((obi=PyObject_Str(obi))!=NULL) {
                                if ((strval=PyString_AsString(obi))!=NULL) {
                                        flog("[%d] %s\n", i, strval);
                                }
                        }
                        Py_DECREF(obi);
                }
                Py_DECREF(list);
        }
        flog("end of locals\n");
        for (i=begin; i<=end; i++) {
                int o = ((int)f->f_valuestack - (int)i)/4;
                PyObject *obi;
                char *strval;
                
                if (*i == NULL) {
                        flog("NULL\n");
                        break; }
                if ((obi=PyObject_Str(*i)) != NULL) {
                        if ((strval=PyString_AsString(obi)) != NULL) {
                                flog("[%3d] %s\n", o, strval);
                        }
                }
        }
        finished:
        Py_INCREF(Py_None);
        return Py_None;
}
--- snap ---

flog(fmt, ...) is my function to log to a file, sys_stack I've made available
to Python as sys.stack and PyFrame_New I modified so that it nulls the memory
allocated for the objects stack. Now the following Python code crashes...

--- snip ---
def f(foo,bar,boo,far):
        foobar='foobar'
        print foobar
        sys.stack()

f('foo','bar','boo','far') # CRASH
--- snap ---

...and in my "logfile" I have...

--- snip ---
co_name: f
co_stacksize: 1
localsplus: 136139316
valuestack: 136139336
locals:
end of locals
[  5] foo
[  4] bar
[  3] boo
[  2] far
[  1] foobar
[  0] <built-in function stack>
--- snap ---

Now the following things are not clear to me:
-Why does the VM crash? Did I use the wrong stack boundaries?
-Why are no locales printed?
-Why is the function "stack" not right before or after "foo"
 on the stack? When I disassemble the code of f with dis.dis,
 it reveals that sys.stack and foo are pushed onto the stack
 successively.

Greetings,
Fips
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to