[pypy-commit] pypy ffi-backend: Next test
arigo
noreply at buildbot.pypy.org
Sat Jun 23 12:36:08 CEST 2012
Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r55770:afcf318c5214
Date: 2012-06-23 11:49 +0200
http://bitbucket.org/pypy/pypy/changeset/afcf318c5214/
Log: Next test
diff --git a/pypy/module/_ffi_backend/ctypeobj.py b/pypy/module/_ffi_backend/ctypeobj.py
--- a/pypy/module/_ffi_backend/ctypeobj.py
+++ b/pypy/module/_ffi_backend/ctypeobj.py
@@ -3,7 +3,7 @@
from pypy.interpreter.gateway import interp2app, unwrap_spec
from pypy.interpreter.typedef import TypeDef
from pypy.rpython.lltypesystem import lltype, rffi
-from pypy.rlib.rarithmetic import intmask
+from pypy.rlib.rarithmetic import intmask, ovfcheck
from pypy.rlib.objectmodel import keepalive_until_here
from pypy.module._ffi_backend import cdataobj, misc
@@ -125,11 +125,32 @@
def newp(self, w_init):
space = self.space
datasize = self.size
+ #
if datasize < 0:
- xxx
- cdataobj.W_CDataOwnLength(space, )
- xxx
- cdata = cdataobj.W_CDataOwn(space, datasize, self)
+ if (space.isinstance_w(w_init, space.w_list) or
+ space.isinstance_w(w_init, space.w_tuple)):
+ length = space.int_w(space.len(w_init))
+ elif space.isinstance_w(w_init, space.w_str):
+ # from a string, we add the null terminator
+ length = space.int_w(space.len(w_init)) + 1
+ else:
+ length = space.getindex_w(w_init, space.w_OverflowError)
+ if length < 0:
+ raise OperationError(space.w_ValueError,
+ space.wrap("negative array length"))
+ w_init = space.w_None
+ #
+ try:
+ datasize = ovfcheck(length * self.ctitem.size)
+ except OverflowError:
+ raise OperationError(space.w_OverflowError,
+ space.wrap("array size would overflow a ssize_t"))
+ #
+ cdata = cdataobj.W_CDataOwnLength(space, datasize, self, length)
+ #
+ else:
+ cdata = cdataobj.W_CDataOwn(space, datasize, self)
+ #
if not space.is_w(w_init, space.w_None):
self.convert_from_object(cdata._cdata, w_init)
keepalive_until_here(cdata)
More information about the pypy-commit
mailing list