Skip to content

Commit

Permalink
Showing 15 changed files with 48 additions and 44 deletions.
Original file line number Diff line number Diff line change
@@ -149,7 +149,7 @@ public Object instanceEval(VirtualFrame frame, Object receiver, NotProvided stri

}

@CoreMethod(names = "instance_exec", needsBlock = true, argumentsAsArray = true)
@CoreMethod(names = "instance_exec", needsBlock = true, rest = true)
public abstract static class InstanceExecNode extends YieldingCoreMethodNode {

public InstanceExecNode(RubyContext context, SourceSection sourceSection) {
@@ -172,7 +172,7 @@ public Object instanceExec(Object receiver, Object[] arguments, NotProvided bloc

}

@CoreMethod(names = "method_missing", needsBlock = true, argumentsAsArray = true, optional = 1, visibility = Visibility.PRIVATE)
@CoreMethod(names = "method_missing", needsBlock = true, rest = true, optional = 1, visibility = Visibility.PRIVATE)
public abstract static class MethodMissingNode extends CoreMethodArrayArgumentsNode {

public MethodMissingNode(RubyContext context, SourceSection sourceSection) {
@@ -225,7 +225,7 @@ private boolean lastCallWasVCall() {

}

@CoreMethod(names = "__send__", needsBlock = true, argumentsAsArray = true, required = 1)
@CoreMethod(names = "__send__", needsBlock = true, rest = true, required = 1)
public abstract static class SendNode extends CoreMethodArrayArgumentsNode {

@Child private CallDispatchHeadNode dispatchNode;
Original file line number Diff line number Diff line change
@@ -85,7 +85,7 @@ public RubyBasicObject allocate(RubyBasicObject rubyClass) {

}

@CoreMethod(names = "new", needsBlock = true, argumentsAsArray = true)
@CoreMethod(names = "new", needsBlock = true, rest = true)
public abstract static class NewNode extends CoreMethodArrayArgumentsNode {

@Child private CallDispatchHeadNode allocateNode;
Original file line number Diff line number Diff line change
@@ -23,6 +23,7 @@

String[] names();

// where the method is to be defined
Visibility visibility() default Visibility.PUBLIC;

/**
@@ -45,6 +46,7 @@
*/
boolean isModuleFunction() default false;

// arguments specification
/** Whether <code>self</code> is passed as first argument to specializations. */
boolean needsSelf() default true;

@@ -53,12 +55,13 @@
int optional() default 0;

/**
* Give arguments as a Object[] and allows unlimited arguments.
* Give the remaining arguments as a Object[] and allows unlimited arguments.
*/
boolean argumentsAsArray() default false;
boolean rest() default false;

boolean needsBlock() default false;

// arguments transformation
boolean lowerFixnumSelf() default false;

int[] lowerFixnumParameters() default {};
@@ -71,6 +74,7 @@

int[] raiseIfFrozenParameters() default {};

// extra behavior
UnsupportedOperationBehavior unsupportedOperationBehavior() default UnsupportedOperationBehavior.TYPE_ERROR;

boolean returnsEnumeratorIfNoBlock() default false;
Original file line number Diff line number Diff line change
@@ -154,7 +154,7 @@ private static RubyRootNode makeGenericMethod(RubyContext context, MethodDetails
final int required = method.required();
final int optional = method.optional();

final Arity arity = new Arity(required, optional, method.argumentsAsArray());
final Arity arity = new Arity(required, optional, method.rest());

final SharedMethodInfo sharedMethodInfo = new SharedMethodInfo(sourceSection, LexicalScope.NONE, arity, methodDetails.getIndicativeName(), false, null, true);

@@ -191,7 +191,7 @@ private static RubyRootNode makeGenericMethod(RubyContext context, MethodDetails

argumentsNodes.add(readArgumentNode);
}
if (method.argumentsAsArray()) {
if (method.rest()) {
argumentsNodes.add(new ReadRemainingArgumentsNode(context, sourceSection, arity.getPreRequired() + arity.getOptional()));
}

@@ -322,7 +322,7 @@ private static void verifyNoAmbiguousOptionalArgumentsWithReflection(MethodDetai
// count from the end to ignore optional VirtualFrame in front.
Class<?>[] parameterTypes = method.getParameterTypes();
int n = parameterTypes.length - i;
if (methodAnnotation.argumentsAsArray()) {
if (methodAnnotation.rest()) {
n--; // ignore final Object[] argument
}
Class<?> parameterType = parameterTypes[n];
Original file line number Diff line number Diff line change
@@ -259,7 +259,7 @@ public RubyBasicObject initialize(RubyBasicObject fiber, RubyBasicObject block)

}

@CoreMethod(names = "resume", argumentsAsArray = true)
@CoreMethod(names = "resume", rest = true)
public abstract static class ResumeNode extends CoreMethodArrayArgumentsNode {

@Child FiberTransferNode fiberTransferNode;
@@ -276,7 +276,7 @@ public Object resume(VirtualFrame frame, RubyBasicObject fiberBeingResumed, Obje

}

@CoreMethod(names = "yield", onSingleton = true, argumentsAsArray = true)
@CoreMethod(names = "yield", onSingleton = true, rest = true)
public abstract static class YieldNode extends CoreMethodArrayArgumentsNode {

@Child FiberTransferNode fiberTransferNode;
Original file line number Diff line number Diff line change
@@ -635,7 +635,7 @@ protected CallTarget createCallTarget(RootNodeWrapper rootNode) {

}

@CoreMethod(names = "exec", isModuleFunction = true, required = 1, argumentsAsArray = true)
@CoreMethod(names = "exec", isModuleFunction = true, required = 1, rest = true)
public abstract static class ExecNode extends CoreMethodArrayArgumentsNode {

@Child private CallDispatchHeadNode toHashNode;
@@ -750,7 +750,7 @@ public RubyBasicObject exit(int exitCode) {

}

@CoreMethod(names = "fork", isModuleFunction = true, argumentsAsArray = true)
@CoreMethod(names = "fork", isModuleFunction = true, rest = true)
public abstract static class ForkNode extends CoreMethodArrayArgumentsNode {

public ForkNode(RubyContext context, SourceSection sourceSection) {
@@ -1424,7 +1424,7 @@ public RubyBasicObject publicMethods(VirtualFrame frame, Object self, boolean in

}

@CoreMethod(names = "public_send", needsBlock = true, required = 1, argumentsAsArray = true)
@CoreMethod(names = "public_send", needsBlock = true, required = 1, rest = true)
public abstract static class PublicSendNode extends CoreMethodArrayArgumentsNode {

@Child private CallDispatchHeadNode dispatchNode;
@@ -1871,7 +1871,7 @@ public Long block() throws InterruptedException {

}

@CoreMethod(names = {"format", "sprintf"}, isModuleFunction = true, argumentsAsArray = true, required = 1, taintFromParameter = 0)
@CoreMethod(names = {"format", "sprintf"}, isModuleFunction = true, rest = true, required = 1, taintFromParameter = 0)
@ImportStatic(StringCachingGuards.class)
public abstract static class FormatNode extends CoreMethodArrayArgumentsNode {

Original file line number Diff line number Diff line change
@@ -20,7 +20,7 @@
@CoreClass(name = "main")
public abstract class MainNodes {

@CoreMethod(names = "public", argumentsAsArray = true, needsSelf = false, visibility = Visibility.PRIVATE)
@CoreMethod(names = "public", rest = true, needsSelf = false, visibility = Visibility.PRIVATE)
public abstract static class PublicNode extends CoreMethodArrayArgumentsNode {

@Child private ModuleNodes.PublicNode publicNode;
@@ -37,7 +37,7 @@ public RubyBasicObject doPublic(VirtualFrame frame, Object[] args) {
}
}

@CoreMethod(names = "private", argumentsAsArray = true, needsSelf = false, visibility = Visibility.PRIVATE)
@CoreMethod(names = "private", rest = true, needsSelf = false, visibility = Visibility.PRIVATE)
public abstract static class PrivateNode extends CoreMethodArrayArgumentsNode {

@Child private ModuleNodes.PrivateNode privateNode;
Original file line number Diff line number Diff line change
@@ -135,7 +135,7 @@ public int arity(RubyBasicObject method) {

}

@CoreMethod(names = "call", needsBlock = true, argumentsAsArray = true)
@CoreMethod(names = "call", needsBlock = true, rest = true)
public abstract static class CallNode extends CoreMethodArrayArgumentsNode {

@Child ProcOrNullNode procOrNullNode;
30 changes: 15 additions & 15 deletions truffle/src/main/java/org/jruby/truffle/nodes/core/ModuleNodes.java
Original file line number Diff line number Diff line change
@@ -426,7 +426,7 @@ public RubyBasicObject generateAccessor(VirtualFrame frame, RubyBasicObject modu
}
}

@CoreMethod(names = "attr", argumentsAsArray = true, visibility = Visibility.PRIVATE)
@CoreMethod(names = "attr", rest = true, visibility = Visibility.PRIVATE)
public abstract static class AttrNode extends CoreMethodArrayArgumentsNode {

@Child GenerateAccessorNode generateGetterNode;
@@ -459,7 +459,7 @@ public RubyBasicObject attr(VirtualFrame frame, RubyBasicObject module, Object[]

}

@CoreMethod(names = "attr_accessor", argumentsAsArray = true, visibility = Visibility.PRIVATE)
@CoreMethod(names = "attr_accessor", rest = true, visibility = Visibility.PRIVATE)
public abstract static class AttrAccessorNode extends CoreMethodArrayArgumentsNode {

@Child GenerateAccessorNode generateGetterNode;
@@ -482,7 +482,7 @@ public RubyBasicObject attrAccessor(VirtualFrame frame, RubyBasicObject module,

}

@CoreMethod(names = "attr_reader", argumentsAsArray = true, visibility = Visibility.PRIVATE)
@CoreMethod(names = "attr_reader", rest = true, visibility = Visibility.PRIVATE)
public abstract static class AttrReaderNode extends CoreMethodArrayArgumentsNode {

@Child GenerateAccessorNode generateGetterNode;
@@ -502,7 +502,7 @@ public RubyBasicObject attrReader(VirtualFrame frame, RubyBasicObject module, Ob

}

@CoreMethod(names = "attr_writer", argumentsAsArray = true, visibility = Visibility.PRIVATE)
@CoreMethod(names = "attr_writer", rest = true, visibility = Visibility.PRIVATE)
public abstract static class AttrWriterNode extends CoreMethodArrayArgumentsNode {

@Child GenerateAccessorNode generateSetterNode;
@@ -679,7 +679,7 @@ public Object classEval(RubyBasicObject self, Object code, NotProvided file, Not

}

@CoreMethod(names = { "class_exec", "module_exec" }, argumentsAsArray = true, needsBlock = true)
@CoreMethod(names = { "class_exec", "module_exec" }, rest = true, needsBlock = true)
public abstract static class ClassExecNode extends CoreMethodArrayArgumentsNode {

@Child private YieldDispatchHeadNode yield;
@@ -1287,7 +1287,7 @@ public boolean isMethodDefined(RubyBasicObject module, String name, boolean inhe

}

@CoreMethod(names = "module_function", argumentsAsArray = true, visibility = Visibility.PRIVATE)
@CoreMethod(names = "module_function", rest = true, visibility = Visibility.PRIVATE)
public abstract static class ModuleFunctionNode extends CoreMethodArrayArgumentsNode {

@Child SetVisibilityNode setVisibilityNode;
@@ -1357,7 +1357,7 @@ public RubyBasicObject nesting() {
}
}

@CoreMethod(names = "public", argumentsAsArray = true, visibility = Visibility.PRIVATE)
@CoreMethod(names = "public", rest = true, visibility = Visibility.PRIVATE)
public abstract static class PublicNode extends CoreMethodArrayArgumentsNode {

@Child SetVisibilityNode setVisibilityNode;
@@ -1376,7 +1376,7 @@ public RubyBasicObject doPublic(VirtualFrame frame, RubyBasicObject module, Obje

}

@CoreMethod(names = "public_class_method", argumentsAsArray = true)
@CoreMethod(names = "public_class_method", rest = true)
public abstract static class PublicClassMethodNode extends CoreMethodArrayArgumentsNode {

@Child SingletonClassNode singletonClassNode;
@@ -1400,7 +1400,7 @@ public RubyBasicObject publicClassMethod(VirtualFrame frame, RubyBasicObject mod
}
}

@CoreMethod(names = "private", argumentsAsArray = true, visibility = Visibility.PRIVATE)
@CoreMethod(names = "private", rest = true, visibility = Visibility.PRIVATE)
public abstract static class PrivateNode extends CoreMethodArrayArgumentsNode {

@Child SetVisibilityNode setVisibilityNode;
@@ -1441,7 +1441,7 @@ public RubyBasicObject prependFeatures(RubyBasicObject features, RubyBasicObject
}
}

@CoreMethod(names = "private_class_method", argumentsAsArray = true)
@CoreMethod(names = "private_class_method", rest = true)
public abstract static class PrivateClassMethodNode extends CoreMethodArrayArgumentsNode {

@Child SingletonClassNode singletonClassNode;
@@ -1701,7 +1701,7 @@ public RubyBasicObject instanceMethod(RubyBasicObject module, String name) {

}

@CoreMethod(names = "private_constant", argumentsAsArray = true)
@CoreMethod(names = "private_constant", rest = true)
public abstract static class PrivateConstantNode extends CoreMethodArrayArgumentsNode {

@Child NameToJavaStringNode nameToJavaStringNode;
@@ -1721,7 +1721,7 @@ public RubyBasicObject privateConstant(VirtualFrame frame, RubyBasicObject modul
}
}

@CoreMethod(names = "public_constant", argumentsAsArray = true)
@CoreMethod(names = "public_constant", rest = true)
public abstract static class PublicConstantNode extends CoreMethodArrayArgumentsNode {

@Child NameToJavaStringNode nameToJavaStringNode;
@@ -1741,7 +1741,7 @@ public RubyBasicObject publicConstant(VirtualFrame frame, RubyBasicObject module
}
}

@CoreMethod(names = "protected", argumentsAsArray = true, visibility = Visibility.PRIVATE)
@CoreMethod(names = "protected", rest = true, visibility = Visibility.PRIVATE)
public abstract static class ProtectedNode extends CoreMethodArrayArgumentsNode {

@Child SetVisibilityNode setVisibilityNode;
@@ -1812,7 +1812,7 @@ Object removeConstant(RubyBasicObject module, String name) {

}

@CoreMethod(names = "remove_method", argumentsAsArray = true, visibility = Visibility.PRIVATE)
@CoreMethod(names = "remove_method", rest = true, visibility = Visibility.PRIVATE)
public abstract static class RemoveMethodNode extends CoreMethodArrayArgumentsNode {

@Child NameToJavaStringNode nameToJavaStringNode;
@@ -1865,7 +1865,7 @@ public RubyBasicObject toS(RubyBasicObject module) {

}

@CoreMethod(names = "undef_method", argumentsAsArray = true, visibility = Visibility.PRIVATE)
@CoreMethod(names = "undef_method", rest = true, visibility = Visibility.PRIVATE)
public abstract static class UndefMethodNode extends CoreMethodArrayArgumentsNode {

@Child NameToJavaStringNode nameToJavaStringNode;
Original file line number Diff line number Diff line change
@@ -173,7 +173,7 @@ public Object binding(RubyBasicObject proc) {

}

@CoreMethod(names = {"call", "[]", "yield"}, argumentsAsArray = true, needsBlock = true)
@CoreMethod(names = {"call", "[]", "yield"}, rest = true, needsBlock = true)
public abstract static class CallNode extends CoreMethodArrayArgumentsNode {

@Child private YieldDispatchHeadNode yieldNode;
Original file line number Diff line number Diff line change
@@ -915,7 +915,7 @@ private int choppedLength(RubyBasicObject string) {
}
}

@CoreMethod(names = "count", argumentsAsArray = true)
@CoreMethod(names = "count", rest = true)
public abstract static class CountNode extends CoreMethodArrayArgumentsNode {

@Child private ToStrNode toStr;
@@ -1040,7 +1040,7 @@ public RubyBasicObject data(RubyBasicObject string) {
}
}

@CoreMethod(names = "delete!", argumentsAsArray = true, raiseIfFrozenSelf = true)
@CoreMethod(names = "delete!", rest = true, raiseIfFrozenSelf = true)
public abstract static class DeleteBangNode extends CoreMethodArrayArgumentsNode {

@Child private ToStrNode toStr;
@@ -1823,7 +1823,7 @@ public int size(RubyBasicObject string) {
}
}

@CoreMethod(names = "squeeze!", argumentsAsArray = true, raiseIfFrozenSelf = true)
@CoreMethod(names = "squeeze!", rest = true, raiseIfFrozenSelf = true)
public abstract static class SqueezeBangNode extends CoreMethodArrayArgumentsNode {

private ConditionProfile singleByteOptimizableProfile = ConditionProfile.createBinaryProfile();
Original file line number Diff line number Diff line change
@@ -370,7 +370,7 @@ private InterruptMode symbolToInterruptMode(RubyBasicObject symbol) {

}

@CoreMethod(names = "initialize", argumentsAsArray = true, needsBlock = true)
@CoreMethod(names = "initialize", rest = true, needsBlock = true)
public abstract static class InitializeNode extends CoreMethodArrayArgumentsNode {

public InitializeNode(RubyContext context, SourceSection sourceSection) {
Original file line number Diff line number Diff line change
@@ -247,7 +247,7 @@ public Object executeForeign(VirtualFrame frame, TruffleObject receiver) {

}

@CoreMethod(names = "execute", isModuleFunction = true, needsSelf = false, required = 1, argumentsAsArray = true)
@CoreMethod(names = "execute", isModuleFunction = true, needsSelf = false, required = 1, rest = true)
public abstract static class ExecuteNode extends CoreMethodArrayArgumentsNode {

@Child private ForeignObjectAccessNode node;
Original file line number Diff line number Diff line change
@@ -2216,7 +2216,7 @@ private Object injectSymbolHelper(VirtualFrame frame, ArrayMirror mirror, RubyBa

}

@CoreMethod(names = "insert", raiseIfFrozenSelf = true, argumentsAsArray = true, required = 1, optional = 1)
@CoreMethod(names = "insert", raiseIfFrozenSelf = true, rest = true, required = 1, optional = 1)
public abstract static class InsertNode extends ArrayCoreMethodNode {

@Child private ToIntNode toIntNode;
@@ -3196,7 +3196,7 @@ public RubyBasicObject leftShift(RubyBasicObject array, Object value) {

}

@CoreMethod(names = { "push", "__append__" }, argumentsAsArray = true, optional = 1, raiseIfFrozenSelf = true)
@CoreMethod(names = { "push", "__append__" }, rest = true, optional = 1, raiseIfFrozenSelf = true)
public abstract static class PushNode extends ArrayCoreMethodNode {

private final BranchProfile extendBranch = BranchProfile.create();
@@ -4497,7 +4497,7 @@ protected static boolean isSmall(RubyBasicObject array) {

}

@CoreMethod(names = "unshift", argumentsAsArray = true, raiseIfFrozenSelf = true)
@CoreMethod(names = "unshift", rest = true, raiseIfFrozenSelf = true)
public abstract static class UnshiftNode extends CoreMethodArrayArgumentsNode {

public UnshiftNode(RubyContext context, SourceSection sourceSection) {
@@ -4514,7 +4514,7 @@ public RubyBasicObject unshift(RubyBasicObject array, Object... args) {

}

@CoreMethod(names = "zip", argumentsAsArray = true, required = 1)
@CoreMethod(names = "zip", rest = true, required = 1)
public abstract static class ZipNode extends ArrayCoreMethodNode {

public ZipNode(RubyContext context, SourceSection sourceSection) {
Original file line number Diff line number Diff line change
@@ -296,7 +296,7 @@ public Iterator<Map.Entry<Object, Object>> iterator() {
};
}

@CoreMethod(names = "[]", constructor = true, argumentsAsArray = true)
@CoreMethod(names = "[]", constructor = true, rest = true)
@ImportStatic(HashGuards.class)
public abstract static class ConstructNode extends CoreMethodArrayArgumentsNode {

0 comments on commit 418685d

Please sign in to comment.