From 14474d660b7259af16917394653e7dda46296584 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 18 Feb 2021 13:51:04 +0100 Subject: [PATCH 01/10] AST: change types to Stmt --- ql/src/codeql_ruby/ast/Control.qll | 28 +++++------ ql/src/codeql_ruby/ast/Operation.qll | 4 +- ql/src/codeql_ruby/ast/internal/Control.qll | 46 +++++++++---------- ql/src/codeql_ruby/ast/internal/Operation.qll | 6 +-- 4 files changed, 42 insertions(+), 42 deletions(-) diff --git a/ql/src/codeql_ruby/ast/Control.qll b/ql/src/codeql_ruby/ast/Control.qll index 6f5a7dbcded..e9ff5675778 100644 --- a/ql/src/codeql_ruby/ast/Control.qll +++ b/ql/src/codeql_ruby/ast/Control.qll @@ -35,7 +35,7 @@ class ConditionalExpr extends ControlExpr { * Gets the branch of this conditional expression that is taken when the * condition evaluates to `cond`, if any. */ - Expr getBranch(boolean cond) { result = range.getBranch(cond) } + Stmt getBranch(boolean cond) { result = range.getBranch(cond) } } /** @@ -57,7 +57,7 @@ class IfExpr extends ConditionalExpr { final predicate isElsif() { this instanceof @elsif } /** Gets the 'then' branch of this `if`/`elsif` expression. */ - final StmtSequence getThen() { result = range.getThen() } + final Stmt getThen() { result = range.getThen() } /** * Gets the `elsif`/`else` branch of this `if`/`elsif` expression, if any. In @@ -90,7 +90,7 @@ class IfExpr extends ConditionalExpr { * end * ``` */ - final Expr getElse() { result = range.getElse() } + final Stmt getElse() { result = range.getElse() } } /** @@ -117,7 +117,7 @@ class UnlessExpr extends ConditionalExpr, @unless { * end * ``` */ - final StmtSequence getThen() { result = range.getThen() } + final Stmt getThen() { result = range.getThen() } /** * Gets the 'else' branch of this `unless` expression. In the following @@ -130,7 +130,7 @@ class UnlessExpr extends ConditionalExpr, @unless { * end * ``` */ - final StmtSequence getElse() { result = range.getElse() } + final Stmt getElse() { result = range.getElse() } } /** @@ -151,7 +151,7 @@ class IfModifierExpr extends ConditionalExpr, @if_modifier { * foo if bar * ``` */ - final Expr getExpr() { result = range.getExpr() } + final Stmt getExpr() { result = range.getExpr() } } /** @@ -172,7 +172,7 @@ class UnlessModifierExpr extends ConditionalExpr, @unless_modifier { * foo unless bar * ``` */ - final Expr getExpr() { result = range.getExpr() } + final Stmt getExpr() { result = range.getExpr() } } /** @@ -187,10 +187,10 @@ class TernaryIfExpr extends ConditionalExpr, @conditional { final override string getAPrimaryQlClass() { result = "TernaryIfExpr" } /** Gets the 'then' branch of this ternary if expression. */ - final Expr getThen() { result = range.getThen() } + final Stmt getThen() { result = range.getThen() } /** Gets the 'else' branch of this ternary if expression. */ - final Expr getElse() { result = range.getElse() } + final Stmt getElse() { result = range.getElse() } } class CaseExpr extends ControlExpr, @case__ { @@ -257,7 +257,7 @@ class WhenExpr extends Expr, @when { final override string getAPrimaryQlClass() { result = "WhenExpr" } /** Gets the body of this case-when expression. */ - final StmtSequence getBody() { result = range.getBody() } + final Stmt getBody() { result = range.getBody() } /** * Gets the `n`th pattern (or condition) in this case-when expression. In the @@ -291,7 +291,7 @@ class Loop extends ControlExpr { override Loop::Range range; /** Gets the body of this loop. */ - Expr getBody() { result = range.getBody() } + Stmt getBody() { result = range.getBody() } } /** @@ -320,7 +320,7 @@ class WhileExpr extends ConditionalLoop, @while { final override string getAPrimaryQlClass() { result = "WhileExpr" } /** Gets the body of this `while` loop. */ - final override StmtSequence getBody() { result = range.getBody() } + final override Stmt getBody() { result = range.getBody() } } /** @@ -338,7 +338,7 @@ class UntilExpr extends ConditionalLoop, @until { final override string getAPrimaryQlClass() { result = "UntilExpr" } /** Gets the body of this `until` loop. */ - final override StmtSequence getBody() { result = range.getBody() } + final override Stmt getBody() { result = range.getBody() } } /** @@ -379,7 +379,7 @@ class ForExpr extends Loop, @for { final override string getAPrimaryQlClass() { result = "ForExpr" } /** Gets the body of this `for` loop. */ - final override Expr getBody() { result = range.getBody() } + final override Stmt getBody() { result = range.getBody() } /** Gets the pattern representing the iteration argument. */ final Pattern getPattern() { result = range.getPattern() } diff --git a/ql/src/codeql_ruby/ast/Operation.qll b/ql/src/codeql_ruby/ast/Operation.qll index 1b2458777f5..a25b0e4df16 100644 --- a/ql/src/codeql_ruby/ast/Operation.qll +++ b/ql/src/codeql_ruby/ast/Operation.qll @@ -105,10 +105,10 @@ class BinaryOperation extends Operation, @binary { override BinaryOperation::Range range; /** Gets the left operand of this binary operation. */ - final Expr getLeftOperand() { result = range.getLeftOperand() } + final Stmt getLeftOperand() { result = range.getLeftOperand() } /** Gets the right operand of this binary operation. */ - final Expr getRightOperand() { result = range.getRightOperand() } + final Stmt getRightOperand() { result = range.getRightOperand() } } /** diff --git a/ql/src/codeql_ruby/ast/internal/Control.qll b/ql/src/codeql_ruby/ast/internal/Control.qll index c8a1e9d300c..adc3d4ea982 100644 --- a/ql/src/codeql_ruby/ast/internal/Control.qll +++ b/ql/src/codeql_ruby/ast/internal/Control.qll @@ -12,7 +12,7 @@ module ConditionalExpr { abstract class Range extends ControlExpr::Range { abstract Expr getCondition(); - abstract Expr getBranch(boolean cond); + abstract Stmt getBranch(boolean cond); override predicate child(string label, AstNode::Range child) { label = "getCondition" and child = getCondition() @@ -24,9 +24,9 @@ module ConditionalExpr { module IfExpr { abstract class Range extends ConditionalExpr::Range { - abstract StmtSequence getThen(); + abstract Stmt getThen(); - abstract Expr getElse(); + abstract Stmt getElse(); final override string toString() { if this instanceof @elsif then result = "elsif ..." else result = "if ..." @@ -46,11 +46,11 @@ module IfExpr { final override Expr getCondition() { result = generated.getCondition() } - final override StmtSequence getThen() { result = generated.getConsequence() } + final override Stmt getThen() { result = generated.getConsequence() } - final override Expr getElse() { result = generated.getAlternative() } + final override Stmt getElse() { result = generated.getAlternative() } - final override Expr getBranch(boolean cond) { + final override Stmt getBranch(boolean cond) { cond = true and result = getThen() or cond = false and result = getElse() @@ -62,9 +62,9 @@ module IfExpr { final override Expr getCondition() { result = generated.getCondition() } - final override StmtSequence getThen() { result = generated.getConsequence() } + final override Stmt getThen() { result = generated.getConsequence() } - final override Expr getElse() { result = generated.getAlternative() } + final override Stmt getElse() { result = generated.getAlternative() } final override Expr getBranch(boolean cond) { cond = true and result = getThen() @@ -80,9 +80,9 @@ module UnlessExpr { final override Expr getCondition() { result = generated.getCondition() } - final StmtSequence getThen() { result = generated.getConsequence() } + final Stmt getThen() { result = generated.getConsequence() } - final StmtSequence getElse() { result = generated.getAlternative() } + final Stmt getElse() { result = generated.getAlternative() } final override Expr getBranch(boolean cond) { cond = false and result = getThen() @@ -108,9 +108,9 @@ module IfModifierExpr { final override Expr getCondition() { result = generated.getCondition() } - final Expr getExpr() { result = generated.getBody() } + final Stmt getExpr() { result = generated.getBody() } - final override Expr getBranch(boolean cond) { cond = true and result = getExpr() } + final override Stmt getBranch(boolean cond) { cond = true and result = getExpr() } final override string toString() { result = "... if ..." } @@ -128,9 +128,9 @@ module UnlessModifierExpr { final override Expr getCondition() { result = generated.getCondition() } - final Expr getExpr() { result = generated.getBody() } + final Stmt getExpr() { result = generated.getBody() } - final override Expr getBranch(boolean cond) { cond = false and result = getExpr() } + final override Stmt getBranch(boolean cond) { cond = false and result = getExpr() } final override string toString() { result = "... unless ..." } @@ -148,11 +148,11 @@ module TernaryIfExpr { final override Expr getCondition() { result = generated.getCondition() } - final Expr getThen() { result = generated.getConsequence() } + final Stmt getThen() { result = generated.getConsequence() } - final Expr getElse() { result = generated.getAlternative() } + final Stmt getElse() { result = generated.getAlternative() } - final override Expr getBranch(boolean cond) { + final override Stmt getBranch(boolean cond) { cond = true and result = getThen() or cond = false and result = getElse() @@ -192,7 +192,7 @@ module WhenExpr { class Range extends Expr::Range, @when { final override Generated::When generated; - final StmtSequence getBody() { result = generated.getBody() } + final Stmt getBody() { result = generated.getBody() } final Expr getPattern(int n) { result = generated.getPattern(n).getChild() } @@ -208,7 +208,7 @@ module WhenExpr { module Loop { abstract class Range extends ControlExpr::Range { - abstract Expr getBody(); + abstract Stmt getBody(); override predicate child(string label, AstNode::Range child) { label = "getBody" and child = getBody() @@ -232,7 +232,7 @@ module WhileExpr { class Range extends ConditionalLoop::Range, @while { final override Generated::While generated; - final override StmtSequence getBody() { result = generated.getBody() } + final override Stmt getBody() { result = generated.getBody() } final override Expr getCondition() { result = generated.getCondition() } @@ -244,7 +244,7 @@ module UntilExpr { class Range extends ConditionalLoop::Range, @until { final override Generated::Until generated; - final override StmtSequence getBody() { result = generated.getBody() } + final override Stmt getBody() { result = generated.getBody() } final override Expr getCondition() { result = generated.getCondition() } @@ -256,7 +256,7 @@ module WhileModifierExpr { class Range extends ConditionalLoop::Range, @while_modifier { final override Generated::WhileModifier generated; - final override Expr getBody() { result = generated.getBody() } + final override Stmt getBody() { result = generated.getBody() } final override Expr getCondition() { result = generated.getCondition() } @@ -268,7 +268,7 @@ module UntilModifierExpr { class Range extends ConditionalLoop::Range, @until_modifier { final override Generated::UntilModifier generated; - final override Expr getBody() { result = generated.getBody() } + final override Stmt getBody() { result = generated.getBody() } final override Expr getCondition() { result = generated.getCondition() } diff --git a/ql/src/codeql_ruby/ast/internal/Operation.qll b/ql/src/codeql_ruby/ast/internal/Operation.qll index 9144598e139..b605416bce9 100644 --- a/ql/src/codeql_ruby/ast/internal/Operation.qll +++ b/ql/src/codeql_ruby/ast/internal/Operation.qll @@ -7,7 +7,7 @@ module Operation { abstract class Range extends Expr::Range { abstract string getOperator(); - abstract Expr getAnOperand(); + abstract Stmt getAnOperand(); override predicate child(string label, AstNode::Range child) { label = "getAnOperand" and child = getAnOperand() @@ -77,9 +77,9 @@ module BinaryOperation { final Expr getLeftOperand() { result = generated.getLeft() } - final Expr getRightOperand() { result = generated.getRight() } + final Stmt getRightOperand() { result = generated.getRight() } - final override Expr getAnOperand() { + final override Stmt getAnOperand() { result = this.getLeftOperand() or result = this.getRightOperand() } From cb21e8edda6620be3f167e3960e69996c4069b8b Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 18 Feb 2021 18:13:00 +0100 Subject: [PATCH 02/10] CFG: hide nodes that are not proper AstNodes --- ql/src/codeql_ruby/ast/internal/AST.qll | 22 - .../internal/ControlFlowGraphImpl.qll | 15 +- .../controlflow/graph/Cfg.expected | 787 +++--------------- ql/test/library-tests/variables/ssa.expected | 48 +- 4 files changed, 169 insertions(+), 703 deletions(-) diff --git a/ql/src/codeql_ruby/ast/internal/AST.qll b/ql/src/codeql_ruby/ast/internal/AST.qll index 8fb1159c83f..6cced8abe30 100644 --- a/ql/src/codeql_ruby/ast/internal/AST.qll +++ b/ql/src/codeql_ruby/ast/internal/AST.qll @@ -14,26 +14,4 @@ module AstNode { predicate child(string label, AstNode::Range child) { none() } } - - // TODO: Remove - private class RemoveWhenFullCoverage extends Range { - // Lists the entities that are currently used in tests but do not yet - // have an external ASTNode. Perhaps not all entities below need to be - // an AST node, for example we include the `in` keyword in `for` loops - // in the CFG, but not the AST - RemoveWhenFullCoverage() { - this = any(Generated::Method m).getName() - or - this = any(Generated::SingletonMethod m).getName() - or - this = any(Generated::Call c).getMethod() and - not this instanceof Generated::ScopeResolution - or - this instanceof Generated::RestAssignment - or - this instanceof Generated::Superclass - } - - override string toString() { result = "AstNode" } - } } diff --git a/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll index eb95602c468..e58f6fab749 100644 --- a/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ b/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll @@ -203,7 +203,20 @@ private predicate succImpl(AstNode pred, AstNode succ, Completion c) { any(ControlFlowTree cft).succ(pred, succ, c) } -private predicate isHidden(ControlFlowTree t) { t.isHidden() } +private predicate isHidden(ControlFlowTree t) { + t.isHidden() + or + t = any(Method m).getName() + or + t = any(SingletonMethod m).getName() + or + t = any(Call c).getMethod() and + not t instanceof ScopeResolution + or + t instanceof RestAssignment + or + t instanceof Superclass +} private predicate succImplIfHidden(AstNode pred, AstNode succ) { isHidden(pred) and diff --git a/ql/test/library-tests/controlflow/graph/Cfg.expected b/ql/test/library-tests/controlflow/graph/Cfg.expected index 2857ce80056..a5bff7e49f4 100644 --- a/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -26,10 +26,10 @@ cfg.rb: #-----| -> bar # 15| enter BEGIN { ... } -#-----| -> puts +#-----| -> "hello" # 19| enter END { ... } -#-----| -> puts +#-----| -> "world" # 25| enter { ... } #-----| -> x @@ -41,7 +41,7 @@ cfg.rb: #-----| -> a # 69| enter print -#-----| -> puts +#-----| -> "silly" # 101| enter parameters #-----| -> value @@ -50,7 +50,7 @@ cfg.rb: #-----| -> x # 142| enter print -#-----| -> puts +#-----| -> "singleton" # 149| enter method #-----| -> x @@ -79,7 +79,7 @@ heredoc.rb: #-----| -> double_heredoc # 1| enter double_heredoc -#-----| -> puts +#-----| -> < b1 # 36| enter conditional_method_def -#-----| -> puts +#-----| -> "bla" # 40| enter constant_condition #-----| -> true @@ -175,9 +175,6 @@ break_ensure.rb: # 1| m1 #-----| -> m2 -# 1| m1 -#-----| -> m1 - # 1| elements #-----| -> elements @@ -218,29 +215,20 @@ break_ensure.rb: # 8| call to nil? #-----| false -> if ... -#-----| true -> puts +#-----| true -> "elements nil" # 8| elements -#-----| -> nil? - -# 8| nil? #-----| -> call to nil? # 9| call to puts #-----| -> if ... -# 9| puts -#-----| -> "elements nil" - # 9| "elements nil" #-----| -> call to puts # 13| m2 #-----| -> m3 -# 13| m2 -#-----| -> m2 - # 13| elements #-----| -> elements @@ -287,22 +275,16 @@ break_ensure.rb: # 20| call to nil? #-----| false -> if ... -#-----| true -> puts +#-----| true -> "elements nil" # 20| [ensure: break] call to nil? #-----| false -> [ensure: break] if ... -#-----| true -> [ensure: break] puts +#-----| true -> [ensure: break] "elements nil" # 20| elements -#-----| -> nil? - -# 20| [ensure: break] elements -#-----| -> [ensure: break] nil? - -# 20| nil? #-----| -> call to nil? -# 20| [ensure: break] nil? +# 20| [ensure: break] elements #-----| -> [ensure: break] call to nil? # 21| call to puts @@ -311,12 +293,6 @@ break_ensure.rb: # 21| [ensure: break] call to puts #-----| -> [ensure: break] if ... -# 21| puts -#-----| -> "elements nil" - -# 21| [ensure: break] puts -#-----| -> [ensure: break] "elements nil" - # 21| "elements nil" #-----| -> call to puts @@ -326,9 +302,6 @@ break_ensure.rb: # 27| m3 #-----| -> m4 -# 27| m3 -#-----| -> m3 - # 27| elements #-----| -> elements @@ -340,9 +313,6 @@ break_ensure.rb: #-----| true -> return # 29| elements -#-----| -> nil? - -# 29| nil? #-----| -> call to nil? # 30| return @@ -355,7 +325,7 @@ break_ensure.rb: #-----| -> [ensure: return] elements # 33| for ... in ... -#-----| -> puts +#-----| -> "Done" # 33| [ensure: return] for ... in ... #-----| return -> exit m3 (normal) @@ -415,18 +385,12 @@ break_ensure.rb: # 41| call to puts #-----| -> exit m3 (normal) -# 41| puts -#-----| -> "Done" - # 41| "Done" #-----| -> call to puts # 44| m4 #-----| -> exit break_ensure.rb (normal) -# 44| m4 -#-----| -> m4 - # 44| elements #-----| -> elements @@ -448,7 +412,7 @@ break_ensure.rb: # 47| ... > ... #-----| false -> if ... -#-----| true -> raise +#-----| true -> "" # 47| element #-----| -> 1 @@ -459,9 +423,6 @@ break_ensure.rb: # 48| call to raise #-----| raise -> [ensure: raise] ensure ... -# 48| raise -#-----| -> "" - # 48| "" #-----| -> call to raise @@ -513,9 +474,6 @@ case.rb: # 1| if_in_case #-----| -> exit case.rb (normal) -# 1| if_in_case -#-----| -> if_in_case - # 2| case ... #-----| -> call to x1 @@ -537,14 +495,11 @@ case.rb: # 3| call to x2 #-----| false -> if ... -#-----| true -> puts +#-----| true -> "x2" # 3| call to puts #-----| -> if ... -# 3| puts -#-----| -> "x2" - # 3| "x2" #-----| -> call to puts @@ -552,15 +507,12 @@ case.rb: #-----| -> 2 # 4| 2 -#-----| match -> puts +#-----| match -> "2" #-----| no-match -> exit if_in_case (normal) # 4| call to puts #-----| -> exit if_in_case (normal) -# 4| puts -#-----| -> "2" - # 4| "2" #-----| -> call to puts @@ -568,9 +520,6 @@ cfg.rb: # 1| bar #-----| -> alias ... -# 1| bar -#-----| -> bar - # 3| alias ... #-----| -> foo @@ -605,7 +554,7 @@ cfg.rb: #-----| -> %i(...) # 9| %w(...) -#-----| -> puts +#-----| -> 4 # 9| "one#{...}" #-----| -> "another" @@ -622,9 +571,6 @@ cfg.rb: # 12| call to puts #-----| -> BEGIN { ... } -# 12| puts -#-----| -> 4 - # 12| 4 #-----| -> call to puts @@ -634,9 +580,6 @@ cfg.rb: # 16| call to puts #-----| -> exit BEGIN { ... } (normal) -# 16| puts -#-----| -> "hello" - # 16| "hello" #-----| -> call to puts @@ -646,9 +589,6 @@ cfg.rb: # 20| call to puts #-----| -> exit END { ... } (normal) -# 20| puts -#-----| -> "world" - # 20| "world" #-----| -> call to puts @@ -662,35 +602,26 @@ cfg.rb: #-----| -> ... + ... # 25| call to times -#-----| -> puts +#-----| -> :puts # 25| 2 -#-----| -> times - -# 25| times #-----| -> { ... } # 25| { ... } #-----| -> call to times # 25| x -#-----| -> puts +#-----| -> x # 25| call to puts #-----| -> exit { ... } (normal) -# 25| puts -#-----| -> x - # 25| x #-----| -> call to puts # 27| call to puts #-----| -> Proc -# 27| puts -#-----| -> :puts - # 27| &... #-----| -> call to puts @@ -701,9 +632,6 @@ cfg.rb: #-----| -> true # 29| Proc -#-----| -> new - -# 29| new #-----| -> { ... } # 29| { ... } @@ -716,9 +644,6 @@ cfg.rb: #-----| -> exit { ... } (normal) # 29| x -#-----| -> call - -# 29| call #-----| -> call to call # 31| while ... @@ -743,9 +668,6 @@ cfg.rb: #-----| -> case ... # 39| self -#-----| -> puts - -# 39| puts #-----| -> 42 # 39| 42 @@ -761,15 +683,12 @@ cfg.rb: #-----| -> 1 # 42| 1 -#-----| match -> puts +#-----| match -> "one" #-----| no-match -> when ... # 42| call to puts #-----| -> case ... -# 42| puts -#-----| -> "one" - # 42| "one" #-----| -> call to puts @@ -778,31 +697,25 @@ cfg.rb: # 43| 2 #-----| no-match -> 3 -#-----| match -> puts +#-----| match -> "some" # 43| 3 #-----| no-match -> 4 -#-----| match -> puts +#-----| match -> "some" # 43| 4 -#-----| match -> puts -#-----| no-match -> puts +#-----| match -> "some" +#-----| no-match -> "many" # 43| call to puts #-----| -> case ... -# 43| puts -#-----| -> "some" - # 43| "some" #-----| -> call to puts # 44| call to puts #-----| -> case ... -# 44| puts -#-----| -> "many" - # 44| "many" #-----| -> call to puts @@ -813,7 +726,7 @@ cfg.rb: #-----| -> b # 48| ... == ... -#-----| true -> puts +#-----| true -> "one" #-----| false -> when ... # 48| b @@ -825,9 +738,6 @@ cfg.rb: # 48| call to puts #-----| -> "a" -# 48| puts -#-----| -> "one" - # 48| "one" #-----| -> call to puts @@ -836,7 +746,7 @@ cfg.rb: # 49| ... == ... #-----| false -> b -#-----| true -> puts +#-----| true -> "some" # 49| b #-----| -> 0 @@ -845,7 +755,7 @@ cfg.rb: #-----| -> ... == ... # 49| ... > ... -#-----| true -> puts +#-----| true -> "some" #-----| false -> "a" # 49| b @@ -857,9 +767,6 @@ cfg.rb: # 49| call to puts #-----| -> "a" -# 49| puts -#-----| -> "some" - # 49| "some" #-----| -> call to puts @@ -899,11 +806,8 @@ cfg.rb: # 58| Silly #-----| -> Object -# 58| Superclass -#-----| -> 10-2i - # 58| Object -#-----| -> Superclass +#-----| -> 10-2i # 59| ... = ... #-----| -> call to b @@ -984,11 +888,8 @@ cfg.rb: # 63| pattern #-----| -> 1 -# 63| pattern -#-----| -> pattern - # 63| (..., ...) -#-----| -> puts +#-----| -> a # 63| a #-----| -> b @@ -997,10 +898,7 @@ cfg.rb: #-----| -> (..., ...) # 64| call to puts -#-----| -> puts - -# 64| puts -#-----| -> a +#-----| -> b # 64| a #-----| -> call to puts @@ -1008,14 +906,11 @@ cfg.rb: # 65| call to puts #-----| -> exit pattern (normal) -# 65| puts -#-----| -> b - # 65| b #-----| -> call to puts # 67| ... = ... -#-----| -> puts +#-----| -> items # 67| items #-----| -> ... = ... @@ -1035,9 +930,6 @@ cfg.rb: # 68| call to puts #-----| -> print -# 68| puts -#-----| -> items - # 68| ...[...] #-----| -> call to puts @@ -1050,15 +942,9 @@ cfg.rb: # 69| print #-----| -> 42 -# 69| print -#-----| -> print - # 70| call to puts #-----| -> exit print (normal) -# 70| puts -#-----| -> "silly" - # 70| "silly" #-----| -> call to puts @@ -1107,26 +993,20 @@ cfg.rb: #-----| -> elsif ... # 78| ; -#-----| -> puts +#-----| -> "ok" # 83| call to puts #-----| -> ensure ... -# 83| puts -#-----| -> "ok" - # 83| "ok" #-----| -> call to puts # 84| ensure ... -#-----| -> puts +#-----| -> "end" # 85| call to puts #-----| -> x -# 85| puts -#-----| -> "end" - # 85| "end" #-----| -> call to puts @@ -1168,7 +1048,7 @@ cfg.rb: #-----| -> [...] # 91| if ... -#-----| -> puts +#-----| -> x # 91| ... > ... #-----| false -> if ... @@ -1186,9 +1066,6 @@ cfg.rb: # 92| call to puts #-----| -> In -# 92| puts -#-----| -> x - # 92| x #-----| -> call to puts @@ -1270,9 +1147,6 @@ cfg.rb: # 101| parameters #-----| -> "healthy" -# 101| parameters -#-----| -> parameters - # 101| value #-----| no-match -> 42 #-----| match -> key @@ -1284,14 +1158,11 @@ cfg.rb: #-----| -> kwargs # 101| kwargs -#-----| -> puts +#-----| -> value # 102| call to puts #-----| -> kwargs -# 102| puts -#-----| -> value - # 102| value #-----| -> call to puts @@ -1317,7 +1188,7 @@ cfg.rb: #-----| -> type # 107| ... = ... -#-----| -> puts +#-----| -> < ... = ... @@ -1328,9 +1199,6 @@ cfg.rb: # 108| call to puts #-----| -> b -# 108| puts -#-----| -> < call to puts @@ -1355,15 +1223,12 @@ cfg.rb: # 113| call to puts #-----| -> ... if ... -# 113| puts -#-----| -> "hi" - # 113| "hi" #-----| -> call to puts # 113| ... > ... #-----| false -> ... if ... -#-----| true -> puts +#-----| true -> "hi" # 113| b #-----| -> 10 @@ -1543,7 +1408,7 @@ cfg.rb: #-----| -> 1 # 133| ... / ... -#-----| raise -> puts +#-----| raise -> "div by zero" #-----| -> 1 # 133| 1 @@ -1555,9 +1420,6 @@ cfg.rb: # 133| call to puts #-----| -> 1 -# 133| puts -#-----| -> "div by zero" - # 133| "div by zero" #-----| -> call to puts @@ -1567,11 +1429,8 @@ cfg.rb: # 135| (..., ...) #-----| -> ... = ... -# 135| RestAssignment -#-----| -> last - # 135| init -#-----| -> RestAssignment +#-----| -> last # 135| last #-----| -> (..., ...) @@ -1601,9 +1460,6 @@ cfg.rb: #-----| -> Constant # 138| M -#-----| -> itself - -# 138| itself #-----| -> call to itself # 138| Constant @@ -1613,31 +1469,19 @@ cfg.rb: #-----| -> Silly # 140| call to itself -#-----| -> Setter +#-----| -> setter= # 140| Silly -#-----| -> itself - -# 140| itself #-----| -> call to itself # 141| setter= #-----| -> print -# 141| Setter -#-----| -> setter= - # 142| print #-----| -> Silly -# 142| print -#-----| -> print - # 143| call to puts -#-----| -> puts - -# 143| puts -#-----| -> "singleton" +#-----| -> call to super # 143| "singleton" #-----| -> call to puts @@ -1645,16 +1489,10 @@ cfg.rb: # 144| call to puts #-----| -> exit print (normal) -# 144| puts -#-----| -> call to super - # 144| call to print #-----| -> call to puts # 144| call to super -#-----| -> print - -# 144| print #-----| -> call to print # 148| ... = ... @@ -1667,9 +1505,6 @@ cfg.rb: #-----| -> silly # 148| Silly -#-----| -> new - -# 148| new #-----| -> call to new # 149| method @@ -1678,26 +1513,17 @@ cfg.rb: # 149| silly #-----| -> method -# 149| method -#-----| -> method - # 149| x -#-----| -> puts +#-----| -> x # 150| call to puts #-----| -> exit method (normal) -# 150| puts -#-----| -> x - # 150| x #-----| -> call to puts # 153| two_parameters -#-----| -> two_parameters - -# 153| two_parameters -#-----| -> two_parameters +#-----| -> 1 # 153| a #-----| -> b @@ -1708,9 +1534,6 @@ cfg.rb: # 155| call to two_parameters #-----| -> call to __FILE__ -# 155| two_parameters -#-----| -> 1 - # 155| *... #-----| -> call to two_parameters @@ -1811,8 +1634,8 @@ cfg.rb: #-----| -> x # 169| ... == ... -#-----| false -> puts -#-----| true -> puts +#-----| false -> "hi" +#-----| true -> "bye" # 169| x #-----| -> 10 @@ -1823,18 +1646,12 @@ cfg.rb: # 169| call to puts #-----| -> unless ... -# 169| puts -#-----| -> "hi" - # 169| "hi" #-----| -> call to puts # 169| call to puts #-----| -> unless ... -# 169| puts -#-----| -> "bye" - # 169| "bye" #-----| -> call to puts @@ -1844,15 +1661,12 @@ cfg.rb: # 171| call to puts #-----| -> ... unless ... -# 171| puts -#-----| -> "hi" - # 171| "hi" #-----| -> call to puts # 171| ... == ... #-----| true -> ... unless ... -#-----| false -> puts +#-----| false -> "hi" # 171| x #-----| -> 0 @@ -1874,7 +1688,7 @@ cfg.rb: #-----| -> ... > ... # 173| ... += ... -#-----| -> puts +#-----| -> "hello" # 173| x #-----| -> 10 @@ -1885,9 +1699,6 @@ cfg.rb: # 173| call to puts #-----| -> x -# 173| puts -#-----| -> "hello" - # 173| "hello" #-----| -> call to puts @@ -1909,9 +1720,6 @@ cfg.rb: # 176| call to puts #-----| -> i -# 176| puts -#-----| -> "hello" - # 176| "hello" #-----| -> call to puts @@ -1926,7 +1734,7 @@ cfg.rb: # 176| ... == ... #-----| true -> ... until ... -#-----| false -> puts +#-----| false -> "hello" # 176| i #-----| -> 10 @@ -1966,7 +1774,7 @@ cfg.rb: #-----| -> ... += ... # 181| if ... -#-----| -> puts +#-----| -> x # 181| ... == ... #-----| false -> if ... @@ -1984,9 +1792,6 @@ cfg.rb: # 182| call to puts #-----| -> x -# 182| puts -#-----| -> x - # 182| x #-----| -> call to puts @@ -1999,9 +1804,6 @@ cfg.rb: # 185| call to puts #-----| -> i -# 185| puts -#-----| -> "hello" - # 185| "hello" #-----| -> call to puts @@ -2016,7 +1818,7 @@ cfg.rb: # 185| ... != ... #-----| false -> ... while ... -#-----| true -> puts +#-----| true -> "hello" # 185| i #-----| -> 0 @@ -2025,10 +1827,7 @@ cfg.rb: #-----| -> ... != ... # 187| run_block -#-----| -> run_block - -# 187| run_block -#-----| -> run_block +#-----| -> { ... } # 188| yield ... #-----| -> 42 @@ -2038,21 +1837,15 @@ cfg.rb: # 191| call to run_block #-----| -> exit cfg.rb (normal) -# 191| run_block -#-----| -> { ... } - # 191| { ... } #-----| -> call to run_block # 191| x -#-----| -> puts +#-----| -> x # 191| call to puts #-----| -> exit { ... } (normal) -# 191| puts -#-----| -> x - # 191| x #-----| -> call to puts @@ -2060,18 +1853,15 @@ exit.rb: # 1| m1 #-----| -> m2 -# 1| m1 -#-----| -> m1 - # 1| x #-----| -> x # 2| if ... -#-----| -> puts +#-----| -> "x <= 2" # 2| ... > ... #-----| false -> if ... -#-----| true -> exit +#-----| true -> 1 # 2| x #-----| -> 2 @@ -2082,36 +1872,27 @@ exit.rb: # 3| call to exit #-----| exit -> exit m1 (abnormal) -# 3| exit -#-----| -> 1 - # 3| 1 #-----| -> call to exit # 5| call to puts #-----| -> exit m1 (normal) -# 5| puts -#-----| -> "x <= 2" - # 5| "x <= 2" #-----| -> call to puts # 8| m2 #-----| -> exit exit.rb (normal) -# 8| m2 -#-----| -> m2 - # 8| x #-----| -> x # 9| if ... -#-----| -> puts +#-----| -> "x <= 2" # 9| ... > ... #-----| false -> if ... -#-----| true -> abort +#-----| true -> "abort!" # 9| x #-----| -> 2 @@ -2122,18 +1903,12 @@ exit.rb: # 10| call to abort #-----| exit -> exit m2 (abnormal) -# 10| abort -#-----| -> "abort!" - # 10| "abort!" #-----| -> call to abort # 12| call to puts #-----| -> exit m2 (normal) -# 12| puts -#-----| -> "x <= 2" - # 12| "x <= 2" #-----| -> call to puts @@ -2141,15 +1916,9 @@ heredoc.rb: # 1| double_heredoc #-----| -> exit heredoc.rb (normal) -# 1| double_heredoc -#-----| -> double_heredoc - # 2| call to puts #-----| -> exit double_heredoc (normal) -# 2| puts -#-----| -> < < m2 -# 1| m1 -#-----| -> m1 - # 1| x #-----| -> x @@ -2170,7 +1936,7 @@ ifs.rb: #-----| -> exit m1 (normal) # 2| ... > ... -#-----| true -> puts +#-----| true -> "x is greater than 2" #-----| false -> x # 2| x @@ -2182,9 +1948,6 @@ ifs.rb: # 3| call to puts #-----| -> if ... -# 3| puts -#-----| -> "x is greater than 2" - # 3| "x is greater than 2" #-----| -> call to puts @@ -2192,10 +1955,10 @@ ifs.rb: #-----| -> if ... # 4| [false] ... and ... -#-----| false -> puts +#-----| false -> "I can't guess the number" # 4| [true] ... and ... -#-----| true -> puts +#-----| true -> "x is 1" # 4| [false] ... and ... #-----| false -> [false] ... and ... @@ -2248,27 +2011,18 @@ ifs.rb: # 5| call to puts #-----| -> elsif ... -# 5| puts -#-----| -> "x is 1" - # 5| "x is 1" #-----| -> call to puts # 7| call to puts #-----| -> elsif ... -# 7| puts -#-----| -> "I can't guess the number" - # 7| "I can't guess the number" #-----| -> call to puts # 11| m2 #-----| -> m3 -# 11| m2 -#-----| -> m2 - # 11| b #-----| -> b @@ -2294,14 +2048,11 @@ ifs.rb: # 18| m3 #-----| -> m4 -# 18| m3 -#-----| -> m3 - # 18| x #-----| -> x # 19| if ... -#-----| -> puts +#-----| -> x # 19| ... < ... #-----| false -> if ... @@ -2356,18 +2107,12 @@ ifs.rb: # 25| call to puts #-----| -> exit m3 (normal) -# 25| puts -#-----| -> x - # 25| x #-----| -> call to puts # 28| m4 #-----| -> m5 -# 28| m4 -#-----| -> m4 - # 28| b1 #-----| -> b2 @@ -2416,9 +2161,6 @@ ifs.rb: # 32| m5 #-----| -> 1 -# 32| m5 -#-----| -> m5 - # 32| b1 #-----| -> b2 @@ -2487,15 +2229,9 @@ ifs.rb: # 36| conditional_method_def #-----| -> ... unless ... -# 36| conditional_method_def -#-----| -> conditional_method_def - # 37| call to puts #-----| -> exit conditional_method_def (normal) -# 37| puts -#-----| -> "bla" - # 37| "bla" #-----| -> call to puts @@ -2512,9 +2248,6 @@ ifs.rb: # 40| constant_condition #-----| -> exit ifs.rb (normal) -# 40| constant_condition -#-----| -> constant_condition - # 41| if ... #-----| -> exit constant_condition (normal) @@ -2528,9 +2261,6 @@ loops.rb: # 1| m1 #-----| -> m2 -# 1| m1 -#-----| -> m1 - # 1| x #-----| -> x @@ -2539,7 +2269,7 @@ loops.rb: # 2| ... >= ... #-----| false -> while ... -#-----| true -> puts +#-----| true -> x # 2| x #-----| -> 0 @@ -2550,9 +2280,6 @@ loops.rb: # 3| call to puts #-----| -> x -# 3| puts -#-----| -> x - # 3| x #-----| -> call to puts @@ -2568,18 +2295,15 @@ loops.rb: # 8| m2 #-----| -> m3 -# 8| m2 -#-----| -> m2 - # 8| x #-----| -> x # 9| while ... -#-----| -> puts +#-----| -> "Done" # 9| ... >= ... #-----| false -> while ... -#-----| true -> puts +#-----| true -> x # 9| x #-----| -> 0 @@ -2590,9 +2314,6 @@ loops.rb: # 10| call to puts #-----| -> x -# 10| puts -#-----| -> x - # 10| x #-----| -> call to puts @@ -2606,7 +2327,7 @@ loops.rb: #-----| -> ... -= ... # 12| if ... -#-----| -> puts +#-----| -> "Iter" # 12| ... > ... #-----| true -> break @@ -2651,37 +2372,28 @@ loops.rb: #-----| -> ... > ... # 17| redo -#-----| redo -> puts +#-----| redo -> x # 19| call to puts #-----| -> x -# 19| puts -#-----| -> "Iter" - # 19| "Iter" #-----| -> call to puts # 21| call to puts #-----| -> exit m2 (normal) -# 21| puts -#-----| -> "Done" - # 21| "Done" #-----| -> call to puts # 24| m3 #-----| -> exit loops.rb (normal) -# 24| m3 -#-----| -> m3 - # 25| call to each #-----| -> exit m3 (normal) # 25| [...] -#-----| -> each +#-----| -> do ... end # 25| 1 #-----| -> 2 @@ -2692,21 +2404,15 @@ loops.rb: # 25| 3 #-----| -> [...] -# 25| each -#-----| -> do ... end - # 25| do ... end #-----| -> call to each # 25| x -#-----| -> puts +#-----| -> x # 26| call to puts #-----| -> exit do ... end (normal) -# 26| puts -#-----| -> x - # 26| x #-----| -> call to puts @@ -2717,11 +2423,8 @@ raise.rb: # 1| ExceptionA #-----| -> Exception -# 1| Superclass -#-----| -> ExceptionB - # 1| Exception -#-----| -> Superclass +#-----| -> ExceptionB # 4| ExceptionB #-----| -> ExceptionB @@ -2729,27 +2432,21 @@ raise.rb: # 4| ExceptionB #-----| -> Exception -# 4| Superclass -#-----| -> m1 - # 4| Exception -#-----| -> Superclass +#-----| -> m1 # 7| m1 #-----| -> m2 -# 7| m1 -#-----| -> m1 - # 7| x #-----| -> x # 8| if ... -#-----| -> puts +#-----| -> "x <= 2" # 8| ... > ... #-----| false -> if ... -#-----| true -> raise +#-----| true -> "x > 2" # 8| x #-----| -> 2 @@ -2760,43 +2457,31 @@ raise.rb: # 9| call to raise #-----| raise -> exit m1 (abnormal) -# 9| raise -#-----| -> "x > 2" - # 9| "x > 2" #-----| -> call to raise # 11| call to puts #-----| -> exit m1 (normal) -# 11| puts -#-----| -> "x <= 2" - # 11| "x <= 2" #-----| -> call to puts # 14| m2 #-----| -> m3 -# 14| m2 -#-----| -> m2 - # 14| b #-----| -> b # 16| if ... -#-----| -> puts +#-----| -> "End m2" # 16| b #-----| false -> if ... -#-----| true -> raise +#-----| true -> ExceptionA # 17| call to raise #-----| raise -> rescue ... -# 17| raise -#-----| -> ExceptionA - # 17| ExceptionA #-----| -> call to raise @@ -2804,14 +2489,11 @@ raise.rb: #-----| -> ExceptionA # 19| ExceptionA -#-----| match -> puts +#-----| match -> "Rescued" #-----| raise -> exit m2 (abnormal) # 20| call to puts -#-----| -> puts - -# 20| puts -#-----| -> "Rescued" +#-----| -> "End m2" # 20| "Rescued" #-----| -> call to puts @@ -2819,45 +2501,33 @@ raise.rb: # 22| call to puts #-----| -> exit m2 (normal) -# 22| puts -#-----| -> "End m2" - # 22| "End m2" #-----| -> call to puts # 25| m3 #-----| -> m4 -# 25| m3 -#-----| -> m3 - # 25| b #-----| -> b # 27| if ... -#-----| -> puts +#-----| -> "End m3" # 27| b #-----| false -> if ... -#-----| true -> raise +#-----| true -> ExceptionA # 28| call to raise #-----| raise -> rescue ... -# 28| raise -#-----| -> ExceptionA - # 28| ExceptionA #-----| -> call to raise # 30| rescue ... -#-----| -> puts +#-----| -> "Rescued" # 31| call to puts -#-----| -> puts - -# 31| puts -#-----| -> "Rescued" +#-----| -> "End m3" # 31| "Rescued" #-----| -> call to puts @@ -2865,34 +2535,25 @@ raise.rb: # 33| call to puts #-----| -> exit m3 (normal) -# 33| puts -#-----| -> "End m3" - # 33| "End m3" #-----| -> call to puts # 36| m4 #-----| -> m5 -# 36| m4 -#-----| -> m4 - # 36| b #-----| -> b # 38| if ... -#-----| -> puts +#-----| -> "End m4" # 38| b #-----| false -> if ... -#-----| true -> raise +#-----| true -> ExceptionA # 39| call to raise #-----| raise -> rescue ... -# 39| raise -#-----| -> ExceptionA - # 39| ExceptionA #-----| -> call to raise @@ -2900,13 +2561,10 @@ raise.rb: #-----| -> e # 41| e -#-----| -> puts +#-----| -> "Rescued {e}" # 42| call to puts -#-----| -> puts - -# 42| puts -#-----| -> "Rescued {e}" +#-----| -> "End m4" # 42| "Rescued {e}" #-----| -> call to puts @@ -2914,34 +2572,25 @@ raise.rb: # 44| call to puts #-----| -> exit m4 (normal) -# 44| puts -#-----| -> "End m4" - # 44| "End m4" #-----| -> call to puts # 47| m5 #-----| -> m6 -# 47| m5 -#-----| -> m5 - # 47| b #-----| -> b # 49| if ... -#-----| -> puts +#-----| -> "End m5" # 49| b #-----| false -> if ... -#-----| true -> raise +#-----| true -> ExceptionA # 50| call to raise #-----| raise -> rescue ... -# 50| raise -#-----| -> ExceptionA - # 50| ExceptionA #-----| -> call to raise @@ -2949,39 +2598,30 @@ raise.rb: #-----| -> e # 52| e -#-----| -> puts +#-----| -> "End m5" # 54| call to puts #-----| -> exit m5 (normal) -# 54| puts -#-----| -> "End m5" - # 54| "End m5" #-----| -> call to puts # 57| m6 #-----| -> m7 -# 57| m6 -#-----| -> m6 - # 57| b #-----| -> b # 59| if ... -#-----| -> puts +#-----| -> "End m6" # 59| b #-----| false -> if ... -#-----| true -> raise +#-----| true -> ExceptionA # 60| call to raise #-----| raise -> rescue ... -# 60| raise -#-----| -> ExceptionA - # 60| ExceptionA #-----| -> call to raise @@ -2997,13 +2637,10 @@ raise.rb: #-----| raise -> exit m6 (abnormal) # 62| e -#-----| -> puts +#-----| -> "Rescued {e}" # 63| call to puts -#-----| -> puts - -# 63| puts -#-----| -> "Rescued {e}" +#-----| -> "End m6" # 63| "Rescued {e}" #-----| -> call to puts @@ -3011,26 +2648,20 @@ raise.rb: # 65| call to puts #-----| -> exit m6 (normal) -# 65| puts -#-----| -> "End m6" - # 65| "End m6" #-----| -> call to puts # 68| m7 #-----| -> m8 -# 68| m7 -#-----| -> m7 - # 68| x #-----| -> x # 69| if ... -#-----| -> puts +#-----| -> "0 <= x <= 2" # 69| ... > ... -#-----| true -> raise +#-----| true -> "x > 2" #-----| false -> x # 69| x @@ -3042,9 +2673,6 @@ raise.rb: # 70| call to raise #-----| raise -> [ensure: raise] ensure ... -# 70| raise -#-----| -> "x > 2" - # 70| "x > 2" #-----| -> call to raise @@ -3070,20 +2698,17 @@ raise.rb: # 74| call to puts #-----| -> ensure ... -# 74| puts -#-----| -> "0 <= x <= 2" - # 74| "0 <= x <= 2" #-----| -> call to puts # 75| ensure ... -#-----| -> puts +#-----| -> "ensure" # 75| [ensure: return] ensure ... -#-----| -> [ensure: return] puts +#-----| -> [ensure: return] "ensure" # 75| [ensure: raise] ensure ... -#-----| -> [ensure: raise] puts +#-----| -> [ensure: raise] "ensure" # 76| call to puts #-----| -> exit m7 (normal) @@ -3094,15 +2719,6 @@ raise.rb: # 76| [ensure: raise] call to puts #-----| raise -> exit m7 (abnormal) -# 76| puts -#-----| -> "ensure" - -# 76| [ensure: return] puts -#-----| -> [ensure: return] "ensure" - -# 76| [ensure: raise] puts -#-----| -> [ensure: raise] "ensure" - # 76| "ensure" #-----| -> call to puts @@ -3115,26 +2731,20 @@ raise.rb: # 79| m8 #-----| -> m9 -# 79| m8 -#-----| -> m8 - # 79| x -#-----| -> puts +#-----| -> "Begin m8" # 80| call to puts #-----| -> x -# 80| puts -#-----| -> "Begin m8" - # 80| "Begin m8" #-----| -> call to puts # 82| if ... -#-----| -> puts +#-----| -> "0 <= x <= 2" # 82| ... > ... -#-----| true -> raise +#-----| true -> "x > 2" #-----| false -> x # 82| x @@ -3146,9 +2756,6 @@ raise.rb: # 83| call to raise #-----| raise -> [ensure: raise] ensure ... -# 83| raise -#-----| -> "x > 2" - # 83| "x > 2" #-----| -> call to raise @@ -3174,23 +2781,20 @@ raise.rb: # 87| call to puts #-----| -> ensure ... -# 87| puts -#-----| -> "0 <= x <= 2" - # 87| "0 <= x <= 2" #-----| -> call to puts # 88| ensure ... -#-----| -> puts +#-----| -> "ensure" # 88| [ensure: return] ensure ... -#-----| -> [ensure: return] puts +#-----| -> [ensure: return] "ensure" # 88| [ensure: raise] ensure ... -#-----| -> [ensure: raise] puts +#-----| -> [ensure: raise] "ensure" # 89| call to puts -#-----| -> puts +#-----| -> "End m8" # 89| [ensure: return] call to puts #-----| return -> exit m8 (normal) @@ -3198,15 +2802,6 @@ raise.rb: # 89| [ensure: raise] call to puts #-----| raise -> exit m8 (abnormal) -# 89| puts -#-----| -> "ensure" - -# 89| [ensure: return] puts -#-----| -> [ensure: return] "ensure" - -# 89| [ensure: raise] puts -#-----| -> [ensure: raise] "ensure" - # 89| "ensure" #-----| -> call to puts @@ -3219,18 +2814,12 @@ raise.rb: # 91| call to puts #-----| -> exit m8 (normal) -# 91| puts -#-----| -> "End m8" - # 91| "End m8" #-----| -> call to puts # 94| m9 #-----| -> m10 -# 94| m9 -#-----| -> m9 - # 94| x #-----| -> b1 @@ -3238,22 +2827,19 @@ raise.rb: #-----| -> b2 # 94| b2 -#-----| -> puts +#-----| -> "Begin m9" # 95| call to puts #-----| -> x -# 95| puts -#-----| -> "Begin m9" - # 95| "Begin m9" #-----| -> call to puts # 97| if ... -#-----| -> puts +#-----| -> "0 <= x <= 2" # 97| ... > ... -#-----| true -> raise +#-----| true -> "x > 2" #-----| false -> x # 97| x @@ -3265,9 +2851,6 @@ raise.rb: # 98| call to raise #-----| raise -> [ensure: raise] ensure ... -# 98| raise -#-----| -> "x > 2" - # 98| "x > 2" #-----| -> call to raise @@ -3293,20 +2876,17 @@ raise.rb: # 102| call to puts #-----| -> ensure ... -# 102| puts -#-----| -> "0 <= x <= 2" - # 102| "0 <= x <= 2" #-----| -> call to puts # 103| ensure ... -#-----| -> puts +#-----| -> "outer ensure" # 103| [ensure: return] ensure ... -#-----| -> [ensure: return] puts +#-----| -> [ensure: return] "outer ensure" # 103| [ensure: raise] ensure ... -#-----| -> [ensure: raise] puts +#-----| -> [ensure: raise] "outer ensure" # 104| call to puts #-----| -> b1 @@ -3317,15 +2897,6 @@ raise.rb: # 104| [ensure: raise] call to puts #-----| -> [ensure: raise] b1 -# 104| puts -#-----| -> "outer ensure" - -# 104| [ensure: return] puts -#-----| -> [ensure: return] "outer ensure" - -# 104| [ensure: raise] puts -#-----| -> [ensure: raise] "outer ensure" - # 104| "outer ensure" #-----| -> call to puts @@ -3346,15 +2917,15 @@ raise.rb: # 106| b1 #-----| false -> if ... -#-----| true -> raise +#-----| true -> "b1 is true" # 106| [ensure: return] b1 #-----| false -> [ensure: return] if ... -#-----| true -> [ensure: return] raise +#-----| true -> [ensure: return] "b1 is true" # 106| [ensure: raise] b1 #-----| false -> [ensure: raise] if ... -#-----| true -> [ensure: raise] raise +#-----| true -> [ensure: raise] "b1 is true" # 107| call to raise #-----| raise -> [ensure(1): raise] ensure ... @@ -3365,15 +2936,6 @@ raise.rb: # 107| [ensure: raise] call to raise #-----| raise -> [ensure: raise, ensure(1): raise] ensure ... -# 107| raise -#-----| -> "b1 is true" - -# 107| [ensure: return] raise -#-----| -> [ensure: return] "b1 is true" - -# 107| [ensure: raise] raise -#-----| -> [ensure: raise] "b1 is true" - # 107| "b1 is true" #-----| -> call to raise @@ -3384,25 +2946,25 @@ raise.rb: #-----| -> [ensure: raise] call to raise # 109| ensure ... -#-----| -> puts +#-----| -> "inner ensure" # 109| [ensure(1): raise] ensure ... -#-----| -> [ensure(1): raise] puts +#-----| -> [ensure(1): raise] "inner ensure" # 109| [ensure: return] ensure ... -#-----| -> [ensure: return] puts +#-----| -> [ensure: return] "inner ensure" # 109| [ensure: return, ensure(1): raise] ensure ... -#-----| -> [ensure: return, ensure(1): raise] puts +#-----| -> [ensure: return, ensure(1): raise] "inner ensure" # 109| [ensure: raise] ensure ... -#-----| -> [ensure: raise] puts +#-----| -> [ensure: raise] "inner ensure" # 109| [ensure: raise, ensure(1): raise] ensure ... -#-----| -> [ensure: raise, ensure(1): raise] puts +#-----| -> [ensure: raise, ensure(1): raise] "inner ensure" # 110| call to puts -#-----| -> puts +#-----| -> "End m9" # 110| [ensure(1): raise] call to puts #-----| raise -> [ensure: raise] ensure ... @@ -3419,24 +2981,6 @@ raise.rb: # 110| [ensure: raise, ensure(1): raise] call to puts #-----| raise -> [ensure: raise] ensure ... -# 110| puts -#-----| -> "inner ensure" - -# 110| [ensure(1): raise] puts -#-----| -> [ensure(1): raise] "inner ensure" - -# 110| [ensure: return] puts -#-----| -> [ensure: return] "inner ensure" - -# 110| [ensure: return, ensure(1): raise] puts -#-----| -> [ensure: return, ensure(1): raise] "inner ensure" - -# 110| [ensure: raise] puts -#-----| -> [ensure: raise] "inner ensure" - -# 110| [ensure: raise, ensure(1): raise] puts -#-----| -> [ensure: raise, ensure(1): raise] "inner ensure" - # 110| "inner ensure" #-----| -> call to puts @@ -3458,20 +3002,17 @@ raise.rb: # 113| call to puts #-----| -> ensure ... -# 113| puts -#-----| -> "End m9" - # 113| "End m9" #-----| -> call to puts # 114| ensure ... -#-----| -> puts +#-----| -> "method ensure" # 114| [ensure: return] ensure ... -#-----| -> [ensure: return] puts +#-----| -> [ensure: return] "method ensure" # 114| [ensure: raise] ensure ... -#-----| -> [ensure: raise] puts +#-----| -> [ensure: raise] "method ensure" # 115| call to puts #-----| -> b2 @@ -3482,15 +3023,6 @@ raise.rb: # 115| [ensure: raise] call to puts #-----| -> [ensure: raise] b2 -# 115| puts -#-----| -> "method ensure" - -# 115| [ensure: return] puts -#-----| -> [ensure: return] "method ensure" - -# 115| [ensure: raise] puts -#-----| -> [ensure: raise] "method ensure" - # 115| "method ensure" #-----| -> call to puts @@ -3511,15 +3043,15 @@ raise.rb: # 116| b2 #-----| false -> if ... -#-----| true -> raise +#-----| true -> "b2 is true" # 116| [ensure: return] b2 #-----| false -> [ensure: return] if ... -#-----| true -> [ensure: return] raise +#-----| true -> [ensure: return] "b2 is true" # 116| [ensure: raise] b2 #-----| false -> [ensure: raise] if ... -#-----| true -> [ensure: raise] raise +#-----| true -> [ensure: raise] "b2 is true" # 117| call to raise #-----| raise -> exit m9 (abnormal) @@ -3530,15 +3062,6 @@ raise.rb: # 117| [ensure: raise] call to raise #-----| raise -> exit m9 (abnormal) -# 117| raise -#-----| -> "b2 is true" - -# 117| [ensure: return] raise -#-----| -> [ensure: return] "b2 is true" - -# 117| [ensure: raise] raise -#-----| -> [ensure: raise] "b2 is true" - # 117| "b2 is true" #-----| -> call to raise @@ -3551,40 +3074,28 @@ raise.rb: # 121| m10 #-----| -> m11 -# 121| m10 -#-----| -> m10 - # 121| p -#-----| no-match -> raise +#-----| no-match -> "Exception" #-----| match -> ensure ... # 121| call to raise #-----| raise -> exit m10 (abnormal) -# 121| raise -#-----| -> "Exception" - # 121| "Exception" #-----| -> call to raise # 124| ensure ... -#-----| -> puts +#-----| -> "Will not get executed if p is..." # 125| call to puts #-----| -> exit m10 (normal) -# 125| puts -#-----| -> "Will not get executed if p is..." - # 125| "Will not get executed if p is..." #-----| -> call to puts # 128| m11 #-----| -> m12 -# 128| m11 -#-----| -> m11 - # 128| b #-----| -> b @@ -3593,14 +3104,11 @@ raise.rb: # 130| b #-----| false -> if ... -#-----| true -> raise +#-----| true -> ExceptionA # 131| call to raise #-----| raise -> rescue ... -# 131| raise -#-----| -> ExceptionA - # 131| ExceptionA #-----| -> call to raise @@ -3615,36 +3123,27 @@ raise.rb: #-----| -> ExceptionB # 134| ExceptionB -#-----| match -> puts +#-----| match -> "ExceptionB" #-----| raise -> [ensure: raise] ensure ... # 135| call to puts #-----| -> ensure ... -# 135| puts -#-----| -> "ExceptionB" - # 135| "ExceptionB" #-----| -> call to puts # 136| ensure ... -#-----| -> puts +#-----| -> "Ensure" # 136| [ensure: raise] ensure ... -#-----| -> [ensure: raise] puts +#-----| -> [ensure: raise] "Ensure" # 137| call to puts -#-----| -> puts +#-----| -> "End m11" # 137| [ensure: raise] call to puts #-----| raise -> exit m11 (abnormal) -# 137| puts -#-----| -> "Ensure" - -# 137| [ensure: raise] puts -#-----| -> [ensure: raise] "Ensure" - # 137| "Ensure" #-----| -> call to puts @@ -3654,18 +3153,12 @@ raise.rb: # 139| call to puts #-----| -> exit m11 (normal) -# 139| puts -#-----| -> "End m11" - # 139| "End m11" #-----| -> call to puts # 142| m12 #-----| -> m13 -# 142| m12 -#-----| -> m12 - # 142| b #-----| -> b @@ -3674,14 +3167,11 @@ raise.rb: # 143| b #-----| false -> if ... -#-----| true -> raise +#-----| true -> "" # 144| call to raise #-----| raise -> [ensure: raise] ensure ... -# 144| raise -#-----| -> "" - # 144| "" #-----| -> call to raise @@ -3706,18 +3196,12 @@ raise.rb: # 150| m13 #-----| -> m14 -# 150| m13 -#-----| -> m13 - # 151| ensure ... #-----| -> exit m13 (normal) # 154| m14 #-----| -> exit raise.rb (normal) -# 154| m14 -#-----| -> m14 - # 154| element #-----| -> element @@ -3725,9 +3209,6 @@ raise.rb: #-----| -> exit m14 (normal) # 155| element -#-----| -> each - -# 155| each #-----| -> { ... } # 155| { ... } @@ -3742,20 +3223,14 @@ raise.rb: # 155| call to raise #-----| raise -> exit { ... } (abnormal) -# 155| raise -#-----| -> "" - # 155| "" #-----| -> call to raise # 155| call to nil? #-----| false -> ... if ... -#-----| true -> raise +#-----| true -> "" # 155| element -#-----| -> nil? - -# 155| nil? #-----| -> call to nil? break_ensure.rb: diff --git a/ql/test/library-tests/variables/ssa.expected b/ql/test/library-tests/variables/ssa.expected index c1cc2f30faa..513d0029e8c 100644 --- a/ql/test/library-tests/variables/ssa.expected +++ b/ql/test/library-tests/variables/ssa.expected @@ -26,11 +26,11 @@ definition | parameters.rb:35:1:38:3 | | parameters.rb:35:16:35:16 | b | | parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | | parameters.rb:35:16:35:20 | ... = ... | parameters.rb:35:16:35:16 | b | -| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | +| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | | parameters.rb:40:1:43:3 | | parameters.rb:40:15:40:15 | e | | parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | | parameters.rb:40:15:40:19 | ... = ... | parameters.rb:40:15:40:15 | e | -| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | +| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | | parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | @@ -38,7 +38,7 @@ definition | parameters.rb:54:9:57:3 | | parameters.rb:53:1:53:1 | x | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | | parameters.rb:54:19:54:23 | ... = ... | parameters.rb:53:1:53:1 | x | -| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | +| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | | scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | | scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | | scopes.rb:9:9:18:3 | | scopes.rb:7:1:7:1 | a | @@ -68,7 +68,7 @@ definition | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | | ssa.rb:49:1:51:3 | | ssa.rb:49:14:49:14 | y | | ssa.rb:49:14:49:19 | ... = ... | ssa.rb:49:14:49:14 | y | -| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | +| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | | ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | | ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | @@ -113,14 +113,14 @@ read | parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle | | parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last | | parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a | -| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b | +| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b | | parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d | -| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e | +| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:46:8:46:8 | _ | | parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:50:11:50:11 | a | | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | -| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | +| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | | scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | | scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | @@ -153,7 +153,7 @@ read | ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x | -| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | +| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo | | ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | | ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | @@ -193,14 +193,14 @@ firstRead | parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle | | parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last | | parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a | -| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b | +| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b | | parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d | -| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e | +| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:46:8:46:8 | _ | | parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:50:11:50:11 | a | | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | -| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | +| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | | scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | | scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | @@ -223,7 +223,7 @@ firstRead | ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x | -| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | +| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo | | ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | | ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | @@ -262,14 +262,14 @@ lastRead | parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle | | parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last | | parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a | -| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b | +| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b | | parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d | -| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e | +| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:46:8:46:8 | _ | | parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:50:11:50:11 | a | | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b | | parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | -| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | +| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | | scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | | scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | | scopes.rb:9:9:18:3 | | scopes.rb:7:1:7:1 | a | scopes.rb:11:4:11:4 | a | @@ -293,7 +293,7 @@ lastRead | ssa.rb:40:3:40:9 | ... = ... | ssa.rb:40:3:40:4 | m3 | ssa.rb:41:8:41:9 | m3 | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | ssa.rb:45:12:45:12 | b | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:46:8:46:8 | x | -| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | +| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:50:8:50:8 | y | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | ssa.rb:54:7:54:9 | foo | | ssa.rb:54:3:54:11 | ... = ... | ssa.rb:54:3:54:3 | x | ssa.rb:55:8:55:8 | x | | ssa.rb:59:3:59:8 | ... = ... | ssa.rb:59:3:59:3 | x | ssa.rb:60:3:60:3 | x | @@ -320,12 +320,12 @@ adjacentReads | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:20:10:20:10 | x | ssa.rb:21:5:21:5 | x | | ssa.rb:66:11:70:5 | | ssa.rb:65:3:65:10 | captured | ssa.rb:68:10:68:17 | captured | ssa.rb:69:5:69:12 | captured | phi -| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | | -| parameters.rb:37:3:37:6 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:20 | ... = ... | -| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | | -| parameters.rb:42:3:42:6 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:19 | ... = ... | -| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:9:57:3 | | -| parameters.rb:55:4:55:7 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:23 | ... = ... | +| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | | +| parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:20 | ... = ... | +| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | | +| parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:19 | ... = ... | +| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:9:57:3 | | +| parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:54:19:54:23 | ... = ... | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:6:5:6:9 | ... = ... | | ssa.rb:5:3:13:5 | phi | ssa.rb:2:3:2:3 | i | ssa.rb:10:5:10:9 | ... = ... | | ssa.rb:19:9:19:9 | phi | ssa.rb:18:8:18:8 | x | ssa.rb:18:8:18:8 | x | @@ -334,5 +334,5 @@ phi | ssa.rb:26:12:26:22 | phi | ssa.rb:26:7:26:10 | elem | ssa.rb:26:7:26:10 | elem | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:44:1:47:3 | | | ssa.rb:45:3:45:12 | phi | ssa.rb:45:3:45:3 | x | ssa.rb:45:3:45:7 | ... = ... | -| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:1:51:3 | | -| ssa.rb:50:3:50:6 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:19 | ... = ... | +| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:1:51:3 | | +| ssa.rb:50:8:50:8 | phi | ssa.rb:49:14:49:14 | y | ssa.rb:49:14:49:19 | ... = ... | From 190978cc56520d83c31b84ba4b1dfbd6306f8c62 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 18 Feb 2021 19:31:41 +0100 Subject: [PATCH 03/10] AST: add consistency query --- ql/consistency-queries/AstConsistency.ql | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 ql/consistency-queries/AstConsistency.ql diff --git a/ql/consistency-queries/AstConsistency.ql b/ql/consistency-queries/AstConsistency.ql new file mode 100644 index 00000000000..6977374b5ed --- /dev/null +++ b/ql/consistency-queries/AstConsistency.ql @@ -0,0 +1,20 @@ +import codeql_ruby.AST + +private string getAPrimaryQlClass(AstNode node) { + result = node.getAPrimaryQlClass() + or + not exists(node.getAPrimaryQlClass()) and result = "(none)" +} + +query predicate missingParent(AstNode node, string cls) { + not exists(node.getParent()) and + node.getLocation().getFile().getExtension() != "erb" and + not node instanceof Toplevel and + cls = getAPrimaryQlClass(node) +} + +query predicate multipleParents(AstNode node, AstNode parent, string cls) { + parent = node.getParent() and + count(node.getParent()) > 1 and + cls = getAPrimaryQlClass(parent) +} From 8913810bf0106c8cb2cf985b8caf6b2596df2695 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 18 Feb 2021 21:07:18 +0100 Subject: [PATCH 04/10] AST: change return type of Assignment LHS to Pattern --- ql/src/codeql_ruby/ast/Operation.qll | 4 +++- ql/src/codeql_ruby/ast/internal/Operation.qll | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/ql/src/codeql_ruby/ast/Operation.qll b/ql/src/codeql_ruby/ast/Operation.qll index a25b0e4df16..8f3da5ffb5c 100644 --- a/ql/src/codeql_ruby/ast/Operation.qll +++ b/ql/src/codeql_ruby/ast/Operation.qll @@ -445,7 +445,7 @@ class Assignment extends Operation { override Assignment::Range range; /** Gets the left hand side of this assignment. */ - final Expr getLeftOperand() { result = range.getLeftOperand() } + Pattern getLeftOperand() { result = range.getLeftOperand() } /** Gets the right hand side of this assignment. */ final Expr getRightOperand() { result = range.getRightOperand() } @@ -554,6 +554,8 @@ class AssignExponentExpr extends AssignArithmeticOperation, @operator_assignment */ class AssignLogicalOperation extends AssignOperation { override AssignLogicalOperation::Range range; + + final override LhsExpr getLeftOperand() { result = super.getLeftOperand() } } /** diff --git a/ql/src/codeql_ruby/ast/internal/Operation.qll b/ql/src/codeql_ruby/ast/internal/Operation.qll index b605416bce9..ee11ad805ad 100644 --- a/ql/src/codeql_ruby/ast/internal/Operation.qll +++ b/ql/src/codeql_ruby/ast/internal/Operation.qll @@ -245,7 +245,7 @@ module NoRegexMatchExpr { module Assignment { abstract class Range extends Operation::Range { - abstract Expr getLeftOperand(); + abstract Pattern getLeftOperand(); abstract Expr getRightOperand(); @@ -269,7 +269,7 @@ module AssignExpr { class Range extends Assignment::Range, @assignment { final override Generated::Assignment generated; - final override Expr getLeftOperand() { result = generated.getLeft() } + final override Pattern getLeftOperand() { result = generated.getLeft() } final override Expr getRightOperand() { result = generated.getRight() } From 336b310668c70daafb5e48e25a76b303cde7b6d3 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Wed, 24 Feb 2021 11:12:23 +0100 Subject: [PATCH 05/10] AST: improve AST for special parameters --- ql/src/codeql_ruby/ast/Variable.qll | 8 +- ql/src/codeql_ruby/ast/internal/Parameter.qll | 16 +++ ql/src/codeql_ruby/ast/internal/Variable.qll | 65 +++++++++--- .../controlflow/internal/Completion.qll | 2 +- .../internal/ControlFlowGraphImpl.qll | 55 +++------- .../library-tests/ast/params/params.expected | 88 +++++++-------- .../controlflow/graph/Cfg.expected | 12 +-- .../variables/parameter.expected | 20 ++-- ql/test/library-tests/variables/ssa.expected | 100 +++++++++--------- .../variables/varaccess.expected | 12 +-- 10 files changed, 205 insertions(+), 173 deletions(-) diff --git a/ql/src/codeql_ruby/ast/Variable.qll b/ql/src/codeql_ruby/ast/Variable.qll index 6f283d813ed..7ba2fa64d2a 100644 --- a/ql/src/codeql_ruby/ast/Variable.qll +++ b/ql/src/codeql_ruby/ast/Variable.qll @@ -122,7 +122,7 @@ class VariableAccess extends Expr { * * both `a` and `b` are write accesses belonging to the same assignment. */ - predicate isExplicitWrite(AstNode assignment) { explicitWriteAccess(this, assignment) } + predicate isExplicitWrite(AstNode assignment) { range.isExplicitWrite(assignment) } /** * Holds if this access is a write access belonging to an implicit assignment. @@ -139,7 +139,7 @@ class VariableAccess extends Expr { * the access to `elements` in the parameter list is an implicit assignment, * as is the first access to `e`. */ - predicate isImplicitWrite() { implicitWriteAccess(this) } + predicate isImplicitWrite() { range.isImplicitWrite() } } /** An access to a variable where the value is updated. */ @@ -161,13 +161,13 @@ class VariableReadAccess extends VariableAccess { } /** An access to a local variable. */ -class LocalVariableAccess extends VariableAccess, @token_identifier { +class LocalVariableAccess extends VariableAccess, LocalVariableAccess::LocalVariableRange { final override LocalVariableAccess::Range range; final override LocalVariable getVariable() { result = range.getVariable() } final override string getAPrimaryQlClass() { - not this instanceof SimpleParameter and result = "LocalVariableAccess" + not this instanceof NamedParameter and result = "LocalVariableAccess" } /** diff --git a/ql/src/codeql_ruby/ast/internal/Parameter.qll b/ql/src/codeql_ruby/ast/internal/Parameter.qll index d73339e4da4..6595f38be33 100644 --- a/ql/src/codeql_ruby/ast/internal/Parameter.qll +++ b/ql/src/codeql_ruby/ast/internal/Parameter.qll @@ -111,6 +111,14 @@ module KeywordParameter { final override string toString() { result = this.getName() } final override string getName() { result = generated.getName().getValue() } + + final override Location getLocation() { result = generated.getName().getLocation() } + + final override predicate child(string label, AstNode::Range child) { + NamedParameter::Range.super.child(label, child) + or + label = "getDefaultValue" and child = getDefaultValue() + } } } @@ -127,6 +135,14 @@ module OptionalParameter { final override string toString() { result = this.getName() } final override string getName() { result = generated.getName().getValue() } + + final override Location getLocation() { result = generated.getName().getLocation() } + + final override predicate child(string label, AstNode::Range child) { + NamedParameter::Range.super.child(label, child) + or + label = "getDefaultValue" and child = getDefaultValue() + } } } diff --git a/ql/src/codeql_ruby/ast/internal/Variable.qll b/ql/src/codeql_ruby/ast/internal/Variable.qll index 2673dfd057a..ee2e11a7d91 100644 --- a/ql/src/codeql_ruby/ast/internal/Variable.qll +++ b/ql/src/codeql_ruby/ast/internal/Variable.qll @@ -116,6 +116,23 @@ private predicate strictlyBefore(Location one, Location two) { one.getStartLine() = two.getStartLine() and one.getStartColumn() < two.getStartColumn() } +private Generated::AstNode getNodeForIdentifier(Generated::Identifier id) { + exists(Generated::AstNode parent | parent = id.getParent() | + if + parent instanceof Generated::BlockParameter + or + parent instanceof Generated::SplatParameter + or + parent instanceof Generated::HashSplatParameter + or + parent instanceof Generated::KeywordParameter + or + parent instanceof Generated::OptionalParameter + then result = parent + else result = id + ) +} + cached private module Cached { /** Gets the enclosing scope for `node`. */ @@ -518,7 +535,7 @@ module LocalVariable { final override VariableScope getDeclaringScope() { result = scope } - final VariableAccess getDefiningAccess() { result = i } + final VariableAccess getDefiningAccess() { result = getNodeForIdentifier(i) } } } @@ -577,28 +594,46 @@ module VariableAccess { abstract class Range extends Expr::Range { abstract Variable getVariable(); - final override string toString() { result = this.getVariable().getName() } + final predicate isExplicitWrite(AstNode assignment) { + exists(Generated::Identifier i | this = getNodeForIdentifier(i) | + explicitWriteAccess(i, assignment) + ) + or + not this = getNodeForIdentifier(_) and explicitWriteAccess(this, assignment) + } - override predicate child(string label, AstNode::Range child) { none() } + final predicate isImplicitWrite() { + exists(Generated::Identifier i | this = getNodeForIdentifier(i) | implicitWriteAccess(i)) + or + not this = getNodeForIdentifier(_) and implicitWriteAccess(this) + } } } module LocalVariableAccess { - class Range extends VariableAccess::Range, @token_identifier { - override Generated::Identifier generated; + class LocalVariableRange = + @token_identifier or @splat_parameter or @keyword_parameter or @optional_parameter or + @hash_splat_parameter or @block_parameter; + + class Range extends VariableAccess::Range, LocalVariableRange { LocalVariable variable; Range() { - access(this, variable) and - ( - explicitWriteAccess(this, _) - or - implicitWriteAccess(this) - or - vcall(this) + exists(Generated::Identifier id | + this = getNodeForIdentifier(id) and + access(id, variable) and + ( + explicitWriteAccess(id, _) + or + implicitWriteAccess(id) + or + vcall(id) + ) ) } + override string toString() { result = generated.(Generated::Identifier).getValue() } + final override LocalVariable getVariable() { result = variable } } } @@ -610,6 +645,8 @@ module GlobalVariableAccess { Range() { this.(Generated::GlobalVariable).getValue() = variable.getName() } final override GlobalVariable getVariable() { result = variable } + + override string toString() { result = generated.(Generated::GlobalVariable).getValue() } } } @@ -620,6 +657,8 @@ module InstanceVariableAccess { Range() { instanceVariableAccess(this, variable) } final override InstanceVariable getVariable() { result = variable } + + override string toString() { result = generated.(Generated::InstanceVariable).getValue() } } } @@ -630,5 +669,7 @@ module ClassVariableAccess { Range() { classVariableAccess(this, variable) } final override ClassVariable getVariable() { result = variable } + + override string toString() { result = generated.(Generated::ClassVariable).getValue() } } } diff --git a/ql/src/codeql_ruby/controlflow/internal/Completion.qll b/ql/src/codeql_ruby/controlflow/internal/Completion.qll index 4da3a0c1319..c3ac8b87b67 100644 --- a/ql/src/codeql_ruby/controlflow/internal/Completion.qll +++ b/ql/src/codeql_ruby/controlflow/internal/Completion.qll @@ -218,7 +218,7 @@ private predicate inMatchingContext(AstNode n) { w.getPattern(_).getChild() = n ) or - n = any(Trees::DefaultValueParameterTree t | t.hasDefaultValue()).getIdentifier() + n = any(Trees::DefaultValueParameterTree t | t.hasDefaultValue()) } /** diff --git a/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll b/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll index e58f6fab749..85d8f692401 100644 --- a/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll +++ b/ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll @@ -431,9 +431,7 @@ module Trees { } } - private class BlockParameterTree extends ComplexParameterTree, BlockParameter { - final override Identifier getIdentifier() { result = this.getName() } - } + private class BlockParameterTree extends LeafTree, BlockParameter { } private class CaseTree extends PreOrderTree, Case { final override predicate propagatesAbnormal(AstNode child) { @@ -494,47 +492,32 @@ module Trees { private class ComplexTree extends LeafTree, Complex { } - abstract private class ComplexParameterTree extends ControlFlowTree { - abstract Identifier getIdentifier(); - - final override predicate propagatesAbnormal(AstNode child) { none() } - - final override predicate first(AstNode first) { first(this.getIdentifier(), first) } - - final override predicate last(AstNode last, Completion c) { - last(this.getIdentifier(), last, c) - } - - final override predicate succ(AstNode pred, AstNode succ, Completion c) { none() } - } - private class ConstantTree extends LeafTree, Constant { } /** A parameter that may have a default value. */ - abstract class DefaultValueParameterTree extends ControlFlowTree { + abstract class DefaultValueParameterTree extends PreOrderTree { abstract AstNode getDefaultValue(); - abstract Identifier getIdentifier(); - predicate hasDefaultValue() { exists(this.getDefaultValue()) } final override predicate propagatesAbnormal(AstNode child) { child = this.getDefaultValue() } - final override predicate first(AstNode first) { first(this.getIdentifier(), first) } - final override predicate last(AstNode last, Completion c) { - last(this.getIdentifier(), last, c) and - c.(MatchingCompletion).getValue() = true - or - last(this.getDefaultValue(), last, c) - or - last(this.getIdentifier(), last, c) and - not this.hasDefaultValue() and + last(this.getDefaultValue(), last, c) and c instanceof NormalCompletion + or + last = this and + ( + not this.hasDefaultValue() and + c instanceof SimpleCompletion + or + this.hasDefaultValue() and + c.(MatchingCompletion).getValue() = true + ) } final override predicate succ(AstNode pred, AstNode succ, Completion c) { - last(this.getIdentifier(), pred, c) and + pred = this and first(this.getDefaultValue(), succ) and c.(MatchingCompletion).getValue() = false } @@ -675,9 +658,7 @@ module Trees { private class GlobalVariableTree extends LeafTree, GlobalVariable { } - private class HashSplatParameterTree extends ComplexParameterTree, HashSplatParameter { - final override Identifier getIdentifier() { result = this.getName() } - } + private class HashSplatParameterTree extends LeafTree, HashSplatParameter { } private HeredocBody heredoc(HeredocBeginning start) { exists(int i, File f | @@ -734,8 +715,6 @@ module Trees { private class KeywordParameterTree extends DefaultValueParameterTree, KeywordParameter { final override AstNode getDefaultValue() { result = this.getValue() } - - final override Identifier getIdentifier() { result = this.getName() } } class LambdaTree extends LeafTree, Lambda { @@ -834,8 +813,6 @@ module Trees { private class OptionalParameterTree extends DefaultValueParameterTree, OptionalParameter { final override AstNode getDefaultValue() { result = this.getValue() } - - final override Identifier getIdentifier() { result = this.getName() } } private class RationalTree extends LeafTree, Rational { } @@ -1196,9 +1173,7 @@ module Trees { } } - private class SplatParameterTree extends ComplexParameterTree, SplatParameter { - final override Identifier getIdentifier() { result = this.getName() } - } + private class SplatParameterTree extends LeafTree, SplatParameter { } private class SuperTree extends LeafTree, Super { } diff --git a/ql/test/library-tests/ast/params/params.expected b/ql/test/library-tests/ast/params/params.expected index b86c4482826..5ae4fc32b38 100644 --- a/ql/test/library-tests/ast/params/params.expected +++ b/ql/test/library-tests/ast/params/params.expected @@ -16,23 +16,23 @@ idParams | params.rb:38:29:38:33 | *blah | blah | | params.rb:38:36:38:43 | **wibble | wibble | | params.rb:41:32:41:32 | x | x | -| params.rb:41:35:41:38 | foo | foo | -| params.rb:41:41:41:46 | bar | bar | +| params.rb:41:35:41:37 | foo | foo | +| params.rb:41:41:41:43 | bar | bar | | params.rb:46:28:46:33 | &block | block | -| params.rb:49:28:49:30 | xx | xx | -| params.rb:49:33:49:39 | yy | yy | +| params.rb:49:28:49:29 | xx | xx | +| params.rb:49:33:49:34 | yy | yy | | params.rb:53:34:53:34 | x | x | -| params.rb:53:37:53:38 | y | y | -| params.rb:53:41:53:44 | z | z | +| params.rb:53:37:53:37 | y | y | +| params.rb:53:41:53:41 | z | z | | params.rb:58:33:58:36 | val1 | val1 | -| params.rb:58:39:58:46 | val2 | val2 | -| params.rb:58:49:58:58 | val3 | val3 | +| params.rb:58:39:58:42 | val2 | val2 | +| params.rb:58:49:58:52 | val3 | val3 | | params.rb:62:29:62:34 | &block | block | | params.rb:65:29:65:32 | name | name | -| params.rb:65:35:65:42 | age | age | +| params.rb:65:35:65:37 | age | age | | params.rb:70:35:70:35 | a | a | -| params.rb:70:38:70:45 | b | b | -| params.rb:70:48:70:53 | c | c | +| params.rb:70:38:70:38 | b | b | +| params.rb:70:48:70:48 | c | c | blockParams | params.rb:46:28:46:33 | &block | block | | params.rb:62:29:62:34 | &block | block | @@ -55,18 +55,18 @@ hashSplatParams | params.rb:34:29:34:42 | **double_splat | double_splat | | params.rb:38:36:38:43 | **wibble | wibble | keywordParams -| params.rb:41:35:41:38 | foo | foo | (none) | -| params.rb:41:41:41:46 | bar | bar | 7 | -| params.rb:49:28:49:30 | xx | xx | (none) | -| params.rb:49:33:49:39 | yy | yy | 100 | -| params.rb:53:37:53:38 | y | y | (none) | -| params.rb:53:41:53:44 | z | z | 3 | +| params.rb:41:35:41:37 | foo | foo | (none) | +| params.rb:41:41:41:43 | bar | bar | 7 | +| params.rb:49:28:49:29 | xx | xx | (none) | +| params.rb:49:33:49:34 | yy | yy | 100 | +| params.rb:53:37:53:37 | y | y | (none) | +| params.rb:53:41:53:41 | z | z | 3 | optionalParams -| params.rb:58:39:58:46 | val2 | val2 | params.rb:58:46:58:46 | 0 | -| params.rb:58:49:58:58 | val3 | val3 | params.rb:58:56:58:58 | 100 | -| params.rb:65:35:65:42 | age | age | params.rb:65:41:65:42 | 99 | -| params.rb:70:38:70:45 | b | b | params.rb:70:42:70:45 | 1000 | -| params.rb:70:48:70:53 | c | c | params.rb:70:52:70:53 | 20 | +| params.rb:58:39:58:42 | val2 | val2 | params.rb:58:46:58:46 | 0 | +| params.rb:58:49:58:52 | val3 | val3 | params.rb:58:56:58:58 | 100 | +| params.rb:65:35:65:37 | age | age | params.rb:65:41:65:42 | 99 | +| params.rb:70:38:70:38 | b | b | params.rb:70:42:70:45 | 1000 | +| params.rb:70:48:70:48 | c | c | params.rb:70:52:70:53 | 20 | paramsInMethods | params.rb:4:1:5:3 | identifier_method_params | 0 | params.rb:4:30:4:32 | foo | SimpleParameter | | params.rb:4:1:5:3 | identifier_method_params | 1 | params.rb:4:35:4:37 | bar | SimpleParameter | @@ -76,12 +76,12 @@ paramsInMethods | params.rb:30:1:31:3 | method_with_splat | 1 | params.rb:30:31:30:36 | *splat | SplatParameter | | params.rb:30:1:31:3 | method_with_splat | 2 | params.rb:30:39:30:52 | **double_splat | HashSplatParameter | | params.rb:41:1:43:3 | method_with_keyword_params | 0 | params.rb:41:32:41:32 | x | SimpleParameter | -| params.rb:41:1:43:3 | method_with_keyword_params | 1 | params.rb:41:35:41:38 | foo | KeywordParameter | -| params.rb:41:1:43:3 | method_with_keyword_params | 2 | params.rb:41:41:41:46 | bar | KeywordParameter | +| params.rb:41:1:43:3 | method_with_keyword_params | 1 | params.rb:41:35:41:37 | foo | KeywordParameter | +| params.rb:41:1:43:3 | method_with_keyword_params | 2 | params.rb:41:41:41:43 | bar | KeywordParameter | | params.rb:46:1:48:3 | use_block_with_keyword | 0 | params.rb:46:28:46:33 | &block | BlockParameter | | params.rb:58:1:59:3 | method_with_optional_params | 0 | params.rb:58:33:58:36 | val1 | SimpleParameter | -| params.rb:58:1:59:3 | method_with_optional_params | 1 | params.rb:58:39:58:46 | val2 | OptionalParameter | -| params.rb:58:1:59:3 | method_with_optional_params | 2 | params.rb:58:49:58:58 | val3 | OptionalParameter | +| params.rb:58:1:59:3 | method_with_optional_params | 1 | params.rb:58:39:58:42 | val2 | OptionalParameter | +| params.rb:58:1:59:3 | method_with_optional_params | 2 | params.rb:58:49:58:52 | val3 | OptionalParameter | | params.rb:62:1:64:3 | use_block_with_optional | 0 | params.rb:62:29:62:34 | &block | BlockParameter | paramsInBlocks | params.rb:9:11:11:3 | do ... end | 0 | params.rb:9:15:9:17 | key | SimpleParameter | @@ -90,10 +90,10 @@ paramsInBlocks | params.rb:34:12:35:3 | do ... end | 0 | params.rb:34:16:34:18 | val | SimpleParameter | | params.rb:34:12:35:3 | do ... end | 1 | params.rb:34:21:34:26 | *splat | SplatParameter | | params.rb:34:12:35:3 | do ... end | 2 | params.rb:34:29:34:42 | **double_splat | HashSplatParameter | -| params.rb:49:24:51:3 | do ... end | 0 | params.rb:49:28:49:30 | xx | KeywordParameter | -| params.rb:49:24:51:3 | do ... end | 1 | params.rb:49:33:49:39 | yy | KeywordParameter | +| params.rb:49:24:51:3 | do ... end | 0 | params.rb:49:28:49:29 | xx | KeywordParameter | +| params.rb:49:24:51:3 | do ... end | 1 | params.rb:49:33:49:34 | yy | KeywordParameter | | params.rb:65:25:67:3 | do ... end | 0 | params.rb:65:29:65:32 | name | SimpleParameter | -| params.rb:65:25:67:3 | do ... end | 1 | params.rb:65:35:65:42 | age | OptionalParameter | +| params.rb:65:25:67:3 | do ... end | 1 | params.rb:65:35:65:37 | age | OptionalParameter | paramsInLambdas | params.rb:14:7:14:33 | -> { ... } | 0 | params.rb:14:11:14:13 | foo | SimpleParameter | | params.rb:14:7:14:33 | -> { ... } | 1 | params.rb:14:16:14:18 | bar | SimpleParameter | @@ -103,11 +103,11 @@ paramsInLambdas | params.rb:38:22:38:47 | -> { ... } | 1 | params.rb:38:29:38:33 | *blah | SplatParameter | | params.rb:38:22:38:47 | -> { ... } | 2 | params.rb:38:36:38:43 | **wibble | HashSplatParameter | | params.rb:53:30:55:1 | -> { ... } | 0 | params.rb:53:34:53:34 | x | SimpleParameter | -| params.rb:53:30:55:1 | -> { ... } | 1 | params.rb:53:37:53:38 | y | KeywordParameter | -| params.rb:53:30:55:1 | -> { ... } | 2 | params.rb:53:41:53:44 | z | KeywordParameter | +| params.rb:53:30:55:1 | -> { ... } | 1 | params.rb:53:37:53:37 | y | KeywordParameter | +| params.rb:53:30:55:1 | -> { ... } | 2 | params.rb:53:41:53:41 | z | KeywordParameter | | params.rb:70:31:70:64 | -> { ... } | 0 | params.rb:70:35:70:35 | a | SimpleParameter | -| params.rb:70:31:70:64 | -> { ... } | 1 | params.rb:70:38:70:45 | b | OptionalParameter | -| params.rb:70:31:70:64 | -> { ... } | 2 | params.rb:70:48:70:53 | c | OptionalParameter | +| params.rb:70:31:70:64 | -> { ... } | 1 | params.rb:70:38:70:38 | b | OptionalParameter | +| params.rb:70:31:70:64 | -> { ... } | 2 | params.rb:70:48:70:48 | c | OptionalParameter | params | params.rb:4:30:4:32 | foo | 0 | SimpleParameter | | params.rb:4:35:4:37 | bar | 1 | SimpleParameter | @@ -130,20 +130,20 @@ params | params.rb:38:29:38:33 | *blah | 1 | SplatParameter | | params.rb:38:36:38:43 | **wibble | 2 | HashSplatParameter | | params.rb:41:32:41:32 | x | 0 | SimpleParameter | -| params.rb:41:35:41:38 | foo | 1 | KeywordParameter | -| params.rb:41:41:41:46 | bar | 2 | KeywordParameter | +| params.rb:41:35:41:37 | foo | 1 | KeywordParameter | +| params.rb:41:41:41:43 | bar | 2 | KeywordParameter | | params.rb:46:28:46:33 | &block | 0 | BlockParameter | -| params.rb:49:28:49:30 | xx | 0 | KeywordParameter | -| params.rb:49:33:49:39 | yy | 1 | KeywordParameter | +| params.rb:49:28:49:29 | xx | 0 | KeywordParameter | +| params.rb:49:33:49:34 | yy | 1 | KeywordParameter | | params.rb:53:34:53:34 | x | 0 | SimpleParameter | -| params.rb:53:37:53:38 | y | 1 | KeywordParameter | -| params.rb:53:41:53:44 | z | 2 | KeywordParameter | +| params.rb:53:37:53:37 | y | 1 | KeywordParameter | +| params.rb:53:41:53:41 | z | 2 | KeywordParameter | | params.rb:58:33:58:36 | val1 | 0 | SimpleParameter | -| params.rb:58:39:58:46 | val2 | 1 | OptionalParameter | -| params.rb:58:49:58:58 | val3 | 2 | OptionalParameter | +| params.rb:58:39:58:42 | val2 | 1 | OptionalParameter | +| params.rb:58:49:58:52 | val3 | 2 | OptionalParameter | | params.rb:62:29:62:34 | &block | 0 | BlockParameter | | params.rb:65:29:65:32 | name | 0 | SimpleParameter | -| params.rb:65:35:65:42 | age | 1 | OptionalParameter | +| params.rb:65:35:65:37 | age | 1 | OptionalParameter | | params.rb:70:35:70:35 | a | 0 | SimpleParameter | -| params.rb:70:38:70:45 | b | 1 | OptionalParameter | -| params.rb:70:48:70:53 | c | 2 | OptionalParameter | +| params.rb:70:38:70:38 | b | 1 | OptionalParameter | +| params.rb:70:48:70:48 | c | 2 | OptionalParameter | diff --git a/ql/test/library-tests/controlflow/graph/Cfg.expected b/ql/test/library-tests/controlflow/graph/Cfg.expected index a5bff7e49f4..7c43e1211e5 100644 --- a/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -35,7 +35,7 @@ cfg.rb: #-----| -> x # 29| enter { ... } -#-----| -> x +#-----| -> &x # 63| enter pattern #-----| -> a @@ -53,7 +53,7 @@ cfg.rb: #-----| -> "singleton" # 149| enter method -#-----| -> x +#-----| -> *x # 153| enter two_parameters #-----| -> a @@ -637,7 +637,7 @@ cfg.rb: # 29| { ... } #-----| -> call to new -# 29| x +# 29| &x #-----| -> x # 29| call to call @@ -1155,9 +1155,9 @@ cfg.rb: #-----| -> key # 101| key -#-----| -> kwargs +#-----| -> **kwargs -# 101| kwargs +# 101| **kwargs #-----| -> value # 102| call to puts @@ -1513,7 +1513,7 @@ cfg.rb: # 149| silly #-----| -> method -# 149| x +# 149| *x #-----| -> x # 150| call to puts diff --git a/ql/test/library-tests/variables/parameter.expected b/ql/test/library-tests/variables/parameter.expected index 959f8cfdc14..6e21d46b212 100644 --- a/ql/test/library-tests/variables/parameter.expected +++ b/ql/test/library-tests/variables/parameter.expected @@ -12,17 +12,17 @@ parameterVariable | parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | | parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | | parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block | -| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | -| parameters.rb:25:33:25:50 | size | parameters.rb:25:33:25:36 | size | -| parameters.rb:30:15:30:20 | first | parameters.rb:30:15:30:19 | first | -| parameters.rb:30:24:30:33 | middle | parameters.rb:30:24:30:29 | middle | -| parameters.rb:30:36:30:40 | last | parameters.rb:30:36:30:39 | last | -| parameters.rb:35:11:35:21 | a | parameters.rb:35:11:35:11 | a | -| parameters.rb:40:12:40:19 | d | parameters.rb:40:12:40:12 | d | +| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | +| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | +| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first | +| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | +| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | +| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | +| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | | parameters.rb:49:12:49:16 | (..., ...) | parameters.rb:49:13:49:13 | a | | parameters.rb:49:12:49:16 | (..., ...) | parameters.rb:49:15:49:15 | b | -| parameters.rb:54:14:54:24 | y | parameters.rb:54:14:54:14 | y | +| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | | scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | | scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x | | ssa.rb:1:7:1:7 | b | ssa.rb:1:7:1:7 | b | @@ -30,7 +30,7 @@ parameterVariable | ssa.rb:25:8:25:15 | elements | ssa.rb:25:8:25:15 | elements | | ssa.rb:33:20:33:20 | x | ssa.rb:33:20:33:20 | x | | ssa.rb:44:8:44:8 | b | ssa.rb:44:8:44:8 | b | -| ssa.rb:49:9:49:20 | x | ssa.rb:49:9:49:9 | x | +| ssa.rb:49:9:49:9 | x | ssa.rb:49:9:49:9 | x | | ssa.rb:53:8:53:10 | foo | ssa.rb:53:8:53:10 | foo | | ssa.rb:64:8:64:8 | a | ssa.rb:64:8:64:8 | a | | ssa.rb:66:15:66:15 | a | ssa.rb:66:15:66:15 | a | @@ -41,4 +41,4 @@ parameterVariableNoAccess | nested_scopes.rb:18:26:18:26 | x | nested_scopes.rb:18:26:18:26 | x | | scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | | scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x | -| ssa.rb:49:9:49:20 | x | ssa.rb:49:9:49:9 | x | +| ssa.rb:49:9:49:9 | x | ssa.rb:49:9:49:9 | x | diff --git a/ql/test/library-tests/variables/ssa.expected b/ql/test/library-tests/variables/ssa.expected index 513d0029e8c..a8dc90f7495 100644 --- a/ql/test/library-tests/variables/ssa.expected +++ b/ql/test/library-tests/variables/ssa.expected @@ -13,22 +13,22 @@ definition | parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | | parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | -| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | -| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | +| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | +| parameters.rb:15:15:15:19 | **map | parameters.rb:15:17:15:19 | map | | parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | | parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | -| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | -| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | -| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | -| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first | -| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | -| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | +| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block | +| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | +| parameters.rb:25:33:25:50 | size | parameters.rb:25:33:25:36 | size | +| parameters.rb:30:15:30:20 | first | parameters.rb:30:15:30:19 | first | +| parameters.rb:30:24:30:33 | middle | parameters.rb:30:24:30:29 | middle | +| parameters.rb:30:36:30:40 | last | parameters.rb:30:36:30:39 | last | | parameters.rb:35:1:38:3 | | parameters.rb:35:16:35:16 | b | -| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | +| parameters.rb:35:11:35:21 | a | parameters.rb:35:11:35:11 | a | | parameters.rb:35:16:35:20 | ... = ... | parameters.rb:35:16:35:16 | b | | parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | | parameters.rb:40:1:43:3 | | parameters.rb:40:15:40:15 | e | -| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | +| parameters.rb:40:12:40:19 | d | parameters.rb:40:12:40:12 | d | | parameters.rb:40:15:40:19 | ... = ... | parameters.rb:40:15:40:15 | e | | parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | @@ -36,7 +36,7 @@ definition | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | | parameters.rb:53:1:53:6 | ... = ... | parameters.rb:53:1:53:1 | x | | parameters.rb:54:9:57:3 | | parameters.rb:53:1:53:1 | x | -| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | +| parameters.rb:54:14:54:24 | y | parameters.rb:54:14:54:14 | y | | parameters.rb:54:19:54:23 | ... = ... | parameters.rb:53:1:53:1 | x | | parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | | scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | @@ -100,26 +100,26 @@ read | parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:11:41:11:46 | client | -| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas | -| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:11:14:11:19 | pizzas | -| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map | +| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas | +| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:11:14:11:19 | pizzas | +| parameters.rb:15:15:15:19 | **map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map | | parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:17:13:17:15 | key | | parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:17:22:17:26 | value | -| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block | -| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name | -| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name | -| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size | -| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first | -| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle | -| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last | -| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a | +| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block | +| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name | +| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name | +| parameters.rb:25:33:25:50 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size | +| parameters.rb:30:15:30:20 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first | +| parameters.rb:30:24:30:33 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle | +| parameters.rb:30:36:30:40 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last | +| parameters.rb:35:11:35:21 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a | | parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b | -| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d | +| parameters.rb:40:12:40:19 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d | | parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:46:8:46:8 | _ | | parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:50:11:50:11 | a | | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b | -| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | +| parameters.rb:54:14:54:24 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | | parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | | scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | | scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | @@ -181,25 +181,25 @@ firstRead | parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:11:41:11:46 | client | -| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas | -| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map | +| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas | +| parameters.rb:15:15:15:19 | **map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map | | parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:17:13:17:15 | key | | parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:17:22:17:26 | value | -| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block | -| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name | -| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name | -| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size | -| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first | -| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle | -| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last | -| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a | +| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block | +| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name | +| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name | +| parameters.rb:25:33:25:50 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size | +| parameters.rb:30:15:30:20 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first | +| parameters.rb:30:24:30:33 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle | +| parameters.rb:30:36:30:40 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last | +| parameters.rb:35:11:35:21 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a | | parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b | -| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d | +| parameters.rb:40:12:40:19 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d | | parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:46:8:46:8 | _ | | parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:50:11:50:11 | a | | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b | -| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | +| parameters.rb:54:14:54:24 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | | parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | | scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | | scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | @@ -250,25 +250,25 @@ lastRead | parameters.rb:2:4:2:8 | ... = ... | parameters.rb:1:18:1:18 | y | parameters.rb:4:9:4:9 | y | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:9:25:9:30 | client | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:11:41:11:46 | client | -| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas | -| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:11:14:11:19 | pizzas | -| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map | +| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas | +| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:11:14:11:19 | pizzas | +| parameters.rb:15:15:15:19 | **map | parameters.rb:15:17:15:19 | map | parameters.rb:16:3:16:5 | map | | parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:17:13:17:15 | key | | parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:17:22:17:26 | value | -| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block | -| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name | -| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size | -| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first | -| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle | -| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last | -| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a | +| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block | parameters.rb:22:3:22:7 | block | +| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:26:8:26:11 | name | +| parameters.rb:25:33:25:50 | size | parameters.rb:25:33:25:36 | size | parameters.rb:27:8:27:11 | size | +| parameters.rb:30:15:30:20 | first | parameters.rb:30:15:30:19 | first | parameters.rb:31:11:31:15 | first | +| parameters.rb:30:24:30:33 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:31:20:31:25 | middle | +| parameters.rb:30:36:30:40 | last | parameters.rb:30:36:30:39 | last | parameters.rb:31:30:31:33 | last | +| parameters.rb:35:11:35:21 | a | parameters.rb:35:11:35:11 | a | parameters.rb:37:11:37:11 | a | | parameters.rb:37:11:37:11 | phi | parameters.rb:35:16:35:16 | b | parameters.rb:37:16:37:16 | b | -| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d | +| parameters.rb:40:12:40:19 | d | parameters.rb:40:12:40:12 | d | parameters.rb:42:11:42:11 | d | | parameters.rb:42:11:42:11 | phi | parameters.rb:40:15:40:15 | e | parameters.rb:42:16:42:16 | e | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:46:8:46:8 | _ | | parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:50:11:50:11 | a | | parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:50:16:50:16 | b | -| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | +| parameters.rb:54:14:54:24 | y | parameters.rb:54:14:54:14 | y | parameters.rb:56:9:56:9 | y | | parameters.rb:55:9:55:9 | phi | parameters.rb:53:1:53:1 | x | parameters.rb:55:9:55:9 | x | | scopes.rb:4:4:4:8 | ... = ... | scopes.rb:4:4:4:4 | a | scopes.rb:5:9:5:9 | a | | scopes.rb:7:1:7:5 | ... = ... | scopes.rb:7:1:7:1 | a | scopes.rb:8:6:8:6 | a | @@ -306,8 +306,8 @@ lastRead | ssa.rb:84:10:86:8 | | ssa.rb:82:3:82:10 | captured | ssa.rb:85:15:85:22 | captured | adjacentReads | nested_scopes.rb:13:11:13:15 | ... = ... | nested_scopes.rb:13:11:13:11 | a | nested_scopes.rb:14:16:14:16 | a | nested_scopes.rb:15:11:15:11 | a | -| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas | parameters.rb:11:14:11:19 | pizzas | -| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name | parameters.rb:26:8:26:11 | name | +| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:8:6:8:11 | pizzas | parameters.rb:11:14:11:19 | pizzas | +| parameters.rb:25:15:25:30 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:40:25:43 | name | parameters.rb:26:8:26:11 | name | | scopes.rb:9:9:18:3 | | scopes.rb:7:1:7:1 | a | scopes.rb:10:9:10:9 | a | scopes.rb:11:4:11:4 | a | | scopes.rb:27:1:27:5 | ... = ... | 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:5 | ... = ... | scopes.rb:27:1:27:1 | x | scopes.rb:31:10:31:10 | x | scopes.rb:34:7:34:7 | x | diff --git a/ql/test/library-tests/variables/varaccess.expected b/ql/test/library-tests/variables/varaccess.expected index 5202aa3754c..596bd750fea 100644 --- a/ql/test/library-tests/variables/varaccess.expected +++ b/ql/test/library-tests/variables/varaccess.expected @@ -51,18 +51,18 @@ variableAccess | parameters.rb:3:9:3:9 | x | parameters.rb:1:14:1:14 | x | parameters.rb:1:9:5:3 | block scope | | parameters.rb:4:9:4:9 | y | parameters.rb:1:18:1:18 | y | parameters.rb:1:9:5:3 | block scope | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope for order_pizza | -| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope for order_pizza | +| parameters.rb:7:25:7:31 | *pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope for order_pizza | | parameters.rb:8:6:8:11 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope for order_pizza | | parameters.rb:9:25:9:30 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope for order_pizza | | parameters.rb:11:14:11:19 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope for order_pizza | | parameters.rb:11:41:11:46 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope for order_pizza | -| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | parameters.rb:15:1:19:3 | method scope for print_map | +| parameters.rb:15:15:15:19 | **map | parameters.rb:15:17:15:19 | map | parameters.rb:15:1:19:3 | method scope for print_map | | parameters.rb:16:3:16:5 | map | parameters.rb:15:17:15:19 | map | parameters.rb:15:1:19:3 | method scope for print_map | | parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope | | parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope | | parameters.rb:17:13:17:15 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope | | parameters.rb:17:22:17:26 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope | -| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | parameters.rb:21:1:23:3 | method scope for call_block | +| parameters.rb:21:16:21:21 | &block | parameters.rb:21:17:21:21 | block | parameters.rb:21:1:23:3 | method scope for call_block | | parameters.rb:22:3:22:7 | block | parameters.rb:21:17:21:21 | block | parameters.rb:21:1:23:3 | method scope for call_block | | parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:1:28:3 | method scope for opt_param | | parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | parameters.rb:25:1:28:3 | method scope for opt_param | @@ -228,11 +228,11 @@ implicitWrite | parameters.rb:1:14:1:14 | x | | parameters.rb:1:18:1:18 | y | | parameters.rb:7:17:7:22 | client | -| parameters.rb:7:26:7:31 | pizzas | -| parameters.rb:15:17:15:19 | map | +| parameters.rb:7:25:7:31 | *pizzas | +| parameters.rb:15:15:15:19 | **map | | parameters.rb:16:16:16:18 | key | | parameters.rb:16:21:16:25 | value | -| parameters.rb:21:17:21:21 | block | +| parameters.rb:21:16:21:21 | &block | | parameters.rb:25:15:25:18 | name | | parameters.rb:25:33:25:36 | size | | parameters.rb:30:15:30:19 | first | From 1a73cf6cc4c68f163ace0937ad8d4f35e97d2abb Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Wed, 24 Feb 2021 15:22:02 +0100 Subject: [PATCH 06/10] AST: add ArgumentList --- ql/src/codeql_ruby/ast/Expr.qll | 17 ++++++++++++++ ql/src/codeql_ruby/ast/internal/Expr.qll | 30 ++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/ql/src/codeql_ruby/ast/Expr.qll b/ql/src/codeql_ruby/ast/Expr.qll index 7b6537e8166..dedcf04de4e 100644 --- a/ql/src/codeql_ruby/ast/Expr.qll +++ b/ql/src/codeql_ruby/ast/Expr.qll @@ -24,6 +24,23 @@ class Self extends Expr, @token_self { final override string getAPrimaryQlClass() { result = "Self" } } +/** + * A sequence of expressions in the right-hand side of an assignment or + * a `return`, `break` or `next` statement. + * ```rb + * x = 1, *items, 3, *more + * return 1, 2 + * next *list + * break **map + * return 1, 2, *items, k: 5, **map + * ``` + */ +class ArgumentList extends Expr { + override ArgumentList::Range range; + + override string getAPrimaryQlClass() { result = "ArgumentList" } +} + /** A sequence of expressions. */ class StmtSequence extends Expr { override StmtSequence::Range range; diff --git a/ql/src/codeql_ruby/ast/internal/Expr.qll b/ql/src/codeql_ruby/ast/internal/Expr.qll index 337589a5653..194ba71971b 100644 --- a/ql/src/codeql_ruby/ast/internal/Expr.qll +++ b/ql/src/codeql_ruby/ast/internal/Expr.qll @@ -16,6 +16,36 @@ module Self { } } +module ArgumentList { + private class ValidParent = @break or @return or @next or @assignment or @operator_assignment; + + abstract class Range extends Expr::Range { + Range() { generated.getParent() instanceof ValidParent } + + abstract Expr getElement(int i); + + final override string toString() { result = "..., ..." } + + override predicate child(string label, AstNode::Range child) { + label = "getElement" and child = getElement(_) + } + } + + private class ArgArgumentList extends ArgumentList::Range, @argument_list { + final override Generated::ArgumentList generated; + + ArgArgumentList() { count(generated.getChild(_)) != 1 } + + final override Expr getElement(int i) { result = generated.getChild(i) } + } + + private class AssignmentList extends ArgumentList::Range, @right_assignment_list { + final override Generated::RightAssignmentList generated; + + final override Expr getElement(int i) { result = generated.getChild(i) } + } +} + module StmtSequence { abstract class Range extends Expr::Range { abstract Stmt getStmt(int n); From 0f940349ba460d43195d80559aa2adac2e12c5b7 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 25 Feb 2021 10:11:29 +0100 Subject: [PATCH 07/10] AST: rename getExpr predicates to more meaningful names --- ql/src/codeql_ruby/ast/Call.qll | 6 +++--- ql/src/codeql_ruby/ast/Control.qll | 4 ++-- ql/src/codeql_ruby/ast/internal/Call.qll | 12 ++++++------ ql/src/codeql_ruby/ast/internal/Control.qll | 12 ++++++------ ql/test/library-tests/ast/calls/arguments.ql | 6 +++--- ql/test/library-tests/ast/control/ConditionalExpr.ql | 4 ++-- 6 files changed, 22 insertions(+), 22 deletions(-) diff --git a/ql/src/codeql_ruby/ast/Call.qll b/ql/src/codeql_ruby/ast/Call.qll index 2e6ff94aa0b..c7a73c1fa7e 100644 --- a/ql/src/codeql_ruby/ast/Call.qll +++ b/ql/src/codeql_ruby/ast/Call.qll @@ -164,7 +164,7 @@ class BlockArgument extends Expr, @block_argument { * foo(&bar) * ``` */ - final Expr getExpr() { result = range.getExpr() } + final Expr getValue() { result = range.getValue() } } /** @@ -185,7 +185,7 @@ class SplatArgument extends Expr, @splat_argument { * foo(*bar) * ``` */ - final Expr getExpr() { result = range.getExpr() } + final Expr getValue() { result = range.getValue() } } /** @@ -206,5 +206,5 @@ class HashSplatArgument extends Expr, @hash_splat_argument { * foo(**bar) * ``` */ - final Expr getExpr() { result = range.getExpr() } + final Expr getValue() { result = range.getValue() } } diff --git a/ql/src/codeql_ruby/ast/Control.qll b/ql/src/codeql_ruby/ast/Control.qll index e9ff5675778..36893065fd5 100644 --- a/ql/src/codeql_ruby/ast/Control.qll +++ b/ql/src/codeql_ruby/ast/Control.qll @@ -151,7 +151,7 @@ class IfModifierExpr extends ConditionalExpr, @if_modifier { * foo if bar * ``` */ - final Stmt getExpr() { result = range.getExpr() } + final Stmt getBody() { result = range.getBody() } } /** @@ -172,7 +172,7 @@ class UnlessModifierExpr extends ConditionalExpr, @unless_modifier { * foo unless bar * ``` */ - final Stmt getExpr() { result = range.getExpr() } + final Stmt getBody() { result = range.getBody() } } /** diff --git a/ql/src/codeql_ruby/ast/internal/Call.qll b/ql/src/codeql_ruby/ast/internal/Call.qll index a7d16a96900..697b57653e9 100644 --- a/ql/src/codeql_ruby/ast/internal/Call.qll +++ b/ql/src/codeql_ruby/ast/internal/Call.qll @@ -223,12 +223,12 @@ module BlockArgument { class Range extends Expr::Range, @block_argument { final override Generated::BlockArgument generated; - final Expr getExpr() { result = generated.getChild() } + final Expr getValue() { result = generated.getChild() } final override string toString() { result = "&..." } final override predicate child(string label, AstNode::Range child) { - label = "getExpr" and child = getExpr() + label = "getValue" and child = getValue() } } } @@ -237,12 +237,12 @@ module SplatArgument { class Range extends Expr::Range, @splat_argument { final override Generated::SplatArgument generated; - final Expr getExpr() { result = generated.getChild() } + final Expr getValue() { result = generated.getChild() } final override string toString() { result = "*..." } final override predicate child(string label, AstNode::Range child) { - label = "getExpr" and child = getExpr() + label = "getValue" and child = getValue() } } } @@ -251,12 +251,12 @@ module HashSplatArgument { class Range extends Expr::Range, @hash_splat_argument { final override Generated::HashSplatArgument generated; - final Expr getExpr() { result = generated.getChild() } + final Expr getValue() { result = generated.getChild() } final override string toString() { result = "**..." } final override predicate child(string label, AstNode::Range child) { - label = "getExpr" and child = getExpr() + label = "getValue" and child = getValue() } } } diff --git a/ql/src/codeql_ruby/ast/internal/Control.qll b/ql/src/codeql_ruby/ast/internal/Control.qll index adc3d4ea982..3f034ce20b3 100644 --- a/ql/src/codeql_ruby/ast/internal/Control.qll +++ b/ql/src/codeql_ruby/ast/internal/Control.qll @@ -108,16 +108,16 @@ module IfModifierExpr { final override Expr getCondition() { result = generated.getCondition() } - final Stmt getExpr() { result = generated.getBody() } + final Stmt getBody() { result = generated.getBody() } - final override Stmt getBranch(boolean cond) { cond = true and result = getExpr() } + final override Stmt getBranch(boolean cond) { cond = true and result = getBody() } final override string toString() { result = "... if ..." } override predicate child(string label, AstNode::Range child) { ConditionalExpr::Range.super.child(label, child) or - label = "getExpr" and child = getExpr() + label = "getBody" and child = getBody() } } } @@ -128,16 +128,16 @@ module UnlessModifierExpr { final override Expr getCondition() { result = generated.getCondition() } - final Stmt getExpr() { result = generated.getBody() } + final Stmt getBody() { result = generated.getBody() } - final override Stmt getBranch(boolean cond) { cond = false and result = getExpr() } + final override Stmt getBranch(boolean cond) { cond = false and result = getBody() } final override string toString() { result = "... unless ..." } override predicate child(string label, AstNode::Range child) { ConditionalExpr::Range.super.child(label, child) or - label = "getExpr" and child = getExpr() + label = "getBody" and child = getBody() } } } diff --git a/ql/test/library-tests/ast/calls/arguments.ql b/ql/test/library-tests/ast/calls/arguments.ql index c4086e496ec..80266b3159d 100644 --- a/ql/test/library-tests/ast/calls/arguments.ql +++ b/ql/test/library-tests/ast/calls/arguments.ql @@ -1,10 +1,10 @@ import ruby -query predicate blockArguments(BlockArgument a, Expr e) { e = a.getExpr() } +query predicate blockArguments(BlockArgument a, Expr e) { e = a.getValue() } -query predicate splatArguments(SplatArgument a, Expr e) { e = a.getExpr() } +query predicate splatArguments(SplatArgument a, Expr e) { e = a.getValue() } -query predicate hashSplatArguments(HashSplatArgument a, Expr e) { e = a.getExpr() } +query predicate hashSplatArguments(HashSplatArgument a, Expr e) { e = a.getValue() } query predicate keywordArguments(Pair a, Expr key, Expr value) { exists(Call c | c.getAnArgument() = a and key = a.getKey() and value = a.getValue()) diff --git a/ql/test/library-tests/ast/control/ConditionalExpr.ql b/ql/test/library-tests/ast/control/ConditionalExpr.ql index 6e209b2d3fc..bd0e5fbe623 100644 --- a/ql/test/library-tests/ast/control/ConditionalExpr.ql +++ b/ql/test/library-tests/ast/control/ConditionalExpr.ql @@ -30,13 +30,13 @@ query predicate unlessExprs( query predicate ifModifierExprs(IfModifierExpr e, string pClass, Expr cond, Expr expr) { pClass = e.getAPrimaryQlClass() and cond = e.getCondition() and - expr = e.getExpr() + expr = e.getBody() } query predicate unlessModifierExprs(UnlessModifierExpr e, string pClass, Expr cond, Expr expr) { pClass = e.getAPrimaryQlClass() and cond = e.getCondition() and - expr = e.getExpr() + expr = e.getBody() } query predicate ternaryIfExprs( From 4ba0f3088aebdd5589ac796f908db33e75cf9295 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 25 Feb 2021 10:21:07 +0100 Subject: [PATCH 08/10] Use strictcount --- ql/src/codeql_ruby/ast/internal/Expr.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ql/src/codeql_ruby/ast/internal/Expr.qll b/ql/src/codeql_ruby/ast/internal/Expr.qll index 194ba71971b..f2014dcdd54 100644 --- a/ql/src/codeql_ruby/ast/internal/Expr.qll +++ b/ql/src/codeql_ruby/ast/internal/Expr.qll @@ -34,7 +34,7 @@ module ArgumentList { private class ArgArgumentList extends ArgumentList::Range, @argument_list { final override Generated::ArgumentList generated; - ArgArgumentList() { count(generated.getChild(_)) != 1 } + ArgArgumentList() { strictcount(generated.getChild(_)) > 1 } final override Expr getElement(int i) { result = generated.getChild(i) } } From 87b2c142bc34a602121f47939463289971e569f4 Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 25 Feb 2021 10:23:29 +0100 Subject: [PATCH 09/10] Update qldoc --- ql/src/codeql_ruby/ast/Control.qll | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ql/src/codeql_ruby/ast/Control.qll b/ql/src/codeql_ruby/ast/Control.qll index 36893065fd5..b8cf8144b2e 100644 --- a/ql/src/codeql_ruby/ast/Control.qll +++ b/ql/src/codeql_ruby/ast/Control.qll @@ -145,7 +145,7 @@ class IfModifierExpr extends ConditionalExpr, @if_modifier { final override string getAPrimaryQlClass() { result = "IfModifierExpr" } /** - * Gets the expression that is conditionally evaluated. In the following + * Gets the statement that is conditionally evaluated. In the following * example, the result is the `Expr` for `foo`. * ```rb * foo if bar @@ -166,7 +166,7 @@ class UnlessModifierExpr extends ConditionalExpr, @unless_modifier { final override string getAPrimaryQlClass() { result = "UnlessModifierExpr" } /** - * Gets the expression that is conditionally evaluated. In the following + * Gets the statement that is conditionally evaluated. In the following * example, the result is the `Expr` for `foo`. * ```rb * foo unless bar From 27a23108406ab517118c90296be3cf0b86e3dc3f Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 25 Feb 2021 12:23:07 +0100 Subject: [PATCH 10/10] CFG: sort expected output by file path and line --- .../codeql_ruby/controlflow/internal/Cfg.ql | 15 +- .../controlflow/graph/Cfg.expected | 932 +++++++++--------- 2 files changed, 468 insertions(+), 479 deletions(-) diff --git a/ql/src/codeql_ruby/controlflow/internal/Cfg.ql b/ql/src/codeql_ruby/controlflow/internal/Cfg.ql index cf92f1d94e3..ef06ba17a97 100644 --- a/ql/src/codeql_ruby/controlflow/internal/Cfg.ql +++ b/ql/src/codeql_ruby/controlflow/internal/Cfg.ql @@ -4,7 +4,20 @@ import codeql_ruby.CFG -query predicate nodes(CfgNode n) { any() } +query predicate nodes(CfgNode n, string attr, string val) { + attr = "semmle.order" and + val = + any(int i | + n = + rank[i](CfgNode p | + | + p + order by + p.getLocation().getFile().getBaseName(), p.getLocation().getFile().getAbsolutePath(), + p.getLocation().getStartLine() + ) + ).toString() +} query predicate edges(CfgNode pred, CfgNode succ, string attr, string val) { exists(SuccessorType t | succ = pred.getASuccessor(t) | diff --git a/ql/test/library-tests/controlflow/graph/Cfg.expected b/ql/test/library-tests/controlflow/graph/Cfg.expected index 7c43e1211e5..3a7801e77e9 100644 --- a/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -5,179 +5,22 @@ break_ensure.rb: # 1| enter m1 #-----| -> elements -# 13| enter m2 -#-----| -> elements - -# 27| enter m3 -#-----| -> elements - -# 44| enter m4 -#-----| -> elements - -case.rb: -# 1| enter case.rb -#-----| -> if_in_case - -# 1| enter if_in_case -#-----| -> case ... - -cfg.rb: -# 1| enter cfg.rb -#-----| -> bar - -# 15| enter BEGIN { ... } -#-----| -> "hello" - -# 19| enter END { ... } -#-----| -> "world" - -# 25| enter { ... } -#-----| -> x - -# 29| enter { ... } -#-----| -> &x - -# 63| enter pattern -#-----| -> a - -# 69| enter print -#-----| -> "silly" - -# 101| enter parameters -#-----| -> value - -# 120| enter -> { ... } -#-----| -> x - -# 142| enter print -#-----| -> "singleton" - -# 149| enter method -#-----| -> *x - -# 153| enter two_parameters -#-----| -> a - -# 187| enter run_block -#-----| -> yield ... - -# 191| enter { ... } -#-----| -> x - -exit.rb: -# 1| enter exit.rb -#-----| -> m1 - -# 1| enter m1 -#-----| -> x - -# 8| enter m2 -#-----| -> x - -heredoc.rb: -# 1| enter heredoc.rb -#-----| -> double_heredoc - -# 1| enter double_heredoc -#-----| -> < m1 - -# 1| enter m1 -#-----| -> x - -# 11| enter m2 -#-----| -> b - -# 18| enter m3 -#-----| -> x - -# 28| enter m4 -#-----| -> b1 - -# 32| enter m5 -#-----| -> b1 - -# 36| enter conditional_method_def -#-----| -> "bla" - -# 40| enter constant_condition -#-----| -> true - -loops.rb: -# 1| enter loops.rb -#-----| -> m1 - -# 1| enter m1 -#-----| -> x - -# 8| enter m2 -#-----| -> x - -# 24| enter m3 -#-----| -> 1 - -# 25| enter do ... end -#-----| -> x - -raise.rb: -# 1| enter raise.rb -#-----| -> ExceptionA - -# 7| enter m1 -#-----| -> x - -# 14| enter m2 -#-----| -> b - -# 25| enter m3 -#-----| -> b - -# 36| enter m4 -#-----| -> b - -# 47| enter m5 -#-----| -> b - -# 57| enter m6 -#-----| -> b - -# 68| enter m7 -#-----| -> x - -# 79| enter m8 -#-----| -> x - -# 94| enter m9 -#-----| -> x - -# 121| enter m10 -#-----| -> p - -# 128| enter m11 -#-----| -> b - -# 142| enter m12 -#-----| -> b - -# 150| enter m13 -#-----| -> ensure ... - -# 154| enter m14 -#-----| -> element - -# 155| enter { ... } -#-----| -> elem - -break_ensure.rb: # 1| m1 #-----| -> m2 # 1| elements #-----| -> elements +# 1| exit break_ensure.rb + +# 1| exit m1 + +# 1| exit break_ensure.rb (normal) +#-----| -> exit break_ensure.rb + +# 1| exit m1 (normal) +#-----| -> exit m1 + # 2| for ... in ... #-----| -> ensure ... @@ -226,12 +69,20 @@ break_ensure.rb: # 9| "elements nil" #-----| -> call to puts +# 13| enter m2 +#-----| -> elements + # 13| m2 #-----| -> m3 # 13| elements #-----| -> elements +# 13| exit m2 + +# 13| exit m2 (normal) +#-----| -> exit m2 + # 14| for ... in ... #-----| -> exit m2 (normal) @@ -299,12 +150,20 @@ break_ensure.rb: # 21| [ensure: break] "elements nil" #-----| -> [ensure: break] call to puts +# 27| enter m3 +#-----| -> elements + # 27| m3 #-----| -> m4 # 27| elements #-----| -> elements +# 27| exit m3 + +# 27| exit m3 (normal) +#-----| -> exit m3 + # 29| if ... #-----| -> ensure ... @@ -388,12 +247,20 @@ break_ensure.rb: # 41| "Done" #-----| -> call to puts +# 44| enter m4 +#-----| -> elements + # 44| m4 #-----| -> exit break_ensure.rb (normal) # 44| elements #-----| -> elements +# 44| exit m4 + +# 44| exit m4 (normal) +#-----| -> exit m4 + # 45| for ... in ... #-----| -> exit m4 (normal) @@ -471,9 +338,25 @@ break_ensure.rb: #-----| -> [ensure: raise] break case.rb: +# 1| enter case.rb +#-----| -> if_in_case + +# 1| enter if_in_case +#-----| -> case ... + # 1| if_in_case #-----| -> exit case.rb (normal) +# 1| exit case.rb + +# 1| exit if_in_case + +# 1| exit case.rb (normal) +#-----| -> exit case.rb + +# 1| exit if_in_case (normal) +#-----| -> exit if_in_case + # 2| case ... #-----| -> call to x1 @@ -517,9 +400,17 @@ case.rb: #-----| -> call to puts cfg.rb: +# 1| enter cfg.rb +#-----| -> bar + # 1| bar #-----| -> alias ... +# 1| exit cfg.rb + +# 1| exit cfg.rb (normal) +#-----| -> exit cfg.rb + # 3| alias ... #-----| -> foo @@ -574,18 +465,34 @@ cfg.rb: # 12| 4 #-----| -> call to puts +# 15| enter BEGIN { ... } +#-----| -> "hello" + # 15| BEGIN { ... } #-----| -> END { ... } +# 15| exit BEGIN { ... } + +# 15| exit BEGIN { ... } (normal) +#-----| -> exit BEGIN { ... } + # 16| call to puts #-----| -> exit BEGIN { ... } (normal) # 16| "hello" #-----| -> call to puts +# 19| enter END { ... } +#-----| -> "world" + # 19| END { ... } #-----| -> 41 +# 19| exit END { ... } + +# 19| exit END { ... } (normal) +#-----| -> exit END { ... } + # 20| call to puts #-----| -> exit END { ... } (normal) @@ -601,6 +508,9 @@ cfg.rb: # 23| 1 #-----| -> ... + ... +# 25| enter { ... } +#-----| -> x + # 25| call to times #-----| -> :puts @@ -619,6 +529,11 @@ cfg.rb: # 25| x #-----| -> call to puts +# 25| exit { ... } + +# 25| exit { ... } (normal) +#-----| -> exit { ... } + # 27| call to puts #-----| -> Proc @@ -628,6 +543,9 @@ cfg.rb: # 27| :puts #-----| -> &... +# 29| enter { ... } +#-----| -> &x + # 29| call to new #-----| -> true @@ -646,6 +564,11 @@ cfg.rb: # 29| x #-----| -> call to call +# 29| exit { ... } + +# 29| exit { ... } (normal) +#-----| -> exit { ... } + # 31| while ... #-----| -> false @@ -885,6 +808,9 @@ cfg.rb: # 62| 3 #-----| -> [...] +# 63| enter pattern +#-----| -> a + # 63| pattern #-----| -> 1 @@ -897,6 +823,11 @@ cfg.rb: # 63| b #-----| -> (..., ...) +# 63| exit pattern + +# 63| exit pattern (normal) +#-----| -> exit pattern + # 64| call to puts #-----| -> b @@ -939,9 +870,17 @@ cfg.rb: # 68| 2 #-----| -> ...[...] +# 69| enter print +#-----| -> "silly" + # 69| print #-----| -> 42 +# 69| exit print + +# 69| exit print (normal) +#-----| -> exit print + # 70| call to puts #-----| -> exit print (normal) @@ -1144,6 +1083,9 @@ cfg.rb: # 98| map1 #-----| -> **... +# 101| enter parameters +#-----| -> value + # 101| parameters #-----| -> "healthy" @@ -1160,6 +1102,11 @@ cfg.rb: # 101| **kwargs #-----| -> value +# 101| exit parameters + +# 101| exit parameters (normal) +#-----| -> exit parameters + # 102| call to puts #-----| -> kwargs @@ -1260,6 +1207,9 @@ cfg.rb: # 117| 10 #-----| -> @@static_field +# 120| enter -> { ... } +#-----| -> x + # 120| ... = ... #-----| -> M @@ -1287,6 +1237,11 @@ cfg.rb: # 120| x #-----| -> [...] +# 120| exit -> { ... } + +# 120| exit -> { ... } (normal) +#-----| -> exit -> { ... } + # 122| M #-----| -> M @@ -1477,9 +1432,17 @@ cfg.rb: # 141| setter= #-----| -> print +# 142| enter print +#-----| -> "singleton" + # 142| print #-----| -> Silly +# 142| exit print + +# 142| exit print (normal) +#-----| -> exit print + # 143| call to puts #-----| -> call to super @@ -1507,6 +1470,9 @@ cfg.rb: # 148| Silly #-----| -> call to new +# 149| enter method +#-----| -> *x + # 149| method #-----| -> two_parameters @@ -1516,12 +1482,20 @@ cfg.rb: # 149| *x #-----| -> x +# 149| exit method + +# 149| exit method (normal) +#-----| -> exit method + # 150| call to puts #-----| -> exit method (normal) # 150| x #-----| -> call to puts +# 153| enter two_parameters +#-----| -> a + # 153| two_parameters #-----| -> 1 @@ -1531,6 +1505,11 @@ cfg.rb: # 153| b #-----| -> exit two_parameters (normal) +# 153| exit two_parameters + +# 153| exit two_parameters (normal) +#-----| -> exit two_parameters + # 155| call to two_parameters #-----| -> call to __FILE__ @@ -1826,6 +1805,9 @@ cfg.rb: # 185| 0 #-----| -> ... != ... +# 187| enter run_block +#-----| -> yield ... + # 187| run_block #-----| -> { ... } @@ -1834,6 +1816,9 @@ cfg.rb: # 188| 42 +# 191| enter { ... } +#-----| -> x + # 191| call to run_block #-----| -> exit cfg.rb (normal) @@ -1849,13 +1834,37 @@ cfg.rb: # 191| x #-----| -> call to puts +# 191| exit { ... } + +# 191| exit { ... } (normal) +#-----| -> exit { ... } + exit.rb: +# 1| enter exit.rb +#-----| -> m1 + +# 1| enter m1 +#-----| -> x + # 1| m1 #-----| -> m2 # 1| x #-----| -> x +# 1| exit exit.rb + +# 1| exit m1 + +# 1| exit exit.rb (normal) +#-----| -> exit exit.rb + +# 1| exit m1 (abnormal) +#-----| -> exit m1 + +# 1| exit m1 (normal) +#-----| -> exit m1 + # 2| if ... #-----| -> "x <= 2" @@ -1881,12 +1890,23 @@ exit.rb: # 5| "x <= 2" #-----| -> call to puts +# 8| enter m2 +#-----| -> x + # 8| m2 #-----| -> exit exit.rb (normal) # 8| x #-----| -> x +# 8| exit m2 + +# 8| exit m2 (abnormal) +#-----| -> exit m2 + +# 8| exit m2 (normal) +#-----| -> exit m2 + # 9| if ... #-----| -> "x <= 2" @@ -1913,9 +1933,25 @@ exit.rb: #-----| -> call to puts heredoc.rb: +# 1| enter heredoc.rb +#-----| -> double_heredoc + +# 1| enter double_heredoc +#-----| -> < exit heredoc.rb (normal) +# 1| exit heredoc.rb + +# 1| exit double_heredoc + +# 1| exit heredoc.rb (normal) +#-----| -> exit heredoc.rb + +# 1| exit double_heredoc (normal) +#-----| -> exit double_heredoc + # 2| call to puts #-----| -> exit double_heredoc (normal) @@ -1926,12 +1962,28 @@ heredoc.rb: #-----| -> call to puts ifs.rb: +# 1| enter ifs.rb +#-----| -> m1 + +# 1| enter m1 +#-----| -> x + # 1| m1 #-----| -> m2 # 1| x #-----| -> x +# 1| exit ifs.rb + +# 1| exit m1 + +# 1| exit ifs.rb (normal) +#-----| -> exit ifs.rb + +# 1| exit m1 (normal) +#-----| -> exit m1 + # 2| if ... #-----| -> exit m1 (normal) @@ -2020,12 +2072,20 @@ ifs.rb: # 7| "I can't guess the number" #-----| -> call to puts +# 11| enter m2 +#-----| -> b + # 11| m2 #-----| -> m3 # 11| b #-----| -> b +# 11| exit m2 + +# 11| exit m2 (normal) +#-----| -> exit m2 + # 12| if ... #-----| -> 1 @@ -2045,12 +2105,20 @@ ifs.rb: # 15| 1 #-----| -> return +# 18| enter m3 +#-----| -> x + # 18| m3 #-----| -> m4 # 18| x #-----| -> x +# 18| exit m3 + +# 18| exit m3 (normal) +#-----| -> exit m3 + # 19| if ... #-----| -> x @@ -2110,6 +2178,9 @@ ifs.rb: # 25| x #-----| -> call to puts +# 28| enter m4 +#-----| -> b1 + # 28| m4 #-----| -> m5 @@ -2122,6 +2193,11 @@ ifs.rb: # 28| b3 #-----| -> b1 +# 28| exit m4 + +# 28| exit m4 (normal) +#-----| -> exit m4 + # 29| return #-----| return -> exit m4 (normal) @@ -2158,6 +2234,9 @@ ifs.rb: # 29| "!b2 || !b3" #-----| -> ... ? ... : ... +# 32| enter m5 +#-----| -> b1 + # 32| m5 #-----| -> 1 @@ -2176,6 +2255,11 @@ ifs.rb: # 32| b5 #-----| -> b1 +# 32| exit m5 + +# 32| exit m5 (normal) +#-----| -> exit m5 + # 33| if ... #-----| -> exit m5 (normal) @@ -2223,12 +2307,20 @@ ifs.rb: # 33| "!b2 || !b4 || !b5" #-----| -> if ... +# 36| enter conditional_method_def +#-----| -> "bla" + # 36| ... unless ... #-----| -> constant_condition # 36| conditional_method_def #-----| -> ... unless ... +# 36| exit conditional_method_def + +# 36| exit conditional_method_def (normal) +#-----| -> exit conditional_method_def + # 37| call to puts #-----| -> exit conditional_method_def (normal) @@ -2245,9 +2337,17 @@ ifs.rb: # 38| 2 #-----| -> ... == ... +# 40| enter constant_condition +#-----| -> true + # 40| constant_condition #-----| -> exit ifs.rb (normal) +# 40| exit constant_condition + +# 40| exit constant_condition (normal) +#-----| -> exit constant_condition + # 41| if ... #-----| -> exit constant_condition (normal) @@ -2258,12 +2358,28 @@ ifs.rb: #-----| true -> [false] ! ... loops.rb: +# 1| enter loops.rb +#-----| -> m1 + +# 1| enter m1 +#-----| -> x + # 1| m1 #-----| -> m2 # 1| x #-----| -> x +# 1| exit loops.rb + +# 1| exit m1 + +# 1| exit loops.rb (normal) +#-----| -> exit loops.rb + +# 1| exit m1 (normal) +#-----| -> exit m1 + # 2| while ... #-----| -> exit m1 (normal) @@ -2292,12 +2408,20 @@ loops.rb: # 4| 1 #-----| -> ... -= ... +# 8| enter m2 +#-----| -> x + # 8| m2 #-----| -> m3 # 8| x #-----| -> x +# 8| exit m2 + +# 8| exit m2 (normal) +#-----| -> exit m2 + # 9| while ... #-----| -> "Done" @@ -2386,9 +2510,20 @@ loops.rb: # 21| "Done" #-----| -> call to puts +# 24| enter m3 +#-----| -> 1 + # 24| m3 #-----| -> exit loops.rb (normal) +# 24| exit m3 + +# 24| exit m3 (normal) +#-----| -> exit m3 + +# 25| enter do ... end +#-----| -> x + # 25| call to each #-----| -> exit m3 (normal) @@ -2410,6 +2545,11 @@ loops.rb: # 25| x #-----| -> x +# 25| exit do ... end + +# 25| exit do ... end (normal) +#-----| -> exit do ... end + # 26| call to puts #-----| -> exit do ... end (normal) @@ -2417,6 +2557,9 @@ loops.rb: #-----| -> call to puts raise.rb: +# 1| enter raise.rb +#-----| -> ExceptionA + # 1| ExceptionA #-----| -> ExceptionA @@ -2426,6 +2569,11 @@ raise.rb: # 1| Exception #-----| -> ExceptionB +# 1| exit raise.rb + +# 1| exit raise.rb (normal) +#-----| -> exit raise.rb + # 4| ExceptionB #-----| -> ExceptionB @@ -2435,12 +2583,23 @@ raise.rb: # 4| Exception #-----| -> m1 +# 7| enter m1 +#-----| -> x + # 7| m1 #-----| -> m2 # 7| x #-----| -> x +# 7| exit m1 + +# 7| exit m1 (abnormal) +#-----| -> exit m1 + +# 7| exit m1 (normal) +#-----| -> exit m1 + # 8| if ... #-----| -> "x <= 2" @@ -2466,12 +2625,23 @@ raise.rb: # 11| "x <= 2" #-----| -> call to puts +# 14| enter m2 +#-----| -> b + # 14| m2 #-----| -> m3 # 14| b #-----| -> b +# 14| exit m2 + +# 14| exit m2 (abnormal) +#-----| -> exit m2 + +# 14| exit m2 (normal) +#-----| -> exit m2 + # 16| if ... #-----| -> "End m2" @@ -2504,12 +2674,20 @@ raise.rb: # 22| "End m2" #-----| -> call to puts +# 25| enter m3 +#-----| -> b + # 25| m3 #-----| -> m4 # 25| b #-----| -> b +# 25| exit m3 + +# 25| exit m3 (normal) +#-----| -> exit m3 + # 27| if ... #-----| -> "End m3" @@ -2538,12 +2716,20 @@ raise.rb: # 33| "End m3" #-----| -> call to puts +# 36| enter m4 +#-----| -> b + # 36| m4 #-----| -> m5 # 36| b #-----| -> b +# 36| exit m4 + +# 36| exit m4 (normal) +#-----| -> exit m4 + # 38| if ... #-----| -> "End m4" @@ -2575,12 +2761,20 @@ raise.rb: # 44| "End m4" #-----| -> call to puts +# 47| enter m5 +#-----| -> b + # 47| m5 #-----| -> m6 # 47| b #-----| -> b +# 47| exit m5 + +# 47| exit m5 (normal) +#-----| -> exit m5 + # 49| if ... #-----| -> "End m5" @@ -2606,12 +2800,23 @@ raise.rb: # 54| "End m5" #-----| -> call to puts +# 57| enter m6 +#-----| -> b + # 57| m6 #-----| -> m7 # 57| b #-----| -> b +# 57| exit m6 + +# 57| exit m6 (abnormal) +#-----| -> exit m6 + +# 57| exit m6 (normal) +#-----| -> exit m6 + # 59| if ... #-----| -> "End m6" @@ -2651,12 +2856,23 @@ raise.rb: # 65| "End m6" #-----| -> call to puts +# 68| enter m7 +#-----| -> x + # 68| m7 #-----| -> m8 # 68| x #-----| -> x +# 68| exit m7 + +# 68| exit m7 (abnormal) +#-----| -> exit m7 + +# 68| exit m7 (normal) +#-----| -> exit m7 + # 69| if ... #-----| -> "0 <= x <= 2" @@ -2728,12 +2944,23 @@ raise.rb: # 76| [ensure: raise] "ensure" #-----| -> [ensure: raise] call to puts +# 79| enter m8 +#-----| -> x + # 79| m8 #-----| -> m9 # 79| x #-----| -> "Begin m8" +# 79| exit m8 + +# 79| exit m8 (abnormal) +#-----| -> exit m8 + +# 79| exit m8 (normal) +#-----| -> exit m8 + # 80| call to puts #-----| -> x @@ -2817,6 +3044,9 @@ raise.rb: # 91| "End m8" #-----| -> call to puts +# 94| enter m9 +#-----| -> x + # 94| m9 #-----| -> m10 @@ -2829,6 +3059,14 @@ raise.rb: # 94| b2 #-----| -> "Begin m9" +# 94| exit m9 + +# 94| exit m9 (abnormal) +#-----| -> exit m9 + +# 94| exit m9 (normal) +#-----| -> exit m9 + # 95| call to puts #-----| -> x @@ -3071,6 +3309,9 @@ raise.rb: # 117| [ensure: raise] "b2 is true" #-----| -> [ensure: raise] call to raise +# 121| enter m10 +#-----| -> p + # 121| m10 #-----| -> m11 @@ -3084,6 +3325,14 @@ raise.rb: # 121| "Exception" #-----| -> call to raise +# 121| exit m10 + +# 121| exit m10 (abnormal) +#-----| -> exit m10 + +# 121| exit m10 (normal) +#-----| -> exit m10 + # 124| ensure ... #-----| -> "Will not get executed if p is..." @@ -3093,12 +3342,23 @@ raise.rb: # 125| "Will not get executed if p is..." #-----| -> call to puts +# 128| enter m11 +#-----| -> b + # 128| m11 #-----| -> m12 # 128| b #-----| -> b +# 128| exit m11 + +# 128| exit m11 (abnormal) +#-----| -> exit m11 + +# 128| exit m11 (normal) +#-----| -> exit m11 + # 130| if ... #-----| -> ensure ... @@ -3156,12 +3416,20 @@ raise.rb: # 139| "End m11" #-----| -> call to puts +# 142| enter m12 +#-----| -> b + # 142| m12 #-----| -> m13 # 142| b #-----| -> b +# 142| exit m12 + +# 142| exit m12 (normal) +#-----| -> exit m12 + # 143| if ... #-----| -> ensure ... @@ -3193,18 +3461,37 @@ raise.rb: # 147| [ensure: raise] 3 #-----| -> [ensure: raise] return +# 150| enter m13 +#-----| -> ensure ... + # 150| m13 #-----| -> m14 +# 150| exit m13 + +# 150| exit m13 (normal) +#-----| -> exit m13 + # 151| ensure ... #-----| -> exit m13 (normal) +# 154| enter m14 +#-----| -> element + # 154| m14 #-----| -> exit raise.rb (normal) # 154| element #-----| -> element +# 154| exit m14 + +# 154| exit m14 (normal) +#-----| -> exit m14 + +# 155| enter { ... } +#-----| -> elem + # 155| call to each #-----| -> exit m14 (normal) @@ -3233,319 +3520,8 @@ raise.rb: # 155| element #-----| -> call to nil? -break_ensure.rb: -# 1| exit break_ensure.rb - -# 1| exit m1 - -# 13| exit m2 - -# 27| exit m3 - -# 44| exit m4 - -case.rb: -# 1| exit case.rb - -# 1| exit if_in_case - -cfg.rb: -# 1| exit cfg.rb - -# 15| exit BEGIN { ... } - -# 19| exit END { ... } - -# 25| exit { ... } - -# 29| exit { ... } - -# 63| exit pattern - -# 69| exit print - -# 101| exit parameters - -# 120| exit -> { ... } - -# 142| exit print - -# 149| exit method - -# 153| exit two_parameters - -# 191| exit { ... } - -exit.rb: -# 1| exit exit.rb - -# 1| exit m1 - -# 8| exit m2 - -heredoc.rb: -# 1| exit heredoc.rb - -# 1| exit double_heredoc - -ifs.rb: -# 1| exit ifs.rb - -# 1| exit m1 - -# 11| exit m2 - -# 18| exit m3 - -# 28| exit m4 - -# 32| exit m5 - -# 36| exit conditional_method_def - -# 40| exit constant_condition - -loops.rb: -# 1| exit loops.rb - -# 1| exit m1 - -# 8| exit m2 - -# 24| exit m3 - -# 25| exit do ... end - -raise.rb: -# 1| exit raise.rb - -# 7| exit m1 - -# 14| exit m2 - -# 25| exit m3 - -# 36| exit m4 - -# 47| exit m5 - -# 57| exit m6 - -# 68| exit m7 - -# 79| exit m8 - -# 94| exit m9 - -# 121| exit m10 - -# 128| exit m11 - -# 142| exit m12 - -# 150| exit m13 - -# 154| exit m14 - # 155| exit { ... } -break_ensure.rb: -# 1| exit break_ensure.rb (normal) -#-----| -> exit break_ensure.rb - -# 1| exit m1 (normal) -#-----| -> exit m1 - -# 13| exit m2 (normal) -#-----| -> exit m2 - -# 27| exit m3 (normal) -#-----| -> exit m3 - -# 44| exit m4 (normal) -#-----| -> exit m4 - -case.rb: -# 1| exit case.rb (normal) -#-----| -> exit case.rb - -# 1| exit if_in_case (normal) -#-----| -> exit if_in_case - -cfg.rb: -# 1| exit cfg.rb (normal) -#-----| -> exit cfg.rb - -# 15| exit BEGIN { ... } (normal) -#-----| -> exit BEGIN { ... } - -# 19| exit END { ... } (normal) -#-----| -> exit END { ... } - -# 25| exit { ... } (normal) -#-----| -> exit { ... } - -# 29| exit { ... } (normal) -#-----| -> exit { ... } - -# 63| exit pattern (normal) -#-----| -> exit pattern - -# 69| exit print (normal) -#-----| -> exit print - -# 101| exit parameters (normal) -#-----| -> exit parameters - -# 120| exit -> { ... } (normal) -#-----| -> exit -> { ... } - -# 142| exit print (normal) -#-----| -> exit print - -# 149| exit method (normal) -#-----| -> exit method - -# 153| exit two_parameters (normal) -#-----| -> exit two_parameters - -# 191| exit { ... } (normal) -#-----| -> exit { ... } - -exit.rb: -# 1| exit exit.rb (normal) -#-----| -> exit exit.rb - -# 1| exit m1 (abnormal) -#-----| -> exit m1 - -# 1| exit m1 (normal) -#-----| -> exit m1 - -# 8| exit m2 (abnormal) -#-----| -> exit m2 - -# 8| exit m2 (normal) -#-----| -> exit m2 - -heredoc.rb: -# 1| exit heredoc.rb (normal) -#-----| -> exit heredoc.rb - -# 1| exit double_heredoc (normal) -#-----| -> exit double_heredoc - -ifs.rb: -# 1| exit ifs.rb (normal) -#-----| -> exit ifs.rb - -# 1| exit m1 (normal) -#-----| -> exit m1 - -# 11| exit m2 (normal) -#-----| -> exit m2 - -# 18| exit m3 (normal) -#-----| -> exit m3 - -# 28| exit m4 (normal) -#-----| -> exit m4 - -# 32| exit m5 (normal) -#-----| -> exit m5 - -# 36| exit conditional_method_def (normal) -#-----| -> exit conditional_method_def - -# 40| exit constant_condition (normal) -#-----| -> exit constant_condition - -loops.rb: -# 1| exit loops.rb (normal) -#-----| -> exit loops.rb - -# 1| exit m1 (normal) -#-----| -> exit m1 - -# 8| exit m2 (normal) -#-----| -> exit m2 - -# 24| exit m3 (normal) -#-----| -> exit m3 - -# 25| exit do ... end (normal) -#-----| -> exit do ... end - -raise.rb: -# 1| exit raise.rb (normal) -#-----| -> exit raise.rb - -# 7| exit m1 (abnormal) -#-----| -> exit m1 - -# 7| exit m1 (normal) -#-----| -> exit m1 - -# 14| exit m2 (abnormal) -#-----| -> exit m2 - -# 14| exit m2 (normal) -#-----| -> exit m2 - -# 25| exit m3 (normal) -#-----| -> exit m3 - -# 36| exit m4 (normal) -#-----| -> exit m4 - -# 47| exit m5 (normal) -#-----| -> exit m5 - -# 57| exit m6 (abnormal) -#-----| -> exit m6 - -# 57| exit m6 (normal) -#-----| -> exit m6 - -# 68| exit m7 (abnormal) -#-----| -> exit m7 - -# 68| exit m7 (normal) -#-----| -> exit m7 - -# 79| exit m8 (abnormal) -#-----| -> exit m8 - -# 79| exit m8 (normal) -#-----| -> exit m8 - -# 94| exit m9 (abnormal) -#-----| -> exit m9 - -# 94| exit m9 (normal) -#-----| -> exit m9 - -# 121| exit m10 (abnormal) -#-----| -> exit m10 - -# 121| exit m10 (normal) -#-----| -> exit m10 - -# 128| exit m11 (abnormal) -#-----| -> exit m11 - -# 128| exit m11 (normal) -#-----| -> exit m11 - -# 142| exit m12 (normal) -#-----| -> exit m12 - -# 150| exit m13 (normal) -#-----| -> exit m13 - -# 154| exit m14 (normal) -#-----| -> exit m14 - # 155| exit { ... } (abnormal) #-----| -> exit { ... }