1

implement garbage collection

This commit is contained in:
Christoph
2021-08-31 15:19:02 +02:00
parent e7576694e8
commit b9fbc45494
9 changed files with 228 additions and 128 deletions

View File

@ -4,33 +4,36 @@ from interpreter import Interpreter
def test_reassignment_gc():
ast = parse("""
true
x = 2
y = 3
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
interpreter.space.gc(w_model)
x = w_model.getvalue("x")
y = w_model.getvalue("y")
assert x in interpreter.space.realm # Wo alle Objekte leben
assert y in interpreter.space.realm
assert x in interpreter.space.objects
assert y in interpreter.space.objects
ast = parse("""
x = y
""")
interpreter.eval(ast, w_model)
interpreter.space.gc()
assert x not in interpreter.space.realm
assert y in interpreter.space.realm
interpreter.space.gc(w_model)
assert x not in interpreter.space.objects
assert y in interpreter.space.objects
ast = parse("""
x = 0
y = 0
""")
interpreter.eval(ast, w_model)
interpreter.space.gc()
assert x not in interpreter.space.realm
assert y not in interpreter.space.realm
interpreter.space.gc(w_model)
assert x not in interpreter.space.objects
assert y not in interpreter.space.objects
def test_chain_gc():
@ -42,40 +45,25 @@ z = y
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
interpreter.space.gc(w_model)
x = w_model.getvalue("x")
assert x in interpreter.space.realm
assert x in interpreter.space.objects
ast = parse("""
x = 0
""")
interpreter.eval(ast, w_model)
interpreter.space.gc()
assert x in interpreter.space.realm
interpreter.space.gc(w_model)
assert x in interpreter.space.objects
ast = parse("""
y = x
z = y
""")
interpreter.eval(ast, w_model)
interpreter.space.gc()
assert x not in interpreter.space.realm
def test_while_gc():
ast = parse("""
x = 10
while x:
x = x $int_add(-1)
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
count = len(interpreter.space.realm)
interpreter.space.gc()
assert count - len(interpreter.space.realm) == 10
interpreter.space.gc(w_model)
assert x not in interpreter.space.objects
def test_object_gc():
@ -88,19 +76,76 @@ object x:
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
interpreter.space.gc(w_model)
a = w_model.getvalue("x").getvalue("a")
b = w_model.getvalue("x").getvalue("b")
c = w_model.getvalue("x").getvalue("c")
assert a in interpreter.space.realm
assert b in interpreter.space.realm
assert c in interpreter.space.realm
x = w_model.getvalue("x")
assert a in interpreter.space.objects
assert b in interpreter.space.objects
assert c in interpreter.space.objects
assert x in interpreter.space.objects
ast = parse("""
x = 0
""")
interpreter.eval(ast, w_model)
interpreter.space.gc()
assert a not in interpreter.space.realm
assert b not in interpreter.space.realm
assert c not in interpreter.space.realm
interpreter.space.gc(w_model)
assert a not in interpreter.space.objects
assert b not in interpreter.space.objects
assert c not in interpreter.space.objects
assert x not in interpreter.space.objects
def test_method_gc():
ast = parse("""
def meth:
1
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
interpreter.space.gc(w_model)
meth = w_model.getvalue("meth")
assert meth in interpreter.space.objects
ast = parse("""
def meth:
2
""")
interpreter.eval(ast, w_model)
assert meth in interpreter.space.objects
interpreter.space.gc(w_model)
assert meth not in interpreter.space.objects
def test_simple_call_gc():
ast = parse("""
x = 1
gc
""")
interpreter = Interpreter()
w_model = interpreter.make_module()
interpreter.eval(ast, w_model)
x = w_model.getvalue("x")
assert x in interpreter.space.objects
ast = parse("""
x = 2
""")
interpreter.eval(ast, w_model)
assert x in interpreter.space.objects
ast = parse("""
gc
""")
interpreter.eval(ast, w_model)
assert x not in interpreter.space.objects