[pypy-svn] r72224 - in pypy/branch/jit-newx86/pypy/jit/backend/newx86: . test

arigo at codespeak.net arigo at codespeak.net
Sun Mar 14 18:11:10 CET 2010


Author: arigo
Date: Sun Mar 14 18:11:08 2010
New Revision: 72224

Modified:
   pypy/branch/jit-newx86/pypy/jit/backend/newx86/codebuf.py
   pypy/branch/jit-newx86/pypy/jit/backend/newx86/test/test_codebuf.py
Log:
Subbuffers, to use for writing guard failure code and data.


Modified: pypy/branch/jit-newx86/pypy/jit/backend/newx86/codebuf.py
==============================================================================
--- pypy/branch/jit-newx86/pypy/jit/backend/newx86/codebuf.py	(original)
+++ pypy/branch/jit-newx86/pypy/jit/backend/newx86/codebuf.py	Sun Mar 14 18:11:08 2010
@@ -1,6 +1,6 @@
 from pypy.rlib.objectmodel import we_are_translated
 from pypy.rlib.rmmap import PTR, alloc, free
-from pypy.rpython.lltypesystem import lltype, rffi
+from pypy.rpython.lltypesystem import rffi
 from pypy.jit.backend.newx86.rx86 import X86_32_CodeBuilder, X86_64_CodeBuilder
 
 
@@ -49,6 +49,17 @@
     def get_current_position(self):
         return rffi.ptradd(self.data, self.write_ofs)
 
+    def extract_subbuffer(self, subsize):
+        subbuf = self.data
+        if self.write_ofs < subsize:
+            self._overflow_detected()
+        self.write_ofs -= subsize
+        self.data = rffi.ptradd(self.data, subsize)
+        return self.__class__(subbuf, subsize)
+
+    def is_full(self):
+        return self.write_ofs == 0
+
 
 class CodeBuilder32(CodeBuilder, X86_32_CodeBuilder):
     pass

Modified: pypy/branch/jit-newx86/pypy/jit/backend/newx86/test/test_codebuf.py
==============================================================================
--- pypy/branch/jit-newx86/pypy/jit/backend/newx86/test/test_codebuf.py	(original)
+++ pypy/branch/jit-newx86/pypy/jit/backend/newx86/test/test_codebuf.py	Sun Mar 14 18:11:08 2010
@@ -1,5 +1,6 @@
 import py
 import gc
+from pypy.rpython.lltypesystem import rffi
 from pypy.jit.backend.newx86.codebuf import CodeBufOverflow
 from pypy.jit.backend.newx86.codebuf import CodeBufAllocator
 from pypy.jit.backend.newx86.rx86 import R
@@ -43,3 +44,42 @@
         for i in range(4096):
             c.NOP()
         py.test.raises(CodeBufOverflow, c.NOP)
+
+    def test_extract_subbuffer(self):
+        c1 = self.cballoc.new_code_buffer(4096)
+        c1.NOP()
+        c2 = c1.extract_subbuffer(3)
+        p1 = c1.get_current_position()
+        assert p1[0] == chr(0x90)       # NOP
+        p2 = c2.get_current_position()
+        assert p2[4092] == chr(0x90)    # NOP
+        assert not c2.is_full()
+        c2.RET()
+        c2.RET()
+        c2.RET()
+        p2 = c2.get_current_position()
+        assert p2[0] == chr(0xC3)       # RET
+        assert p2[1] == chr(0xC3)       # RET
+        assert p2[2] == chr(0xC3)       # RET
+        assert p2[4095] == chr(0x90)    # NOP
+        assert c2.is_full()
+
+    def test_extract_subbuffer_overflow(self):
+        c = self.cballoc.new_code_buffer(4096)
+        c.raise_on_overflow = True
+        for i in range(4092):
+            c.NOP()
+        c1 = c.extract_subbuffer(3)
+        c1.RET()
+        c1.RET()
+        c1.RET()
+        c2 = c.extract_subbuffer(1)
+        c2.PUSH_r(R.edx)
+        p1 = c1.get_current_position()
+        assert p1[0] == chr(0xC3)      # RET
+        assert p1[1] == chr(0xC3)      # RET
+        assert p1[2] == chr(0xC3)      # RET
+        assert p1[3] == chr(0x52)      # PUSH edx
+        assert p1[4] == chr(0x90)      # NOP
+        assert p1[4095] == chr(0x90)   # NOP
+        py.test.raises(CodeBufOverflow, c.extract_subbuffer, 1)



More information about the Pypy-commit mailing list