Skip to content

Commit 5cf7c51

Browse files
committed
Make DurationToMillisecondsNode a helper node
1 parent 2243593 commit 5cf7c51

File tree

3 files changed

+23
-49
lines changed

3 files changed

+23
-49
lines changed

src/main/java/org/truffleruby/core/cast/DurationToNanoSecondsNode.java

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,28 +10,22 @@
1010
package org.truffleruby.core.cast;
1111

1212
import com.oracle.truffle.api.dsl.Cached;
13-
import org.truffleruby.language.Nil;
14-
import org.truffleruby.language.RubyBaseNodeWithExecute;
13+
import com.oracle.truffle.api.dsl.Fallback;
14+
import org.truffleruby.language.RubyBaseNode;
1515
import org.truffleruby.language.NotProvided;
16-
import org.truffleruby.language.RubyDynamicObject;
1716
import org.truffleruby.language.control.RaiseException;
1817

19-
import com.oracle.truffle.api.dsl.NodeChild;
2018
import com.oracle.truffle.api.dsl.Specialization;
2119
import com.oracle.truffle.api.profiles.ConditionProfile;
2220
import org.truffleruby.language.dispatch.DispatchNode;
2321

2422
import java.util.concurrent.TimeUnit;
2523

26-
@NodeChild(value = "duration", type = RubyBaseNodeWithExecute.class)
27-
public abstract class DurationToNanoSecondsNode extends RubyBaseNodeWithExecute {
24+
public abstract class DurationToNanoSecondsNode extends RubyBaseNode {
2825

2926
private final ConditionProfile durationLessThanZeroProfile = ConditionProfile.create();
30-
private final boolean acceptsNil;
3127

32-
public DurationToNanoSecondsNode(boolean acceptsNil) {
33-
this.acceptsNil = acceptsNil;
34-
}
28+
public abstract long execute(Object duration);
3529

3630
@Specialization
3731
protected long noDuration(NotProvided duration) {
@@ -48,19 +42,8 @@ protected long duration(double duration) {
4842
return validate((long) (duration * 1e9));
4943
}
5044

51-
@Specialization
52-
protected long durationNil(Nil duration) {
53-
if (acceptsNil) {
54-
return noDuration(NotProvided.INSTANCE);
55-
} else {
56-
throw new RaiseException(
57-
getContext(),
58-
coreExceptions().typeError("TypeError: can't convert NilClass into time interval", this));
59-
}
60-
}
61-
62-
@Specialization
63-
protected Object duration(RubyDynamicObject duration,
45+
@Fallback
46+
protected long duration(Object duration,
6447
@Cached DispatchNode durationToNanoSeconds,
6548
@Cached ToLongNode toLongNode) {
6649
final Object nanoseconds = durationToNanoSeconds.call(
@@ -76,5 +59,4 @@ private long validate(long durationInNanos) {
7659
}
7760
return durationInNanos;
7861
}
79-
8062
}

src/main/java/org/truffleruby/core/kernel/KernelNodes.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
import org.truffleruby.core.cast.BooleanCastNode;
4444
import org.truffleruby.core.cast.BooleanCastNodeGen;
4545
import org.truffleruby.core.cast.BooleanCastWithDefaultNode;
46-
import org.truffleruby.core.cast.DurationToNanoSecondsNodeGen;
46+
import org.truffleruby.core.cast.DurationToNanoSecondsNode;
4747
import org.truffleruby.core.cast.NameToJavaStringNode;
4848
import org.truffleruby.core.cast.ToIntNode;
4949
import org.truffleruby.core.cast.ToStrNode;
@@ -1602,18 +1602,13 @@ protected boolean hasSingletonMethods(Object self,
16021602

16031603
}
16041604

1605-
@NodeChild(value = "duration", type = RubyBaseNodeWithExecute.class)
16061605
@CoreMethod(names = "sleep", isModuleFunction = true, optional = 1)
1607-
public abstract static class SleepNode extends CoreMethodNode {
1608-
1609-
@CreateCast("duration")
1610-
protected RubyBaseNodeWithExecute coerceDuration(RubyBaseNodeWithExecute duration) {
1611-
return DurationToNanoSecondsNodeGen.create(false, duration);
1612-
}
1606+
public abstract static class SleepNode extends CoreMethodArrayArgumentsNode {
16131607

16141608
@Specialization
1615-
protected long sleep(long durationInNanos,
1616-
@Cached BranchProfile errorProfile) {
1609+
protected long sleep(Object maybeDuration,
1610+
@Cached DurationToNanoSecondsNode durationToNanoSecondsNode) {
1611+
long durationInNanos = durationToNanoSecondsNode.execute(maybeDuration);
16171612
assert durationInNanos >= 0;
16181613

16191614
final RubyThread thread = getLanguage().getCurrentThread();

src/main/java/org/truffleruby/core/mutex/MutexNodes.java

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,20 @@
1010
package org.truffleruby.core.mutex;
1111

1212
import com.oracle.truffle.api.dsl.Cached;
13-
import com.oracle.truffle.api.dsl.CreateCast;
14-
import com.oracle.truffle.api.dsl.NodeChild;
1513
import com.oracle.truffle.api.dsl.Specialization;
1614
import com.oracle.truffle.api.profiles.BranchProfile;
1715
import com.oracle.truffle.api.profiles.ConditionProfile;
1816
import org.truffleruby.builtins.CoreMethod;
1917
import org.truffleruby.builtins.CoreMethodArrayArgumentsNode;
20-
import org.truffleruby.builtins.CoreMethodNode;
2118
import org.truffleruby.builtins.CoreModule;
2219
import org.truffleruby.builtins.UnaryCoreMethodNode;
2320
import org.truffleruby.builtins.YieldingCoreMethodNode;
24-
import org.truffleruby.core.cast.DurationToNanoSecondsNodeGen;
21+
import org.truffleruby.core.cast.DurationToNanoSecondsNode;
2522
import org.truffleruby.core.kernel.KernelNodes;
2623
import org.truffleruby.core.klass.RubyClass;
2724
import org.truffleruby.core.proc.RubyProc;
2825
import org.truffleruby.core.thread.RubyThread;
29-
import org.truffleruby.language.RubyBaseNodeWithExecute;
30-
import org.truffleruby.language.RubyNode;
26+
import org.truffleruby.language.NotProvided;
3127
import org.truffleruby.language.Visibility;
3228
import org.truffleruby.language.control.RaiseException;
3329
import org.truffleruby.language.objects.AllocationTracing;
@@ -148,19 +144,20 @@ protected Object synchronize(RubyMutex mutex, RubyProc block,
148144

149145
}
150146

151-
@NodeChild(value = "mutex", type = RubyNode.class)
152-
@NodeChild(value = "duration", type = RubyBaseNodeWithExecute.class)
153147
@CoreMethod(names = "sleep", optional = 1)
154-
public abstract static class SleepNode extends CoreMethodNode {
155-
156-
@CreateCast("duration")
157-
protected RubyBaseNodeWithExecute coerceDuration(RubyBaseNodeWithExecute duration) {
158-
return DurationToNanoSecondsNodeGen.create(true, duration);
159-
}
148+
public abstract static class SleepNode extends CoreMethodArrayArgumentsNode {
160149

161150
@Specialization
162-
protected long sleep(RubyMutex mutex, long durationInNanos,
151+
protected long sleep(RubyMutex mutex, Object maybeDuration,
152+
@Cached DurationToNanoSecondsNode durationToNanoSecondsNode,
153+
@Cached ConditionProfile nilProfile,
163154
@Cached BranchProfile errorProfile) {
155+
if (nilProfile.profile(maybeDuration == nil)) {
156+
maybeDuration = NotProvided.INSTANCE;
157+
}
158+
159+
long durationInNanos = durationToNanoSecondsNode.execute(maybeDuration);
160+
164161
final ReentrantLock lock = mutex.lock;
165162
final RubyThread thread = getLanguage().getCurrentThread();
166163

0 commit comments

Comments
 (0)