Author: Armin Rigo <[email protected]>
Branch: conditional_call_value_4
Changeset: r88596:7e9c96bc7e3e
Date: 2016-11-23 22:43 +0100
http://bitbucket.org/pypy/pypy/changeset/7e9c96bc7e3e/
Log: Simplest solution to avoid troubles with a getfield on the hash: add
a custom operation
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -788,6 +788,9 @@
assert 0 <= dststart <= dststart + length <= len(dst.chars)
rstr.copy_string_contents(src, dst, srcstart, dststart, length)
+ def bh_strhash(self, s):
+ return s._obj.container.hash
+
def bh_newunicode(self, length):
return lltype.cast_opaque_ptr(llmemory.GCREF,
lltype.malloc(rstr.UNICODE, length,
@@ -810,6 +813,9 @@
assert 0 <= dststart <= dststart + length <= len(dst.chars)
rstr.copy_unicode_contents(src, dst, srcstart, dststart, length)
+ def bh_unicodehash(self, s):
+ return s._obj.container.hash
+
def bh_new(self, sizedescr):
return lltype.cast_opaque_ptr(llmemory.GCREF,
lltype.malloc(sizedescr.S, zero=True))
diff --git a/rpython/jit/codewriter/jtransform.py
b/rpython/jit/codewriter/jtransform.py
--- a/rpython/jit/codewriter/jtransform.py
+++ b/rpython/jit/codewriter/jtransform.py
@@ -789,12 +789,20 @@
arrayfielddescr,
arraydescr)
return []
+ # check for the string or unicode hash field
+ STRUCT = v_inst.concretetype.TO
+ if STRUCT == rstr.STR:
+ assert c_fieldname.value == 'hash'
+ return SpaceOperation('strhash', [v_inst], op.result)
+ elif STRUCT == rstr.UNICODE:
+ assert c_fieldname.value == 'hash'
+ return SpaceOperation('unicodehash', [v_inst], op.result)
# check for _immutable_fields_ hints
- immut = v_inst.concretetype.TO._immutable_field(c_fieldname.value)
+ immut = STRUCT._immutable_field(c_fieldname.value)
need_live = False
if immut:
if (self.callcontrol is not None and
- self.callcontrol.could_be_green_field(v_inst.concretetype.TO,
+ self.callcontrol.could_be_green_field(STRUCT,
c_fieldname.value)):
pure = '_greenfield'
need_live = True
@@ -802,10 +810,9 @@
pure = '_pure'
else:
pure = ''
- self.check_field_access(v_inst.concretetype.TO)
- argname = getattr(v_inst.concretetype.TO, '_gckind', 'gc')
- descr = self.cpu.fielddescrof(v_inst.concretetype.TO,
- c_fieldname.value)
+ self.check_field_access(STRUCT)
+ argname = getattr(STRUCT, '_gckind', 'gc')
+ descr = self.cpu.fielddescrof(STRUCT, c_fieldname.value)
kind = getkind(RESULT)[0]
if argname != 'gc':
assert argname == 'raw'
@@ -822,7 +829,7 @@
if immut in (IR_QUASIIMMUTABLE, IR_QUASIIMMUTABLE_ARRAY):
op1.opname += "_pure"
descr1 = self.cpu.fielddescrof(
- v_inst.concretetype.TO,
+ STRUCT,
quasiimmut.get_mutate_field_name(c_fieldname.value))
return [SpaceOperation('-live-', [], None),
SpaceOperation('record_quasiimmut_field',
diff --git a/rpython/jit/metainterp/blackhole.py
b/rpython/jit/metainterp/blackhole.py
--- a/rpython/jit/metainterp/blackhole.py
+++ b/rpython/jit/metainterp/blackhole.py
@@ -1507,6 +1507,9 @@
@arguments("cpu", "r", "r", "i", "i", "i")
def bhimpl_copystrcontent(cpu, src, dst, srcstart, dststart, length):
cpu.bh_copystrcontent(src, dst, srcstart, dststart, length)
+ @arguments("cpu", "r", returns="i")
+ def bhimpl_strhash(cpu, string):
+ return cpu.bh_strhash(string)
@arguments("cpu", "i", returns="r")
def bhimpl_newunicode(cpu, length):
@@ -1523,6 +1526,9 @@
@arguments("cpu", "r", "r", "i", "i", "i")
def bhimpl_copyunicodecontent(cpu, src, dst, srcstart, dststart, length):
cpu.bh_copyunicodecontent(src, dst, srcstart, dststart, length)
+ @arguments("cpu", "r", returns="i")
+ def bhimpl_unicodehash(cpu, unicode):
+ return cpu.bh_unicodehash(unicode)
@arguments("i", "i")
def bhimpl_rvmprof_code(leaving, unique_id):
diff --git a/rpython/jit/metainterp/pyjitpl.py
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1163,6 +1163,14 @@
self.execute(rop.UNICODESETITEM, unicodebox, indexbox, newcharbox)
@arguments("box")
+ def opimpl_strhash(self, strbox):
+ return self.execute(rop.STRHASH, strbox)
+
+ @arguments("box")
+ def opimpl_unicodehash(self, unicodebox):
+ return self.execute(rop.UNICODEHASH, unicodebox)
+
+ @arguments("box")
def opimpl_newstr(self, lengthbox):
return self.execute(rop.NEWSTR, lengthbox)
diff --git a/rpython/jit/metainterp/resoperation.py
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -1097,6 +1097,8 @@
'_MALLOC_LAST',
'FORCE_TOKEN/0/r', # historical name; nowadays, returns the jitframe
'VIRTUAL_REF/2/r', # removed before it's passed to the backend
+ 'STRHASH/1/i', # only reading the .hash field, might be zero so far
+ 'UNICODEHASH/1/i', # "
# this one has no *visible* side effect, since the virtualizable
# must be forced, however we need to execute it anyway
'_NOSIDEEFFECT_LAST', # ----- end of no_side_effect operations -----
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit