[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