Author: fperrad Date: Sat Jan 10 01:53:20 2009 New Revision: 35333 Modified: trunk/languages/lua/src/lib/luaaux.pir trunk/languages/lua/src/pmc/luafunction.pmc
Log: [Lua] traceback - only with function name (step 1) Modified: trunk/languages/lua/src/lib/luaaux.pir ============================================================================== --- trunk/languages/lua/src/lib/luaaux.pir (original) +++ trunk/languages/lua/src/lib/luaaux.pir Sat Jan 10 01:53:20 2009 @@ -993,32 +993,57 @@ $I0 = $P0 if $I0 == .EXCEPT_EXIT goto L2 L1: - .local string msg - msg = ex - .local int lineno - .local string traceback, where - (traceback, where) = 'traceback'() - $S0 = where + .local pmc bt + bt = ex.'backtrace'() + $S0 = where() $S0 .= ' ' - $S0 .= msg + $S1 = ex + $S0 .= $S1 $S0 .= "\n" - $S0 .= traceback + $S1 = traceback(bt) + $S0 .= $S1 .return (1, $S0) L2: rethrow ex .end -.sub 'traceback' +.sub 'where' :anon # dummy implementation - .return ("stack traceback:\n\tdummy\n", "_._:0:") + .return ("_._:0:") # previous one that segfaults (see RT #60206) .local pmc obj - .local string traceback, where new obj, 'Lua' - traceback = obj.'traceback'(1) - where = obj.'where'() + $S0 = obj.'where'() + .return ($S0) +.end - .return (traceback, where) +.sub 'traceback' :anon + .param pmc bt + .local pmc iter, sub, outer, annos + new iter, 'Iterator', bt + .local string ret + ret = "stack traceback:" + L1: + unless iter goto L2 + $P0 = shift iter + sub = $P0['sub'] + if null sub goto L2 + $S0 = sub.'get_name'() + outer = sub.'get_outer'() + ret .= "\n\t" + unless null outer goto L3 + ret .= "[PIR]:" + goto L4 + L3: + ret .= "_._:0:" + L4: + ret .= " in function '" + ret .= $S0 + ret .= "'" + annos = $P0['annotations'] + goto L1 + L2: + .return (ret) .end Modified: trunk/languages/lua/src/pmc/luafunction.pmc ============================================================================== --- trunk/languages/lua/src/pmc/luafunction.pmc (original) +++ trunk/languages/lua/src/pmc/luafunction.pmc Sat Jan 10 01:53:20 2009 @@ -148,6 +148,15 @@ =over 4 +*/ + METHOD STRING *get_name() { + const Parrot_sub * const sub = PMC_sub(SELF); + STRING *retval = string_copy(INTERP, sub->name); + RETURN(STRING *retval); + } + +/* + =item C<PMC *getfenv()> =cut