Skip to content

Commit

Permalink
[Truffle] Fixed in infinite recursion issue in the `string_byte_subst…
Browse files Browse the repository at this point in the history
…ring` primitive.

Boxed primitives could match the catch-all specialization, which routes into the Ruby implementation, but the Ruby implementation couldn't handle the arguments and so called back into Java, creating the infinite loop.
nirvdrum committed Sep 30, 2015
1 parent cc6658d commit 53027d2
Showing 1 changed file with 40 additions and 10 deletions.
Original file line number Diff line number Diff line change
@@ -264,24 +264,29 @@ public Object stringByteSubstring(DynamicObject string, int index, int length) {
return taintResultNode.maybeTaint(string, result);
}

@Specialization
public Object stringByteSubstring(DynamicObject string, int index, long length) {
return stringByteSubstring(string, (long) index, length);
}

@Specialization
public Object stringByteSubstring(DynamicObject string, int index, double length) {
return stringByteSubstring(string, index, (int) length);
}

@Specialization
public Object stringByteSubstring(DynamicObject string, double index, NotProvided length) {
return stringByteSubstring(string, (int) index, 1);
public Object stringByteSubstring(DynamicObject string, int index, DynamicObject length) {
return null;
}

@Specialization
public Object stringByteSubstring(DynamicObject string, long index, int length) {
return stringByteSubstring(string, index, (long) length);
public Object stringByteSubstring(DynamicObject string, long index, NotProvided length) {
return stringByteSubstring(string, index, 1);
}

@Specialization
public Object stringByteSubstring(DynamicObject string, int index, long length) {
return stringByteSubstring(string, (long) index, length);
public Object stringByteSubstring(DynamicObject string, long index, int length) {
return stringByteSubstring(string, index, (long) length);
}

@Specialization
@@ -298,22 +303,47 @@ public Object stringByteSubstring(DynamicObject string, long index, long length)
}

@Specialization
public Object stringByteSubstring(DynamicObject string, double index, double length) {
return stringByteSubstring(string, (int) index, (int) length);
public Object stringByteSubstring(DynamicObject string, long index, double length) {
return stringByteSubstring(string, index, (int) length);
}

@Specialization
public Object stringByteSubstring(DynamicObject string, long index, DynamicObject length) {
return null;
}

@Specialization
public Object stringByteSubstring(DynamicObject string, double index, NotProvided length) {
return stringByteSubstring(string, (int) index, 1);
}

@Specialization
public Object stringByteSubstring(DynamicObject string, double index, int length) {
return stringByteSubstring(string, (int) index, length);
}

@Specialization
public Object stringByteSubstring(DynamicObject string, double index, long length) {
return stringByteSubstring(string, (int) index, length);
}

@Specialization
public Object stringByteSubstring(DynamicObject string, double index, double length) {
return stringByteSubstring(string, (int) index, (int) length);
}

@Specialization
public Object stringByteSubstring(DynamicObject string, double index, DynamicObject length) {
return null;
}

@Specialization(guards = "isRubyRange(range)")
public Object stringByteSubstring(DynamicObject string, DynamicObject range, NotProvided length) {
return null;
}

@Specialization(guards = "!isRubyRange(indexOrRange)")
public Object stringByteSubstring(DynamicObject string, Object indexOrRange, Object length) {
@Specialization(guards = "!isRubyRange(index)")
public Object stringByteSubstring(DynamicObject string, DynamicObject index, Object length) {
return null;
}

0 comments on commit 53027d2

Please sign in to comment.