Skip to content

Commit b013c2e

Browse files
committed
Translate *VariableOrWriteNode
1 parent ef77082 commit b013c2e

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

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

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import org.truffleruby.language.control.NextNode;
8383
import org.truffleruby.language.control.NotNodeGen;
8484
import org.truffleruby.language.control.OnceNode;
85+
import org.truffleruby.language.control.OrLazyValueDefinedNodeGen;
8586
import org.truffleruby.language.control.OrNodeGen;
8687
import org.truffleruby.language.control.RaiseException;
8788
import org.truffleruby.language.control.RedoNode;
@@ -917,7 +918,13 @@ public RubyNode visitClassVariableOperatorWriteNode(Nodes.ClassVariableOperatorW
917918

918919
@Override
919920
public RubyNode visitClassVariableOrWriteNode(Nodes.ClassVariableOrWriteNode node) {
920-
return defaultVisit(node);
921+
int startOffset = node.startOffset;
922+
int length = node.length;
923+
var readNode = new Nodes.ClassVariableReadNode(node.name, startOffset, length).accept(this);
924+
var definedCheck = AndNodeGen.create(new DefinedNode(readNode), readNode);
925+
var writeNode = new Nodes.ClassVariableWriteNode(node.name, node.value, startOffset, length).accept(this);
926+
final RubyNode rubyNode = OrLazyValueDefinedNodeGen.create(definedCheck, writeNode);
927+
return assignPositionAndFlags(node, rubyNode);
921928
}
922929

923930
@Override
@@ -1259,7 +1266,13 @@ public RubyNode visitGlobalVariableOperatorWriteNode(Nodes.GlobalVariableOperato
12591266

12601267
@Override
12611268
public RubyNode visitGlobalVariableOrWriteNode(Nodes.GlobalVariableOrWriteNode node) {
1262-
return defaultVisit(node);
1269+
int startOffset = node.startOffset;
1270+
int length = node.length;
1271+
var readNode = new Nodes.GlobalVariableReadNode(node.name, startOffset, length).accept(this);
1272+
var definedCheck = AndNodeGen.create(new DefinedNode(readNode), readNode);
1273+
var writeNode = new Nodes.GlobalVariableWriteNode(node.name, node.value, startOffset, length).accept(this);
1274+
final RubyNode rubyNode = OrLazyValueDefinedNodeGen.create(definedCheck, writeNode);
1275+
return assignPositionAndFlags(node, rubyNode);
12631276
}
12641277

12651278
@Override
@@ -1419,21 +1432,25 @@ public RubyNode visitInstanceVariableOperatorWriteNode(Nodes.InstanceVariableOpe
14191432

14201433
@Override
14211434
public RubyNode visitInstanceVariableOrWriteNode(Nodes.InstanceVariableOrWriteNode node) {
1422-
return defaultVisit(node);
1435+
// No need to check `defined?(@ivar)` before reading, as `@ivar` even if not set returns nil and does not have side effects
1436+
int startOffset = node.startOffset;
1437+
int length = node.length;
1438+
var readNode = new Nodes.InstanceVariableReadNode(node.name, startOffset, length).accept(this);
1439+
var writeNode = new Nodes.InstanceVariableWriteNode(node.name, node.value, startOffset, length).accept(this);
1440+
final RubyNode rubyNode = OrLazyValueDefinedNodeGen.create(readNode, writeNode);
1441+
return assignPositionAndFlags(node, rubyNode);
14231442
}
14241443

14251444
@Override
14261445
public RubyNode visitInstanceVariableReadNode(Nodes.InstanceVariableReadNode node) {
14271446
final RubyNode rubyNode = new ReadInstanceVariableNode(node.name);
1428-
14291447
return assignPositionAndFlags(node, rubyNode);
14301448
}
14311449

14321450
@Override
14331451
public RubyNode visitInstanceVariableWriteNode(Nodes.InstanceVariableWriteNode node) {
14341452
final RubyNode value = node.value.accept(this);
14351453
final RubyNode rubyNode = WriteInstanceVariableNodeGen.create(node.name, value);
1436-
14371454
return assignPositionAndFlags(node, rubyNode);
14381455
}
14391456

@@ -1561,7 +1578,14 @@ public RubyNode visitLocalVariableOperatorWriteNode(Nodes.LocalVariableOperatorW
15611578

15621579
@Override
15631580
public RubyNode visitLocalVariableOrWriteNode(Nodes.LocalVariableOrWriteNode node) {
1564-
return defaultVisit(node);
1581+
// No need to check `defined?(var)` before reading, as `var` even if not set returns nil and does not have side effects
1582+
int startOffset = node.startOffset;
1583+
int length = node.length;
1584+
var readNode = new Nodes.LocalVariableReadNode(node.name, node.depth, startOffset, length).accept(this);
1585+
var writeNode = new Nodes.LocalVariableWriteNode(node.name, node.depth, node.value, startOffset, length)
1586+
.accept(this);
1587+
final RubyNode rubyNode = OrLazyValueDefinedNodeGen.create(readNode, writeNode);
1588+
return assignPositionAndFlags(node, rubyNode);
15651589
}
15661590

15671591
@Override

0 commit comments

Comments
 (0)