[pypy-commit] pypy stmgc-c7: Remove this bogus setting; always use 10000 as the default for
Author: Armin Rigo Branch: stmgc-c7 Changeset: r70142:b5920bc6dd6c Date: 2014-03-21 09:39 +0100 http://bitbucket.org/pypy/pypy/changeset/b5920bc6dd6c/ Log:Remove this bogus setting; always use 1 as the default for sys.setcheckinterval(). Use floating-point fractions internally. 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 @@ -63,10 +63,6 @@ """NOT_RPYTHON: set up a mechanism to send to the C code the value set by space.actionflag.setcheckinterval().""" # -# Set the default checkinterval to 20, found by exploration to -# be a good default value. XXX do some more in-depth tests -space.actionflag.setcheckinterval(20) -# def setcheckinterval_callback(): self.configure_transaction_length(space) # @@ -110,7 +106,7 @@ def configure_transaction_length(self, space): if self.threads_running: interval = space.actionflag.getcheckinterval() -rstm.set_transaction_length(interval) +rstm.set_transaction_length(interval / 1.0) # diff --git a/rpython/rlib/rstm.py b/rpython/rlib/rstm.py --- a/rpython/rlib/rstm.py +++ b/rpython/rlib/rstm.py @@ -61,8 +61,8 @@ llop.stm_should_break_transaction(lltype.Bool)) @dont_look_inside -def set_transaction_length(length): -llop.stm_set_transaction_length(lltype.Void, length) +def set_transaction_length(fraction): +llop.stm_set_transaction_length(lltype.Void, float(fraction)) @dont_look_inside def increment_atomic(): diff --git a/rpython/translator/stm/src_stm/stmgcintf.c b/rpython/translator/stm/src_stm/stmgcintf.c --- a/rpython/translator/stm/src_stm/stmgcintf.c +++ b/rpython/translator/stm/src_stm/stmgcintf.c @@ -35,11 +35,11 @@ static long pypy_transaction_length; -void pypy_stm_set_transaction_length(long percentage) +void pypy_stm_set_transaction_length(double fraction) { /* the value '100' means 'use the default'. Other values are interpreted proportionally, up to some maximum. */ -long low_fill_mark = LOW_FILL_MARK * percentage / 100; +long low_fill_mark = (long)(LOW_FILL_MARK * fraction); if (low_fill_mark > NURSERY_SIZE / 2) low_fill_mark = NURSERY_SIZE / 2; pypy_transaction_length = low_fill_mark; @@ -50,7 +50,7 @@ stm_setup(); pypy_stm_register_thread_local(); pypy_stm_ready_atomic = 1; -pypy_stm_set_transaction_length(100); +pypy_stm_set_transaction_length(1.0); pypy_stm_start_inevitable_if_not_atomic(); } diff --git a/rpython/translator/stm/src_stm/stmgcintf.h b/rpython/translator/stm/src_stm/stmgcintf.h --- a/rpython/translator/stm/src_stm/stmgcintf.h +++ b/rpython/translator/stm/src_stm/stmgcintf.h @@ -46,7 +46,7 @@ } long pypy_stm_enter_callback_call(void); void pypy_stm_leave_callback_call(long); -void pypy_stm_set_transaction_length(long); +void pypy_stm_set_transaction_length(double); void pypy_stm_perform_transaction(object_t *, int(object_t *, int)); static inline int pypy_stm_should_break_transaction(void) 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 @@ -98,7 +98,7 @@ def test_set_transaction_length(self): def entry_point(argv): -rstm.set_transaction_length(123) +rstm.set_transaction_length(0.123) return 0 t, cbuilder = self.compile(entry_point) cbuilder.cmdexec('') ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] pypy default: merge
Author: Maciej Fijalkowski Branch: Changeset: r70144:a4dca0f2cdfe Date: 2014-03-21 12:19 +0200 http://bitbucket.org/pypy/pypy/changeset/a4dca0f2cdfe/ Log:merge diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py --- a/pypy/interpreter/baseobjspace.py +++ b/pypy/interpreter/baseobjspace.py @@ -440,11 +440,10 @@ return name -def getbuiltinmodule(self, name, force_init=False, reuse=True): +def getbuiltinmodule(self, name, force_init=False): w_name = self.wrap(name) w_modules = self.sys.get('modules') if not force_init: -assert reuse is True try: return self.getitem(w_modules, w_name) except OperationError, e: @@ -463,15 +462,7 @@ # Initialize the module from pypy.interpreter.module import Module if isinstance(w_mod, Module): -if not reuse and w_mod.startup_called: -# Create a copy of the module -w_mod.getdict(self) # unlazy w_initialdict -w_new = self.wrap(Module(self, w_name)) -self.call_method(w_new.getdict(self), 'update', - w_mod.w_initialdict) -w_mod = w_new -else: -w_mod.init(self) +w_mod.init(self) # Add the module to sys.modules self.setitem(w_modules, w_name, w_mod) diff --git a/pypy/module/_io/__init__.py b/pypy/module/_io/__init__.py --- a/pypy/module/_io/__init__.py +++ b/pypy/module/_io/__init__.py @@ -8,6 +8,8 @@ interpleveldefs = { 'DEFAULT_BUFFER_SIZE': 'space.wrap(interp_iobase.DEFAULT_BUFFER_SIZE)', 'BlockingIOError': 'interp_io.W_BlockingIOError', +'UnsupportedOperation': +'space.fromcache(interp_io.Cache).w_unsupportedoperation', '_IOBase': 'interp_iobase.W_IOBase', '_RawIOBase': 'interp_iobase.W_RawIOBase', '_BufferedIOBase': 'interp_bufferedio.W_BufferedIOBase', @@ -26,16 +28,6 @@ 'IncrementalNewlineDecoder': 'interp_textio.W_IncrementalNewlineDecoder', } -def init(self, space): -MixedModule.init(self, space) -w_UnsupportedOperation = space.call_function( -space.w_type, -space.wrap('UnsupportedOperation'), -space.newtuple([space.w_ValueError, space.w_IOError]), -space.newdict()) -space.setattr(self, space.wrap('UnsupportedOperation'), - w_UnsupportedOperation) - def shutdown(self, space): # at shutdown, flush all open streams. Ignore I/O errors. from pypy.module._io.interp_iobase import get_autoflusher diff --git a/pypy/module/_io/interp_io.py b/pypy/module/_io/interp_io.py --- a/pypy/module/_io/interp_io.py +++ b/pypy/module/_io/interp_io.py @@ -10,6 +10,12 @@ from rpython.rtyper.module.ll_os_stat import STAT_FIELD_TYPES +class Cache: +def __init__(self, space): +self.w_unsupportedoperation = space.new_exception_class( +"io.UnsupportedOperation", +space.newtuple([space.w_ValueError, space.w_IOError])) + class W_BlockingIOError(W_IOError): def __init__(self, space): W_IOError.__init__(self, space) diff --git a/pypy/module/imp/importing.py b/pypy/module/imp/importing.py --- a/pypy/module/imp/importing.py +++ b/pypy/module/imp/importing.py @@ -579,8 +579,7 @@ return space.call_method(find_info.w_loader, "load_module", w_modulename) if find_info.modtype == C_BUILTIN: -return space.getbuiltinmodule(find_info.filename, force_init=True, - reuse=reuse) +return space.getbuiltinmodule(find_info.filename, force_init=True) if find_info.modtype in (PY_SOURCE, PY_COMPILED, C_EXTENSION, PKG_DIRECTORY): w_mod = None diff --git a/pypy/module/imp/test/test_app.py b/pypy/module/imp/test/test_app.py --- a/pypy/module/imp/test/test_app.py +++ b/pypy/module/imp/test/test_app.py @@ -203,6 +203,7 @@ def test_builtin_reimport(self): # from https://bugs.pypy.org/issue1514 +skip("fix me") import sys, marshal old = marshal.loads @@ -222,6 +223,7 @@ # taken from https://bugs.pypy.org/issue1514, with extra cases # that show a difference with CPython: we can get on CPython # several module objects for the same built-in module :-( +skip("several built-in module objects: not supported by pypy") import sys, marshal old = marshal.loads diff --git a/pypy/module/imp/test/test_import.py b/pypy/module/imp/test/test_import.py --- a/pypy/module/imp/test/test_import.py +++ b/pypy/module/imp/test/test_import.py @@ -578,6 +578,7 @@ assert hasattr(time, 'clock') def test_reimport_builtin_simple_case_2(self): +skip("fix me") import sys, time ti
[pypy-commit] pypy default: add more debugging info for InvalidLoops
Author: Maciej Fijalkowski Branch: Changeset: r70143:ca27e8ab9f84 Date: 2014-03-21 12:18 +0200 http://bitbucket.org/pypy/pypy/changeset/ca27e8ab9f84/ Log:add more debugging info for InvalidLoops diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py --- a/rpython/jit/metainterp/optimizeopt/rewrite.py +++ b/rpython/jit/metainterp/optimizeopt/rewrite.py @@ -242,8 +242,9 @@ box = value.box assert isinstance(box, Const) if not box.same_constant(constbox): -raise InvalidLoop('A GUARD_{VALUE,TRUE,FALSE} was proven to' + - 'always fail') +r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op) +raise InvalidLoop('A GUARD_{VALUE,TRUE,FALSE} (%s) was proven ' + 'to always fail' % r) return if emit_operation: self.emit_operation(op) @@ -255,7 +256,9 @@ if value.is_null(): return elif value.is_nonnull(): -raise InvalidLoop('A GUARD_ISNULL was proven to always fail') +r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op) +raise InvalidLoop('A GUARD_ISNULL (%s) was proven to always fail' + % r) self.emit_operation(op) value.make_constant(self.optimizer.cpu.ts.CONST_NULL) @@ -264,7 +267,9 @@ if value.is_nonnull(): return elif value.is_null(): -raise InvalidLoop('A GUARD_NONNULL was proven to always fail') +r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op) +raise InvalidLoop('A GUARD_NONNULL (%s) was proven to always fail' + % r) self.emit_operation(op) value.make_nonnull(op) @@ -292,7 +297,8 @@ assert previous_classbox is not None assert expected_classbox is not None if not previous_classbox.same_constant(expected_classbox): -raise InvalidLoop('A GUARD_VALUE was proven to always fail') +r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op) +raise InvalidLoop('A GUARD_VALUE (%s) was proven to always fail' % r) op = old_guard_op.copy_and_change(rop.GUARD_VALUE, args = [old_guard_op.getarg(0), op.getarg(1)]) self.optimizer.replaces_guard[op] = old_guard_op @@ -333,7 +339,9 @@ if realclassbox is not None: if realclassbox.same_constant(expectedclassbox): return -raise InvalidLoop('A GUARD_CLASS was proven to always fail') +r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op) +raise InvalidLoop('A GUARD_CLASS (%s) was proven to always fail' + % r) if value.last_guard: # there already has been a guard_nonnull or guard_class or # guard_nonnull_class on this value. @@ -356,8 +364,9 @@ def optimize_GUARD_NONNULL_CLASS(self, op): value = self.getvalue(op.getarg(0)) if value.is_null(): -raise InvalidLoop('A GUARD_NONNULL_CLASS was proven to always ' + - 'fail') +r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op) +raise InvalidLoop('A GUARD_NONNULL_CLASS (%s) was proven to ' + 'always fail' % r) self.optimize_GUARD_CLASS(op) def optimize_CALL_LOOPINVARIANT(self, op): ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Fixed the configurable rerased thing.
Author: Anton Gulenko Branch: strategies-tagging Changeset: r677:9aca5f6a189d Date: 2014-03-20 15:33 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/9aca5f6a189d/ Log:Fixed the configurable rerased thing. diff --git a/spyvm/model.py b/spyvm/model.py --- a/spyvm/model.py +++ b/spyvm/model.py @@ -654,8 +654,6 @@ class W_PointersObject(W_AbstractPointersObject): _attrs_ = ['_size', 'list_storage', 'int_storage', 'strategy'] -list_storage = None -int_storage = None @jit.unroll_safe def __init__(self, space, w_class, size): @@ -738,8 +736,26 @@ return False self.strategy, w_other.strategy = w_other.strategy, self.strategy self._size, w_other._size = w_other._size, self._size -self.list_storage, w_other.list_storage = w_other.list_storage, self.list_storage -self.int_storage, w_other.int_storage = w_other.int_storage, self.int_storage + +# Unfortunately, the following is necessary to work both with RPYTHON and in interpreted mode. +# Rpython cannot handle list_storage = None in combination with a rerased pair. + +if hasattr(self, 'list_storage'): +if hasattr(w_other, 'list_storage'): +self.list_storage, w_other.list_storage = w_other.list_storage, self.list_storage +else: +w_other.list_storage = self.list_storage +elif hasattr(w_other, 'list_storage'): +self.list_storage = w_other.list_storage + +if hasattr(self, 'int_storage'): +if hasattr(w_other, 'int_storage'): +self.int_storage, w_other.int_storage = w_other.int_storage, self.int_storage +else: +w_other.int_storage = self.int_storage +elif hasattr(w_other, 'int_storage'): +self.int_storage = w_other.int_storage + return W_AbstractPointersObject.become(self, w_other) @jit.unroll_safe diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -30,13 +30,13 @@ strategy_tag = 'abstract-list' def storage(self, w_obj): -return w_obj.list_storage +return self.unerase(w_obj.list_storage) def set_initial_storage(self, space, w_obj, size): -w_obj.list_storage = self.initial_storage(space, size) +w_obj.list_storage = self.erase(self.initial_storage(space, size)) def set_storage_for_list(self, space, w_obj, collection): -w_obj.list_storage = self.storage_for_list(space, collection) +w_obj.list_storage = self.erase(self.storage_for_list(space, collection)) def set_storage_copied_from(self, space, w_obj, w_source_obj, reuse_storage=False): -w_obj.list_storage = self.copy_storage_from(space, w_source_obj, reuse_storage) +w_obj.list_storage = self.erase(self.copy_storage_from(space, w_source_obj, reuse_storage)) def initial_storage(self, space, size): raise NotImplementedError("Abstract base class") ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Generalized TaggingStrategy to ValueOrNilStrategy, added strategy for floats.
Author: Anton Gulenko Branch: strategies-tagging Changeset: r680:74e7f1232b64 Date: 2014-03-20 17:37 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/74e7f1232b64/ Log:Generalized TaggingStrategy to ValueOrNilStrategy, added strategy for floats. Small renamings and refactorings. diff --git a/spyvm/model.py b/spyvm/model.py --- a/spyvm/model.py +++ b/spyvm/model.py @@ -644,10 +644,10 @@ @jit.unroll_safe def __init__(self, space, w_class, size): -from spyvm.strategies import strategy_of_size +from spyvm.strategies import empty_strategy """Create new object with size = fixed + variable size.""" W_AbstractPointersObject.__init__(self, space, w_class, size) -self.strategy = strategy_of_size(self.s_class, size) +self.strategy = empty_strategy(self.s_class) self.initialize_storage(space, size) self.log_strategy_operation("Initialized") diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -1,7 +1,8 @@ import sys -from spyvm import model, shadow +from spyvm import model, shadow, constants from rpython.rlib.objectmodel import import_from_mixin +from rpython.rlib.rfloat import string_to_float # Disables all optimized strategies, for debugging. only_list_storage = False @@ -20,9 +21,17 @@ def set_storage_copied_from(self, space, w_obj, w_source_obj, reuse_storage=False): raise NotImplementedError("Abstract base class") +def store(self, space, w_obj, n0, w_val): +if self.can_contain(space, w_val): +self.do_store(space, w_obj, n0, w_val) +new_strategy = find_strategy_for_object(w_val) +return w_obj.store_with_new_strategy(space, new_strategy, n0, w_val) + +def can_contain(self, space, w_val): +raise NotImplementedError("Abstract base class") def fetch(self, space, w_obj, n0): raise NotImplementedError("Abstract base class") -def store(self, space, w_obj, n0, w_val): +def do_store(self, space, w_obj, n0, w_val): raise NotImplementedError("Abstract base class") class AbstractListStorageStrategy(AbstractStorageStrategy): @@ -85,17 +94,12 @@ __metaclass__ = SingletonMeta strategy_tag = 'allnil' +def can_contain(self, space, w_obj): +return w_obj == model.w_nil def fetch(self, space, w_obj, n0): return model.w_nil - -def store(self, space, w_obj, n0, w_val): -# This is an important moment, where we decide where to go on the first non-nil store. -if w_val == model.w_nil: -return -if not only_list_storage: -if TaggingSmallIntegerStorageStrategy.can_contain(w_val): -return w_obj.store_with_new_strategy(space, TaggingSmallIntegerStorageStrategy.singleton, n0, w_val) -return w_obj.store_with_new_strategy(space, ListStorageStrategy.singleton, n0, w_val) +def do_store(self, space, w_obj, n0, w_val): +pass def set_initial_storage(self, space, w_obj, size): pass @@ -111,9 +115,11 @@ __metaclass__ = SingletonMeta strategy_tag = 'list' +def can_contain(self, space, w_val): +return True def fetch(self, space, w_obj, n0): return self.storage(w_obj)[n0] -def store(self, space, w_obj, n0, w_val): +def do_store(self, space, w_obj, n0, w_val): # TODO enable generalization by maintaining a counter of elements that are nil. self.storage(w_obj)[n0] = w_val def initial_storage(self, space, size): @@ -124,56 +130,90 @@ length = w_obj.basic_size() return [w_obj.strategy.fetch(space, w_obj, i) for i in range(length)] -class TaggingSmallIntegerStorageStrategy(AbstractIntStorageStrategy): -__metaclass__ = SingletonMeta -strategy_tag = 'tagging-smallint' +class AbstractValueOrNilStorageStrategy(AbstractIntStorageStrategy): needs_objspace = True +strategy_tag = 'abstract-valueOrNil' -@staticmethod -def wrap(val): -return val << 1 -@staticmethod -def unwrap(val): -return val >> 1 -@staticmethod -def can_contain(w_val): -return isinstance(w_val, model.W_SmallInteger) -# TODO - use just a single value to represent nil (max_int-1) -# Then, turn wrap/unwrap into noops -# also store W_LargePositiveInteger1Word? -nil_value = 1 +def can_contain(self, space, w_val): +return w_val == model.w_nil or (isinstance(w_val, self.wrapper_class) and self.unwrap(space, w_val) != self.nil_value) def fetch(self, space, w_obj, n0): val = self.storage(w_obj)[n0] if val == self.nil_value: return space.w_nil else: -return space.wrap_int(self.unwrap(val)) +return self.wrap(space, val) -def store(self, space, w_obj, n0, w_val): +def do_store(self, space, w_
[pypy-commit] lang-smalltalk strategies-tagging: Using a list of floats to store either float or int values.
Author: Anton Gulenko Branch: strategies-tagging Changeset: r682:efb3ddfef529 Date: 2014-03-20 19:14 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/efb3ddfef529/ Log:Using a list of floats to store either float or int values. diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -1,6 +1,8 @@ -import sys +import sys, math from spyvm import model, shadow, constants +from rpython.rlib import longlong2float, rarithmetic +from rpython.rtyper.lltypesystem import rffi, lltype from rpython.rlib.objectmodel import import_from_mixin from rpython.rlib.rfloat import string_to_float @@ -133,13 +135,21 @@ class AbstractValueOrNilStorageStrategy(AbstractIntStorageStrategy): needs_objspace = True strategy_tag = 'abstract-valueOrNil' +# TODO -- use another value... something like max_float? +nil_value = string_to_float("nan") + +def is_nil_value(self, val): +# return val == self.nil_value +return math.isnan(val) def can_contain(self, space, w_val): -return w_val == model.w_nil or (isinstance(w_val, self.wrapper_class) and self.unwrap(space, w_val) != self.nil_value) +return w_val == model.w_nil or \ +(isinstance(w_val, self.wrapper_class) \ +and not self.is_nil_value(self.unwrap(space, w_val))) def fetch(self, space, w_obj, n0): val = self.storage(w_obj)[n0] -if val == self.nil_value: +if self.is_nil_value(val): return space.w_nil else: return self.wrap(space, val) @@ -147,7 +157,7 @@ def do_store(self, space, w_obj, n0, w_val): store = self.storage(w_obj) if w_val == model.w_nil: -store[n0] = self.nil_value +store[n0] = self.nil_value else: store[n0] = self.unwrap(space, w_val) @@ -162,21 +172,32 @@ store[i] = self.unwrap(space, collection[i]) return store +def _int_to_float(int_val): +return longlong2float.longlong2float(rffi.cast(lltype.SignedLongLong, int_val)) + class SmallIntegerOrNilStorageStrategy(AbstractValueOrNilStorageStrategy): __metaclass__ = SingletonMeta -strategy_tag = 'float-orNil' -nil_value = constants.MAXINT +strategy_tag = 'smallint-orNil' wrapper_class = model.W_SmallInteger -def wrap(self, space, val): return space.wrap_int(val) -def unwrap(self, space, w_val): return space.unwrap_int(w_val) + +def wrap(self, space, val): +int_val = rarithmetic.intmask(longlong2float.float2longlong(val)) +return space.wrap_int(int_val) +def unwrap(self, space, w_val): +assert isinstance(w_val, model.W_SmallInteger) +int_val = space.unwrap_int(w_val) +return _int_to_float(int_val) class FloatOrNilStorageStrategy(AbstractValueOrNilStorageStrategy): __metaclass__ = SingletonMeta -strategy_tag = 'smallint-orNil' -nil_value = string_to_float("-nan") +strategy_tag = 'float-orNil' wrapper_class = model.W_Float -def wrap(self, space, val): return space.wrap_float(val) -def unwrap(self, space, w_val): return space.unwrap_float(w_val) + +def wrap(self, space, val): +return space.wrap_float(val) +def unwrap(self, space, w_val): +assert isinstance(w_val, model.W_Float) +return space.unwrap_float(w_val) def find_strategy_for_object(space, var): return find_strategy_for_objects(space, [var]) @@ -211,7 +232,7 @@ return FloatOrNilStorageStrategy.singleton # If this happens, please look for a bug in the code above. -assert False, "No strategy could be found for list %r" % vars +assert False, "No strategy could be found for list..." def empty_strategy(s_containing_class): if s_containing_class is None: ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Added comment
Author: Anton Gulenko Branch: strategies-tagging Changeset: r676:30ce07241962 Date: 2014-03-20 14:59 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/30ce07241962/ Log:Added comment diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -82,11 +82,12 @@ use_rerased = False def setup_rerased_pair(): -locals = sys._getframe(1).f_locals +# Small piece of metaprogramming stolen from rpython.rlib.objectmodel.import_from_mixin +cls = sys._getframe(1).f_locals if use_rerased: -locals["erase"], locals["unerase"] = rerased.new_static_erasing_pair("strategy-%s" % locals["strategy_tag"]) +cls["erase"], cls["unerase"] = rerased.new_static_erasing_pair("strategy-%s" % cls["strategy_tag"]) else: -locals["erase"], locals["unerase"] = lambda self, x: x, lambda self, x: x +cls["erase"], cls["unerase"] = lambda self, x: x, lambda self, x: x # this is the typical "initial" storage strategy, for when every slot # in an object is still nil. No storage is allocated. ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Added configurable flag to enable/disable usage of a rerased pair. Will compare performance.
Author: Anton Gulenko Branch: strategies-tagging Changeset: r675:d878eb7b148c Date: 2014-03-20 14:55 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/d878eb7b148c/ Log:Added configurable flag to enable/disable usage of a rerased pair. Will compare performance. diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -1,5 +1,6 @@ + +import sys from spyvm import model, shadow - from rpython.rlib import rerased from rpython.rlib.objectmodel import import_from_mixin @@ -53,13 +54,13 @@ strategy_tag = 'abstract-int' def storage(self, w_obj): -return w_obj.int_storage +return self.unerase(w_obj.int_storage) def set_initial_storage(self, space, w_obj, size): -w_obj.int_storage = self.initial_storage(space, size) +w_obj.int_storage = self.erase(self.initial_storage(space, size)) def set_storage_for_list(self, space, w_obj, collection): -w_obj.int_storage = self.storage_for_list(space, collection) +w_obj.int_storage = self.erase(self.storage_for_list(space, collection)) def set_storage_copied_from(self, space, w_obj, w_source_obj, reuse_storage=False): -w_obj.int_storage = self.copy_storage_from(space, w_source_obj, reuse_storage) +w_obj.int_storage = self.erase(self.copy_storage_from(space, w_source_obj, reuse_storage)) def initial_storage(self, space, size): raise NotImplementedError("Abstract base class") @@ -79,18 +80,20 @@ result.singleton = result() return result -class BasicStorageStrategyMixin(object): -def erase(self, a): return a -def unerase(self, a): return a -# erase, unerase = rerased.new_static_erasing_pair(self.strategy_tag) +use_rerased = False +def setup_rerased_pair(): +locals = sys._getframe(1).f_locals +if use_rerased: +locals["erase"], locals["unerase"] = rerased.new_static_erasing_pair("strategy-%s" % locals["strategy_tag"]) +else: +locals["erase"], locals["unerase"] = lambda self, x: x, lambda self, x: x # this is the typical "initial" storage strategy, for when every slot # in an object is still nil. No storage is allocated. class AllNilStorageStrategy(AbstractStorageStrategy): __metaclass__ = SingletonMeta -# erase, unerase = rerased.new_static_erasing_pair("allnil-strategy") -import_from_mixin(BasicStorageStrategyMixin) strategy_tag = 'allnil' +setup_rerased_pair() def fetch(self, space, w_obj, n0): return model.w_nil @@ -116,9 +119,8 @@ # fixed-sized and var-sized objects. class ListStorageStrategy(AbstractListStorageStrategy): __metaclass__ = SingletonMeta -# erase, unerase = rerased.new_static_erasing_pair("list-strategy") -import_from_mixin(BasicStorageStrategyMixin) strategy_tag = 'list' +setup_rerased_pair() def fetch(self, space, w_obj, n0): return self.storage(w_obj)[n0] @@ -135,9 +137,8 @@ class TaggingSmallIntegerStorageStrategy(AbstractIntStorageStrategy): __metaclass__ = SingletonMeta -# erase, unerase = rerased.new_static_erasing_pair("tagging-smallint-strategry") -import_from_mixin(BasicStorageStrategyMixin) strategy_tag = 'tagging-smallint' +setup_rerased_pair() needs_objspace = True @staticmethod ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Fix did not work, had to use we_are_translated().
Author: Anton Gulenko Branch: strategies-tagging Changeset: r678:4aa0466bbb5a Date: 2014-03-20 16:14 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/4aa0466bbb5a/ Log:Fix did not work, had to use we_are_translated(). Also removed obsolete pieces of fieldtype functionality. diff --git a/spyvm/model.py b/spyvm/model.py --- a/spyvm/model.py +++ b/spyvm/model.py @@ -22,7 +22,7 @@ from rpython.rlib.rarithmetic import intmask, r_uint, r_int from rpython.rlib.debug import make_sure_not_resized from rpython.tool.pairtype import extendabletype -from rpython.rlib.objectmodel import instantiate, compute_hash, import_from_mixin +from rpython.rlib.objectmodel import instantiate, compute_hash, import_from_mixin, we_are_translated from rpython.rtyper.lltypesystem import lltype, rffi from rsdl import RSDL, RSDL_helper @@ -143,10 +143,6 @@ def unwrap_uint(self, space): raise error.UnwrappingError("Got unexpected class in unwrap_uint") -def fieldtype(self): -from spyvm.strategies import obj -return obj - def is_array_object(self): return False @@ -221,10 +217,6 @@ def clone(self, space): return self -def fieldtype(self): -from spyvm.strategies import SInt -return SInt - class W_AbstractObjectWithIdentityHash(W_Object): """Object with explicit hash (ie all except small ints and floats).""" @@ -327,10 +319,6 @@ def invariant(self): return isinstance(self.value, int) -def fieldtype(self): -from spyvm.strategies import LPI -return LPI - def is_array_object(self): return True @@ -422,10 +410,6 @@ def size(self): return 2 -def fieldtype(self): -from spyvm.strategies import flt -return flt - @signature.finishsigs class W_AbstractObjectWithClassReference(W_AbstractObjectWithIdentityHash): """Objects with arbitrary class (ie not CompiledMethod, SmallInteger or @@ -654,6 +638,9 @@ class W_PointersObject(W_AbstractPointersObject): _attrs_ = ['_size', 'list_storage', 'int_storage', 'strategy'] +if not we_are_translated(): +list_storage = None +int_storage = None @jit.unroll_safe def __init__(self, space, w_class, size): @@ -736,26 +723,8 @@ return False self.strategy, w_other.strategy = w_other.strategy, self.strategy self._size, w_other._size = w_other._size, self._size - -# Unfortunately, the following is necessary to work both with RPYTHON and in interpreted mode. -# Rpython cannot handle list_storage = None in combination with a rerased pair. - -if hasattr(self, 'list_storage'): -if hasattr(w_other, 'list_storage'): -self.list_storage, w_other.list_storage = w_other.list_storage, self.list_storage -else: -w_other.list_storage = self.list_storage -elif hasattr(w_other, 'list_storage'): -self.list_storage = w_other.list_storage - -if hasattr(self, 'int_storage'): -if hasattr(w_other, 'int_storage'): -self.int_storage, w_other.int_storage = w_other.int_storage, self.int_storage -else: -w_other.int_storage = self.int_storage -elif hasattr(w_other, 'int_storage'): -self.int_storage = w_other.int_storage - +self.list_storage, w_other.list_storage = w_other.list_storage, self.list_storage +self.int_storage, w_other.int_storage = w_other.int_storage, self.int_storage return W_AbstractPointersObject.become(self, w_other) @jit.unroll_safe @@ -766,13 +735,9 @@ self.log_strategy_operation("Cloned") return w_result -def fieldtype(self): -from spyvm.strategies import obj -return obj - class W_WeakPointersObject(W_AbstractPointersObject): _attrs_ = ['_weakvars'] - + @jit.unroll_safe def __init__(self, space, w_class, size): W_AbstractPointersObject.__init__(self, space, w_class, size) diff --git a/spyvm/test/test_strategies.py b/spyvm/test/test_strategies.py --- a/spyvm/test/test_strategies.py +++ b/spyvm/test/test_strategies.py @@ -4,8 +4,6 @@ from spyvm.test import test_miniimage as tools from spyvm.error import WrapperException, FatalError -# Fieldtypes have a separate test file - space, interp = tools.setup_module(tools, filename='bootstrapped.image') class_Array = space.classtable["w_Array"] ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Removed rerased functionality completely, since it is only hindering the trace optimizer.
Author: Anton Gulenko Branch: strategies-tagging Changeset: r679:106d0c112fc1 Date: 2014-03-20 16:23 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/106d0c112fc1/ Log:Removed rerased functionality completely, since it is only hindering the trace optimizer. diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -1,7 +1,6 @@ import sys from spyvm import model, shadow -from rpython.rlib import rerased from rpython.rlib.objectmodel import import_from_mixin # Disables all optimized strategies, for debugging. @@ -30,13 +29,13 @@ strategy_tag = 'abstract-list' def storage(self, w_obj): -return self.unerase(w_obj.list_storage) +return w_obj.list_storage def set_initial_storage(self, space, w_obj, size): -w_obj.list_storage = self.erase(self.initial_storage(space, size)) +w_obj.list_storage = self.initial_storage(space, size) def set_storage_for_list(self, space, w_obj, collection): -w_obj.list_storage = self.erase(self.storage_for_list(space, collection)) +w_obj.list_storage = self.storage_for_list(space, collection) def set_storage_copied_from(self, space, w_obj, w_source_obj, reuse_storage=False): -w_obj.list_storage = self.erase(self.copy_storage_from(space, w_source_obj, reuse_storage)) +w_obj.list_storage = self.copy_storage_from(space, w_source_obj, reuse_storage) def initial_storage(self, space, size): raise NotImplementedError("Abstract base class") @@ -54,13 +53,13 @@ strategy_tag = 'abstract-int' def storage(self, w_obj): -return self.unerase(w_obj.int_storage) +return w_obj.int_storage def set_initial_storage(self, space, w_obj, size): -w_obj.int_storage = self.erase(self.initial_storage(space, size)) +w_obj.int_storage = self.initial_storage(space, size) def set_storage_for_list(self, space, w_obj, collection): -w_obj.int_storage = self.erase(self.storage_for_list(space, collection)) +w_obj.int_storage = self.storage_for_list(space, collection) def set_storage_copied_from(self, space, w_obj, w_source_obj, reuse_storage=False): -w_obj.int_storage = self.erase(self.copy_storage_from(space, w_source_obj, reuse_storage)) +w_obj.int_storage = self.copy_storage_from(space, w_source_obj, reuse_storage) def initial_storage(self, space, size): raise NotImplementedError("Abstract base class") @@ -80,21 +79,11 @@ result.singleton = result() return result -use_rerased = False -def setup_rerased_pair(): -# Small piece of metaprogramming stolen from rpython.rlib.objectmodel.import_from_mixin -cls = sys._getframe(1).f_locals -if use_rerased: -cls["erase"], cls["unerase"] = rerased.new_static_erasing_pair("strategy-%s" % cls["strategy_tag"]) -else: -cls["erase"], cls["unerase"] = lambda self, x: x, lambda self, x: x - # this is the typical "initial" storage strategy, for when every slot # in an object is still nil. No storage is allocated. class AllNilStorageStrategy(AbstractStorageStrategy): __metaclass__ = SingletonMeta strategy_tag = 'allnil' -setup_rerased_pair() def fetch(self, space, w_obj, n0): return model.w_nil @@ -121,7 +110,6 @@ class ListStorageStrategy(AbstractListStorageStrategy): __metaclass__ = SingletonMeta strategy_tag = 'list' -setup_rerased_pair() def fetch(self, space, w_obj, n0): return self.storage(w_obj)[n0] @@ -139,7 +127,6 @@ class TaggingSmallIntegerStorageStrategy(AbstractIntStorageStrategy): __metaclass__ = SingletonMeta strategy_tag = 'tagging-smallint' -setup_rerased_pair() needs_objspace = True @staticmethod ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Using an artificial float value as sentinel for nil in a collection.
Author: Anton Gulenko Branch: strategies-tagging Changeset: r684:91e7b60922ab Date: 2014-03-21 11:27 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/91e7b60922ab/ Log:Using an artificial float value as sentinel for nil in a collection. diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -2,6 +2,7 @@ import sys, math from spyvm import model, shadow, constants from rpython.rlib import longlong2float, rarithmetic +from rpython.rlib.rstruct.runpack import runpack from rpython.rtyper.lltypesystem import rffi, lltype from rpython.rlib.objectmodel import import_from_mixin from rpython.rlib.rfloat import string_to_float @@ -136,11 +137,11 @@ needs_objspace = True strategy_tag = 'abstract-valueOrNil' # TODO -- use another value... something like max_float? -nil_value = string_to_float("nan") +nil_value = runpack("\x10\x00\x00\x00\x00\x00\xf8\x7f") +nil_value_longlong = long2floatfloat.float2longlong(nil_value) def is_nil_value(self, val): -# return val == self.nil_value -return math.isnan(val) +return long2floatfloat.float2longlong(val) == self.nil_value_longlong def can_contain(self, space, w_val): return w_val == model.w_nil or \ ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Fixes
Author: Anton Gulenko Branch: strategies-tagging Changeset: r681:bb282722e3e4 Date: 2014-03-20 17:41 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/bb282722e3e4/ Log:Fixes diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -23,8 +23,8 @@ def store(self, space, w_obj, n0, w_val): if self.can_contain(space, w_val): -self.do_store(space, w_obj, n0, w_val) -new_strategy = find_strategy_for_object(w_val) +return self.do_store(space, w_obj, n0, w_val) +new_strategy = find_strategy_for_object(space, w_val) return w_obj.store_with_new_strategy(space, new_strategy, n0, w_val) def can_contain(self, space, w_val): @@ -146,7 +146,7 @@ def do_store(self, space, w_obj, n0, w_val): store = self.storage(w_obj) -if w_val == space.w_nil: +if w_val == model.w_nil: store[n0] = self.nil_value else: store[n0] = self.unwrap(space, w_val) @@ -156,9 +156,9 @@ def storage_for_list(self, space, collection): length = len(collection) -store = self.initial_storage(length) +store = self.initial_storage(space, length) for i in range(length): -if collection[i] != space.w_nil: +if collection[i] != model.w_nil: store[i] = self.unwrap(space, collection[i]) return store ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Fixed test_strategies.py, added tests for FloatStrategy.
Author: Anton Gulenko Branch: strategies-tagging Changeset: r683:818054edd715 Date: 2014-03-20 19:36 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/818054edd715/ Log:Fixed test_strategies.py, added tests for FloatStrategy. diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -26,7 +26,7 @@ def store(self, space, w_obj, n0, w_val): if self.can_contain(space, w_val): return self.do_store(space, w_obj, n0, w_val) -new_strategy = find_strategy_for_object(space, w_val) +new_strategy = find_strategy_for_objects(space, [w_val]) return w_obj.store_with_new_strategy(space, new_strategy, n0, w_val) def can_contain(self, space, w_val): @@ -199,9 +199,6 @@ assert isinstance(w_val, model.W_Float) return space.unwrap_float(w_val) -def find_strategy_for_object(space, var): -return find_strategy_for_objects(space, [var]) - def find_strategy_for_objects(space, vars): if only_list_storage: ListStorageStrategy.singleton diff --git a/spyvm/test/test_strategies.py b/spyvm/test/test_strategies.py --- a/spyvm/test/test_strategies.py +++ b/spyvm/test/test_strategies.py @@ -15,24 +15,29 @@ a.store(space, 0, arr(1)) return a -def tagging_arr(size): +def int_arr(size): a = arr(size) a.store(space, 0, space.wrap_int(12)) return a -def tagging_arr_odd(size): +def float_arr(size): a = arr(size) -a.store(space, 2, space.wrap_int(12)) +a.store(space, 0, space.wrap_float(1.2)) return a def check_arr(arr, expected): for i in range(arr.basic_size()): +w_val = arr.fetch(space, i) if expected[i] == w_nil: -assert arr.fetch(space, i) == w_nil -else: -w_val = arr.fetch(space, i) +assert w_val == w_nil +elif isinstance(expected[i], int): assert isinstance(w_val, model.W_SmallInteger) assert space.unwrap_int(w_val) == expected[i] +elif isinstance(expected[i], float): +assert isinstance(w_val, model.W_Float) +assert space.unwrap_float(w_val) == expected[i] +else: +assert False, "Unexpected array of expected values." # == AllNil StorageStrategy @@ -76,41 +81,82 @@ a.store(space, 1, arr(1)) assert a.basic_size() == 5 -# == Tagging SmallInteger StorageStrategy +# == SmallIntegerOrNil StorageStrategy def test_AllNil_to_Int(): -a = tagging_arr(5) -assert isinstance(a.strategy, strategies.TaggingSmallIntegerStorageStrategy) +a = int_arr(5) +assert isinstance(a.strategy, strategies.SmallIntegerOrNilStorageStrategy) check_arr(a, [12, w_nil, w_nil, w_nil, w_nil]) -def test_Tagging_store(): -a = tagging_arr(5) +def test_SmallInt_store(): +a = int_arr(5) a.store(space, 1, space.wrap_int(20)) a.store(space, 2, space.wrap_int(20)) -assert isinstance(a.strategy, strategies.TaggingSmallIntegerStorageStrategy) +assert isinstance(a.strategy, strategies.SmallIntegerOrNilStorageStrategy) check_arr(a, [12, 20, 20, w_nil, w_nil]) -def test_Tagging_store_nil_to_nil(): -a = tagging_arr_odd(5) +def test_SmallInt_store_nil_to_nil(): +a = int_arr(5) a.store(space, 1, w_nil) -check_arr(a, [w_nil, w_nil, 12, w_nil, w_nil]) +check_arr(a, [12, w_nil, w_nil, w_nil, w_nil]) -def test_Tagging_delete(): -a = tagging_arr_odd(5) +def test_SmallInt_overwrite(): +a = int_arr(5) a.store(space, 1, space.wrap_int(1)) a.store(space, 3, space.wrap_int(2)) -a.store(space, 2, space.wrap_int(100)) +a.store(space, 0, space.wrap_int(100)) a.store(space, 1, space.wrap_int(200)) a.store(space, 3, space.wrap_int(300)) -check_arr(a, [w_nil, 200, 100, 300, w_nil]) +check_arr(a, [100, 200, w_nil, 300, w_nil]) -def test_Tagging_delete_first(): -a = tagging_arr_odd(5) +def test_SmallInt_delete(): +a = int_arr(5) a.store(space, 1, space.wrap_int(1)) a.store(space, 1, w_nil) -check_arr(a, [w_nil, w_nil, 12, w_nil, w_nil]) +check_arr(a, [12, w_nil, w_nil, w_nil, w_nil]) -def test_Tagging_to_List(): -a = tagging_arr_odd(5) +def test_SmallInt_to_List(): +a = int_arr(5) a.store(space, 1, arr(1)) assert isinstance(a.strategy, strategies.ListStorageStrategy) + +# == FloatOrNil StorageStrategy + +def test_AllNil_to_Float(): +a = float_arr(5) +assert isinstance(a.strategy, strategies.FloatOrNilStorageStrategy) +check_arr(a, [1.2, w_nil, w_nil, w_nil, w_nil]) + +def test_Float_store(): +a = float_arr(5) +a.store(space, 1, space.wrap_float(20.0)) +a.store(space, 2, space.wrap_float(20.0)) +assert isinstance(a.strategy, strategies.FloatOrNilStorageStrategy) +check_arr(a, [1.2, 20.0, 20.0, w_nil, w_nil]) + +def test_Float_store_nil_to_nil(): +a = float_arr(5) +a.store(space, 1, w_nil) +check_a
[pypy-commit] lang-smalltalk strategies-tagging: Fixed a test, marked a failing test as skipped..
Author: Anton Gulenko Branch: strategies-tagging Changeset: r687:f13ab96da4bb Date: 2014-03-21 11:52 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/f13ab96da4bb/ Log:Fixed a test, marked a failing test as skipped.. diff --git a/spyvm/test/test_model.py b/spyvm/test/test_model.py --- a/spyvm/test/test_model.py +++ b/spyvm/test/test_model.py @@ -353,6 +353,7 @@ assert target.getword(0) == 0x0100 assert target.getword(1) == 0x7fff8000 +@py.test.mark.skipif("'This test must be fixed!'") def test_display_bitmap(): # XXX: Patch SDLDisplay -> get_pixelbuffer() to circumvent # double-free bug diff --git a/spyvm/test/test_strategies.py b/spyvm/test/test_strategies.py --- a/spyvm/test/test_strategies.py +++ b/spyvm/test/test_strategies.py @@ -150,7 +150,7 @@ def test_Float_delete(): a = float_arr(5) -a.store(space, 1, space.wrap_float(1)) +a.store(space, 1, space.wrap_float(1.0)) a.store(space, 1, w_nil) check_arr(a, [1.2, w_nil, w_nil, w_nil, w_nil]) ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Fix
Author: Anton Gulenko Branch: strategies-tagging Changeset: r685:0b31925287c6 Date: 2014-03-21 11:28 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/0b31925287c6/ Log:Fix diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -137,7 +137,7 @@ needs_objspace = True strategy_tag = 'abstract-valueOrNil' # TODO -- use another value... something like max_float? -nil_value = runpack("\x10\x00\x00\x00\x00\x00\xf8\x7f") +nil_value = runpack("d", "\x10\x00\x00\x00\x00\x00\xf8\x7f") nil_value_longlong = long2floatfloat.float2longlong(nil_value) def is_nil_value(self, val): ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Fixed typo
Author: Anton Gulenko Branch: strategies-tagging Changeset: r686:615f424d5684 Date: 2014-03-21 11:30 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/615f424d5684/ Log:Fixed typo diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -138,10 +138,10 @@ strategy_tag = 'abstract-valueOrNil' # TODO -- use another value... something like max_float? nil_value = runpack("d", "\x10\x00\x00\x00\x00\x00\xf8\x7f") -nil_value_longlong = long2floatfloat.float2longlong(nil_value) +nil_value_longlong = longlong2float.float2longlong(nil_value) def is_nil_value(self, val): -return long2floatfloat.float2longlong(val) == self.nil_value_longlong +return longlong2float.float2longlong(val) == self.nil_value_longlong def can_contain(self, space, w_val): return w_val == model.w_nil or \ ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] lang-smalltalk strategies-tagging: Fixed bug in strategies implementation and added test.
Author: Anton Gulenko Branch: strategies-tagging Changeset: r688:98f32dad569e Date: 2014-03-21 12:07 +0100 http://bitbucket.org/pypy/lang-smalltalk/changeset/98f32dad569e/ Log:Fixed bug in strategies implementation and added test. diff --git a/spyvm/strategies.py b/spyvm/strategies.py --- a/spyvm/strategies.py +++ b/spyvm/strategies.py @@ -27,9 +27,11 @@ def store(self, space, w_obj, n0, w_val): if self.can_contain(space, w_val): return self.do_store(space, w_obj, n0, w_val) -new_strategy = find_strategy_for_objects(space, [w_val]) +new_strategy = self.generelized_strategy_for(space, w_val) return w_obj.store_with_new_strategy(space, new_strategy, n0, w_val) +def generelized_strategy_for(self, space, w_val): +raise NotImplementedError("Abstract base class") def can_contain(self, space, w_val): raise NotImplementedError("Abstract base class") def fetch(self, space, w_obj, n0): @@ -73,6 +75,8 @@ def set_storage_copied_from(self, space, w_obj, w_source_obj, reuse_storage=False): w_obj.int_storage = self.copy_storage_from(space, w_source_obj, reuse_storage) +def generelized_strategy_for(self, space, w_val): +return ListStorageStrategy.singleton def initial_storage(self, space, size): raise NotImplementedError("Abstract base class") def storage_for_list(self, space, collection): @@ -104,6 +108,8 @@ def do_store(self, space, w_obj, n0, w_val): pass +def generelized_strategy_for(self, space, w_val): +return find_strategy_for_objects(space, [w_val]) def set_initial_storage(self, space, w_obj, size): pass def set_storage_for_list(self, space, w_obj, collection): diff --git a/spyvm/test/test_strategies.py b/spyvm/test/test_strategies.py --- a/spyvm/test/test_strategies.py +++ b/spyvm/test/test_strategies.py @@ -120,6 +120,12 @@ a.store(space, 1, arr(1)) assert isinstance(a.strategy, strategies.ListStorageStrategy) +def test_SmallInt_store_Float_to_List(): +a = int_arr(5) +a.store(space, 1, space.wrap_float(2.2)) +assert isinstance(a.strategy, strategies.ListStorageStrategy) +check_arr(a, [12, 2.2, w_nil, w_nil, w_nil]) + # == FloatOrNil StorageStrategy def test_AllNil_to_Float(): @@ -159,4 +165,9 @@ a.store(space, 1, arr(1)) assert isinstance(a.strategy, strategies.ListStorageStrategy) +def test_Float_store_SmallInt_to_List(): +a = float_arr(5) +a.store(space, 1, space.wrap_int(2)) +assert isinstance(a.strategy, strategies.ListStorageStrategy) +check_arr(a, [1.2, 2, w_nil, w_nil, w_nil]) \ No newline at end of file ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] pypy resume-refactor: some missing commit
Author: Maciej Fijalkowski Branch: resume-refactor Changeset: r70145:8f7d82dde2ed Date: 2014-03-21 12:35 +0200 http://bitbucket.org/pypy/pypy/changeset/8f7d82dde2ed/ Log:some missing commit diff --git a/TODO b/TODO --- a/TODO +++ b/TODO @@ -7,4 +7,4 @@ * do escape analysis in the resume/optimizer.py -* make_a_counter_per_value got screwed, but a bit no clue what it does +* reimplement make_a_counter_per_value diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py --- a/rpython/jit/metainterp/compile.py +++ b/rpython/jit/metainterp/compile.py @@ -498,9 +498,8 @@ self.guard_opnum = guard_op.getopnum() def make_a_counter_per_value(self, guard_value_op): +return # assert guard_value_op.getopnum() == rop.GUARD_VALUE -# XXX I have no clue what exactly it does, but we killed failargs -# so i is always 0 now box = guard_value_op.getarg(0) i = 0 # used to be i = guard_value_op.getfailargs().index(box) @@ -557,6 +556,7 @@ else: # we have a GUARD_VALUE that fails. Make a _counters instance # (only now, when the guard is actually failing at least once), # and use it to record some statistics about the failing values. +assert 0 # XXX this should be dead code until we fix it index = self._counter & self.CNT_BASE_MASK typetag = self._counter & self.CNT_TYPE_MASK counters = self._counters diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py --- a/rpython/jit/metainterp/optimizeopt/optimizer.py +++ b/rpython/jit/metainterp/optimizeopt/optimizer.py @@ -568,10 +568,6 @@ raise ValueError, "invalid optimization" self.seen_results[op.result] = None self._newoperations.append(op) -if (self.delayed_resume_put is not None and -self.delayed_resume_put.getarg(0) is op.result): -self._newoperations.append(self.delayed_resume_put) -self.delayed_resume_put = None def replace_op(self, old_op, new_op): # XXX: Do we want to cache indexes to prevent search? diff --git a/rpython/jit/metainterp/optimizeopt/resume.py b/rpython/jit/metainterp/optimizeopt/resume.py --- a/rpython/jit/metainterp/optimizeopt/resume.py +++ b/rpython/jit/metainterp/optimizeopt/resume.py @@ -1,6 +1,7 @@ from rpython.jit.metainterp.optimizeopt import optimizer from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method +from rpython.jit.metainterp.history import Const """ All of this directly emit the ops, without calling emit_operation (they also don't have boxes except a resume_put) @@ -8,9 +9,12 @@ class OptResume(optimizer.Optimization): def optimize_RESUME_PUT(self, op): -if op.getarg(0) in self.optimizer.producer: +arg = op.getarg(0) +if (isinstance(arg, Const) or arg in self.optimizer.producer or +arg in self.optimizer.loop.inputargs): self.optimizer.resumebuilder.resume_put(op) else: +xxx self.optimizer.delayed_resume_put = op # otherwise we did not emit the operation just yet diff --git a/rpython/jit/resume/optimizer.py b/rpython/jit/resume/optimizer.py --- a/rpython/jit/resume/optimizer.py +++ b/rpython/jit/resume/optimizer.py @@ -49,6 +49,7 @@ no = op.getarg(2).getint() self.framestack[op.getarg(1).getint()].values[no] = value else: +XXX self.opt.emit_operation(op) def new_virtual_with_vtable(self, box, vtable, vvalue): diff --git a/rpython/jit/resume/test/support.py b/rpython/jit/resume/test/support.py new file mode 100644 --- /dev/null +++ b/rpython/jit/resume/test/support.py @@ -0,0 +1,5 @@ + +class MockStaticData(object): +def __init__(self, jitcodes, descrs): +self.alljitcodes = jitcodes +self.opcode_descrs = descrs ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] pypy default: fix
Author: Maciej Fijalkowski Branch: Changeset: r70146:345c69c621c5 Date: 2014-03-21 13:11 +0200 http://bitbucket.org/pypy/pypy/changeset/345c69c621c5/ Log:fix diff --git a/rpython/jit/metainterp/logger.py b/rpython/jit/metainterp/logger.py --- a/rpython/jit/metainterp/logger.py +++ b/rpython/jit/metainterp/logger.py @@ -72,6 +72,9 @@ def _make_log_operations(self): return LogOperations(self.metainterp_sd, self.guard_number) +def repr_of_resop(self, op): +return LogOperations(self.metainterp_sd, self.guard_number).repr_of_resop(op) + class LogOperations(object): """ ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] pypy default: A passing test
Author: Armin Rigo Branch: Changeset: r70147:9b2113d7bb18 Date: 2014-03-21 14:25 +0100 http://bitbucket.org/pypy/pypy/changeset/9b2113d7bb18/ Log:A passing test diff --git a/rpython/jit/metainterp/test/test_dict.py b/rpython/jit/metainterp/test/test_dict.py --- a/rpython/jit/metainterp/test/test_dict.py +++ b/rpython/jit/metainterp/test/test_dict.py @@ -294,6 +294,35 @@ assert res == f(10) self.check_simple_loop(call=3) +def test_dict_eq_can_release_gil(self): +from rpython.rtyper.lltypesystem import lltype, rffi +if type(self.newdict()) is not dict: +py.test.skip("this is an r_dict test") +T = rffi.CArrayPtr(rffi.TIME_T) +external = rffi.llexternal("time", [T], rffi.TIME_T, releasegil=True) +myjitdriver = JitDriver(greens = [], reds = ['total', 'dct']) +def key(x): +return x % 2 +def eq(x, y): +external(lltype.nullptr(T.TO)) +return (x % 2) == (y % 2) + +def f(n): +dct = objectmodel.r_dict(eq, key) +total = n +x = 4 +while total: +myjitdriver.jit_merge_point(total=total, dct=dct) +dct[total] = total +x = dct[total] +total -= 1 +return len(dct) + x + +res = self.meta_interp(f, [10], listops=True) +assert res == 2 + 1 +self.check_simple_loop(call_may_force=2,# ll_dict_lookup_trampoline + call=1) # ll_dict_setitem_lookup_done_trampoline + class TestLLtype(DictTests, LLJitMixin): pass ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] pypy default: Improve the test, showing that the calls to eq() are not optimized
Author: Armin Rigo Branch: Changeset: r70148:f6f44dc30721 Date: 2014-03-21 14:28 +0100 http://bitbucket.org/pypy/pypy/changeset/f6f44dc30721/ Log:Improve the test, showing that the calls to eq() are not optimized diff --git a/rpython/jit/metainterp/test/test_dict.py b/rpython/jit/metainterp/test/test_dict.py --- a/rpython/jit/metainterp/test/test_dict.py +++ b/rpython/jit/metainterp/test/test_dict.py @@ -311,16 +311,20 @@ dct = objectmodel.r_dict(eq, key) total = n x = 4 +y = 5 +z = 6 while total: myjitdriver.jit_merge_point(total=total, dct=dct) dct[total] = total x = dct[total] +y = dct[total] +z = dct[total] total -= 1 -return len(dct) + x +return len(dct) + x + y + z res = self.meta_interp(f, [10], listops=True) -assert res == 2 + 1 -self.check_simple_loop(call_may_force=2,# ll_dict_lookup_trampoline +assert res == 2 + 1 + 1 + 1 +self.check_simple_loop(call_may_force=4,# ll_dict_lookup_trampoline call=1) # ll_dict_setitem_lookup_done_trampoline ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] pypy py3k: restore our buffer related error message
Author: Philip Jenvey Branch: py3k Changeset: r70150:707e60600dbe Date: 2014-03-21 16:48 -0700 http://bitbucket.org/pypy/pypy/changeset/707e60600dbe/ Log:restore our buffer related error message diff --git a/pypy/interpreter/baseobjspace.py b/pypy/interpreter/baseobjspace.py --- a/pypy/interpreter/baseobjspace.py +++ b/pypy/interpreter/baseobjspace.py @@ -199,7 +199,8 @@ w_result = space.get_and_call_function(w_impl, self) if space.isinstance_w(w_result, space.w_memoryview): return w_result.buffer_w(space) -self._typed_unwrap_error(space, "buffer") +raise oefmt(space.w_TypeError, +"'%T' does not support the buffer interface", self) def bytes_w(self, space): self._typed_unwrap_error(space, "bytes") diff --git a/pypy/module/_socket/test/test_sock_app.py b/pypy/module/_socket/test/test_sock_app.py --- a/pypy/module/_socket/test/test_sock_app.py +++ b/pypy/module/_socket/test/test_sock_app.py @@ -536,7 +536,8 @@ skip("GAIError - probably no connection: %s" % str(ex.args)) assert s.send(memoryview(b'')) == 0 assert s.sendall(memoryview(b'')) is None -raises(TypeError, s.send, '') +exc = raises(TypeError, s.send, '') +assert str(exc.value) == "'str' does not support the buffer interface" raises(TypeError, s.sendall, '') s.close() s = _socket.socket(_socket.AF_INET, _socket.SOCK_DGRAM, 0) ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] pypy py3k: MiniBuffer's API actually differs from MemoryView, fix
Author: Philip Jenvey Branch: py3k Changeset: r70149:4f39e0698984 Date: 2014-03-21 16:32 -0700 http://bitbucket.org/pypy/pypy/changeset/4f39e0698984/ Log:MiniBuffer's API actually differs from MemoryView, fix diff --git a/pypy/module/_cffi_backend/cbuffer.py b/pypy/module/_cffi_backend/cbuffer.py --- a/pypy/module/_cffi_backend/cbuffer.py +++ b/pypy/module/_cffi_backend/cbuffer.py @@ -1,9 +1,10 @@ +from pypy.interpreter.baseobjspace import W_Root from pypy.interpreter.buffer import RWBuffer from pypy.interpreter.error import oefmt from pypy.interpreter.gateway import unwrap_spec, interp2app from pypy.interpreter.typedef import TypeDef, make_weakref_descr from pypy.module._cffi_backend import cdataobj, ctypeptr, ctypearray -from pypy.objspace.std.memoryview import W_MemoryView +from pypy.objspace.std.memoryview import _buffer_setitem from rpython.rtyper.annlowlevel import llstr from rpython.rtyper.lltypesystem import rffi @@ -41,11 +42,30 @@ # Override the typedef to narrow down the interface that's exposed to app-level -class MiniBuffer(W_MemoryView): +class MiniBuffer(W_Root): def __init__(self, buffer, keepalive=None): -W_MemoryView.__init__(self, buffer) +self.buffer = buffer self.keepalive = keepalive +def buffer_w(self, space): +return self.buffer + +def descr_len(self, space): +return space.wrap(self.buffer.getlength()) + +def descr_getitem(self, space, w_index): +start, stop, step, size = space.decode_index4(w_index, + self.buffer.getlength()) +if step == 0: +return space.wrapbytes(self.buffer.getitem(start)) +res = self.buffer.getslice(start, stop, step, size) +return space.wrapbytes(res) + +@unwrap_spec(newstring='bufferstr') +def descr_setitem(self, space, w_index, newstring): +_buffer_setitem(space, self.buffer, w_index, newstring) + + MiniBuffer.typedef = TypeDef( "buffer", __module__ = "_cffi_backend", ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit
[pypy-commit] pypy py3k: this now lives in baseobjspace after the buffer refactor
Author: Philip Jenvey Branch: py3k Changeset: r70151:144c447e88ff Date: 2014-03-21 16:48 -0700 http://bitbucket.org/pypy/pypy/changeset/144c447e88ff/ Log:this now lives in baseobjspace after the buffer refactor diff --git a/pypy/objspace/descroperation.py b/pypy/objspace/descroperation.py --- a/pypy/objspace/descroperation.py +++ b/pypy/objspace/descroperation.py @@ -473,13 +473,6 @@ else: return space.isinstance(w_inst, w_type) -def buffer(space, w_obj): -w_impl = space.lookup(w_obj, '__buffer__') -if w_impl is None: -raise oefmt(space.w_TypeError, -"'%T' does not support the buffer interface", w_obj) -return space.get_and_call_function(w_impl, w_obj) - # helpers ___ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit