From 971903dfd2cb3a5843091f56600d6d3174bd19a4 Mon Sep 17 00:00:00 2001 From: Fabio Niephaus Date: Mon, 13 Mar 2017 13:41:44 +0100 Subject: [PATCH] Move Cell to cells.py and cache QuasiConstants --- rsqueakvm/objspace.py | 4 +-- rsqueakvm/plugins/misc_primitive_plugin.py | 9 +------ rsqueakvm/plugins/socket_plugin.py | 8 +----- rsqueakvm/util/cells.py | 29 +++++++++++++++++++--- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/rsqueakvm/objspace.py b/rsqueakvm/objspace.py index 17c08c06..eda79788 100644 --- a/rsqueakvm/objspace.py +++ b/rsqueakvm/objspace.py @@ -52,9 +52,9 @@ def __init__(self): self.altf4quit = QuasiConstant(False) from rsqueakvm.display import NullDisplay - self._display = QuasiConstant(None, type=NullDisplay) + self._display = QuasiConstant(None, cls=NullDisplay) from rsqueakvm.interpreter import Interpreter - self.interp = QuasiConstant(None, type=Interpreter) + self.interp = QuasiConstant(None, cls=Interpreter) self.make_special_objects() self.strategy_factory = storage.StrategyFactory(self) diff --git a/rsqueakvm/plugins/misc_primitive_plugin.py b/rsqueakvm/plugins/misc_primitive_plugin.py index 2104cd0d..240c48bb 100644 --- a/rsqueakvm/plugins/misc_primitive_plugin.py +++ b/rsqueakvm/plugins/misc_primitive_plugin.py @@ -2,19 +2,12 @@ from rsqueakvm.error import PrimitiveFailedError from rsqueakvm.model.variable import W_BytesObject from rsqueakvm.plugins.plugin import Plugin +from rsqueakvm.util.cells import Cell from rpython.rlib.rarithmetic import r_uint, intmask from rpython.rlib import jit -class Cell(object): - _attrs_ = ["value"] - _immutable_fields_ = ["value?"] - def __init__(self, value): self.value = value - def set(self, v): self.value = v - def get(self): return self.value - - class MiscPrimitivePlugin(Plugin): _attrs_ = ["ascii_order"] _immutable_fields_ = ["ascii_order"] diff --git a/rsqueakvm/plugins/socket_plugin.py b/rsqueakvm/plugins/socket_plugin.py index 93c7b6ba..e2347fa8 100644 --- a/rsqueakvm/plugins/socket_plugin.py +++ b/rsqueakvm/plugins/socket_plugin.py @@ -1,10 +1,10 @@ import errno -import sys from rsqueakvm import error from rsqueakvm.model.base import W_AbstractObjectWithIdentityHash from rsqueakvm.model.variable import W_BytesObject from rsqueakvm.plugins.plugin import Plugin +from rsqueakvm.util.cells import Cell from rsqueakvm.util.system import IS_SHELL, IS_WINDOWS from rpython.rlib import rsocket, _rsocket_rffi, objectmodel @@ -23,12 +23,6 @@ def non_blocking_recv(self, count): return self.socket.recv(count, _rsocket_rffi.MSG_DONTWAIT) -class Cell(object): - _attrs_ = ["value"] - def __init__(self, value): self.value = value - def set(self, v): self.value = v - def get(self): return self.value - ResolverUninitialized = 0 ResolverReady = 1 ResolverBusy = 2 diff --git a/rsqueakvm/util/cells.py b/rsqueakvm/util/cells.py index e8897af8..50bc51df 100644 --- a/rsqueakvm/util/cells.py +++ b/rsqueakvm/util/cells.py @@ -1,9 +1,20 @@ from rpython.rlib import jit +from rpython.rlib.cache import Cache from rpython.rlib.objectmodel import specialize, import_from_mixin from rsqueakvm.util.version import Version +class QuasiConstantCache(Cache): + def _build(self, obj): + class NewQuasiConst(object): + import_from_mixin(QuasiConstantMixin) + return NewQuasiConst + + +cache = QuasiConstantCache() + + class QuasiConstantMixin(object): """Mixin for constant values that can be edited, but will be promoted to a constant when jitting.""" @@ -28,9 +39,19 @@ def changed(self): self.set(Version()) +@specialize.memo() +def QuasiConstant(initial_value, cls=None): + if cls is not None: + return cache.getorbuild(cls)(initial_value) + return cache.getorbuild(type(initial_value))(initial_value) + + @specialize.arg(1) @specialize.argtype(0) -def QuasiConstant(initial_value, type=object): - class NewQuasiConst(object): - import_from_mixin(QuasiConstantMixin) - return NewQuasiConst(initial_value) +def Cell(initial_value, type=object): + class NewCell(object): + _attrs_ = ["value"] + def __init__(self, value): self.value = value + def set(self, v): self.value = v + def get(self): return self.value + return NewCell(initial_value)