def setup_buffer_procs(space, w_type, pto): bufspec = w_type.layout.typedef.buffer if bufspec is None and not space.is_w(w_type, space.w_unicode): # not a buffer, but let w_unicode be a read buffer return c_buf = lltype.malloc(PyBufferProcs, flavor='raw', zero=True) lltype.render_immortal(c_buf) c_buf.c_bf_getsegcount = llslot(space, bf_segcount) if space.is_w(w_type, space.w_str): # Special case: str doesn't support get_raw_address(), so we have a # custom get*buffer that instead gives the address of the char* in the # PyBytesObject*! c_buf.c_bf_getreadbuffer = llslot(space, str_getreadbuffer) c_buf.c_bf_getcharbuffer = llslot(space, str_getcharbuffer) elif space.is_w(w_type, space.w_unicode): # Special case: unicode doesn't support get_raw_address(), so we have a # custom get*buffer that instead gives the address of the char* in the # PyUnicodeObject*! c_buf.c_bf_getreadbuffer = llslot(space, unicode_getreadbuffer) elif space.is_w(w_type, space.w_buffer): # Special case: we store a permanent address on the cpyext wrapper, # so we'll reuse that. # Note: we could instead store a permanent address on the buffer object, # and use get_raw_address() c_buf.c_bf_getreadbuffer = llslot(space, buf_getreadbuffer) c_buf.c_bf_getcharbuffer = llslot(space, buf_getcharbuffer) else: # use get_raw_address() c_buf.c_bf_getreadbuffer = llslot(space, bf_getreadbuffer) c_buf.c_bf_getcharbuffer = llslot(space, bf_getcharbuffer) if bufspec == 'read-write': c_buf.c_bf_getwritebuffer = llslot(space, bf_getwritebuffer) pto.c_tp_as_buffer = c_buf pto.c_tp_flags |= Py_TPFLAGS_HAVE_GETCHARBUFFER pto.c_tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER
def setup_buffer_procs(space, w_type, pto): bufspec = w_type.layout.typedef.buffer if bufspec is None and not space.is_w(w_type, space.w_unicode): # not a buffer, but let w_unicode be a read buffer return c_buf = lltype.malloc(PyBufferProcs, flavor='raw', zero=True) lltype.render_immortal(c_buf) c_buf.c_bf_getsegcount = llslot(space, bf_segcount) if space.is_w(w_type, space.w_bytes): # Special case: str doesn't support get_raw_address(), so we have a # custom get*buffer that instead gives the address of the char* in the # PyBytesObject*! c_buf.c_bf_getreadbuffer = llslot(space, str_getreadbuffer) c_buf.c_bf_getcharbuffer = llslot(space, str_getcharbuffer) elif space.is_w(w_type, space.w_unicode): # Special case: unicode doesn't support get_raw_address(), so we have a # custom get*buffer that instead gives the address of the char* in the # PyUnicodeObject*! c_buf.c_bf_getreadbuffer = llslot(space, unicode_getreadbuffer) elif space.is_w(w_type, space.w_buffer): # Special case: we store a permanent address on the cpyext wrapper, # so we'll reuse that. # Note: we could instead store a permanent address on the buffer object, # and use get_raw_address() c_buf.c_bf_getreadbuffer = llslot(space, buf_getreadbuffer) c_buf.c_bf_getcharbuffer = llslot(space, buf_getcharbuffer) else: # use get_raw_address() c_buf.c_bf_getreadbuffer = llslot(space, bf_getreadbuffer) c_buf.c_bf_getcharbuffer = llslot(space, bf_getcharbuffer) if bufspec == 'read-write': c_buf.c_bf_getwritebuffer = llslot(space, bf_getwritebuffer) pto.c_tp_as_buffer = c_buf pto.c_tp_flags |= Py_TPFLAGS_HAVE_GETCHARBUFFER pto.c_tp_flags |= Py_TPFLAGS_HAVE_NEWBUFFER
def get_version(self): if not self.version: space = self.space w_version = space.sys.get('version') version = space.str_w(w_version) self.version = rffi.str2charp(version) lltype.render_immortal(self.version) return self.version
def setup_buffer_buffer_procs(space, pto): c_buf = lltype.malloc(PyBufferProcs, flavor='raw', zero=True) lltype.render_immortal(c_buf) c_buf.c_bf_getsegcount = llhelper(str_segcount.api_func.functype, str_segcount.api_func.get_wrapper(space)) c_buf.c_bf_getreadbuffer = llhelper(buf_getreadbuffer.api_func.functype, buf_getreadbuffer.api_func.get_wrapper(space)) pto.c_tp_as_buffer = c_buf
def setup_bytes_buffer_procs(space, pto): c_buf = lltype.malloc(PyBufferProcs, flavor='raw', zero=True) lltype.render_immortal(c_buf) c_buf.c_bf_getbuffer = llhelper( bytes_getbuffer.api_func.functype, bytes_getbuffer.api_func.get_wrapper(space)) pto.c_tp_as_buffer = c_buf pto.c_tp_flags |= Py_TPFLAGS_HAVE_GETCHARBUFFER
def get_version(self): if not self.version: space = self.space w_version = space.sys.get('version') version = space.str_w(w_version) self.version = rffi.str2charp(version) lltype.render_immortal(self.version) return self.version foo = self.import_module(name='foo', init=init)
def setup_string_buffer_procs(space, pto): c_buf = lltype.malloc(PyBufferProcs, flavor='raw', zero=True) lltype.render_immortal(c_buf) c_buf.c_bf_getsegcount = llhelper(str_segcount.api_func.functype, str_segcount.api_func.get_wrapper(space)) c_buf.c_bf_getreadbuffer = llhelper(str_getreadbuffer.api_func.functype, str_getreadbuffer.api_func.get_wrapper(space)) c_buf.c_bf_getcharbuffer = llhelper(str_getcharbuffer.api_func.functype, str_getcharbuffer.api_func.get_wrapper(space)) pto.c_tp_as_buffer = c_buf pto.c_tp_flags |= Py_TPFLAGS_HAVE_GETCHARBUFFER
def get_programname(self): if not self.programname: space = self.space argv = space.sys.get('argv') if space.len_w(argv): argv0 = space.getitem(argv, space.newint(0)) progname = space.unicode_w(argv0) else: progname = u"pypy3" self.programname = rffi.unicode2wcharp(progname) lltype.render_immortal(self.programname) return self.programname
def get_programname(self): if not self.programname: space = self.space argv = space.sys.get('argv') if space.len_w(argv): argv0 = space.getitem(argv, space.wrap(0)) progname = space.str_w(argv0) else: progname = "pypy" self.programname = rffi.str2charp(progname) lltype.render_immortal(self.programname) return self.programname
def get_programname(self): if not self.programname: space = self.space argv = space.sys.get('argv') if space.len_w(argv): argv0 = space.getitem(argv, space.newint(0)) progname = space.utf8_w(argv0) lgt = space.len_w(argv0) else: progname = "pypy3" lgt = len(progname) self.programname = rffi.utf82wcharp(progname, lgt) lltype.render_immortal(self.programname) return self.programname
def get_new_method_def(space): state = space.fromcache(State) if state.new_method_def: return state.new_method_def ptr = lltype.malloc(PyMethodDef, flavor="raw", zero=True, immortal=True) ptr.c_ml_name = rffi.cast(rffi.CONST_CCHARP, rffi.str2charp("__new__")) lltype.render_immortal(ptr.c_ml_name) rffi.setintfield(ptr, 'c_ml_flags', METH_VARARGS | METH_KEYWORDS) ptr.c_ml_doc = rffi.cast(rffi.CONST_CCHARP, rffi.str2charp( "T.__new__(S, ...) -> a new object with type S, a subtype of T")) lltype.render_immortal(ptr.c_ml_doc) state.new_method_def = ptr return ptr
def get_new_method_def(space): state = space.fromcache(State) if state.new_method_def: return state.new_method_def from pypy.module.cpyext.modsupport import PyMethodDef ptr = lltype.malloc(PyMethodDef, flavor="raw", zero=True, immortal=True) ptr.c_ml_name = rffi.str2charp("__new__") lltype.render_immortal(ptr.c_ml_name) rffi.setintfield(ptr, "c_ml_flags", METH_VARARGS | METH_KEYWORDS) ptr.c_ml_doc = rffi.str2charp("T.__new__(S, ...) -> a new object with type S, a subtype of T") lltype.render_immortal(ptr.c_ml_doc) state.new_method_def = ptr return ptr
def get_new_method_def(space): state = space.fromcache(State) if state.new_method_def: return state.new_method_def ptr = lltype.malloc(PyMethodDef, flavor="raw", zero=True, immortal=True) ptr.c_ml_name = rffi.cast(rffi.CONST_CCHARP, rffi.str2charp("__new__")) lltype.render_immortal(ptr.c_ml_name) rffi.setintfield(ptr, 'c_ml_flags', METH_VARARGS | METH_KEYWORDS) ptr.c_ml_doc = rffi.cast(rffi.CONST_CCHARP, rffi.str2charp( "Create and return a new object. " "See help(type) for accurate signature.")) lltype.render_immortal(ptr.c_ml_doc) state.new_method_def = ptr return ptr
def setup_bytes_buffer_procs(space, pto): c_buf = lltype.malloc(PyBufferProcs, flavor="raw", zero=True) lltype.render_immortal(c_buf) c_buf.c_bf_getbuffer = llhelper(bytes_getbuffer.api_func.functype, bytes_getbuffer.api_func.get_wrapper(space)) pto.c_tp_as_buffer = c_buf pto.c_tp_flags |= Py_TPFLAGS_HAVE_GETCHARBUFFER