-USING: alien.c-types alien.data kernel python.ffi ;
+USING: alien.c-types alien.data kernel python.ffi vocabs.loader words ;
IN: python.errors
-ERROR: python-error type message ;
-
<PRIVATE
-: get-error ( -- ptype pvalue )
- { void* void* void* } [ PyErr_Fetch ] with-out-parameters drop ;
+: get-error ( -- ptype pvalue ptraceback )
+ { void* void* void* } [ PyErr_Fetch ] with-out-parameters ;
-: throw-error ( ptype pvalue -- )
- [ "__name__" PyObject_GetAttrString ] [ PyObject_Str ] bi*
- [ &Py_DecRef PyString_AsString ] bi@ python-error ;
+! Breaking out of a circular dependency.
+: throw-error ( ptype pvalue ptraceback -- )
+ "throw-error" "python.throwing" lookup-word execute( a b c -- ) ;
PRIVATE>
--- /dev/null
+USING: arrays kernel python python.syntax sequences ;
+IN: python.throwing
+
+ERROR: python-error type message traceback ;
+
+PY-FROM: traceback => format_tb ( tb -- seq ) ;
+
+PY-METHODS: obj =>
+ __name__ ( o -- str )
+ __str__ ( o -- str ) ;
+
+: throw-error ( ptype pvalue ptraceback -- )
+ [ $__name__ py> ] [ __str__ py> ] [ [ format_tb py> ] [ f ] if* ] tri*
+ python-error ;