[pypy-commit] pypy quad-color-gc: Implement correct hashing
ntruessel
pypy.commits at gmail.com
Sun Aug 28 07:26:01 EDT 2016
Author: Nicolas Truessel <ntruessel at njsm.de>
Branch: quad-color-gc
Changeset: r86639:551003ed3ffb
Date: 2016-08-28 13:25 +0200
http://bitbucket.org/pypy/pypy/changeset/551003ed3ffb/
Log: Implement correct hashing
diff --git a/rpython/memory/gc/qcgc.py b/rpython/memory/gc/qcgc.py
--- a/rpython/memory/gc/qcgc.py
+++ b/rpython/memory/gc/qcgc.py
@@ -5,6 +5,9 @@
from rpython.rlib.debug import ll_assert
from rpython.rlib.rarithmetic import ovfcheck
+QCGC_HAS_HASH = 0x100 # Upper half of flags for clients, lower half is reserved
+QCGC_PREBUILT_OBJECT = 0x2 # XXX: exploits knowledge about qcgc library
+
class QCGC(GCBase):
_alloc_flavor_ = "raw"
moving_gc = False
@@ -16,20 +19,22 @@
gcflag_extra = 0 # or a real GC flag that is always 0 when not collecting
typeid_is_in_field = 'tid'
- withhash_flag_is_in_field = 'hash', 0
+ withhash_flag_is_in_field = 'flags', QCGC_HAS_HASH
TRANSLATION_PARAMS = {}
HDR = lltype.Struct(
'pypyhdr_t',
- ('hdr', rffi.COpaque('object_t', hints={"is_qcgc_header": True})),
+ #('hdr', rffi.COpaque('object_t', hints={"is_qcgc_header": True})),
+ ('flags', lltype.Signed), # XXX: exploits knowledge about object_t
('tid', lltype.Signed),
('hash', lltype.Signed))
#HDR = rffi.COpaque('object_t')
- def init_gc_object(self, obj, typeid):
- hdr = llmemory.cast_adr_to_ptr(obj, lltype.Ptr(self.HDR))
+ def init_gc_object(self, addr, typeid, flags=0):
+ hdr = llmemory.cast_adr_to_ptr(addr, lltype.Ptr(self.HDR))
+ hdr.flags = rffi.cast(lltype.Signed, flags)
hdr.tid = rffi.cast(lltype.Signed, typeid)
- hdr.hash = rffi.cast(lltype.Signed, obj)
+ hdr.hash = rffi.cast(lltype.Signed, addr)
def malloc_fixedsize_clear(self, typeid, size,
needs_finalizer=False,
@@ -59,6 +64,16 @@
(obj + offset_to_length).signed[0] = length
return llmemory.cast_adr_to_ptr(obj, llmemory.GCREF)
+ def init_gc_object_immortal(self, addr, typeid, flags=0): # XXX: Prebuilt Objects?
+ assert flags == 0
+ ptr = self.gcheaderbuilder.object_from_header(addr.ptr)
+ prebuilt_hash = lltype.identityhash_nocache(ptr)
+ assert prebuilt_hash != 0
+ flags |= QCGC_PREBUILT_OBJECT
+ #
+ self.init_gc_object(addr, typeid.index, flags)
+ llmemory.cast_adr_to_ptr(addr, lltype.Ptr(self.HDR)).hash = prebuilt_hash
+
def collect(self, gen=1):
"""Do a minor (gen=0) or major (gen>0) collection."""
# XXX: Minor collection not supported
@@ -75,12 +90,13 @@
#return True
def id_or_identityhash(self, gcobj, is_hash):
- i = self.header(llmemory.cast_ptr_to_adr(gcobj)).hash
- prebuilt = llop.qcgc_is_prebuilt(lltype.Bool, gcobj)
+ hdr = self.header(llmemory.cast_ptr_to_adr(gcobj))
+ has_hash = (hdr.flags & QCGC_HAS_HASH)
+ i = hdr.hash
#
if is_hash:
- if prebuilt:
- return i # Do not mangle for prebuilt objects
+ if has_hash:
+ return i # Do not mangle for objects with built in hash
i = mangle_hash(i)
return i
@@ -95,27 +111,3 @@
def get_type_id(self, obj):
return self.header(obj).tid
-
- def init_gc_object_immortal(self, addr, typeid, flags=0): # XXX: Prebuilt Objects?
- assert flags == 0
- hdr = llmemory.cast_adr_to_ptr(addr, lltype.Ptr(self.HDR))
- hdr.tid = typeid.index
- ptr = self.gcheaderbuilder.object_from_header(addr.ptr)
- prebuilt_hash = lltype.identityhash_nocache(ptr)
- assert prebuilt_hash != 0
- #
- hdr = llmemory.cast_adr_to_ptr(addr, lltype.Ptr(self.HDR))
- hdr.hash = prebuilt_hash
- #hdr._obj._name = typeid.index
- #
- # STMGC CODE:
- #assert flags == 0
- #assert isinstance(typeid16, llgroup.GroupMemberOffset)
- #ptr = self.gcheaderbuilder.object_from_header(addr.ptr)
- #prebuilt_hash = lltype.identityhash_nocache(ptr)
- #assert prebuilt_hash != 0 # xxx probably good enough
- ##
- #hdr = llmemory.cast_adr_to_ptr(addr, lltype.Ptr(self.HDR))
- #hdr._obj._name = typeid16.index # debug only
- #hdr._obj.typeid16 = typeid16
- #hdr._obj.prebuilt_hash = prebuilt_hash
diff --git a/rpython/translator/c/src/qcgc/object.h b/rpython/translator/c/src/qcgc/object.h
--- a/rpython/translator/c/src/qcgc/object.h
+++ b/rpython/translator/c/src/qcgc/object.h
@@ -7,7 +7,6 @@
#define QCGC_GRAY_FLAG (1<<0)
#define QCGC_PREBUILT_OBJECT (1<<1)
#define QCGC_PREBUILT_REGISTERED (1<<2)
-#define QCGC_FIRST_AVAILABLE_FLAG (1<<3) // The first flag clients may use
typedef struct object_s {
uint32_t flags;
More information about the pypy-commit
mailing list