Skip to content

Commit

Permalink
Simplify and fix tests
Browse files Browse the repository at this point in the history
  • Loading branch information
fniephaus committed Jan 4, 2025
1 parent 3eb81fa commit badb24f
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 89 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,7 @@
import org.graalvm.polyglot.Context;
import org.graalvm.polyglot.Context.Builder;

import com.oracle.truffle.api.Truffle;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.IndirectCallNode;

import de.hpi.swa.trufflesqueak.SqueakImage;
import de.hpi.swa.trufflesqueak.exceptions.ProcessSwitch;
Expand All @@ -25,13 +24,13 @@
import de.hpi.swa.trufflesqueak.image.SqueakImageContext;
import de.hpi.swa.trufflesqueak.model.AbstractSqueakObject;
import de.hpi.swa.trufflesqueak.model.CompiledCodeObject;
import de.hpi.swa.trufflesqueak.model.ContextObject;
import de.hpi.swa.trufflesqueak.model.NilObject;
import de.hpi.swa.trufflesqueak.model.PointersObject;
import de.hpi.swa.trufflesqueak.nodes.ExecuteTopLevelContextNode;
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive1;
import de.hpi.swa.trufflesqueak.nodes.primitives.Primitive.Primitive4;
import de.hpi.swa.trufflesqueak.nodes.primitives.PrimitiveNodeFactory;
import de.hpi.swa.trufflesqueak.shared.SqueakLanguageConfig;
import de.hpi.swa.trufflesqueak.shared.SqueakLanguageOptions;
import de.hpi.swa.trufflesqueak.util.ArrayUtils;
import de.hpi.swa.trufflesqueak.util.FrameAccess;

public abstract class AbstractSqueakTestCase {
Expand Down Expand Up @@ -66,38 +65,15 @@ private static CompiledCodeObject makeMethod(final int... intbytes) {
}

protected static final Object runMethod(final CompiledCodeObject code, final Object receiver, final Object... arguments) {
final VirtualFrame frame = createTestFrame(code);
Object result = null;
try {
result = createContext(code, receiver, arguments).execute(frame);
result = IndirectCallNode.getUncached().call(code.getCallTarget(), FrameAccess.newWith(NilObject.SINGLETON, null, receiver, arguments));
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
}
return result;
}

protected static final ExecuteTopLevelContextNode createContext(final CompiledCodeObject code, final Object receiver) {
return createContext(code, receiver, ArrayUtils.EMPTY_ARRAY);
}

protected static final ExecuteTopLevelContextNode createContext(final CompiledCodeObject code, final Object receiver, final Object[] arguments) {
final ContextObject testContext = ContextObject.create(image, code.getSqueakContextSize());
testContext.setReceiver(receiver);
testContext.setCodeObject(code);
testContext.setInstructionPointer(code.getInitialPC());
testContext.setStackPointer(0);
testContext.removeSender();
for (final Object argument : arguments) {
testContext.push(argument);
}
// Initialize temporary variables with nil in newContext.
final int numTemps = code.getNumTemps();
for (int i = 0; i < numTemps - arguments.length; i++) {
testContext.push(NilObject.SINGLETON);
}
return ExecuteTopLevelContextNode.create(image, null, testContext, false);
}

protected static final Object runMethod(final Object receiver, final int... intbytes) {
return runMethod(receiver, new AbstractSqueakObject[0], intbytes);
}
Expand All @@ -106,22 +82,12 @@ protected static final Object runMethod(final Object receiver, final Object[] ar
return runMethod(makeMethod(intbytes), receiver, arguments);
}

protected static final Object runBinaryPrimitive(final int primCode, final Object rcvr, final Object... arguments) {
return runPrim(17104899, new Object[0], primCode, rcvr, arguments);
}

protected static final Object runQuinaryPrimitive(final int primCode, final Object rcvr, final Object... arguments) {
return runPrim(68222979, new Object[0], primCode, rcvr, arguments);
}

protected static final Object runPrim(final int header, final Object[] literals, final int primCode, final Object rcvr, final Object... arguments) {
final CompiledCodeObject method = makeMethod(header, literals, 139, primCode & 0xFF, (primCode & 0xFF00) >> 8);
return runMethod(method, rcvr, arguments);
protected static final Object runPrimitive(final int primCode, final Object rcvr, final Object arg1) {
return ((Primitive1) PrimitiveNodeFactory.getOrCreateIndexed(primCode, 2)).execute(null, rcvr, arg1);
}

protected static final VirtualFrame createTestFrame(final CompiledCodeObject code) {
final Object[] arguments = FrameAccess.newWith(NilObject.SINGLETON, null, NilObject.SINGLETON);
return Truffle.getRuntime().createVirtualFrame(arguments, code.getFrameDescriptor());
protected static final Object runPrimitive(final int primCode, final Object rcvr, final Object arg1, final Object arg2, final Object arg3, final Object arg4) {
return ((Primitive4) PrimitiveNodeFactory.getOrCreateIndexed(primCode, 5)).execute(null, rcvr, arg1, arg2, arg3, arg4);
}

protected static final SqueakImage loadImageContext(final String imagePath) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@

import org.junit.Test;

import com.oracle.truffle.api.frame.VirtualFrame;

import de.hpi.swa.trufflesqueak.exceptions.ProcessSwitch;
import de.hpi.swa.trufflesqueak.exceptions.Returns.NonLocalReturn;
import de.hpi.swa.trufflesqueak.exceptions.Returns.NonVirtualReturn;
Expand All @@ -31,7 +29,6 @@
import de.hpi.swa.trufflesqueak.model.NilObject;
import de.hpi.swa.trufflesqueak.model.layout.ObjectLayouts.ASSOCIATION;
import de.hpi.swa.trufflesqueak.model.layout.ObjectLayouts.CONTEXT;
import de.hpi.swa.trufflesqueak.nodes.ExecuteTopLevelContextNode;
import de.hpi.swa.trufflesqueak.nodes.accessing.SqueakObjectAt0Node;
import de.hpi.swa.trufflesqueak.nodes.accessing.SqueakObjectSizeNode;
import de.hpi.swa.trufflesqueak.util.ArrayUtils;
Expand All @@ -56,9 +53,8 @@ public void testPopAndPushTemporaryLocations() {
for (int i = 0; i < 8; i++) {
// push true, popIntoTemp i, pushTemp i, returnTop
final CompiledCodeObject method = makeMethod(header, literals, 113, 104 + i, 16 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(BooleanObject.TRUE, result);
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
Expand All @@ -75,9 +71,8 @@ public void testPushLiteralConstants() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < numTestObjects; i++) {
final CompiledCodeObject method = makeMethod(header, expectedResults, bytecodeStart + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(expectedResults[i], result);
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
Expand All @@ -94,9 +89,8 @@ public void testPushLiteralVariables() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < numTestObjects; i++) {
final CompiledCodeObject method = makeMethod(header, expectedResults, bytecodeStart + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(BooleanObject.FALSE, result);
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
Expand Down Expand Up @@ -181,10 +175,8 @@ public void testExtendedPushTemporaryVariables() {
for (int i = 0; i < maxNumTemps; i++) {
// push true, popIntoTemp i, pushTemp i, returnTop
final CompiledCodeObject method = makeMethod(header, new Object[0], 113, 130, 64 + i, 128, 64 + i, 124);
final VirtualFrame frame = createTestFrame(method);
final ExecuteTopLevelContextNode executeContextNode = createContext(method, rcvr);
try {
assertSame(BooleanObject.TRUE, executeContextNode.execute(frame));
assertSame(BooleanObject.TRUE, runMethod(method, rcvr));
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
}
Expand All @@ -199,9 +191,8 @@ public void testExtendedPushLiteralConstants() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < numTestObjects; i++) {
final CompiledCodeObject method = makeMethod(header, expectedResults, 128, 128 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(expectedResults[i], result);
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
Expand All @@ -217,9 +208,8 @@ public void testExtendedPushLiteralVariables() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < numTestObjects; i++) {
final CompiledCodeObject method = makeMethod(header, expectedResults, 128, 192 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(BooleanObject.FALSE, result);
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
Expand Down Expand Up @@ -248,9 +238,8 @@ public void testExtendedStoreIntoTemporaryVariables() {
for (int i = 0; i < maxNumTemps; i++) {
// push true, push 1, storeIntoTemp i, pop, pushTemp i, returnTop
final CompiledCodeObject method = makeMethod(header, new Object[0], 113, 118, 129, 64 + i, 135, 128, 64 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
assertSame(1L, createContext(method, rcvr).execute(frame));
assertSame(1L, runMethod(method, rcvr));
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
}
Expand All @@ -270,9 +259,8 @@ public void testExtendedStoreIntoAssociation() {
for (int i = 0; i < numTestObjects; i++) {
// push true, storeIntoLiteral i, returnTop
final CompiledCodeObject method = makeMethod(header, literalsList.toArray(), 113, 129, 192 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(BooleanObject.TRUE, result);
final ArrayObject literal = (ArrayObject) method.getLiteral(i);
assertSame(BooleanObject.TRUE, literal.getObject(ASSOCIATION.VALUE));
Expand Down Expand Up @@ -304,9 +292,8 @@ public void testExtendedPopIntoTemporaryVariables() {
for (int i = 0; i < maxNumTemps; i++) {
// push true, push 1, popIntoTemp i, pushTemp i, quickReturnTop
final CompiledCodeObject method = makeMethod(header, literals, 113, 118, 130, 64 + i, 128, 64 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
assertSame(1L, createContext(method, rcvr).execute(frame));
assertSame(1L, runMethod(method, rcvr));
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
}
Expand All @@ -326,9 +313,8 @@ public void testExtendedPopIntoLiteralVariables() {
for (int i = 0; i < maxNumLiterals; i++) {
// push rcvr, push true, popIntoLiteral i, returnTop
final CompiledCodeObject method = makeMethod(header, literalsList.toArray(), 112, 113, 130, 192 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(rcvr, result);
final ArrayObject literal = (ArrayObject) method.getLiteral(i);
assertSame(BooleanObject.TRUE, literal.getObject(ASSOCIATION.VALUE));
Expand Down Expand Up @@ -359,9 +345,8 @@ public void testDoubleExtendedPushLiteralConstants() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < numTestObjects; i++) {
final CompiledCodeObject method = makeMethod(header, expectedResults, 132, 96, i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(expectedResults[i], result);
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
Expand All @@ -377,9 +362,8 @@ public void testDoubleExtendedPushLiteralVariables() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < numTestObjects; i++) {
final CompiledCodeObject method = makeMethod(header, expectedResults, 132, 128, i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(BooleanObject.FALSE, result);
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
Expand Down Expand Up @@ -426,9 +410,8 @@ public void testDoubleExtendedStoreIntoAssociation() {
for (int i = 0; i < numberOfAssociations; i++) {
// push true, storeIntoLiteral i, returnTop
final CompiledCodeObject method = makeMethod(header, literalsList.toArray(), 113, 132, 224, i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(BooleanObject.TRUE, result);
final ArrayObject literal = (ArrayObject) method.getLiteral(i);
assertSame(BooleanObject.TRUE, literal.getObject(ASSOCIATION.VALUE));
Expand All @@ -444,7 +427,7 @@ public void testDoubleExtendedStoreIntoAssociation() {
public void testPop() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
// push true, push false, pop, return top
assertSame(runMethod(rcvr, 113, 114, 135, 124), BooleanObject.TRUE);
assertSame(BooleanObject.TRUE, runMethod(rcvr, 113, 114, 135, 124));
}

@Test
Expand Down Expand Up @@ -486,7 +469,7 @@ public void testPushNewArray() {

@Test
public void testCallPrimitive() {
assertEquals(2L, runBinaryPrimitive(1, 1L, 1L));
assertEquals(2L, runPrimitive(1, 1L, 1L));
}

@Test
Expand All @@ -507,9 +490,8 @@ public void testPushRemoteTemp() {
// push true, pushNewArray (size 1 and pop), popIntoTemp 2, pushRemoteTemp
// (at(0), temp 2), returnTop
final CompiledCodeObject method = makeMethod(header, literals, 113, 138, 128 + 1, 104 + 2, 140, 0, 2, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertSame(BooleanObject.TRUE, result);
} catch (NonLocalReturn | NonVirtualReturn | ProcessSwitch e) {
fail("broken test");
Expand All @@ -525,9 +507,8 @@ public void testStoreRemoteTemp() {
// storeIntoRemoteTemp (0, temp 3), storeIntoRemoteTemp (1, temp 3), pushTemp 3,
// returnTop
final CompiledCodeObject method = makeMethod(header, literals, 138, 2, 104 + 3, 113, 114, 141, 0, 3, 141, 1, 3, 19, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertTrue(result instanceof ArrayObject);
final ArrayObject resultList = (ArrayObject) result;
assertEquals(2, SqueakObjectSizeNode.executeUncached(resultList));
Expand All @@ -547,9 +528,8 @@ public void testStoreAndPopRemoteTemp() {
// storeIntoRemoteTemp (0, temp 3), storeIntoRemoteTemp (1, temp 3), pushTemp 3,
// returnTop
final CompiledCodeObject method = makeMethod(header, literals, 138, 2, 104 + 3, 113, 114, 142, 0, 3, 142, 1, 3, 19, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertTrue(result instanceof ArrayObject);
final ArrayObject resultList = (ArrayObject) result;
assertEquals(2, SqueakObjectSizeNode.executeUncached(resultList));
Expand All @@ -566,8 +546,7 @@ public void testPushClosure() {
final Object[] literals = {NilObject.SINGLETON, NilObject.SINGLETON};
final long rcvr = 1L;
final CompiledCodeObject method = makeMethod(2, literals, 0x8F, 0x02, 0x00, 0x04, 0x10, 0x11, 0xB0, 0x7D, 0x7C);
final VirtualFrame frame = createTestFrame(method);
final Object result = createContext(method, rcvr).execute(frame);
final Object result = runMethod(method, rcvr);
assertTrue(result instanceof BlockClosureObject);
final BlockClosureObject closure = (BlockClosureObject) result;
assertEquals(2, closure.getNumArgs());
Expand Down
Loading

0 comments on commit badb24f

Please sign in to comment.