From 2124247d5e9ca73a596e5f305f48ee67141e64ff Mon Sep 17 00:00:00 2001 From: Arthur Baars Date: Thu, 3 Dec 2020 12:48:18 +0100 Subject: [PATCH] CFG: add samples of all syntactical constructs to cfg.rb --- .../controlflow/graph/Cfg.expected | 978 +++++++++++++++++- .../library-tests/controlflow/graph/cfg.rb | 174 +++- 2 files changed, 1111 insertions(+), 41 deletions(-) diff --git a/ql/test/library-tests/controlflow/graph/Cfg.expected b/ql/test/library-tests/controlflow/graph/Cfg.expected index c39bf86ea20..09d11cc5ec8 100644 --- a/ql/test/library-tests/controlflow/graph/Cfg.expected +++ b/ql/test/library-tests/controlflow/graph/Cfg.expected @@ -1,7 +1,5 @@ nodes -| cfg.rb:1:1:22:2 | enter top-level | -| cfg.rb:1:1:22:2 | exit top-level | -| cfg.rb:1:1:22:2 | exit top-level (normal) | +| cfg.rb:1:1:194:1 | enter top-level | | cfg.rb:3:1:3:13 | Alias | | cfg.rb:3:7:3:9 | foo | | cfg.rb:3:11:3:13 | bar | @@ -18,24 +16,470 @@ nodes | cfg.rb:9:7:9:12 | Interpolation | | cfg.rb:9:10:9:10 | b | | cfg.rb:9:14:9:20 | BareString | -| cfg.rb:12:1:14:3 | Begin | -| cfg.rb:13:3:13:6 | puts | -| cfg.rb:13:3:13:8 | MethodCall | -| cfg.rb:13:8:13:8 | 4 | -| cfg.rb:16:1:18:1 | BeginBlock | -| cfg.rb:16:1:18:1 | enter BEGIN block | -| cfg.rb:16:1:18:1 | exit BEGIN block | -| cfg.rb:16:1:18:1 | exit BEGIN block (normal) | -| cfg.rb:17:3:17:6 | puts | -| cfg.rb:17:3:17:14 | MethodCall | -| cfg.rb:17:8:17:14 | String | -| cfg.rb:20:1:22:1 | EndBlock | -| cfg.rb:20:1:22:1 | enter END block | -| cfg.rb:20:1:22:1 | exit END block | -| cfg.rb:20:1:22:1 | exit END block (normal) | -| cfg.rb:21:3:21:6 | puts | -| cfg.rb:21:3:21:14 | MethodCall | -| cfg.rb:21:8:21:14 | String | +| cfg.rb:11:1:13:3 | Begin | +| cfg.rb:12:3:12:6 | puts | +| cfg.rb:12:3:12:8 | MethodCall | +| cfg.rb:12:8:12:8 | 4 | +| cfg.rb:15:1:17:1 | BeginBlock | +| cfg.rb:15:1:17:1 | enter BEGIN block | +| cfg.rb:15:1:17:1 | exit BEGIN block | +| cfg.rb:15:1:17:1 | exit BEGIN block (normal) | +| cfg.rb:16:3:16:6 | puts | +| cfg.rb:16:3:16:14 | MethodCall | +| cfg.rb:16:8:16:14 | String | +| cfg.rb:19:1:21:1 | EndBlock | +| cfg.rb:19:1:21:1 | enter END block | +| cfg.rb:19:1:21:1 | exit END block | +| cfg.rb:19:1:21:1 | exit END block (normal) | +| cfg.rb:20:3:20:6 | puts | +| cfg.rb:20:3:20:14 | MethodCall | +| cfg.rb:20:8:20:14 | String | +| cfg.rb:23:1:23:2 | 41 | +| cfg.rb:23:1:23:6 | Binary | +| cfg.rb:23:6:23:6 | 1 | +| cfg.rb:25:1:25:1 | 2 | +| cfg.rb:25:1:25:7 | Call | +| cfg.rb:25:1:25:22 | MethodCall | +| cfg.rb:25:3:25:7 | times | +| cfg.rb:25:9:25:22 | enter block | +| cfg.rb:25:9:25:22 | exit block | +| cfg.rb:25:9:25:22 | exit block (normal) | +| cfg.rb:25:15:25:18 | puts | +| cfg.rb:25:15:25:20 | MethodCall | +| cfg.rb:25:20:25:20 | x | +| cfg.rb:27:1:27:4 | puts | +| cfg.rb:27:1:27:11 | MethodCall | +| cfg.rb:27:6:27:11 | BlockArgument | +| cfg.rb:27:7:27:11 | Symbol | +| cfg.rb:29:1:29:4 | Proc | +| cfg.rb:29:1:29:8 | Call | +| cfg.rb:29:1:29:24 | MethodCall | +| cfg.rb:29:6:29:8 | new | +| cfg.rb:29:10:29:24 | enter block | +| cfg.rb:29:10:29:24 | exit block | +| cfg.rb:29:10:29:24 | exit block (normal) | +| cfg.rb:29:17:29:17 | x | +| cfg.rb:29:17:29:22 | Call | +| cfg.rb:29:19:29:22 | call | +| cfg.rb:31:1:33:3 | While | +| cfg.rb:31:7:31:10 | true | +| cfg.rb:32:3:32:9 | Break | +| cfg.rb:32:9:32:9 | 1 | +| cfg.rb:35:1:37:3 | If | +| cfg.rb:35:4:35:8 | false | +| cfg.rb:39:1:39:4 | self | +| cfg.rb:39:1:39:9 | Call | +| cfg.rb:39:1:39:12 | MethodCall | +| cfg.rb:39:6:39:9 | puts | +| cfg.rb:39:11:39:12 | 42 | +| cfg.rb:41:1:45:3 | Case | +| cfg.rb:41:6:41:7 | 10 | +| cfg.rb:42:3:42:24 | When | +| cfg.rb:42:8:42:8 | 1 | +| cfg.rb:42:8:42:8 | Pattern | +| cfg.rb:42:15:42:18 | puts | +| cfg.rb:42:15:42:24 | MethodCall | +| cfg.rb:42:20:42:24 | String | +| cfg.rb:43:3:43:31 | When | +| cfg.rb:43:8:43:8 | 2 | +| cfg.rb:43:8:43:8 | Pattern | +| cfg.rb:43:11:43:11 | 3 | +| cfg.rb:43:11:43:11 | Pattern | +| cfg.rb:43:14:43:14 | 4 | +| cfg.rb:43:14:43:14 | Pattern | +| cfg.rb:43:21:43:24 | puts | +| cfg.rb:43:21:43:31 | MethodCall | +| cfg.rb:43:26:43:31 | String | +| cfg.rb:44:8:44:11 | puts | +| cfg.rb:44:8:44:18 | MethodCall | +| cfg.rb:44:13:44:18 | String | +| cfg.rb:47:1:50:3 | Case | +| cfg.rb:48:3:48:29 | When | +| cfg.rb:48:8:48:8 | b | +| cfg.rb:48:8:48:13 | Binary | +| cfg.rb:48:8:48:13 | Pattern | +| cfg.rb:48:13:48:13 | 1 | +| cfg.rb:48:20:48:23 | puts | +| cfg.rb:48:20:48:29 | MethodCall | +| cfg.rb:48:25:48:29 | String | +| cfg.rb:49:3:49:37 | When | +| cfg.rb:49:8:49:8 | b | +| cfg.rb:49:8:49:13 | Binary | +| cfg.rb:49:8:49:13 | Pattern | +| cfg.rb:49:13:49:13 | 0 | +| cfg.rb:49:16:49:16 | b | +| cfg.rb:49:16:49:20 | Binary | +| cfg.rb:49:16:49:20 | Pattern | +| cfg.rb:49:20:49:20 | 1 | +| cfg.rb:49:27:49:30 | puts | +| cfg.rb:49:27:49:37 | MethodCall | +| cfg.rb:49:32:49:37 | String | +| cfg.rb:52:1:52:7 | chained | +| cfg.rb:52:1:52:35 | Assignment | +| cfg.rb:52:11:52:13 | String | +| cfg.rb:52:15:52:26 | String | +| cfg.rb:52:16:52:25 | Interpolation | +| cfg.rb:52:18:52:24 | chained | +| cfg.rb:52:28:52:35 | String | +| cfg.rb:54:1:54:9 | character | +| cfg.rb:54:1:54:17 | Assignment | +| cfg.rb:54:13:54:17 | ?\\x40 | +| cfg.rb:58:1:72:3 | Class | +| cfg.rb:58:13:58:20 | Superclass | +| cfg.rb:58:15:58:20 | Object | +| cfg.rb:59:3:59:9 | complex | +| cfg.rb:59:3:59:17 | Assignment | +| cfg.rb:59:13:59:17 | 10-2i | +| cfg.rb:60:3:60:13 | conditional | +| cfg.rb:60:3:60:40 | Assignment | +| cfg.rb:60:17:60:17 | b | +| cfg.rb:60:17:60:22 | Binary | +| cfg.rb:60:17:60:40 | Conditional | +| cfg.rb:60:21:60:22 | 10 | +| cfg.rb:60:26:60:32 | String | +| cfg.rb:60:36:60:40 | String | +| cfg.rb:61:3:61:3 | C | +| cfg.rb:61:3:61:16 | Assignment | +| cfg.rb:61:7:61:16 | String | +| cfg.rb:62:3:62:13 | DestructuredLeftAssignment | +| cfg.rb:62:3:62:27 | Assignment | +| cfg.rb:62:4:62:4 | x | +| cfg.rb:62:7:62:12 | DestructuredLeftAssignment | +| cfg.rb:62:8:62:8 | y | +| cfg.rb:62:11:62:11 | z | +| cfg.rb:62:17:62:27 | Array | +| cfg.rb:62:18:62:18 | 1 | +| cfg.rb:62:21:62:26 | Array | +| cfg.rb:62:22:62:22 | 2 | +| cfg.rb:62:25:62:25 | 3 | +| cfg.rb:63:3:66:5 | enter pattern | +| cfg.rb:63:3:66:5 | exit pattern | +| cfg.rb:63:3:66:5 | exit pattern (normal) | +| cfg.rb:64:5:64:8 | puts | +| cfg.rb:64:5:64:10 | MethodCall | +| cfg.rb:64:10:64:10 | a | +| cfg.rb:65:5:65:8 | puts | +| cfg.rb:65:5:65:10 | MethodCall | +| cfg.rb:65:10:65:10 | b | +| cfg.rb:67:3:67:7 | items | +| cfg.rb:67:3:67:19 | Assignment | +| cfg.rb:67:11:67:19 | Array | +| cfg.rb:67:12:67:12 | 1 | +| cfg.rb:67:15:67:15 | 2 | +| cfg.rb:67:18:67:18 | 3 | +| cfg.rb:68:3:68:6 | puts | +| cfg.rb:68:3:68:15 | MethodCall | +| cfg.rb:68:8:68:12 | items | +| cfg.rb:68:8:68:15 | ElementReference | +| cfg.rb:68:14:68:14 | 2 | +| cfg.rb:69:3:71:5 | enter print | +| cfg.rb:69:3:71:5 | exit print | +| cfg.rb:69:3:71:5 | exit print (normal) | +| cfg.rb:70:5:70:8 | puts | +| cfg.rb:70:5:70:16 | MethodCall | +| cfg.rb:70:10:70:16 | String | +| cfg.rb:74:1:74:1 | x | +| cfg.rb:74:1:74:6 | Assignment | +| cfg.rb:74:5:74:6 | 42 | +| cfg.rb:75:1:75:47 | If | +| cfg.rb:75:4:75:4 | x | +| cfg.rb:75:4:75:8 | Binary | +| cfg.rb:75:8:75:8 | 0 | +| cfg.rb:75:15:75:15 | 0 | +| cfg.rb:75:17:75:43 | Elsif | +| cfg.rb:75:23:75:23 | x | +| cfg.rb:75:23:75:28 | Binary | +| cfg.rb:75:27:75:28 | 10 | +| cfg.rb:75:35:75:36 | 10 | +| cfg.rb:75:43:75:43 | x | +| cfg.rb:77:1:86:3 | Begin | +| cfg.rb:78:3:78:3 | ; | +| cfg.rb:88:1:88:6 | escape | +| cfg.rb:88:1:88:23 | Assignment | +| cfg.rb:88:10:88:23 | String | +| cfg.rb:88:17:88:20 | Interpolation | +| cfg.rb:88:19:88:19 | x | +| cfg.rb:90:1:93:3 | For | +| cfg.rb:90:5:90:5 | x | +| cfg.rb:90:10:90:26 | Array | +| cfg.rb:90:11:90:13 | 1.4 | +| cfg.rb:90:16:90:18 | 2.5 | +| cfg.rb:90:21:90:25 | 3.4e5 | +| cfg.rb:91:3:91:24 | If | +| cfg.rb:91:6:91:6 | x | +| cfg.rb:91:6:91:10 | Binary | +| cfg.rb:91:10:91:10 | 3 | +| cfg.rb:91:17:91:20 | Next | +| cfg.rb:92:3:92:6 | puts | +| cfg.rb:92:3:92:8 | MethodCall | +| cfg.rb:92:8:92:8 | x | +| cfg.rb:95:1:95:7 | $global | +| cfg.rb:95:1:95:12 | Assignment | +| cfg.rb:95:11:95:12 | 42 | +| cfg.rb:97:1:97:4 | map1 | +| cfg.rb:97:1:97:32 | Assignment | +| cfg.rb:97:8:97:32 | Hash | +| cfg.rb:97:10:97:12 | String | +| cfg.rb:97:10:97:19 | Pair | +| cfg.rb:97:17:97:19 | String | +| cfg.rb:97:22:97:24 | String | +| cfg.rb:97:22:97:29 | Pair | +| cfg.rb:97:27:97:29 | String | +| cfg.rb:98:1:98:4 | map2 | +| cfg.rb:98:1:98:36 | Assignment | +| cfg.rb:98:8:98:36 | Hash | +| cfg.rb:98:10:98:15 | HashSplatArgument | +| cfg.rb:98:12:98:15 | map1 | +| cfg.rb:98:18:98:20 | String | +| cfg.rb:98:18:98:27 | Pair | +| cfg.rb:98:25:98:27 | String | +| cfg.rb:98:30:98:35 | HashSplatArgument | +| cfg.rb:98:32:98:35 | map1 | +| cfg.rb:101:1:104:3 | enter parameters | +| cfg.rb:101:1:104:3 | exit parameters | +| cfg.rb:101:1:104:3 | exit parameters (normal) | +| cfg.rb:102:3:102:6 | puts | +| cfg.rb:102:3:102:12 | MethodCall | +| cfg.rb:102:8:102:12 | value | +| cfg.rb:103:3:103:20 | Return | +| cfg.rb:103:10:103:15 | kwargs | +| cfg.rb:103:10:103:20 | ElementReference | +| cfg.rb:103:17:103:19 | key | +| cfg.rb:106:1:106:4 | type | +| cfg.rb:106:1:106:17 | Assignment | +| cfg.rb:106:9:106:17 | String | +| cfg.rb:107:1:107:5 | table | +| cfg.rb:107:1:107:14 | Assignment | +| cfg.rb:107:9:107:14 | String | +| cfg.rb:108:1:108:4 | puts | +| cfg.rb:108:1:108:12 | MethodCall | +| cfg.rb:108:6:108:12 | ParenthesizedStatements | +| cfg.rb:108:7:108:11 | < 1 then puts "some" +end + +chained = "a" "#{chained}" "string" + +character = ?\x40 + + +# this is a class +class Silly < Object + complex = 10-2i + conditional = b < 10 ? "hello" : "bye" + C = "constant" + (x, (y, z)) = [1, [2, 3]] + def pattern( (a,b) ) + puts a + puts b + end + items = [1, 2, 3] + puts items[2] + def print() + puts "silly" + end +end + +x = 42 +if x < 0 then 0 elsif x > 10 then 10 else x end + +begin + ; # empty statement +rescue Exception, Exception2 => e + puts "oops" + retry +else + puts "ok" +ensure + puts "end" +end + +escape = "\u1234#{x}\n" + +for x in [1.4, 2.5, 3.4e5] do + if x > 3 then next end + puts x +end + +$global = 42 + +map1 = { 'a' => 'b', 'c': 'd', } +map2 = { **map1, 'x' => 'y', **map1} + + +def parameters(value = 42, key:, **kwargs) + puts value + return kwargs[key] +end + +type = "healthy" +table = "food" +puts (< 10 + +class C + @field = 42 + @@static_field = 10 +end + +swap = ->((x, y)) { [y, x] } + +module M + nothing = nil + some = 2 + some += 10 + last = (2; 4; 7) + range = 0..9 + half = 1/3r + 1/6r + regex = /hello\s+[#{range}]/ + Constant = 5 +end + +1/0 rescue puts "div by zero" + +(*init, last) = 1, 2, 3 + +M::Constant +M.itself::Constant + +class << Silly.itself + def setter=() end + def print() + puts "singleton" + puts super.print() + end +end + +silly = Silly.new +def silly.method(*x) + puts x +end + +def two_parameters (a,b) end + +two_parameters(*[1,2]) + +scriptfile = `cat "#{__FILE__}"` + +symbol = :hello + +x = true +x = ! true +x = - 42 + +undef two_parameters + +unless x == 10 then puts "hi" else puts "bye" end + +puts "hi" unless x == 0 + +until x > 10 do x += 10; puts "hello" end + +i = 0 +(puts "hello"; i += 1) until i == 10 + +x = 0 +while x < 10 do + x += 1 + if x == 5 then redo end + puts x +end + +(puts "hello"; i -= 1) while i != 0 + +def run_block + yield 42 +end + +run_block { |x|puts x } + +__END__ + +Some ignored nonsense +