Skip to content

Commit

Permalink
[Truffle] Global replace anonymous classes with lambdas.
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisseaton committed Oct 6, 2016
1 parent f8d14d0 commit 5038049
Show file tree
Hide file tree
Showing 33 changed files with 232 additions and 490 deletions.
9 changes: 3 additions & 6 deletions truffle/src/main/java/org/jruby/truffle/cext/CExtNodes.java
Expand Up @@ -307,12 +307,9 @@ public abstract static class GetBlockNode extends CoreMethodArrayArgumentsNode {
@TruffleBoundary
@Specialization
public DynamicObject getBlock() {
return Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<DynamicObject>() {
@Override
public DynamicObject visitFrame(FrameInstance frameInstance) {
Frame frame = frameInstance.getFrame(FrameAccess.READ_ONLY, true);
return RubyArguments.tryGetBlock(frame);
}
return Truffle.getRuntime().iterateFrames(frameInstance -> {
Frame frame = frameInstance.getFrame(FrameAccess.READ_ONLY, true);
return RubyArguments.tryGetBlock(frame);
});
}

Expand Down
Expand Up @@ -537,12 +537,7 @@ public Object waitPID(int input_pid, boolean no_hang) {
final int finalOptions = options;

// retry:
pid = getContext().getThreadManager().runUntilResult(this, new ThreadManager.BlockingAction<Integer>() {
@Override
public Integer block() throws InterruptedException {
return posix().waitpid(input_pid, statusReference, finalOptions);
}
});
pid = getContext().getThreadManager().runUntilResult(this, () -> posix().waitpid(input_pid, statusReference, finalOptions));

final int errno = posix().errno();

Expand Down
Expand Up @@ -1918,12 +1918,7 @@ public Object sortObjectWithBlock(DynamicObject array, DynamicObject block) {

@TruffleBoundary
private void doSort(Object[] copy, int size, DynamicObject block) {
Arrays.sort(copy, 0, size, new Comparator<Object>() {
@Override
public int compare(Object a, Object b) {
return castSortValue(ProcOperations.rootCall(block, a, b));
}
});
Arrays.sort(copy, 0, size, (a, b) -> castSortValue(ProcOperations.rootCall(block, a, b)));
}

@Specialization(guards = { "!isNullArray(array)", "!isObjectArray(array)" })
Expand Down
Expand Up @@ -339,26 +339,23 @@ private DynamicObject buildMethodMissingException(Object self, DynamicObject nam
}

private FrameInstance getRelevantCallerFrame() {
return Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<FrameInstance>() {
@Override
public FrameInstance visitFrame(FrameInstance frameInstance) {
final Node callNode = frameInstance.getCallNode();
if (callNode == null) {
// skip current frame
return null;
}

final SuperCallNode superCallNode = NodeUtil.findParent(callNode, SuperCallNode.class);
final Frame frame = frameInstance.getFrame(FrameInstance.FrameAccess.READ_ONLY, true);
final String superMethodName = RubyArguments.getMethod(frame).getName();

if (superCallNode != null && superMethodName.equals("method_missing")) {
// skip super calls of method_missing itself
return null;
}

return frameInstance;
return Truffle.getRuntime().iterateFrames(frameInstance -> {
final Node callNode = frameInstance.getCallNode();
if (callNode == null) {
// skip current frame
return null;
}

final SuperCallNode superCallNode = NodeUtil.findParent(callNode, SuperCallNode.class);
final Frame frame = frameInstance.getFrame(FrameInstance.FrameAccess.READ_ONLY, true);
final String superMethodName = RubyArguments.getMethod(frame).getName();

if (superCallNode != null && superMethodName.equals("method_missing")) {
// skip super calls of method_missing itself
return null;
}

return frameInstance;
});
}

Expand Down
Expand Up @@ -37,18 +37,13 @@ public DynamicObject ofCaller() {

final Memo<Integer> frameCount = new Memo<>(0);

final MaterializedFrame frame = Truffle.getRuntime().iterateFrames(new FrameInstanceVisitor<MaterializedFrame>() {

@Override
public MaterializedFrame visitFrame(FrameInstance frameInstance) {
if (frameCount.get() == 2) {
return frameInstance.getFrame(FrameInstance.FrameAccess.READ_WRITE, false).materialize();
} else {
frameCount.set(frameCount.get() + 1);
return null;
}
final MaterializedFrame frame = Truffle.getRuntime().iterateFrames(frameInstance -> {
if (frameCount.get() == 2) {
return frameInstance.getFrame(FrameInstance.FrameAccess.READ_WRITE, false).materialize();
} else {
frameCount.set(frameCount.get() + 1);
return null;
}

});

if (frame == null) {
Expand Down
53 changes: 20 additions & 33 deletions truffle/src/main/java/org/jruby/truffle/core/fiber/FiberNodes.java
Expand Up @@ -69,12 +69,7 @@ private static DynamicObject createFiber(RubyContext context, DynamicObject thre

public static void initialize(final RubyContext context, final DynamicObject fiber, final DynamicObject block, final Node currentNode) {
final String name = "Ruby Fiber@" + Layouts.PROC.getSharedMethodInfo(block).getSourceSection().getShortDescription();
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
handleFiberExceptions(context, fiber, block, currentNode);
}
});
final Thread thread = new Thread(() -> handleFiberExceptions(context, fiber, block, currentNode));
thread.setName(name);
thread.start();

Expand All @@ -95,29 +90,26 @@ public Boolean block() throws InterruptedException {
}

private static void handleFiberExceptions(final RubyContext context, final DynamicObject fiber, final DynamicObject block, Node currentNode) {
run(context, fiber, currentNode, new Runnable() {
@Override
public void run() {
run(context, fiber, currentNode, () -> {
try {
final Object[] args = waitForResume(context, fiber);
final Object result;
try {
final Object[] args = waitForResume(context, fiber);
final Object result;
try {
result = ProcOperations.rootCall(block, args);
} finally {
// Make sure that other fibers notice we are dead before they gain control back
Layouts.FIBER.setAlive(fiber, false);
}
resume(fiber, Layouts.FIBER.getLastResumedByFiber(fiber), true, result);
} catch (FiberExitException e) {
assert !Layouts.FIBER.getRootFiber(fiber);
// Naturally exit the Java thread on catching this
} catch (BreakException e) {
addToMessageQueue(Layouts.FIBER.getLastResumedByFiber(fiber), new FiberExceptionMessage(context.getCoreExceptions().breakFromProcClosure(null)));
} catch (ReturnException e) {
addToMessageQueue(Layouts.FIBER.getLastResumedByFiber(fiber), new FiberExceptionMessage(context.getCoreExceptions().unexpectedReturn(null)));
} catch (RaiseException e) {
addToMessageQueue(Layouts.FIBER.getLastResumedByFiber(fiber), new FiberExceptionMessage(e.getException()));
result = ProcOperations.rootCall(block, args);
} finally {
// Make sure that other fibers notice we are dead before they gain control back
Layouts.FIBER.setAlive(fiber, false);
}
resume(fiber, Layouts.FIBER.getLastResumedByFiber(fiber), true, result);
} catch (FiberExitException e) {
assert !Layouts.FIBER.getRootFiber(fiber);
// Naturally exit the Java thread on catching this
} catch (BreakException e) {
addToMessageQueue(Layouts.FIBER.getLastResumedByFiber(fiber), new FiberExceptionMessage(context.getCoreExceptions().breakFromProcClosure(null)));
} catch (ReturnException e) {
addToMessageQueue(Layouts.FIBER.getLastResumedByFiber(fiber), new FiberExceptionMessage(context.getCoreExceptions().unexpectedReturn(null)));
} catch (RaiseException e) {
addToMessageQueue(Layouts.FIBER.getLastResumedByFiber(fiber), new FiberExceptionMessage(e.getException()));
}
});
}
Expand Down Expand Up @@ -163,12 +155,7 @@ private static void addToMessageQueue(DynamicObject fiber, FiberMessage message)
private static Object[] waitForResume(RubyContext context, final DynamicObject fiber) {
assert RubyGuards.isRubyFiber(fiber);

final FiberMessage message = context.getThreadManager().runUntilResult(null, new BlockingAction<FiberMessage>() {
@Override
public FiberMessage block() throws InterruptedException {
return Layouts.FIBER.getMessageQueue(fiber).take();
}
});
final FiberMessage message = context.getThreadManager().runUntilResult(null, () -> Layouts.FIBER.getMessageQueue(fiber).take());

Layouts.THREAD.getFiberManager(Layouts.FIBER.getRubyThread(fiber)).setCurrentFiber(fiber);

Expand Down
Expand Up @@ -234,14 +234,7 @@ public void remove() {
}

public static Iterable<KeyValue> iterableKeyValues(final Entry firstInSequence) {
return new Iterable<KeyValue>() {

@Override
public Iterator<KeyValue> iterator() {
return iterateKeyValues(firstInSequence);
}

};
return () -> iterateKeyValues(firstInSequence);
}

public static void copyInto(RubyContext context, DynamicObject from, DynamicObject to) {
Expand Down
Expand Up @@ -122,14 +122,7 @@ public static Iterator<KeyValue> iterateKeyValues(DynamicObject hash) {
public static BoundaryIterable<KeyValue> iterableKeyValues(final DynamicObject hash) {
assert RubyGuards.isRubyHash(hash);

return BoundaryIterable.wrap(new Iterable<KeyValue>() {

@Override
public Iterator<KeyValue> iterator() {
return iterateKeyValues(hash);
}

});
return BoundaryIterable.wrap(() -> iterateKeyValues(hash));
}

}
Expand Up @@ -742,12 +742,7 @@ private void exec(RubyContext context, DynamicObject envAsHash, String[] command
}
}

int exitCode = context.getThreadManager().runUntilResult(this, new BlockingAction<Integer>() {
@Override
public Integer block() throws InterruptedException {
return process.waitFor();
}
});
int exitCode = context.getThreadManager().runUntilResult(this, () -> process.waitFor());

/*
* We really do want to just exit here as opposed to throwing a MainExitException and tidying up, as we're
Expand Down Expand Up @@ -819,12 +814,7 @@ public DynamicObject gets() {

final BufferedReader reader = new BufferedReader(new InputStreamReader(in, encoding.getCharset()));

final String line = getContext().getThreadManager().runUntilResult(this, new BlockingAction<String>() {
@Override
public String block() throws InterruptedException {
return gets(reader);
}
});
final String line = getContext().getThreadManager().runUntilResult(this, () -> gets(reader));

final DynamicObject rubyLine = createString(StringOperations.encodeRope(line, UTF8Encoding.INSTANCE));

Expand Down Expand Up @@ -1666,19 +1656,16 @@ public static long sleepFor(Node currentNode, RubyContext context, final long du

final long start = System.currentTimeMillis();

long slept = context.getThreadManager().runUntilResult(currentNode, new BlockingAction<Long>() {
@Override
public Long block() throws InterruptedException {
long now = System.currentTimeMillis();
long slept = now - start;

if (slept >= durationInMillis || Layouts.THREAD.getWakeUp(thread).getAndSet(false)) {
return slept;
}
Thread.sleep(durationInMillis - slept);
long slept = context.getThreadManager().runUntilResult(currentNode, () -> {
long now = System.currentTimeMillis();
long slept1 = now - start;

return System.currentTimeMillis() - start;
if (slept1 >= durationInMillis || Layouts.THREAD.getWakeUp(thread).getAndSet(false)) {
return slept1;
}
Thread.sleep(durationInMillis - slept1);

return System.currentTimeMillis() - start;
});

return slept / 1000;
Expand Down
Expand Up @@ -85,26 +85,14 @@ public void setTraceFunc(final DynamicObject traceFunc) {

instruments = new ArrayList<>();

instruments.add(instrumenter.attachFactory(SourceSectionFilter.newBuilder().tagIs(LineTag.class).build(), new ExecutionEventNodeFactory() {
@Override
public ExecutionEventNode create(EventContext eventContext) {
return new BaseEventEventNode(context, eventContext, traceFunc, context.getCoreStrings().LINE.createInstance());
}
}));
instruments.add(instrumenter.attachFactory(SourceSectionFilter.newBuilder().tagIs(LineTag.class).build(),
eventContext -> new BaseEventEventNode(context, eventContext, traceFunc, context.getCoreStrings().LINE.createInstance())));

instruments.add(instrumenter.attachFactory(SourceSectionFilter.newBuilder().tagIs(CallTag.class).build(), new ExecutionEventNodeFactory() {
@Override
public ExecutionEventNode create(EventContext eventContext) {
return new CallEventEventNode(context, eventContext, traceFunc, context.getCoreStrings().CALL.createInstance());
}
}));
instruments.add(instrumenter.attachFactory(SourceSectionFilter.newBuilder().tagIs(CallTag.class).build(),
eventContext -> new CallEventEventNode(context, eventContext, traceFunc, context.getCoreStrings().CALL.createInstance())));

instruments.add(instrumenter.attachFactory(SourceSectionFilter.newBuilder().tagIs(ClassTag.class).build(), new ExecutionEventNodeFactory() {
@Override
public ExecutionEventNode create(EventContext eventContext) {
return new BaseEventEventNode(context, eventContext, traceFunc, context.getCoreStrings().CLASS.createInstance());
}
}));
instruments.add(instrumenter.attachFactory(SourceSectionFilter.newBuilder().tagIs(ClassTag.class).build(),
eventContext -> new BaseEventEventNode(context, eventContext, traceFunc, context.getCoreStrings().CLASS.createInstance())));

}

Expand Down
Expand Up @@ -592,25 +592,17 @@ public DynamicObject getActualModule() {

public Iterable<DynamicObject> ancestors() {
final ModuleChain top = start;
return new Iterable<DynamicObject>() {
@Override
public Iterator<DynamicObject> iterator() {
return new AncestorIterator(top);
}
};
return () -> new AncestorIterator(top);
}

public Iterable<DynamicObject> parentAncestors() {
final ModuleChain top = start;
return new Iterable<DynamicObject>() {
@Override
public Iterator<DynamicObject> iterator() {
final AncestorIterator iterator = new AncestorIterator(top);
if (iterator.hasNext()) {
iterator.next();
}
return iterator;
return () -> {
final AncestorIterator iterator = new AncestorIterator(top);
if (iterator.hasNext()) {
iterator.next();
}
return iterator;
};
}

Expand All @@ -620,12 +612,7 @@ public Iterator<DynamicObject> iterator() {
public Iterable<DynamicObject> prependedAndIncludedModules() {
final ModuleChain top = start;
final ModuleFields currentModule = this;
return new Iterable<DynamicObject>() {
@Override
public Iterator<DynamicObject> iterator() {
return new IncludedModulesIterator(top, currentModule);
}
};
return () -> new IncludedModulesIterator(top, currentModule);
}

public Collection<DynamicObject> filterMethods(RubyContext context, boolean includeAncestors, MethodFilter filter) {
Expand Down

0 comments on commit 5038049

Please sign in to comment.