Skip to content

Commit 656d61b

Browse files
committed
Add comments in YARPTranslator and related classes
1 parent f2bd2d2 commit 656d61b

10 files changed

+235
-124
lines changed

src/main/java/org/truffleruby/language/objects/DefineClassNode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.oracle.truffle.api.profiles.BranchProfile;
2323
import com.oracle.truffle.api.profiles.ConditionProfile;
2424

25+
/** Defines a new class or returns an existing one found by name in a parent lexical scope. */
2526
public final class DefineClassNode extends RubyContextSourceNode {
2627

2728
private final String name;

src/main/java/org/truffleruby/language/objects/DefineModuleNode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.oracle.truffle.api.profiles.BranchProfile;
2424
import com.oracle.truffle.api.profiles.ConditionProfile;
2525

26+
/** Defines a new module or returns an existing one found by name in a parent lexical scope. */
2627
@NodeChild(value = "lexicalParentModuleNode", type = RubyNode.class)
2728
public abstract class DefineModuleNode extends RubyContextSourceNode {
2829

src/main/java/org/truffleruby/language/objects/RunModuleDefinitionNode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import com.oracle.truffle.api.frame.VirtualFrame;
2222
import com.oracle.truffle.api.nodes.IndirectCallNode;
2323

24+
/** Defines a new class or module (or gets an existing one) and executes its body. */
2425
public final class RunModuleDefinitionNode extends RubyContextSourceNode {
2526

2627
@Child private RubyNode definingModule;

src/main/java/org/truffleruby/language/objects/SingletonClassNode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import com.oracle.truffle.api.dsl.NodeChild;
2828
import com.oracle.truffle.api.dsl.Specialization;
2929

30+
/** Get a Ruby object's singleton class */
3031
// Specializations are order by their frequency on railsbench using --engine.SpecializationStatistics
3132
@GenerateUncached
3233
public abstract class SingletonClassNode extends RubyBaseNode {

src/main/java/org/truffleruby/parser/YARPLoadArgumentsTranslator.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,17 @@
3030
import org.truffleruby.language.methods.Arity;
3131
import org.prism.Nodes;
3232

33-
/** Translates method/block parameters and assign local variables.
33+
/** Translate method or block parameters and assign local variables.
3434
*
3535
* Parameters should be iterated in the same order {@link org.truffleruby.parser.YARPReloadArgumentsTranslator} iterates
3636
* to handle multiple "_" parameters (and parameters with "_" prefix) correctly. */
3737
public final class YARPLoadArgumentsTranslator extends YARPBaseTranslator {
3838

3939
private final Arity arity;
40-
private final boolean isProc; // block or lambda/method
41-
private final boolean isMethod; // method or proc
40+
/** block or lambda/method */
41+
private final boolean isProc;
42+
/** method or proc */
43+
private final boolean isMethod;
4244
private final YARPTranslator yarpTranslator;
4345

4446
private enum State {
@@ -52,6 +54,7 @@ private enum State {
5254
private int index = 0;
5355
/** to distinguish pre and post Nodes.RequiredParameterNode parameters */
5456
private State state;
57+
/** number of duplicated parameters with "_" prefix */
5558
private int repeatedParameterCounter = 2;
5659

5760
public YARPLoadArgumentsTranslator(
@@ -153,7 +156,6 @@ public RubyNode visitMultiTargetNode(Nodes.MultiTargetNode node) {
153156
index,
154157
hasKeywordArguments(),
155158
isProc ? MissingArgumentBehavior.NIL : MissingArgumentBehavior.RUNTIME_ERROR));
156-
157159
} else if (state == YARPLoadArgumentsTranslator.State.POST) {
158160
readNode = new ReadPostArgumentNode(-index, getRequiredCount(), getOptionalCount(), hasRest(),
159161
hasKeywordArguments());
@@ -196,6 +198,7 @@ public RubyNode visitRequiredParameterNode(Nodes.RequiredParameterNode node) {
196198

197199
final int slot;
198200
if (node.isRepeatedParameter()) {
201+
// when there are multiple "_" parameters
199202
String name = createNameForRepeatedParameter(node.name);
200203
slot = environment.declareVar(name);
201204
} else {
@@ -229,6 +232,7 @@ public RubyNode visitOptionalParameterNode(Nodes.OptionalParameterNode node) {
229232

230233
final int slot;
231234
if (node.isRepeatedParameter()) {
235+
// when there are multiple "_" parameters
232236
String name = createNameForRepeatedParameter(node.name);
233237
slot = environment.declareVar(name);
234238
} else {
@@ -249,6 +253,7 @@ public RubyNode visitRestParameterNode(Nodes.RestParameterNode node) {
249253
final int slot;
250254
if (node.name != null) {
251255
if (node.isRepeatedParameter()) {
256+
// when there are multiple "_" parameters
252257
String name = createNameForRepeatedParameter(node.name);
253258
slot = environment.declareVar(name);
254259
} else {
@@ -339,6 +344,17 @@ private boolean hasRest() {
339344
return parameters.rest != null;
340345
}
341346

347+
/** Generate a name for subsequent local variable, that look like %_1, %_2, etc.
348+
*
349+
* Parameters that start with "_" (e.g. _, _options, etc.) can be used repeatedly in a method parameters list, e.g.
350+
*
351+
* <pre>
352+
* def foo(_, _)
353+
* end
354+
* </pre>
355+
*
356+
* They should be forwarded properly but there are no local variables declared for such duplicated parameters.
357+
* That's why such local variables should be declared now. */
342358
private String createNameForRepeatedParameter(String name) {
343359
int count = repeatedParameterCounter++;
344360
return Layouts.TEMP_PREFIX + name + count;

src/main/java/org/truffleruby/parser/YARPMultiTargetNodeTranslator.java

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,24 @@
2323
import org.truffleruby.language.locals.ReadLocalNode;
2424
import org.truffleruby.language.locals.WriteLocalNode;
2525

26-
// Could be used in ordinal multi-assignment and for destructuring array argument in method/proc parameters:
27-
// - a, (b, c) = 1, [2, 3]
28-
// - def foo(a, (b, c)) end
29-
// NOTE: cannot inherit from YARPBaseTranslator because it returns AssignableNode instead of RubyNode.
26+
/** Translate Nodes.MultiTargetNode.
27+
*
28+
* Used in the following cases: descturturing in multi-assignment and destructuring in method or block parameters:
29+
*
30+
* <pre>
31+
* a, (b, c) = 1, [2, 3]
32+
*
33+
* def foo(a, (b, c))
34+
* end
35+
* </pre>
36+
*
37+
* NOTE: cannot inherit from YARPBaseTranslator because it returns AssignableNode instead of RubyNode. */
3038
public final class YARPMultiTargetNodeTranslator extends AbstractNodeVisitor<AssignableNode> {
3139

3240
private final Nodes.MultiTargetNode node;
3341
private final RubyLanguage language;
3442
private final YARPTranslator yarpTranslator;
43+
/** a node that will be destructured */
3544
private final RubyNode readNode;
3645

3746
public YARPMultiTargetNodeTranslator(
@@ -159,12 +168,12 @@ public AssignableNode visitSplatNode(Nodes.SplatNode node) {
159168
if (node.expression != null) {
160169
return node.expression.accept(this);
161170
} else {
171+
// do nothing for single "*"
162172
return new NoopAssignableNode();
163173
}
164174
}
165175

166176
@Override
167-
// RequiredParameterNode is handled during destructuring method/proc arguments
168177
public AssignableNode visitRequiredParameterNode(Nodes.RequiredParameterNode node) {
169178
final String name = node.name;
170179
final ReadLocalNode lhs = yarpTranslator.getEnvironment().findLocalVarNode(name);

src/main/java/org/truffleruby/parser/YARPMultiWriteNodeTranslator.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
import org.truffleruby.core.cast.SplatCastNodeGen;
2121
import org.truffleruby.language.RubyNode;
2222

23-
// NOTE: cannot inherit from YARPBaseTranslator because it returns AssignableNode instead of RubyNode.
23+
/** Translate Nodes.MultiWriteNode node.
24+
*
25+
* NOTE: cannot inherit from YARPBaseTranslator because it returns AssignableNode instead of RubyNode. */
2426
public final class YARPMultiWriteNodeTranslator extends AbstractNodeVisitor<AssignableNode> {
2527

2628
private final Nodes.MultiWriteNode node;

src/main/java/org/truffleruby/parser/YARPReloadArgumentsTranslator.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525

2626

2727
/** Produces code to reload arguments from local variables back into the arguments array. Only works for simple cases.
28-
* Used for zsuper calls which pass the same arguments, but will pick up modifications made to them in the method so
29-
* far.
28+
* Used for zsuper (a super call without explicit arguments) calls which pass the same arguments, but will pick up
29+
* modifications made to them in the method so far.
3030
*
3131
* Parameters should be iterated in the same order {@link org.truffleruby.parser.YARPLoadArgumentsTranslator} iterates
3232
* to handle multiple "_" parameters (and parameters with "_" prefix) correctly. */
@@ -122,8 +122,7 @@ public RubyNode[] reload(Nodes.ParametersNode parameters) {
122122
} else if (parameters.keyword_rest instanceof Nodes.NoKeywordsParameterNode) {
123123
// do nothing
124124
} else if (parameters.keyword_rest instanceof Nodes.ForwardingParameterNode) {
125-
// do nothing - it's already handled in the #reload method
126-
// NOTE: don't handle '&' for now as far as anonymous & isn't supported yet
125+
// do nothing - it will be handled separately
127126
} else {
128127
throw CompilerDirectives.shouldNotReachHere();
129128
}
@@ -134,14 +133,16 @@ public RubyNode[] reload(Nodes.ParametersNode parameters) {
134133
}
135134

136135
if (parameters.keyword_rest instanceof Nodes.ForwardingParameterNode) {
137-
// ... parameter (so-called "forward arguments") means there is implicit * parameter
136+
// ... parameter means there is implicit * parameter
138137
restParameterIndex = parameters.requireds.length + parameters.optionals.length;
139138
var readRestNode = environment.findLocalVarNode(TranslatorEnvironment.FORWARDED_REST_NAME);
140139
sequence.add(readRestNode);
141140

142-
// ... parameter (so-called "forward arguments") means there is implicit ** parameter
141+
// ... parameter means there is implicit ** parameter
143142
var readKeyRestNode = environment.findLocalVarNode(TranslatorEnvironment.FORWARDED_KEYWORD_REST_NAME);
144143
sequence.add(readKeyRestNode);
144+
145+
// implicit block parameter is handled separately in YARPTranslator#visitForwardingSuperNode
145146
}
146147

147148
return sequence.toArray(RubyNode.EMPTY_ARRAY);
@@ -152,6 +153,7 @@ public RubyNode visitRequiredParameterNode(Nodes.RequiredParameterNode node) {
152153
final String name;
153154

154155
if (node.isRepeatedParameter()) {
156+
// when there are multiple "_" parameters
155157
name = createNameForRepeatedParameter(node.name);
156158
} else {
157159
name = node.name;
@@ -165,6 +167,7 @@ public RubyNode visitOptionalParameterNode(Nodes.OptionalParameterNode node) {
165167
final String name;
166168

167169
if (node.isRepeatedParameter()) {
170+
// when there are multiple "_" parameters
168171
name = createNameForRepeatedParameter(node.name);
169172
} else {
170173
name = node.name;
@@ -185,6 +188,7 @@ public RubyNode visitRestParameterNode(Nodes.RestParameterNode node) {
185188

186189
if (node.name != null) {
187190
if (node.isRepeatedParameter()) {
191+
// when there are multiple "_" parameters
188192
name = createNameForRepeatedParameter(node.name);
189193
} else {
190194
name = node.name;
@@ -228,6 +232,17 @@ protected RubyNode defaultVisit(Nodes.Node node) {
228232
return yarpTranslator.defaultVisit(node);
229233
}
230234

235+
/** Generate a name for subsequent local variable, that look like %_1, %_2, etc.
236+
*
237+
* Parameters that start with "_" (e.g. _, _options, etc.) can be used repeatedly in a method parameters list, e.g.
238+
*
239+
* <pre>
240+
* def foo(_, _)
241+
* end
242+
* </pre>
243+
*
244+
* They should be forwarded properly but there are no local variables declared for such duplicated parameters.
245+
* That's why such local variables should be declared now. */
231246
private String createNameForRepeatedParameter(String name) {
232247
int count = repeatedParameterCounter++;
233248
return Layouts.TEMP_PREFIX + name + count;

0 commit comments

Comments
 (0)