def applevel(code, noconvert=False): code = '\n'.join([' ' + line for line in code.split('\n') if line]) code = 'def anonymous():\n' + code py_code = ffi.gc(lib.Py_CompileString(code, 'exec', lib.Py_file_input), lib.Py_DECREF) lib.Py_INCREF(py_code) py_elem = lib.PyObject_GetAttrString(py_code, 'co_consts') lib.Py_INCREF(py_elem) py_zero = ffi.gc(lib.PyInt_FromLong(0), lib.Py_DECREF) py_item = lib.PyObject_GetItem(py_elem, py_zero) py_locals = ffi.gc(lib.PyDict_New(), lib.Py_DECREF) py_globals = ffi.gc(lib.PyDict_New(), lib.Py_DECREF) py_bltns = lib.PyEval_GetBuiltins() lib.PyDict_SetItemString(py_globals, '__builtins__', py_bltns) py_res = lib.PyEval_EvalCode(py_item, py_globals, py_locals) return MetabiosisWrapper(py_res, noconvert=noconvert)
def __iter__(self): py_iter = ffi.gc(lib.PyObject_GetIter(self._cpyobj), lib.Py_DECREF) while True: py_next = lib.PyIter_Next(py_iter) if py_next is None: break yield self._maybe_pypy_convert(py_next)
def __iter__(self): py_iter = ffi.gc(lib.PyObject_GetIter(self.obj), lib.Py_DECREF) while True: py_next = lib.PyIter_Next(py_iter) if py_next is None: break yield self._maybe_pypy_convert(py_next)
def applevel(code, noconvert=False): code = '\n'.join([' ' + line for line in code.split('\n') if line]) code = 'def anonymous():\n' + code py_code = ffi.gc( lib.Py_CompileString(code, 'exec', lib.Py_file_input), lib.Py_DECREF) lib.Py_INCREF(py_code) py_elem = lib.PyObject_GetAttrString(py_code, 'co_consts') lib.Py_INCREF(py_elem) py_zero = ffi.gc(lib.PyInt_FromLong(0), lib.Py_DECREF) py_item = lib.PyObject_GetItem(py_elem, py_zero) py_locals = ffi.gc(lib.PyDict_New(), lib.Py_DECREF) py_globals = ffi.gc(lib.PyDict_New(), lib.Py_DECREF) py_bltns = lib.PyEval_GetBuiltins() lib.PyDict_SetItemString(py_globals, '__builtins__', py_bltns) py_res = lib.PyEval_EvalCode(py_item, py_globals, py_locals) return MetabiosisWrapper(py_res, noconvert=noconvert)
def convert_dict(obj, convert_values=True): dict = ffi.gc(lib.PyDict_New(), lib.Py_DECREF) for key, value in obj.iteritems(): if convert_values: value = convert(value) lib.PyDict_SetItem(dict, convert(key), value) return dict
def _call(self, args, kwargs=None, args_kwargs_converted=False): convert = not args_kwargs_converted arguments_tuple = convert_tuple(args, convert_items=convert) keywordargs = ffi.NULL if kwargs: keywordargs = convert_dict(kwargs, convert_values=convert) return_value = ffi.gc( lib.PyObject_Call(self.obj, arguments_tuple, keywordargs), lib.Py_DECREF) return self._maybe_pypy_convert(return_value)
def _call(self, args, kwargs=None, args_kwargs_converted=False): convert = not args_kwargs_converted arguments_tuple = convert_tuple(args, convert_items=convert) keywordargs = ffi.NULL if kwargs: keywordargs = convert_dict(kwargs, convert_values=convert) return_value = ffi.gc( lib.PyObject_Call(self._cpyobj, arguments_tuple, keywordargs), lib.Py_DECREF) return self._maybe_pypy_convert(return_value)
def __str__(self): py_str = ffi.gc(lib.PyObject_Str(self.obj), lib.Py_DECREF) return pypy_convert(py_str)
def __repr__(self): py_str = ffi.gc(lib.PyObject_Repr(self._cpyobj), lib.Py_DECREF) return pypy_convert(py_str)
def _getattr(self, name): c_name = ffi.new("char[]", name) py_attr = ffi.gc(lib.PyObject_GetAttrString(self._cpyobj, c_name), lib.Py_DECREF) return self._maybe_pypy_convert(py_attr)
def convert_int(obj): return ffi.gc(lib.PyInt_FromLong(obj), lib.Py_DECREF)
def __str__(self): py_str = ffi.gc(lib.PyObject_Str(self._cpyobj), lib.Py_DECREF) return pypy_convert(py_str)
def convert_string(s): return ffi.gc(lib.PyString_FromString(ffi.new("char[]", s)), lib.Py_DECREF)
def __getitem__(self, key): py_res = ffi.gc( lib.PyObject_GetItem(self.obj, convert(key)), lib.Py_DECREF) return self._maybe_pypy_convert(py_res)
def convert_tuple(values, convert_items=True): if convert_items: values = [convert(value) for value in values] return ffi.gc(lib.PyTuple_Pack(len(values), *values), lib.Py_DECREF)
def convert_None(obj): lib.Py_INCREF(lib.Py_None) return ffi.gc(lib.Py_None, lib.Py_DECREF)
def pypy_convert_dict(obj): items = ffi.gc(lib.PyDict_Items(obj), lib.Py_DECREF) return dict(pypy_convert_list(items))
def convert_bool(obj): py_obj = lib.Py_True if obj else lib.Py_False lib.Py_INCREF(py_obj) return ffi.gc(py_obj, lib.Py_DECREF)
def get_type(self): typeobject = ffi.cast("PyObject*", self._cpyobj.ob_type) lib.Py_INCREF(typeobject) return MetabiosisWrapper(ffi.gc(typeobject, lib.Py_DECREF))
def __dir__(self): py_lst = ffi.gc(lib.PyObject_Dir(self.obj), lib.Py_DECREF) return pypy_convert(py_lst)
def convert_float(obj): return ffi.gc(lib.PyFloat_FromDouble(obj), lib.Py_DECREF)
def _getattr(self, name): c_name = ffi.new("char[]", name) py_attr = ffi.gc( lib.PyObject_GetAttrString(self.obj, c_name), lib.Py_DECREF) return self._maybe_pypy_convert(py_attr)
def get_type(self): typeobject = ffi.cast("PyObject*", self.obj.ob_type) lib.Py_INCREF(typeobject) return MetabiosisWrapper(ffi.gc(typeobject, lib.Py_DECREF))
def convert_unicode(u): return ffi.gc( lib.PyUnicode_FromString(ffi.new("char[]", u.encode('utf-8'))), lib.Py_DECREF)
def __getitem__(self, key): py_res = ffi.gc(lib.PyObject_GetItem(self._cpyobj, convert(key)), lib.Py_DECREF) return self._maybe_pypy_convert(py_res)
def convert_list(obj): lst = ffi.gc(lib.PyList_New(len(obj)), lib.Py_DECREF) for i, x in enumerate(obj): lib.PyList_SetItem(lst, i, convert(x)) return lst
def __dir__(self): py_lst = ffi.gc(lib.PyObject_Dir(self._cpyobj), lib.Py_DECREF) return pypy_convert(py_lst)
def convert_slice(obj): return ffi.gc( lib.PySlice_New(convert(obj.start), convert(obj.stop), convert(obj.step)), lib.Py_DECREF)
def import_module(name, noconvert=False): module_object = lib.PyImport_ImportModule(name) return MetabiosisWrapper(ffi.gc(module_object, lib.Py_DECREF), noconvert)
def convert_slice(obj): return ffi.gc( lib.PySlice_New( convert(obj.start), convert(obj.stop), convert(obj.step)), lib.Py_DECREF)