Skip to content

Commit

Permalink
Showing 9 changed files with 43 additions and 38 deletions.
Original file line number Diff line number Diff line change
@@ -24,7 +24,11 @@

boolean needsSelf() default true;

int[] lowerFixnumParameters() default {};
/**
* Try to lower argument <code>i</code> (starting at 1) to an int if its value is a long.
* Use 0 for <code>self</code>.
*/
int[] lowerFixnum() default {};

UnsafeGroup[] unsafe() default {};

Original file line number Diff line number Diff line change
@@ -46,13 +46,13 @@ public RubyNode createCallPrimitiveNode(RubyContext context, SourceSection sourc
List<Class<?>> signature = signatures.get(0);

if (annotation.needsSelf()) {
arguments.add(new SelfNode(context, sourceSection));
arguments.add(transformArgument(new SelfNode(context, sourceSection), 0));
argumentsCount--;
}

for (int n = 0; n < argumentsCount; n++) {
RubyNode readArgumentNode = new ReadPreArgumentNode(n, MissingArgumentBehavior.UNDEFINED);
arguments.add(transformArgument(readArgumentNode, n));
arguments.add(transformArgument(readArgumentNode, n + 1));
}

if (!CoreMethodNodeManager.isSafe(context, annotation.unsafe())) {
@@ -83,30 +83,33 @@ public RubyNode createCallPrimitiveNode(RubyContext context, SourceSection sourc
}

public RubyNode createInvokePrimitiveNode(RubyContext context, SourceSection sourceSection, RubyNode[] arguments) {
assert arguments.length == getPrimitiveArity() : sourceSection.getShortDescription();

if (!CoreMethodNodeManager.isSafe(context, annotation.unsafe())) {
return new UnsafeNode(context, sourceSection);
}

for (int n = 1; n < arguments.length; n++) {
arguments[n] = transformArgument(arguments[n], n);
for (int n = 0; n < arguments.length; n++) {
int nthArg = annotation.needsSelf() ? n : n + 1;
arguments[n] = transformArgument(arguments[n], nthArg);
}

List<List<Class<?>>> signatures = factory.getNodeSignatures();

assert signatures.size() == 1;
List<Class<?>> signature = signatures.get(0);

final RubyNode primitiveNode;
if (signature.get(0) == RubyContext.class) {
return new InvokePrimitiveNode(context, sourceSection,
factory.createNode(context, sourceSection, arguments));
primitiveNode = factory.createNode(context, sourceSection, arguments);
} else {
return new InvokePrimitiveNode(context, sourceSection,
factory.createNode(new Object[]{arguments}));
primitiveNode = factory.createNode(new Object[] { arguments });
}
return new InvokePrimitiveNode(context, sourceSection, primitiveNode);
}

private RubyNode transformArgument(RubyNode argument, int n) {
if (ArrayUtils.contains(annotation.lowerFixnumParameters(), n)) {
if (ArrayUtils.contains(annotation.lowerFixnum(), n)) {
return FixnumLowerNodeGen.create(null, null, argument);
} else {
return argument;
Original file line number Diff line number Diff line change
@@ -84,7 +84,7 @@ public DynamicObject allocate(DynamicObject classToAllocate) {

}

@Primitive(name = "iobuffer_unshift", lowerFixnumParameters = 1, unsafe = UnsafeGroup.IO)
@Primitive(name = "iobuffer_unshift", lowerFixnum = 2, unsafe = UnsafeGroup.IO)
public static abstract class IOBufferUnshiftPrimitiveNode extends PrimitiveArrayArgumentsNode {

@Specialization(guards = "isRubyString(string)")
Original file line number Diff line number Diff line change
@@ -184,7 +184,7 @@ private int getWRONLY() {

}

@Primitive(name = "io_open", needsSelf = false, lowerFixnumParameters = { 1, 2 }, unsafe = UnsafeGroup.IO)
@Primitive(name = "io_open", needsSelf = false, lowerFixnum = { 2, 3 }, unsafe = UnsafeGroup.IO)
public static abstract class IOOpenPrimitiveNode extends IOPrimitiveArrayArgumentsNode {

@TruffleBoundary(throwsControlFlowException = true)
@@ -257,7 +257,7 @@ public DynamicObject ensureOpen(VirtualFrame frame, DynamicObject file,

}

@Primitive(name = "io_read_if_available", lowerFixnumParameters = 0, unsafe = UnsafeGroup.IO)
@Primitive(name = "io_read_if_available", lowerFixnum = 1, unsafe = UnsafeGroup.IO)
public static abstract class IOReadIfAvailableNode extends IOPrimitiveArrayArgumentsNode {

@TruffleBoundary(throwsControlFlowException = true)
@@ -328,7 +328,7 @@ public Object reopen(VirtualFrame frame, DynamicObject file, DynamicObject io) {

}

@Primitive(name = "io_reopen_path", lowerFixnumParameters = 1, unsafe = UnsafeGroup.IO)
@Primitive(name = "io_reopen_path", lowerFixnum = 2, unsafe = UnsafeGroup.IO)
public static abstract class IOReopenPathPrimitiveNode extends IOPrimitiveArrayArgumentsNode {

@Child private CallDispatchHeadNode resetBufferingNode;
@@ -529,7 +529,7 @@ public int close(VirtualFrame frame, DynamicObject io) {

}

@Primitive(name = "io_seek", lowerFixnumParameters = { 0, 1 }, unsafe = UnsafeGroup.IO)
@Primitive(name = "io_seek", lowerFixnum = { 1, 2 }, unsafe = UnsafeGroup.IO)
public static abstract class IOSeekPrimitiveNode extends IOPrimitiveArrayArgumentsNode {

@Specialization
@@ -565,7 +565,7 @@ public int accept(DynamicObject io) {

}

@Primitive(name = "io_sysread", unsafe = UnsafeGroup.IO, lowerFixnumParameters = 0)
@Primitive(name = "io_sysread", unsafe = UnsafeGroup.IO, lowerFixnum = 1)
public static abstract class IOSysReadPrimitiveNode extends IOPrimitiveArrayArgumentsNode {

@TruffleBoundary(throwsControlFlowException = true)
@@ -599,7 +599,7 @@ public DynamicObject sysread(DynamicObject file, int length) {

}

@Primitive(name = "io_select", needsSelf = false, lowerFixnumParameters = 3, unsafe = UnsafeGroup.IO)
@Primitive(name = "io_select", needsSelf = false, lowerFixnum = 4, unsafe = UnsafeGroup.IO)
public static abstract class IOSelectPrimitiveNode extends IOPrimitiveArrayArgumentsNode {

public abstract Object executeSelect(DynamicObject readables, DynamicObject writables, DynamicObject errorables, Object Timeout);
Original file line number Diff line number Diff line change
@@ -47,7 +47,7 @@ public boolean fixedEncoding(DynamicObject regexp) {

}

@Primitive(name = "regexp_initialize", lowerFixnumParameters = 1)
@Primitive(name = "regexp_initialize", lowerFixnum = 2)
@ImportStatic(RegexpGuards.class)
public static abstract class RegexpInitializePrimitiveNode extends PrimitiveArrayArgumentsNode {

@@ -96,7 +96,7 @@ public DynamicObject propagateLastMatch(DynamicObject regexpClass) {

}

@Primitive(name = "regexp_search_region", lowerFixnumParameters = {1, 2})
@Primitive(name = "regexp_search_region", lowerFixnum = { 2, 3 })
@ImportStatic(RegexpGuards.class)
public static abstract class RegexpSearchRegionPrimitiveNode extends PrimitiveArrayArgumentsNode {

Original file line number Diff line number Diff line change
@@ -2847,7 +2847,7 @@ public Object stringByteSubstring(DynamicObject string, DynamicObject range, Not

}

@Primitive(name = "string_chr_at", lowerFixnumParameters = 0)
@Primitive(name = "string_chr_at", lowerFixnum = 1)
@ImportStatic(StringGuards.class)
public static abstract class StringChrAtPrimitiveNode extends PrimitiveArrayArgumentsNode {

@@ -3136,7 +3136,7 @@ public DynamicObject string_escape(DynamicObject string) {

}

@Primitive(name = "string_find_character", lowerFixnumParameters = 0)
@Primitive(name = "string_find_character", lowerFixnum = 1)
@ImportStatic(StringGuards.class)
public static abstract class StringFindCharacterNode extends PrimitiveArrayArgumentsNode {

@@ -3299,7 +3299,7 @@ public Object stringToF(DynamicObject string, boolean strict) {

}

@Primitive(name = "string_index", lowerFixnumParameters = 1)
@Primitive(name = "string_index", lowerFixnum = 2)
@ImportStatic(StringGuards.class)
public static abstract class StringIndexPrimitiveNode extends PrimitiveArrayArgumentsNode {

@@ -3397,7 +3397,7 @@ private int indexOf(Rope sourceRope, Rope otherRope, int fromIndex) {
}
}

@Primitive(name = "string_character_byte_index", needsSelf = false, lowerFixnumParameters = { 0, 1 })
@Primitive(name = "string_character_byte_index", needsSelf = false, lowerFixnum = { 1, 2 })
@ImportStatic(StringGuards.class)
public static abstract class CharacterByteIndexNode extends PrimitiveArrayArgumentsNode {

@@ -3465,7 +3465,7 @@ public int stringByteCharacterIndex(DynamicObject string, int index, int start)
}
}

@Primitive(name = "string_character_index", needsSelf = false, lowerFixnumParameters = 2)
@Primitive(name = "string_character_index", needsSelf = false, lowerFixnum = 3)
public static abstract class StringCharacterIndexPrimitiveNode extends PrimitiveArrayArgumentsNode {

@TruffleBoundary
@@ -3564,7 +3564,7 @@ public Object stringCharacterIndex(DynamicObject string, DynamicObject pattern,

}

@Primitive(name = "string_byte_index", needsSelf = false, lowerFixnumParameters = { 0, 1 })
@Primitive(name = "string_byte_index", needsSelf = false, lowerFixnum = { 1, 2 })
@ImportStatic(StringGuards.class)
public static abstract class StringByteIndexPrimitiveNode extends PrimitiveArrayArgumentsNode {

@@ -3739,7 +3739,7 @@ public Object stringPreviousByteIndex(DynamicObject string, int index) {

}

@Primitive(name = "string_copy_from", needsSelf = false, lowerFixnumParameters = { 2, 3, 4 })
@Primitive(name = "string_copy_from", needsSelf = false, lowerFixnum = { 3, 4, 5 })
public static abstract class StringCopyFromPrimitiveNode extends PrimitiveArrayArgumentsNode {

@Specialization(guards = { "isRubyString(other)", "size >= 0", "!offsetTooLarge(start, other)", "!offsetTooLargeRaw(dest, string)" })
@@ -3796,7 +3796,7 @@ protected boolean offsetTooLargeRaw(int offset, DynamicObject string) {

}

@Primitive(name = "string_rindex", lowerFixnumParameters = 1)
@Primitive(name = "string_rindex", lowerFixnum = 2)
public static abstract class StringRindexPrimitiveNode extends PrimitiveArrayArgumentsNode {

@Child private RopeNodes.GetByteNode patternGetByteNode;
@@ -3871,7 +3871,7 @@ public Object stringRindex(DynamicObject string, DynamicObject pattern, int star

}

@Primitive(name = "string_pattern", lowerFixnumParameters = { 0, 1 })
@Primitive(name = "string_pattern", lowerFixnum = { 1, 2 })
public static abstract class StringPatternPrimitiveNode extends PrimitiveArrayArgumentsNode {

@Child private AllocateObjectNode allocateObjectNode;
@@ -3932,7 +3932,7 @@ protected boolean patternFitsEvenly(DynamicObject string, int size) {

}

@Primitive(name = "string_splice", needsSelf = false, lowerFixnumParameters = {2, 3})
@Primitive(name = "string_splice", needsSelf = false, lowerFixnum = { 3, 4 })
@ImportStatic(StringGuards.class)
public static abstract class StringSplicePrimitiveNode extends PrimitiveArrayArgumentsNode {

@@ -4134,7 +4134,7 @@ public DynamicObject stringByteAppend(DynamicObject string, DynamicObject other)

}

@Primitive(name = "string_substring", lowerFixnumParameters = { 0, 1 })
@Primitive(name = "string_substring", lowerFixnum = { 1, 2 })
@ImportStatic(StringGuards.class)
public static abstract class StringSubstringPrimitiveNode extends PrimitiveArrayArgumentsNode {

@@ -4362,7 +4362,7 @@ private DynamicObject makeBuffer(DynamicObject string, int beg, int len) {

}

@Primitive(name = "string_from_bytearray", needsSelf = false, lowerFixnumParameters = { 1, 2 })
@Primitive(name = "string_from_bytearray", needsSelf = false, lowerFixnum = { 2, 3 })
public static abstract class StringFromByteArrayPrimitiveNode extends PrimitiveArrayArgumentsNode {

@Specialization(guards = "isRubiniusByteArray(bytes)")
Original file line number Diff line number Diff line change
@@ -273,7 +273,7 @@ private DateTime now(DateTimeZone timeZone) {

}

@Primitive(name = "time_s_specific", needsSelf = false, lowerFixnumParameters = { 1 })
@Primitive(name = "time_s_specific", needsSelf = false, lowerFixnum = 2)
public static abstract class TimeSSpecificPrimitiveNode extends PrimitiveArrayArgumentsNode {

@Child private GetTimeZoneNode getTimeZoneNode;
@@ -410,7 +410,7 @@ public DynamicObject timeStrftime(DynamicObject time, DynamicObject format) {

}

@Primitive(name = "time_s_from_array", needsSelf = true, lowerFixnumParameters = { 0 /*sec*/, 1 /* min */, 2 /* hour */, 3 /* mday */, 4 /* month */, 5 /* year */, 6 /*nsec*/, 7 /*isdst*/ })
@Primitive(name = "time_s_from_array", needsSelf = true, lowerFixnum = { 1 /*sec*/, 2 /* min */, 3 /* hour */, 4 /* mday */, 5 /* month */, 6 /* year */, 7 /*nsec*/, 8 /*isdst*/})
public static abstract class TimeSFromArrayPrimitiveNode extends PrimitiveArrayArgumentsNode {

@Child GetTimeZoneNode getTimeZoneNode;
@@ -539,7 +539,7 @@ public long timeNSeconds(DynamicObject time) {

}

@Primitive(name = "time_set_nseconds", lowerFixnumParameters = 0)
@Primitive(name = "time_set_nseconds", lowerFixnum = 1)
public static abstract class TimeSetNSecondsPrimitiveNode extends PrimitiveArrayArgumentsNode {

@TruffleBoundary
Original file line number Diff line number Diff line change
@@ -139,7 +139,7 @@ protected boolean isSigned(boolean signed) {

}

@Primitive(name = "pointer_read_string", lowerFixnumParameters = 0, unsafe = UnsafeGroup.MEMORY)
@Primitive(name = "pointer_read_string", lowerFixnum = 1, unsafe = UnsafeGroup.MEMORY)
public static abstract class PointerReadStringPrimitiveNode extends PrimitiveArrayArgumentsNode {

@Specialization
@@ -162,7 +162,7 @@ public boolean setAutorelease(DynamicObject pointer, boolean autorelease) {

}

@Primitive(name = "pointer_set_at_offset", lowerFixnumParameters = {0, 1}, unsafe = UnsafeGroup.MEMORY)
@Primitive(name = "pointer_set_at_offset", lowerFixnum = { 1, 2 }, unsafe = UnsafeGroup.MEMORY)
@ImportStatic(RubiniusTypes.class)
public static abstract class PointerSetAtOffsetPrimitiveNode extends PrimitiveArrayArgumentsNode {

Original file line number Diff line number Diff line change
@@ -611,8 +611,6 @@ private RubyNode translateRubiniusInvokePrimitive(SourceSection sourceSection, o
arguments.add(readArgumentNode);
}

assert arguments.size() == primitive.getPrimitiveArity() : sourceSection.getShortDescription();

return primitive.createInvokePrimitiveNode(context, sourceSection, arguments.toArray(new RubyNode[arguments.size()]));
}

0 comments on commit 87f052d

Please sign in to comment.