Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r957:65ff01990d5d Date: 2014-03-05 09:36 +0100 http://bitbucket.org/pypy/stmgc/changeset/65ff01990d5d/
Log: Forgot to add in 8185ee16c279 diff --git a/c7/stm/hash_id.c b/c7/stm/hash_id.c new file mode 100644 --- /dev/null +++ b/c7/stm/hash_id.c @@ -0,0 +1,69 @@ +#ifndef _STM_CORE_H_ +# error "must be compiled via stmgc.c" +#endif + + +static long mangle_hash(long i) +{ + /* To hash pointers in dictionaries. Assumes that i shows some + alignment (to 8, 16, maybe 32 bytes), so we use the following + formula to avoid the trailing bits being always 0. */ + return i ^ (i >> 5); +} + +static long id_or_identityhash(object_t *obj, bool is_hash) +{ + long result; + + if (obj != NULL) { + if (_is_in_nursery(obj)) { + abort();//obj = find_shadow(obj); + } + else if (is_hash) { + if (obj->stm_flags & GCFLAG_HAS_SHADOW) { + + /* For identityhash(), we need a special case for some + prebuilt objects: their hash must be the same before + and after translation. It is stored as an extra word + after the object. But we cannot use it for id() + because the stored value might clash with a real one. + */ + struct object_s *realobj = (struct object_s *) + REAL_ADDRESS(STM_SEGMENT->segment_base, obj); + size_t size = stmcb_size_rounded_up(realobj); + result = *(long *)(((char *)realobj) + size); + /* Important: the returned value is not mangle_hash()ed! */ + return result; + } + } + } + + result = (long)(uintptr_t)obj; + if (is_hash) { + result = mangle_hash(result); + } + return result; +} + +long stm_id(object_t *obj) +{ + return id_or_identityhash(obj, false); +} + +long stm_identityhash(object_t *obj) +{ + return id_or_identityhash(obj, true); +} + +void stm_set_prebuilt_identityhash(object_t *obj, uint64_t hash) +{ + struct object_s *realobj = (struct object_s *) + REAL_ADDRESS(stm_object_pages, obj); + + assert(realobj->stm_flags == GCFLAG_WRITE_BARRIER); + realobj->stm_flags |= GCFLAG_HAS_SHADOW; + + size_t size = stmcb_size_rounded_up(realobj); + assert(*(long *)(((char *)realobj) + size) == 0); + *(long *)(((char *)realobj) + size) = hash; +} _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit