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 ;
 |