@@ -599,10 +599,11 @@ public RubyNode visitCallAndWriteNode(Nodes.CallAndWriteNode node) {
599
599
final var writeReceiverNode = receiverExpression .getWriteNode ();
600
600
final var readReceiver = receiverExpression .getReadYARPNode ();
601
601
602
- // Use Prism nodes and rely on CallNode translation to automatically set CallNode flags
603
- // Ignore node.flags - it could be only SAFE_NAVIGATION that is handled manually
604
- final RubyNode readNode = callNode (node , readReceiver , node .read_name , Nodes .Node .EMPTY_ARRAY ).accept (this );
605
- final RubyNode writeNode = callNode (node , Nodes .CallNodeFlags .ATTRIBUTE_WRITE , readReceiver , node .write_name ,
602
+ // Use Prism nodes and rely on CallNode translation to automatically set RubyCallNode attributes
603
+ short writeFlags = (short ) (node .flags | Nodes .CallNodeFlags .ATTRIBUTE_WRITE );
604
+ final RubyNode readNode = callNode (node , node .flags , readReceiver , node .read_name , Nodes .Node .EMPTY_ARRAY )
605
+ .accept (this );
606
+ final RubyNode writeNode = callNode (node , writeFlags , readReceiver , node .write_name ,
606
607
node .value ).accept (this );
607
608
final RubyNode andNode = AndNodeGen .create (readNode , writeNode );
608
609
@@ -628,9 +629,6 @@ public RubyNode visitCallNode(Nodes.CallNode node) {
628
629
var argumentsAndBlock = translateArgumentsAndBlock (node .arguments , node .block , methodName );
629
630
var translatedArguments = argumentsAndBlock .arguments ();
630
631
631
- // if the receiver is explicit or implicit 'self' then we can call private methods
632
- final boolean ignoreVisibility = node .receiver == null || node .receiver instanceof Nodes .SelfNode ;
633
-
634
632
if (environment .getParseEnvironment ().inCore () && node .isVariableCall () && methodName .equals ("undefined" )) {
635
633
// translate undefined
636
634
final RubyNode rubyNode = new ObjectLiteralNode (NotProvided .INSTANCE );
@@ -667,7 +665,7 @@ public RubyNode visitCallNode(Nodes.CallNode node) {
667
665
argumentsAndBlock .argumentsDescriptor (),
668
666
translatedArguments ,
669
667
argumentsAndBlock .isSplatted (),
670
- ignoreVisibility ,
668
+ node . isIgnoreVisibility () ,
671
669
node .isVariableCall (),
672
670
node .isSafeNavigation (),
673
671
node .isAttributeWrite ());
@@ -789,10 +787,10 @@ public RubyNode visitCallOperatorWriteNode(Nodes.CallOperatorWriteNode node) {
789
787
final var readReceiver = receiverExpression .getReadYARPNode ();
790
788
791
789
// Use Prism nodes and rely on CallNode translation to automatically set CallNode flags
792
- // Ignore node.flags - it could be only SAFE_NAVIGATION that is handled manually
793
- final Nodes .Node read = callNode (node , readReceiver , node .read_name , Nodes .Node .EMPTY_ARRAY );
790
+ short writeFlags = ( short ) ( node .flags | Nodes . CallNodeFlags . ATTRIBUTE_WRITE );
791
+ final Nodes .Node read = callNode (node , node . flags , readReceiver , node .read_name , Nodes .Node .EMPTY_ARRAY );
794
792
final Nodes .Node executeOperator = callNode (node , read , node .operator , node .value );
795
- final Nodes .Node write = callNode (node , Nodes . CallNodeFlags . ATTRIBUTE_WRITE , readReceiver , node .write_name ,
793
+ final Nodes .Node write = callNode (node , writeFlags , readReceiver , node .write_name ,
796
794
executeOperator );
797
795
798
796
final RubyNode writeNode = write .accept (this );
@@ -823,9 +821,10 @@ public RubyNode visitCallOrWriteNode(Nodes.CallOrWriteNode node) {
823
821
final var readReceiver = receiverExpression .getReadYARPNode ();
824
822
825
823
// Use Prism nodes and rely on CallNode translation to automatically set CallNode flags
826
- // Ignore node.flags - it could be only SAFE_NAVIGATION that is handled manually
827
- final RubyNode readNode = callNode (node , readReceiver , node .read_name , Nodes .Node .EMPTY_ARRAY ).accept (this );
828
- final RubyNode writeNode = callNode (node , Nodes .CallNodeFlags .ATTRIBUTE_WRITE , readReceiver , node .write_name ,
824
+ short writeFlags = (short ) (node .flags | Nodes .CallNodeFlags .ATTRIBUTE_WRITE );
825
+ final RubyNode readNode = callNode (node , node .flags , readReceiver , node .read_name , Nodes .Node .EMPTY_ARRAY )
826
+ .accept (this );
827
+ final RubyNode writeNode = callNode (node , writeFlags , readReceiver , node .write_name ,
829
828
node .value ).accept (this );
830
829
final RubyNode orNode = OrNodeGen .create (readNode , writeNode );
831
830
@@ -1607,9 +1606,9 @@ public RubyNode visitForNode(Nodes.ForNode node) {
1607
1606
final var arguments = new Nodes .ArgumentsNode (NO_FLAGS , new Nodes .Node []{ readParameter }, 0 , 0 );
1608
1607
1609
1608
// preserve target flags because they can contain SAFE_NAVIGATION flag
1610
- int flags = target .flags | Nodes .CallNodeFlags .ATTRIBUTE_WRITE ;
1609
+ short flags = ( short ) ( target .flags | Nodes .CallNodeFlags .ATTRIBUTE_WRITE ) ;
1611
1610
1612
- writeIndex = new Nodes .CallNode (( short ) flags , target .receiver , target .name , arguments , null , 0 , 0 );
1611
+ writeIndex = new Nodes .CallNode (flags , target .receiver , target .name , arguments , null , 0 , 0 );
1613
1612
} else if (node .index instanceof Nodes .IndexTargetNode target ) {
1614
1613
final Nodes .ArgumentsNode arguments ;
1615
1614
final Nodes .Node [] statements ;
@@ -1888,7 +1887,7 @@ public RubyNode visitIndexAndWriteNode(Nodes.IndexAndWriteNode node) {
1888
1887
}
1889
1888
1890
1889
final RubyNode rubyNode = translateIndexOrAndIndexAndWriteNodes (true , node .receiver , arguments , node .block ,
1891
- node .value );
1890
+ node .value , node . flags );
1892
1891
return assignPositionAndFlags (node , rubyNode );
1893
1892
}
1894
1893
@@ -1938,16 +1937,16 @@ public RubyNode visitIndexOperatorWriteNode(Nodes.IndexOperatorWriteNode node) {
1938
1937
readArguments [i ] = expression .getReadYARPNode ();
1939
1938
}
1940
1939
1941
- // Prism doesn't set any flag for IndexOperatorWriteNode right now
1942
- final Nodes .Node read = new Nodes .CallNode (NO_FLAGS , readReceiver , "[]" ,
1940
+ final Nodes .Node read = new Nodes .CallNode (node .flags , readReceiver , "[]" ,
1943
1941
new Nodes .ArgumentsNode (NO_FLAGS , readArguments , 0 , 0 ), blockArgument , 0 , 0 );
1944
1942
final Nodes .Node executeOperator = callNode (node , read , node .operator , node .value );
1945
1943
1946
1944
final Nodes .Node [] readArgumentsAndResult = new Nodes .Node [argumentsCount + 1 ];
1947
1945
System .arraycopy (readArguments , 0 , readArgumentsAndResult , 0 , argumentsCount );
1948
1946
readArgumentsAndResult [argumentsCount ] = executeOperator ;
1949
1947
1950
- final Nodes .Node write = new Nodes .CallNode (Nodes .CallNodeFlags .ATTRIBUTE_WRITE , readReceiver , "[]=" ,
1948
+ short writeFlags = (short ) (node .flags | Nodes .CallNodeFlags .ATTRIBUTE_WRITE );
1949
+ final Nodes .Node write = new Nodes .CallNode (writeFlags , readReceiver , "[]=" ,
1951
1950
new Nodes .ArgumentsNode (NO_FLAGS , readArgumentsAndResult , 0 , 0 ), blockArgument , 0 , 0 );
1952
1951
final RubyNode writeNode = write .accept (this );
1953
1952
final RubyNode writeArgumentsNode = sequence (Arrays .asList (writeArgumentsNodes ));
@@ -1974,7 +1973,7 @@ public RubyNode visitIndexOrWriteNode(Nodes.IndexOrWriteNode node) {
1974
1973
}
1975
1974
1976
1975
final RubyNode rubyNode = translateIndexOrAndIndexAndWriteNodes (false , node .receiver , arguments , node .block ,
1977
- node .value );
1976
+ node .value , node . flags );
1978
1977
return assignPositionAndFlags (node , rubyNode );
1979
1978
}
1980
1979
@@ -2004,15 +2003,16 @@ public RubyNode visitIndexTargetNode(Nodes.IndexTargetNode node) {
2004
2003
node .arguments .length );
2005
2004
}
2006
2005
2007
- final var callNode = new Nodes .CallNode (node .flags , node .receiver , "[]=" , argumentsNode , node .block ,
2006
+ short writeFlags = (short ) (node .flags | Nodes .CallNodeFlags .ATTRIBUTE_WRITE );
2007
+ final var callNode = new Nodes .CallNode (writeFlags , node .receiver , "[]=" , argumentsNode , node .block ,
2008
2008
node .startOffset ,
2009
2009
node .length );
2010
2010
return callNode .accept (this );
2011
2011
}
2012
2012
2013
2013
2014
2014
private RubyNode translateIndexOrAndIndexAndWriteNodes (boolean isAndOperator , Nodes .Node receiver ,
2015
- Nodes .Node [] arguments , Nodes .Node block , Nodes .Node value ) {
2015
+ Nodes .Node [] arguments , Nodes .Node block , Nodes .Node value , short flags ) {
2016
2016
// Handle both &&= and ||= operators:
2017
2017
// `a[b] ||= c` is translated into `a[b] || a[b] = c`
2018
2018
// `a[b] &&= c` is translated into `a[b] && a[b] = c`
@@ -2050,16 +2050,16 @@ private RubyNode translateIndexOrAndIndexAndWriteNodes(boolean isAndOperator, No
2050
2050
blockArgument = null ;
2051
2051
}
2052
2052
2053
- // Prism doesn't set any flag for IndexAndWriteNode and IndexOrWriteNode right now
2054
- final Nodes .Node read = new Nodes .CallNode (NO_FLAGS , readReceiver , "[]" ,
2053
+ final Nodes .Node read = new Nodes .CallNode (flags , readReceiver , "[]" ,
2055
2054
new Nodes .ArgumentsNode (NO_FLAGS , readArguments , 0 , 0 ), blockArgument , 0 , 0 );
2056
2055
final RubyNode readNode = read .accept (this );
2057
2056
2058
2057
final Nodes .Node [] readArgumentsAndValue = new Nodes .Node [arguments .length + 1 ];
2059
2058
System .arraycopy (readArguments , 0 , readArgumentsAndValue , 0 , arguments .length );
2060
2059
readArgumentsAndValue [arguments .length ] = value ;
2061
2060
2062
- final Nodes .Node write = new Nodes .CallNode (Nodes .CallNodeFlags .ATTRIBUTE_WRITE , readReceiver , "[]=" ,
2061
+ short writeFlags = (short ) (flags | Nodes .CallNodeFlags .ATTRIBUTE_WRITE );
2062
+ final Nodes .Node write = new Nodes .CallNode (writeFlags , readReceiver , "[]=" ,
2063
2063
new Nodes .ArgumentsNode (NO_FLAGS , readArgumentsAndValue , 0 , 0 ), blockArgument , 0 , 0 );
2064
2064
final RubyNode writeNode = write .accept (this );
2065
2065
0 commit comments