def test_interned(self): salt = uuid4().hex def make_string(): # We need to actually create a new string so that it has refcount # one. We use a uuid so that we know the string could not already # be in the intern table. return ''.join(('testing: ', salt)) # This should work, the string has one reference on the stack. move_into_mutable_buffer(make_string()) refcount = [None] # nonlocal def ref_capture(ob): # Subtract two because those are the references owned by this # frame: # 1. The local variables of this stack frame. # 2. The python data stack of this stack frame. refcount[0] = sys.getrefcount(ob) - 2 return ob with pytest.raises(BadMove): # If we intern the string it will still have one reference but now # it is in the intern table so if other people intern the same # string while the mutable buffer holds the first string they will # be the same instance. move_into_mutable_buffer(ref_capture(intern(make_string()))) # noqa assert refcount[0] == 1