[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