Author: Philip Jenvey <pjen...@underboss.org>
Branch: py3k
Changeset: r69052:220c588360e5
Date: 2014-02-02 16:35 -0800
http://bitbucket.org/pypy/pypy/changeset/220c588360e5/

Log:    merge default

diff --git a/pypy/module/_cffi_backend/test/test_handle.py 
b/pypy/module/_cffi_backend/test/test_handle.py
--- a/pypy/module/_cffi_backend/test/test_handle.py
+++ b/pypy/module/_cffi_backend/test/test_handle.py
@@ -1,20 +1,5 @@
 import random
-from pypy.module._cffi_backend.handle import CffiHandles, reduced_value
-
-
-def test_reduced_value():
-    assert reduced_value(0) == 0
-    assert reduced_value(1) == 0
-    assert reduced_value(2) == 1
-    assert reduced_value(3) == 0
-    assert reduced_value(4) == 2
-    assert reduced_value(5) == 1
-    assert reduced_value(6) == 3
-    assert reduced_value(7) == 0
-    assert reduced_value(8) == 4
-    assert reduced_value(9) == 2
-    assert reduced_value(10) == 5
-    assert reduced_value(11) == 1
+from pypy.module._cffi_backend.handle import CffiHandles
 
 
 class PseudoWeakRef(object):
diff --git a/pypy/module/_csv/interp_reader.py 
b/pypy/module/_csv/interp_reader.py
--- a/pypy/module/_csv/interp_reader.py
+++ b/pypy/module/_csv/interp_reader.py
@@ -39,6 +39,7 @@
         field_builder.append(c)
 
     def save_field(self, field_builder):
+        space = self.space
         field = field_builder.build()
         if self.numeric_field:
             from rpython.rlib.rstring import ParseStringError
@@ -46,12 +47,12 @@
             self.numeric_field = False
             try:
                 ff = string_to_float(field)
-            except ParseStringError, e:
-                raise OperationError(self.space.w_ValueError,
-                                     self.space.wrap(e.msg))
-            w_obj = self.space.wrap(ff)
+            except ParseStringError as e:
+                from pypy.objspace.std.inttype import wrap_parsestringerror
+                raise wrap_parsestringerror(space, e, space.wrap(field))
+            w_obj = space.wrap(ff)
         else:
-            w_obj = self.space.wrap(field)
+            w_obj = space.wrap(field)
         self.fields_w.append(w_obj)
 
     def next_w(self):
diff --git a/pypy/module/micronumpy/interp_boxes.py 
b/pypy/module/micronumpy/interp_boxes.py
--- a/pypy/module/micronumpy/interp_boxes.py
+++ b/pypy/module/micronumpy/interp_boxes.py
@@ -251,6 +251,10 @@
         value = space.is_true(self)
         return get_dtype_cache(space).w_booldtype.box(value)
 
+    def descr_zero(self, space):
+        from pypy.module.micronumpy.interp_dtype import get_dtype_cache
+        return get_dtype_cache(space).w_longdtype.box(0)
+
     def descr_ravel(self, space):
         from pypy.module.micronumpy.base import convert_to_array
         w_values = space.newtuple([self])
@@ -582,6 +586,12 @@
     __hash__ = interp2app(W_GenericBox.descr_hash),
 
     tolist = interp2app(W_GenericBox.item),
+    min = interp2app(W_GenericBox.descr_self),
+    max = interp2app(W_GenericBox.descr_self),
+    argmin = interp2app(W_GenericBox.descr_zero),
+    argmax = interp2app(W_GenericBox.descr_zero),
+    sum = interp2app(W_GenericBox.descr_self),
+    prod = interp2app(W_GenericBox.descr_self),
     any = interp2app(W_GenericBox.descr_any),
     all = interp2app(W_GenericBox.descr_all),
     ravel = interp2app(W_GenericBox.descr_ravel),
diff --git a/pypy/module/micronumpy/test/test_scalar.py 
b/pypy/module/micronumpy/test/test_scalar.py
--- a/pypy/module/micronumpy/test/test_scalar.py
+++ b/pypy/module/micronumpy/test/test_scalar.py
@@ -102,6 +102,16 @@
         assert b == a
         assert b is not a
 
+    def test_methods(self):
+        import numpy as np
+        for a in [np.int32(2), np.float64(2.0), np.complex64(42)]:
+            for op in ['min', 'max', 'sum', 'prod']:
+                assert getattr(a, op)() == a
+            for op in ['argmin', 'argmax']:
+                b = getattr(a, op)()
+                assert type(b) is np.int_
+                assert b == 0
+
     def test_buffer(self):
         import numpy as np
         a = np.int32(123)
diff --git a/pypy/objspace/std/floattype.py b/pypy/objspace/std/floattype.py
--- a/pypy/objspace/std/floattype.py
+++ b/pypy/objspace/std/floattype.py
@@ -34,20 +34,11 @@
         value = space.float_w(w_obj)
     elif (space.isinstance_w(w_value, space.w_str) or
           space.isinstance_w(w_value, space.w_bytearray)):
-        strvalue = space.bufferstr_w(w_value)
-        try:
-            value = rfloat.string_to_float(strvalue.decode('latin-1'))
-        except ParseStringError, e:
-            raise OperationError(space.w_ValueError,
-                                 space.wrap(e.msg))
+        value = _string_to_float(space, w_value, space.bufferstr_w(w_value))
     elif space.isinstance_w(w_value, space.w_unicode):
         from unicodeobject import unicode_to_decimal_w
-        strvalue = unicode_to_decimal_w(space, w_value)
-        try:
-            value = rfloat.string_to_float(strvalue)
-        except ParseStringError, e:
-            raise OperationError(space.w_ValueError,
-                                 space.wrap(e.msg))
+        value = _string_to_float(space, w_value,
+                                 unicode_to_decimal_w(space, w_value))
     else:
         value = space.float_w(w_x)
     w_obj = space.allocate_instance(W_FloatObject, w_floattype)
@@ -55,6 +46,14 @@
     return w_obj
 
 
+def _string_to_float(space, w_source, string):
+    try:
+        return rfloat.string_to_float(string)
+    except ParseStringError as e:
+        from pypy.objspace.std.inttype import wrap_parsestringerror
+        raise wrap_parsestringerror(space, e, w_source)
+
+
 def detect_floatformat():
     from rpython.rtyper.lltypesystem import rffi, lltype
     buf = lltype.malloc(rffi.CCHARP.TO, 8, flavor='raw')
diff --git a/pypy/objspace/std/inttype.py b/pypy/objspace/std/inttype.py
--- a/pypy/objspace/std/inttype.py
+++ b/pypy/objspace/std/inttype.py
@@ -9,7 +9,8 @@
 from rpython.rlib.rarithmetic import r_uint, string_to_int
 from rpython.rlib.objectmodel import instantiate
 from rpython.rlib.rbigint import rbigint
-from rpython.rlib.rstring import ParseStringError, ParseStringOverflowError
+from rpython.rlib.rstring import (
+    InvalidBaseError, ParseStringError, ParseStringOverflowError)
 from rpython.rlib import jit
 
 # ____________________________________________________________
@@ -70,27 +71,33 @@
 # ____________________________________________________________
 
 ## @jit.elidable
-## def string_to_int_or_long(space, string, base=10):
+## def string_to_int_or_long(space, w_source, string, base=10):
 ##     w_longval = None
 ##     value = 0
 ##     try:
 ##         value = string_to_int(string, base)
-##     except ParseStringError, e:
-##         raise OperationError(space.w_ValueError,
-##                              space.wrap(e.msg))
+##     except ParseStringError as e:
+##         raise wrap_parsestringerror(space, e, w_source)
 ##     except ParseStringOverflowError, e:
-##         w_longval = retry_to_w_long(space, e.parser)
+##         w_longval = retry_to_w_long(space, e.parser, w_source)
 ##     return value, w_longval
 
-## def retry_to_w_long(space, parser):
+## def retry_to_w_long(space, parser, w_source):
 ##     parser.rewind()
 ##     try:
 ##         bigint = rbigint._from_numberstring_parser(parser)
-##     except ParseStringError, e:
-##         raise OperationError(space.w_ValueError,
-##                              space.wrap(e.msg))
+##     except ParseStringError as e:
+##         raise wrap_parsestringerror(space, e, w_source)
 ##     return space.newlong_from_rbigint(bigint)
 
+def wrap_parsestringerror(space, e, w_source):
+    if isinstance(e, InvalidBaseError):
+        w_msg = space.wrap(e.msg)
+    else:
+        w_msg = space.wrap('%s: %s' % (e.msg,
+                                       space.str_w(space.repr(w_source))))
+    return OperationError(space.w_ValueError, w_msg)
+
 ## @unwrap_spec(w_x = WrappedDefault(0))
 ## def descr__new__(space, w_inttype, w_x, w_base=None):
 ##     from pypy.objspace.std.intobject import W_IntObject
@@ -117,11 +124,12 @@
 ##             # an overflowing long
 ##             value = space.int_w(w_obj)
 ##         elif space.isinstance_w(w_value, space.w_str):
-##             value, w_longval = string_to_int_or_long(space, 
space.str_w(w_value))
+##             value, w_longval = string_to_int_or_long(space, w_value,
+##                                                      space.str_w(w_value))
 ##         elif space.isinstance_w(w_value, space.w_unicode):
 ##             from pypy.objspace.std.unicodeobject import unicode_to_decimal_w
 ##             string = unicode_to_decimal_w(space, w_value)
-##             value, w_longval = string_to_int_or_long(space, string)
+##             value, w_longval = string_to_int_or_long(space, w_value, string)
 ##         else:
 ##             # If object supports the buffer interface
 ##             try:
@@ -134,7 +142,8 @@
 ##                     w_value)
 ##             else:
 ##                 buf = space.interp_w(Buffer, w_buffer)
-##                 value, w_longval = string_to_int_or_long(space, 
buf.as_str())
+##                 value, w_longval = string_to_int_or_long(space, w_value,
+##                                                          buf.as_str())
 ##     else:
 ##         base = space.int_w(w_base)
 
@@ -149,7 +158,7 @@
 ##                                      space.wrap("int() can't convert 
non-string "
 ##                                                 "with explicit base"))
 
-##         value, w_longval = string_to_int_or_long(space, s, base)
+##         value, w_longval = string_to_int_or_long(space, w_value, s, base)
 
 ##     if w_longval is not None:
 ##         if not space.is_w(w_inttype, space.w_int):
diff --git a/pypy/objspace/std/longtype.py b/pypy/objspace/std/longtype.py
--- a/pypy/objspace/std/longtype.py
+++ b/pypy/objspace/std/longtype.py
@@ -35,12 +35,12 @@
             return _from_intlike(space, w_longtype, w_obj)
         elif space.isinstance_w(w_value, space.w_unicode):
             from pypy.objspace.std.unicodeobject import unicode_to_decimal_w
-            return string_to_w_long(space, w_longtype,
+            return string_to_w_long(space, w_longtype, w_value,
                                     unicode_to_decimal_w(space, w_value))
         elif (space.isinstance_w(w_value, space.w_bytearray) or
               space.isinstance_w(w_value, space.w_bytes)):
-            strvalue = space.bufferstr_w(w_value)
-            return string_to_w_long(space, w_longtype, 
strvalue.decode('latin-1'))
+            return string_to_w_long(space, w_longtype, w_value,
+                                    space.bufferstr_w(w_value))
         else:
             try:
                 w_buffer = space.buffer(w_value)
@@ -52,8 +52,8 @@
                     w_value)
             else:
                 buf = space.interp_w(Buffer, w_buffer)
-                return string_to_w_long(space, w_longtype,
-                                        buf.as_str().decode('latin-1'))
+                return string_to_w_long(space, w_longtype, w_value,
+                                        buf.as_str())
     else:
         try:
             base = space.int_w(w_base)
@@ -73,7 +73,7 @@
                 raise OperationError(space.w_TypeError,
                                      space.wrap("int() can't convert 
non-string "
                                                 "with explicit base"))
-        return string_to_w_long(space, w_longtype, s, base)
+        return string_to_w_long(space, w_longtype, w_value, s, base)
 
 
 def _from_intlike(space, w_longtype, w_intlike):
@@ -83,12 +83,13 @@
     return newbigint(space, w_longtype, space.bigint_w(w_obj))
 
 
-def string_to_w_long(space, w_longtype, s, base=10):
+def string_to_w_long(space, w_longtype, w_source, string, base=10):
     try:
-        bigint = rbigint.fromstr(s, base, ignore_l_suffix=True, fname=u'int')
-    except ParseStringError, e:
-        raise OperationError(space.w_ValueError,
-                             space.wrap(e.msg))
+        bigint = rbigint.fromstr(string, base, ignore_l_suffix=True,
+                                 fname=u'int')
+    except ParseStringError as e:
+        from pypy.objspace.std.inttype import wrap_parsestringerror
+        raise wrap_parsestringerror(space, e, w_source)
     return newbigint(space, w_longtype, bigint)
 string_to_w_long._dont_inline_ = True
 
diff --git a/pypy/objspace/std/mapdict.py b/pypy/objspace/std/mapdict.py
--- a/pypy/objspace/std/mapdict.py
+++ b/pypy/objspace/std/mapdict.py
@@ -57,7 +57,7 @@
         return True
 
     def delete(self, obj, selector):
-        return None
+        pass
 
     def find_map_attr(self, selector):
         if jit.we_are_jitted():
@@ -291,6 +291,7 @@
     def delete(self, obj, selector):
         if selector == self.selector:
             # ok, attribute is deleted
+            self.ever_mutated = True
             return self.back.copy(obj)
         new_obj = self.back.delete(obj, selector)
         if new_obj is not None:
diff --git a/pypy/objspace/std/test/test_intobject.py 
b/pypy/objspace/std/test/test_intobject.py
--- a/pypy/objspace/std/test/test_intobject.py
+++ b/pypy/objspace/std/test/test_intobject.py
@@ -1,3 +1,4 @@
+# encoding: utf-8
 import py
 import sys
 from pypy.objspace.std import intobject as iobj
@@ -492,6 +493,18 @@
         assert str(e.value) == (
             "int() argument must be a string or a number, not 'list'")
 
+    def test_invalid_literal_message(self):
+        import sys
+        if '__pypy__' not in sys.builtin_module_names:
+            skip('PyPy 2.x/CPython 3.4 only')
+        for value in b'  1j ', u'  1&#1634;&#1635;&#1636;j ':
+            try:
+                int(value)
+            except ValueError as e:
+                assert repr(value) in str(e)
+            else:
+                assert False, value
+
 
 class AppTestIntOptimizedAdd(AppTestInt):
     spaceconfig = {"objspace.std.optimized_int_add": True}
diff --git a/pypy/objspace/std/test/test_mapdict.py 
b/pypy/objspace/std/test/test_mapdict.py
--- a/pypy/objspace/std/test/test_mapdict.py
+++ b/pypy/objspace/std/test/test_mapdict.py
@@ -144,7 +144,15 @@
     assert obj2.map.back.ever_mutated == True
     assert obj2.map is obj.map
 
-
+def test_attr_immutability_delete(monkeypatch):
+    cls = Class()
+    obj = cls.instantiate()
+    obj.setdictvalue(space, "a", 10)
+    map1 = obj.map
+    obj.deldictvalue(space, "a")
+    obj.setdictvalue(space, "a", 20)
+    assert obj.map.ever_mutated == True
+    assert obj.map is map1
 
 def test_delete():
     for i, dattr in enumerate(["a", "b", "c"]):
diff --git a/rpython/annotator/annrpython.py b/rpython/annotator/annrpython.py
--- a/rpython/annotator/annrpython.py
+++ b/rpython/annotator/annrpython.py
@@ -24,7 +24,6 @@
 
     def __init__(self, translator=None, policy=None, bookkeeper=None):
         import rpython.rtyper.extfuncregistry # has side effects
-        import rpython.rlib.nonconst # has side effects
 
         if translator is None:
             # interface for tests
diff --git a/rpython/annotator/unaryop.py b/rpython/annotator/unaryop.py
--- a/rpython/annotator/unaryop.py
+++ b/rpython/annotator/unaryop.py
@@ -4,7 +4,6 @@
 
 from __future__ import absolute_import
 
-from types import MethodType
 from rpython.flowspace.operation import op
 from rpython.annotator.model import (SomeObject, SomeInteger, SomeBool,
     SomeString, SomeChar, SomeList, SomeDict, SomeTuple, SomeImpossibleValue,
@@ -757,63 +756,6 @@
             # This should probably never happen
             raise AnnotatorError("Cannot call len on a pbc")
 
-# annotation of low-level types
-from rpython.rtyper.llannotation import (
-    SomePtr, SomeLLADTMeth, ll_to_annotation, lltype_to_annotation,
-    annotation_to_lltype)
-
-class __extend__(SomePtr):
-
-    def getattr(self, s_attr):
-        assert s_attr.is_constant(), "getattr on ptr %r with non-constant 
field-name" % self.ll_ptrtype
-        example = self.ll_ptrtype._example()
-        try:
-            v = example._lookup_adtmeth(s_attr.const)
-        except AttributeError:
-            v = getattr(example, s_attr.const)
-            return ll_to_annotation(v)
-        else:
-            if isinstance(v, MethodType):
-                from rpython.rtyper.lltypesystem import lltype
-                ll_ptrtype = lltype.typeOf(v.im_self)
-                assert isinstance(ll_ptrtype, (lltype.Ptr, lltype.InteriorPtr))
-                return SomeLLADTMeth(ll_ptrtype, v.im_func)
-            return getbookkeeper().immutablevalue(v)
-    getattr.can_only_throw = []
-
-    def len(self):
-        length = self.ll_ptrtype._example()._fixedlength()
-        if length is None:
-            return SomeObject.len(self)
-        else:
-            return immutablevalue(length)
-
-    def setattr(self, s_attr, s_value): # just doing checking
-        assert s_attr.is_constant(), "setattr on ptr %r with non-constant 
field-name" % self.ll_ptrtype
-        example = self.ll_ptrtype._example()
-        if getattr(example, s_attr.const) is not None:  # ignore Void s_value
-            v_lltype = annotation_to_lltype(s_value)
-            setattr(example, s_attr.const, v_lltype._defl())
-
-    def call(self, args):
-        args_s, kwds_s = args.unpack()
-        if kwds_s:
-            raise Exception("keyword arguments to call to a low-level fn ptr")
-        info = 'argument to ll function pointer call'
-        llargs = [annotation_to_lltype(s_arg,info)._defl() for s_arg in args_s]
-        v = self.ll_ptrtype._example()(*llargs)
-        return ll_to_annotation(v)
-
-    def bool(self):
-        return s_Bool
-
-class __extend__(SomeLLADTMeth):
-
-    def call(self, args):
-        bookkeeper = getbookkeeper()
-        s_func = bookkeeper.immutablevalue(self.func)
-        return s_func.call(args.prepend(lltype_to_annotation(self.ll_ptrtype)))
-
 #_________________________________________
 # weakrefs
 
diff --git a/rpython/rlib/rarithmetic.py b/rpython/rlib/rarithmetic.py
--- a/rpython/rlib/rarithmetic.py
+++ b/rpython/rlib/rarithmetic.py
@@ -691,9 +691,8 @@
     characters of 's'.  Raises ParseStringError in case of error.
     Raises ParseStringOverflowError in case the result does not fit.
     """
-    from rpython.rlib.rstring import NumberStringParser, \
-        ParseStringOverflowError, \
-        ParseStringError, strip_spaces
+    from rpython.rlib.rstring import (
+        NumberStringParser, ParseStringOverflowError, strip_spaces)
     s = literal = strip_spaces(s)
     p = NumberStringParser(s, literal, base, u'int')
     base = p.base
diff --git a/rpython/rlib/rfloat.py b/rpython/rlib/rfloat.py
--- a/rpython/rlib/rfloat.py
+++ b/rpython/rlib/rfloat.py
@@ -25,7 +25,8 @@
 
 globals().update(rffi_platform.configure(CConfig))
 
-@objectmodel.enforceargs(unicode)
+INVALID_MSG = "invalid literal for float()"
+
 def string_to_float(s):
     """
     Conversion of string to float.
@@ -37,10 +38,8 @@
     from rpython.rlib.rstring import strip_spaces, ParseStringError
 
     s = strip_spaces(s)
-
     if not s:
-        raise ParseStringError(u"empty string for float()")
-
+        raise ParseStringError(INVALID_MSG)
 
     try:
         ascii_s = s.encode('ascii')
@@ -72,9 +71,7 @@
     try:
         return rstring_to_float(ascii_s)
     except ValueError:
-        # note that we still put the original unicode string in the error
-        # message, not ascii_s
-        raise ParseStringError(u"invalid literal for float(): '%s'" % s)
+        raise ParseStringError(INVALID_MSG)
 
 def rstring_to_float(s):
     from rpython.rlib.rdtoa import strtod
diff --git a/rpython/rlib/rstring.py b/rpython/rlib/rstring.py
--- a/rpython/rlib/rstring.py
+++ b/rpython/rlib/rstring.py
@@ -282,6 +282,9 @@
     def __init__(self, msg):
         self.msg = msg
 
+class InvalidBaseError(ParseStringError):
+    """Signals an invalid base argument"""
+
 class ParseStringOverflowError(Exception):
     def __init__(self, parser):
         self.parser = parser
@@ -290,13 +293,12 @@
 class NumberStringParser:
 
     def error(self):
-        raise ParseStringError(u"invalid literal for %s() with base %d: '%s'" %
-                               (self.fname, self.original_base, self.literal))
+        raise ParseStringError("invalid literal for %s() with base %d" %
+                               (self.fname, self.original_base))
 
     @enforceargs(None, unicode, unicode, int, unicode)
     @with_unicode_literals
     def __init__(self, s, literal, base, fname):
-        self.literal = literal
         self.fname = fname
         sign = 1
         if s.startswith('-'):
@@ -317,7 +319,7 @@
             else:
                 base = 10
         elif base < 2 or base > 36:
-            raise ParseStringError, u"%s() base must be >= 2 and <= 36" % 
(fname,)
+            raise InvalidBaseError("%s() base must be >= 2 and <= 36" % fname)
         self.base = base
 
         if base == 16 and (s.startswith('0x') or s.startswith('0X')):
diff --git a/rpython/rlib/test/test_rweaklist.py 
b/rpython/rlib/test/test_rweaklist.py
--- a/rpython/rlib/test/test_rweaklist.py
+++ b/rpython/rlib/test/test_rweaklist.py
@@ -1,5 +1,20 @@
 import gc
-from rpython.rlib.rweaklist import RWeakListMixin
+from rpython.rlib.rweaklist import RWeakListMixin, _reduced_value as 
reduced_value
+
+
+def test_reduced_value():
+    assert reduced_value(0) == 0
+    assert reduced_value(1) == 0
+    assert reduced_value(2) == 1
+    assert reduced_value(3) == 0
+    assert reduced_value(4) == 2
+    assert reduced_value(5) == 1
+    assert reduced_value(6) == 3
+    assert reduced_value(7) == 0
+    assert reduced_value(8) == 4
+    assert reduced_value(9) == 2
+    assert reduced_value(10) == 5
+    assert reduced_value(11) == 1
 
 
 class A(object):
diff --git a/rpython/rtyper/llannotation.py b/rpython/rtyper/llannotation.py
--- a/rpython/rtyper/llannotation.py
+++ b/rpython/rtyper/llannotation.py
@@ -1,6 +1,7 @@
 """
 Code for annotating low-level thingies.
 """
+from types import MethodType
 from rpython.tool.pairtype import pair, pairtype
 from rpython.annotator.model import (
     SomeObject, SomeSingleFloat, SomeFloat, SomeLongFloat, SomeChar,
@@ -108,6 +109,54 @@
     def can_be_none(self):
         return False
 
+    def getattr(self, s_attr):
+        from rpython.annotator.bookkeeper import getbookkeeper
+        if not s_attr.is_constant():
+            raise AnnotatorError("getattr on ptr %r with non-constant "
+                                 "field-name" % self.ll_ptrtype)
+        example = self.ll_ptrtype._example()
+        try:
+            v = example._lookup_adtmeth(s_attr.const)
+        except AttributeError:
+            v = getattr(example, s_attr.const)
+            return ll_to_annotation(v)
+        else:
+            if isinstance(v, MethodType):
+                ll_ptrtype = lltype.typeOf(v.im_self)
+                assert isinstance(ll_ptrtype, (lltype.Ptr, lltype.InteriorPtr))
+                return SomeLLADTMeth(ll_ptrtype, v.im_func)
+            return getbookkeeper().immutablevalue(v)
+    getattr.can_only_throw = []
+
+    def len(self):
+        from rpython.annotator.bookkeeper import getbookkeeper
+        length = self.ll_ptrtype._example()._fixedlength()
+        if length is None:
+            return SomeObject.len(self)
+        else:
+            return getbookkeeper().immutablevalue(length)
+
+    def setattr(self, s_attr, s_value): # just doing checking
+        if not s_attr.is_constant():
+            raise AnnotatorError("setattr on ptr %r with non-constant "
+                                 "field-name" % self.ll_ptrtype)
+        example = self.ll_ptrtype._example()
+        if getattr(example, s_attr.const) is not None:  # ignore Void s_value
+            v_lltype = annotation_to_lltype(s_value)
+            setattr(example, s_attr.const, v_lltype._defl())
+
+    def call(self, args):
+        args_s, kwds_s = args.unpack()
+        if kwds_s:
+            raise Exception("keyword arguments to call to a low-level fn ptr")
+        info = 'argument to ll function pointer call'
+        llargs = [annotation_to_lltype(s_arg, info)._defl() for s_arg in 
args_s]
+        v = self.ll_ptrtype._example()(*llargs)
+        return ll_to_annotation(v)
+
+    def bool(self):
+        return s_Bool
+
 
 class SomeInteriorPtr(SomePtr):
     def __init__(self, ll_ptrtype):
@@ -125,6 +174,13 @@
     def can_be_none(self):
         return False
 
+    def call(self, args):
+        from rpython.annotator.bookkeeper import getbookkeeper
+        bookkeeper = getbookkeeper()
+        s_func = bookkeeper.immutablevalue(self.func)
+        return s_func.call(args.prepend(lltype_to_annotation(self.ll_ptrtype)))
+
+
 class __extend__(pairtype(SomePtr, SomePtr)):
     def union((p1, p2)):
         if p1.ll_ptrtype != p2.ll_ptrtype:
diff --git a/rpython/translator/c/test/test_standalone.py 
b/rpython/translator/c/test/test_standalone.py
--- a/rpython/translator/c/test/test_standalone.py
+++ b/rpython/translator/c/test/test_standalone.py
@@ -16,6 +16,20 @@
 from rpython.conftest import cdir
 from rpython.conftest import option
 
+def setup_module(module):
+    if os.name == 'nt':
+        # Do not open dreaded dialog box on segfault
+        import ctypes
+        SEM_NOGPFAULTERRORBOX = 0x0002 # From MSDN
+        old_err_mode = ctypes.windll.kernel32.GetErrorMode()
+        new_err_mode = old_err_mode | SEM_NOGPFAULTERRORBOX
+        ctypes.windll.kernel32.SetErrorMode(new_err_mode)
+        module.old_err_mode = old_err_mode
+
+def teardown_module(module):
+    if os.name == 'nt':
+        import ctypes
+        ctypes.windll.kernel32.SetErrorMode(module.old_err_mode)
 
 class StandaloneTests(object):
     config = None
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to