Skip to content

Commit

Permalink
Merge method and block into CompiledCodeObject
Browse files Browse the repository at this point in the history
  • Loading branch information
fniephaus committed Jul 2, 2020
1 parent 1649750 commit 1a49ae5
Show file tree
Hide file tree
Showing 48 changed files with 561 additions and 675 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
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.CompiledMethodObject;
import de.hpi.swa.trufflesqueak.model.ContextObject;
import de.hpi.swa.trufflesqueak.model.NilObject;
import de.hpi.swa.trufflesqueak.model.PointersObject;
Expand All @@ -41,11 +40,11 @@ public abstract class AbstractSqueakTestCase {
protected static SqueakImageContext image;
protected static PointersObject nilClassBinding;

protected static CompiledMethodObject makeMethod(final byte[] bytes, final Object[] literals) {
return new CompiledMethodObject(image, bytes, literals);
protected static CompiledCodeObject makeMethod(final byte[] bytes, final Object[] literals) {
return new CompiledCodeObject(image, bytes, literals, image.compiledMethodClass);
}

protected static CompiledMethodObject makeMethod(final Object[] literals, final int... intbytes) {
protected static CompiledCodeObject makeMethod(final Object[] literals, final int... intbytes) {
final byte[] bytes = new byte[intbytes.length + 1];
for (int i = 0; i < intbytes.length; i++) {
bytes[i] = (byte) intbytes[i];
Expand All @@ -61,11 +60,11 @@ protected static long makeHeader(final int numArgs, final int numTemps, final in
return CompiledCodeObject.makeHeader(numArgs, numTemps, numLiterals, hasPrimitive, needsLargeFrame);
}

protected CompiledMethodObject makeMethod(final int... intbytes) {
protected CompiledCodeObject makeMethod(final int... intbytes) {
return makeMethod(new Object[]{makeHeader(0, 5, 14, false, true), nilClassBinding}, intbytes);
}

protected static Object runMethod(final CompiledMethodObject code, final Object receiver, final Object... arguments) {
protected static Object runMethod(final CompiledCodeObject code, final Object receiver, final Object... arguments) {
final VirtualFrame frame = createTestFrame(code);
Object result = null;
try {
Expand All @@ -76,11 +75,11 @@ protected static Object runMethod(final CompiledMethodObject code, final Object
return result;
}

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

protected static ExecuteTopLevelContextNode createContext(final CompiledMethodObject code, final Object receiver, final Object[] arguments) {
protected static ExecuteTopLevelContextNode createContext(final CompiledCodeObject code, final Object receiver, final Object[] arguments) {
final ContextObject testContext = ContextObject.create(image, code.getSqueakContextSize());
testContext.setReceiver(receiver);
testContext.setMethod(code);
Expand All @@ -103,7 +102,7 @@ protected Object runMethod(final Object receiver, final int... intbytes) {
}

protected Object runMethod(final Object receiver, final Object[] arguments, final int... intbytes) {
final CompiledMethodObject method = makeMethod(intbytes);
final CompiledCodeObject method = makeMethod(intbytes);
return runMethod(method, receiver, arguments);
}

Expand All @@ -116,11 +115,11 @@ protected Object runQuinaryPrimitive(final int primCode, final Object rcvr, fina
}

protected Object runPrim(final Object[] literals, final int primCode, final Object rcvr, final Object... arguments) {
final CompiledMethodObject method = makeMethod(literals, new int[]{139, primCode & 0xFF, (primCode & 0xFF00) >> 8});
final CompiledCodeObject method = makeMethod(literals, new int[]{139, primCode & 0xFF, (primCode & 0xFF00) >> 8});
return runMethod(method, rcvr, arguments);
}

protected static VirtualFrame createTestFrame(final CompiledMethodObject code) {
protected static VirtualFrame createTestFrame(final CompiledCodeObject code) {
final Object[] arguments = FrameAccess.newWith(code, NilObject.SINGLETON, null, new Object[]{NilObject.SINGLETON});
return Truffle.getRuntime().createVirtualFrame(arguments, code.getFrameDescriptor());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ public static void setUpSqueakImageContext() {
image.specialObjectsArray.setStorage(dummySpecialObjects);
image.specialObjectsArray.setSqueakClass(image.arrayClass);
dummySpecialSelectors.setSqueakClass(image.arrayClass);
/* Ensure compiledBlock class is set to distinguish between methods and blocks. */
image.setCompiledBlockClass(new ClassObject(image));

image.setByteSymbolClass(new ClassObject(image));
setupMeta(image.metaClass, new Object[]{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@
import de.hpi.swa.trufflesqueak.model.ArrayObject;
import de.hpi.swa.trufflesqueak.model.BlockClosureObject;
import de.hpi.swa.trufflesqueak.model.BooleanObject;
import de.hpi.swa.trufflesqueak.model.CompiledBlockObject;
import de.hpi.swa.trufflesqueak.model.CompiledMethodObject;
import de.hpi.swa.trufflesqueak.model.CompiledCodeObject;
import de.hpi.swa.trufflesqueak.model.NativeObject;
import de.hpi.swa.trufflesqueak.model.NilObject;
import de.hpi.swa.trufflesqueak.model.layout.ObjectLayouts.ASSOCIATION;
Expand Down Expand Up @@ -58,7 +57,7 @@ public void testPopAndPushTemporaryLocations() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < 8; i++) {
// push true, popIntoTemp i, pushTemp i, returnTop
final CompiledMethodObject method = makeMethod(literals, 113, 104 + i, 16 + i, 124);
final CompiledCodeObject method = makeMethod(literals, 113, 104 + i, 16 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
Expand All @@ -77,7 +76,7 @@ public void testPushLiteralConstants() {
literalsList.addAll(Arrays.asList(expectedResults));
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < expectedResults.length; i++) {
final CompiledMethodObject method = makeMethod(literalsList.toArray(), bytecodeStart + i, 124);
final CompiledCodeObject method = makeMethod(literalsList.toArray(), bytecodeStart + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
Expand All @@ -96,7 +95,7 @@ public void testPushLiteralVariables() {
literalsList.addAll(Arrays.asList(expectedResults));
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < 32; i++) {
final CompiledMethodObject method = makeMethod(literalsList.toArray(), bytecodeStart + i, 124);
final CompiledCodeObject method = makeMethod(literalsList.toArray(), bytecodeStart + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
Expand Down Expand Up @@ -185,7 +184,7 @@ public void testExtendedPushTemporaryVariables() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < maxNumTemps; i++) {
// push true, popIntoTemp i, pushTemp i, returnTop
final CompiledMethodObject method = makeMethod(literals, 113, 130, 64 + i, 128, 64 + i, 124);
final CompiledCodeObject method = makeMethod(literals, 113, 130, 64 + i, 128, 64 + i, 124);
final VirtualFrame frame = createTestFrame(method);
final ExecuteTopLevelContextNode executeContextNode = createContext(method, rcvr);
try {
Expand All @@ -203,7 +202,7 @@ public void testExtendedPushLiteralConstants() {
literalsList.addAll(Arrays.asList(expectedResults));
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < expectedResults.length; i++) {
final CompiledMethodObject method = makeMethod(literalsList.toArray(), 128, 128 + i, 124);
final CompiledCodeObject method = makeMethod(literalsList.toArray(), 128, 128 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
Expand All @@ -221,7 +220,7 @@ public void testExtendedPushLiteralVariables() {
literalsList.addAll(Arrays.asList(expectedResults));
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < expectedResults.length; i++) {
final CompiledMethodObject method = makeMethod(literalsList.toArray(), 128, 192 + i, 124);
final CompiledCodeObject method = makeMethod(literalsList.toArray(), 128, 192 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
Expand Down Expand Up @@ -252,7 +251,7 @@ public void testExtendedStoreIntoTemporaryVariables() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < maxNumTemps; i++) {
// push true, push 1, storeIntoTemp i, pop, pushTemp i, returnTop
final CompiledMethodObject method = makeMethod(literals, 113, 118, 129, 64 + i, 135, 128, 64 + i, 124);
final CompiledCodeObject method = makeMethod(literals, 113, 118, 129, 64 + i, 135, 128, 64 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
assertSame(1L, createContext(method, rcvr).execute(frame));
Expand All @@ -275,7 +274,7 @@ public void testExtendedStoreIntoAssociation() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < 64; i++) {
// push true, storeIntoLiteral i, returnTop
final CompiledMethodObject method = makeMethod(literalsList.toArray(), 113, 129, 192 + i, 124);
final CompiledCodeObject method = makeMethod(literalsList.toArray(), 113, 129, 192 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
Expand Down Expand Up @@ -308,7 +307,7 @@ public void testExtendedPopIntoTemporaryVariables() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < maxNumTemps; i++) {
// push true, push 1, popIntoTemp i, pushTemp i, quickReturnTop
final CompiledMethodObject method = makeMethod(literals, 113, 118, 130, 64 + i, 128, 64 + i, 124);
final CompiledCodeObject method = makeMethod(literals, 113, 118, 130, 64 + i, 128, 64 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
assertSame(1L, createContext(method, rcvr).execute(frame));
Expand All @@ -329,7 +328,7 @@ public void testExtendedPopIntoLiteralVariables() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < maxNumLiterals; i++) {
// push rcvr, push true, popIntoLiteral i, returnTop
final CompiledMethodObject method = makeMethod(literalsList.toArray(), 112, 113, 130, 192 + i, 124);
final CompiledCodeObject method = makeMethod(literalsList.toArray(), 112, 113, 130, 192 + i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
Expand Down Expand Up @@ -362,7 +361,7 @@ public void testDoubleExtendedPushLiteralConstants() {
literalsList.addAll(Arrays.asList(expectedResults));
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < expectedResults.length; i++) {
final CompiledMethodObject method = makeMethod(literalsList.toArray(), 132, 96, i, 124);
final CompiledCodeObject method = makeMethod(literalsList.toArray(), 132, 96, i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
Expand All @@ -380,7 +379,7 @@ public void testDoubleExtendedPushLiteralVariables() {
literalsList.addAll(Arrays.asList(expectedResults));
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < expectedResults.length; i++) {
final CompiledMethodObject method = makeMethod(literalsList.toArray(), 132, 128, i, 124);
final CompiledCodeObject method = makeMethod(literalsList.toArray(), 132, 128, i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
Expand Down Expand Up @@ -430,7 +429,7 @@ public void testDoubleExtendedStoreIntoAssociation() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
for (int i = 0; i < numberOfAssociations; i++) {
// push true, storeIntoLiteral i, returnTop
final CompiledMethodObject method = makeMethod(literalsList.toArray(), 113, 132, 224, i, 124);
final CompiledCodeObject method = makeMethod(literalsList.toArray(), 113, 132, 224, i, 124);
final VirtualFrame frame = createTestFrame(method);
try {
final Object result = createContext(method, rcvr).execute(frame);
Expand Down Expand Up @@ -466,7 +465,7 @@ public void testPushNewArray() {
final SqueakObjectAt0Node at0Node = SqueakObjectAt0Node.create();
final SqueakObjectSizeNode sizeNode = SqueakObjectSizeNode.create();
// pushNewArray (size 127), returnTop
CompiledMethodObject method = makeMethod(new Object[]{makeHeader(0, 0, 0, false, true)}, 138, 127, 124);
CompiledCodeObject method = makeMethod(new Object[]{makeHeader(0, 0, 0, false, true)}, 138, 127, 124);
Object result = runMethod(method, rcvr);
assertTrue(result instanceof ArrayObject);
ArrayObject resultList = (ArrayObject) result;
Expand Down Expand Up @@ -502,7 +501,7 @@ public void testCallPrimitiveFailure() {
final long rcvr = 1L;
final NativeObject argument = image.asByteString("foo");
// similar to SmallInteger>>#+ callPrimitive 1, returnTop
final CompiledMethodObject method = makeMethod(new Object[]{makeHeader(1, 1, 0, true, false)}, 139, primCode & 0xFF, (primCode & 0xFF00) >> 8, 124);
final CompiledCodeObject method = makeMethod(new Object[]{makeHeader(1, 1, 0, true, false)}, 139, primCode & 0xFF, (primCode & 0xFF00) >> 8, 124);
assertEquals(argument, runMethod(method, rcvr, argument));
}

Expand All @@ -512,7 +511,7 @@ public void testPushRemoteTemp() {
final AbstractSqueakObject rcvr = image.specialObjectsArray;
// push true, pushNewArray (size 1 and pop), popIntoTemp 2, pushRemoteTemp
// (at(0), temp 2), returnTop
final CompiledMethodObject method = makeMethod(literals, 113, 138, 128 + 1, 104 + 2, 140, 0, 2, 124);
final CompiledCodeObject method = makeMethod(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);
Expand All @@ -534,7 +533,7 @@ public void testStoreRemoteTemp() {
// pushNewArray (size 2), popIntoTemp 3, push true, push false,
// storeIntoRemoteTemp (0, temp 3), storeIntoRemoteTemp (1, temp 3), pushTemp 3,
// returnTop
final CompiledMethodObject method = makeMethod(literals, 138, 2, 104 + 3, 113, 114, 141, 0, 3, 141, 1, 3, 19, 124);
final CompiledCodeObject method = makeMethod(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);
Expand All @@ -560,7 +559,7 @@ public void testStoreAndPopRemoteTemp() {
// pushNewArray (size 2), popIntoTemp 3, push true, push false,
// storeIntoRemoteTemp (0, temp 3), storeIntoRemoteTemp (1, temp 3), pushTemp 3,
// returnTop
final CompiledMethodObject method = makeMethod(literals, 138, 2, 104 + 3, 113, 114, 142, 0, 3, 142, 1, 3, 19, 124);
final CompiledCodeObject method = makeMethod(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);
Expand All @@ -579,11 +578,12 @@ public void testPushClosure() {
// ^ [ :arg1 :arg2 | arg1 + arg2 ]
final Object[] literals = new Object[]{2L, NilObject.SINGLETON, NilObject.SINGLETON};
final long rcvr = 1L;
final CompiledMethodObject method = makeMethod(literals, 0x8F, 0x02, 0x00, 0x04, 0x10, 0x11, 0xB0, 0x7D, 0x7C);
final CompiledCodeObject method = makeMethod(literals, 0x8F, 0x02, 0x00, 0x04, 0x10, 0x11, 0xB0, 0x7D, 0x7C);
final VirtualFrame frame = createTestFrame(method);
final Object result = createContext(method, rcvr).execute(frame);
assertTrue(result instanceof BlockClosureObject);
final CompiledBlockObject block = ((BlockClosureObject) result).getCompiledBlock();
final CompiledCodeObject block = ((BlockClosureObject) result).getCompiledBlock();
assertTrue(block.isCompiledBlock());
assertEquals(2, block.getNumArgs());
assertEquals(0, block.getNumArgsAndCopied() - block.getNumArgs());
assertEquals(2, block.getNumTemps());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import de.hpi.swa.trufflesqueak.model.BlockClosureObject;
import de.hpi.swa.trufflesqueak.model.CharacterObject;
import de.hpi.swa.trufflesqueak.model.ClassObject;
import de.hpi.swa.trufflesqueak.model.CompiledMethodObject;
import de.hpi.swa.trufflesqueak.model.CompiledCodeObject;
import de.hpi.swa.trufflesqueak.model.ContextObject;
import de.hpi.swa.trufflesqueak.model.EmptyObject;
import de.hpi.swa.trufflesqueak.model.FloatObject;
Expand Down Expand Up @@ -125,7 +125,7 @@ public Object asObject() {
object = NativeObject.newNativeBytes(this);
}
} else if (format <= 31) { // compiled methods
object = new CompiledMethodObject(image, hash);
object = new CompiledCodeObject(image, hash, squeakClass);
}
}
return object;
Expand Down
Loading

0 comments on commit 1a49ae5

Please sign in to comment.