36 lines
		
	
	
		
			939 B
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			939 B
		
	
	
	
		
			Factor
		
	
	
USING: accessors alien alien.c-types alien.data combinators.short-circuit
 | 
						|
destructors.private kernel namespaces python.ffi sequences vocabs.loader
 | 
						|
words ;
 | 
						|
IN: python.errors
 | 
						|
 | 
						|
<PRIVATE
 | 
						|
 | 
						|
: get-error ( -- ptype pvalue ptraceback )
 | 
						|
    { void* void* void* } [ PyErr_Fetch ] with-out-parameters ;
 | 
						|
 | 
						|
! Breaking out of a circular dependency.
 | 
						|
: throw-error ( ptype pvalue ptraceback -- )
 | 
						|
    "throw-error" "python.throwing" lookup-word execute( a b c -- ) ;
 | 
						|
 | 
						|
PRIVATE>
 | 
						|
 | 
						|
: (check-ref) ( ref -- ref )
 | 
						|
    [ get-error throw-error f ] unless* ;
 | 
						|
 | 
						|
: check-new-ref ( ref -- ref )
 | 
						|
    &Py_DecRef (check-ref) ;
 | 
						|
 | 
						|
: check-borrowed-ref ( ref -- ref )
 | 
						|
    dup Py_IncRef &Py_DecRef (check-ref) ;
 | 
						|
 | 
						|
: check-zero ( code -- )
 | 
						|
    0 = [ get-error throw-error ] unless ;
 | 
						|
 | 
						|
: unsteal-ref ( ref -- )
 | 
						|
    always-destructors get [
 | 
						|
        {
 | 
						|
            [ nip Py_DecRef-destructor? ]
 | 
						|
            [ alien>> [ alien-address ] bi@ = ]
 | 
						|
        } 2&& not
 | 
						|
    ] with filter! drop ;
 |