[pypy-svn] r47897 - in pypy/dist/pypy/lang/smalltalk: . test
niko at codespeak.net
niko at codespeak.net
Thu Oct 25 10:46:19 CEST 2007
Author: niko
Date: Thu Oct 25 10:46:19 2007
New Revision: 47897
Modified:
pypy/dist/pypy/lang/smalltalk/primitives.py
pypy/dist/pypy/lang/smalltalk/test/test_primitives.py
Log:
1. avoid using "import foo as bar" (most of the time)
2. add some stubs for control primitives
(I know, I shouldn't mix, but I forgot about #2 till it was too late :)
Modified: pypy/dist/pypy/lang/smalltalk/primitives.py
==============================================================================
--- pypy/dist/pypy/lang/smalltalk/primitives.py (original)
+++ pypy/dist/pypy/lang/smalltalk/primitives.py Thu Oct 25 10:46:19 2007
@@ -1,7 +1,7 @@
import operator
from pypy.lang.smalltalk import model, mirror
-import pypy.lang.smalltalk.classtable as ct
-import pypy.lang.smalltalk.fakeimage as fimg
+from pypy.lang.smalltalk import classtable
+from pypy.lang.smalltalk import fakeimage
from pypy.rlib import rarithmetic
class PrimitiveFailedError(Exception):
@@ -19,9 +19,9 @@
if isinstance(w_obj, model.W_PointersObject):
return w_obj.getindexedvar(idx)
elif isinstance(w_obj, model.W_WordsObject):
- return fimg.wrap_int(w_obj.getword(idx))
+ return fakeimage.wrap_int(w_obj.getword(idx))
elif isinstance(w_obj, model.W_BytesObject):
- return fimg.wrap_int(w_obj.getbyte(idx))
+ return fakeimage.wrap_int(w_obj.getbyte(idx))
raise PrimitiveFailedError()
def assert_bounds(idx, minb, maxb):
@@ -68,7 +68,7 @@
raise PrimitiveFailedError()
if value < -1073741824:
raise PrimitiveFailedError()
- return fimg.wrap_int(value)
+ return fakeimage.wrap_int(value)
ADD = 1
SUBTRACT = 2
@@ -189,7 +189,7 @@
[w_v1, w_v2] = res
v1 = unwrap_float(w_v1)
v2 = unwrap_float(w_v2)
- w_res = fimg.wrap_float(op(v1, v2))
+ w_res = fakeimage.wrap_float(op(v1, v2))
return w_res
prim_table[code] = func
@@ -242,15 +242,15 @@
def func(stack):
w_obj, idx = common_at(stack)
byte = w_obj.getbyte(idx)
- return fimg.CharacterTable[byte]
+ return fakeimage.CharacterTable[byte]
@primitive(STRING_AT_PUT)
@stack(3)
def func(stack):
w_obj, idx, w_val = common_at_put(stack)
- if w_val.getclassmirror() is not ct.m_Character:
+ if w_val.getclassmirror() is not classtable.m_Character:
raise PrimitiveFailedError()
- w_obj.setbyte(idx, fimg.ord_w_char(w_val))
+ w_obj.setbyte(idx, fakeimage.ord_w_char(w_val))
return w_val
# ___________________________________________________________________________
@@ -267,6 +267,7 @@
STORE_STACKP = 76 # Blue Book: primitiveAsObject
SOME_INSTANCE = 77
NEXT_INSTANCE = 78
+NEW_METHOD = 79
@primitive(OBJECT_AT)
@stack(2)
@@ -363,6 +364,73 @@
[w_obj] = stack
raise PrimitiveNotYetWrittenError()
+ at primitive(NEW_METHOD)
+def func(frame):
+ raise PrimitiveNotYetWrittenError()
+
+# ___________________________________________________________________________
+# Control Primitives
+
+EQUIVALENT = 110
+CLASS = 111
+BYTES_LEFT = 112
+QUIT = 113
+EXIT_TO_DEBUGGER = 114
+CHANGE_CLASS = 115 # Blue Book: primitiveOopsLeft
+
+ at primitive(EQUIVALENT)
+ at stack(2)
+def func(stack):
+ [w_arg, w_rcvr] = stack
+ return w_arg == w_rcvr
+
+ at primitive(EQUIVALENT)
+ at stack(1)
+def func(stack):
+ [w_obj] = stack
+ return w_obj.w_class
+
+ at primitive(BYTES_LEFT)
+def func(frame):
+ raise PrimitiveNotYetWrittenError()
+
+ at primitive(QUIT)
+def func(frame):
+ raise PrimitiveNotYetWrittenError()
+
+ at primitive(EXIT_TO_DEBUGGER)
+def func(frame):
+ raise PrimitiveNotYetWrittenError()
+
+ at primitive(CHANGE_CLASS)
+ at stack(2)
+def func(stack):
+ [w_arg, w_rcvr] = stack
+ w_arg_class = w_arg.w_class
+ w_rcvr_class = w_rcvr.w_class
+
+ # We should fail if:
+
+ # 1. Rcvr or arg are SmallIntegers
+ if (w_arg_class == classtable.w_SmallInteger or
+ w_rcvr_class == classtable.w_SmallInteger):
+ raise PrimitiveFailedError()
+
+ # 2. Rcvr is an instance of a compact class and argument isn't
+ # or vice versa (?)
+
+ # 3. Format of rcvr is different from format of argument
+ if w_arg_class.format != w_rcvr_class.format:
+ raise PrimitiveFailedError()
+
+ # Fail when argument class is fixed and rcvr's size differs from the
+ # size of an instance of the arg
+ if w_arg_class.instsize() != w_rcvr_class.instsize():
+ raise PrimitiveFailedError()
+
+ w_rcvr.w_class = w_arg.w_class
+ return
+
# ___________________________________________________________________________
# Boolean Primitives
@@ -396,7 +464,7 @@
v1 = unwrap_int(w_v1)
v2 = unwrap_int(w_v2)
res = op(v1, v2)
- w_res = fimg.wrap_bool(res)
+ w_res = fakeimage.wrap_bool(res)
return w_res
for (code,op) in bool_ops.items():
@@ -407,7 +475,7 @@
v1 = unwrap_float(w_v1)
v2 = unwrap_float(w_v2)
res = op(v1, v2)
- w_res = fimg.wrap_bool(res)
+ w_res = fakeimage.wrap_bool(res)
return w_res
# ___________________________________________________________________________
@@ -430,13 +498,13 @@
def define_const_primitives():
for (code, const) in [
- (PUSH_TRUE, fimg.w_true),
- (PUSH_FALSE, fimg.w_false),
- (PUSH_NIL, fimg.w_nil),
- (PUSH_MINUS_ONE, fimg.w_mone),
- (PUSH_ZERO, fimg.w_zero),
- (PUSH_ONE, fimg.w_one),
- (PUSH_TWO, fimg.w_two),
+ (PUSH_TRUE, fakeimage.w_true),
+ (PUSH_FALSE, fakeimage.w_false),
+ (PUSH_NIL, fakeimage.w_nil),
+ (PUSH_MINUS_ONE, fakeimage.w_mone),
+ (PUSH_ZERO, fakeimage.w_zero),
+ (PUSH_ONE, fakeimage.w_one),
+ (PUSH_TWO, fakeimage.w_two),
]:
@primitive(code)
@stack(1)
Modified: pypy/dist/pypy/lang/smalltalk/test/test_primitives.py
==============================================================================
--- pypy/dist/pypy/lang/smalltalk/test/test_primitives.py (original)
+++ pypy/dist/pypy/lang/smalltalk/test/test_primitives.py Thu Oct 25 10:46:19 2007
@@ -1,23 +1,25 @@
import py
from pypy.lang.smalltalk.primitives import prim_table, PrimitiveFailedError
-import pypy.lang.smalltalk.primitives as p
from pypy.lang.smalltalk import model, mirror
-import pypy.lang.smalltalk.interpreter as interp
-import pypy.lang.smalltalk.classtable as ct
-import pypy.lang.smalltalk.fakeimage as fimg
+from pypy.lang.smalltalk import interpreter
+from pypy.lang.smalltalk import classtable
+from pypy.lang.smalltalk import fakeimage
+
+# Violates the guideline, but we use it A LOT to reference the primitive codes:
+import pypy.lang.smalltalk.primitives as p
-mockclassmirror = ct.bootstrap_classmirror
+mockclassmirror = classtable.bootstrap_classmirror
-class MockFrame(interp.W_MethodContext):
+class MockFrame(interpreter.W_MethodContext):
def __init__(self, stack):
self.stack = stack
def wrap(x):
- if isinstance(x, int): return fimg.wrap_int(x)
- if isinstance(x, float): return fimg.wrap_float(x)
+ if isinstance(x, int): return fakeimage.wrap_int(x)
+ if isinstance(x, float): return fakeimage.wrap_float(x)
if isinstance(x, model.W_Object): return x
- if isinstance(x, str) and len(x) == 1: return fimg.wrap_char(x)
- if isinstance(x, str): return fimg.wrap_string(x)
+ if isinstance(x, str) and len(x) == 1: return fakeimage.wrap_char(x)
+ if isinstance(x, str): return fakeimage.wrap_string(x)
if isinstance(x, mirror.ClassMirror): return x.w_self
raise NotImplementedError
@@ -168,11 +170,11 @@
assert prim(p.STRING_AT, [test_str, i]) == wrap(exp[i])
def test_object_at():
- w_v = prim(p.OBJECT_AT, ["q", fimg.CHARACTER_VALUE_INDEX])
+ w_v = prim(p.OBJECT_AT, ["q", fakeimage.CHARACTER_VALUE_INDEX])
assert w_v.value == ord("q")
def test_invalid_object_at():
- prim_fails(p.OBJECT_AT, ["q", fimg.CHARACTER_VALUE_INDEX+1])
+ prim_fails(p.OBJECT_AT, ["q", fakeimage.CHARACTER_VALUE_INDEX+1])
def test_object_at_put():
w_obj = mockclassmirror(1).new()
@@ -191,24 +193,24 @@
assert prim(p.STRING_AT, [test_str, i]) == wrap(exp[i])
def test_new():
- w_res = prim(p.NEW, [ct.m_Object])
- assert w_res.getclassmirror() == ct.m_Object
+ w_res = prim(p.NEW, [classtable.m_Object])
+ assert w_res.getclassmirror() == classtable.m_Object
def test_invalid_new():
- prim_fails(p.NEW, [ct.m_ByteString])
+ prim_fails(p.NEW, [classtable.m_ByteString])
def test_new_with_arg():
- w_res = prim(p.NEW_WITH_ARG, [ct.m_ByteString, 20])
- assert w_res.getclassmirror() == ct.m_ByteString
+ w_res = prim(p.NEW_WITH_ARG, [classtable.m_ByteString, 20])
+ assert w_res.getclassmirror() == classtable.m_ByteString
assert w_res.size() == 20
def test_invalid_new_with_arg():
- prim_fails(p.NEW_WITH_ARG, [ct.m_Object, 20])
+ prim_fails(p.NEW_WITH_ARG, [classtable.m_Object, 20])
def test_inst_var_at():
# I am not entirely sure if this is what this primitive is
# supposed to do, so the test may be bogus:
- w_v = prim(p.INST_VAR_AT, ["q", fimg.CHARACTER_VALUE_INDEX])
+ w_v = prim(p.INST_VAR_AT, ["q", fakeimage.CHARACTER_VALUE_INDEX])
assert w_v.value == ord("q")
w_v = prim(p.INST_VAR_AT, ["abc", 1])
assert w_v.value == ord("b")
@@ -223,30 +225,30 @@
def test_const_primitives():
for (code, const) in [
- (p.PUSH_TRUE, fimg.w_true),
- (p.PUSH_FALSE, fimg.w_false),
- (p.PUSH_NIL, fimg.w_nil),
- (p.PUSH_MINUS_ONE, fimg.w_mone),
- (p.PUSH_ZERO, fimg.w_zero),
- (p.PUSH_ONE, fimg.w_one),
- (p.PUSH_TWO, fimg.w_two),
+ (p.PUSH_TRUE, fakeimage.w_true),
+ (p.PUSH_FALSE, fakeimage.w_false),
+ (p.PUSH_NIL, fakeimage.w_nil),
+ (p.PUSH_MINUS_ONE, fakeimage.w_mone),
+ (p.PUSH_ZERO, fakeimage.w_zero),
+ (p.PUSH_ONE, fakeimage.w_one),
+ (p.PUSH_TWO, fakeimage.w_two),
]:
- assert prim(code, [fimg.w_nil]) is const
- assert prim(p.PUSH_SELF, [fimg.w_nil]) is fimg.w_nil
+ assert prim(code, [fakeimage.w_nil]) is const
+ assert prim(p.PUSH_SELF, [fakeimage.w_nil]) is fakeimage.w_nil
assert prim(p.PUSH_SELF, ["a"]) is wrap("a")
def test_boolean():
- assert prim(p.LESSTHAN, [1,2]) == fimg.w_true
- assert prim(p.GREATERTHAN, [3,4]) == fimg.w_false
- assert prim(p.LESSOREQUAL, [1,2]) == fimg.w_true
- assert prim(p.GREATEROREQUAL, [3,4]) == fimg.w_false
- assert prim(p.EQUAL, [2,2]) == fimg.w_true
- assert prim(p.NOTEQUAL, [2,2]) == fimg.w_false
+ assert prim(p.LESSTHAN, [1,2]) == fakeimage.w_true
+ assert prim(p.GREATERTHAN, [3,4]) == fakeimage.w_false
+ assert prim(p.LESSOREQUAL, [1,2]) == fakeimage.w_true
+ assert prim(p.GREATEROREQUAL, [3,4]) == fakeimage.w_false
+ assert prim(p.EQUAL, [2,2]) == fakeimage.w_true
+ assert prim(p.NOTEQUAL, [2,2]) == fakeimage.w_false
def test_float_boolean():
- assert prim(p.FLOAT_LESSTHAN, [1.0,2.0]) == fimg.w_true
- assert prim(p.FLOAT_GREATERTHAN, [3.0,4.0]) == fimg.w_false
- assert prim(p.FLOAT_LESSOREQUAL, [1.3,2.6]) == fimg.w_true
- assert prim(p.FLOAT_GREATEROREQUAL, [3.5,4.9]) == fimg.w_false
- assert prim(p.FLOAT_EQUAL, [2.2,2.2]) == fimg.w_true
- assert prim(p.FLOAT_NOTEQUAL, [2.2,2.2]) == fimg.w_false
+ assert prim(p.FLOAT_LESSTHAN, [1.0,2.0]) == fakeimage.w_true
+ assert prim(p.FLOAT_GREATERTHAN, [3.0,4.0]) == fakeimage.w_false
+ assert prim(p.FLOAT_LESSOREQUAL, [1.3,2.6]) == fakeimage.w_true
+ assert prim(p.FLOAT_GREATEROREQUAL, [3.5,4.9]) == fakeimage.w_false
+ assert prim(p.FLOAT_EQUAL, [2.2,2.2]) == fakeimage.w_true
+ assert prim(p.FLOAT_NOTEQUAL, [2.2,2.2]) == fakeimage.w_false
More information about the Pypy-commit
mailing list