84 lines
2.1 KiB
Factor
84 lines
2.1 KiB
Factor
USING: accessors alien.data alien.libraries classes.struct
|
|
io.encodings.ascii io.encodings.utf8 kernel libc literals
|
|
python.errors python.ffi ;
|
|
IN: python.objects
|
|
|
|
! The None object
|
|
: (none) ( -- none )
|
|
"_Py_NoneStruct" "python" address-of ;
|
|
|
|
: <none> ( -- none )
|
|
(none) check-borrowed-ref ;
|
|
|
|
! Objects
|
|
: getattr ( obj str -- value )
|
|
PyObject_GetAttrString check-new-ref ;
|
|
|
|
: setattr ( obj str value -- )
|
|
PyObject_SetAttrString check-zero ;
|
|
|
|
: call-object ( obj args -- value )
|
|
PyObject_CallObject check-new-ref ;
|
|
|
|
: call-object-full ( obj args kwargs -- value )
|
|
PyObject_Call check-new-ref ;
|
|
|
|
! Tuples
|
|
: <py-tuple> ( length -- tuple )
|
|
PyTuple_New check-new-ref ;
|
|
|
|
: py-tuple-set-item ( obj pos val -- )
|
|
dup unsteal-ref PyTuple_SetItem check-zero ;
|
|
|
|
: py-tuple-get-item ( obj pos -- val )
|
|
PyTuple_GetItem dup Py_IncRef check-new-ref ;
|
|
|
|
: py-tuple-size ( obj -- len )
|
|
PyTuple_Size ;
|
|
|
|
: <1py-tuple> ( alien -- tuple )
|
|
1 <py-tuple> [ 0 rot py-tuple-set-item ] keep ;
|
|
|
|
! Dicts
|
|
: <py-dict> ( -- dict )
|
|
PyDict_New check-new-ref ;
|
|
|
|
: py-dict-set-item ( obj key val -- )
|
|
PyDict_SetItem check-zero ;
|
|
|
|
: py-dict-set-item-string ( dict key val -- )
|
|
PyDict_SetItemString check-zero ;
|
|
|
|
: py-dict-get-item-string ( obj key -- val )
|
|
PyDict_GetItemString check-borrowed-ref ;
|
|
|
|
: py-dict-size ( obj -- len )
|
|
PyDict_Size ;
|
|
|
|
! Lists
|
|
: <py-list> ( length -- list )
|
|
PyList_New check-new-ref ;
|
|
|
|
: py-list-size ( list -- len )
|
|
PyList_Size ;
|
|
|
|
: py-list-get-item ( obj pos -- val )
|
|
PyList_GetItem check-borrowed-ref ;
|
|
|
|
: py-list-set-item ( obj pos val -- )
|
|
dup unsteal-ref PyList_SetItem check-zero ;
|
|
|
|
! Functions
|
|
: <PyMethodDef> ( alien name doc/f -- cfunction )
|
|
PyMethodDef malloc-struct &free
|
|
swap [ utf8 malloc-string &free >>ml_doc ] when*
|
|
swap ascii malloc-string &free >>ml_name
|
|
swap >>ml_meth
|
|
flags{ METH_VARARGS METH_KEYWORDS } >>ml_flags ;
|
|
|
|
: <py-cfunction> ( alien -- cfunction )
|
|
"cfunction" f <PyMethodDef> f f
|
|
! It's not clear from the docs whether &Py_DecRef is right for
|
|
! PyCFunction_NewEx, but I'm betting on it.
|
|
PyCFunction_NewEx check-new-ref ;
|