Ruby: change evaluation order of destructured assignments

This commit is contained in:
Arthur Baars
2023-03-03 17:54:49 +01:00
parent 559f6a5f20
commit 8b90d021fa
9 changed files with 212 additions and 120 deletions

View File

@@ -4,7 +4,9 @@ private import AST
private import TreeSitter
class StmtSequenceSynth extends StmtSequence, TStmtSequenceSynth {
final override Stmt getStmt(int n) { synthChild(this, n, result) }
final override Stmt getStmt(int n) {
result = rank[n + 1](int i, Stmt s | synthChild(this, i, s) | s order by i)
}
final override string toString() { result = "..." }
}

View File

@@ -958,14 +958,32 @@ private module DestructuredAssignDesugar {
child = SynthChild(StmtSequenceKind())
or
exists(AstNode seq | seq = TStmtSequenceSynth(tae, -1) |
exists(MethodCall mc, int j | mc = tae.getElement(j) |
parent = seq and
i = j and
child = SynthChild(AssignExprKind())
or
exists(AstNode assign | assign = TAssignExprSynth(seq, j) |
parent = assign and
i = 0 and
child = SynthChild(LocalVariableAccessSynthKind(TLocalVariableSynth(tae, j)))
or
parent = assign and
i = 1 and
child = childRef(mc.getReceiver())
)
)
or
parent = seq and
i = 0 and
i = tae.getNumberOfElements() and
child = SynthChild(AssignExprKind())
or
exists(AstNode assign | assign = TAssignExprSynth(seq, 0) |
exists(AstNode assign | assign = TAssignExprSynth(seq, tae.getNumberOfElements()) |
parent = assign and
i = 0 and
child = SynthChild(LocalVariableAccessSynthKind(TLocalVariableSynth(tae, 0)))
child =
SynthChild(LocalVariableAccessSynthKind(TLocalVariableSynth(tae,
tae.getNumberOfElements())))
or
parent = assign and
i = 1 and
@@ -981,10 +999,33 @@ private module DestructuredAssignDesugar {
restIndex = tae.getRestIndexOrNumberOfElements()
|
parent = seq and
i = j + 1 and
i = j + 1 + tae.getNumberOfElements() and
child = SynthChild(AssignExprKind())
or
exists(AstNode assign | assign = TAssignExprSynth(seq, j + 1) |
exists(AstNode assign |
assign = TAssignExprSynth(seq, j + 1 + tae.getNumberOfElements())
|
exists(MethodCall mc | mc = elem |
parent = assign and
i = 0 and
child =
SynthChild(MethodCallKind(mc.getMethodName(), false, mc.getNumberOfArguments()))
or
exists(AstNode call | call = TMethodCallSynth(assign, 0, _, _, _) |
parent = call and
i = 0 and
child = SynthChild(LocalVariableAccessSynthKind(TLocalVariableSynth(tae, j)))
or
parent = call and
child = childRef(mc.getArgument(i - 1))
)
)
or
(
elem instanceof VariableAccess or
elem instanceof ConstantAccess or
elem instanceof DestructuredLhsExpr
) and
parent = assign and
i = 0 and
child = childRef(elem)
@@ -995,7 +1036,9 @@ private module DestructuredAssignDesugar {
or
parent = TMethodCallSynth(assign, 1, _, _, _) and
i = 0 and
child = SynthChild(LocalVariableAccessSynthKind(TLocalVariableSynth(tae, 0)))
child =
SynthChild(LocalVariableAccessSynthKind(TLocalVariableSynth(tae,
tae.getNumberOfElements())))
or
j < restIndex and
parent = TMethodCallSynth(assign, 1, _, _, _) and
@@ -1050,26 +1093,41 @@ private module DestructuredAssignDesugar {
final override predicate location(AstNode n, Location l) {
exists(DestructuredAssignExpr tae, StmtSequence seq | seq = tae.getDesugared() |
n = seq.getStmt(0) and
synthChild(seq, tae.getNumberOfElements(), n) and
hasLocation(tae.getRightOperand(), l)
or
exists(AstNode elem, int j |
exists(MethodCall elem, int j |
elem = tae.getElement(j) and
n = seq.getStmt(j + 1) and
synthChild(seq, j, n) and
hasLocation(elem.getReceiver(), l)
)
or
exists(AstNode elem, int j | elem = tae.getElement(j) |
synthChild(seq, j + 1 + tae.getNumberOfElements(), n) and
hasLocation(elem, l)
)
)
}
final override predicate localVariable(AstNode n, int i) {
n instanceof DestructuredAssignExpr and
i = 0
i = [0 .. n.(DestructuredAssignExpr).getNumberOfElements()]
}
final override predicate methodCall(string name, boolean setter, int arity) {
name = "[]" and
setter = false and
arity = 1
or
exists(DestructuredAssignExpr tae, MethodCall mc |
mc = tae.getElement(_) and
name = mc.getMethodName() and
setter = false and
arity = mc.getNumberOfArguments()
)
}
final override predicate excludeFromControlFlowTree(AstNode n) {
n = any(DestructuredAssignExpr tae).getElement(_).(MethodCall)
}
}
}

View File

@@ -81,44 +81,53 @@ calls/calls.rb:
# 318| [AssignExpr] ... = ...
# 318| getDesugared: [StmtSequence] ...
# 318| getStmt: [AssignExpr] ... = ...
# 318| getAnOperand/getLeftOperand: [MethodCall] call to foo
# 318| getAnOperand/getRightOperand: [SelfVariableAccess] self
# 318| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__0
# 318| getStmt: [AssignExpr] ... = ...
# 318| getDesugared: [StmtSequence] ...
# 318| getStmt: [SetterMethodCall] call to foo=
# 318| getReceiver: [SelfVariableAccess] self
# 318| getReceiver: [LocalVariableAccess] __synth__0
# 318| getArgument: [AssignExpr] ... = ...
# 318| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__0__1
# 318| getAnOperand/getRightOperand: [MethodCall] call to []
# 318| getReceiver: [LocalVariableAccess] __synth__0
# 318| getReceiver: [LocalVariableAccess] __synth__3
# 318| getArgument: [IntegerLiteral] 0
# 318| getStmt: [LocalVariableAccess] __synth__0__1
# 318| getAnOperand/getLeftOperand: [MethodCall] call to foo
# 318| getStmt: [AssignExpr] ... = ...
# 318| getAnOperand/getRightOperand: [SelfVariableAccess] self
# 318| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__1
# 318| getStmt: [AssignExpr] ... = ...
# 318| getAnOperand/getLeftOperand: [MethodCall] call to bar
# 318| getDesugared: [StmtSequence] ...
# 318| getStmt: [SetterMethodCall] call to bar=
# 318| getReceiver: [SelfVariableAccess] self
# 318| getReceiver: [LocalVariableAccess] __synth__1
# 318| getArgument: [AssignExpr] ... = ...
# 318| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__0__1
# 318| getAnOperand/getRightOperand: [MethodCall] call to []
# 318| getReceiver: [LocalVariableAccess] __synth__0
# 318| getReceiver: [LocalVariableAccess] __synth__3
# 318| getArgument: [RangeLiteral] _ .. _
# 318| getBegin: [IntegerLiteral] 1
# 318| getEnd: [IntegerLiteral] -2
# 318| getStmt: [LocalVariableAccess] __synth__0__1
# 318| getAnOperand/getLeftOperand: [MethodCall] call to bar
# 318| getStmt: [AssignExpr] ... = ...
# 318| getAnOperand/getRightOperand: [MethodCall] call to foo
# 318| getReceiver: [SelfVariableAccess] self
# 318| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__2
# 318| getStmt: [AssignExpr] ... = ...
# 318| getAnOperand/getLeftOperand: [ElementReference] ...[...]
# 318| getDesugared: [StmtSequence] ...
# 318| getStmt: [SetterMethodCall] call to []=
# 318| getReceiver: [MethodCall] call to foo
# 318| getReceiver: [SelfVariableAccess] self
# 318| getReceiver: [LocalVariableAccess] __synth__2
# 318| getArgument: [AssignExpr] ... = ...
# 318| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__0__1
# 318| getAnOperand/getRightOperand: [MethodCall] call to []
# 318| getReceiver: [LocalVariableAccess] __synth__0
# 318| getReceiver: [LocalVariableAccess] __synth__3
# 318| getArgument: [IntegerLiteral] -1
# 318| getArgument: [IntegerLiteral] 4
# 318| getStmt: [LocalVariableAccess] __synth__0__1
# 318| getAnOperand/getLeftOperand: [MethodCall] call to []
# 318| getStmt: [AssignExpr] ... = ...
# 318| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__0
# 318| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__3
# 318| getAnOperand/getRightOperand: [SplatExpr] * ...
# 318| getAnOperand/getOperand/getReceiver: [ArrayLiteral] [...]
# 318| getDesugared: [MethodCall] call to []
@@ -132,25 +141,28 @@ calls/calls.rb:
# 319| getStmt: [AssignExpr] ... = ...
# 319| getAnOperand/getLeftOperand: [LocalVariableAccess] a
# 319| getAnOperand/getRightOperand: [MethodCall] call to []
# 319| getReceiver: [LocalVariableAccess] __synth__0
# 319| getReceiver: [LocalVariableAccess] __synth__2
# 319| getArgument: [IntegerLiteral] 0
# 319| getStmt: [AssignExpr] ... = ...
# 319| getAnOperand/getLeftOperand: [ElementReference] ...[...]
# 319| getAnOperand/getRightOperand: [MethodCall] call to foo
# 319| getReceiver: [SelfVariableAccess] self
# 319| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__1
# 319| getStmt: [AssignExpr] ... = ...
# 319| getDesugared: [StmtSequence] ...
# 319| getStmt: [SetterMethodCall] call to []=
# 319| getReceiver: [MethodCall] call to foo
# 319| getReceiver: [SelfVariableAccess] self
# 319| getReceiver: [LocalVariableAccess] __synth__1
# 319| getArgument: [AssignExpr] ... = ...
# 319| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__0__1
# 319| getAnOperand/getRightOperand: [MethodCall] call to []
# 319| getReceiver: [LocalVariableAccess] __synth__0
# 319| getReceiver: [LocalVariableAccess] __synth__2
# 319| getArgument: [RangeLiteral] _ .. _
# 319| getBegin: [IntegerLiteral] 1
# 319| getEnd: [IntegerLiteral] -1
# 319| getArgument: [IntegerLiteral] 5
# 319| getStmt: [LocalVariableAccess] __synth__0__1
# 319| getAnOperand/getLeftOperand: [MethodCall] call to []
# 319| getStmt: [AssignExpr] ... = ...
# 319| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__0
# 319| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__2
# 319| getAnOperand/getRightOperand: [SplatExpr] * ...
# 319| getAnOperand/getOperand/getReceiver: [ArrayLiteral] [...]
# 319| getDesugared: [MethodCall] call to []
@@ -240,23 +252,23 @@ calls/calls.rb:
# 342| getStmt: [AssignExpr] ... = ...
# 342| getDesugared: [StmtSequence] ...
# 342| getStmt: [AssignExpr] ... = ...
# 342| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__0__1
# 342| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__3__1
# 342| getAnOperand/getRightOperand: [SplatExpr] * ...
# 342| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0__1
# 342| getStmt: [AssignExpr] ... = ...
# 342| getAnOperand/getLeftOperand: [LocalVariableAccess] x
# 342| getAnOperand/getRightOperand: [MethodCall] call to []
# 342| getReceiver: [LocalVariableAccess] __synth__0__1
# 342| getReceiver: [LocalVariableAccess] __synth__3__1
# 342| getArgument: [IntegerLiteral] 0
# 342| getStmt: [AssignExpr] ... = ...
# 342| getAnOperand/getLeftOperand: [LocalVariableAccess] y
# 342| getAnOperand/getRightOperand: [MethodCall] call to []
# 342| getReceiver: [LocalVariableAccess] __synth__0__1
# 342| getReceiver: [LocalVariableAccess] __synth__3__1
# 342| getArgument: [IntegerLiteral] 1
# 342| getStmt: [AssignExpr] ... = ...
# 342| getAnOperand/getLeftOperand: [LocalVariableAccess] z
# 342| getAnOperand/getRightOperand: [MethodCall] call to []
# 342| getReceiver: [LocalVariableAccess] __synth__0__1
# 342| getReceiver: [LocalVariableAccess] __synth__3__1
# 342| getArgument: [IntegerLiteral] 2
# 342| getAnOperand/getLeftOperand: [DestructuredLhsExpr] (..., ...)
# 343| getStmt: [MethodCall] call to foo
@@ -632,18 +644,18 @@ control/loops.rb:
# 22| getStmt: [AssignExpr] ... = ...
# 22| getDesugared: [StmtSequence] ...
# 22| getStmt: [AssignExpr] ... = ...
# 22| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__0__1
# 22| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__2__1
# 22| getAnOperand/getRightOperand: [SplatExpr] * ...
# 22| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0__1
# 22| getStmt: [AssignExpr] ... = ...
# 22| getAnOperand/getLeftOperand: [LocalVariableAccess] key
# 22| getAnOperand/getRightOperand: [MethodCall] call to []
# 22| getReceiver: [LocalVariableAccess] __synth__0__1
# 22| getReceiver: [LocalVariableAccess] __synth__2__1
# 22| getArgument: [IntegerLiteral] 0
# 22| getStmt: [AssignExpr] ... = ...
# 22| getAnOperand/getLeftOperand: [LocalVariableAccess] value
# 22| getAnOperand/getRightOperand: [MethodCall] call to []
# 22| getReceiver: [LocalVariableAccess] __synth__0__1
# 22| getReceiver: [LocalVariableAccess] __synth__2__1
# 22| getArgument: [IntegerLiteral] 1
# 22| getAnOperand/getLeftOperand: [DestructuredLhsExpr] (..., ...)
# 23| getStmt: [AssignAddExpr] ... += ...
@@ -677,18 +689,18 @@ control/loops.rb:
# 28| getStmt: [AssignExpr] ... = ...
# 28| getDesugared: [StmtSequence] ...
# 28| getStmt: [AssignExpr] ... = ...
# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__0__1
# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] __synth__2__1
# 28| getAnOperand/getRightOperand: [SplatExpr] * ...
# 28| getAnOperand/getOperand/getReceiver: [LocalVariableAccess] __synth__0__1
# 28| getStmt: [AssignExpr] ... = ...
# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] key
# 28| getAnOperand/getRightOperand: [MethodCall] call to []
# 28| getReceiver: [LocalVariableAccess] __synth__0__1
# 28| getReceiver: [LocalVariableAccess] __synth__2__1
# 28| getArgument: [IntegerLiteral] 0
# 28| getStmt: [AssignExpr] ... = ...
# 28| getAnOperand/getLeftOperand: [LocalVariableAccess] value
# 28| getAnOperand/getRightOperand: [MethodCall] call to []
# 28| getReceiver: [LocalVariableAccess] __synth__0__1
# 28| getReceiver: [LocalVariableAccess] __synth__2__1
# 28| getArgument: [IntegerLiteral] 1
# 28| getAnOperand/getLeftOperand: [DestructuredLhsExpr] (..., ...)
# 29| getStmt: [AssignAddExpr] ... += ...

View File

@@ -61,6 +61,7 @@ callsWithArguments
| calls.rb:318:12:318:19 | call to bar= | bar= | 0 | calls.rb:318:12:318:19 | ... = ... |
| calls.rb:318:22:318:27 | ...[...] | [] | 0 | calls.rb:318:26:318:26 | 4 |
| calls.rb:318:22:318:27 | call to [] | [] | 0 | calls.rb:318:22:318:27 | -1 |
| calls.rb:318:22:318:27 | call to [] | [] | 0 | calls.rb:318:26:318:26 | 4 |
| calls.rb:318:22:318:27 | call to []= | []= | 0 | calls.rb:318:26:318:26 | 4 |
| calls.rb:318:22:318:27 | call to []= | []= | 1 | calls.rb:318:22:318:27 | ... = ... |
| calls.rb:318:31:318:42 | call to [] | [] | 0 | calls.rb:318:32:318:32 | 1 |
@@ -70,6 +71,7 @@ callsWithArguments
| calls.rb:319:1:319:1 | call to [] | [] | 0 | calls.rb:319:1:319:1 | 0 |
| calls.rb:319:5:319:10 | ...[...] | [] | 0 | calls.rb:319:9:319:9 | 5 |
| calls.rb:319:5:319:10 | call to [] | [] | 0 | calls.rb:319:5:319:10 | _ .. _ |
| calls.rb:319:5:319:10 | call to [] | [] | 0 | calls.rb:319:9:319:9 | 5 |
| calls.rb:319:5:319:10 | call to []= | []= | 0 | calls.rb:319:9:319:9 | 5 |
| calls.rb:319:5:319:10 | call to []= | []= | 1 | calls.rb:319:5:319:10 | ... = ... |
| calls.rb:319:14:319:22 | call to [] | [] | 0 | calls.rb:319:15:319:15 | 1 |
@@ -321,23 +323,27 @@ callsWithReceiver
| calls.rb:317:1:317:3 | call to foo | calls.rb:317:1:317:3 | self |
| calls.rb:317:1:317:6 | ...[...] | calls.rb:317:1:317:3 | call to foo |
| calls.rb:317:1:317:6 | call to []= | calls.rb:317:1:317:3 | call to foo |
| calls.rb:318:1:318:8 | call to [] | calls.rb:318:1:318:8 | __synth__0 |
| calls.rb:318:1:318:8 | call to [] | calls.rb:318:1:318:8 | __synth__3 |
| calls.rb:318:1:318:8 | call to foo | calls.rb:318:1:318:4 | self |
| calls.rb:318:1:318:8 | call to foo= | calls.rb:318:1:318:4 | self |
| calls.rb:318:12:318:19 | call to [] | calls.rb:318:12:318:19 | __synth__0 |
| calls.rb:318:1:318:8 | call to foo | calls.rb:318:1:318:8 | __synth__0 |
| calls.rb:318:1:318:8 | call to foo= | calls.rb:318:1:318:8 | __synth__0 |
| calls.rb:318:12:318:19 | call to [] | calls.rb:318:12:318:19 | __synth__3 |
| calls.rb:318:12:318:19 | call to bar | calls.rb:318:12:318:15 | self |
| calls.rb:318:12:318:19 | call to bar= | calls.rb:318:12:318:15 | self |
| calls.rb:318:12:318:19 | call to bar | calls.rb:318:12:318:19 | __synth__1 |
| calls.rb:318:12:318:19 | call to bar= | calls.rb:318:12:318:19 | __synth__1 |
| calls.rb:318:22:318:24 | call to foo | calls.rb:318:22:318:24 | self |
| calls.rb:318:22:318:27 | ...[...] | calls.rb:318:22:318:24 | call to foo |
| calls.rb:318:22:318:27 | call to [] | calls.rb:318:22:318:27 | __synth__0 |
| calls.rb:318:22:318:27 | call to []= | calls.rb:318:22:318:24 | call to foo |
| calls.rb:318:22:318:27 | call to [] | calls.rb:318:22:318:27 | __synth__2 |
| calls.rb:318:22:318:27 | call to [] | calls.rb:318:22:318:27 | __synth__3 |
| calls.rb:318:22:318:27 | call to []= | calls.rb:318:22:318:27 | __synth__2 |
| calls.rb:318:31:318:42 | * ... | calls.rb:318:31:318:42 | [...] |
| calls.rb:318:31:318:42 | call to [] | calls.rb:318:31:318:42 | Array |
| calls.rb:319:1:319:1 | call to [] | calls.rb:319:1:319:1 | __synth__0 |
| calls.rb:319:1:319:1 | call to [] | calls.rb:319:1:319:1 | __synth__2 |
| calls.rb:319:5:319:7 | call to foo | calls.rb:319:5:319:7 | self |
| calls.rb:319:5:319:10 | ...[...] | calls.rb:319:5:319:7 | call to foo |
| calls.rb:319:5:319:10 | call to [] | calls.rb:319:5:319:10 | __synth__0 |
| calls.rb:319:5:319:10 | call to []= | calls.rb:319:5:319:7 | call to foo |
| calls.rb:319:5:319:10 | call to [] | calls.rb:319:5:319:10 | __synth__1 |
| calls.rb:319:5:319:10 | call to [] | calls.rb:319:5:319:10 | __synth__2 |
| calls.rb:319:5:319:10 | call to []= | calls.rb:319:5:319:10 | __synth__1 |
| calls.rb:319:14:319:22 | * ... | calls.rb:319:14:319:22 | [...] |
| calls.rb:319:14:319:22 | call to [] | calls.rb:319:14:319:22 | Array |
| calls.rb:320:1:320:10 | call to count | calls.rb:320:1:320:4 | __synth__0 |
@@ -370,9 +376,9 @@ callsWithReceiver
| calls.rb:338:3:338:13 | call to bar | calls.rb:338:3:338:13 | self |
| calls.rb:342:1:344:3 | * ... | calls.rb:342:1:344:3 | __synth__0__1 |
| calls.rb:342:1:344:3 | call to each | calls.rb:342:16:342:33 | [...] |
| calls.rb:342:5:342:5 | call to [] | calls.rb:342:5:342:5 | __synth__0__1 |
| calls.rb:342:8:342:8 | call to [] | calls.rb:342:8:342:8 | __synth__0__1 |
| calls.rb:342:11:342:11 | call to [] | calls.rb:342:11:342:11 | __synth__0__1 |
| calls.rb:342:5:342:5 | call to [] | calls.rb:342:5:342:5 | __synth__3__1 |
| calls.rb:342:8:342:8 | call to [] | calls.rb:342:8:342:8 | __synth__3__1 |
| calls.rb:342:11:342:11 | call to [] | calls.rb:342:11:342:11 | __synth__3__1 |
| calls.rb:342:16:342:33 | call to [] | calls.rb:342:16:342:33 | Array |
| calls.rb:342:17:342:23 | call to [] | calls.rb:342:17:342:23 | Array |
| calls.rb:342:26:342:32 | call to [] | calls.rb:342:26:342:32 | Array |

View File

@@ -2083,7 +2083,7 @@ cfg.rb:
#-----| -> constant
# 61| ... = ...
#-----| -> __synth__0
#-----| -> __synth__2
# 61| "constant"
#-----| -> ... = ...
@@ -2095,19 +2095,19 @@ cfg.rb:
#-----| -> pattern
# 62| ... = ...
#-----| -> __synth__0__1
#-----| -> __synth__2__1
# 62| 0
#-----| -> call to []
# 62| __synth__0
# 62| __synth__2
#-----| -> 0
# 62| call to []
#-----| -> ... = ...
# 62| x
#-----| -> __synth__0
#-----| -> __synth__2
# 62| * ...
#-----| -> ... = ...
@@ -2121,11 +2121,11 @@ cfg.rb:
# 62| 1
#-----| -> call to []
# 62| __synth__0
# 62| __synth__2
#-----| -> 1
# 62| __synth__0__1
#-----| -> __synth__0
# 62| __synth__2__1
#-----| -> __synth__2
# 62| call to []
#-----| -> * ...
@@ -2136,14 +2136,14 @@ cfg.rb:
# 62| 0
#-----| -> call to []
# 62| __synth__0__1
# 62| __synth__2__1
#-----| -> 0
# 62| call to []
#-----| -> ... = ...
# 62| y
#-----| -> __synth__0__1
#-----| -> __synth__2__1
# 62| ... = ...
#-----| -> ...
@@ -2151,14 +2151,14 @@ cfg.rb:
# 62| 1
#-----| -> call to []
# 62| __synth__0__1
# 62| __synth__2__1
#-----| -> 1
# 62| call to []
#-----| -> ... = ...
# 62| z
#-----| -> __synth__0__1
#-----| -> __synth__2__1
# 62| * ...
#-----| -> ... = ...
@@ -2169,7 +2169,7 @@ cfg.rb:
# 62| Array
#-----| -> 1
# 62| __synth__0
# 62| __synth__2
#-----| -> Array
# 62| call to []
@@ -2918,7 +2918,7 @@ cfg.rb:
#-----| raise -> self
# 136| ... rescue ...
#-----| -> __synth__0
#-----| -> __synth__2
# 136| 0
#-----| -> ... / ...
@@ -2950,14 +2950,14 @@ cfg.rb:
# 138| _ .. _
#-----| -> call to []
# 138| __synth__0
# 138| __synth__2
#-----| -> 0
# 138| call to []
#-----| -> ... = ...
# 138| init
#-----| -> __synth__0
#-----| -> __synth__2
# 138| -1
#-----| -> call to []
@@ -2965,14 +2965,14 @@ cfg.rb:
# 138| ... = ...
#-----| -> ...
# 138| __synth__0
# 138| __synth__2
#-----| -> -1
# 138| call to []
#-----| -> ... = ...
# 138| last
#-----| -> __synth__0
#-----| -> __synth__2
# 138| 1
#-----| -> 2
@@ -2986,7 +2986,7 @@ cfg.rb:
# 138| ..., ...
#-----| -> * ...
# 138| __synth__0
# 138| __synth__2
#-----| -> 1
# 138| 2
@@ -4151,7 +4151,7 @@ desugar.rb:
#-----| -> ... + ...
# 21| enter m6
#-----| -> __synth__0
#-----| -> __synth__2
# 21| exit m6
@@ -4167,14 +4167,14 @@ desugar.rb:
# 22| 0
#-----| -> call to []
# 22| __synth__0
# 22| __synth__3
#-----| -> 0
# 22| call to []
#-----| -> ... = ...
# 22| x
#-----| -> __synth__0
#-----| -> __synth__3
# 22| ...
#-----| -> exit m6 (normal)
@@ -4183,7 +4183,7 @@ desugar.rb:
#-----| -> _ .. _
# 22| ... = ...
#-----| -> self
#-----| -> __synth__2
# 22| 1
#-----| -> -2
@@ -4191,17 +4191,23 @@ desugar.rb:
# 22| _ .. _
#-----| -> call to []
# 22| __synth__0
# 22| __synth__3
#-----| -> 1
# 22| call to []
#-----| -> ... = ...
# 22| y
#-----| -> __synth__0
#-----| -> __synth__3
# 22| ... = ...
#-----| -> __synth__3
# 22| __synth__2
#-----| -> self
# 22| call to z
#-----| -> __synth__0__1
#-----| -> ... = ...
# 22| self
#-----| -> call to z
@@ -4215,14 +4221,17 @@ desugar.rb:
# 22| ... = ...
#-----| -> call to bar=
# 22| __synth__0
#-----| -> -1
# 22| __synth__0__1
#-----| -> ...
# 22| __synth__0__1
#-----| -> __synth__0
#-----| -> __synth__3
# 22| __synth__2
#-----| -> __synth__0__1
# 22| __synth__3
#-----| -> -1
# 22| call to []
#-----| -> ... = ...
@@ -4239,7 +4248,7 @@ desugar.rb:
# 22| Array
#-----| -> 1
# 22| __synth__0
# 22| __synth__3
#-----| -> Array
# 22| call to []
@@ -4258,7 +4267,7 @@ desugar.rb:
#-----| -> call to []
# 25| enter m7
#-----| -> __synth__0
#-----| -> __synth__2
# 25| exit m7
@@ -4269,19 +4278,19 @@ desugar.rb:
#-----| -> X
# 26| ... = ...
#-----| -> __synth__0__1
#-----| -> __synth__2__1
# 26| 0
#-----| -> call to []
# 26| __synth__0
# 26| __synth__2
#-----| -> 0
# 26| call to []
#-----| -> ... = ...
# 26| x
#-----| -> __synth__0
#-----| -> __synth__2
# 26| ...
#-----| -> exit m7 (normal)
@@ -4298,11 +4307,11 @@ desugar.rb:
# 26| 1
#-----| -> call to []
# 26| __synth__0
# 26| __synth__2
#-----| -> 1
# 26| __synth__0__1
#-----| -> __synth__0
# 26| __synth__2__1
#-----| -> __synth__2
# 26| call to []
#-----| -> * ...
@@ -4313,14 +4322,14 @@ desugar.rb:
# 26| 0
#-----| -> call to []
# 26| __synth__0__1
# 26| __synth__2__1
#-----| -> 0
# 26| call to []
#-----| -> ... = ...
# 26| y
#-----| -> __synth__0__1
#-----| -> __synth__2__1
# 26| ... = ...
#-----| -> ...
@@ -4328,14 +4337,14 @@ desugar.rb:
# 26| 1
#-----| -> call to []
# 26| __synth__0__1
# 26| __synth__2__1
#-----| -> 1
# 26| call to []
#-----| -> ... = ...
# 26| z
#-----| -> __synth__0__1
#-----| -> __synth__2__1
# 26| * ...
#-----| -> ... = ...
@@ -4346,7 +4355,7 @@ desugar.rb:
# 26| Array
#-----| -> 1
# 26| __synth__0
# 26| __synth__2
#-----| -> Array
# 26| call to []

View File

@@ -203,10 +203,10 @@ edges
| array_flow.rb:80:13:80:21 | call to source : | array_flow.rb:80:5:80:5 | a [element 1] : |
| array_flow.rb:81:8:81:8 | c : | array_flow.rb:83:10:83:10 | c |
| array_flow.rb:81:8:81:8 | c : | array_flow.rb:83:10:83:10 | c |
| array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | array_flow.rb:81:8:81:8 | c : |
| array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | array_flow.rb:81:8:81:8 | c : |
| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:81:15:81:15 | __synth__0 [element 1] : |
| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:81:15:81:15 | __synth__0 [element 1] : |
| array_flow.rb:81:15:81:15 | __synth__3 [element 1] : | array_flow.rb:81:8:81:8 | c : |
| array_flow.rb:81:15:81:15 | __synth__3 [element 1] : | array_flow.rb:81:8:81:8 | c : |
| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:81:15:81:15 | __synth__3 [element 1] : |
| array_flow.rb:81:15:81:15 | a [element 1] : | array_flow.rb:81:15:81:15 | __synth__3 [element 1] : |
| array_flow.rb:88:5:88:5 | a [element 1] : | array_flow.rb:89:9:89:9 | a [element 1] : |
| array_flow.rb:88:5:88:5 | a [element 1] : | array_flow.rb:89:9:89:9 | a [element 1] : |
| array_flow.rb:88:13:88:22 | call to source : | array_flow.rb:88:5:88:5 | a [element 1] : |
@@ -4460,8 +4460,8 @@ nodes
| array_flow.rb:80:13:80:21 | call to source : | semmle.label | call to source : |
| array_flow.rb:81:8:81:8 | c : | semmle.label | c : |
| array_flow.rb:81:8:81:8 | c : | semmle.label | c : |
| array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | semmle.label | __synth__0 [element 1] : |
| array_flow.rb:81:15:81:15 | __synth__0 [element 1] : | semmle.label | __synth__0 [element 1] : |
| array_flow.rb:81:15:81:15 | __synth__3 [element 1] : | semmle.label | __synth__3 [element 1] : |
| array_flow.rb:81:15:81:15 | __synth__3 [element 1] : | semmle.label | __synth__3 [element 1] : |
| array_flow.rb:81:15:81:15 | a [element 1] : | semmle.label | a [element 1] : |
| array_flow.rb:81:15:81:15 | a [element 1] : | semmle.label | a [element 1] : |
| array_flow.rb:83:10:83:10 | c | semmle.label | c |

View File

@@ -96,10 +96,10 @@ definition
| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a |
| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a |
| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b |
| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 |
| scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:10:13:15 | __synth__2__1 |
| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c |
| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d |
| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 |
| scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 |
| scopes.rb:26:1:26:12 | self (A) | scopes.rb:26:1:26:12 | self |
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x |
| scopes.rb:28:1:30:3 | self (B) | scopes.rb:28:1:30:3 | self |
@@ -282,13 +282,13 @@ read
| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a |
| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a |
| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b |
| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 |
| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 |
| scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:11:13:11 | __synth__2__1 |
| scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:14:13:14 | __synth__2__1 |
| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c |
| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d |
| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 |
| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 |
| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 |
| scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | scopes.rb:13:4:13:4 | __synth__3 |
| scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | scopes.rb:13:7:13:7 | __synth__3 |
| scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | scopes.rb:13:10:13:15 | __synth__3 |
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x |
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x |
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x |
@@ -454,10 +454,10 @@ firstRead
| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a |
| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a |
| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b |
| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 |
| scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:11:13:11 | __synth__2__1 |
| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c |
| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d |
| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 |
| scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | scopes.rb:13:4:13:4 | __synth__3 |
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x |
| scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | scopes.rb:45:5:45:7 | self |
| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var |
@@ -604,10 +604,10 @@ lastRead
| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:12:9:12:9 | a |
| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:14:9:14:9 | a |
| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:15:9:15:9 | b |
| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 |
| scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:14:13:14 | __synth__2__1 |
| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:16:9:16:9 | c |
| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:17:9:17:9 | d |
| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 |
| scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | scopes.rb:13:10:13:15 | __synth__3 |
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:37:5:37:5 | x |
| scopes.rb:41:1:49:3 | self (M) | scopes.rb:41:1:49:3 | self | scopes.rb:45:5:45:7 | self |
| scopes.rb:42:2:42:4 | var | scopes.rb:42:2:42:4 | var | scopes.rb:44:5:44:7 | var |
@@ -693,9 +693,9 @@ adjacentReads
| scopes.rb:9:9:18:3 | <captured entry> self | scopes.rb:1:1:49:4 | self | scopes.rb:14:4:14:9 | self | scopes.rb:15:4:15:9 | self |
| scopes.rb:9:9:18:3 | <captured entry> self | scopes.rb:1:1:49:4 | self | scopes.rb:15:4:15:9 | self | scopes.rb:16:4:16:9 | self |
| scopes.rb:9:9:18:3 | <captured entry> self | scopes.rb:1:1:49:4 | self | scopes.rb:16:4:16:9 | self | scopes.rb:17:4:17:9 | self |
| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:11:13:11 | __synth__0__1 | scopes.rb:13:14:13:14 | __synth__0__1 |
| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:4:13:4 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 |
| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:4:13:32 | __synth__0 | scopes.rb:13:7:13:7 | __synth__0 | scopes.rb:13:10:13:15 | __synth__0 |
| scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:11:13:11 | __synth__2__1 | scopes.rb:13:14:13:14 | __synth__2__1 |
| scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | scopes.rb:13:4:13:4 | __synth__3 | scopes.rb:13:7:13:7 | __synth__3 |
| scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:4:13:32 | __synth__3 | scopes.rb:13:7:13:7 | __synth__3 | scopes.rb:13:10:13:15 | __synth__3 |
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:28:8:28:8 | x | scopes.rb:31:10:31:10 | x |
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | scopes.rb:34:7:34:7 | x |
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:1 | x | scopes.rb:34:7:34:7 | x | scopes.rb:34:14:34:14 | x |

View File

@@ -332,12 +332,12 @@ explicitWrite
| scopes.rb:13:4:13:4 | a | scopes.rb:13:4:13:32 | ... = ... |
| scopes.rb:13:7:13:7 | b | scopes.rb:13:4:13:32 | ... = ... |
| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | ... = ... |
| scopes.rb:13:10:13:15 | __synth__0__1 | scopes.rb:13:10:13:15 | ... = ... |
| scopes.rb:13:10:13:15 | __synth__2__1 | scopes.rb:13:10:13:15 | ... = ... |
| scopes.rb:13:11:13:11 | c | scopes.rb:13:4:13:32 | ... = ... |
| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | ... = ... |
| scopes.rb:13:14:13:14 | d | scopes.rb:13:4:13:32 | ... = ... |
| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | ... = ... |
| scopes.rb:13:19:13:32 | __synth__0 | scopes.rb:13:19:13:32 | ... = ... |
| scopes.rb:13:19:13:32 | __synth__3 | scopes.rb:13:19:13:32 | ... = ... |
| scopes.rb:21:1:21:7 | $global | scopes.rb:21:1:21:12 | ... = ... |
| scopes.rb:24:1:24:6 | script | scopes.rb:24:1:24:11 | ... = ... |
| scopes.rb:27:1:27:1 | x | scopes.rb:27:1:27:5 | ... = ... |
@@ -525,11 +525,11 @@ readAccess
| scopes.rb:11:4:11:4 | a |
| scopes.rb:12:4:12:9 | self |
| scopes.rb:12:9:12:9 | a |
| scopes.rb:13:4:13:4 | __synth__0 |
| scopes.rb:13:7:13:7 | __synth__0 |
| scopes.rb:13:10:13:15 | __synth__0 |
| scopes.rb:13:11:13:11 | __synth__0__1 |
| scopes.rb:13:14:13:14 | __synth__0__1 |
| scopes.rb:13:4:13:4 | __synth__3 |
| scopes.rb:13:7:13:7 | __synth__3 |
| scopes.rb:13:10:13:15 | __synth__3 |
| scopes.rb:13:11:13:11 | __synth__2__1 |
| scopes.rb:13:14:13:14 | __synth__2__1 |
| scopes.rb:14:4:14:9 | self |
| scopes.rb:14:9:14:9 | a |
| scopes.rb:15:4:15:9 | self |

View File

@@ -100,8 +100,13 @@
| scopes.rb:7:1:7:1 | a |
| scopes.rb:9:14:9:14 | x |
| scopes.rb:13:4:13:32 | __synth__0 |
| scopes.rb:13:4:13:32 | __synth__1 |
| scopes.rb:13:4:13:32 | __synth__2 |
| scopes.rb:13:4:13:32 | __synth__3 |
| scopes.rb:13:7:13:7 | b |
| scopes.rb:13:10:13:15 | __synth__0__1 |
| scopes.rb:13:10:13:15 | __synth__1__1 |
| scopes.rb:13:10:13:15 | __synth__2__1 |
| scopes.rb:13:11:13:11 | c |
| scopes.rb:13:14:13:14 | d |
| scopes.rb:24:1:24:6 | script |