[pypy-commit] stmgc default: Add last_abort__bytes_in_nursery.

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: 
Changeset: r975:5edbae0c780a
Date: 2014-03-12 08:04 +0100
http://bitbucket.org/pypy/stmgc/changeset/5edbae0c780a/

Log:Add last_abort__bytes_in_nursery.

diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -466,7 +466,7 @@
 struct stm_priv_segment_info_s *pseg = get_priv_segment(segment_num);
 
 /* throw away the content of the nursery */
-throw_away_nursery(pseg);
+long bytes_in_nursery = throw_away_nursery(pseg);
 
 /* reset all the modified objects (incl. re-adding GCFLAG_WRITE_BARRIER) */
 reset_modified_from_other_segments(segment_num);
@@ -476,6 +476,7 @@
 stm_thread_local_t *tl = pseg-pub.running_thread;
 tl-shadowstack = pseg-shadowstack_at_start_of_transaction;
 tl-thread_local_obj = pseg-threadlocal_at_start_of_transaction;
+tl-last_abort__bytes_in_nursery = bytes_in_nursery;
 
 /* reset these lists to NULL too on abort */
 LIST_FREE(pseg-objects_pointing_to_nursery);
diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -215,15 +215,15 @@
_collect_now(item));
 }
 
-static void throw_away_nursery(struct stm_priv_segment_info_s *pseg)
+static size_t throw_away_nursery(struct stm_priv_segment_info_s *pseg)
 {
 /* reset the nursery by zeroing it */
-size_t size;
+size_t nursery_used;
 char *realnursery;
 
 realnursery = REAL_ADDRESS(pseg-pub.segment_base, _stm_nursery_start);
-size = pseg-pub.nursery_current - (stm_char *)_stm_nursery_start;
-memset(realnursery, 0, size);
+nursery_used = pseg-pub.nursery_current - (stm_char *)_stm_nursery_start;
+memset(realnursery, 0, nursery_used);
 
 pseg-pub.nursery_current = (stm_char *)_stm_nursery_start;
 
@@ -250,6 +250,7 @@
 }
 
 tree_clear(pseg-nursery_objects_shadows);
+return nursery_used;
 }
 
 #define MINOR_NOTHING_TO_DO(pseg)   \
diff --git a/c7/stm/nursery.h b/c7/stm/nursery.h
--- a/c7/stm/nursery.h
+++ b/c7/stm/nursery.h
@@ -11,7 +11,7 @@
 
 static void minor_collection(bool commit);
 static void check_nursery_at_transaction_start(void);
-static void throw_away_nursery(struct stm_priv_segment_info_s *pseg);
+static size_t throw_away_nursery(struct stm_priv_segment_info_s *pseg);
 static void major_do_minor_collections(void);
 
 static inline bool must_abort(void) {
diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -57,7 +57,10 @@
the following raw region of memory is cleared. */
 char *mem_clear_on_abort;
 size_t mem_bytes_to_clear_on_abort;
-/* the next fields are handled automatically by the library */
+/* after an abort, some details about the abort are stored there.
+   (these fields are not modified on a successful commit) */
+long last_abort__bytes_in_nursery;
+/* the next fields are handled internally by the library */
 int associated_segment_num;
 struct stm_thread_local_s *prev, *next;
 } stm_thread_local_t;
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -17,6 +17,7 @@
 object_t *thread_local_obj;
 char *mem_clear_on_abort;
 size_t mem_bytes_to_clear_on_abort;
+long last_abort__bytes_in_nursery;
 int associated_segment_num;
 ...;
 } stm_thread_local_t;
diff --git a/c7/test/test_basic.py b/c7/test/test_basic.py
--- a/c7/test/test_basic.py
+++ b/c7/test/test_basic.py
@@ -433,118 +433,16 @@
 lp1 = self.pop_root()
 self.check_char_everywhere(lp1, 'X')
 
-# def test_resolve_write_write_no_conflict(self):
-# self.start_transaction()
-# p1 = stm_allocate(16)
-# p2 = stm_allocate(16)
-# p1[8] = 'a'
-# p2[8] = 'A'
-# self.commit_transaction(False)
-# self.start_transaction()
-# #
-# self.switch(1)
-# self.start_transaction()
-# stm_write(p1)
-# p1[8] = 'b'
-# self.commit_transaction(False)
-# #
-# self.switch(0)
-# stm_write(p2)
-# p2[8] = 'C'
-# self.commit_transaction(False)
-# assert p1[8] == 'b'
-# assert p2[8] == 'C'
-
-# def test_page_extra_malloc_unchanged_page(self):
-# self.start_transaction()
-# p1 = stm_allocate(16)
-# p2 = stm_allocate(16)
-# p1[8] = 'A'
-# p2[8] = 'a'
-# self.commit_transaction(False)
-# self.start_transaction()
-# #
-# self.switch(1)
-# self.start_transaction()
-# stm_write(p1)
-# assert p1[8] == 'A'
-# p1[8] = 'B'
-# self.commit_transaction(False)
-# #
-# self.switch(0)
-# stm_read(p2)
-# assert p2[8] == 'a'
-# p3 = stm_allocate(16)   # goes into the same page, which is
-# p3[8] = ':' #  not otherwise modified
-# 

[pypy-commit] pypy stmgc-c7: Reduce; add an XXX for the non-implemented weakrefs

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69885:c8bec5976825
Date: 2014-03-11 19:13 +0100
http://bitbucket.org/pypy/pypy/changeset/c8bec5976825/

Log:Reduce; add an XXX for the non-implemented weakrefs

diff --git a/rpython/memory/gctransform/stmframework.py 
b/rpython/memory/gctransform/stmframework.py
--- a/rpython/memory/gctransform/stmframework.py
+++ b/rpython/memory/gctransform/stmframework.py
@@ -72,6 +72,7 @@
 hop.genop(stm_get_root_stack_top, [], resultvar=hop.spaceop.result)
 
 def gct_weakref_create(self, hop):
+XXX
 op = hop.spaceop
 
 type_id = self.get_type_id(WEAKREF)
@@ -104,21 +105,17 @@
   resulttype=llmemory.WeakRefPtr)
 hop.cast_result(v_weakref)
 
-
-def _gct_with_roots_pushed(self, hop):
-livevars = self.push_roots(hop)
-self.default(hop)
-self.pop_roots(hop, livevars)
+##def _gct_with_roots_pushed(self, hop):
+##livevars = self.push_roots(hop)
+##self.default(hop)
+##self.pop_roots(hop, livevars)
 
-# sync with lloperation.py
-gct_stm_become_inevitable   = _gct_with_roots_pushed
-gct_stm_set_transaction_length  = _gct_with_roots_pushed
-gct_stm_stop_all_other_threads  = _gct_with_roots_pushed
-gct_stm_partial_commit_and_resume_other_threads = _gct_with_roots_pushed
-gct_stm_perform_transaction = _gct_with_roots_pushed
-gct_stm_allocate_nonmovable_int_adr = _gct_with_roots_pushed
-gct_stm_inspect_abort_info  = _gct_with_roots_pushed
-gct_stm_threadlocalref_set  = _gct_with_roots_pushed
+### sync with lloperation.py
+##gct_stm_become_inevitable   = _gct_with_roots_pushed
+##gct_stm_partial_commit_and_resume_other_threads = _gct_with_roots_pushed
+##gct_stm_perform_transaction = _gct_with_roots_pushed
+##gct_stm_inspect_abort_info  = _gct_with_roots_pushed
+##gct_stm_threadlocalref_set  = _gct_with_roots_pushed
 
 
 class StmRootWalker(BaseRootWalker):
diff --git a/rpython/translator/stm/jitdriver.py 
b/rpython/translator/stm/jitdriver.py
--- a/rpython/translator/stm/jitdriver.py
+++ b/rpython/translator/stm/jitdriver.py
@@ -148,6 +148,7 @@
 def make_invoke_stm_function(self):
 CONTAINER = self.CONTAINER
 callback = self.callback_function
+XXX
 perform_transaction = rstm.make_perform_transaction(callback,
 self.CONTAINERP)
 irange = range(len(self.TYPES))
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy default: Fix shown by test_streamio

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: 
Changeset: r69886:2ab068f12ff3
Date: 2014-03-12 08:23 +0100
http://bitbucket.org/pypy/pypy/changeset/2ab068f12ff3/

Log:Fix shown by test_streamio

diff --git a/rpython/rtyper/rtuple.py b/rpython/rtyper/rtuple.py
--- a/rpython/rtyper/rtuple.py
+++ b/rpython/rtyper/rtuple.py
@@ -290,14 +290,15 @@
 if not s_tup.is_constant():
 raise TyperError(contains() on non-const tuple)
 t = s_tup.const
-if len(t) == 0:
-hop.exception_cannot_occur()
-return hop.inputconst(Bool, False)
+s_item = hop.args_s[1]
 r_item = hop.args_r[1]
 v_arg = hop.inputarg(r_item, arg=1)
 ll_eq = r_item.get_ll_eq_function() or _ll_equal
 v_result = None
 for x in t:
+s_const_item = hop.rtyper.annotator.bookkeeper.immutablevalue(x)
+if not s_item.contains(s_const_item):
+continue   # corner case, see test_constant_tuple_contains_bug
 c_tuple_item = hop.inputconst(r_item, x)
 v_equal = hop.gendirectcall(ll_eq, v_arg, c_tuple_item)
 if v_result is None:
diff --git a/rpython/rtyper/test/test_rtuple.py 
b/rpython/rtyper/test/test_rtuple.py
--- a/rpython/rtyper/test/test_rtuple.py
+++ b/rpython/rtyper/test/test_rtuple.py
@@ -95,6 +95,14 @@
 res = self.interpret(f, [50])
 assert res is False
 
+def test_constant_tuple_contains_bug(self):
+def f(i):
+return chr(i) in ('1', '2', '34')# the '34' can never match
+res = self.interpret(f, [ord('1')])
+assert res is True
+res = self.interpret(f, [ord('3')])
+assert res is False
+
 def test_conv(self):
 def t0():
 return (3, 2, None)
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] stmgc default: stm_is_inevitable(), and fix tests for inevitable transactions

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: 
Changeset: r976:e596369e8a2d
Date: 2014-03-12 08:50 +0100
http://bitbucket.org/pypy/stmgc/changeset/e596369e8a2d/

Log:stm_is_inevitable(), and fix tests for inevitable transactions

diff --git a/c7/stmgc.h b/c7/stmgc.h
--- a/c7/stmgc.h
+++ b/c7/stmgc.h
@@ -248,6 +248,9 @@
 if (STM_SEGMENT-jmpbuf_ptr != NULL)
 _stm_become_inevitable(msg);
 }
+static inline int stm_is_inevitable(void) {
+return (STM_SEGMENT-jmpbuf_ptr == NULL);
+}
 
 /* Forces a safe-point if needed.  Normally not needed: this is
automatic if you call stm_allocate(). */
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -46,7 +46,8 @@
 void _stm_start_transaction(stm_thread_local_t *tl, stm_jmpbuf_t *jmpbuf);
 bool _check_commit_transaction(void);
 bool _check_abort_transaction(void);
-bool _check_become_inevitable();
+bool _check_become_inevitable(void);
+int stm_is_inevitable(void);
 
 void _set_type_id(object_t *obj, uint32_t h);
 uint32_t _get_type_id(object_t *obj);
@@ -110,76 +111,47 @@
 return obj-stm_flags;
 }
 
+#define CHECKED(CALL)   \
+stm_jmpbuf_t here;  \
+stm_segment_info_t *segment = STM_SEGMENT;  \
+if (__builtin_setjmp(here) == 0) { /* returned directly */  \
+if (segment-jmpbuf_ptr != NULL) {  \
+assert(segment-jmpbuf_ptr == (stm_jmpbuf_t *)-1);  \
+segment-jmpbuf_ptr = here;\
+}   \
+CALL;   \
+if (segment-jmpbuf_ptr != NULL) {  \
+segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;   \
+}   \
+return 0;   \
+}   \
+if (segment-jmpbuf_ptr != NULL) {  \
+segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;   \
+}   \
+return 1
+
 bool _checked_stm_write(object_t *object) {
-stm_jmpbuf_t here;
-stm_segment_info_t *segment = STM_SEGMENT;
-if (__builtin_setjmp(here) == 0) { // returned directly
-assert(segment-jmpbuf_ptr == (stm_jmpbuf_t *)-1);
-segment-jmpbuf_ptr = here;
-stm_write(object);
-segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;
-return 0;
-}
-segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;
-return 1;
+CHECKED(stm_write(object));
 }
 
 bool _check_stop_safe_point(void) {
-stm_jmpbuf_t here;
-stm_segment_info_t *segment = STM_SEGMENT;
-if (__builtin_setjmp(here) == 0) { // returned directly
- assert(segment-jmpbuf_ptr == (stm_jmpbuf_t *)-1);
- segment-jmpbuf_ptr = here;
- _stm_stop_safe_point();
- segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;
- return 0;
-}
-segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;
-return 1;
+CHECKED(_stm_stop_safe_point());
 }
 
 bool _check_commit_transaction(void) {
-stm_jmpbuf_t here;
-stm_segment_info_t *segment = STM_SEGMENT;
-if (__builtin_setjmp(here) == 0) { // returned directly
- assert(segment-jmpbuf_ptr == (stm_jmpbuf_t *)-1);
- segment-jmpbuf_ptr = here;
- stm_commit_transaction();
- segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;
- return 0;
-}
-segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;
-return 1;
+CHECKED(stm_commit_transaction());
 }
 
 bool _check_abort_transaction(void) {
-stm_jmpbuf_t here;
-stm_segment_info_t *segment = STM_SEGMENT;
-if (__builtin_setjmp(here) == 0) { // returned directly
- assert(segment-jmpbuf_ptr == (stm_jmpbuf_t *)-1);
- segment-jmpbuf_ptr = here;
- stm_abort_transaction();
- segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;
- return 0;   // but should be unreachable in this case
-}
-segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;
-return 1;
+CHECKED(stm_abort_transaction());
 }
 
 bool _check_become_inevitable() {
-stm_jmpbuf_t here;
-stm_segment_info_t *segment = STM_SEGMENT;
-if (__builtin_setjmp(here) == 0) { // returned directly
- assert(segment-jmpbuf_ptr == (stm_jmpbuf_t *)-1);
- segment-jmpbuf_ptr = here;
- stm_become_inevitable(TEST);
- segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;
- return 0;   // but should be unreachable in this case
-}
-segment-jmpbuf_ptr = (stm_jmpbuf_t *)-1;
-return 1;
+CHECKED(stm_become_inevitable(TEST));
 }
 
+#undef CHECKED
+
 
 void _set_type_id(object_t *obj, uint32_t h)
 {
diff --git a/c7/test/test_basic.py b/c7/test/test_basic.py
--- a/c7/test/test_basic.py
+++ b/c7/test/test_basic.py
@@ -382,7 +382,9 @@
 

[pypy-commit] stmgc default: Tweak: expose this logic for pypy

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: 
Changeset: r977:83b7d2d60a20
Date: 2014-03-12 09:26 +0100
http://bitbucket.org/pypy/stmgc/changeset/83b7d2d60a20/

Log:Tweak: expose this logic for pypy

diff --git a/c7/stm/fprintcolor.c b/c7/stm/fprintcolor.c
--- a/c7/stm/fprintcolor.c
+++ b/c7/stm/fprintcolor.c
@@ -3,11 +3,6 @@
 /*  */
 
 
-static int dprintfcolor(void)
-{
-return 31 + STM_SEGMENT-segment_num % 6;
-}
-
 static int threadcolor_printf(const char *format, ...)
 {
 char buffer[2048];
diff --git a/c7/stm/fprintcolor.h b/c7/stm/fprintcolor.h
--- a/c7/stm/fprintcolor.h
+++ b/c7/stm/fprintcolor.h
@@ -7,7 +7,10 @@
 
 
 #define dprintf(args)   threadcolor_printf args
-static int dprintfcolor(void);
+static inline int dprintfcolor(void)
+{
+return 31 + STM_SEGMENT-segment_num % 6;
+}
 
 static int threadcolor_printf(const char *format, ...)
  __attribute__((format (printf, 1, 2)));
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] stmgc default: Add an assert to prevent double-starting transactions

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: 
Changeset: r978:3f0d8773b90b
Date: 2014-03-12 09:30 +0100
http://bitbucket.org/pypy/stmgc/changeset/3f0d8773b90b/

Log:Add an assert to prevent double-starting transactions

diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -137,6 +137,8 @@
 
 void _stm_start_transaction(stm_thread_local_t *tl, stm_jmpbuf_t *jmpbuf)
 {
+assert(!_stm_in_transaction(tl));
+
 s_mutex_lock();
 
   retry:
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: Reintroduce stm_perform_transaction() and atomic transactions.

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69887:e0337a4058f2
Date: 2014-03-12 09:33 +0100
http://bitbucket.org/pypy/pypy/changeset/e0337a4058f2/

Log:Reintroduce stm_perform_transaction() and atomic transactions.

diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py
--- a/rpython/rlib/rstm.py
+++ b/rpython/rlib/rstm.py
@@ -66,11 +66,11 @@
 
 @dont_look_inside
 def increment_atomic():
-llop.stm_change_atomic(lltype.Signed, +1)
+llop.stm_increment_atomic(lltype.Void)
 
 @dont_look_inside
 def decrement_atomic():
-llop.stm_change_atomic(lltype.Signed, -1)
+llop.stm_decrement_atomic(lltype.Void)
 
 @dont_look_inside
 def is_atomic():
@@ -96,7 +96,7 @@
 def before_external_call():
 if we_are_translated():
 # this tries to commit, or becomes inevitable if atomic
-llop.stm_commit_transaction(lltype.Void)
+llop.stm_commit_if_not_atomic(lltype.Void)
 before_external_call._dont_reach_me_in_del_ = True
 before_external_call._transaction_break_ = True
 
@@ -104,7 +104,7 @@
 def after_external_call():
 if we_are_translated():
 # starts a new transaction if we are not atomic already
-llop.stm_start_inevitable_transaction(lltype.Void)
+llop.stm_start_inevitable_if_not_atomic(lltype.Void)
 after_external_call._dont_reach_me_in_del_ = True
 after_external_call._transaction_break_ = True
 
diff --git a/rpython/rtyper/lltypesystem/lloperation.py 
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -438,6 +438,7 @@
   # see threadlocalref.py
 'stm_threadlocal_get':LLOp(sideeffects=False),
 'stm_threadlocal_set':LLOp(),
+'stm_perform_transaction':LLOp(canmallocgc=True),
 
 ##'stm_allocate_nonmovable_int_adr': LLOp(sideeffects=False, 
canmallocgc=True),
 ##'stm_become_inevitable':  LLOp(canmallocgc=True),
diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py
--- a/rpython/translator/c/genc.py
+++ b/rpython/translator/c/genc.py
@@ -786,7 +786,8 @@
 if node.forward_decl:
 print  f, node.forward_decl
 elif node.name is not None:
-print  f, '%s %s;' % (node.typetag, node.name)
+if node.typetag != '':
+print  f, '%s %s;' % (node.typetag, node.name)
 print  f
 for node in structdeflist:
 for line in node.definition():
diff --git a/rpython/translator/stm/funcgen.py 
b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -134,13 +134,11 @@
 return '/* %s = */ STM_POP_ROOT_RET(stm_thread_local);' % (arg0,)
 return 'STM_POP_ROOT(stm_thread_local, %s);' % (arg0,)
 
-def stm_commit_transaction(funcgen, op):
-   return '{ int e = errno; stm_commit_transaction(); errno = e; }'
+def stm_commit_if_not_atomic(funcgen, op):
+   return 'pypy_stm_commit_if_not_atomic();'
 
-def stm_start_inevitable_transaction(funcgen, op):
-return ('{ int e = errno; '
-'stm_start_inevitable_transaction(stm_thread_local); '
-'errno = e; }')
+def stm_start_inevitable_if_not_atomic(funcgen, op):
+return 'pypy_stm_start_inevitable_if_not_atomic();'
 
 def stm_enter_callback_call(funcgen, op):
 result = funcgen.expr(op.result)
@@ -167,6 +165,12 @@
 arg0 = funcgen.expr(op.args[0])
 return 'stm_thread_local.thread_local_obj = (object_t *)%s;' % (arg0,)
 
+def stm_perform_transaction(funcgen, op):
+arg0 = funcgen.expr(op.args[0])
+arg1 = funcgen.expr(op.args[1])
+return ('pypy_stm_perform_transaction((object_t *)%s, '
+'(int(*)(object_t *, int))%s);' % (arg0, arg1))
+
 
 ##def stm_initialize(funcgen, op):
 ##return '''stm_initialize();
@@ -297,16 +301,6 @@
 ##result = funcgen.expr(op.result)
 ##return '%s = ((struct rpyobj_s*)%s)-tid;' % (result, arg0)
 
-##def stm_hash(funcgen, op):
-##arg0 = funcgen.expr(op.args[0])
-##result = funcgen.expr(op.result)
-##return '%s = stm_hash((gcptr)%s);' % (result, arg0)
-
-##def stm_id(funcgen, op):
-##arg0 = funcgen.expr(op.args[0])
-##result = funcgen.expr(op.result)
-##return '%s = stm_id((gcptr)%s);' % (result, arg0)
-
 ##def stm_change_atomic(funcgen, op):
 ##arg0 = funcgen.expr(op.args[0])
 ##return 'stm_atomic(%s);' % (arg0,)
@@ -315,20 +309,6 @@
 ##result = funcgen.expr(op.result)
 ##return '%s = stm_atomic(0);' % (result,)
 
-##def stm_threadlocal_get(funcgen, op):
-##result = funcgen.expr(op.result)
-##return '%s = (%s)stm_thread_local_obj;' % (
-##result, cdecl(funcgen.lltypename(op.result), ''))
-
-##def stm_threadlocal_set(funcgen, op):
-##arg0 = funcgen.expr(op.args[0])
-##return 'stm_thread_local_obj = (gcptr)%s;' % (arg0,)
-
-##def stm_perform_transaction(funcgen, op):
-##arg0 = funcgen.expr(op.args[0])
-##arg1 = 

[pypy-commit] pypy stmgc-c7: Fixes for test_start_thread

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69888:69a3715048f7
Date: 2014-03-12 09:36 +0100
http://bitbucket.org/pypy/pypy/changeset/69a3715048f7/

Log:Fixes for test_start_thread

diff --git a/rpython/rtyper/lltypesystem/lloperation.py 
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -427,18 +427,19 @@
 'stm_become_inevitable':  LLOp(canmallocgc=True),
 'stm_push_root':  LLOp(),
 'stm_pop_root_into':  LLOp(),
-'stm_commit_transaction': LLOp(canmallocgc=True),
-'stm_start_inevitable_transaction': LLOp(canmallocgc=True),
-'stm_enter_callback_call':LLOp(canmallocgc=True),
-'stm_leave_callback_call':LLOp(),
-'stm_should_break_transaction': LLOp(sideeffects=False),
-'stm_set_transaction_length': LLOp(),
+'stm_commit_if_not_atomic':   LLOp(canmallocgc=True),
+'stm_start_inevitable_if_not_atomic': LLOp(canmallocgc=True),
+'stm_enter_callback_call':LLOp(canmallocgc=True),
+'stm_leave_callback_call':LLOp(),
+'stm_perform_transaction':LLOp(canmallocgc=True),
+'stm_should_break_transaction':   LLOp(sideeffects=False),
+'stm_set_transaction_length': LLOp(),
+
 'stm_threadlocalref_get': LLOp(sideeffects=False),
 'stm_threadlocalref_set': LLOp(canmallocgc=True), # may allocate new array,
   # see threadlocalref.py
 'stm_threadlocal_get':LLOp(sideeffects=False),
 'stm_threadlocal_set':LLOp(),
-'stm_perform_transaction':LLOp(canmallocgc=True),
 
 ##'stm_allocate_nonmovable_int_adr': LLOp(sideeffects=False, 
canmallocgc=True),
 ##'stm_become_inevitable':  LLOp(canmallocgc=True),
diff --git a/rpython/translator/stm/test/test_ztranslated.py 
b/rpython/translator/stm/test/test_ztranslated.py
--- a/rpython/translator/stm/test/test_ztranslated.py
+++ b/rpython/translator/stm/test/test_ztranslated.py
@@ -71,8 +71,8 @@
 glob.seen = None
 rthread.start_new_thread(threadfn, ())
 while glob.seen is None:
-llop.stm_commit_transaction(lltype.Void)
-llop.stm_start_inevitable_transaction(lltype.Void)
+llop.stm_commit_if_not_atomic(lltype.Void)
+llop.stm_start_inevitable_if_not_atomic(lltype.Void)
 return glob.seen.value
 #
 t, cbuilder = self.compile(entry_point)
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: Fixes for test_stm_atomic

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69889:fafe0f9d754c
Date: 2014-03-12 09:39 +0100
http://bitbucket.org/pypy/pypy/changeset/fafe0f9d754c/

Log:Fixes for test_stm_atomic

diff --git a/rpython/rtyper/lltypesystem/lloperation.py 
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -441,6 +441,10 @@
 'stm_threadlocal_get':LLOp(sideeffects=False),
 'stm_threadlocal_set':LLOp(),
 
+'stm_increment_atomic':   LLOp(),
+'stm_decrement_atomic':   LLOp(),
+'stm_get_atomic': LLOp(sideeffects=False),
+
 ##'stm_allocate_nonmovable_int_adr': LLOp(sideeffects=False, 
canmallocgc=True),
 ##'stm_become_inevitable':  LLOp(canmallocgc=True),
 ##'stm_stop_all_other_threads': LLOp(canmallocgc=True),
@@ -449,9 +453,6 @@
 ##'stm_major_collect':  LLOp(canmallocgc=True),
 ##'stm_get_tid':LLOp(canfold=True),
 ##'stm_ptr_eq': LLOp(canfold=True),
-##'stm_change_atomic':  LLOp(),
-##'stm_get_atomic': LLOp(sideeffects=False),
-##'stm_perform_transaction':LLOp(canmallocgc=True),
 ##'stm_abort_and_retry':LLOp(canmallocgc=True),
 
 ##'stm_weakref_allocate':   LLOp(sideeffects=False, canmallocgc=True),
diff --git a/rpython/translator/stm/funcgen.py 
b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -171,6 +171,16 @@
 return ('pypy_stm_perform_transaction((object_t *)%s, '
 '(int(*)(object_t *, int))%s);' % (arg0, arg1))
 
+def stm_increment_atomic(funcgen, op):
+return 'pypy_stm_increment_atomic();'
+
+def stm_decrement_atomic(funcgen, op):
+return 'pypy_stm_decrement_atomic();'
+
+def stm_get_atomic(funcgen, op):
+result = funcgen.expr(op.result)
+return '%s = pypy_stm_get_atomic();' % (result,)
+
 
 ##def stm_initialize(funcgen, op):
 ##return '''stm_initialize();
@@ -301,14 +311,6 @@
 ##result = funcgen.expr(op.result)
 ##return '%s = ((struct rpyobj_s*)%s)-tid;' % (result, arg0)
 
-##def stm_change_atomic(funcgen, op):
-##arg0 = funcgen.expr(op.args[0])
-##return 'stm_atomic(%s);' % (arg0,)
-
-##def stm_get_atomic(funcgen, op):
-##result = funcgen.expr(op.result)
-##return '%s = stm_atomic(0);' % (result,)
-
 ##def stm_enter_callback_call(funcgen, op):
 ##result = funcgen.expr(op.result)
 ##return '%s = stm_enter_callback_call();' % (result,)
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: Enough to make the rstm.abort_info* functions not crash, but so far they don't record anything.

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69890:a701941eff30
Date: 2014-03-12 09:45 +0100
http://bitbucket.org/pypy/pypy/changeset/a701941eff30/

Log:Enough to make the rstm.abort_info* functions not crash, but so far
they don't record anything.

diff --git a/rpython/rtyper/lltypesystem/lloperation.py 
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -429,6 +429,7 @@
 'stm_pop_root_into':  LLOp(),
 'stm_commit_if_not_atomic':   LLOp(canmallocgc=True),
 'stm_start_inevitable_if_not_atomic': LLOp(canmallocgc=True),
+'stm_abort_and_retry':LLOp(canmallocgc=True),
 'stm_enter_callback_call':LLOp(canmallocgc=True),
 'stm_leave_callback_call':LLOp(),
 'stm_perform_transaction':LLOp(canmallocgc=True),
@@ -445,6 +446,10 @@
 'stm_decrement_atomic':   LLOp(),
 'stm_get_atomic': LLOp(sideeffects=False),
 
+'stm_abort_info_push':LLOp(),
+'stm_abort_info_pop': LLOp(),
+'stm_inspect_abort_info': LLOp(sideeffects=False, canmallocgc=True),
+
 ##'stm_allocate_nonmovable_int_adr': LLOp(sideeffects=False, 
canmallocgc=True),
 ##'stm_become_inevitable':  LLOp(canmallocgc=True),
 ##'stm_stop_all_other_threads': LLOp(canmallocgc=True),
@@ -453,19 +458,8 @@
 ##'stm_major_collect':  LLOp(canmallocgc=True),
 ##'stm_get_tid':LLOp(canfold=True),
 ##'stm_ptr_eq': LLOp(canfold=True),
-##'stm_abort_and_retry':LLOp(canmallocgc=True),
 
 ##'stm_weakref_allocate':   LLOp(sideeffects=False, canmallocgc=True),
-
-##'stm_threadlocalref_get': LLOp(sideeffects=False),
-##'stm_threadlocalref_set': LLOp(canmallocgc=True), # may allocate new 
array,
-##  # see threadlocalref.py
-##'stm_threadlocal_get':LLOp(sideeffects=False),
-##'stm_threadlocal_set':LLOp(),
-
-##'stm_abort_info_push':LLOp(),
-##'stm_abort_info_pop': LLOp(),
-##'stm_inspect_abort_info': LLOp(sideeffects=False, canmallocgc=True),
 
 ##'stm_get_adr_of_private_rev_num':LLOp(),
 ##'stm_get_adr_of_read_barrier_cache':LLOp(),
diff --git a/rpython/translator/stm/funcgen.py 
b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -181,6 +181,22 @@
 result = funcgen.expr(op.result)
 return '%s = pypy_stm_get_atomic();' % (result,)
 
+def stm_abort_and_retry(funcgen, op):
+return 'stm_abort_transaction();'
+
+def stm_abort_info_push(funcgen, op):
+arg0 = funcgen.expr(op.args[0])
+arg1 = funcgen.expr(op.args[1])
+return '//XXX stm_abort_info_push((gcptr)%s, %s);' % (arg0, arg1)
+
+def stm_abort_info_pop(funcgen, op):
+arg0 = funcgen.expr(op.args[0])
+return '//XXX stm_abort_info_pop(%s);' % (arg0,)
+
+def stm_inspect_abort_info(funcgen, op):
+result = funcgen.expr(op.result)
+return '%s = NULL; //XXX stm_inspect_abort_info();' % (result,)
+
 
 ##def stm_initialize(funcgen, op):
 ##return '''stm_initialize();
@@ -319,22 +335,6 @@
 ##arg0 = funcgen.expr(op.args[0])
 ##return 'stm_leave_callback_call(%s);' % (arg0,)
 
-##def stm_abort_and_retry(funcgen, op):
-##return 'stm_abort_and_retry();'
-
-##def stm_abort_info_push(funcgen, op):
-##arg0 = funcgen.expr(op.args[0])
-##arg1 = funcgen.expr(op.args[1])
-##return 'stm_abort_info_push((gcptr)%s, %s);' % (arg0, arg1)
-
-##def stm_abort_info_pop(funcgen, op):
-##arg0 = funcgen.expr(op.args[0])
-##return 'stm_abort_info_pop(%s);' % (arg0,)
-
-##def stm_inspect_abort_info(funcgen, op):
-##result = funcgen.expr(op.result)
-##return '%s = stm_inspect_abort_info();' % (result,)
-
 ##def stm_minor_collect(funcgen, op):
 ##return 'stm_minor_collect();'
 
diff --git a/rpython/translator/stm/test/test_ztranslated.py 
b/rpython/translator/stm/test/test_ztranslated.py
--- a/rpython/translator/stm/test/test_ztranslated.py
+++ b/rpython/translator/stm/test/test_ztranslated.py
@@ -255,7 +255,10 @@
 rstm.abort_and_retry()
 #
 last = rstm.charp_inspect_abort_info()
-print rffi.charp2str(last)
+if last:
+print rffi.charp2str(last)
+else:
+print 'got abort_info=NULL!'
 print int(bool(rstm.charp_inspect_abort_info()))
 #
 rstm.abort_info_pop(2)
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: Fix (stm/test/test_ztranslated, test_dtoa)

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69891:08d0f40dfe46
Date: 2014-03-12 09:47 +0100
http://bitbucket.org/pypy/pypy/changeset/08d0f40dfe46/

Log:Fix (stm/test/test_ztranslated, test_dtoa)

diff --git a/rpython/rtyper/lltypesystem/rstr.py 
b/rpython/rtyper/lltypesystem/rstr.py
--- a/rpython/rtyper/lltypesystem/rstr.py
+++ b/rpython/rtyper/lltypesystem/rstr.py
@@ -130,6 +130,14 @@
 def copy_raw_to_string(ptrsrc, dst, dststart, length):
 # xxx Warning: same note as above apply: don't do this at home
 assert length = 0
+
+if rgc.stm_is_enabled():
+i = 0
+while i  length:
+dst.chars[dststart + i] = ptrsrc[i]
+i += 1
+return
+
 # from here, no GC operations can happen
 dst = _get_raw_buf(SRC_TP, dst, dststart)
 adr = llmemory.cast_ptr_to_adr(ptrsrc)
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: Reimplement stm_ignored

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69892:0fc7602e53d3
Date: 2014-03-12 10:46 +0100
http://bitbucket.org/pypy/pypy/changeset/0fc7602e53d3/

Log:Reimplement stm_ignored

diff --git a/rpython/memory/gctransform/stmframework.py 
b/rpython/memory/gctransform/stmframework.py
--- a/rpython/memory/gctransform/stmframework.py
+++ b/rpython/memory/gctransform/stmframework.py
@@ -5,6 +5,7 @@
  BaseFrameworkGCTransformer, BaseRootWalker, sizeofaddr)
 from rpython.memory.gctypelayout import WEAKREF, WEAKREFPTR
 from rpython.rtyper import rmodel, llannotation
+from rpython.translator.backendopt.support import var_needsgc
 
 
 class StmFrameworkGCTransformer(BaseFrameworkGCTransformer):
@@ -52,6 +53,25 @@
 for var in reversed(livevars):
 hop.genop(stm_pop_root_into, [var])
 
+def transform_block(self, *args, **kwds):
+self.in_stm_ignored = False
+BaseFrameworkGCTransformer.transform_block(self, *args, **kwds)
+assert not self.in_stm_ignored, (
+unbalanced stm_ignore_start/stm_ignore_stop in block)
+
+def gct_stm_ignored_start(self, hop):
+assert not self.in_stm_ignored
+self.in_stm_ignored = True
+self.default(hop)
+
+def gct_stm_ignored_stop(self, hop):
+assert self.in_stm_ignored
+self.in_stm_ignored = False
+self.default(hop)
+
+def var_needs_set_transform(self, var):
+return True
+
 def transform_generic_set(self, hop):
 # XXX detect if we're inside a 'stm_ignored' block and... do what?
 assert self.write_barrier_ptr == stm
@@ -61,8 +81,13 @@
   'raw_store')
 if (v_struct.concretetype.TO._gckind == gc
 and hop.spaceop not in self.clean_sets):
-self.write_barrier_calls += 1
-hop.genop(stm_write, [v_struct])
+if self.in_stm_ignored:
+if var_needsgc(hop.spaceop.args[-1]):
+raise Exception(in stm_ignored block: write of a gc 
+pointer)
+else:
+self.write_barrier_calls += 1
+hop.genop(stm_write, [v_struct])
 hop.rename('bare_' + opname)
 
 def gc_header_for(self, obj, needs_hash=False):
diff --git a/rpython/rtyper/lltypesystem/lloperation.py 
b/rpython/rtyper/lltypesystem/lloperation.py
--- a/rpython/rtyper/lltypesystem/lloperation.py
+++ b/rpython/rtyper/lltypesystem/lloperation.py
@@ -450,6 +450,9 @@
 'stm_abort_info_pop': LLOp(),
 'stm_inspect_abort_info': LLOp(sideeffects=False, canmallocgc=True),
 
+'stm_ignored_start':  LLOp(canrun=True),
+'stm_ignored_stop':   LLOp(canrun=True),
+
 ##'stm_allocate_nonmovable_int_adr': LLOp(sideeffects=False, 
canmallocgc=True),
 ##'stm_become_inevitable':  LLOp(canmallocgc=True),
 ##'stm_stop_all_other_threads': LLOp(canmallocgc=True),
@@ -467,9 +470,6 @@
 ##'stm_get_adr_of_nursery_nextlimit': LLOp(),
 ##'stm_get_adr_of_active': LLOp(),
 
-##'stm_ignored_start':  LLOp(canrun=True),
-##'stm_ignored_stop':   LLOp(canrun=True),
-
 # __ address operations __
 
 'boehm_malloc': LLOp(),
diff --git a/rpython/translator/stm/funcgen.py 
b/rpython/translator/stm/funcgen.py
--- a/rpython/translator/stm/funcgen.py
+++ b/rpython/translator/stm/funcgen.py
@@ -197,6 +197,12 @@
 result = funcgen.expr(op.result)
 return '%s = NULL; //XXX stm_inspect_abort_info();' % (result,)
 
+def stm_ignored_start(funcgen, op):
+return '/* stm_ignored_start */'
+
+def stm_ignored_stop(funcgen, op):
+return '/* stm_ignored_stop */'
+
 
 ##def stm_initialize(funcgen, op):
 ##return '''stm_initialize();
diff --git a/rpython/translator/stm/readbarrier.py 
b/rpython/translator/stm/readbarrier.py
--- a/rpython/translator/stm/readbarrier.py
+++ b/rpython/translator/stm/readbarrier.py
@@ -23,10 +23,20 @@
 if not block.operations:
 continue
 newops = []
+stm_ignored = False
 for op in block.operations:
 if op.opname in READ_OPS and is_gc_ptr(op.args[0].concretetype):
-v_none = varoftype(lltype.Void)
-newops.append(SpaceOperation('stm_read', [op.args[0]], v_none))
-transformer.read_barrier_counts += 1
+if not stm_ignored:
+v_none = varoftype(lltype.Void)
+newops.append(SpaceOperation('stm_read',
+ [op.args[0]], v_none))
+transformer.read_barrier_counts += 1
+elif op.opname == 'stm_ignored_start':
+assert stm_ignored == False
+stm_ignored = True
+elif op.opname == 'stm_ignored_stop':
+assert stm_ignored == True
+stm_ignored = False
 newops.append(op)
+assert stm_ignored == False
 

[pypy-commit] pypy stmgc-c7: Fixes

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69893:c6329f85e8bc
Date: 2014-03-12 11:08 +0100
http://bitbucket.org/pypy/pypy/changeset/c6329f85e8bc/

Log:Fixes

diff --git a/rpython/translator/c/database.py b/rpython/translator/c/database.py
--- a/rpython/translator/c/database.py
+++ b/rpython/translator/c/database.py
@@ -64,7 +64,8 @@
 
 self.instrument_ncounter = 0
 
-self.with_stm = self.translator.config.translation.stm
+self.with_stm = (self.translator is not None and
+ self.translator.config.translation.stm)
 self.prebuilt_gc_counter = 0
 
 def gettypedefnode(self, T, varlength=None):
diff --git a/rpython/translator/stm/jitdriver.py 
b/rpython/translator/stm/jitdriver.py
--- a/rpython/translator/stm/jitdriver.py
+++ b/rpython/translator/stm/jitdriver.py
@@ -148,7 +148,6 @@
 def make_invoke_stm_function(self):
 CONTAINER = self.CONTAINER
 callback = self.callback_function
-XXX
 perform_transaction = rstm.make_perform_transaction(callback,
 self.CONTAINERP)
 irange = range(len(self.TYPES))
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: Support the stm version of thread._local in the absence of rweakref.

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69894:84fac834f29b
Date: 2014-03-12 11:25 +0100
http://bitbucket.org/pypy/pypy/changeset/84fac834f29b/

Log:Support the stm version of thread._local in the absence of
rweakref.

diff --git a/pypy/module/thread/stm.py b/pypy/module/thread/stm.py
--- a/pypy/module/thread/stm.py
+++ b/pypy/module/thread/stm.py
@@ -9,16 +9,30 @@
 from pypy.interpreter.typedef import TypeDef, GetSetProperty, descr_get_dict
 from rpython.rlib import rthread
 from rpython.rlib import rstm
-from rpython.rlib import rweakref
 from rpython.rlib import jit
 from rpython.rlib.objectmodel import invoke_around_extcall, we_are_translated
 
 
+class FakeWeakKeyDictionary:
+# Only used if we don't have weakrefs.
+# Then thread._local instances will leak, but too bad.
+def __init__(self):
+self.d = {}
+def get(self, key):
+return self.d.get(key, None)
+def set(self, key, value):
+self.d[key] = value
+
+
 ec_cache = rstm.ThreadLocalReference(ExecutionContext)
 
 def initialize_execution_context(ec):
 Called from ExecutionContext.__init__().
-ec._thread_local_dicts = rweakref.RWeakKeyDictionary(STMLocal, W_Root)
+if ec.space.config.translation.rweakref:
+from rpython.rlib import rweakref
+ec._thread_local_dicts = rweakref.RWeakKeyDictionary(STMLocal, W_Root)
+else:
+ec._thread_local_dicts = FakeWeakKeyDictionary()
 if ec.space.config.objspace.std.withmethodcache:
 from pypy.objspace.std.typeobject import MethodCache
 ec._methodcache = MethodCache(ec.space)
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: Test and fix for inf/nan values in prebuilt structures

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69895:8384a52fc3af
Date: 2014-03-12 11:46 +0100
http://bitbucket.org/pypy/pypy/changeset/8384a52fc3af/

Log:Test and fix for inf/nan values in prebuilt structures

diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py
--- a/rpython/translator/c/genc.py
+++ b/rpython/translator/c/genc.py
@@ -824,6 +824,11 @@
 print  f, 'char *RPython_StartupCode(void) {'
 print  f, '\tchar *error = NULL;'
 
+# put float infinities in global constants, we should not have so many of 
them for now to make
+# a table+loop preferable
+for dest, value in database.late_initializations:
+print  f, \t%s = %s; % (dest, value)
+
 if database.with_stm:
 print  f, '\tpypy_stm_setup();'
 print  f, '\tpypy_stm_setup_prebuilt();'
@@ -831,11 +836,6 @@
 for line in database.gcpolicy.gc_startup_code():
 print  f,\t + line
 
-# put float infinities in global constants, we should not have so many of 
them for now to make
-# a table+loop preferable
-for dest, value in database.late_initializations:
-print  f, \t%s = %s; % (dest, value)
-
 firsttime = True
 for node in database.containerlist:
 lines = list(node.startupcode())
diff --git a/rpython/translator/c/node.py b/rpython/translator/c/node.py
--- a/rpython/translator/c/node.py
+++ b/rpython/translator/c/node.py
@@ -816,7 +816,6 @@
 else:
 comma = ','
 if typeOf(value) == Float and not isfinite(value):
-XXX   # check and reimplement me
 db.late_initializations.append(('%s' % access_expr,
 db.get(value, static=True)))
 if isinf(value):
diff --git a/rpython/translator/stm/test/test_ztranslated.py 
b/rpython/translator/stm/test/test_ztranslated.py
--- a/rpython/translator/stm/test/test_ztranslated.py
+++ b/rpython/translator/stm/test/test_ztranslated.py
@@ -419,3 +419,17 @@
'stm_ignored_stop']
 data = cbuilder.cmdexec('')
 assert 'did not crash 84\n' in data
+
+def test_float_inf_nan_in_struct(self):
+mylist = [float(inf), float(-inf), float(nan)]
+def main(argv):
+print ':', mylist[int(argv[1])]
+return 0
+
+t, cbuilder = self.compile(main)
+data = cbuilder.cmdexec('0')
+assert ': inf\n' in data
+data = cbuilder.cmdexec('1')
+assert ': -inf\n' in data
+data = cbuilder.cmdexec('2')
+assert ': nan\n' in data
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: Rewrite rffi.str_from_buffer() in terms of copy_raw_to_string()

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69898:8a8455c7eddf
Date: 2014-03-12 12:11 +0100
http://bitbucket.org/pypy/pypy/changeset/8a8455c7eddf/

Log:Rewrite rffi.str_from_buffer() in terms of copy_raw_to_string()
rather than directly using raw_memcopy.

diff --git a/rpython/rtyper/lltypesystem/rffi.py 
b/rpython/rtyper/lltypesystem/rffi.py
--- a/rpython/rtyper/lltypesystem/rffi.py
+++ b/rpython/rtyper/lltypesystem/rffi.py
@@ -4,7 +4,7 @@
 from rpython.rtyper.lltypesystem import lltype, rstr
 from rpython.rtyper.lltypesystem import ll2ctypes
 from rpython.rtyper.lltypesystem.llmemory import cast_ptr_to_adr
-from rpython.rtyper.lltypesystem.llmemory import itemoffsetof, raw_memcopy
+from rpython.rtyper.lltypesystem.llmemory import itemoffsetof
 from rpython.rtyper.llannotation import lltype_to_annotation
 from rpython.tool.sourcetools import func_with_new_name
 from rpython.rlib.objectmodel import Symbolic
@@ -695,7 +695,9 @@
 
 if strtype is str:
 from rpython.rtyper.lltypesystem.rstr import (STR as STRTYPE,
-  copy_string_to_raw)
+  copy_string_to_raw,
+  copy_raw_to_string,
+  copy_string_contents)
 from rpython.rtyper.annlowlevel import llstr as llstrtype
 from rpython.rtyper.annlowlevel import hlstr as hlstrtype
 TYPEP = CCHARP
@@ -705,7 +707,9 @@
 else:
 from rpython.rtyper.lltypesystem.rstr import (
 UNICODE as STRTYPE,
-copy_unicode_to_raw as copy_string_to_raw)
+copy_unicode_to_raw as copy_string_to_raw,
+copy_raw_to_unicode as copy_raw_to_string,
+copy_unicode_contents as copy_string_contents)
 from rpython.rtyper.annlowlevel import llunicode as llstrtype
 from rpython.rtyper.annlowlevel import hlunicode as hlstrtype
 TYPEP = CWCHARP
@@ -823,17 +827,10 @@
 return hlstrtype(gc_buf)
 
 new_buf = lltype.malloc(STRTYPE, needed_size)
-str_chars_offset = (offsetof(STRTYPE, 'chars') + \
-itemoffsetof(STRTYPE.chars, 0))
 if gc_buf:
-src = cast_ptr_to_adr(gc_buf) + str_chars_offset
+copy_string_contents(gc_buf, new_buf, 0, 0, needed_size)
 else:
-src = cast_ptr_to_adr(raw_buf) + itemoffsetof(TYPEP.TO, 0)
-dest = cast_ptr_to_adr(new_buf) + str_chars_offset
-raw_memcopy(src, dest,
-llmemory.sizeof(ll_char_type) * needed_size)
-keepalive_until_here(gc_buf)
-keepalive_until_here(new_buf)
+copy_raw_to_string(raw_buf, new_buf, 0, needed_size)
 return hlstrtype(new_buf)
 
 # (char*, str) - None
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy default: More precision, needed for 938e7328779b

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: 
Changeset: r69897:c0059044fa35
Date: 2014-03-12 12:18 +0100
http://bitbucket.org/pypy/pypy/changeset/c0059044fa35/

Log:More precision, needed for 938e7328779b

diff --git a/rpython/rtyper/llannotation.py b/rpython/rtyper/llannotation.py
--- a/rpython/rtyper/llannotation.py
+++ b/rpython/rtyper/llannotation.py
@@ -6,7 +6,7 @@
 from rpython.annotator.model import (
 SomeObject, SomeSingleFloat, SomeFloat, SomeLongFloat, SomeChar,
 SomeUnicodeCodePoint, SomeInteger, SomeString, SomeImpossibleValue,
-s_None, s_Bool, UnionError, AnnotatorError)
+s_None, s_Bool, UnionError, AnnotatorError, SomeBool)
 from rpython.rtyper.lltypesystem import lltype, llmemory
 
 class SomeAddress(SomeObject):
@@ -155,7 +155,10 @@
 return ll_to_annotation(v)
 
 def bool(self):
-return s_Bool
+result = SomeBool()
+if self.is_constant():
+result.const = bool(self.const)
+return result
 
 
 class SomeInteriorPtr(SomePtr):
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: Temporary disable inspector.py

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69900:3d9b35f2c84a
Date: 2014-03-12 12:57 +0100
http://bitbucket.org/pypy/pypy/changeset/3d9b35f2c84a/

Log:Temporary disable inspector.py

diff --git a/rpython/memory/gc/inspector.py b/rpython/memory/gc/inspector.py
--- a/rpython/memory/gc/inspector.py
+++ b/rpython/memory/gc/inspector.py
@@ -36,6 +36,7 @@
 gc._list_rpy = None
 
 def get_rpy_roots(gc):
+assert 0 # XXX XXX STM TEMP
 count = _do_count_rpy_roots(gc)
 extra = 16
 while True:
@@ -74,6 +75,7 @@
 gc.trace(llmemory.cast_ptr_to_adr(gcref), _append_rpy_referent, gc)
 
 def get_rpy_referents(gc, gcref):
+assert 0 # XXX XXX STM TEMP
 count = _do_count_rpy_referents(gc, gcref)
 result = [lltype.nullptr(llmemory.GCREF.TO)] * count
 _do_append_rpy_referents(gc, gcref, result)
@@ -82,13 +84,16 @@
 # --
 
 def get_rpy_memory_usage(gc, gcref):
+assert 0 # XXX XXX STM TEMP
 return gc.get_size_incl_hash(llmemory.cast_ptr_to_adr(gcref))
 
 def get_rpy_type_index(gc, gcref):
+assert 0 # XXX XXX STM TEMP
 typeid = gc.get_type_id(llmemory.cast_ptr_to_adr(gcref))
 return gc.get_member_index(typeid)
 
 def is_rpy_instance(gc, gcref):
+assert 0 # XXX XXX STM TEMP
 typeid = gc.get_type_id(llmemory.cast_ptr_to_adr(gcref))
 return gc.is_rpython_class(typeid)
 
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: More precision, needed for 938e7328779b

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69899:b333e74ef7d0
Date: 2014-03-12 12:18 +0100
http://bitbucket.org/pypy/pypy/changeset/b333e74ef7d0/

Log:More precision, needed for 938e7328779b

diff --git a/rpython/rtyper/llannotation.py b/rpython/rtyper/llannotation.py
--- a/rpython/rtyper/llannotation.py
+++ b/rpython/rtyper/llannotation.py
@@ -6,7 +6,7 @@
 from rpython.annotator.model import (
 SomeObject, SomeSingleFloat, SomeFloat, SomeLongFloat, SomeChar,
 SomeUnicodeCodePoint, SomeInteger, SomeString, SomeImpossibleValue,
-s_None, s_Bool, UnionError, AnnotatorError)
+s_None, s_Bool, UnionError, AnnotatorError, SomeBool)
 from rpython.rtyper.lltypesystem import lltype, llmemory
 
 class SomeAddress(SomeObject):
@@ -155,7 +155,10 @@
 return ll_to_annotation(v)
 
 def bool(self):
-return s_Bool
+result = SomeBool()
+if self.is_constant():
+result.const = bool(self.const)
+return result
 
 
 class SomeInteriorPtr(SomePtr):
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] stmgc c7-weakref: fix

2014-03-12 Thread Remi Meier
Author: Remi Meier
Branch: c7-weakref
Changeset: r980:f10f5aecb970
Date: 2014-03-12 16:27 +0100
http://bitbucket.org/pypy/stmgc/changeset/f10f5aecb970/

Log:fix

diff --git a/c7/test/common.py b/c7/test/common.py
--- a/c7/test/common.py
+++ b/c7/test/common.py
@@ -14,7 +14,7 @@
  os.path.join(parent_dir, stmgc.c)] + [
 os.path.join(parent_dir, 'stm', _n)
 for _n in os.listdir(os.path.join(parent_dir, 'stm'))
-if _n.endswith('.h') or _n.endswith('.c')]
+ if (_n.endswith('.h') or _n.endswith('.c')) and not 
_n.startswith('.')]
 
 _pycache_ = os.path.join(parent_dir, 'test', '__pycache__')
 if os.path.exists(_pycache_):
diff --git a/c7/test/support.py b/c7/test/support.py
--- a/c7/test/support.py
+++ b/c7/test/support.py
@@ -287,7 +287,7 @@
 return o
 
 def stm_allocate_weakref(point_to_obj):
-o = lib.stm_allocate(HDR + WORD)
+o = lib.stm_allocate_weakref(HDR + WORD)
 tid = 421420
 lib._set_type_id(o, tid)
 lib._set_weakref(o, point_to_obj)
diff --git a/c7/test/test_weakref.py b/c7/test/test_weakref.py
--- a/c7/test/test_weakref.py
+++ b/c7/test/test_weakref.py
@@ -10,16 +10,36 @@
 self.start_transaction()
 
 self.push_root_no_gc()
-lp1 = stm_allocate_weakref(ffi.NULL)# no collection here
+lp2 = stm_allocate(48)
+lp1 = stm_allocate_weakref(lp2)# no collection here
 self.pop_root()
 
-assert stm_get_weakref(lp1) == ffi.NULL
+assert stm_get_weakref(lp1) == lp2
 
 self.push_root(lp1)
 stm_minor_collect()
 lp1 = self.pop_root()
+# lp2 died
+assert stm_get_weakref(lp1) == ffi.NULL
 
-assert stm_get_weakref(lp1) == ffi.NULL
+def test_still_simple(self):
+lib._stm_set_nursery_free_count(2048)
+self.start_transaction()
+
+self.push_root_no_gc()
+lp2 = stm_allocate(48)
+lp1 = stm_allocate_weakref(lp2)# no collection here
+self.pop_root()
+
+assert stm_get_weakref(lp1) == lp2
+
+self.push_root(lp1)
+self.push_root(lp2)
+stm_minor_collect()
+lp2 = self.pop_root()
+lp1 = self.pop_root()
+# lp2 survived
+assert stm_get_weakref(lp1) == lp2
 
 # def test_weakref_invalidate(self):
 # p2 = nalloc(HDR)
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] stmgc c7-weakref: start adding weakref support

2014-03-12 Thread Remi Meier
Author: Remi Meier
Branch: c7-weakref
Changeset: r979:3040d781125a
Date: 2014-03-12 16:18 +0100
http://bitbucket.org/pypy/stmgc/changeset/3040d781125a/

Log:start adding weakref support

diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -180,6 +180,7 @@
 }
 
 assert(list_is_empty(STM_PSEGMENT-modified_old_objects));
+assert(list_is_empty(STM_PSEGMENT-young_weakrefs));
 assert(tree_is_cleared(STM_PSEGMENT-young_outside_nursery));
 assert(tree_is_cleared(STM_PSEGMENT-nursery_objects_shadows));
 assert(tree_is_cleared(STM_PSEGMENT-callbacks_on_abort));
diff --git a/c7/stm/core.h b/c7/stm/core.h
--- a/c7/stm/core.h
+++ b/c7/stm/core.h
@@ -54,6 +54,11 @@
after the object. */
 GCFLAG_HAS_SHADOW = 0x04,
 
+/* This flag is set on weakref objects. Weakref objects have a
+   reference to the referenced object at the byte-offset
+   stmcb_size_rounded_up(obj) - sizeof(void*) */
+GCFLAG_WEAKREF = 0x08,
+
 /* All remaining bits of the 32-bit 'stm_flags' field are taken by
the overflow number.  This is a number that identifies the
overflow objects from the current transaction among all old
@@ -61,7 +66,7 @@
current transaction that have been flushed out of the nursery,
which occurs if the same transaction allocates too many objects.
 */
-GCFLAG_OVERFLOW_NUMBER_bit0 = 0x08   /* must be last */
+GCFLAG_OVERFLOW_NUMBER_bit0 = 0x10   /* must be last */
 };
 
 
@@ -105,6 +110,14 @@
next minor collection. */
 struct tree_s *nursery_objects_shadows;
 
+/* List of all young weakrefs to check in minor collections. These
+   are the only weakrefs that may point to young objects. */
+struct list_s *young_weakrefs;
+
+/* List of all old weakrefs to check in major collections. These
+   weakrefs never point to young objects */
+struct list_s *old_weakrefs;
+
 /* Tree of 'key-callback' associations from stm_call_on_abort() */
 struct tree_s *callbacks_on_abort;
 
diff --git a/c7/stm/nursery.c b/c7/stm/nursery.c
--- a/c7/stm/nursery.c
+++ b/c7/stm/nursery.c
@@ -299,6 +299,9 @@
 
 collect_oldrefs_to_nursery();
 
+/* now all surviving nursery objects have been moved out */
+stm_move_young_weakrefs();
+
 throw_away_nursery(get_priv_segment(STM_SEGMENT-segment_num));
 
 assert(MINOR_NOTHING_TO_DO(STM_PSEGMENT));
diff --git a/c7/stm/setup.c b/c7/stm/setup.c
--- a/c7/stm/setup.c
+++ b/c7/stm/setup.c
@@ -57,6 +57,8 @@
 pr-objects_pointing_to_nursery = NULL;
 pr-large_overflow_objects = NULL;
 pr-modified_old_objects = list_create();
+pr-young_weakrefs = list_create();
+pr-old_weakrefs = list_create();
 pr-young_outside_nursery = tree_create();
 pr-nursery_objects_shadows = tree_create();
 pr-callbacks_on_abort = tree_create();
@@ -95,6 +97,8 @@
 assert(pr-objects_pointing_to_nursery == NULL);
 assert(pr-large_overflow_objects == NULL);
 list_free(pr-modified_old_objects);
+list_free(pr-young_weakrefs);
+list_free(pr-old_weakrefs);
 tree_free(pr-young_outside_nursery);
 tree_free(pr-nursery_objects_shadows);
 tree_free(pr-callbacks_on_abort);
diff --git a/c7/stm/weakref.c b/c7/stm/weakref.c
new file mode 100644
--- /dev/null
+++ b/c7/stm/weakref.c
@@ -0,0 +1,226 @@
+#ifndef _STM_CORE_H_
+# error must be compiled via stmgc.c
+#endif
+
+
+object_t *stm_allocate_weakref(ssize_t size_rounded_up)
+{
+OPT_ASSERT(size_rounded_up  sizeof(struct object_s));
+object_t *obj = stm_allocate(size_rounded_up);
+obj-stm_flags |= GCFLAG_WEAKREF;
+LIST_APPEND(STM_PSEGMENT-young_weakrefs, obj);
+return obj;
+}
+
+
+/* Minor collection */
+
+void stm_move_young_weakrefs()
+{
+/* The code relies on the fact that no weakref can be an old object
+   weakly pointing to a young object.  Indeed, weakrefs are immutable
+   so they cannot point to an object that was created after it.
+*/
+LIST_FOREACH_R(
+STM_PSEGMENT-young_weakrefs,
+object_t * /*item*/,
+({
+if (_is_in_nursery(item)) {
+object_t *TLPREFIX *pforwarded_array = (object_t *TLPREFIX 
*)item;
+
+/* the following checks are done like in nursery.c: */
+if (!(item-stm_flags  GCFLAG_HAS_SHADOW)
+|| (pforwarded_array[0] != GCWORD_MOVED)) {
+/* weakref dies */
+continue;
+}
+
+item = pforwarded_array[1]; /* moved location */
+}
+else {
+/* young outside nursery object */
+if (tree_contains(STM_PSEGMENT-young_outside_nursery,
+  (uintptr_t)item)) {
+/* still in the tree - wasn't seen by the minor 
collection,
+   so it doesn't survive */

[pypy-commit] stmgc c7-weakref: more tests

2014-03-12 Thread Remi Meier
Author: Remi Meier
Branch: c7-weakref
Changeset: r981:43a1c14eaaa6
Date: 2014-03-12 16:36 +0100
http://bitbucket.org/pypy/stmgc/changeset/43a1c14eaaa6/

Log:more tests

diff --git a/c7/test/test_weakref.py b/c7/test/test_weakref.py
--- a/c7/test/test_weakref.py
+++ b/c7/test/test_weakref.py
@@ -22,6 +22,12 @@
 # lp2 died
 assert stm_get_weakref(lp1) == ffi.NULL
 
+self.push_root(lp1)
+stm_minor_collect()
+lp1 = self.pop_root()
+# lp2 died
+assert stm_get_weakref(lp1) == ffi.NULL
+
 def test_still_simple(self):
 lib._stm_set_nursery_free_count(2048)
 self.start_transaction()
@@ -41,94 +47,39 @@
 # lp2 survived
 assert stm_get_weakref(lp1) == lp2
 
-# def test_weakref_invalidate(self):
-# p2 = nalloc(HDR)
-# p1 = lib.stm_weakref_allocate(WEAKREF_SIZE, WEAKREF_TID, p2)
-# assert p1.h_tid == WEAKREF_TID | GCFLAG_IMMUTABLE | GCFLAG_WEAKREF
-# assert p1.h_revision == lib.get_private_rev_num()
-# assert lib.rawgetptr(p1, 0) == p2
-# lib.stm_push_root(p1)
-# minor_collect()
-# p1 = lib.stm_pop_root()
-# assert lib.rawgetptr(p1, 0) == ffi.NULL
+self.push_root(lp1)
+self.push_root(lp2)
+stm_minor_collect()
+lp2 = self.pop_root()
+lp1 = self.pop_root()
+# lp2 survived
+assert stm_get_weakref(lp1) == lp2
 
-# def test_weakref_itself_dies(self):
-# p2 = nalloc(HDR)
-# p1 = lib.stm_weakref_allocate(WEAKREF_SIZE, WEAKREF_TID, p2)
-# minor_collect()
+def test_weakref_itself_dies(self):
+self.start_transaction()
 
-# def test_weakref_keep(self):
-# p2 = nalloc(HDR)
-# p1 = lib.stm_weakref_allocate(WEAKREF_SIZE, WEAKREF_TID, p2)
-# assert p1.h_tid == WEAKREF_TID | GCFLAG_IMMUTABLE | GCFLAG_WEAKREF
-# assert p1.h_revision == lib.get_private_rev_num()
-# assert lib.rawgetptr(p1, 0) == p2
-# lib.stm_push_root(p1)
-# lib.stm_push_root(p2)
-# minor_collect()
-# p2 = lib.stm_pop_root()
-# p1 = lib.stm_pop_root()
-# assert lib.rawgetptr(p1, 0) == p2
+self.push_root_no_gc()
+lp2 = stm_allocate(48)
+stm_allocate_weakref(lp2)# no collection here
+self.pop_root()
+stm_minor_collect()
+assert lib._stm_total_allocated() == 0
 
-# def test_weakref_old_keep(self):
-# p2 = oalloc(HDR)
-# p1 = lib.stm_weakref_allocate(WEAKREF_SIZE, WEAKREF_TID, p2)
-# assert p1.h_tid == WEAKREF_TID | GCFLAG_IMMUTABLE | GCFLAG_WEAKREF
-# assert p1.h_revision == lib.get_private_rev_num()
-# assert lib.rawgetptr(p1, 0) == p2
-# lib.stm_push_root(p1)
-# lib.stm_push_root(p2)
-# minor_collect()
-# p2 = lib.stm_pop_root()
-# p1 = lib.stm_pop_root()
-# assert lib.rawgetptr(p1, 0) == p2
 
+def test_weakref_old_keep(self):
+lp0 = stm_allocate_old(48)
 
-# def test_old_private_not_keep_alive_weakref(self):
-# p = palloc(HDR + WORD)
-# q = palloc_refs(1)
+self.start_transaction()
+self.push_root_no_gc()
+lp1 = stm_allocate_weakref(lp0)# no collection here
+self.pop_root()
 
-# def f1(c):
-# if c == 1:
-# # currently fails because:
-# # p1 still in old_objects_to_trace
-# # - keeps alive weakp1w
-# # - stm_move_young_weakrefs() sees a weakref pointing
-# #to an aborted object
-# minor_collect()
-# return
+self.push_root(lp1)
+stm_minor_collect()
+lp1 = self.pop_root()
 
-# # allocate the container as old, private q1
-# q1 = lib.stm_write_barrier(q)
-# assert classify(q1) == private
-# lib.stm_push_root(q1)
-# minor_collect()
-# q1 = lib.stm_pop_root()
-# assert classify(q1) == private
-# assert q1.h_tid  GCFLAG_OLD
-# assert q1.h_tid  GCFLAG_WRITE_BARRIER
+assert stm_get_weakref(lp1) == lp0
 
-# # allocate young private p1 to point to
-# p1 = lib.stm_write_barrier(p)
-# assert ffi.cast(gcptr, p1.h_original) == p
-# assert classify(p1) == private
-# assert not (p1.h_tid  GCFLAG_OLD)
-
-# lib.stm_push_root(p1)
-# lib.stm_push_root(q1)
-# weakp1w = lib.stm_weakref_allocate(WEAKREF_SIZE, WEAKREF_TID, p1)
-# q1 = lib.stm_pop_root()
-# p1 = lib.stm_pop_root()
-# # q1 still old, p1 still young, weakp1w also young
-
-# q1w = lib.stm_write_barrier(q1)
-# # add q1 to old_objects_to_trace
-# assert q1 == q1w # was and is private
-# lib.rawsetptr(q1, 0, weakp1w)
-
-#  

[pypy-commit] stmgc default: This patch to LLVM seems to get me farther.

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: 
Changeset: r982:a58bb2fa06ad
Date: 2014-03-12 16:52 +0100
http://bitbucket.org/pypy/stmgc/changeset/a58bb2fa06ad/

Log:This patch to LLVM seems to get me farther.

diff --git a/c7/llvmfix/no-introduce-bogus-cast-in-combine.diff 
b/c7/llvmfix/no-introduce-bogus-cast-in-combine.diff
new file mode 100644
--- /dev/null
+++ b/c7/llvmfix/no-introduce-bogus-cast-in-combine.diff
@@ -0,0 +1,22 @@
+Index: lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp
+===
+--- lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp  (revision 
199602)
 lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp  (working copy)
+@@ -295,6 +295,17 @@
+ 
+ Type *SrcPTy = SrcTy-getElementType();
+ 
++// XXX note that we might end up with a bogus cast: if the original
++// cast in 'load (cast P)' is between foo addrspace1 ** and foo
++// addrspace2 **, then we cannot re-express the two operations as
++// 'cast (load P)' because that would be casting a foo addrspace1 *
++// to foo addrspace2 *.  While nothing is really wrong about that
++// cast, llvm forbids it even in internally-generated operations.
++if (SrcPTy-isPointerTy()  DestPTy-isPointerTy() 
++ castPointerType(DestPTy)-getAddressSpace() !=
++ castPointerType(SrcPTy)-getAddressSpace())
++  return 0;
++
+ if (DestPTy-isIntegerTy() || DestPTy-isPointerTy() ||
+  DestPTy-isVectorTy()) {
+   // If the source is an array, the code below will not succeed.  Check to
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] stmgc default: Support prebuilt objects that are only aligned on multiples of 4 bytes

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: 
Changeset: r983:c6ed145863b4
Date: 2014-03-12 17:18 +0100
http://bitbucket.org/pypy/stmgc/changeset/c6ed145863b4/

Log:Support prebuilt objects that are only aligned on multiples of 4
bytes as static data.

diff --git a/c7/stm/prebuilt.c b/c7/stm/prebuilt.c
--- a/c7/stm/prebuilt.c
+++ b/c7/stm/prebuilt.c
@@ -16,9 +16,13 @@
 return;
 
 /* If the object was already moved, it is stored in 'tree_prebuilt_objs'.
+   For now we use this dictionary, with keys being equal to the double
+   of the numeric address of the prebuilt object.  We double them in
+   order to support addresses that are only 4-byte-aligned in the
+   static data.
  */
 wlog_t *item;
-TREE_FIND(*tree_prebuilt_objs, (uintptr_t)obj, item, goto not_found);
+TREE_FIND(*tree_prebuilt_objs, 2 * (uintptr_t)obj, item, goto not_found);
 
 *pstaticobj_invalid = (object_t *)item-val;/* already moved */
 return;
@@ -38,7 +42,7 @@
 nobj-stm_flags = GCFLAG_WRITE_BARRIER;
 
 /* Add the object to the tree */
-tree_insert(tree_prebuilt_objs, (uintptr_t)obj, (uintptr_t)nobj);
+tree_insert(tree_prebuilt_objs, 2 * (uintptr_t)obj, (uintptr_t)nobj);
 
 /* Done */
 *pstaticobj_invalid = nobj;
diff --git a/c7/test/test_prebuilt.py b/c7/test/test_prebuilt.py
--- a/c7/test/test_prebuilt.py
+++ b/c7/test/test_prebuilt.py
@@ -83,3 +83,17 @@
 
 def test_multiple_calls_to_stm_setup_prebuilt_2(self):
 self.test_multiple_calls_to_stm_setup_prebuilt_1(reverse=True)
+
+def test_prebuilt_align_4_byte(self):
+static0 = prebuilt(16)
+p0 = ffi.cast(char *, static0)
+for i in reversed(range(12)):
+p0[i + 4] = p0[i]
+static1 = ffi.cast(object_t *, p0 + 4)
+ffi.cast(char *, static1)[8:11] = 'ABC'
+lp = lib.stm_setup_prebuilt(static1)
+#
+self.start_transaction()
+assert stm_get_char(lp, 8) == 'A'
+assert stm_get_char(lp, 9) == 'B'
+assert stm_get_char(lp, 10) == 'C'
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: Another static=True missing

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69901:8a001c675c7f
Date: 2014-03-12 17:18 +0100
http://bitbucket.org/pypy/pypy/changeset/8a001c675c7f/

Log:Another static=True missing

diff --git a/rpython/translator/c/database.py b/rpython/translator/c/database.py
--- a/rpython/translator/c/database.py
+++ b/rpython/translator/c/database.py
@@ -7,7 +7,7 @@
 from rpython.rtyper.lltypesystem.rffi import CConstant
 from rpython.rtyper.lltypesystem import llgroup
 from rpython.tool.sourcetools import valid_identifier
-from rpython.translator.c.primitive import PrimitiveName, PrimitiveType
+from rpython.translator.c.primitive import PrimitiveName, PrimitiveType, 
name_gcref
 from rpython.translator.c.node import StructDefNode, ArrayDefNode
 from rpython.translator.c.node import FixedSizeArrayDefNode, 
BareBoneArrayDefNode
 from rpython.translator.c.node import ContainerNodeFactory, 
ExtTypeOpaqueDefNode
@@ -183,8 +183,10 @@
 if isinstance(obj, CConstant):
 return obj.c_name  # without further checks
 T = typeOf(obj)
-if isinstance(T, Primitive) or T == GCREF:
+if isinstance(T, Primitive):
 return PrimitiveName[T](obj, self)
+elif T == GCREF:
+return name_gcref(obj, self, static=static)
 elif isinstance(T, Ptr):
 if (isinstance(T.TO, OpaqueType) and
 T.TO.hints.get('c_pointer_typedef') is not None):
diff --git a/rpython/translator/c/primitive.py 
b/rpython/translator/c/primitive.py
--- a/rpython/translator/c/primitive.py
+++ b/rpython/translator/c/primitive.py
@@ -174,7 +174,7 @@
 else:
 return 'NULL'
 
-def name_gcref(value, db):
+def name_gcref(value, db, static=False):
 if value:
 obj = value._obj
 if isinstance(obj, int):
@@ -184,7 +184,7 @@
 if isinstance(realobj, int):
 return _name_tagged(realobj, db)
 realvalue = cast_opaque_ptr(Ptr(typeOf(realobj)), value)
-return db.get(realvalue)
+return db.get(realvalue, static=static)
 else:
 return 'NULL'
 
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: import stmgc/c6ed145863b4

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69902:32b8f8917322
Date: 2014-03-12 17:19 +0100
http://bitbucket.org/pypy/pypy/changeset/32b8f8917322/

Log:import stmgc/c6ed145863b4

diff --git a/rpython/translator/stm/src_stm/revision 
b/rpython/translator/stm/src_stm/revision
--- a/rpython/translator/stm/src_stm/revision
+++ b/rpython/translator/stm/src_stm/revision
@@ -1,1 +1,1 @@
-3f0d8773b90b
+c6ed145863b4
diff --git a/rpython/translator/stm/src_stm/stm/prebuilt.c 
b/rpython/translator/stm/src_stm/stm/prebuilt.c
--- a/rpython/translator/stm/src_stm/stm/prebuilt.c
+++ b/rpython/translator/stm/src_stm/stm/prebuilt.c
@@ -17,9 +17,13 @@
 return;
 
 /* If the object was already moved, it is stored in 'tree_prebuilt_objs'.
+   For now we use this dictionary, with keys being equal to the double
+   of the numeric address of the prebuilt object.  We double them in
+   order to support addresses that are only 4-byte-aligned in the
+   static data.
  */
 wlog_t *item;
-TREE_FIND(*tree_prebuilt_objs, (uintptr_t)obj, item, goto not_found);
+TREE_FIND(*tree_prebuilt_objs, 2 * (uintptr_t)obj, item, goto not_found);
 
 *pstaticobj_invalid = (object_t *)item-val;/* already moved */
 return;
@@ -39,7 +43,7 @@
 nobj-stm_flags = GCFLAG_WRITE_BARRIER;
 
 /* Add the object to the tree */
-tree_insert(tree_prebuilt_objs, (uintptr_t)obj, (uintptr_t)nobj);
+tree_insert(tree_prebuilt_objs, 2 * (uintptr_t)obj, (uintptr_t)nobj);
 
 /* Done */
 *pstaticobj_invalid = nobj;
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] stmgc c7-weakref: more tests

2014-03-12 Thread Remi Meier
Author: Remi Meier
Branch: c7-weakref
Changeset: r987:e08ba00edf36
Date: 2014-03-12 17:24 +0100
http://bitbucket.org/pypy/stmgc/changeset/e08ba00edf36/

Log:more tests

diff --git a/c7/test/test_weakref.py b/c7/test/test_weakref.py
--- a/c7/test/test_weakref.py
+++ b/c7/test/test_weakref.py
@@ -145,107 +145,46 @@
 # lp2 died
 assert stm_get_weakref(lp1) == ffi.NULL
 
+def test_weakref_old_keep(self):
+lp0 = stm_allocate_old(48)
 
+self.start_transaction()
+self.push_root_no_gc()
+lp1 = stm_allocate_weakref(lp0)# no collection here
+self.pop_root()
 
+self.push_root(lp1)
+stm_major_collect()
+lp1 = self.pop_root()
 
+assert stm_get_weakref(lp1) == lp0
 
-# class TestMajorCollection(BaseTest):
+def test_survive(self):
+self.start_transaction()
 
-# def test_weakref_old(self):
-# p2 = nalloc(HDR)
-# p1 = lib.stm_weakref_allocate(WEAKREF_SIZE, WEAKREF_TID, p2)
-# #
-# lib.stm_push_root(p1)
-# lib.stm_push_root(p2)
-# major_collect()
-# p2 = lib.stm_pop_root()
-# p1 = lib.stm_pop_root()
-# assert lib.rawgetptr(p1, 0) == p2
-# #
-# lib.stm_push_root(p1)
-# major_collect()
-# p1 = lib.stm_pop_root()
-# assert lib.rawgetptr(p1, 0) == ffi.NULL
+self.push_root_no_gc()
+lp2 = stm_allocate(48)
+lp1 = stm_allocate_weakref(lp2)# no collection here
+self.pop_root()
 
-# def test_weakref_to_prebuilt(self):
-# p2 = palloc(HDR)
-# p1 = lib.stm_weakref_allocate(WEAKREF_SIZE, WEAKREF_TID, p2)
-# #
-# lib.stm_push_root(p1)
-# major_collect()
-# p1 = lib.stm_pop_root()
-# assert lib.rawgetptr(p1, 0) == p2
+assert stm_get_weakref(lp1) == lp2
 
-# def test_weakref_update_version(self):
-# p2 = oalloc(HDR + WORD); make_public(p2)
-# p1 = lib.stm_weakref_allocate(WEAKREF_SIZE, WEAKREF_TID, p2)
-# #
-# lib.stm_push_root(p1)
-# lib.stm_push_root(p2)
-# major_collect()
-# p2 = lib.stm_pop_root()
-# p1 = lib.stm_pop_root()
-# assert lib.rawgetptr(p1, 0) == p2
-# #
-# lib.stm_commit_transaction()
-# lib.stm_begin_inevitable_transaction()
-# #
-# lib.setlong(p2, 0, 912809218)   # write barrier
-# assert lib.rawgetlong(p2, 0) == 0
-# lib.stm_push_root(p1)
-# lib.stm_push_root(p2)
-# major_collect()
-# p2 = lib.stm_pop_root()
-# p1 = lib.stm_pop_root()
-# assert lib.rawgetptr(p1, 0) == p2
-# assert lib.rawgetlong(p2, 0) == 0
-# #
-# lib.stm_commit_transaction()
-# lib.stm_begin_inevitable_transaction()
-# #
-# assert lib.rawgetptr(p1, 0) == p2
-# assert lib.rawgetlong(p2, 0) == 0
-# lib.stm_push_root(p1)
-# lib.stm_push_root(p2)
-# major_collect()
-# p2b = lib.stm_pop_root()
-# p1 = lib.stm_pop_root()
-# assert lib.rawgetptr(p1, 0) == p2
-# assert p2b != p2
-# assert lib.getlong(p2b, 0) == 912809218
-# assert lib.getlong(p2, 0) == 912809218
+self.push_root(lp1)
+self.push_root(lp2)
+stm_major_collect()
+lp2 = self.pop_root()
+lp1 = self.pop_root()
+# lp2 survived
+assert stm_get_weakref(lp1) == lp2
 
+self.push_root(lp1)
+stm_minor_collect()
+lp1 = self.pop_root()
+# lp2 survived because no major collection
+assert stm_get_weakref(lp1) == lp2
 
-# def test_stealing(self):
-# p = palloc_refs(1)
-# u = palloc_refs(1)
-
-# def f1(r):
-# q = nalloc(HDR+WORD)
-# # lib.stm_push_root(q)
-# w = lib.stm_weakref_allocate(WEAKREF_SIZE, WEAKREF_TID, q)
-# # q = lib.stm_pop_root()
-# setptr(p, 0, w)
-# setptr(u, 0, q)
-# minor_collect()
-# lib.stm_commit_transaction()
-# lib.stm_begin_inevitable_transaction()
-# r.set(2)
-# r.wait(3)
-# print happy
-
-# def f2(r):
-# r.wait(2)
-# # steal p, should stub the weakref contained in it
-# pr = lib.stm_read_barrier(p)
-# w = rawgetptr(pr, 0)
-# assert classify(w) == stub
-
-# # read weakref, should stub out weakptr
-# wr = lib.stm_read_barrier(w)
-# assert wr.h_tid  GCFLAG_WEAKREF
-# assert classify(lib.rawgetptr(wr, 0)) == stub
-
-# r.set(3)
-
-# run_parallel(f1, f2)
+self.push_root(lp1)
+stm_major_collect()
+lp1 = self.pop_root()
+# lp2 died
+assert stm_get_weakref(lp1) == ffi.NULL
___
pypy-commit mailing 

[pypy-commit] stmgc c7-weakref: consider major collections

2014-03-12 Thread Remi Meier
Author: Remi Meier
Branch: c7-weakref
Changeset: r986:510710368671
Date: 2014-03-12 17:21 +0100
http://bitbucket.org/pypy/stmgc/changeset/510710368671/

Log:consider major collections

diff --git a/c7/stm/core.h b/c7/stm/core.h
--- a/c7/stm/core.h
+++ b/c7/stm/core.h
@@ -111,11 +111,12 @@
 struct tree_s *nursery_objects_shadows;
 
 /* List of all young weakrefs to check in minor collections. These
-   are the only weakrefs that may point to young objects. */
+   are the only weakrefs that may point to young objects and never
+   contain NULL. */
 struct list_s *young_weakrefs;
 
 /* List of all old weakrefs to check in major collections. These
-   weakrefs never point to young objects */
+   weakrefs never point to young objects and never contain NULL. */
 struct list_s *old_weakrefs;
 
 /* Tree of 'key-callback' associations from stm_call_on_abort() */
diff --git a/c7/stm/gcpage.c b/c7/stm/gcpage.c
--- a/c7/stm/gcpage.c
+++ b/c7/stm/gcpage.c
@@ -450,7 +450,11 @@
 /* 'objects_pointing_to_nursery' should be empty, but isn't
necessarily because it also lists objects that have been
written to but don't actually point to the nursery.  Clear
-   it up and set GCFLAG_WRITE_BARRIER again on the objects. */
+   it up and set GCFLAG_WRITE_BARRIER again on the objects.
+   This is the case for transactions where
+   MINOR_NOTHING_TO_DO() == false
+   but they still did write-barriers on objects
+*/
 lst = pseg-objects_pointing_to_nursery;
 if (lst != NULL) {
 LIST_FOREACH_R(lst, uintptr_t /*item*/,
@@ -537,6 +541,9 @@
 mark_visit_from_roots();
 LIST_FREE(mark_objects_to_trace);
 
+/* weakrefs: */
+stm_visit_old_weakrefs();
+
 /* cleanup */
 clean_up_segment_lists();
 
diff --git a/c7/stm/weakref.c b/c7/stm/weakref.c
--- a/c7/stm/weakref.c
+++ b/c7/stm/weakref.c
@@ -86,141 +86,38 @@
 
 /* Major collection */
 
-/* static _Bool is_partially_visited(gcptr obj) */
-/* { */
-/* /\* Based on gcpage.c:visit_public().  Check the code here if we change 
*/
-/*visit_public().  Returns True or False depending on whether we find 
any */
-/*version of 'obj' to be MARKED or not. */
-/* *\/ */
-/* assert(IMPLIES(obj-h_tid  GCFLAG_VISITED, */
-/*obj-h_tid  GCFLAG_MARKED)); */
-/* if (obj-h_tid  GCFLAG_MARKED) */
-/* return 1; */
 
-/* /\* if (!(obj-h_tid  GCFLAG_PUBLIC)) *\/ */
-/* /\* return 0; *\/ */
-/* assert(!(obj-h_tid  GCFLAG_PREBUILT_ORIGINAL)); */
-/* if (obj-h_original != 0) { */
-/* gcptr original = (gcptr)obj-h_original; */
-/* assert(IMPLIES(original-h_tid  GCFLAG_VISITED, */
-/*original-h_tid  GCFLAG_MARKED)); */
-/* if (original-h_tid  GCFLAG_MARKED) */
-/* return 1; */
-/* } */
-/* return 0; */
-/* } */
+void stm_visit_old_weakrefs(void)
+{
+long i;
+for (i = 0; i  NB_SEGMENTS; i++) {
+struct stm_priv_segment_info_s *pseg = get_priv_segment(i);
+struct list_s *lst;
 
-/* static void update_old_weakrefs_list(struct tx_public_descriptor *gcp) */
-/* { */
-/* long i, size = gcp-old_weakrefs.size; */
-/* gcptr *items = gcp-old_weakrefs.items; */
+lst = pseg-old_weakrefs;
+uintptr_t n = list_count(lst);
+while (n  0) {
+object_t *weakref = (object_t *)list_item(lst, --n);
+if (!mark_visited_test(weakref)) {
+/* weakref dies */
+list_set_item(lst, n, list_pop_item(lst));
+continue;
+}
 
-/* for (i = 0; i  size; i++) { */
-/* gcptr weakref = items[i]; */
+char *realobj = REAL_ADDRESS(pseg-pub.segment_base, weakref);
+ssize_t size = stmcb_size_rounded_up((struct object_s *)realobj);
+object_t *pointing_to = *WEAKREF_PTR(weakref, size);
+assert(pointing_to != NULL);
+if (!mark_visited_test(pointing_to)) {
+*WEAKREF_PTR(weakref, size) = NULL;
 
-/* /\* if a weakref moved, update its position in the list *\/ */
-/* if (weakref-h_tid  GCFLAG_MOVED) { */
-/* items[i] = (gcptr)weakref-h_original; */
-/* } */
-/* } */
-/* } */
-
-/* static void visit_old_weakrefs(struct tx_public_descriptor *gcp) */
-/* { */
-/* /\* Note: it's possible that a weakref points to a public stub to a */
-/*protected object, and only the protected object was marked as */
-/*VISITED so far.  In this case, this function needs to mark the */
-/*public stub as VISITED too. */
-/* *\/ */
-/* long i, size = gcp-old_weakrefs.size; */
-/* gcptr *items = gcp-old_weakrefs.items; */
-
-/* for (i = 0; i  size; i++) { */
-/* gcptr weakref = items[i]; */
-
-/* if (!(weakref-h_tid  GCFLAG_VISITED)) { */
-/*  

[pypy-commit] stmgc c7-weakref: fix cleanup on abort

2014-03-12 Thread Remi Meier
Author: Remi Meier
Branch: c7-weakref
Changeset: r984:2bb70b712097
Date: 2014-03-12 16:52 +0100
http://bitbucket.org/pypy/stmgc/changeset/2bb70b712097/

Log:fix cleanup on abort

diff --git a/c7/stm/core.c b/c7/stm/core.c
--- a/c7/stm/core.c
+++ b/c7/stm/core.c
@@ -484,6 +484,7 @@
 /* reset these lists to NULL too on abort */
 LIST_FREE(pseg-objects_pointing_to_nursery);
 LIST_FREE(pseg-large_overflow_objects);
+list_clear(pseg-young_weakrefs);
 }
 
 static void abort_with_mutex(void)
diff --git a/c7/test/test_weakref.py b/c7/test/test_weakref.py
--- a/c7/test/test_weakref.py
+++ b/c7/test/test_weakref.py
@@ -81,11 +81,49 @@
 assert stm_get_weakref(lp1) == lp0
 
 
+def test_abort_cleanup(self):
+self.start_transaction()
 
+self.push_root_no_gc()
+lp1 = stm_allocate_weakref(ffi.NULL)# no collection here
+self.pop_root()
 
+self.abort_transaction()
+self.start_transaction()
 
 
 
+class TestMajorCollection(BaseTest):
+def test_simple(self):
+self.start_transaction()
+
+self.push_root_no_gc()
+lp2 = stm_allocate(48)
+lp1 = stm_allocate_weakref(lp2)# no collection here
+self.pop_root()
+
+assert stm_get_weakref(lp1) == lp2
+
+self.push_root(lp1)
+self.push_root(lp2)
+stm_minor_collect()
+lp2 = self.pop_root()
+lp1 = self.pop_root()
+# lp2 survived
+assert stm_get_weakref(lp1) == lp2
+
+self.push_root(lp1)
+stm_minor_collect()
+lp1 = self.pop_root()
+# lp2 survived because no major collection
+assert stm_get_weakref(lp1) == lp2
+
+self.push_root(lp1)
+stm_major_collect()
+lp1 = self.pop_root()
+# lp2 died
+assert stm_get_weakref(lp1) == ffi.NULL
+
 
 
 
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] stmgc c7-weakref: another test

2014-03-12 Thread Remi Meier
Author: Remi Meier
Branch: c7-weakref
Changeset: r985:2a1c60c59b19
Date: 2014-03-12 17:03 +0100
http://bitbucket.org/pypy/stmgc/changeset/2a1c60c59b19/

Log:another test

diff --git a/c7/test/test_weakref.py b/c7/test/test_weakref.py
--- a/c7/test/test_weakref.py
+++ b/c7/test/test_weakref.py
@@ -91,6 +91,27 @@
 self.abort_transaction()
 self.start_transaction()
 
+def test_big_alloc_sizes(self):
+sizes = [lib._STM_FAST_ALLOC + 16, 48,]
+
+for osize in sizes:
+self.start_transaction()
+self.push_root_no_gc()
+lp2 = stm_allocate(osize)
+lp1 = stm_allocate_weakref(lp2)# no collection here
+self.pop_root()
+
+assert stm_get_weakref(lp1) == lp2
+
+self.push_root(lp1)
+self.push_root(lp2)
+stm_minor_collect()
+lp2 = self.pop_root()
+lp1 = self.pop_root()
+# lp2 survived
+assert stm_get_weakref(lp1) == lp2
+self.abort_transaction()
+
 
 
 class TestMajorCollection(BaseTest):
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy stmgc-c7: comment

2014-03-12 Thread arigo
Author: Armin Rigo ar...@tunes.org
Branch: stmgc-c7
Changeset: r69903:6ad4610e8d57
Date: 2014-03-12 17:35 +0100
http://bitbucket.org/pypy/pypy/changeset/6ad4610e8d57/

Log:comment

diff --git a/rpython/translator/c/genc.py b/rpython/translator/c/genc.py
--- a/rpython/translator/c/genc.py
+++ b/rpython/translator/c/genc.py
@@ -857,6 +857,9 @@
 print  f, '#include forwarddecl.h'
 print  f
 print  f, 'object_t *rpy_prebuilt[] = {'
+# XXX should ideally only list objects that are directly referenced
+# from C code *or* that need a custom hash.  This would reduce a lot
+# the length of the lists.
 gclist = [(node.globalgcnum, node) for node in database.globalcontainers()
   if hasattr(node, 'globalgcnum') and node.globalgcnum = 0]
 gclist.sort()
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] stmgc c7-weakref: fix some multi-threading issues

2014-03-12 Thread Remi Meier
Author: Remi Meier
Branch: c7-weakref
Changeset: r988:e21afc419f0a
Date: 2014-03-12 17:55 +0100
http://bitbucket.org/pypy/stmgc/changeset/e21afc419f0a/

Log:fix some multi-threading issues

diff --git a/c7/stm/core.h b/c7/stm/core.h
--- a/c7/stm/core.h
+++ b/c7/stm/core.h
@@ -54,11 +54,6 @@
after the object. */
 GCFLAG_HAS_SHADOW = 0x04,
 
-/* This flag is set on weakref objects. Weakref objects have a
-   reference to the referenced object at the byte-offset
-   stmcb_size_rounded_up(obj) - sizeof(void*) */
-GCFLAG_WEAKREF = 0x08,
-
 /* All remaining bits of the 32-bit 'stm_flags' field are taken by
the overflow number.  This is a number that identifies the
overflow objects from the current transaction among all old
@@ -66,7 +61,7 @@
current transaction that have been flushed out of the nursery,
which occurs if the same transaction allocates too many objects.
 */
-GCFLAG_OVERFLOW_NUMBER_bit0 = 0x10   /* must be last */
+GCFLAG_OVERFLOW_NUMBER_bit0 = 0x8   /* must be last */
 };
 
 
diff --git a/c7/stm/weakref.c b/c7/stm/weakref.c
--- a/c7/stm/weakref.c
+++ b/c7/stm/weakref.c
@@ -7,7 +7,9 @@
 {
 OPT_ASSERT(size_rounded_up  sizeof(struct object_s));
 object_t *obj = stm_allocate(size_rounded_up);
-obj-stm_flags |= GCFLAG_WEAKREF;
+
+assert(_is_in_nursery(obj)); /* see assert(0) which depends on it */
+
 LIST_APPEND(STM_PSEGMENT-young_weakrefs, obj);
 return obj;
 }
@@ -38,13 +40,16 @@
 item = pforwarded_array[1]; /* moved location */
 }
 else {
-/* young outside nursery object */
-if (tree_contains(STM_PSEGMENT-young_outside_nursery,
-  (uintptr_t)item)) {
-/* still in the tree - wasn't seen by the minor 
collection,
-   so it doesn't survive */
-continue;
-}
+/* tell me if we need this (requires synchronizing in case
+   of private pages) */
+assert(0);
+/* /\* young outside nursery object *\/ */
+/* if (tree_contains(STM_PSEGMENT-young_outside_nursery, */
+/*   (uintptr_t)item)) { */
+/* /\* still in the tree - wasn't seen by the minor 
collection, */
+/*so it doesn't survive *\/ */
+/* continue; */
+/* } */
 }
 assert(!_is_young(item));
 
@@ -109,7 +114,11 @@
 object_t *pointing_to = *WEAKREF_PTR(weakref, size);
 assert(pointing_to != NULL);
 if (!mark_visited_test(pointing_to)) {
+//assert(flag_page_private[(uintptr_t)weakref / 4096UL] != 
PRIVATE_PAGE);
 *WEAKREF_PTR(weakref, size) = NULL;
+if (flag_page_private[(uintptr_t)weakref / 4096UL] == 
PRIVATE_PAGE) {
+synchronize_overflow_object_now(weakref);
+}
 
 /* we don't need it in this list anymore */
 list_set_item(lst, n, list_pop_item(lst));
diff --git a/c7/test/test_weakref.py b/c7/test/test_weakref.py
--- a/c7/test/test_weakref.py
+++ b/c7/test/test_weakref.py
@@ -113,6 +113,37 @@
 self.abort_transaction()
 
 
+def test_multiple_threads(self):
+self.start_transaction()
+lp0 = stm_allocate(1024)
+self.push_root(lp0)
+self.commit_transaction()
+
+self.start_transaction()
+lp0 = self.pop_root()
+self.push_root(lp0)
+stm_write(lp0) # privatize page
+
+self.push_root_no_gc()
+lp2 = stm_allocate(48)
+lp1 = stm_allocate_weakref(lp2)# no collection here
+self.pop_root()
+
+self.push_root(lp0)
+self.push_root(lp1)
+self.commit_transaction()
+# lp2 dies
+lp1 = self.pop_root()
+self.push_root(lp1)
+
+assert stm_get_weakref(lp1) == ffi.NULL
+
+self.switch(1)
+
+assert stm_get_weakref(lp1) == ffi.NULL
+
+
+
 
 class TestMajorCollection(BaseTest):
 def test_simple(self):
@@ -188,3 +219,35 @@
 lp1 = self.pop_root()
 # lp2 died
 assert stm_get_weakref(lp1) == ffi.NULL
+
+def test_multiple_threads(self):
+self.start_transaction()
+lp0 = stm_allocate(48)
+lp1 = stm_allocate_weakref(lp0)# no collection here
+self.push_root(lp1)
+self.push_root(lp0)
+self.commit_transaction()
+
+self.start_transaction()
+lp0 = self.pop_root()
+lp1 = self.pop_root()
+self.push_root(lp1)
+
+stm_write(lp0) # privatize page with weakref in it too
+
+assert stm_get_page_flag(stm_get_obj_pages(lp1)[0]) == PRIVATE_PAGE
+assert stm_get_weakref(lp1) == lp0
+
+self.commit_transaction()
+self.start_transaction()

[pypy-commit] stmgc c7-weakref: fix the test, still passes

2014-03-12 Thread Remi Meier
Author: Remi Meier
Branch: c7-weakref
Changeset: r989:c1b635228c03
Date: 2014-03-12 17:58 +0100
http://bitbucket.org/pypy/stmgc/changeset/c1b635228c03/

Log:fix the test, still passes

diff --git a/c7/test/test_weakref.py b/c7/test/test_weakref.py
--- a/c7/test/test_weakref.py
+++ b/c7/test/test_weakref.py
@@ -249,5 +249,6 @@
 
 self.switch(1)
 
+self.start_transaction()
 assert stm_get_weakref(lp1) == ffi.NULL
 print stm_get_real_address(lp1)
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] stmgc c7-weakref: fix some other test and its failure by adding some synchronize_overflow_object_now(). Maybe there is a better solution

2014-03-12 Thread Remi Meier
Author: Remi Meier
Branch: c7-weakref
Changeset: r990:096c66121a67
Date: 2014-03-12 18:06 +0100
http://bitbucket.org/pypy/stmgc/changeset/096c66121a67/

Log:fix some other test and its failure by adding some
synchronize_overflow_object_now(). Maybe there is a better solution

diff --git a/c7/stm/weakref.c b/c7/stm/weakref.c
--- a/c7/stm/weakref.c
+++ b/c7/stm/weakref.c
@@ -65,11 +65,13 @@
 || (pforwarded_array[0] != GCWORD_MOVED)) {
 /* pointing_to dies */
 *WEAKREF_PTR(item, size) = NULL;
+synchronize_overflow_object_now(item);
 continue;   /* no need to remember in old_weakrefs */
 }
 else {
 /* moved location */
 *WEAKREF_PTR(item, size) = pforwarded_array[1];
+synchronize_overflow_object_now(item);
 }
 }
 else {
@@ -79,6 +81,7 @@
 /* still in the tree - wasn't seen by the minor 
collection,
so it doesn't survive */
 *WEAKREF_PTR(item, size) = NULL;
+synchronize_overflow_object_now(item);
 continue;   /* no need to remember in old_weakrefs */
 }
 /* pointing_to was already old */
diff --git a/c7/test/test_weakref.py b/c7/test/test_weakref.py
--- a/c7/test/test_weakref.py
+++ b/c7/test/test_weakref.py
@@ -140,6 +140,7 @@
 
 self.switch(1)
 
+self.start_transaction()
 assert stm_get_weakref(lp1) == ffi.NULL
 
 
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy default: skip this test for now

2014-03-12 Thread bdkearns
Author: Brian Kearns bdkea...@gmail.com
Branch: 
Changeset: r69906:d6c57e3f3a1c
Date: 2014-03-12 14:35 -0400
http://bitbucket.org/pypy/pypy/changeset/d6c57e3f3a1c/

Log:skip this test for now

diff --git a/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py 
b/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py
--- a/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_micronumpy.py
@@ -43,6 +43,7 @@
 log = self.run(main, [])
 assert log.result == 0
 loop, = log.loops_by_filename(self.filepath)
+skip('used to pass on 69421-f3e717c94913')
 assert loop.match(
 i81 = int_lt(i76, 300)
 guard_true(i81, descr=...)
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy default: add hex/oct ops for ndarrays

2014-03-12 Thread bdkearns
Author: Brian Kearns bdkea...@gmail.com
Branch: 
Changeset: r69905:713f1b94343d
Date: 2014-03-12 14:32 -0400
http://bitbucket.org/pypy/pypy/changeset/713f1b94343d/

Log:add hex/oct ops for ndarrays

diff --git a/pypy/module/micronumpy/ndarray.py 
b/pypy/module/micronumpy/ndarray.py
--- a/pypy/module/micronumpy/ndarray.py
+++ b/pypy/module/micronumpy/ndarray.py
@@ -1045,6 +1045,26 @@
 value = self.get_scalar_value()
 return space.float(value)
 
+def descr_hex(self, space):
+if self.get_size() != 1:
+raise oefmt(space.w_TypeError,
+only length-1 arrays can be converted to Python 
scalars)
+if not self.get_dtype().is_int():
+raise oefmt(space.w_TypeError,
+don't know how to convert scalar number to hex)
+value = self.get_scalar_value()
+return space.hex(value)
+
+def descr_oct(self, space):
+if self.get_size() != 1:
+raise oefmt(space.w_TypeError,
+only length-1 arrays can be converted to Python 
scalars)
+if not self.get_dtype().is_int():
+raise oefmt(space.w_TypeError,
+don't know how to convert scalar number to oct)
+value = self.get_scalar_value()
+return space.oct(value)
+
 def descr_index(self, space):
 if self.get_size() != 1 or \
 not self.get_dtype().is_int() or self.get_dtype().is_bool():
@@ -1237,6 +1257,8 @@
 __int__ = interp2app(W_NDimArray.descr_int),
 __long__ = interp2app(W_NDimArray.descr_long),
 __float__ = interp2app(W_NDimArray.descr_float),
+__hex__ = interp2app(W_NDimArray.descr_hex),
+__oct__ = interp2app(W_NDimArray.descr_oct),
 __buffer__ = interp2app(W_NDimArray.descr_get_data),
 __index__ = interp2app(W_NDimArray.descr_index),
 
diff --git a/pypy/module/micronumpy/test/test_ndarray.py 
b/pypy/module/micronumpy/test/test_ndarray.py
--- a/pypy/module/micronumpy/test/test_ndarray.py
+++ b/pypy/module/micronumpy/test/test_ndarray.py
@@ -2276,6 +2276,30 @@
 exc = raises(TypeError, float(np.array([1.5, 2.5])))
 assert exc.value[0] == 'only length-1 arrays can be converted to 
Python scalars'
 
+def test__hex__(self):
+import numpy as np
+assert hex(np.array(True)) == '0x1'
+assert hex(np.array(15)) == '0xf'
+assert hex(np.array([15])) == '0xf'
+exc = raises(TypeError, hex(np.array(1.5)))
+assert str(exc.value) == don't know how to convert scalar number to 
hex
+exc = raises(TypeError, hex(np.array('15')))
+assert str(exc.value) == don't know how to convert scalar number to 
hex
+exc = raises(TypeError, hex(np.array([1, 2])))
+assert str(exc.value) == only length-1 arrays can be converted to 
Python scalars
+
+def test__oct__(self):
+import numpy as np
+assert oct(np.array(True)) == '01'
+assert oct(np.array(15)) == '017'
+assert oct(np.array([15])) == '017'
+exc = raises(TypeError, oct(np.array(1.5)))
+assert str(exc.value) == don't know how to convert scalar number to 
oct
+exc = raises(TypeError, oct(np.array('15')))
+assert str(exc.value) == don't know how to convert scalar number to 
oct
+exc = raises(TypeError, oct(np.array([1, 2])))
+assert str(exc.value) == only length-1 arrays can be converted to 
Python scalars
+
 def test__reduce__(self):
 from numpypy import array, dtype
 from cPickle import loads, dumps
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy py3k-stdlib-2.7.6-merge: merge default

2014-03-12 Thread pjenvey
Author: Philip Jenvey pjen...@underboss.org
Branch: py3k-stdlib-2.7.6-merge
Changeset: r69911:0913e409b4e2
Date: 2014-03-12 15:20 -0700
http://bitbucket.org/pypy/pypy/changeset/0913e409b4e2/

Log:merge default

diff --git a/pypy/module/_codecs/test/test_codecs.py 
b/pypy/module/_codecs/test/test_codecs.py
--- a/pypy/module/_codecs/test/test_codecs.py
+++ b/pypy/module/_codecs/test/test_codecs.py
@@ -337,12 +337,12 @@
 raises(UnicodeDecodeError, decode, r\U0011)
 assert decode(r\U0011, ignore) == (u, 10)
 assert decode(r\U0011, replace) == (u\ufffd, 10)
-exc = raises(UnicodeDecodeError, unicode_escape_decode, \u1z32z3, 
'strict')
-assert str(exc.value) == 'unicodeescape' codec can't decode bytes in 
position 0-2: truncated \u escape
-exc = raises(UnicodeDecodeError, raw_unicode_escape_decode, 
\u1z32z3, 'strict')
-assert str(exc.value) == 'rawunicodeescape' codec can't decode bytes 
in position 0-2: truncated \u
-exc = raises(UnicodeDecodeError, raw_unicode_escape_decode, 
\U1z32z3, 'strict')
-assert str(exc.value) == 'rawunicodeescape' codec can't decode bytes 
in position 0-2: truncated \u
+exc = raises(UnicodeDecodeError, unicode_escape_decode, b\u1z32z3, 
'strict')
+assert str(exc.value) == r'unicodeescape' codec can't decode bytes in 
position 0-2: truncated \u escape
+exc = raises(UnicodeDecodeError, raw_unicode_escape_decode, 
b\u1z32z3, 'strict')
+assert str(exc.value) == r'rawunicodeescape' codec can't decode bytes 
in position 0-2: truncated \u
+exc = raises(UnicodeDecodeError, raw_unicode_escape_decode, 
b\U1z32z3, 'strict')
+assert str(exc.value) == r'rawunicodeescape' codec can't decode bytes 
in position 0-2: truncated \u
 
 def test_escape_encode(self):
 import _codecs
@@ -653,7 +653,7 @@
 l = [u%d % ord(exc.object[pos]) for pos in xrange(exc.start, 
exc.end)]
 return (u[%s] % u.join(l), exc.end)
 codecs.register_error(test.handler1, handler1)
-assert \\u3042\u3xxx.decode(unicode-escape, test.handler1) == \
+assert b\\u3042\u3xxx.decode(unicode-escape, test.handler1) == \
 u\u3042[9211751]xxx
 
 def test_encode_error_bad_handler(self):
@@ -706,22 +706,22 @@
 def test_utf7_errors(self):
 import codecs
 tests = [
-('a\xffb', u'a\ufffdb'),
-('a+IK', u'a\ufffd'),
-('a+IK-b', u'a\ufffdb'),
-('a+IK,b', u'a\ufffdb'),
-('a+IKx', u'a\u20ac\ufffd'),
-('a+IKx-b', u'a\u20ac\ufffdb'),
-('a+IKwgr', u'a\u20ac\ufffd'),
-('a+IKwgr-b', u'a\u20ac\ufffdb'),
-('a+IKwgr,', u'a\u20ac\ufffd'),
-('a+IKwgr,-b', u'a\u20ac\ufffd-b'),
-('a+IKwgrB', u'a\u20ac\u20ac\ufffd'),
-('a+IKwgrB-b', u'a\u20ac\u20ac\ufffdb'),
-('a+/,+IKw-b', u'a\ufffd\u20acb'),
-('a+//,+IKw-b', u'a\ufffd\u20acb'),
-('a+///,+IKw-b', u'a\u\ufffd\u20acb'),
-('a+,+IKw-b', u'a\u\ufffd\u20acb'),
+(b'a\xffb', u'a\ufffdb'),
+(b'a+IK', u'a\ufffd'),
+(b'a+IK-b', u'a\ufffdb'),
+(b'a+IK,b', u'a\ufffdb'),
+(b'a+IKx', u'a\u20ac\ufffd'),
+(b'a+IKx-b', u'a\u20ac\ufffdb'),
+(b'a+IKwgr', u'a\u20ac\ufffd'),
+(b'a+IKwgr-b', u'a\u20ac\ufffdb'),
+(b'a+IKwgr,', u'a\u20ac\ufffd'),
+(b'a+IKwgr,-b', u'a\u20ac\ufffd-b'),
+(b'a+IKwgrB', u'a\u20ac\u20ac\ufffd'),
+(b'a+IKwgrB-b', u'a\u20ac\u20ac\ufffdb'),
+(b'a+/,+IKw-b', u'a\ufffd\u20acb'),
+(b'a+//,+IKw-b', u'a\ufffd\u20acb'),
+(b'a+///,+IKw-b', u'a\u\ufffd\u20acb'),
+(b'a+,+IKw-b', u'a\u\ufffd\u20acb'),
 ]
 for raw, expected in tests:
 raises(UnicodeDecodeError, codecs.utf_7_decode, raw, 'strict', 
True)
diff --git a/pypy/module/cpyext/test/test_typeobject.py 
b/pypy/module/cpyext/test/test_typeobject.py
--- a/pypy/module/cpyext/test/test_typeobject.py
+++ b/pypy/module/cpyext/test/test_typeobject.py
@@ -584,5 +584,5 @@
 def test_tp_new_in_subclass_of_type(self):
 skip(BROKEN)
 module = self.import_module(name='foo3')
-print 'calling module.Type()...'
+print('calling module.Type()...')
 module.Type(X, (object,), {})
diff --git a/pypy/module/micronumpy/__init__.py 
b/pypy/module/micronumpy/__init__.py
--- a/pypy/module/micronumpy/__init__.py
+++ b/pypy/module/micronumpy/__init__.py
@@ -6,23 +6,26 @@
 interpleveldefs = {
 'ndarray': 'ndarray.W_NDimArray',
 'dtype': 'descriptor.W_Dtype',
+'flatiter': 'flatiter.W_FlatIterator',
 
+'_reconstruct' : 'ndarray._reconstruct',
+'scalar' : 'ctors.build_scalar',
 'array': 'ctors.array',
 

[pypy-commit] pypy py3k: merge default

2014-03-12 Thread pjenvey
Author: Philip Jenvey pjen...@underboss.org
Branch: py3k
Changeset: r69919:50d426596929
Date: 2014-03-12 18:24 -0700
http://bitbucket.org/pypy/pypy/changeset/50d426596929/

Log:merge default

diff --git a/lib_pypy/audioop.py b/lib_pypy/audioop.py
--- a/lib_pypy/audioop.py
+++ b/lib_pypy/audioop.py
@@ -349,7 +349,7 @@
 r_sample = getsample(cp, size, i + 1)
 
 sample = (l_sample * fac1) + (r_sample * fac2)
-sample = clip(sample)
+sample = int(clip(sample))
 
 _put_sample(result, size, i // 2, sample)
 
@@ -500,7 +500,7 @@
 
 # slice off extra bytes
 trim_index = (out_i * bytes_per_frame) - len(retval)
-retval = _buffer(retval)[:trim_index]
+retval = retval[:trim_index]
 
 return (retval, (d, tuple(samps)))
 
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy default: py3k compat

2014-03-12 Thread pjenvey
Author: Philip Jenvey pjen...@underboss.org
Branch: 
Changeset: r69918:2d98701f2735
Date: 2014-03-12 18:23 -0700
http://bitbucket.org/pypy/pypy/changeset/2d98701f2735/

Log:py3k compat

diff --git a/lib_pypy/audioop.py b/lib_pypy/audioop.py
--- a/lib_pypy/audioop.py
+++ b/lib_pypy/audioop.py
@@ -350,7 +350,7 @@
 r_sample = getsample(cp, size, i + 1)
 
 sample = (l_sample * fac1) + (r_sample * fac2)
-sample = clip(sample)
+sample = int(clip(sample))
 
 _put_sample(result, size, i // 2, sample)
 
@@ -501,7 +501,7 @@
 
 # slice off extra bytes
 trim_index = (out_i * bytes_per_frame) - len(retval)
-retval = _buffer(retval)[:trim_index]
+retval = retval[:trim_index]
 
 return (retval, (d, tuple(samps)))
 
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy py3k: port skips from default

2014-03-12 Thread pjenvey
Author: Philip Jenvey pjen...@underboss.org
Branch: py3k
Changeset: r69920:9e5eb8da8506
Date: 2014-03-12 18:25 -0700
http://bitbucket.org/pypy/pypy/changeset/9e5eb8da8506/

Log:port skips from default

diff --git a/lib-python/3/test/test_audioop.py 
b/lib-python/3/test/test_audioop.py
--- a/lib-python/3/test/test_audioop.py
+++ b/lib-python/3/test/test_audioop.py
@@ -1,6 +1,6 @@
 import audioop
 import unittest
-from test.support import run_unittest
+from test.support import run_unittest, impl_detail
 
 endian = 'big' if audioop.getsample(b'\0\1', 2, 0) == 1 else 'little'
 
@@ -93,21 +93,25 @@
 wtd = len(d2)//3
 self.assertEqual(len(audioop.lin2lin(d1, got, wtd)), len(d2))
 
+@impl_detail(pypy=False)
 def test_adpcm2lin(self):
 # Very cursory test
 self.assertEqual(audioop.adpcm2lin(b'\0\0', 1, None), (b'\0' * 4, 
(0,0)))
 self.assertEqual(audioop.adpcm2lin(b'\0\0', 2, None), (b'\0' * 8, 
(0,0)))
 self.assertEqual(audioop.adpcm2lin(b'\0\0', 4, None), (b'\0' * 16, 
(0,0)))
 
+@impl_detail(pypy=False)
 def test_lin2adpcm(self):
 # Very cursory test
 self.assertEqual(audioop.lin2adpcm(b'\0\0\0\0', 1, None), (b'\0\0', 
(0,0)))
 
+@impl_detail(pypy=False)
 def test_lin2alaw(self):
 self.assertEqual(audioop.lin2alaw(data[0], 1), b'\xd5\xc5\xf5')
 self.assertEqual(audioop.lin2alaw(data[1], 2), b'\xd5\xd5\xd5')
 self.assertEqual(audioop.lin2alaw(data[2], 4), b'\xd5\xd5\xd5')
 
+@impl_detail(pypy=False)
 def test_alaw2lin(self):
 # Cursory
 d = audioop.lin2alaw(data[0], 1)
@@ -123,11 +127,13 @@
 self.assertEqual(audioop.alaw2lin(d, 4),
  
b'\x00\x00\x08\x00\x00\x00\x08\x01\x00\x00\x10\x02')
 
+@impl_detail(pypy=False)
 def test_lin2ulaw(self):
 self.assertEqual(audioop.lin2ulaw(data[0], 1), b'\xff\xe7\xdb')
 self.assertEqual(audioop.lin2ulaw(data[1], 2), b'\xff\xff\xff')
 self.assertEqual(audioop.lin2ulaw(data[2], 4), b'\xff\xff\xff')
 
+@impl_detail(pypy=False)
 def test_ulaw2lin(self):
 # Cursory
 d = audioop.lin2ulaw(data[0], 1)
@@ -197,6 +203,7 @@
 self.assertRaises(audioop.error,
 audioop.findmax, ''.join(chr(x) for x in range(256)), -2392392)
 
+@impl_detail(pypy=False)
 def test_issue7673(self):
 state = None
 for data, size in INVALID_DATA:
@@ -221,6 +228,7 @@
 self.assertRaises(audioop.error, audioop.lin2alaw, data, size)
 self.assertRaises(audioop.error, audioop.lin2adpcm, data, size, 
state)
 
+@impl_detail(pypy=False)
 def test_wrongsize(self):
 data = b'abc'
 state = None
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy py3k: add int.__ceil/floor__, cleanup

2014-03-12 Thread pjenvey
Author: Philip Jenvey pjen...@underboss.org
Branch: py3k
Changeset: r69921:a0911b1c0cb1
Date: 2014-03-12 19:38 -0700
http://bitbucket.org/pypy/pypy/changeset/a0911b1c0cb1/

Log:add int.__ceil/floor__, cleanup

diff --git a/pypy/objspace/std/intobject.py b/pypy/objspace/std/intobject.py
--- a/pypy/objspace/std/intobject.py
+++ b/pypy/objspace/std/intobject.py
@@ -177,11 +177,25 @@
 _, w_r = space.fixedview(w_tuple, 2)
 return space.sub(self, w_r)
 
-def _int(self, space):
-return self.int(space)
+def _self_unaryop(opname, doc=None):
+@func_renamer('descr_' + opname)
+def descr_unaryop(self, space):
+return self.int(space)
+descr_unaryop.__doc__ = doc
+return descr_unaryop
 
-descr_get_numerator = func_with_new_name(_int, 'descr_get_numerator')
-descr_get_real = func_with_new_name(_int, 'descr_get_real')
+descr_conjugate = _self_unaryop(
+'conjugate', Returns self, the complex conjugate of any int.)
+descr_pos = _self_unaryop('pos', x.__pos__() == +x)
+descr_index = _self_unaryop('index',
+x[y:z] == x[y.__index__():z.__index__()])
+descr_trunc = _self_unaryop('trunc',
+Truncating an Integral returns itself.)
+descr_floor = _self_unaryop('floor', Flooring an Integral returns 
itself.)
+descr_ceil = _self_unaryop('ceil', Ceiling of an Integral returns 
itself.)
+
+descr_get_numerator = _self_unaryop('get_numerator')
+descr_get_real = _self_unaryop('get_real')
 
 def descr_get_denominator(self, space):
 return wrapint(space, 1)
@@ -217,8 +231,6 @@
 descr_repr = _abstract_unaryop('repr')
 descr_str = _abstract_unaryop('str')
 
-descr_conjugate = _abstract_unaryop(
-'conjugate', Returns self, the complex conjugate of any int.)
 descr_bit_length = _abstract_unaryop('bit_length', \
 int.bit_length() - int
 
@@ -229,14 +241,7 @@
 6)
 descr_hash = _abstract_unaryop('hash')
 descr_getnewargs = _abstract_unaryop('getnewargs', None)
-
-descr_index = _abstract_unaryop(
-'index', x[y:z] == x[y.__index__():z.__index__()])
-descr_trunc = _abstract_unaryop('trunc',
-Truncating an Integral returns itself.)
 descr_float = _abstract_unaryop('float')
-
-descr_pos = _abstract_unaryop('pos', x.__pos__() == +x)
 descr_neg = _abstract_unaryop('neg', x.__neg__() == -x)
 descr_abs = _abstract_unaryop('abs')
 descr_bool = _abstract_unaryop('bool', x.__bool__() == x != 0)
@@ -531,14 +536,6 @@
 x = intmask(intmask(x) * sign)
 return wrapint(space, -2 if x == -1 else x)
 
-def _int(self, space):
-return self.int(space)
-
-descr_pos = func_with_new_name(_int, 'descr_pos')
-descr_index = func_with_new_name(_int, 'descr_index')
-descr_trunc = func_with_new_name(_int, 'descr_trunc')
-descr_conjugate = func_with_new_name(_int, 'descr_conjugate')
-
 def as_w_long(self, space):
 # XXX: should try smalllong
 from pypy.objspace.std.longobject import W_LongObject
@@ -990,6 +987,8 @@
 __abs__ = interpindirect2app(W_AbstractIntObject.descr_abs),
 __bool__ = interpindirect2app(W_AbstractIntObject.descr_bool),
 __invert__ = interpindirect2app(W_AbstractIntObject.descr_invert),
+__floor__ = interpindirect2app(W_AbstractIntObject.descr_floor),
+__ceil__ = interpindirect2app(W_AbstractIntObject.descr_ceil),
 
 __lt__ = interpindirect2app(W_AbstractIntObject.descr_lt),
 __le__ = interpindirect2app(W_AbstractIntObject.descr_le),
diff --git a/pypy/objspace/std/longobject.py b/pypy/objspace/std/longobject.py
--- a/pypy/objspace/std/longobject.py
+++ b/pypy/objspace/std/longobject.py
@@ -43,9 +43,6 @@
 def descr_getnewargs(self, space):
 return space.newtuple([newlong(space, self.asbigint())])
 
-def descr_conjugate(self, space):
-return self.int(space)
-
 def descr_bit_length(self, space):
 bigint = space.bigint_w(self)
 try:
@@ -164,8 +161,6 @@
 def __repr__(self):
 return 'W_LongObject(%d)' % self.num.tolong()
 
-descr_index = descr_trunc = descr_pos = int
-
 def descr_float(self, space):
 return space.newfloat(self.tofloat(space))
 
diff --git a/pypy/objspace/std/smalllongobject.py 
b/pypy/objspace/std/smalllongobject.py
--- a/pypy/objspace/std/smalllongobject.py
+++ b/pypy/objspace/std/smalllongobject.py
@@ -79,8 +79,6 @@
 return W_LongObject(self.num)
 return W_Root.int(self, space)
 
-descr_index = descr_trunc = descr_pos = int
-
 def descr_float(self, space):
 return space.newfloat(float(self.longlong))
 
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
@@ -551,6 +551,12 @@
 assert ns['a'] 

[pypy-commit] pypy py3k: kill int.__div__

2014-03-12 Thread pjenvey
Author: Philip Jenvey pjen...@underboss.org
Branch: py3k
Changeset: r69923:0c391272a085
Date: 2014-03-12 19:47 -0700
http://bitbucket.org/pypy/pypy/changeset/0c391272a085/

Log:kill int.__div__

diff --git a/pypy/objspace/std/intobject.py b/pypy/objspace/std/intobject.py
--- a/pypy/objspace/std/intobject.py
+++ b/pypy/objspace/std/intobject.py
@@ -288,7 +288,6 @@
 descr_rshift, descr_rrshift = _abstract_binop('rshift')
 
 descr_floordiv, descr_rfloordiv = _abstract_binop('floordiv')
-descr_div, descr_rdiv = _abstract_binop('div')
 descr_truediv, descr_rtruediv = _abstract_binop('truediv')
 descr_mod, descr_rmod = _abstract_binop('mod')
 descr_divmod, descr_rdivmod = _abstract_binop('divmod')
@@ -301,7 +300,6 @@
 raise oefmt(space.w_ZeroDivisionError,
 integer division or modulo by zero)
 return wrapint(space, z)
-_div = func_with_new_name(_floordiv, '_div')
 
 
 def _truediv(space, x, y):
@@ -760,7 +758,6 @@
 descr_rshift, descr_rrshift = _make_descr_binop(_rshift, ovf=False)
 
 descr_floordiv, descr_rfloordiv = _make_descr_binop(_floordiv)
-descr_div, descr_rdiv = _make_descr_binop(_div)
 descr_truediv, descr_rtruediv = _make_descr_binop(_truediv)
 descr_mod, descr_rmod = _make_descr_binop(_mod)
 descr_divmod, descr_rdivmod = _make_descr_binop(
@@ -1018,8 +1015,6 @@
 
 __floordiv__ = interpindirect2app(W_AbstractIntObject.descr_floordiv),
 __rfloordiv__ = interpindirect2app(W_AbstractIntObject.descr_rfloordiv),
-__div__ = interpindirect2app(W_AbstractIntObject.descr_div),
-__rdiv__ = interpindirect2app(W_AbstractIntObject.descr_rdiv),
 __truediv__ = interpindirect2app(W_AbstractIntObject.descr_truediv),
 __rtruediv__ = interpindirect2app(W_AbstractIntObject.descr_rtruediv),
 __mod__ = interpindirect2app(W_AbstractIntObject.descr_mod),
diff --git a/pypy/objspace/std/longobject.py b/pypy/objspace/std/longobject.py
--- a/pypy/objspace/std/longobject.py
+++ b/pypy/objspace/std/longobject.py
@@ -304,9 +304,6 @@
 return newlong(space, z)
 descr_floordiv, descr_rfloordiv = _make_descr_binop(_floordiv)
 
-_div = func_with_new_name(_floordiv, '_div')
-descr_div, descr_rdiv = _make_descr_binop(_div)
-
 def _mod(self, space, w_other):
 try:
 z = self.num.mod(w_other.asbigint())
diff --git a/pypy/objspace/std/smalllongobject.py 
b/pypy/objspace/std/smalllongobject.py
--- a/pypy/objspace/std/smalllongobject.py
+++ b/pypy/objspace/std/smalllongobject.py
@@ -266,9 +266,6 @@
 return W_SmallLongObject(z)
 descr_floordiv, descr_rfloordiv = _make_descr_binop(_floordiv)
 
-_div = func_with_new_name(_floordiv, '_div')
-descr_div, descr_rdiv = _make_descr_binop(_div)
-
 def _mod(self, space, w_other):
 x = self.longlong
 y = w_other.longlong
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
@@ -111,22 +111,6 @@
 assert space.isinstance_w(v, space.w_int)
 assert space.bigint_w(v).eq(rbigint.fromlong(x * y))
 
-def test_div(self):
-space = self.space
-for i in range(10):
-res = i//3
-f1 = iobj.W_IntObject(i)
-f2 = iobj.W_IntObject(3)
-result = f1.descr_div(space, f2)
-assert result.intval == res
-x = -sys.maxint-1
-y = -1
-f1 = iobj.W_IntObject(x)
-f2 = iobj.W_IntObject(y)
-v = f1.descr_div(space, f2)
-assert space.isinstance_w(v, space.w_int)
-assert space.bigint_w(v).eq(rbigint.fromlong(x / y))
-
 def test_mod(self):
 x = 1
 y = 2
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit


[pypy-commit] pypy py3k: workaround lack of space.hex/oct on py3k

2014-03-12 Thread pjenvey
Author: Philip Jenvey pjen...@underboss.org
Branch: py3k
Changeset: r69922:1366c85a0748
Date: 2014-03-12 19:38 -0700
http://bitbucket.org/pypy/pypy/changeset/1366c85a0748/

Log:workaround lack of space.hex/oct on py3k

diff --git a/pypy/module/micronumpy/ndarray.py 
b/pypy/module/micronumpy/ndarray.py
--- a/pypy/module/micronumpy/ndarray.py
+++ b/pypy/module/micronumpy/ndarray.py
@@ -1043,7 +1043,7 @@
 raise oefmt(space.w_TypeError,
 don't know how to convert scalar number to hex)
 value = self.get_scalar_value()
-return space.hex(value)
+return space.call_method(space.builtin, 'hex', value)
 
 def descr_oct(self, space):
 if self.get_size() != 1:
@@ -1053,7 +1053,7 @@
 raise oefmt(space.w_TypeError,
 don't know how to convert scalar number to oct)
 value = self.get_scalar_value()
-return space.oct(value)
+return space.call_method(space.builtin, 'oct', value)
 
 def descr_index(self, space):
 if self.get_size() != 1 or \
___
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit