Skip to content

Commit

Permalink
Showing 4 changed files with 20 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -25,11 +25,16 @@ public abstract class DurationToMillisecondsNode extends RubyNode {
@Child NumericToFloatNode floatCastNode;

private final ConditionProfile durationLessThanZeroProfile = ConditionProfile.createBinaryProfile();
private final boolean acceptsNil;

public DurationToMillisecondsNode(boolean acceptsNil) {
this.acceptsNil = acceptsNil;
}

public abstract long executeDurationToMillis(VirtualFrame frame, Object duration);

@Specialization
public long duration(NotProvided duration) {
public long noDuration(NotProvided duration) {
return Long.MAX_VALUE;
}

@@ -50,10 +55,19 @@ public long duration(double duration) {

@Specialization(guards = "isRubiniusUndefined(duration)")
public long duration(DynamicObject duration) {
return duration(NotProvided.INSTANCE);
return noDuration(NotProvided.INSTANCE);
}

@Specialization(guards = "isNil(duration)")
public long durationNil(DynamicObject duration) {
if (acceptsNil) {
return noDuration(NotProvided.INSTANCE);
} else {
throw new RaiseException(coreExceptions().typeError("TypeError: can't convert NilClass into time interval", this));
}
}

@Specialization(guards = "!isRubiniusUndefined(duration)")
@Specialization(guards = { "!isRubiniusUndefined(duration)", "!isNil(duration)" })
public long duration(VirtualFrame frame, DynamicObject duration) {
if (floatCastNode == null) {
CompilerDirectives.transferToInterpreter();
Original file line number Diff line number Diff line change
@@ -1633,7 +1633,7 @@ public abstract static class SleepNode extends CoreMethodNode {

@CreateCast("duration")
public RubyNode coerceDuration(RubyNode duration) {
return DurationToMillisecondsNodeGen.create(duration);
return DurationToMillisecondsNodeGen.create(false, duration);
}

@Specialization
Original file line number Diff line number Diff line change
@@ -65,7 +65,7 @@ public abstract static class WaitNode extends CoreMethodNode {

@CreateCast("duration")
public RubyNode coerceDuration(RubyNode duration) {
return DurationToMillisecondsNodeGen.create(duration);
return DurationToMillisecondsNodeGen.create(true, duration);
}

@Specialization(guards = "isRubyMutex(mutex)")
Original file line number Diff line number Diff line change
@@ -136,7 +136,7 @@ public abstract static class SleepNode extends CoreMethodNode {

@CreateCast("duration")
public RubyNode coerceDuration(RubyNode duration) {
return DurationToMillisecondsNodeGen.create(duration);
return DurationToMillisecondsNodeGen.create(true, duration);
}

@Specialization

0 comments on commit 3f093f5

Please sign in to comment.