Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
253 changes: 130 additions & 123 deletions codespeed.conf

Large diffs are not rendered by default.

12 changes: 8 additions & 4 deletions src/som/compiler/MixinDefinition.java
Original file line number Diff line number Diff line change
Expand Up @@ -769,13 +769,17 @@ public Object invoke(final IndirectCallNode call, final Object[] arguments) {
Object superclassAndMixins;
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE) {
superclassAndMixins = mixinDefinition.getSuperclassAndMixinResolutionInvokable()
.getCallTarget().call(rcvr, SArguments.instantiateTopShadowStackEntry(mixinDefinition.getSuperclassAndMixinResolutionInvokable()));
.getCallTarget().call(rcvr,
SArguments.instantiateTopShadowStackEntry(
mixinDefinition.getSuperclassAndMixinResolutionInvokable()));
} else {
superclassAndMixins = mixinDefinition.getSuperclassAndMixinResolutionInvokable()
.getCallTarget().call(rcvr); }
.getCallTarget().call(rcvr);
}
// ok, now it is for sure not initialized yet, instantiate class
// Object superclassAndMixins = mixinDefinition.getSuperclassAndMixinResolutionInvokable()
// .getCallTarget().call(rcvr);
// Object superclassAndMixins =
// mixinDefinition.getSuperclassAndMixinResolutionInvokable()
// .getCallTarget().call(rcvr);
SClass clazz = mixinDefinition.instantiateClass(null, rcvr, superclassAndMixins);
rcvr.writeSlot(this, clazz);
return clazz;
Expand Down
10 changes: 7 additions & 3 deletions src/som/interpreter/SArguments.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import java.util.Map;

import com.oracle.truffle.api.CompilerAsserts;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.frame.Frame;
import com.oracle.truffle.api.frame.VirtualFrame;
import com.oracle.truffle.api.nodes.Node;
Expand Down Expand Up @@ -246,9 +247,11 @@ public static void setShadowStackEntry(final Object[] args, final ShadowStackEnt
args[args.length - 1] = entry;
}

public static void updateShadowStackEntry(final Object[] args, final ShadowStackEntry entry) {
//assert args[args.length - 1] instanceof ShadowStackEntry : "Assume shadow stack entry is set";
//assert entry.getPreviousShadowStackEntry() == (args[args.length -1]);
public static void updateShadowStackEntry(final Object[] args,
final ShadowStackEntry entry) {
// assert args[args.length - 1] instanceof ShadowStackEntry : "Assume shadow stack entry is
// set";
// assert entry.getPreviousShadowStackEntry() == (args[args.length -1]);
args[args.length - 1] = entry;
}

Expand All @@ -271,6 +274,7 @@ public static void saveCausalEntryForPromise(final Object previousPromiseStack,

private static Map<Long, ShadowStackEntry> previousPromiseInGroupByActor = new HashMap<>();

@TruffleBoundary
public static void saveCausalEntryForPromiseGroup(final Object previousPromiseStack,
final Object callbackPromiseStack, final long actorId) {
if (previousPromiseInGroupByActor != null
Expand Down
2 changes: 1 addition & 1 deletion src/som/interpreter/actors/ErrorNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public SPromise.SResolver standardError(final VirtualFrame frame,
ShadowStackEntry.EntryForPromiseResolution.ResolutionLocation.ERROR;
resolutionEntry =
ShadowStackEntry.createAtPromiseResolution(entry, this.getParent(), location,
"error: " + result.toString());
""); // "error: " + result.toString()
SArguments.saveCausalEntryForPromise(maybeEntry, resolutionEntry);
}

Expand Down
3 changes: 2 additions & 1 deletion src/som/interpreter/actors/EventualMessage.java
Original file line number Diff line number Diff line change
Expand Up @@ -434,7 +434,8 @@ private void setPromiseValue(final Object value, final Actor resolvingActor,
assert args[args.length - 1] instanceof ShadowStackEntry;
ShadowStackEntry callPromiseStack = (ShadowStackEntry) args[args.length - 1];
boolean promiseGroup = false;
if (callPromiseStack.getPreviousShadowStackEntry().getExpression().getParent().getParent() instanceof Method) {
if (callPromiseStack.getPreviousShadowStackEntry().getExpression().getParent()
.getParent() instanceof Method) {
promiseGroup =
((Method) callPromiseStack.getExpression().getParent()
.getParent()).getName().startsWith("PromiseGroup");
Expand Down
2 changes: 1 addition & 1 deletion src/som/interpreter/actors/ResolveNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public SPromise.SResolver normalResolution(final VirtualFrame frame,
ShadowStackEntry.EntryForPromiseResolution.ResolutionLocation.SUCCESSFUL;
resolutionEntry =
ShadowStackEntry.createAtPromiseResolution(entry, this.getParent(), location,
"value: " + result.toString());
""); // "value: " + result.toString()
SArguments.saveCausalEntryForPromise(maybeEntry, resolutionEntry);
}

Expand Down
6 changes: 4 additions & 2 deletions src/som/interpreter/nodes/MessageSendNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -162,9 +162,11 @@ private Object[] evaluateArguments(final VirtualFrame frame) {
Object[] arguments = SArguments.allocateArgumentsArray(argumentNodes);
for (int i = 0; i < argumentNodes.length; i++) {
arguments[i] = argumentNodes[i].executeGeneric(frame);
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE && arguments[i] instanceof ShadowStackEntry) {
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE
&& arguments[i] instanceof ShadowStackEntry) {
CompilerDirectives.transferToInterpreter();
insert(ExceptionSignalingNode.createArgumentErrorNode(sourceSection)).signal(frame, frame.getArguments());
insert(ExceptionSignalingNode.createArgumentErrorNode(sourceSection)).signal(frame,
frame.getArguments());
}
assert arguments[i] != null : "Some expression evaluated to null, which is not supported.";
assert !(arguments[i] instanceof ShadowStackEntry);
Expand Down
3 changes: 2 additions & 1 deletion src/som/interpreter/nodes/ReturnNonLocalNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,8 @@ public Object executeGeneric(final VirtualFrame frame) {
SInvokable invokable = (SInvokable) Types.getClassOf(self).lookupMessage(
escapedBlock, AccessModifier.PROTECTED);

return invokable.invoke(call, new Object[] {self, block, SArguments.getShadowStackEntry(frame)});
return invokable.invoke(call,
new Object[] {self, block, SArguments.getShadowStackEntry(frame)});
}
}

Expand Down
5 changes: 3 additions & 2 deletions src/som/interpreter/nodes/dispatch/BlockDispatchNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -68,8 +68,9 @@ protected static final IndirectCallNode createIndirectCall() {
public Object activateCachedBlock(VirtualFrame frame, final Object[] arguments,
@Cached("getMethod(arguments)") final SInvokable cached,
@Cached("createCallNode(arguments)") final DirectCallNode call) {
if(VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE && !(arguments[arguments.length-1] instanceof ShadowStackEntry)){
Object[] newArguments = Arrays.copyOf(arguments,arguments.length+1);
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE
&& !(arguments[arguments.length - 1] instanceof ShadowStackEntry)) {
Object[] newArguments = Arrays.copyOf(arguments, arguments.length + 1);
newArguments[arguments.length] = SArguments.getShadowStackEntry(frame);
return call.call(newArguments);
}
Expand Down
10 changes: 5 additions & 5 deletions src/som/interpreter/nodes/dispatch/CachedDnuNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,13 @@ protected Object performDnu(final Object[] arguments,
Object[] argsArr;
SArray.SImmutableArray dnuArguments = SArguments.getArgumentsWithoutReceiver(arguments);
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE) {
argsArr = new Object[]{
rcvr, selector, dnuArguments,
arguments[arguments.length - 1]
argsArr = new Object[] {
rcvr, selector, dnuArguments,
arguments[arguments.length - 1]
};
} else {
argsArr = new Object[]{
rcvr, selector, dnuArguments};
argsArr = new Object[] {
rcvr, selector, dnuArguments};
}
return cachedMethod.call(argsArr);
}
Expand Down
11 changes: 6 additions & 5 deletions src/som/interpreter/nodes/literals/ObjectLiteralNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -49,19 +49,20 @@ public Object executeGeneric(final VirtualFrame frame) {

Object superclassAndMixins;
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE) {
superclassAndMixins = superClassResolver.call(outer, SArguments.getShadowStackEntry(frame));
superclassAndMixins =
superClassResolver.call(outer, SArguments.getShadowStackEntry(frame));
} else {
superclassAndMixins = superClassResolver.call(outer);
superclassAndMixins = superClassResolver.call(outer);
}
SClass sClassObject =
instantiation.execute(outer, superclassAndMixins, frame.materialize());
Object[] arguments;
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE){
arguments = new Object[] {sClassObject,null};
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE) {
arguments = new Object[] {sClassObject, null};
} else {
arguments = new Object[] {sClassObject};
}
return newMessage.doPreEvaluated(frame, arguments );
return newMessage.doPreEvaluated(frame, arguments);
}

@Override
Expand Down
15 changes: 8 additions & 7 deletions src/som/interpreter/nodes/nary/EagerBinaryPrimitiveNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -93,17 +93,18 @@ public Object executeGeneric(final VirtualFrame frame) {

return executeEvaluated(frame, rcvr, arg);
}

/** MATTEO: HERE IS THE SPOT IN WHICH I MIGHT BREAK EVERYTHING. **/
public Object executeEvaluated(final VirtualFrame frame,
final Object receiver, final Object argument) {
try {
// if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE) {
// Object[] args;
//
// args = new Object[] {receiver, argument, null};
//
// return makeGenericSend().doPreEvaluated(frame, args);
// }
// if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE) {
// Object[] args;
//
// args = new Object[] {receiver, argument, null};
//
// return makeGenericSend().doPreEvaluated(frame, args);
// }
return primitive.executeEvaluated(frame, receiver, argument);
} catch (UnsupportedSpecializationException e) {
TruffleCompiler.transferToInterpreterAndInvalidate(
Expand Down
6 changes: 3 additions & 3 deletions src/som/interpreter/nodes/nary/EagerTernaryPrimitiveNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -105,12 +105,12 @@ public Object executeEvaluated(final VirtualFrame frame,
} catch (UnsupportedSpecializationException e) {
TruffleCompiler.transferToInterpreterAndInvalidate(
"Eager Primitive with unsupported specialization.");
Object[] arguments = {receiver, argument1, argument2};
Object[] arguments = {receiver, argument1, argument2};
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE) {
arguments = new Object[]{receiver, argument1, argument2, null};
arguments = new Object[] {receiver, argument1, argument2, null};
}
return makeGenericSend().doPreEvaluated(frame,
arguments );
arguments);
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/som/interpreter/nodes/specialized/IfMessageNode.java
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@ public final Object cachedBlock(VirtualFrame frame, final boolean rcvr, final SB
@Cached("createDirect(method)") final DirectCallNode callTarget) {
Object[] args;
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE) {
args = new Object[]{arg, SArguments.getShadowStackEntry(frame)};
args = new Object[] {arg, SArguments.getShadowStackEntry(frame)};
} else {
args = new Object[]{arg};
args = new Object[] {arg};
}
// this was there before Async Stack traces
if (condProf.profile(rcvr == expected)) {
Expand Down
18 changes: 12 additions & 6 deletions src/som/primitives/ActivitySpawn.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.Arrays;
import java.util.concurrent.ForkJoinPool;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.CompilerDirectives.CompilationFinal;
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.dsl.Cached;
Expand Down Expand Up @@ -157,21 +158,26 @@ public final SpawnPrim initialize(final VM vm) {
}

@Specialization(guards = "clazz == TaskClass")
//@TruffleBoundary
public final SomForkJoinTask spawnTask(VirtualFrame frame, final SClass clazz, final SBlock block) {
public final SomForkJoinTask spawnTask(VirtualFrame frame, final SClass clazz,
final SBlock block) {
Object[] arguments;
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE) {
arguments = new Object[] {block, SArguments.getShadowStackEntry(frame)};
} else {
arguments =new Object[] {block};
arguments = new Object[] {block};
}

SomForkJoinTask task = createTask(arguments,
onExec.executeShouldHalt(), block, sourceSection, traceProcCreation, vm);
forkJoinPool.execute(task);
fork(task);
return task;
}

@TruffleBoundary
private void fork(final SomForkJoinTask task) {
forkJoinPool.execute(task);
}

@Specialization(guards = "clazz == ThreadClass")
@TruffleBoundary
public final SomThreadTask spawnThread(final SClass clazz, final SBlock block) {
Expand Down Expand Up @@ -280,8 +286,8 @@ public final Object spawnProcess(final VirtualFrame frame, final SImmutableObjec
notAValue.signal(frame, procCls);
}
Object[] arguments = argArr;
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE){
arguments = Arrays.copyOf(argArr,argArr.length+1);
if (VmSettings.ACTOR_ASYNC_STACK_TRACE_STRUCTURE) {
arguments = Arrays.copyOf(argArr, argArr.length + 1);
arguments[argArr.length] = SArguments.getShadowStackEntry(frame);
}
spawnProcess(procCls, arguments, traceProcCreation);
Expand Down
3 changes: 2 additions & 1 deletion src/som/primitives/FilePrims.java
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,8 @@ public abstract static class FileOpenPrim extends BinaryExpressionNode {
@Child protected BlockDispatchNode dispatchHandler = BlockDispatchNodeGen.create();

@Specialization
public final Object fileOpen(final VirtualFrame frame, final SFileDescriptor file, final SBlock handler) {
public final Object fileOpen(final VirtualFrame frame, final SFileDescriptor file,
final SBlock handler) {
return file.openFile(frame, handler, dispatchHandler);
}
}
Expand Down
23 changes: 14 additions & 9 deletions src/som/primitives/ObjectPrims.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import java.util.ArrayList;
import java.util.List;

import com.oracle.truffle.api.CompilerDirectives;
import com.oracle.truffle.api.debug.DebuggerTags.AlwaysHalt;
import com.oracle.truffle.api.dsl.Cached;
import com.oracle.truffle.api.dsl.GenerateNodeFactory;
Expand Down Expand Up @@ -47,23 +48,25 @@
import tools.dym.Tags.OpComparison;




public final class ObjectPrims {

@GenerateNodeFactory
@Primitive(primitive = "asyncTrace:")
public abstract static class AsyncTracePrim extends UnaryExpressionNode {
@Specialization
public final Object doSAbstractObject(VirtualFrame frame, final Object receiver) {
CompilerDirectives.transferToInterpreter();

Output.errorPrintln("ASYNC STACK TRACE");
StackIterator.ShadowStackIterator iterator = new StackIterator.ShadowStackIterator.HaltShadowStackIterator(this.sourceSection);
StackIterator.ShadowStackIterator iterator =
new StackIterator.ShadowStackIterator.HaltShadowStackIterator(this.sourceSection);
List<String> stack = new ArrayList<>();
while (iterator.hasNext()){
while (iterator.hasNext()) {
ApplicationThreadStack.StackFrame sf = iterator.next();
if (sf != null) {
SourceSection section = sf.section;
stack.add(sf.name + ", " + section.getSource().getName() + ", " + section.getStartLine());
stack.add(
sf.name + ", " + section.getSource().getName() + ", " + section.getStartLine());
}
}
return new SImmutableArray(stack.toArray(), Classes.arrayClass);
Expand All @@ -88,12 +91,14 @@ public final Object doSAbstractObject(VirtualFrame frame, final Object receiver)
boolean keepLooping = true;
String methodName;
while (keepLooping && currentEntry != null) {
if(currentEntry instanceof ShadowStackEntry.EntryForPromiseResolution){
methodName = ((ShadowStackEntry.EntryForPromiseResolution) currentEntry).resolutionLocation.toString();
if (currentEntry instanceof ShadowStackEntry.EntryForPromiseResolution) {
methodName =
((ShadowStackEntry.EntryForPromiseResolution) currentEntry).resolutionLocation.toString();
} else {
methodName = ((CachedDispatchNode) currentEntry.getExpression()).getCachedMethod().getName();
methodName =
((CachedDispatchNode) currentEntry.getExpression()).getCachedMethod().getName();
}
if (methodName.equals("ON_WHEN_RESOLVED_BLOCK")) {
if (methodName.equals("ON_WHEN_RESOLVED_BLOCK")) {
keepLooping = false;
} else {
currentEntry = currentEntry.getPreviousShadowStackEntry();
Expand Down
12 changes: 8 additions & 4 deletions src/som/primitives/PathPrims.java
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,8 @@ public abstract static class FileCopyPrim extends TernaryExpressionNode {
@Child protected BlockDispatchNode dispatchHandler = BlockDispatchNodeGen.create();

@Specialization
public final Object copyAs(final VirtualFrame frame, final String source, final String dest, final SBlock fail) {
public final Object copyAs(final VirtualFrame frame, final String source,
final String dest, final SBlock fail) {
try {
copy(source, dest);
} catch (IOException e) {
Expand All @@ -114,7 +115,8 @@ public abstract static class CreateDirectoryPrim extends BinaryExpressionNode {
@Child protected BlockDispatchNode dispatchHandler = BlockDispatchNodeGen.create();

@Specialization
public final Object createDirectory(final VirtualFrame frame, final String dir, final SBlock fail) {
public final Object createDirectory(final VirtualFrame frame, final String dir,
final SBlock fail) {
try {
createDirectory(dir);
} catch (IOException e) {
Expand All @@ -135,7 +137,8 @@ public abstract static class DeleteDirectoryPrim extends BinaryExpressionNode {
@Child protected BlockDispatchNode dispatchHandler = BlockDispatchNodeGen.create();

@Specialization
public final Object delteDirectory(final VirtualFrame frame, final String dir, final SBlock fail) {
public final Object delteDirectory(final VirtualFrame frame, final String dir,
final SBlock fail) {
try {
delete(dir);
} catch (IOException e) {
Expand Down Expand Up @@ -222,7 +225,8 @@ public abstract static class FileMovePrim extends TernaryExpressionNode {
@Child protected BlockDispatchNode dispatchHandler = BlockDispatchNodeGen.create();

@Specialization
public final Object moveAs(final VirtualFrame frame, final String source, final String dest, final SBlock fail) {
public final Object moveAs(final VirtualFrame frame, final String source,
final String dest, final SBlock fail) {
try {
move(source, dest);
} catch (IOException e) {
Expand Down
5 changes: 3 additions & 2 deletions src/som/primitives/arrays/ArraySetAllStrategy.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public static void evalBlockForRemaining(final VirtualFrame frame, final SBlock
}
}

public static void evalBlockForRemaining(final VirtualFrame frame,final SBlock block,
public static void evalBlockForRemaining(final VirtualFrame frame, final SBlock block,
final long length, final boolean[] storage,
final BlockDispatchNode blockDispatch) {
for (int i = SArray.FIRST_IDX + 1; i < length; i++) {
Expand Down Expand Up @@ -211,7 +211,8 @@ public static Object evaluateFirstDetermineStorageAndEvaluateRest(final VirtualF
final ExceptionSignalingNode notAValue) {
// TODO: this version does not handle the case that a subsequent value is
// not of the expected type...
Object result = blockDispatch.executeDispatch(frame, new Object[] {blockWithArg, (long) 1});
Object result =
blockDispatch.executeDispatch(frame, new Object[] {blockWithArg, (long) 1});

if (result instanceof Long) {
long[] newStorage = new long[(int) length];
Expand Down
Loading