Fixing bugs in GC

This commit is contained in:
Alexey Andreev 2016-09-08 23:20:07 +03:00
parent d76598ab68
commit 593dafdd73
4 changed files with 17 additions and 9 deletions

View File

@ -244,9 +244,10 @@ public final class WasmRuntime {
}
public static Address allocStack(int size) {
Address result = stack;
stack = stack.add((size + 1) << 2);
stack.add(-4).putInt(size);
Address result = stack.add(4);
stack = result.add(size << 2);
fillZero(result, size << 2);
stack.putInt(size);
return result;
}
@ -256,7 +257,11 @@ public final class WasmRuntime {
public static Address getNextStackRoots(Address address) {
int size = address.getInt() + 1;
return address.add(-size * 4);
Address result = address.add(-size * 4);
if (result == initStack()) {
result = null;
}
return result;
}
public static int getStackRootCount(Address address) {

View File

@ -906,8 +906,10 @@ class WasmGenerationVisitor implements StatementVisitor, ExprVisitor {
}
int offset = classGenerator.getFieldOffset(new FieldReference(WasmRuntime.class.getName(), "stack"));
result = new WasmStoreInt32(4, new WasmInt32Constant(offset), new WasmGetLocal(stackVariable),
WasmInt32Subtype.INT32);
WasmExpression oldValue = new WasmGetLocal(stackVariable);
oldValue = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.SUB, oldValue,
new WasmInt32Constant(4));
result = new WasmStoreInt32(4, new WasmInt32Constant(offset), oldValue, WasmInt32Subtype.INT32);
}
private void generateRegisterGcRoot(Expr slotExpr, Expr gcRootExpr) {

View File

@ -98,8 +98,7 @@ public class ClassInitializerTransformer {
InvokeInstruction checkInitialized = new InvokeInstruction();
checkInitialized.setType(InvocationType.SPECIAL);
checkInitialized.setMethod(new MethodReference(Allocator.class, "isInitialized",
Class.class, boolean.class));
checkInitialized.setMethod(new MethodReference(Allocator.class, "isInitialized", Class.class, boolean.class));
checkInitialized.getArguments().add(clsVariable);
checkInitialized.setReceiver(initializedVariable);
block.getInstructions().add(checkInitialized);

View File

@ -33,7 +33,9 @@ public final class Allocator {
}
public static Address allocateArray(RuntimeClass tag, int size) {
int sizeInBytes = tag.itemType.size * size + Structure.sizeOf(RuntimeArray.class);
int itemSize = (tag.itemType.flags & RuntimeClass.PRIMITIVE) != 0 ? tag.itemType.size : 4;
int sizeInBytes = Address.align(Address.fromInt(Structure.sizeOf(RuntimeArray.class)), itemSize).toInt();
sizeInBytes += itemSize * size;
sizeInBytes = Address.align(Address.fromInt(sizeInBytes), 4).toInt();
Address result = GC.alloc(sizeInBytes).toAddress();
fillZero(result, sizeInBytes);