Skip to content

Commit

Permalink
Showing 13 changed files with 55 additions and 45 deletions.
2 changes: 1 addition & 1 deletion tool/jt.rb
Original file line number Diff line number Diff line change
@@ -41,7 +41,7 @@ module Utilities

def self.truffle_version
File.foreach("#{JRUBY_DIR}/truffle/pom.rb") do |line|
if /'truffle\.version' => '(\d+\.\d+|\h+-SNAPSHOT)'/ =~ line
if /'truffle\.version' => '(\d+\.\d+(?:-SNAPSHOT)?|\h+-SNAPSHOT)'/ =~ line
break $1
end
end
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
@@ -206,6 +206,7 @@ public class CoreLibrary {
private final DynamicObject systemCallErrorClass;
private final DynamicObject systemExitClass;
private final DynamicObject threadClass;
private final DynamicObjectFactory threadFactory;
private final DynamicObject threadBacktraceClass;
private final DynamicObject threadBacktraceLocationClass;
private final DynamicObject timeClass;
@@ -564,7 +565,8 @@ public CoreLibrary(RubyContext context) {

threadClass = defineClass("Thread");
threadClass.define("@abort_on_exception", false);
Layouts.CLASS.setInstanceFactoryUnsafe(threadClass, Layouts.THREAD.createThreadShape(threadClass, threadClass));
threadFactory = Layouts.THREAD.createThreadShape(threadClass, threadClass);
Layouts.CLASS.setInstanceFactoryUnsafe(threadClass, threadFactory);

threadBacktraceClass = defineClass(threadClass, objectClass, "Backtrace");
threadBacktraceLocationClass = defineClass(threadBacktraceClass, objectClass, "Location");
@@ -1306,6 +1308,10 @@ public DynamicObject getThreadClass() {
return threadClass;
}

public DynamicObjectFactory getThreadFactory() {
return threadFactory;
}

public DynamicObject getTypeErrorClass() {
return typeErrorClass;
}
Original file line number Diff line number Diff line change
@@ -92,7 +92,7 @@ public synchronized void defineFinalizer(DynamicObject object, Object callable)
if (finalizerThread == null) {
// TODO(CS): should we be running this in a real Ruby thread?

finalizerThread = ThreadManager.createRubyThread(context, context.getCoreLibrary().getThreadClass());
finalizerThread = ThreadManager.createRubyThread(context);
ThreadManager.initialize(finalizerThread, context, null, "finalizer", new Runnable() {
@Override
public void run() {
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")
@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
@@ -12,7 +12,6 @@
import com.oracle.truffle.api.CompilerDirectives.TruffleBoundary;
import com.oracle.truffle.api.nodes.Node;
import com.oracle.truffle.api.object.DynamicObject;
import com.oracle.truffle.api.object.DynamicObjectFactory;
import jnr.posix.DefaultNativeTimeval;
import jnr.posix.Timeval;
import org.jruby.RubyThread.Status;
@@ -50,15 +49,15 @@ public class ThreadManager {

public ThreadManager(RubyContext context) {
this.context = context;
this.rootThread = createRubyThread(context, context.getCoreLibrary().getThreadClass());
this.rootThread = createRubyThread(context);
}

public static final InterruptMode DEFAULT_INTERRUPT_MODE = InterruptMode.IMMEDIATE;
public static final Status DEFAULT_STATUS = Status.RUN;

public static DynamicObject createRubyThread(RubyContext context, DynamicObject rubyClass) {
public static DynamicObject createRubyThread(RubyContext context) {
final DynamicObject object = Layouts.THREAD.createThread(
Layouts.CLASS.getInstanceFactory(rubyClass),
context.getCoreLibrary().getThreadFactory(),
createThreadLocals(context),
DEFAULT_INTERRUPT_MODE,
DEFAULT_STATUS,
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 74c79bb

Please sign in to comment.