Author: Remi Meier <remi.me...@gmail.com> Branch: weakref Changeset: r411:ff8c751610ca Date: 2013-07-18 15:41 +0200 http://bitbucket.org/pypy/stmgc/changeset/ff8c751610ca/
Log: clean it up a bit diff --git a/c4/steal.c b/c4/steal.c --- a/c4/steal.c +++ b/c4/steal.c @@ -26,39 +26,47 @@ if (obj->h_tid & GCFLAG_IMMUTABLE) { assert(!(obj->h_tid & GCFLAG_PRIVATE_FROM_PROTECTED)); + if (obj->h_tid & GCFLAG_PUBLIC) { + /* young public */ + assert(obj->h_tid & GCFLAG_NURSERY_MOVED); + assert(IS_POINTER(obj->h_revision)); + stub = (gcptr)obj->h_revision; + goto done; + } + /* old or young protected! mark as PUBLIC */ - if (!(obj->h_tid & GCFLAG_PUBLIC)) { - if (!(obj->h_tid & GCFLAG_OLD)) { - gcptr O; + if (!(obj->h_tid & GCFLAG_OLD)) { + /* young protected */ + gcptr O; + + if (obj->h_tid & GCFLAG_HAS_ID) { + /* use id-copy for us */ + O = (gcptr)obj->h_original; + obj->h_tid &= ~GCFLAG_HAS_ID; + stm_copy_to_old_id_copy(obj, O); + O->h_original = 0; + } else { + O = stmgc_duplicate_old(obj); - if (obj->h_tid & GCFLAG_HAS_ID) { - /* use id-copy for us */ - O = (gcptr)obj->h_original; - obj->h_tid &= ~GCFLAG_HAS_ID; - stm_copy_to_old_id_copy(obj, O); - O->h_original = 0; - } else { - O = stmgc_duplicate_old(obj); - - /* young and without original? */ - if (!(obj->h_original)) - obj->h_original = (revision_t)O; - } - obj->h_revision = (revision_t)O; - - O->h_tid |= GCFLAG_PUBLIC; - obj->h_tid |= (GCFLAG_NURSERY_MOVED | GCFLAG_PUBLIC); - /* here it is fine if it stays in read caches because - the object is immutable anyway and there are no - write_barriers allowed. */ - - dprintf(("steal prot immutable -> public: %p | %p\n", obj, O)); - stub = O; - goto done; + /* young and without original? */ + if (!(obj->h_original)) + obj->h_original = (revision_t)O; } - dprintf(("prot immutable -> public: %p\n", obj)); - obj->h_tid |= GCFLAG_PUBLIC; + obj->h_revision = (revision_t)O; + + O->h_tid |= GCFLAG_PUBLIC; + obj->h_tid |= (GCFLAG_NURSERY_MOVED | GCFLAG_PUBLIC); + /* here it is fine if it stays in read caches because + the object is immutable anyway and there are no + write_barriers allowed. */ + dprintf(("steal prot immutable -> public: %p -> %p\n", obj, O)); + stub = O; + goto done; } + /* old protected: */ + dprintf(("prot immutable -> public: %p\n", obj)); + obj->h_tid |= GCFLAG_PUBLIC; + return; } _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit