diff --git a/Cargo.lock b/Cargo.lock index 24141a94b..02f585222 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4388,7 +4388,7 @@ dependencies = [ [[package]] name = "yara-x" -version = "1.18.0" +version = "1.19.0" dependencies = [ "annotate-snippets", "anyhow", @@ -4466,7 +4466,7 @@ dependencies = [ [[package]] name = "yara-x-capi" -version = "1.18.0" +version = "1.19.0" dependencies = [ "assert-call", "cbindgen", @@ -4476,7 +4476,7 @@ dependencies = [ [[package]] name = "yara-x-cli" -version = "1.18.0" +version = "1.19.0" dependencies = [ "anyhow", "ascii_tree", @@ -4515,7 +4515,7 @@ dependencies = [ [[package]] name = "yara-x-fmt" -version = "1.18.0" +version = "1.19.0" dependencies = [ "bitflags 2.13.0", "bstr", @@ -4529,7 +4529,7 @@ dependencies = [ [[package]] name = "yara-x-js" -version = "1.18.0" +version = "1.19.0" dependencies = [ "getrandom 0.2.17", "js-sys", @@ -4545,7 +4545,7 @@ dependencies = [ [[package]] name = "yara-x-ls" -version = "1.18.0" +version = "1.19.0" dependencies = [ "async-lsp", "bitflags 2.13.0", @@ -4575,7 +4575,7 @@ dependencies = [ [[package]] name = "yara-x-macros" -version = "1.18.0" +version = "1.19.0" dependencies = [ "darling", "proc-macro2", @@ -4585,7 +4585,7 @@ dependencies = [ [[package]] name = "yara-x-parser" -version = "1.18.0" +version = "1.19.0" dependencies = [ "anyhow", "ascii_tree", @@ -4608,7 +4608,7 @@ dependencies = [ [[package]] name = "yara-x-proto" -version = "1.18.0" +version = "1.19.0" dependencies = [ "base64", "chrono", @@ -4622,7 +4622,7 @@ dependencies = [ [[package]] name = "yara-x-py" -version = "1.18.0" +version = "1.19.0" dependencies = [ "base64", "protobuf", diff --git a/Cargo.toml b/Cargo.toml index 48c0fe5f8..7d78701b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,5 +1,5 @@ [workspace.package] -version = "1.18.0" +version = "1.19.0" authors = ["Victor M. Alvarez "] edition = "2024" homepage = "https://virustotal.github.io/yara-x" @@ -109,11 +109,11 @@ wasm-opt = "0.116.1" wasmtime = { version = "43.0.2", default-features = false } x509-parser = "0.18.0" yansi = "1.0.1" -yara-x = { path = "lib", version = "1.18.0" } -yara-x-fmt = { path = "fmt", version = "1.18.0" } -yara-x-macros = { path = "macros", version = "1.18.0" } -yara-x-parser = { path = "parser", version = "1.18.0" } -yara-x-proto = { path = "proto", version = "1.18.0"} +yara-x = { path = "lib", version = "1.19.0" } +yara-x-fmt = { path = "fmt", version = "1.19.0" } +yara-x-macros = { path = "macros", version = "1.19.0" } +yara-x-parser = { path = "parser", version = "1.19.0" } +yara-x-proto = { path = "proto", version = "1.19.0"} zip = { version = "8.2.0", default-features = false } tinyzip = "0.4.0" simd-adler32 = "0.3.9" diff --git a/lib/Cargo.toml b/lib/Cargo.toml index 3c69aa217..75c77d0df 100644 --- a/lib/Cargo.toml +++ b/lib/Cargo.toml @@ -262,12 +262,14 @@ default-modules = [ "macho-module", "math-module", "hash-module", - "olecf-module", + # Still experimental + # "olecf-module", "pe-module", "string-module", "time-module", "lnk-module", - "vba-module", + # Still experimental + # "vba-module", "test_proto2-module", "test_proto3-module", "vt-module", diff --git a/lib/src/compiler/ir/tests/testdata/14.cse.ir b/lib/src/compiler/ir/tests/testdata/14.cse.ir new file mode 100644 index 000000000..1240471e8 --- /dev/null +++ b/lib/src/compiler/ir/tests/testdata/14.cse.ir @@ -0,0 +1,628 @@ +RULE test_1 + 20: FOR_IN -- hash: 0x72bf379da36225e5 + n: Var { frame_id: 1, ty: integer, index: 0 } + i: Var { frame_id: 1, ty: integer, index: 1 } + max_count: Var { frame_id: 1, ty: integer, index: 2 } + count: Var { frame_id: 1, ty: integer, index: 3 } + item: Var { frame_id: 1, ty: unknown, index: 4 } + 0: CONST integer(1) + 1: CONST integer(5) + 19: FOR_IN -- hash: 0xdaad33cf0baf0a64 + n: Var { frame_id: 2, ty: integer, index: 7 } + i: Var { frame_id: 2, ty: integer, index: 8 } + max_count: Var { frame_id: 2, ty: integer, index: 9 } + count: Var { frame_id: 2, ty: integer, index: 10 } + item: Var { frame_id: 2, ty: unknown, index: 11 } + 2: CONST integer(1) + 3: CONST integer(5) + 18: FOR_IN -- hash: 0x497c3d59939269bb + n: Var { frame_id: 3, ty: integer, index: 14 } + i: Var { frame_id: 3, ty: integer, index: 15 } + max_count: Var { frame_id: 3, ty: integer, index: 16 } + count: Var { frame_id: 3, ty: integer, index: 17 } + item: Var { frame_id: 3, ty: unknown, index: 18 } + 4: CONST integer(1) + 5: CONST integer(5) + 17: OR -- hash: 0x12919697ba229f76 + 10: GT -- hash: 0xc0fd295a9fa39fa9 + 8: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 6: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 7: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 9: CONST integer(0) + 13: EQ -- hash: 0xca7652cced0142e6 + 11: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 12: CONST integer(3) + 16: EQ -- hash: 0xdf5816c82bc02f3 + 14: SYMBOL Var { var: Var { frame_id: 2, ty: integer, index: 12 }, type_value: integer(unknown) } + 15: CONST integer(4) + +RULE test_2 + 13: WITH -- hash: 0x862ac2b588220f59 + 0: CONST integer(10) + 12: FOR_IN -- hash: 0xfb8fa06e0ec768d9 + n: Var { frame_id: 2, ty: integer, index: 1 } + i: Var { frame_id: 2, ty: integer, index: 2 } + max_count: Var { frame_id: 2, ty: integer, index: 3 } + count: Var { frame_id: 2, ty: integer, index: 4 } + item: Var { frame_id: 2, ty: unknown, index: 5 } + 1: CONST integer(1) + 2: CONST integer(5) + 11: AND -- hash: 0xf3506d7cd428c254 + 7: EQ -- hash: 0x8d45f5fbc7dba69a + 5: CONST integer(11) + 6: CONST integer(11) + 10: GT -- hash: 0x7fb3c7b6e648fdb1 + 8: SYMBOL Var { var: Var { frame_id: 2, ty: integer, index: 6 }, type_value: integer(unknown) } + 9: CONST integer(0) + +RULE test_3 + 19: FOR_IN -- hash: 0x9f80cf2da772b9f9 + n: Var { frame_id: 1, ty: integer, index: 0 } + i: Var { frame_id: 1, ty: integer, index: 1 } + max_count: Var { frame_id: 1, ty: integer, index: 2 } + count: Var { frame_id: 1, ty: integer, index: 3 } + item: Var { frame_id: 1, ty: unknown, index: 4 } + 0: CONST integer(0) + 3: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 1: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 2: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 18: AND -- hash: 0x4044f60b2b21d46 + 12: EQ -- hash: 0xd80bb6889bf5d23f + 10: FIELD_ACCESS -- hash: 0xf6f8e9b23f513dd1 + 8: LOOKUP -- hash: 0x7e699c8d78b13901 + 6: FIELD_ACCESS -- hash: 0xb93ff31706b0e381 + 4: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 5: SYMBOL Field { index: 49, is_root: false, type_value: array, acl: None, deprecation_notice: None } + 7: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 9: SYMBOL Field { index: 0, is_root: false, type_value: string(unknown), acl: None, deprecation_notice: None } + 11: CONST string(".text") + 17: GT -- hash: 0xc0fd295a9fa39fa9 + 15: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 13: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 14: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 16: CONST integer(0) + +RULE test_4 + 532: FOR_IN -- hash: 0x9955d895482ac2dd + n: Var { frame_id: 1, ty: integer, index: 0 } + i: Var { frame_id: 1, ty: integer, index: 1 } + max_count: Var { frame_id: 1, ty: integer, index: 2 } + count: Var { frame_id: 1, ty: integer, index: 3 } + item: Var { frame_id: 1, ty: unknown, index: 4 } + 0: CONST integer(1) + 1: CONST integer(5) + 531: FOR_IN -- hash: 0x39d3fce9735f69cd + n: Var { frame_id: 2, ty: integer, index: 7 } + i: Var { frame_id: 2, ty: integer, index: 8 } + max_count: Var { frame_id: 2, ty: integer, index: 9 } + count: Var { frame_id: 2, ty: integer, index: 10 } + item: Var { frame_id: 2, ty: unknown, index: 11 } + 2: CONST integer(1) + 3: CONST integer(5) + 530: AND -- hash: 0xa6c67725bbf1ce09 + 8: EQ -- hash: 0x8fb6fe40bf072288 + 6: ADD -- hash: 0xe38fe90ae410b35a + 4: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 5: CONST integer(0) + 7: CONST integer(10) + 13: EQ -- hash: 0x7be2178493efe6e0 + 11: ADD -- hash: 0x8c4973b1fbd58946 + 9: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 10: CONST integer(1) + 12: CONST integer(10) + 18: EQ -- hash: 0x680d30c864d8ab38 + 16: ADD -- hash: 0x3502fe590f9a5f32 + 14: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 15: CONST integer(2) + 17: CONST integer(10) + 23: EQ -- hash: 0x54384a0c39c16f90 + 21: ADD -- hash: 0xddbc8900235f351d + 19: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 20: CONST integer(3) + 22: CONST integer(10) + 28: EQ -- hash: 0x406363500eaa33e8 + 26: ADD -- hash: 0x867613a737240b09 + 24: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 25: CONST integer(4) + 27: CONST integer(10) + 33: EQ -- hash: 0x2c8e7c93e392f840 + 31: ADD -- hash: 0x2f2f9e4e4ae8e0f5 + 29: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 30: CONST integer(5) + 32: CONST integer(10) + 38: EQ -- hash: 0x18b995d7b47bbc98 + 36: ADD -- hash: 0xd7e928f55eadb6e0 + 34: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 35: CONST integer(6) + 37: CONST integer(10) + 43: EQ -- hash: 0x4e4af1b896480f0 + 41: ADD -- hash: 0x80a2b39c72728ccc + 39: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 40: CONST integer(7) + 42: CONST integer(10) + 48: EQ -- hash: 0xf10fc85f5e4d4547 + 46: ADD -- hash: 0x295c3e43863762b8 + 44: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 45: CONST integer(8) + 47: CONST integer(10) + 53: EQ -- hash: 0xdd3ae1a33336099f + 51: ADD -- hash: 0xd215c8ea99fc38a3 + 49: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 50: CONST integer(9) + 52: CONST integer(10) + 58: EQ -- hash: 0xc965fae7041ecdf7 + 56: ADD -- hash: 0x7acf5391adc10e8f + 54: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 55: CONST integer(10) + 57: CONST integer(10) + 63: EQ -- hash: 0xb591142ad907924f + 61: ADD -- hash: 0x2388de38c185e47b + 59: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 60: CONST integer(11) + 62: CONST integer(10) + 68: EQ -- hash: 0xa1bc2d6eadf056a7 + 66: ADD -- hash: 0xcc4268dfd54aba66 + 64: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 65: CONST integer(12) + 67: CONST integer(10) + 73: EQ -- hash: 0x8de746b282d91aff + 71: ADD -- hash: 0x74fbf386e90f9052 + 69: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 70: CONST integer(13) + 72: CONST integer(10) + 78: EQ -- hash: 0x7a125ff657c1df57 + 76: ADD -- hash: 0x1db57e2dfcd4663e + 74: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 75: CONST integer(14) + 77: CONST integer(10) + 83: EQ -- hash: 0x663d793a28aaa3af + 81: ADD -- hash: 0xc66f08d510993c29 + 79: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 80: CONST integer(15) + 82: CONST integer(10) + 88: EQ -- hash: 0x5268927dfd936807 + 86: ADD -- hash: 0x6f28937c245e1215 + 84: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 85: CONST integer(16) + 87: CONST integer(10) + 93: EQ -- hash: 0x3e93abc1d27c2c5f + 91: ADD -- hash: 0x17e21e233822e801 + 89: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 90: CONST integer(17) + 92: CONST integer(10) + 98: EQ -- hash: 0x2abec505a764f0b7 + 96: ADD -- hash: 0xc09ba8ca4fe7bdec + 94: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 95: CONST integer(18) + 97: CONST integer(10) + 103: EQ -- hash: 0x16e9de49784db50f + 101: ADD -- hash: 0x6955337163ac93d8 + 99: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 100: CONST integer(19) + 102: CONST integer(10) + 108: EQ -- hash: 0x314f78d4d367967 + 106: ADD -- hash: 0x120ebe18777169c4 + 104: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 105: CONST integer(20) + 107: CONST integer(10) + 113: EQ -- hash: 0xef4010d1221f3dbe + 111: ADD -- hash: 0xbac848bf8b363faf + 109: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 110: CONST integer(21) + 112: CONST integer(10) + 118: EQ -- hash: 0xdb6b2a14f7080216 + 116: ADD -- hash: 0x6381d3669efb159b + 114: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 115: CONST integer(22) + 117: CONST integer(10) + 123: EQ -- hash: 0xc7964358cbf0c66e + 121: ADD -- hash: 0xc3b5e0db2bfeb87 + 119: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 120: CONST integer(23) + 122: CONST integer(10) + 128: EQ -- hash: 0xb3c15c9c9cd98ac6 + 126: ADD -- hash: 0xb4f4e8b4c684c172 + 124: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 125: CONST integer(24) + 127: CONST integer(10) + 133: EQ -- hash: 0x9fec75e071c24f1e + 131: ADD -- hash: 0x5dae735bda49975e + 129: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 130: CONST integer(25) + 132: CONST integer(10) + 138: EQ -- hash: 0x8c178f2446ab1376 + 136: ADD -- hash: 0x667fe02ee0e6d4a + 134: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 135: CONST integer(26) + 137: CONST integer(10) + 143: EQ -- hash: 0x7842a8681b93d7ce + 141: ADD -- hash: 0xaf2188aa01d34335 + 139: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 140: CONST integer(27) + 142: CONST integer(10) + 148: EQ -- hash: 0x646dc1abec7c9c26 + 146: ADD -- hash: 0x57db135115981921 + 144: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 145: CONST integer(28) + 147: CONST integer(10) + 153: EQ -- hash: 0x5098daefc165607e + 151: ADD -- hash: 0x949df8295cef0d + 149: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 150: CONST integer(29) + 152: CONST integer(10) + 158: EQ -- hash: 0x3cc3f433964e24d6 + 156: ADD -- hash: 0xa94e289f3d21c4f8 + 154: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 155: CONST integer(30) + 157: CONST integer(10) + 163: EQ -- hash: 0x28ef0d776b36e92e + 161: ADD -- hash: 0x5207b34650e69ae4 + 159: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 160: CONST integer(31) + 162: CONST integer(10) + 168: EQ -- hash: 0x151a26bb3c1fad86 + 166: ADD -- hash: 0xfac13ded64ab70cf + 164: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 165: CONST integer(32) + 167: CONST integer(10) + 173: EQ -- hash: 0x1453fff110871de + 171: ADD -- hash: 0xa37ac894787046bb + 169: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 170: CONST integer(33) + 172: CONST integer(10) + 178: EQ -- hash: 0xed705942e5f13635 + 176: ADD -- hash: 0x4c34533b8c351ca7 + 174: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 175: CONST integer(34) + 177: CONST integer(10) + 183: EQ -- hash: 0xd99b7286bad9fa8d + 181: ADD -- hash: 0xf4eddde2a3f9f292 + 179: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 180: CONST integer(35) + 182: CONST integer(10) + 188: EQ -- hash: 0xc5c68bca8fc2bee5 + 186: ADD -- hash: 0x9da76889b7bec87e + 184: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 185: CONST integer(36) + 187: CONST integer(10) + 193: EQ -- hash: 0xb1f1a50e60ab833d + 191: ADD -- hash: 0x4660f330cb839e6a + 189: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 190: CONST integer(37) + 192: CONST integer(10) + 198: EQ -- hash: 0x9e1cbe5235944795 + 196: ADD -- hash: 0xef1a7dd7df487455 + 194: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 195: CONST integer(38) + 197: CONST integer(10) + 203: EQ -- hash: 0x8a47d7960a7d0bed + 201: ADD -- hash: 0x97d4087ef30d4a41 + 199: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 200: CONST integer(39) + 202: CONST integer(10) + 208: EQ -- hash: 0x7672f0d9df65d045 + 206: ADD -- hash: 0x408d932606d2202d + 204: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 205: CONST integer(40) + 207: CONST integer(10) + 213: EQ -- hash: 0x629e0a1db04e949d + 211: ADD -- hash: 0xe9471dcd1a96f618 + 209: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 210: CONST integer(41) + 212: CONST integer(10) + 218: EQ -- hash: 0x4ec92361853758f5 + 216: ADD -- hash: 0x9200a8742e5bcc04 + 214: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 215: CONST integer(42) + 217: CONST integer(10) + 223: EQ -- hash: 0x3af43ca55a201d4d + 221: ADD -- hash: 0x3aba331b4220a1f0 + 219: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 220: CONST integer(43) + 222: CONST integer(10) + 228: EQ -- hash: 0x271f55e92f08e1a5 + 226: ADD -- hash: 0xe373bdc255e577db + 224: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 225: CONST integer(44) + 227: CONST integer(10) + 233: EQ -- hash: 0x134a6f2d03f1a5fd + 231: ADD -- hash: 0x8c2d486969aa4dc7 + 229: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 230: CONST integer(45) + 232: CONST integer(10) + 238: EQ -- hash: 0xff758870d4da6a54 + 236: ADD -- hash: 0x34e6d3107d6f23b3 + 234: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 235: CONST integer(46) + 237: CONST integer(10) + 243: EQ -- hash: 0xeba0a1b4a9c32eac + 241: ADD -- hash: 0xdda05db79133f99e + 239: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 240: CONST integer(47) + 242: CONST integer(10) + 248: EQ -- hash: 0xd7cbbaf87eabf304 + 246: ADD -- hash: 0x8659e85ea4f8cf8a + 244: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 245: CONST integer(48) + 247: CONST integer(10) + 253: EQ -- hash: 0xc3f6d43c5394b75c + 251: ADD -- hash: 0x2f137305b8bda576 + 249: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 250: CONST integer(49) + 252: CONST integer(10) + 258: EQ -- hash: 0xb021ed80247d7bb4 + 256: ADD -- hash: 0xd7ccfdaccc827b61 + 254: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 255: CONST integer(50) + 257: CONST integer(10) + 263: EQ -- hash: 0x9c4d06c3f966400c + 261: ADD -- hash: 0x80868853e047514d + 259: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 260: CONST integer(51) + 262: CONST integer(10) + 268: EQ -- hash: 0x88782007ce4f0464 + 266: ADD -- hash: 0x294012faf40c2739 + 264: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 265: CONST integer(52) + 267: CONST integer(10) + 273: EQ -- hash: 0x74a3394ba337c8bc + 271: ADD -- hash: 0xd1f99da20bd0fd24 + 269: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 270: CONST integer(53) + 272: CONST integer(10) + 278: EQ -- hash: 0x60ce528f74208d14 + 276: ADD -- hash: 0x7ab328491f95d310 + 274: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 275: CONST integer(54) + 277: CONST integer(10) + 283: EQ -- hash: 0x4cf96bd34909516c + 281: ADD -- hash: 0x236cb2f0335aa8fc + 279: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 280: CONST integer(55) + 282: CONST integer(10) + 288: EQ -- hash: 0x392485171df215c4 + 286: ADD -- hash: 0xcc263d97471f7ee7 + 284: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 285: CONST integer(56) + 287: CONST integer(10) + 293: EQ -- hash: 0x254f9e5af2dada1c + 291: ADD -- hash: 0x74dfc83e5ae454d3 + 289: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 290: CONST integer(57) + 292: CONST integer(10) + 298: EQ -- hash: 0x117ab79ec7c39e74 + 296: ADD -- hash: 0x1d9952e56ea92abf + 294: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 295: CONST integer(58) + 297: CONST integer(10) + 303: EQ -- hash: 0xfda5d0e298ac62cb + 301: ADD -- hash: 0xc652dd8c826e00aa + 299: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 300: CONST integer(59) + 302: CONST integer(10) + 308: EQ -- hash: 0xe9d0ea266d952723 + 306: ADD -- hash: 0x6f0c68339632d696 + 304: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 305: CONST integer(60) + 307: CONST integer(10) + 313: EQ -- hash: 0xd5fc036a427deb7b + 311: ADD -- hash: 0x17c5f2daa9f7ac82 + 309: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 310: CONST integer(61) + 312: CONST integer(10) + 318: EQ -- hash: 0xc2271cae1766afd3 + 316: ADD -- hash: 0xc07f7d81bdbc826d + 314: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 315: CONST integer(62) + 317: CONST integer(10) + 323: EQ -- hash: 0xae5235f1e84f742b + 321: ADD -- hash: 0x69390828d1815859 + 319: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 320: CONST integer(63) + 322: CONST integer(10) + 328: EQ -- hash: 0x9a7d4f35bd383883 + 326: ADD -- hash: 0x11f292cfe5462e45 + 324: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 325: CONST integer(64) + 327: CONST integer(10) + 333: EQ -- hash: 0x86a868799220fcdb + 331: ADD -- hash: 0xbaac1d76f90b0430 + 329: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 330: CONST integer(65) + 332: CONST integer(10) + 338: EQ -- hash: 0x72d381bd6709c133 + 336: ADD -- hash: 0x6365a81e0ccfda1c + 334: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 335: CONST integer(66) + 337: CONST integer(10) + 343: EQ -- hash: 0x5efe9b013bf2858b + 341: ADD -- hash: 0xc1f32c52094b008 + 339: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 340: CONST integer(67) + 342: CONST integer(10) + 348: EQ -- hash: 0x4b29b4450cdb49e3 + 346: ADD -- hash: 0xb4d8bd6c345985f3 + 344: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 345: CONST integer(68) + 347: CONST integer(10) + 353: EQ -- hash: 0x3754cd88e1c40e3b + 351: ADD -- hash: 0x5d924813481e5bdf + 349: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 350: CONST integer(69) + 352: CONST integer(10) + 358: EQ -- hash: 0x237fe6ccb6acd293 + 356: ADD -- hash: 0x64bd2ba5fe331cb + 354: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 355: CONST integer(70) + 357: CONST integer(10) + 363: EQ -- hash: 0xfab00108b9596eb + 361: ADD -- hash: 0xaf055d6173a807b6 + 359: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 360: CONST integer(71) + 362: CONST integer(10) + 368: EQ -- hash: 0xfbd619545c7e5b42 + 366: ADD -- hash: 0x57bee808876cdda2 + 364: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 365: CONST integer(72) + 367: CONST integer(10) + 373: EQ -- hash: 0xe801329831671f9a + 371: ADD -- hash: 0x7872af9b31b38e + 369: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 370: CONST integer(73) + 372: CONST integer(10) + 378: EQ -- hash: 0xd42c4bdc064fe3f2 + 376: ADD -- hash: 0xa931fd56aef68979 + 374: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 375: CONST integer(74) + 377: CONST integer(10) + 383: EQ -- hash: 0xc057651fdb38a84a + 381: ADD -- hash: 0x51eb87fdc2bb5f65 + 379: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 380: CONST integer(75) + 382: CONST integer(10) + 388: EQ -- hash: 0xac827e63ac216ca2 + 386: ADD -- hash: 0xfaa512a4d6803550 + 384: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 385: CONST integer(76) + 387: CONST integer(10) + 393: EQ -- hash: 0x98ad97a7810a30fa + 391: ADD -- hash: 0xa35e9d4bea450b3c + 389: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 390: CONST integer(77) + 392: CONST integer(10) + 398: EQ -- hash: 0x84d8b0eb55f2f552 + 396: ADD -- hash: 0x4c1827f2fe09e128 + 394: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 395: CONST integer(78) + 397: CONST integer(10) + 403: EQ -- hash: 0x7103ca2f2adbb9aa + 401: ADD -- hash: 0xf4d1b29a11ceb713 + 399: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 400: CONST integer(79) + 402: CONST integer(10) + 408: EQ -- hash: 0x5d2ee372ffc47e02 + 406: ADD -- hash: 0x9d8b3d4125938cff + 404: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 405: CONST integer(80) + 407: CONST integer(10) + 413: EQ -- hash: 0x4959fcb6d0ad425a + 411: ADD -- hash: 0x4644c7e8395862eb + 409: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 410: CONST integer(81) + 412: CONST integer(10) + 418: EQ -- hash: 0x358515faa59606b2 + 416: ADD -- hash: 0xeefe528f4d1d38d6 + 414: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 415: CONST integer(82) + 417: CONST integer(10) + 423: EQ -- hash: 0x21b02f3e7a7ecb0a + 421: ADD -- hash: 0x97b7dd3660e20ec2 + 419: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 420: CONST integer(83) + 422: CONST integer(10) + 428: EQ -- hash: 0xddb48824f678f62 + 426: ADD -- hash: 0x407167dd74a6e4ae + 424: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 425: CONST integer(84) + 427: CONST integer(10) + 433: EQ -- hash: 0xfa0661c6205053b9 + 431: ADD -- hash: 0xe92af284886bba99 + 429: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 430: CONST integer(85) + 432: CONST integer(10) + 438: EQ -- hash: 0xe6317b09f5391811 + 436: ADD -- hash: 0x91e47d2b9c309085 + 434: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 435: CONST integer(86) + 437: CONST integer(10) + 443: EQ -- hash: 0xd25c944dca21dc69 + 441: ADD -- hash: 0x3a9e07d2b3f56671 + 439: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 440: CONST integer(87) + 442: CONST integer(10) + 448: EQ -- hash: 0xbe87ad919f0aa0c1 + 446: ADD -- hash: 0xe3579279c7ba3c5c + 444: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 445: CONST integer(88) + 447: CONST integer(10) + 453: EQ -- hash: 0xaab2c6d573f36519 + 451: ADD -- hash: 0x8c111d20db7f1248 + 449: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 450: CONST integer(89) + 452: CONST integer(10) + 458: EQ -- hash: 0x96dde01944dc2971 + 456: ADD -- hash: 0x34caa7c7ef43e834 + 454: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 455: CONST integer(90) + 457: CONST integer(10) + 463: EQ -- hash: 0x8308f95d19c4edc9 + 461: ADD -- hash: 0xdd84326f0308be1f + 459: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 460: CONST integer(91) + 462: CONST integer(10) + 468: EQ -- hash: 0x6f3412a0eeadb221 + 466: ADD -- hash: 0x863dbd1616cd940b + 464: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 465: CONST integer(92) + 467: CONST integer(10) + 473: EQ -- hash: 0x5b5f2be4c3967679 + 471: ADD -- hash: 0x2ef747bd2a9269f7 + 469: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 470: CONST integer(93) + 472: CONST integer(10) + 478: EQ -- hash: 0x478a4528947f3ad1 + 476: ADD -- hash: 0xd7b0d2643e573fe2 + 474: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 475: CONST integer(94) + 477: CONST integer(10) + 483: EQ -- hash: 0x33b55e6c6967ff29 + 481: ADD -- hash: 0x806a5d0b521c15ce + 479: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 480: CONST integer(95) + 482: CONST integer(10) + 488: EQ -- hash: 0x1fe077b03e50c381 + 486: ADD -- hash: 0x2923e7b265e0ebba + 484: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 485: CONST integer(96) + 487: CONST integer(10) + 493: EQ -- hash: 0xc0b90f4133987d9 + 491: ADD -- hash: 0xd1dd725979a5c1a5 + 489: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 490: CONST integer(97) + 492: CONST integer(10) + 498: EQ -- hash: 0xf836aa37e4224c30 + 496: ADD -- hash: 0x7a96fd008d6a9791 + 494: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 495: CONST integer(98) + 497: CONST integer(10) + 503: EQ -- hash: 0xe461c37bb90b1088 + 501: ADD -- hash: 0x235087a7a12f6d7d + 499: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 500: CONST integer(99) + 502: CONST integer(10) + 508: EQ -- hash: 0xd08cdcbf8df3d4e0 + 506: ADD -- hash: 0xcc0a124eb4f44368 + 504: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 505: CONST integer(100) + 507: CONST integer(10) + 513: EQ -- hash: 0xbcb7f60362dc9938 + 511: ADD -- hash: 0x74c39cf5c8b91954 + 509: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 510: CONST integer(101) + 512: CONST integer(10) + 518: EQ -- hash: 0xa8e30f4737c55d90 + 516: ADD -- hash: 0x1d7d279cdc7def40 + 514: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 515: CONST integer(102) + 517: CONST integer(10) + 523: EQ -- hash: 0x950e288b08ae21e8 + 521: ADD -- hash: 0xc636b243f042c52b + 519: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 520: CONST integer(103) + 522: CONST integer(10) + 528: EQ -- hash: 0x813941cedd96e640 + 526: ADD -- hash: 0x6ef03ceb04079b17 + 524: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 525: CONST integer(104) + 527: CONST integer(10) + diff --git a/lib/src/compiler/ir/tests/testdata/14.hoisting.ir b/lib/src/compiler/ir/tests/testdata/14.hoisting.ir new file mode 100644 index 000000000..3cae66000 --- /dev/null +++ b/lib/src/compiler/ir/tests/testdata/14.hoisting.ir @@ -0,0 +1,642 @@ +RULE test_1 + 22: WITH -- hash: 0xf1f8589cad533195 + 21: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 6: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 7: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 24: WITH -- hash: 0xe9d24d3dd581f591 + 23: GT -- hash: 0xab8149e485a34c2f + 8: SYMBOL Var { var: Var { frame_id: 0, ty: integer, index: 0 }, type_value: integer(unknown) } + 9: CONST integer(0) + 20: FOR_IN -- hash: 0x289160cf1aef79ef + n: Var { frame_id: 1, ty: integer, index: 2 } + i: Var { frame_id: 1, ty: integer, index: 3 } + max_count: Var { frame_id: 1, ty: integer, index: 4 } + count: Var { frame_id: 1, ty: integer, index: 5 } + item: Var { frame_id: 1, ty: unknown, index: 6 } + 0: CONST integer(1) + 1: CONST integer(5) + 26: WITH -- hash: 0x763bda68a15a3784 + 25: EQ -- hash: 0xa2cc855496d2cb96 + 11: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 7 }, type_value: integer(unknown) } + 12: CONST integer(3) + 19: FOR_IN -- hash: 0x30775be1f5466b74 + n: Var { frame_id: 2, ty: integer, index: 10 } + i: Var { frame_id: 2, ty: integer, index: 11 } + max_count: Var { frame_id: 2, ty: integer, index: 12 } + count: Var { frame_id: 2, ty: integer, index: 13 } + item: Var { frame_id: 2, ty: unknown, index: 14 } + 2: CONST integer(1) + 3: CONST integer(5) + 18: FOR_IN -- hash: 0x94349f273d98c626 + n: Var { frame_id: 3, ty: integer, index: 17 } + i: Var { frame_id: 3, ty: integer, index: 18 } + max_count: Var { frame_id: 3, ty: integer, index: 19 } + count: Var { frame_id: 3, ty: integer, index: 20 } + item: Var { frame_id: 3, ty: unknown, index: 21 } + 4: CONST integer(1) + 5: CONST integer(5) + 17: OR -- hash: 0x7a89bd8f25782ecf + 10: SYMBOL Var { var: Var { frame_id: 0, ty: boolean, index: 1 }, type_value: boolean(unknown) } + 13: SYMBOL Var { var: Var { frame_id: 0, ty: boolean, index: 9 }, type_value: boolean(unknown) } + 16: EQ -- hash: 0xd276cd37fd764ffa + 14: SYMBOL Var { var: Var { frame_id: 2, ty: integer, index: 15 }, type_value: integer(unknown) } + 15: CONST integer(4) + +RULE test_2 + 13: WITH -- hash: 0xf8fe891269be2ce8 + 0: CONST integer(10) + 15: WITH -- hash: 0xd4d80d750f834956 + 14: EQ -- hash: 0x8d45f5fbc7dba69a + 5: CONST integer(11) + 6: CONST integer(11) + 12: FOR_IN -- hash: 0xbf752fd012ef0394 + n: Var { frame_id: 2, ty: integer, index: 2 } + i: Var { frame_id: 2, ty: integer, index: 3 } + max_count: Var { frame_id: 2, ty: integer, index: 4 } + count: Var { frame_id: 2, ty: integer, index: 5 } + item: Var { frame_id: 2, ty: unknown, index: 6 } + 1: CONST integer(1) + 2: CONST integer(5) + 11: AND -- hash: 0xb1fb77075ac970ed + 7: SYMBOL Var { var: Var { frame_id: 0, ty: boolean, index: 1 }, type_value: boolean(unknown) } + 10: GT -- hash: 0x6bdee0fabb31c209 + 8: SYMBOL Var { var: Var { frame_id: 2, ty: integer, index: 7 }, type_value: integer(unknown) } + 9: CONST integer(0) + +RULE test_3 + 21: WITH -- hash: 0xbdd327417e085fb8 + 20: FIELD_ACCESS -- hash: 0xb93ff31706b0e381 + 4: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 5: SYMBOL Field { index: 49, is_root: false, type_value: array, acl: None, deprecation_notice: None } + 23: WITH -- hash: 0x2bdd89b0621abc52 + 22: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 13: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 14: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 25: WITH -- hash: 0x5e8125f5e8c90cc4 + 24: GT -- hash: 0x97ac63285a8c1087 + 15: SYMBOL Var { var: Var { frame_id: 0, ty: integer, index: 1 }, type_value: integer(unknown) } + 16: CONST integer(0) + 19: FOR_IN -- hash: 0x4552833c8a799f1f + n: Var { frame_id: 1, ty: integer, index: 3 } + i: Var { frame_id: 1, ty: integer, index: 4 } + max_count: Var { frame_id: 1, ty: integer, index: 5 } + count: Var { frame_id: 1, ty: integer, index: 6 } + item: Var { frame_id: 1, ty: unknown, index: 7 } + 0: CONST integer(0) + 3: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 1: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 2: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 18: AND -- hash: 0x5675239764a27d36 + 12: EQ -- hash: 0xa98a2af112833467 + 10: FIELD_ACCESS -- hash: 0xe5b8fd8695fb770c + 8: LOOKUP -- hash: 0xba759ee69162285b + 6: SYMBOL Var { var: Var { frame_id: 0, ty: array, index: 0 }, type_value: array } + 7: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 8 }, type_value: integer(unknown) } + 9: SYMBOL Field { index: 0, is_root: false, type_value: string(unknown), acl: None, deprecation_notice: None } + 11: CONST string(".text") + 17: SYMBOL Var { var: Var { frame_id: 0, ty: boolean, index: 2 }, type_value: boolean(unknown) } + +RULE test_4 + 532: FOR_IN -- hash: 0x9955d895482ac2dd + n: Var { frame_id: 1, ty: integer, index: 0 } + i: Var { frame_id: 1, ty: integer, index: 1 } + max_count: Var { frame_id: 1, ty: integer, index: 2 } + count: Var { frame_id: 1, ty: integer, index: 3 } + item: Var { frame_id: 1, ty: unknown, index: 4 } + 0: CONST integer(1) + 1: CONST integer(5) + 531: FOR_IN -- hash: 0x39d3fce9735f69cd + n: Var { frame_id: 2, ty: integer, index: 7 } + i: Var { frame_id: 2, ty: integer, index: 8 } + max_count: Var { frame_id: 2, ty: integer, index: 9 } + count: Var { frame_id: 2, ty: integer, index: 10 } + item: Var { frame_id: 2, ty: unknown, index: 11 } + 2: CONST integer(1) + 3: CONST integer(5) + 530: AND -- hash: 0xa6c67725bbf1ce09 + 8: EQ -- hash: 0x8fb6fe40bf072288 + 6: ADD -- hash: 0xe38fe90ae410b35a + 4: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 5: CONST integer(0) + 7: CONST integer(10) + 13: EQ -- hash: 0x7be2178493efe6e0 + 11: ADD -- hash: 0x8c4973b1fbd58946 + 9: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 10: CONST integer(1) + 12: CONST integer(10) + 18: EQ -- hash: 0x680d30c864d8ab38 + 16: ADD -- hash: 0x3502fe590f9a5f32 + 14: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 15: CONST integer(2) + 17: CONST integer(10) + 23: EQ -- hash: 0x54384a0c39c16f90 + 21: ADD -- hash: 0xddbc8900235f351d + 19: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 20: CONST integer(3) + 22: CONST integer(10) + 28: EQ -- hash: 0x406363500eaa33e8 + 26: ADD -- hash: 0x867613a737240b09 + 24: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 25: CONST integer(4) + 27: CONST integer(10) + 33: EQ -- hash: 0x2c8e7c93e392f840 + 31: ADD -- hash: 0x2f2f9e4e4ae8e0f5 + 29: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 30: CONST integer(5) + 32: CONST integer(10) + 38: EQ -- hash: 0x18b995d7b47bbc98 + 36: ADD -- hash: 0xd7e928f55eadb6e0 + 34: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 35: CONST integer(6) + 37: CONST integer(10) + 43: EQ -- hash: 0x4e4af1b896480f0 + 41: ADD -- hash: 0x80a2b39c72728ccc + 39: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 40: CONST integer(7) + 42: CONST integer(10) + 48: EQ -- hash: 0xf10fc85f5e4d4547 + 46: ADD -- hash: 0x295c3e43863762b8 + 44: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 45: CONST integer(8) + 47: CONST integer(10) + 53: EQ -- hash: 0xdd3ae1a33336099f + 51: ADD -- hash: 0xd215c8ea99fc38a3 + 49: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 50: CONST integer(9) + 52: CONST integer(10) + 58: EQ -- hash: 0xc965fae7041ecdf7 + 56: ADD -- hash: 0x7acf5391adc10e8f + 54: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 55: CONST integer(10) + 57: CONST integer(10) + 63: EQ -- hash: 0xb591142ad907924f + 61: ADD -- hash: 0x2388de38c185e47b + 59: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 60: CONST integer(11) + 62: CONST integer(10) + 68: EQ -- hash: 0xa1bc2d6eadf056a7 + 66: ADD -- hash: 0xcc4268dfd54aba66 + 64: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 65: CONST integer(12) + 67: CONST integer(10) + 73: EQ -- hash: 0x8de746b282d91aff + 71: ADD -- hash: 0x74fbf386e90f9052 + 69: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 70: CONST integer(13) + 72: CONST integer(10) + 78: EQ -- hash: 0x7a125ff657c1df57 + 76: ADD -- hash: 0x1db57e2dfcd4663e + 74: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 75: CONST integer(14) + 77: CONST integer(10) + 83: EQ -- hash: 0x663d793a28aaa3af + 81: ADD -- hash: 0xc66f08d510993c29 + 79: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 80: CONST integer(15) + 82: CONST integer(10) + 88: EQ -- hash: 0x5268927dfd936807 + 86: ADD -- hash: 0x6f28937c245e1215 + 84: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 85: CONST integer(16) + 87: CONST integer(10) + 93: EQ -- hash: 0x3e93abc1d27c2c5f + 91: ADD -- hash: 0x17e21e233822e801 + 89: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 90: CONST integer(17) + 92: CONST integer(10) + 98: EQ -- hash: 0x2abec505a764f0b7 + 96: ADD -- hash: 0xc09ba8ca4fe7bdec + 94: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 95: CONST integer(18) + 97: CONST integer(10) + 103: EQ -- hash: 0x16e9de49784db50f + 101: ADD -- hash: 0x6955337163ac93d8 + 99: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 100: CONST integer(19) + 102: CONST integer(10) + 108: EQ -- hash: 0x314f78d4d367967 + 106: ADD -- hash: 0x120ebe18777169c4 + 104: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 105: CONST integer(20) + 107: CONST integer(10) + 113: EQ -- hash: 0xef4010d1221f3dbe + 111: ADD -- hash: 0xbac848bf8b363faf + 109: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 110: CONST integer(21) + 112: CONST integer(10) + 118: EQ -- hash: 0xdb6b2a14f7080216 + 116: ADD -- hash: 0x6381d3669efb159b + 114: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 115: CONST integer(22) + 117: CONST integer(10) + 123: EQ -- hash: 0xc7964358cbf0c66e + 121: ADD -- hash: 0xc3b5e0db2bfeb87 + 119: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 120: CONST integer(23) + 122: CONST integer(10) + 128: EQ -- hash: 0xb3c15c9c9cd98ac6 + 126: ADD -- hash: 0xb4f4e8b4c684c172 + 124: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 125: CONST integer(24) + 127: CONST integer(10) + 133: EQ -- hash: 0x9fec75e071c24f1e + 131: ADD -- hash: 0x5dae735bda49975e + 129: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 130: CONST integer(25) + 132: CONST integer(10) + 138: EQ -- hash: 0x8c178f2446ab1376 + 136: ADD -- hash: 0x667fe02ee0e6d4a + 134: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 135: CONST integer(26) + 137: CONST integer(10) + 143: EQ -- hash: 0x7842a8681b93d7ce + 141: ADD -- hash: 0xaf2188aa01d34335 + 139: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 140: CONST integer(27) + 142: CONST integer(10) + 148: EQ -- hash: 0x646dc1abec7c9c26 + 146: ADD -- hash: 0x57db135115981921 + 144: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 145: CONST integer(28) + 147: CONST integer(10) + 153: EQ -- hash: 0x5098daefc165607e + 151: ADD -- hash: 0x949df8295cef0d + 149: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 150: CONST integer(29) + 152: CONST integer(10) + 158: EQ -- hash: 0x3cc3f433964e24d6 + 156: ADD -- hash: 0xa94e289f3d21c4f8 + 154: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 155: CONST integer(30) + 157: CONST integer(10) + 163: EQ -- hash: 0x28ef0d776b36e92e + 161: ADD -- hash: 0x5207b34650e69ae4 + 159: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 160: CONST integer(31) + 162: CONST integer(10) + 168: EQ -- hash: 0x151a26bb3c1fad86 + 166: ADD -- hash: 0xfac13ded64ab70cf + 164: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 165: CONST integer(32) + 167: CONST integer(10) + 173: EQ -- hash: 0x1453fff110871de + 171: ADD -- hash: 0xa37ac894787046bb + 169: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 170: CONST integer(33) + 172: CONST integer(10) + 178: EQ -- hash: 0xed705942e5f13635 + 176: ADD -- hash: 0x4c34533b8c351ca7 + 174: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 175: CONST integer(34) + 177: CONST integer(10) + 183: EQ -- hash: 0xd99b7286bad9fa8d + 181: ADD -- hash: 0xf4eddde2a3f9f292 + 179: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 180: CONST integer(35) + 182: CONST integer(10) + 188: EQ -- hash: 0xc5c68bca8fc2bee5 + 186: ADD -- hash: 0x9da76889b7bec87e + 184: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 185: CONST integer(36) + 187: CONST integer(10) + 193: EQ -- hash: 0xb1f1a50e60ab833d + 191: ADD -- hash: 0x4660f330cb839e6a + 189: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 190: CONST integer(37) + 192: CONST integer(10) + 198: EQ -- hash: 0x9e1cbe5235944795 + 196: ADD -- hash: 0xef1a7dd7df487455 + 194: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 195: CONST integer(38) + 197: CONST integer(10) + 203: EQ -- hash: 0x8a47d7960a7d0bed + 201: ADD -- hash: 0x97d4087ef30d4a41 + 199: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 200: CONST integer(39) + 202: CONST integer(10) + 208: EQ -- hash: 0x7672f0d9df65d045 + 206: ADD -- hash: 0x408d932606d2202d + 204: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 205: CONST integer(40) + 207: CONST integer(10) + 213: EQ -- hash: 0x629e0a1db04e949d + 211: ADD -- hash: 0xe9471dcd1a96f618 + 209: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 210: CONST integer(41) + 212: CONST integer(10) + 218: EQ -- hash: 0x4ec92361853758f5 + 216: ADD -- hash: 0x9200a8742e5bcc04 + 214: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 215: CONST integer(42) + 217: CONST integer(10) + 223: EQ -- hash: 0x3af43ca55a201d4d + 221: ADD -- hash: 0x3aba331b4220a1f0 + 219: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 220: CONST integer(43) + 222: CONST integer(10) + 228: EQ -- hash: 0x271f55e92f08e1a5 + 226: ADD -- hash: 0xe373bdc255e577db + 224: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 225: CONST integer(44) + 227: CONST integer(10) + 233: EQ -- hash: 0x134a6f2d03f1a5fd + 231: ADD -- hash: 0x8c2d486969aa4dc7 + 229: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 230: CONST integer(45) + 232: CONST integer(10) + 238: EQ -- hash: 0xff758870d4da6a54 + 236: ADD -- hash: 0x34e6d3107d6f23b3 + 234: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 235: CONST integer(46) + 237: CONST integer(10) + 243: EQ -- hash: 0xeba0a1b4a9c32eac + 241: ADD -- hash: 0xdda05db79133f99e + 239: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 240: CONST integer(47) + 242: CONST integer(10) + 248: EQ -- hash: 0xd7cbbaf87eabf304 + 246: ADD -- hash: 0x8659e85ea4f8cf8a + 244: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 245: CONST integer(48) + 247: CONST integer(10) + 253: EQ -- hash: 0xc3f6d43c5394b75c + 251: ADD -- hash: 0x2f137305b8bda576 + 249: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 250: CONST integer(49) + 252: CONST integer(10) + 258: EQ -- hash: 0xb021ed80247d7bb4 + 256: ADD -- hash: 0xd7ccfdaccc827b61 + 254: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 255: CONST integer(50) + 257: CONST integer(10) + 263: EQ -- hash: 0x9c4d06c3f966400c + 261: ADD -- hash: 0x80868853e047514d + 259: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 260: CONST integer(51) + 262: CONST integer(10) + 268: EQ -- hash: 0x88782007ce4f0464 + 266: ADD -- hash: 0x294012faf40c2739 + 264: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 265: CONST integer(52) + 267: CONST integer(10) + 273: EQ -- hash: 0x74a3394ba337c8bc + 271: ADD -- hash: 0xd1f99da20bd0fd24 + 269: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 270: CONST integer(53) + 272: CONST integer(10) + 278: EQ -- hash: 0x60ce528f74208d14 + 276: ADD -- hash: 0x7ab328491f95d310 + 274: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 275: CONST integer(54) + 277: CONST integer(10) + 283: EQ -- hash: 0x4cf96bd34909516c + 281: ADD -- hash: 0x236cb2f0335aa8fc + 279: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 280: CONST integer(55) + 282: CONST integer(10) + 288: EQ -- hash: 0x392485171df215c4 + 286: ADD -- hash: 0xcc263d97471f7ee7 + 284: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 285: CONST integer(56) + 287: CONST integer(10) + 293: EQ -- hash: 0x254f9e5af2dada1c + 291: ADD -- hash: 0x74dfc83e5ae454d3 + 289: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 290: CONST integer(57) + 292: CONST integer(10) + 298: EQ -- hash: 0x117ab79ec7c39e74 + 296: ADD -- hash: 0x1d9952e56ea92abf + 294: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 295: CONST integer(58) + 297: CONST integer(10) + 303: EQ -- hash: 0xfda5d0e298ac62cb + 301: ADD -- hash: 0xc652dd8c826e00aa + 299: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 300: CONST integer(59) + 302: CONST integer(10) + 308: EQ -- hash: 0xe9d0ea266d952723 + 306: ADD -- hash: 0x6f0c68339632d696 + 304: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 305: CONST integer(60) + 307: CONST integer(10) + 313: EQ -- hash: 0xd5fc036a427deb7b + 311: ADD -- hash: 0x17c5f2daa9f7ac82 + 309: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 310: CONST integer(61) + 312: CONST integer(10) + 318: EQ -- hash: 0xc2271cae1766afd3 + 316: ADD -- hash: 0xc07f7d81bdbc826d + 314: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 315: CONST integer(62) + 317: CONST integer(10) + 323: EQ -- hash: 0xae5235f1e84f742b + 321: ADD -- hash: 0x69390828d1815859 + 319: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 320: CONST integer(63) + 322: CONST integer(10) + 328: EQ -- hash: 0x9a7d4f35bd383883 + 326: ADD -- hash: 0x11f292cfe5462e45 + 324: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 325: CONST integer(64) + 327: CONST integer(10) + 333: EQ -- hash: 0x86a868799220fcdb + 331: ADD -- hash: 0xbaac1d76f90b0430 + 329: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 330: CONST integer(65) + 332: CONST integer(10) + 338: EQ -- hash: 0x72d381bd6709c133 + 336: ADD -- hash: 0x6365a81e0ccfda1c + 334: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 335: CONST integer(66) + 337: CONST integer(10) + 343: EQ -- hash: 0x5efe9b013bf2858b + 341: ADD -- hash: 0xc1f32c52094b008 + 339: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 340: CONST integer(67) + 342: CONST integer(10) + 348: EQ -- hash: 0x4b29b4450cdb49e3 + 346: ADD -- hash: 0xb4d8bd6c345985f3 + 344: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 345: CONST integer(68) + 347: CONST integer(10) + 353: EQ -- hash: 0x3754cd88e1c40e3b + 351: ADD -- hash: 0x5d924813481e5bdf + 349: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 350: CONST integer(69) + 352: CONST integer(10) + 358: EQ -- hash: 0x237fe6ccb6acd293 + 356: ADD -- hash: 0x64bd2ba5fe331cb + 354: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 355: CONST integer(70) + 357: CONST integer(10) + 363: EQ -- hash: 0xfab00108b9596eb + 361: ADD -- hash: 0xaf055d6173a807b6 + 359: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 360: CONST integer(71) + 362: CONST integer(10) + 368: EQ -- hash: 0xfbd619545c7e5b42 + 366: ADD -- hash: 0x57bee808876cdda2 + 364: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 365: CONST integer(72) + 367: CONST integer(10) + 373: EQ -- hash: 0xe801329831671f9a + 371: ADD -- hash: 0x7872af9b31b38e + 369: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 370: CONST integer(73) + 372: CONST integer(10) + 378: EQ -- hash: 0xd42c4bdc064fe3f2 + 376: ADD -- hash: 0xa931fd56aef68979 + 374: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 375: CONST integer(74) + 377: CONST integer(10) + 383: EQ -- hash: 0xc057651fdb38a84a + 381: ADD -- hash: 0x51eb87fdc2bb5f65 + 379: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 380: CONST integer(75) + 382: CONST integer(10) + 388: EQ -- hash: 0xac827e63ac216ca2 + 386: ADD -- hash: 0xfaa512a4d6803550 + 384: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 385: CONST integer(76) + 387: CONST integer(10) + 393: EQ -- hash: 0x98ad97a7810a30fa + 391: ADD -- hash: 0xa35e9d4bea450b3c + 389: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 390: CONST integer(77) + 392: CONST integer(10) + 398: EQ -- hash: 0x84d8b0eb55f2f552 + 396: ADD -- hash: 0x4c1827f2fe09e128 + 394: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 395: CONST integer(78) + 397: CONST integer(10) + 403: EQ -- hash: 0x7103ca2f2adbb9aa + 401: ADD -- hash: 0xf4d1b29a11ceb713 + 399: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 400: CONST integer(79) + 402: CONST integer(10) + 408: EQ -- hash: 0x5d2ee372ffc47e02 + 406: ADD -- hash: 0x9d8b3d4125938cff + 404: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 405: CONST integer(80) + 407: CONST integer(10) + 413: EQ -- hash: 0x4959fcb6d0ad425a + 411: ADD -- hash: 0x4644c7e8395862eb + 409: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 410: CONST integer(81) + 412: CONST integer(10) + 418: EQ -- hash: 0x358515faa59606b2 + 416: ADD -- hash: 0xeefe528f4d1d38d6 + 414: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 415: CONST integer(82) + 417: CONST integer(10) + 423: EQ -- hash: 0x21b02f3e7a7ecb0a + 421: ADD -- hash: 0x97b7dd3660e20ec2 + 419: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 420: CONST integer(83) + 422: CONST integer(10) + 428: EQ -- hash: 0xddb48824f678f62 + 426: ADD -- hash: 0x407167dd74a6e4ae + 424: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 425: CONST integer(84) + 427: CONST integer(10) + 433: EQ -- hash: 0xfa0661c6205053b9 + 431: ADD -- hash: 0xe92af284886bba99 + 429: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 430: CONST integer(85) + 432: CONST integer(10) + 438: EQ -- hash: 0xe6317b09f5391811 + 436: ADD -- hash: 0x91e47d2b9c309085 + 434: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 435: CONST integer(86) + 437: CONST integer(10) + 443: EQ -- hash: 0xd25c944dca21dc69 + 441: ADD -- hash: 0x3a9e07d2b3f56671 + 439: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 440: CONST integer(87) + 442: CONST integer(10) + 448: EQ -- hash: 0xbe87ad919f0aa0c1 + 446: ADD -- hash: 0xe3579279c7ba3c5c + 444: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 445: CONST integer(88) + 447: CONST integer(10) + 453: EQ -- hash: 0xaab2c6d573f36519 + 451: ADD -- hash: 0x8c111d20db7f1248 + 449: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 450: CONST integer(89) + 452: CONST integer(10) + 458: EQ -- hash: 0x96dde01944dc2971 + 456: ADD -- hash: 0x34caa7c7ef43e834 + 454: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 455: CONST integer(90) + 457: CONST integer(10) + 463: EQ -- hash: 0x8308f95d19c4edc9 + 461: ADD -- hash: 0xdd84326f0308be1f + 459: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 460: CONST integer(91) + 462: CONST integer(10) + 468: EQ -- hash: 0x6f3412a0eeadb221 + 466: ADD -- hash: 0x863dbd1616cd940b + 464: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 465: CONST integer(92) + 467: CONST integer(10) + 473: EQ -- hash: 0x5b5f2be4c3967679 + 471: ADD -- hash: 0x2ef747bd2a9269f7 + 469: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 470: CONST integer(93) + 472: CONST integer(10) + 478: EQ -- hash: 0x478a4528947f3ad1 + 476: ADD -- hash: 0xd7b0d2643e573fe2 + 474: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 475: CONST integer(94) + 477: CONST integer(10) + 483: EQ -- hash: 0x33b55e6c6967ff29 + 481: ADD -- hash: 0x806a5d0b521c15ce + 479: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 480: CONST integer(95) + 482: CONST integer(10) + 488: EQ -- hash: 0x1fe077b03e50c381 + 486: ADD -- hash: 0x2923e7b265e0ebba + 484: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 485: CONST integer(96) + 487: CONST integer(10) + 493: EQ -- hash: 0xc0b90f4133987d9 + 491: ADD -- hash: 0xd1dd725979a5c1a5 + 489: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 490: CONST integer(97) + 492: CONST integer(10) + 498: EQ -- hash: 0xf836aa37e4224c30 + 496: ADD -- hash: 0x7a96fd008d6a9791 + 494: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 495: CONST integer(98) + 497: CONST integer(10) + 503: EQ -- hash: 0xe461c37bb90b1088 + 501: ADD -- hash: 0x235087a7a12f6d7d + 499: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 500: CONST integer(99) + 502: CONST integer(10) + 508: EQ -- hash: 0xd08cdcbf8df3d4e0 + 506: ADD -- hash: 0xcc0a124eb4f44368 + 504: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 505: CONST integer(100) + 507: CONST integer(10) + 513: EQ -- hash: 0xbcb7f60362dc9938 + 511: ADD -- hash: 0x74c39cf5c8b91954 + 509: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 510: CONST integer(101) + 512: CONST integer(10) + 518: EQ -- hash: 0xa8e30f4737c55d90 + 516: ADD -- hash: 0x1d7d279cdc7def40 + 514: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 515: CONST integer(102) + 517: CONST integer(10) + 523: EQ -- hash: 0x950e288b08ae21e8 + 521: ADD -- hash: 0xc636b243f042c52b + 519: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 520: CONST integer(103) + 522: CONST integer(10) + 528: EQ -- hash: 0x813941cedd96e640 + 526: ADD -- hash: 0x6ef03ceb04079b17 + 524: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 525: CONST integer(104) + 527: CONST integer(10) + diff --git a/lib/src/compiler/ir/tests/testdata/14.in b/lib/src/compiler/ir/tests/testdata/14.in new file mode 100644 index 000000000..6a0255ac8 --- /dev/null +++ b/lib/src/compiler/ir/tests/testdata/14.in @@ -0,0 +1,142 @@ +import "pe" + +rule test_1 { + condition: + for any i in (1..5) : ( + for any j in (1..5) : ( + for any k in (1..5) : ( + pe.number_of_sections > 0 or i == 3 or j == 4 + ) + ) + ) +} + +rule test_2 { + condition: + with x = 10 : ( + for any i in (1..5) : ( + x + 1 == 11 and i > 0 + ) + ) +} + +rule test_3 { + condition: + for any i in (0..pe.number_of_sections) : ( + pe.sections[i].name == ".text" and pe.number_of_sections > 0 + ) +} + +rule test_4 { + condition: + for any i in (1..5) : ( + for any j in (1..5) : ( + i + 0 == 10 and + i + 1 == 10 and + i + 2 == 10 and + i + 3 == 10 and + i + 4 == 10 and + i + 5 == 10 and + i + 6 == 10 and + i + 7 == 10 and + i + 8 == 10 and + i + 9 == 10 and + i + 10 == 10 and + i + 11 == 10 and + i + 12 == 10 and + i + 13 == 10 and + i + 14 == 10 and + i + 15 == 10 and + i + 16 == 10 and + i + 17 == 10 and + i + 18 == 10 and + i + 19 == 10 and + i + 20 == 10 and + i + 21 == 10 and + i + 22 == 10 and + i + 23 == 10 and + i + 24 == 10 and + i + 25 == 10 and + i + 26 == 10 and + i + 27 == 10 and + i + 28 == 10 and + i + 29 == 10 and + i + 30 == 10 and + i + 31 == 10 and + i + 32 == 10 and + i + 33 == 10 and + i + 34 == 10 and + i + 35 == 10 and + i + 36 == 10 and + i + 37 == 10 and + i + 38 == 10 and + i + 39 == 10 and + i + 40 == 10 and + i + 41 == 10 and + i + 42 == 10 and + i + 43 == 10 and + i + 44 == 10 and + i + 45 == 10 and + i + 46 == 10 and + i + 47 == 10 and + i + 48 == 10 and + i + 49 == 10 and + i + 50 == 10 and + i + 51 == 10 and + i + 52 == 10 and + i + 53 == 10 and + i + 54 == 10 and + i + 55 == 10 and + i + 56 == 10 and + i + 57 == 10 and + i + 58 == 10 and + i + 59 == 10 and + i + 60 == 10 and + i + 61 == 10 and + i + 62 == 10 and + i + 63 == 10 and + i + 64 == 10 and + i + 65 == 10 and + i + 66 == 10 and + i + 67 == 10 and + i + 68 == 10 and + i + 69 == 10 and + i + 70 == 10 and + i + 71 == 10 and + i + 72 == 10 and + i + 73 == 10 and + i + 74 == 10 and + i + 75 == 10 and + i + 76 == 10 and + i + 77 == 10 and + i + 78 == 10 and + i + 79 == 10 and + i + 80 == 10 and + i + 81 == 10 and + i + 82 == 10 and + i + 83 == 10 and + i + 84 == 10 and + i + 85 == 10 and + i + 86 == 10 and + i + 87 == 10 and + i + 88 == 10 and + i + 89 == 10 and + i + 90 == 10 and + i + 91 == 10 and + i + 92 == 10 and + i + 93 == 10 and + i + 94 == 10 and + i + 95 == 10 and + i + 96 == 10 and + i + 97 == 10 and + i + 98 == 10 and + i + 99 == 10 and + i + 100 == 10 and + i + 101 == 10 and + i + 102 == 10 and + i + 103 == 10 and + i + 104 == 10 and + true + ) + ) +} diff --git a/lib/src/compiler/ir/tests/testdata/14.ir b/lib/src/compiler/ir/tests/testdata/14.ir new file mode 100644 index 000000000..1240471e8 --- /dev/null +++ b/lib/src/compiler/ir/tests/testdata/14.ir @@ -0,0 +1,628 @@ +RULE test_1 + 20: FOR_IN -- hash: 0x72bf379da36225e5 + n: Var { frame_id: 1, ty: integer, index: 0 } + i: Var { frame_id: 1, ty: integer, index: 1 } + max_count: Var { frame_id: 1, ty: integer, index: 2 } + count: Var { frame_id: 1, ty: integer, index: 3 } + item: Var { frame_id: 1, ty: unknown, index: 4 } + 0: CONST integer(1) + 1: CONST integer(5) + 19: FOR_IN -- hash: 0xdaad33cf0baf0a64 + n: Var { frame_id: 2, ty: integer, index: 7 } + i: Var { frame_id: 2, ty: integer, index: 8 } + max_count: Var { frame_id: 2, ty: integer, index: 9 } + count: Var { frame_id: 2, ty: integer, index: 10 } + item: Var { frame_id: 2, ty: unknown, index: 11 } + 2: CONST integer(1) + 3: CONST integer(5) + 18: FOR_IN -- hash: 0x497c3d59939269bb + n: Var { frame_id: 3, ty: integer, index: 14 } + i: Var { frame_id: 3, ty: integer, index: 15 } + max_count: Var { frame_id: 3, ty: integer, index: 16 } + count: Var { frame_id: 3, ty: integer, index: 17 } + item: Var { frame_id: 3, ty: unknown, index: 18 } + 4: CONST integer(1) + 5: CONST integer(5) + 17: OR -- hash: 0x12919697ba229f76 + 10: GT -- hash: 0xc0fd295a9fa39fa9 + 8: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 6: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 7: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 9: CONST integer(0) + 13: EQ -- hash: 0xca7652cced0142e6 + 11: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 12: CONST integer(3) + 16: EQ -- hash: 0xdf5816c82bc02f3 + 14: SYMBOL Var { var: Var { frame_id: 2, ty: integer, index: 12 }, type_value: integer(unknown) } + 15: CONST integer(4) + +RULE test_2 + 13: WITH -- hash: 0x862ac2b588220f59 + 0: CONST integer(10) + 12: FOR_IN -- hash: 0xfb8fa06e0ec768d9 + n: Var { frame_id: 2, ty: integer, index: 1 } + i: Var { frame_id: 2, ty: integer, index: 2 } + max_count: Var { frame_id: 2, ty: integer, index: 3 } + count: Var { frame_id: 2, ty: integer, index: 4 } + item: Var { frame_id: 2, ty: unknown, index: 5 } + 1: CONST integer(1) + 2: CONST integer(5) + 11: AND -- hash: 0xf3506d7cd428c254 + 7: EQ -- hash: 0x8d45f5fbc7dba69a + 5: CONST integer(11) + 6: CONST integer(11) + 10: GT -- hash: 0x7fb3c7b6e648fdb1 + 8: SYMBOL Var { var: Var { frame_id: 2, ty: integer, index: 6 }, type_value: integer(unknown) } + 9: CONST integer(0) + +RULE test_3 + 19: FOR_IN -- hash: 0x9f80cf2da772b9f9 + n: Var { frame_id: 1, ty: integer, index: 0 } + i: Var { frame_id: 1, ty: integer, index: 1 } + max_count: Var { frame_id: 1, ty: integer, index: 2 } + count: Var { frame_id: 1, ty: integer, index: 3 } + item: Var { frame_id: 1, ty: unknown, index: 4 } + 0: CONST integer(0) + 3: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 1: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 2: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 18: AND -- hash: 0x4044f60b2b21d46 + 12: EQ -- hash: 0xd80bb6889bf5d23f + 10: FIELD_ACCESS -- hash: 0xf6f8e9b23f513dd1 + 8: LOOKUP -- hash: 0x7e699c8d78b13901 + 6: FIELD_ACCESS -- hash: 0xb93ff31706b0e381 + 4: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 5: SYMBOL Field { index: 49, is_root: false, type_value: array, acl: None, deprecation_notice: None } + 7: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 9: SYMBOL Field { index: 0, is_root: false, type_value: string(unknown), acl: None, deprecation_notice: None } + 11: CONST string(".text") + 17: GT -- hash: 0xc0fd295a9fa39fa9 + 15: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 13: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 14: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 16: CONST integer(0) + +RULE test_4 + 532: FOR_IN -- hash: 0x9955d895482ac2dd + n: Var { frame_id: 1, ty: integer, index: 0 } + i: Var { frame_id: 1, ty: integer, index: 1 } + max_count: Var { frame_id: 1, ty: integer, index: 2 } + count: Var { frame_id: 1, ty: integer, index: 3 } + item: Var { frame_id: 1, ty: unknown, index: 4 } + 0: CONST integer(1) + 1: CONST integer(5) + 531: FOR_IN -- hash: 0x39d3fce9735f69cd + n: Var { frame_id: 2, ty: integer, index: 7 } + i: Var { frame_id: 2, ty: integer, index: 8 } + max_count: Var { frame_id: 2, ty: integer, index: 9 } + count: Var { frame_id: 2, ty: integer, index: 10 } + item: Var { frame_id: 2, ty: unknown, index: 11 } + 2: CONST integer(1) + 3: CONST integer(5) + 530: AND -- hash: 0xa6c67725bbf1ce09 + 8: EQ -- hash: 0x8fb6fe40bf072288 + 6: ADD -- hash: 0xe38fe90ae410b35a + 4: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 5: CONST integer(0) + 7: CONST integer(10) + 13: EQ -- hash: 0x7be2178493efe6e0 + 11: ADD -- hash: 0x8c4973b1fbd58946 + 9: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 10: CONST integer(1) + 12: CONST integer(10) + 18: EQ -- hash: 0x680d30c864d8ab38 + 16: ADD -- hash: 0x3502fe590f9a5f32 + 14: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 15: CONST integer(2) + 17: CONST integer(10) + 23: EQ -- hash: 0x54384a0c39c16f90 + 21: ADD -- hash: 0xddbc8900235f351d + 19: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 20: CONST integer(3) + 22: CONST integer(10) + 28: EQ -- hash: 0x406363500eaa33e8 + 26: ADD -- hash: 0x867613a737240b09 + 24: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 25: CONST integer(4) + 27: CONST integer(10) + 33: EQ -- hash: 0x2c8e7c93e392f840 + 31: ADD -- hash: 0x2f2f9e4e4ae8e0f5 + 29: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 30: CONST integer(5) + 32: CONST integer(10) + 38: EQ -- hash: 0x18b995d7b47bbc98 + 36: ADD -- hash: 0xd7e928f55eadb6e0 + 34: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 35: CONST integer(6) + 37: CONST integer(10) + 43: EQ -- hash: 0x4e4af1b896480f0 + 41: ADD -- hash: 0x80a2b39c72728ccc + 39: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 40: CONST integer(7) + 42: CONST integer(10) + 48: EQ -- hash: 0xf10fc85f5e4d4547 + 46: ADD -- hash: 0x295c3e43863762b8 + 44: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 45: CONST integer(8) + 47: CONST integer(10) + 53: EQ -- hash: 0xdd3ae1a33336099f + 51: ADD -- hash: 0xd215c8ea99fc38a3 + 49: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 50: CONST integer(9) + 52: CONST integer(10) + 58: EQ -- hash: 0xc965fae7041ecdf7 + 56: ADD -- hash: 0x7acf5391adc10e8f + 54: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 55: CONST integer(10) + 57: CONST integer(10) + 63: EQ -- hash: 0xb591142ad907924f + 61: ADD -- hash: 0x2388de38c185e47b + 59: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 60: CONST integer(11) + 62: CONST integer(10) + 68: EQ -- hash: 0xa1bc2d6eadf056a7 + 66: ADD -- hash: 0xcc4268dfd54aba66 + 64: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 65: CONST integer(12) + 67: CONST integer(10) + 73: EQ -- hash: 0x8de746b282d91aff + 71: ADD -- hash: 0x74fbf386e90f9052 + 69: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 70: CONST integer(13) + 72: CONST integer(10) + 78: EQ -- hash: 0x7a125ff657c1df57 + 76: ADD -- hash: 0x1db57e2dfcd4663e + 74: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 75: CONST integer(14) + 77: CONST integer(10) + 83: EQ -- hash: 0x663d793a28aaa3af + 81: ADD -- hash: 0xc66f08d510993c29 + 79: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 80: CONST integer(15) + 82: CONST integer(10) + 88: EQ -- hash: 0x5268927dfd936807 + 86: ADD -- hash: 0x6f28937c245e1215 + 84: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 85: CONST integer(16) + 87: CONST integer(10) + 93: EQ -- hash: 0x3e93abc1d27c2c5f + 91: ADD -- hash: 0x17e21e233822e801 + 89: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 90: CONST integer(17) + 92: CONST integer(10) + 98: EQ -- hash: 0x2abec505a764f0b7 + 96: ADD -- hash: 0xc09ba8ca4fe7bdec + 94: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 95: CONST integer(18) + 97: CONST integer(10) + 103: EQ -- hash: 0x16e9de49784db50f + 101: ADD -- hash: 0x6955337163ac93d8 + 99: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 100: CONST integer(19) + 102: CONST integer(10) + 108: EQ -- hash: 0x314f78d4d367967 + 106: ADD -- hash: 0x120ebe18777169c4 + 104: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 105: CONST integer(20) + 107: CONST integer(10) + 113: EQ -- hash: 0xef4010d1221f3dbe + 111: ADD -- hash: 0xbac848bf8b363faf + 109: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 110: CONST integer(21) + 112: CONST integer(10) + 118: EQ -- hash: 0xdb6b2a14f7080216 + 116: ADD -- hash: 0x6381d3669efb159b + 114: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 115: CONST integer(22) + 117: CONST integer(10) + 123: EQ -- hash: 0xc7964358cbf0c66e + 121: ADD -- hash: 0xc3b5e0db2bfeb87 + 119: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 120: CONST integer(23) + 122: CONST integer(10) + 128: EQ -- hash: 0xb3c15c9c9cd98ac6 + 126: ADD -- hash: 0xb4f4e8b4c684c172 + 124: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 125: CONST integer(24) + 127: CONST integer(10) + 133: EQ -- hash: 0x9fec75e071c24f1e + 131: ADD -- hash: 0x5dae735bda49975e + 129: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 130: CONST integer(25) + 132: CONST integer(10) + 138: EQ -- hash: 0x8c178f2446ab1376 + 136: ADD -- hash: 0x667fe02ee0e6d4a + 134: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 135: CONST integer(26) + 137: CONST integer(10) + 143: EQ -- hash: 0x7842a8681b93d7ce + 141: ADD -- hash: 0xaf2188aa01d34335 + 139: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 140: CONST integer(27) + 142: CONST integer(10) + 148: EQ -- hash: 0x646dc1abec7c9c26 + 146: ADD -- hash: 0x57db135115981921 + 144: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 145: CONST integer(28) + 147: CONST integer(10) + 153: EQ -- hash: 0x5098daefc165607e + 151: ADD -- hash: 0x949df8295cef0d + 149: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 150: CONST integer(29) + 152: CONST integer(10) + 158: EQ -- hash: 0x3cc3f433964e24d6 + 156: ADD -- hash: 0xa94e289f3d21c4f8 + 154: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 155: CONST integer(30) + 157: CONST integer(10) + 163: EQ -- hash: 0x28ef0d776b36e92e + 161: ADD -- hash: 0x5207b34650e69ae4 + 159: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 160: CONST integer(31) + 162: CONST integer(10) + 168: EQ -- hash: 0x151a26bb3c1fad86 + 166: ADD -- hash: 0xfac13ded64ab70cf + 164: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 165: CONST integer(32) + 167: CONST integer(10) + 173: EQ -- hash: 0x1453fff110871de + 171: ADD -- hash: 0xa37ac894787046bb + 169: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 170: CONST integer(33) + 172: CONST integer(10) + 178: EQ -- hash: 0xed705942e5f13635 + 176: ADD -- hash: 0x4c34533b8c351ca7 + 174: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 175: CONST integer(34) + 177: CONST integer(10) + 183: EQ -- hash: 0xd99b7286bad9fa8d + 181: ADD -- hash: 0xf4eddde2a3f9f292 + 179: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 180: CONST integer(35) + 182: CONST integer(10) + 188: EQ -- hash: 0xc5c68bca8fc2bee5 + 186: ADD -- hash: 0x9da76889b7bec87e + 184: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 185: CONST integer(36) + 187: CONST integer(10) + 193: EQ -- hash: 0xb1f1a50e60ab833d + 191: ADD -- hash: 0x4660f330cb839e6a + 189: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 190: CONST integer(37) + 192: CONST integer(10) + 198: EQ -- hash: 0x9e1cbe5235944795 + 196: ADD -- hash: 0xef1a7dd7df487455 + 194: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 195: CONST integer(38) + 197: CONST integer(10) + 203: EQ -- hash: 0x8a47d7960a7d0bed + 201: ADD -- hash: 0x97d4087ef30d4a41 + 199: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 200: CONST integer(39) + 202: CONST integer(10) + 208: EQ -- hash: 0x7672f0d9df65d045 + 206: ADD -- hash: 0x408d932606d2202d + 204: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 205: CONST integer(40) + 207: CONST integer(10) + 213: EQ -- hash: 0x629e0a1db04e949d + 211: ADD -- hash: 0xe9471dcd1a96f618 + 209: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 210: CONST integer(41) + 212: CONST integer(10) + 218: EQ -- hash: 0x4ec92361853758f5 + 216: ADD -- hash: 0x9200a8742e5bcc04 + 214: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 215: CONST integer(42) + 217: CONST integer(10) + 223: EQ -- hash: 0x3af43ca55a201d4d + 221: ADD -- hash: 0x3aba331b4220a1f0 + 219: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 220: CONST integer(43) + 222: CONST integer(10) + 228: EQ -- hash: 0x271f55e92f08e1a5 + 226: ADD -- hash: 0xe373bdc255e577db + 224: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 225: CONST integer(44) + 227: CONST integer(10) + 233: EQ -- hash: 0x134a6f2d03f1a5fd + 231: ADD -- hash: 0x8c2d486969aa4dc7 + 229: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 230: CONST integer(45) + 232: CONST integer(10) + 238: EQ -- hash: 0xff758870d4da6a54 + 236: ADD -- hash: 0x34e6d3107d6f23b3 + 234: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 235: CONST integer(46) + 237: CONST integer(10) + 243: EQ -- hash: 0xeba0a1b4a9c32eac + 241: ADD -- hash: 0xdda05db79133f99e + 239: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 240: CONST integer(47) + 242: CONST integer(10) + 248: EQ -- hash: 0xd7cbbaf87eabf304 + 246: ADD -- hash: 0x8659e85ea4f8cf8a + 244: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 245: CONST integer(48) + 247: CONST integer(10) + 253: EQ -- hash: 0xc3f6d43c5394b75c + 251: ADD -- hash: 0x2f137305b8bda576 + 249: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 250: CONST integer(49) + 252: CONST integer(10) + 258: EQ -- hash: 0xb021ed80247d7bb4 + 256: ADD -- hash: 0xd7ccfdaccc827b61 + 254: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 255: CONST integer(50) + 257: CONST integer(10) + 263: EQ -- hash: 0x9c4d06c3f966400c + 261: ADD -- hash: 0x80868853e047514d + 259: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 260: CONST integer(51) + 262: CONST integer(10) + 268: EQ -- hash: 0x88782007ce4f0464 + 266: ADD -- hash: 0x294012faf40c2739 + 264: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 265: CONST integer(52) + 267: CONST integer(10) + 273: EQ -- hash: 0x74a3394ba337c8bc + 271: ADD -- hash: 0xd1f99da20bd0fd24 + 269: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 270: CONST integer(53) + 272: CONST integer(10) + 278: EQ -- hash: 0x60ce528f74208d14 + 276: ADD -- hash: 0x7ab328491f95d310 + 274: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 275: CONST integer(54) + 277: CONST integer(10) + 283: EQ -- hash: 0x4cf96bd34909516c + 281: ADD -- hash: 0x236cb2f0335aa8fc + 279: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 280: CONST integer(55) + 282: CONST integer(10) + 288: EQ -- hash: 0x392485171df215c4 + 286: ADD -- hash: 0xcc263d97471f7ee7 + 284: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 285: CONST integer(56) + 287: CONST integer(10) + 293: EQ -- hash: 0x254f9e5af2dada1c + 291: ADD -- hash: 0x74dfc83e5ae454d3 + 289: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 290: CONST integer(57) + 292: CONST integer(10) + 298: EQ -- hash: 0x117ab79ec7c39e74 + 296: ADD -- hash: 0x1d9952e56ea92abf + 294: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 295: CONST integer(58) + 297: CONST integer(10) + 303: EQ -- hash: 0xfda5d0e298ac62cb + 301: ADD -- hash: 0xc652dd8c826e00aa + 299: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 300: CONST integer(59) + 302: CONST integer(10) + 308: EQ -- hash: 0xe9d0ea266d952723 + 306: ADD -- hash: 0x6f0c68339632d696 + 304: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 305: CONST integer(60) + 307: CONST integer(10) + 313: EQ -- hash: 0xd5fc036a427deb7b + 311: ADD -- hash: 0x17c5f2daa9f7ac82 + 309: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 310: CONST integer(61) + 312: CONST integer(10) + 318: EQ -- hash: 0xc2271cae1766afd3 + 316: ADD -- hash: 0xc07f7d81bdbc826d + 314: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 315: CONST integer(62) + 317: CONST integer(10) + 323: EQ -- hash: 0xae5235f1e84f742b + 321: ADD -- hash: 0x69390828d1815859 + 319: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 320: CONST integer(63) + 322: CONST integer(10) + 328: EQ -- hash: 0x9a7d4f35bd383883 + 326: ADD -- hash: 0x11f292cfe5462e45 + 324: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 325: CONST integer(64) + 327: CONST integer(10) + 333: EQ -- hash: 0x86a868799220fcdb + 331: ADD -- hash: 0xbaac1d76f90b0430 + 329: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 330: CONST integer(65) + 332: CONST integer(10) + 338: EQ -- hash: 0x72d381bd6709c133 + 336: ADD -- hash: 0x6365a81e0ccfda1c + 334: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 335: CONST integer(66) + 337: CONST integer(10) + 343: EQ -- hash: 0x5efe9b013bf2858b + 341: ADD -- hash: 0xc1f32c52094b008 + 339: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 340: CONST integer(67) + 342: CONST integer(10) + 348: EQ -- hash: 0x4b29b4450cdb49e3 + 346: ADD -- hash: 0xb4d8bd6c345985f3 + 344: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 345: CONST integer(68) + 347: CONST integer(10) + 353: EQ -- hash: 0x3754cd88e1c40e3b + 351: ADD -- hash: 0x5d924813481e5bdf + 349: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 350: CONST integer(69) + 352: CONST integer(10) + 358: EQ -- hash: 0x237fe6ccb6acd293 + 356: ADD -- hash: 0x64bd2ba5fe331cb + 354: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 355: CONST integer(70) + 357: CONST integer(10) + 363: EQ -- hash: 0xfab00108b9596eb + 361: ADD -- hash: 0xaf055d6173a807b6 + 359: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 360: CONST integer(71) + 362: CONST integer(10) + 368: EQ -- hash: 0xfbd619545c7e5b42 + 366: ADD -- hash: 0x57bee808876cdda2 + 364: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 365: CONST integer(72) + 367: CONST integer(10) + 373: EQ -- hash: 0xe801329831671f9a + 371: ADD -- hash: 0x7872af9b31b38e + 369: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 370: CONST integer(73) + 372: CONST integer(10) + 378: EQ -- hash: 0xd42c4bdc064fe3f2 + 376: ADD -- hash: 0xa931fd56aef68979 + 374: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 375: CONST integer(74) + 377: CONST integer(10) + 383: EQ -- hash: 0xc057651fdb38a84a + 381: ADD -- hash: 0x51eb87fdc2bb5f65 + 379: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 380: CONST integer(75) + 382: CONST integer(10) + 388: EQ -- hash: 0xac827e63ac216ca2 + 386: ADD -- hash: 0xfaa512a4d6803550 + 384: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 385: CONST integer(76) + 387: CONST integer(10) + 393: EQ -- hash: 0x98ad97a7810a30fa + 391: ADD -- hash: 0xa35e9d4bea450b3c + 389: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 390: CONST integer(77) + 392: CONST integer(10) + 398: EQ -- hash: 0x84d8b0eb55f2f552 + 396: ADD -- hash: 0x4c1827f2fe09e128 + 394: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 395: CONST integer(78) + 397: CONST integer(10) + 403: EQ -- hash: 0x7103ca2f2adbb9aa + 401: ADD -- hash: 0xf4d1b29a11ceb713 + 399: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 400: CONST integer(79) + 402: CONST integer(10) + 408: EQ -- hash: 0x5d2ee372ffc47e02 + 406: ADD -- hash: 0x9d8b3d4125938cff + 404: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 405: CONST integer(80) + 407: CONST integer(10) + 413: EQ -- hash: 0x4959fcb6d0ad425a + 411: ADD -- hash: 0x4644c7e8395862eb + 409: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 410: CONST integer(81) + 412: CONST integer(10) + 418: EQ -- hash: 0x358515faa59606b2 + 416: ADD -- hash: 0xeefe528f4d1d38d6 + 414: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 415: CONST integer(82) + 417: CONST integer(10) + 423: EQ -- hash: 0x21b02f3e7a7ecb0a + 421: ADD -- hash: 0x97b7dd3660e20ec2 + 419: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 420: CONST integer(83) + 422: CONST integer(10) + 428: EQ -- hash: 0xddb48824f678f62 + 426: ADD -- hash: 0x407167dd74a6e4ae + 424: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 425: CONST integer(84) + 427: CONST integer(10) + 433: EQ -- hash: 0xfa0661c6205053b9 + 431: ADD -- hash: 0xe92af284886bba99 + 429: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 430: CONST integer(85) + 432: CONST integer(10) + 438: EQ -- hash: 0xe6317b09f5391811 + 436: ADD -- hash: 0x91e47d2b9c309085 + 434: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 435: CONST integer(86) + 437: CONST integer(10) + 443: EQ -- hash: 0xd25c944dca21dc69 + 441: ADD -- hash: 0x3a9e07d2b3f56671 + 439: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 440: CONST integer(87) + 442: CONST integer(10) + 448: EQ -- hash: 0xbe87ad919f0aa0c1 + 446: ADD -- hash: 0xe3579279c7ba3c5c + 444: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 445: CONST integer(88) + 447: CONST integer(10) + 453: EQ -- hash: 0xaab2c6d573f36519 + 451: ADD -- hash: 0x8c111d20db7f1248 + 449: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 450: CONST integer(89) + 452: CONST integer(10) + 458: EQ -- hash: 0x96dde01944dc2971 + 456: ADD -- hash: 0x34caa7c7ef43e834 + 454: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 455: CONST integer(90) + 457: CONST integer(10) + 463: EQ -- hash: 0x8308f95d19c4edc9 + 461: ADD -- hash: 0xdd84326f0308be1f + 459: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 460: CONST integer(91) + 462: CONST integer(10) + 468: EQ -- hash: 0x6f3412a0eeadb221 + 466: ADD -- hash: 0x863dbd1616cd940b + 464: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 465: CONST integer(92) + 467: CONST integer(10) + 473: EQ -- hash: 0x5b5f2be4c3967679 + 471: ADD -- hash: 0x2ef747bd2a9269f7 + 469: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 470: CONST integer(93) + 472: CONST integer(10) + 478: EQ -- hash: 0x478a4528947f3ad1 + 476: ADD -- hash: 0xd7b0d2643e573fe2 + 474: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 475: CONST integer(94) + 477: CONST integer(10) + 483: EQ -- hash: 0x33b55e6c6967ff29 + 481: ADD -- hash: 0x806a5d0b521c15ce + 479: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 480: CONST integer(95) + 482: CONST integer(10) + 488: EQ -- hash: 0x1fe077b03e50c381 + 486: ADD -- hash: 0x2923e7b265e0ebba + 484: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 485: CONST integer(96) + 487: CONST integer(10) + 493: EQ -- hash: 0xc0b90f4133987d9 + 491: ADD -- hash: 0xd1dd725979a5c1a5 + 489: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 490: CONST integer(97) + 492: CONST integer(10) + 498: EQ -- hash: 0xf836aa37e4224c30 + 496: ADD -- hash: 0x7a96fd008d6a9791 + 494: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 495: CONST integer(98) + 497: CONST integer(10) + 503: EQ -- hash: 0xe461c37bb90b1088 + 501: ADD -- hash: 0x235087a7a12f6d7d + 499: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 500: CONST integer(99) + 502: CONST integer(10) + 508: EQ -- hash: 0xd08cdcbf8df3d4e0 + 506: ADD -- hash: 0xcc0a124eb4f44368 + 504: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 505: CONST integer(100) + 507: CONST integer(10) + 513: EQ -- hash: 0xbcb7f60362dc9938 + 511: ADD -- hash: 0x74c39cf5c8b91954 + 509: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 510: CONST integer(101) + 512: CONST integer(10) + 518: EQ -- hash: 0xa8e30f4737c55d90 + 516: ADD -- hash: 0x1d7d279cdc7def40 + 514: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 515: CONST integer(102) + 517: CONST integer(10) + 523: EQ -- hash: 0x950e288b08ae21e8 + 521: ADD -- hash: 0xc636b243f042c52b + 519: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 520: CONST integer(103) + 522: CONST integer(10) + 528: EQ -- hash: 0x813941cedd96e640 + 526: ADD -- hash: 0x6ef03ceb04079b17 + 524: SYMBOL Var { var: Var { frame_id: 1, ty: integer, index: 5 }, type_value: integer(unknown) } + 525: CONST integer(104) + 527: CONST integer(10) + diff --git a/lib/src/compiler/ir/tests/testdata/15.cse.ir b/lib/src/compiler/ir/tests/testdata/15.cse.ir new file mode 100644 index 000000000..ce8858d26 --- /dev/null +++ b/lib/src/compiler/ir/tests/testdata/15.cse.ir @@ -0,0 +1,193 @@ +RULE test + 171: AND -- hash: 0x550720c3956843bf + 0: PATTERN_MATCH PatternIdx(0) -- hash: 0x5a276c8d75077d2b + 2: PATTERN_MATCH PatternIdx(0) AT -- hash: 0xfb7f3424e7aabb50 + 1: CONST integer(0) + 5: PATTERN_MATCH PatternIdx(0) IN -- hash: 0x1a40dae1e637aa39 + 3: CONST integer(0) + 4: CONST integer(100) + 8: GT -- hash: 0xe14c02d2ca38c7fe + 6: PATTERN_COUNT PatternIdx(0) -- hash: 0x295099eb5fc21fe8 + 7: CONST integer(0) + 13: GT -- hash: 0x92f8c6f7e54b02b8 + 11: PATTERN_COUNT PatternIdx(0) IN -- hash: 0x4343c02e3b7c252b + 9: CONST integer(0) + 10: CONST integer(100) + 12: CONST integer(0) + 16: GT -- hash: 0x2c7be90e3169df71 + 14: PATTERN_OFFSET PatternIdx(0) -- hash: 0xf879c749467cc2a4 + 15: CONST integer(0) + 20: GT -- hash: 0x8bb5a93875bc3546 + 18: PATTERN_OFFSET PatternIdx(0) INDEX -- hash: 0x3a988b42c9d1c021 + 17: CONST integer(1) + 19: CONST integer(0) + 23: GT -- hash: 0x77abcf49989af6e3 + 21: PATTERN_LENGTH PatternIdx(0) -- hash: 0xc7a2f4a72d376561 + 22: CONST integer(0) + 27: GT -- hash: 0xf87b38b95dae2020 + 25: PATTERN_LENGTH PatternIdx(0) INDEX -- hash: 0x85c8717e3102d793 + 24: CONST integer(1) + 26: CONST integer(0) + 35: FOR_OF -- hash: 0x987e0cb4f38e5d95 + n: Var { frame_id: 1, ty: integer, index: 0 } + i: Var { frame_id: 1, ty: integer, index: 1 } + max_count: Var { frame_id: 1, ty: integer, index: 2 } + count: Var { frame_id: 1, ty: integer, index: 3 } + item: Var { frame_id: 1, ty: integer, index: 4 } + 34: AND -- hash: 0x3c966b1c6d560e68 + 28: PATTERN_MATCH Var { var: Var { frame_id: 1, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x7568d28f12aefce0 + 30: PATTERN_MATCH Var { var: Var { frame_id: 1, ty: integer, index: 4 }, type_value: integer(unknown) } AT -- hash: 0x1951a046c05c8a50 + 29: CONST integer(0) + 33: PATTERN_MATCH Var { var: Var { frame_id: 1, ty: integer, index: 4 }, type_value: integer(unknown) } IN -- hash: 0x31b056800031c05a + 31: CONST integer(0) + 32: CONST integer(100) + 45: FOR_OF -- hash: 0x2a6ca1a1aeced4d6 + n: Var { frame_id: 2, ty: integer, index: 0 } + i: Var { frame_id: 2, ty: integer, index: 1 } + max_count: Var { frame_id: 2, ty: integer, index: 2 } + count: Var { frame_id: 2, ty: integer, index: 3 } + item: Var { frame_id: 2, ty: integer, index: 4 } + 44: AND -- hash: 0xce850009289685a8 + 38: GT -- hash: 0xadc66c0f48e750e7 + 36: PATTERN_COUNT Var { var: Var { frame_id: 2, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x12da6e911e4b1855 + 37: CONST integer(0) + 43: GT -- hash: 0x84e68ea465523c78 + 41: PATTERN_COUNT Var { var: Var { frame_id: 2, ty: integer, index: 4 }, type_value: integer(unknown) } IN -- hash: 0xc336d1bfa8f9804 + 39: CONST integer(0) + 40: CONST integer(100) + 42: CONST integer(0) + 54: FOR_OF -- hash: 0xb649de6a3c0b0603 + n: Var { frame_id: 3, ty: integer, index: 0 } + i: Var { frame_id: 3, ty: integer, index: 1 } + max_count: Var { frame_id: 3, ty: integer, index: 2 } + count: Var { frame_id: 3, ty: integer, index: 3 } + item: Var { frame_id: 3, ty: integer, index: 4 } + 53: AND -- hash: 0xada51cbb798a9af6 + 48: GT -- hash: 0xeeaeb61296e7af4e + 46: PATTERN_OFFSET Var { var: Var { frame_id: 3, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0xb04c0a9329e733c9 + 47: CONST integer(0) + 52: GT -- hash: 0x77ae50bc98adf661 + 50: PATTERN_OFFSET Var { var: Var { frame_id: 3, ty: integer, index: 4 }, type_value: integer(unknown) } INDEX -- hash: 0x43dbbef46c221d0a + 49: CONST integer(1) + 51: CONST integer(0) + 63: FOR_OF -- hash: 0xe68ac61aa5953ab8 + n: Var { frame_id: 4, ty: integer, index: 0 } + i: Var { frame_id: 4, ty: integer, index: 1 } + max_count: Var { frame_id: 4, ty: integer, index: 2 } + count: Var { frame_id: 4, ty: integer, index: 3 } + item: Var { frame_id: 4, ty: integer, index: 4 } + 62: AND -- hash: 0xdde6046be314cfab + 57: GT -- hash: 0x2f970015e0e80db6 + 55: PATTERN_LENGTH Var { var: Var { frame_id: 4, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x4dbda69535834f3e + 56: CONST integer(0) + 61: GT -- hash: 0x95f4118d25b93df3 + 59: PATTERN_LENGTH Var { var: Var { frame_id: 4, ty: integer, index: 4 }, type_value: integer(unknown) } INDEX -- hash: 0x84c408f7ba227b71 + 58: CONST integer(1) + 60: CONST integer(0) + 65: FOR_OF -- hash: 0xe716d23849fe7860 + n: Var { frame_id: 5, ty: integer, index: 0 } + i: Var { frame_id: 5, ty: integer, index: 1 } + max_count: Var { frame_id: 5, ty: integer, index: 2 } + count: Var { frame_id: 5, ty: integer, index: 3 } + item: Var { frame_id: 5, ty: integer, index: 4 } + 64: PATTERN_MATCH Var { var: Var { frame_id: 5, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x43f441662202a59c + 68: OF -- hash: 0xd907e19beae11f88 + 67: CONST boolean(false) + 66: CONST boolean(true) + 69: OF -- hash: 0xc1af08cf16d07e7 + 72: FOR_OF -- hash: 0xa985997e5b03a6d7 + n: Var { frame_id: 8, ty: integer, index: 0 } + i: Var { frame_id: 8, ty: integer, index: 1 } + max_count: Var { frame_id: 8, ty: integer, index: 2 } + count: Var { frame_id: 8, ty: integer, index: 3 } + item: Var { frame_id: 8, ty: integer, index: 4 } + 70: CONST integer(1) + 71: PATTERN_MATCH Var { var: Var { frame_id: 8, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x1edcd4876d816429 + 80: FOR_IN -- hash: 0x808e64d8eb48ab96 + n: Var { frame_id: 9, ty: integer, index: 0 } + i: Var { frame_id: 9, ty: integer, index: 1 } + max_count: Var { frame_id: 9, ty: integer, index: 2 } + count: Var { frame_id: 9, ty: integer, index: 3 } + item: Var { frame_id: 9, ty: unknown, index: 4 } + 73: CONST integer(1) + 74: CONST integer(5) + 79: EQ -- hash: 0xe92c004f9190e2ec + 77: ADD -- hash: 0xb9090c9f9899e70f + 75: SYMBOL Var { var: Var { frame_id: 9, ty: integer, index: 5 }, type_value: integer(unknown) } + 76: CONST integer(1) + 78: CONST integer(2) + 84: NE -- hash: 0x92df6290b941eceb + 82: CONST integer(-2) + 83: CONST integer(0) + 89: EQ -- hash: 0x2772eae3cc6605b3 + 87: CONST integer(0) + 88: CONST integer(0) + 94: EQ -- hash: 0xe620d6a4866ed47d + 92: CONST integer(3) + 93: CONST integer(3) + 99: EQ -- hash: 0xe620d6a4866ed47d + 97: CONST integer(3) + 98: CONST integer(3) + 102: LT -- hash: 0xc2cd260920d8212b + 100: CONST integer(-1) + 101: CONST integer(0) + 107: EQ -- hash: 0x513c32b99dc13a3a + 105: CONST integer(2) + 106: CONST integer(2) + 112: EQ -- hash: 0xa4cec2653c77a348 + 110: CONST integer(6) + 111: CONST integer(6) + 117: EQ -- hash: 0x37b6700f88d99369 + 115: DIV -- hash: 0xe3d346244ff8cc57 + 113: CONST integer(6) + 114: CONST integer(2) + 116: CONST integer(3) + 122: EQ -- hash: 0x1a81b6c621408d88 + 120: MOD -- hash: 0x3b6ad7150dbd77e8 + 118: CONST integer(5) + 119: CONST integer(2) + 121: CONST integer(1) + 127: EQ -- hash: 0x7b057a8f6f1c6ec1 + 125: CONST integer(4) + 126: CONST integer(4) + 132: EQ -- hash: 0x7b057a8f6f1c6ec1 + 130: CONST integer(4) + 131: CONST integer(4) + 135: CONTAINS -- hash: 0x660fc7ce052cb681 + 133: CONST string("foo") + 134: CONST string("f") + 138: ICONTAINS -- hash: 0x377f84bcc413903b + 136: CONST string("foo") + 137: CONST string("F") + 141: STARTS_WITH -- hash: 0xd2d5574eed1ea15b + 139: CONST string("foo") + 140: CONST string("f") + 144: ISTARTS_WITH -- hash: 0xa445143dac057b15 + 142: CONST string("foo") + 143: CONST string("F") + 147: ENDS_WITH -- hash: 0xaf9269de21654fff + 145: CONST string("foo") + 146: CONST string("o") + 150: IENDS_WITH -- hash: 0xf81ff13400fb2d99 + 148: CONST string("foo") + 149: CONST string("O") + 153: IEQUALS -- hash: 0x59f750b89300b823 + 151: CONST string("foo") + 152: CONST string("FOO") + 157: CONTAINS -- hash: 0x69900714c5de042c + 154: CONST string("foo") + 156: CONST string("foo") + 161: DEFINED -- hash: 0xc649804070cd56ad + 160: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 158: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 159: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 170: EQ -- hash: 0xc86bbac0d41a5b9c + 168: FIELD_ACCESS -- hash: 0x6af92ddf1af8a3f2 + 166: LOOKUP -- hash: 0xb7e6fdca077aa568 + 164: FIELD_ACCESS -- hash: 0xb93ff31706b0e381 + 162: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 163: SYMBOL Field { index: 49, is_root: false, type_value: array, acl: None, deprecation_notice: None } + 165: CONST integer(0) + 167: SYMBOL Field { index: 0, is_root: false, type_value: string(unknown), acl: None, deprecation_notice: None } + 169: CONST string(".text") + diff --git a/lib/src/compiler/ir/tests/testdata/15.hoisting.ir b/lib/src/compiler/ir/tests/testdata/15.hoisting.ir new file mode 100644 index 000000000..ce8858d26 --- /dev/null +++ b/lib/src/compiler/ir/tests/testdata/15.hoisting.ir @@ -0,0 +1,193 @@ +RULE test + 171: AND -- hash: 0x550720c3956843bf + 0: PATTERN_MATCH PatternIdx(0) -- hash: 0x5a276c8d75077d2b + 2: PATTERN_MATCH PatternIdx(0) AT -- hash: 0xfb7f3424e7aabb50 + 1: CONST integer(0) + 5: PATTERN_MATCH PatternIdx(0) IN -- hash: 0x1a40dae1e637aa39 + 3: CONST integer(0) + 4: CONST integer(100) + 8: GT -- hash: 0xe14c02d2ca38c7fe + 6: PATTERN_COUNT PatternIdx(0) -- hash: 0x295099eb5fc21fe8 + 7: CONST integer(0) + 13: GT -- hash: 0x92f8c6f7e54b02b8 + 11: PATTERN_COUNT PatternIdx(0) IN -- hash: 0x4343c02e3b7c252b + 9: CONST integer(0) + 10: CONST integer(100) + 12: CONST integer(0) + 16: GT -- hash: 0x2c7be90e3169df71 + 14: PATTERN_OFFSET PatternIdx(0) -- hash: 0xf879c749467cc2a4 + 15: CONST integer(0) + 20: GT -- hash: 0x8bb5a93875bc3546 + 18: PATTERN_OFFSET PatternIdx(0) INDEX -- hash: 0x3a988b42c9d1c021 + 17: CONST integer(1) + 19: CONST integer(0) + 23: GT -- hash: 0x77abcf49989af6e3 + 21: PATTERN_LENGTH PatternIdx(0) -- hash: 0xc7a2f4a72d376561 + 22: CONST integer(0) + 27: GT -- hash: 0xf87b38b95dae2020 + 25: PATTERN_LENGTH PatternIdx(0) INDEX -- hash: 0x85c8717e3102d793 + 24: CONST integer(1) + 26: CONST integer(0) + 35: FOR_OF -- hash: 0x987e0cb4f38e5d95 + n: Var { frame_id: 1, ty: integer, index: 0 } + i: Var { frame_id: 1, ty: integer, index: 1 } + max_count: Var { frame_id: 1, ty: integer, index: 2 } + count: Var { frame_id: 1, ty: integer, index: 3 } + item: Var { frame_id: 1, ty: integer, index: 4 } + 34: AND -- hash: 0x3c966b1c6d560e68 + 28: PATTERN_MATCH Var { var: Var { frame_id: 1, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x7568d28f12aefce0 + 30: PATTERN_MATCH Var { var: Var { frame_id: 1, ty: integer, index: 4 }, type_value: integer(unknown) } AT -- hash: 0x1951a046c05c8a50 + 29: CONST integer(0) + 33: PATTERN_MATCH Var { var: Var { frame_id: 1, ty: integer, index: 4 }, type_value: integer(unknown) } IN -- hash: 0x31b056800031c05a + 31: CONST integer(0) + 32: CONST integer(100) + 45: FOR_OF -- hash: 0x2a6ca1a1aeced4d6 + n: Var { frame_id: 2, ty: integer, index: 0 } + i: Var { frame_id: 2, ty: integer, index: 1 } + max_count: Var { frame_id: 2, ty: integer, index: 2 } + count: Var { frame_id: 2, ty: integer, index: 3 } + item: Var { frame_id: 2, ty: integer, index: 4 } + 44: AND -- hash: 0xce850009289685a8 + 38: GT -- hash: 0xadc66c0f48e750e7 + 36: PATTERN_COUNT Var { var: Var { frame_id: 2, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x12da6e911e4b1855 + 37: CONST integer(0) + 43: GT -- hash: 0x84e68ea465523c78 + 41: PATTERN_COUNT Var { var: Var { frame_id: 2, ty: integer, index: 4 }, type_value: integer(unknown) } IN -- hash: 0xc336d1bfa8f9804 + 39: CONST integer(0) + 40: CONST integer(100) + 42: CONST integer(0) + 54: FOR_OF -- hash: 0xb649de6a3c0b0603 + n: Var { frame_id: 3, ty: integer, index: 0 } + i: Var { frame_id: 3, ty: integer, index: 1 } + max_count: Var { frame_id: 3, ty: integer, index: 2 } + count: Var { frame_id: 3, ty: integer, index: 3 } + item: Var { frame_id: 3, ty: integer, index: 4 } + 53: AND -- hash: 0xada51cbb798a9af6 + 48: GT -- hash: 0xeeaeb61296e7af4e + 46: PATTERN_OFFSET Var { var: Var { frame_id: 3, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0xb04c0a9329e733c9 + 47: CONST integer(0) + 52: GT -- hash: 0x77ae50bc98adf661 + 50: PATTERN_OFFSET Var { var: Var { frame_id: 3, ty: integer, index: 4 }, type_value: integer(unknown) } INDEX -- hash: 0x43dbbef46c221d0a + 49: CONST integer(1) + 51: CONST integer(0) + 63: FOR_OF -- hash: 0xe68ac61aa5953ab8 + n: Var { frame_id: 4, ty: integer, index: 0 } + i: Var { frame_id: 4, ty: integer, index: 1 } + max_count: Var { frame_id: 4, ty: integer, index: 2 } + count: Var { frame_id: 4, ty: integer, index: 3 } + item: Var { frame_id: 4, ty: integer, index: 4 } + 62: AND -- hash: 0xdde6046be314cfab + 57: GT -- hash: 0x2f970015e0e80db6 + 55: PATTERN_LENGTH Var { var: Var { frame_id: 4, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x4dbda69535834f3e + 56: CONST integer(0) + 61: GT -- hash: 0x95f4118d25b93df3 + 59: PATTERN_LENGTH Var { var: Var { frame_id: 4, ty: integer, index: 4 }, type_value: integer(unknown) } INDEX -- hash: 0x84c408f7ba227b71 + 58: CONST integer(1) + 60: CONST integer(0) + 65: FOR_OF -- hash: 0xe716d23849fe7860 + n: Var { frame_id: 5, ty: integer, index: 0 } + i: Var { frame_id: 5, ty: integer, index: 1 } + max_count: Var { frame_id: 5, ty: integer, index: 2 } + count: Var { frame_id: 5, ty: integer, index: 3 } + item: Var { frame_id: 5, ty: integer, index: 4 } + 64: PATTERN_MATCH Var { var: Var { frame_id: 5, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x43f441662202a59c + 68: OF -- hash: 0xd907e19beae11f88 + 67: CONST boolean(false) + 66: CONST boolean(true) + 69: OF -- hash: 0xc1af08cf16d07e7 + 72: FOR_OF -- hash: 0xa985997e5b03a6d7 + n: Var { frame_id: 8, ty: integer, index: 0 } + i: Var { frame_id: 8, ty: integer, index: 1 } + max_count: Var { frame_id: 8, ty: integer, index: 2 } + count: Var { frame_id: 8, ty: integer, index: 3 } + item: Var { frame_id: 8, ty: integer, index: 4 } + 70: CONST integer(1) + 71: PATTERN_MATCH Var { var: Var { frame_id: 8, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x1edcd4876d816429 + 80: FOR_IN -- hash: 0x808e64d8eb48ab96 + n: Var { frame_id: 9, ty: integer, index: 0 } + i: Var { frame_id: 9, ty: integer, index: 1 } + max_count: Var { frame_id: 9, ty: integer, index: 2 } + count: Var { frame_id: 9, ty: integer, index: 3 } + item: Var { frame_id: 9, ty: unknown, index: 4 } + 73: CONST integer(1) + 74: CONST integer(5) + 79: EQ -- hash: 0xe92c004f9190e2ec + 77: ADD -- hash: 0xb9090c9f9899e70f + 75: SYMBOL Var { var: Var { frame_id: 9, ty: integer, index: 5 }, type_value: integer(unknown) } + 76: CONST integer(1) + 78: CONST integer(2) + 84: NE -- hash: 0x92df6290b941eceb + 82: CONST integer(-2) + 83: CONST integer(0) + 89: EQ -- hash: 0x2772eae3cc6605b3 + 87: CONST integer(0) + 88: CONST integer(0) + 94: EQ -- hash: 0xe620d6a4866ed47d + 92: CONST integer(3) + 93: CONST integer(3) + 99: EQ -- hash: 0xe620d6a4866ed47d + 97: CONST integer(3) + 98: CONST integer(3) + 102: LT -- hash: 0xc2cd260920d8212b + 100: CONST integer(-1) + 101: CONST integer(0) + 107: EQ -- hash: 0x513c32b99dc13a3a + 105: CONST integer(2) + 106: CONST integer(2) + 112: EQ -- hash: 0xa4cec2653c77a348 + 110: CONST integer(6) + 111: CONST integer(6) + 117: EQ -- hash: 0x37b6700f88d99369 + 115: DIV -- hash: 0xe3d346244ff8cc57 + 113: CONST integer(6) + 114: CONST integer(2) + 116: CONST integer(3) + 122: EQ -- hash: 0x1a81b6c621408d88 + 120: MOD -- hash: 0x3b6ad7150dbd77e8 + 118: CONST integer(5) + 119: CONST integer(2) + 121: CONST integer(1) + 127: EQ -- hash: 0x7b057a8f6f1c6ec1 + 125: CONST integer(4) + 126: CONST integer(4) + 132: EQ -- hash: 0x7b057a8f6f1c6ec1 + 130: CONST integer(4) + 131: CONST integer(4) + 135: CONTAINS -- hash: 0x660fc7ce052cb681 + 133: CONST string("foo") + 134: CONST string("f") + 138: ICONTAINS -- hash: 0x377f84bcc413903b + 136: CONST string("foo") + 137: CONST string("F") + 141: STARTS_WITH -- hash: 0xd2d5574eed1ea15b + 139: CONST string("foo") + 140: CONST string("f") + 144: ISTARTS_WITH -- hash: 0xa445143dac057b15 + 142: CONST string("foo") + 143: CONST string("F") + 147: ENDS_WITH -- hash: 0xaf9269de21654fff + 145: CONST string("foo") + 146: CONST string("o") + 150: IENDS_WITH -- hash: 0xf81ff13400fb2d99 + 148: CONST string("foo") + 149: CONST string("O") + 153: IEQUALS -- hash: 0x59f750b89300b823 + 151: CONST string("foo") + 152: CONST string("FOO") + 157: CONTAINS -- hash: 0x69900714c5de042c + 154: CONST string("foo") + 156: CONST string("foo") + 161: DEFINED -- hash: 0xc649804070cd56ad + 160: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 158: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 159: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 170: EQ -- hash: 0xc86bbac0d41a5b9c + 168: FIELD_ACCESS -- hash: 0x6af92ddf1af8a3f2 + 166: LOOKUP -- hash: 0xb7e6fdca077aa568 + 164: FIELD_ACCESS -- hash: 0xb93ff31706b0e381 + 162: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 163: SYMBOL Field { index: 49, is_root: false, type_value: array, acl: None, deprecation_notice: None } + 165: CONST integer(0) + 167: SYMBOL Field { index: 0, is_root: false, type_value: string(unknown), acl: None, deprecation_notice: None } + 169: CONST string(".text") + diff --git a/lib/src/compiler/ir/tests/testdata/15.in b/lib/src/compiler/ir/tests/testdata/15.in new file mode 100644 index 000000000..9e209f137 --- /dev/null +++ b/lib/src/compiler/ir/tests/testdata/15.in @@ -0,0 +1,31 @@ +import "pe" + +rule test { + strings: + $a = "foo" + $b = "bar" + $r1 = /regex1/ + $r2 = /regex2/ + condition: + $a and $a at 0 and $a in (0..100) and + #a > 0 and #a in (0..100) > 0 and + @a > 0 and @a[1] > 0 and + !a > 0 and !a[1] > 0 and + for any of ($a*) : ( $ and $ at 0 and $ in (0..100) ) and + for any of ($a*) : ( # > 0 and # in (0..100) > 0 ) and + for any of ($a*) : ( @ > 0 and @[1] > 0 ) and + for any of ($a*) : ( ! > 0 and ![1] > 0 ) and + for any of ($r*) : ( $ ) and + any of (true, false) and + all of ($a, $b) and + for 1 of ($a*) : ( $ ) and + for any i in (1..5) : ( i + 1 == 2 ) and + ~1 != 0 and (1 & 2) == 0 and (1 | 2) == 3 and (1 ^ 2) == 3 and + -1 < 0 and (5 - 3) == 2 and (2 * 3) == 6 and (6 \ 2) == 3 and (5 % 2) == 1 and + (1 << 2) == 4 and (8 >> 1) == 4 and + "foo" contains "f" and "foo" icontains "F" and + "foo" startswith "f" and "foo" istartswith "F" and + "foo" endswith "o" and "foo" iendswith "O" and + "foo" iequals "FOO" and "foo" matches /foo/ and + defined pe.number_of_sections and pe.sections[0].name == ".text" +} diff --git a/lib/src/compiler/ir/tests/testdata/15.ir b/lib/src/compiler/ir/tests/testdata/15.ir new file mode 100644 index 000000000..ce8858d26 --- /dev/null +++ b/lib/src/compiler/ir/tests/testdata/15.ir @@ -0,0 +1,193 @@ +RULE test + 171: AND -- hash: 0x550720c3956843bf + 0: PATTERN_MATCH PatternIdx(0) -- hash: 0x5a276c8d75077d2b + 2: PATTERN_MATCH PatternIdx(0) AT -- hash: 0xfb7f3424e7aabb50 + 1: CONST integer(0) + 5: PATTERN_MATCH PatternIdx(0) IN -- hash: 0x1a40dae1e637aa39 + 3: CONST integer(0) + 4: CONST integer(100) + 8: GT -- hash: 0xe14c02d2ca38c7fe + 6: PATTERN_COUNT PatternIdx(0) -- hash: 0x295099eb5fc21fe8 + 7: CONST integer(0) + 13: GT -- hash: 0x92f8c6f7e54b02b8 + 11: PATTERN_COUNT PatternIdx(0) IN -- hash: 0x4343c02e3b7c252b + 9: CONST integer(0) + 10: CONST integer(100) + 12: CONST integer(0) + 16: GT -- hash: 0x2c7be90e3169df71 + 14: PATTERN_OFFSET PatternIdx(0) -- hash: 0xf879c749467cc2a4 + 15: CONST integer(0) + 20: GT -- hash: 0x8bb5a93875bc3546 + 18: PATTERN_OFFSET PatternIdx(0) INDEX -- hash: 0x3a988b42c9d1c021 + 17: CONST integer(1) + 19: CONST integer(0) + 23: GT -- hash: 0x77abcf49989af6e3 + 21: PATTERN_LENGTH PatternIdx(0) -- hash: 0xc7a2f4a72d376561 + 22: CONST integer(0) + 27: GT -- hash: 0xf87b38b95dae2020 + 25: PATTERN_LENGTH PatternIdx(0) INDEX -- hash: 0x85c8717e3102d793 + 24: CONST integer(1) + 26: CONST integer(0) + 35: FOR_OF -- hash: 0x987e0cb4f38e5d95 + n: Var { frame_id: 1, ty: integer, index: 0 } + i: Var { frame_id: 1, ty: integer, index: 1 } + max_count: Var { frame_id: 1, ty: integer, index: 2 } + count: Var { frame_id: 1, ty: integer, index: 3 } + item: Var { frame_id: 1, ty: integer, index: 4 } + 34: AND -- hash: 0x3c966b1c6d560e68 + 28: PATTERN_MATCH Var { var: Var { frame_id: 1, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x7568d28f12aefce0 + 30: PATTERN_MATCH Var { var: Var { frame_id: 1, ty: integer, index: 4 }, type_value: integer(unknown) } AT -- hash: 0x1951a046c05c8a50 + 29: CONST integer(0) + 33: PATTERN_MATCH Var { var: Var { frame_id: 1, ty: integer, index: 4 }, type_value: integer(unknown) } IN -- hash: 0x31b056800031c05a + 31: CONST integer(0) + 32: CONST integer(100) + 45: FOR_OF -- hash: 0x2a6ca1a1aeced4d6 + n: Var { frame_id: 2, ty: integer, index: 0 } + i: Var { frame_id: 2, ty: integer, index: 1 } + max_count: Var { frame_id: 2, ty: integer, index: 2 } + count: Var { frame_id: 2, ty: integer, index: 3 } + item: Var { frame_id: 2, ty: integer, index: 4 } + 44: AND -- hash: 0xce850009289685a8 + 38: GT -- hash: 0xadc66c0f48e750e7 + 36: PATTERN_COUNT Var { var: Var { frame_id: 2, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x12da6e911e4b1855 + 37: CONST integer(0) + 43: GT -- hash: 0x84e68ea465523c78 + 41: PATTERN_COUNT Var { var: Var { frame_id: 2, ty: integer, index: 4 }, type_value: integer(unknown) } IN -- hash: 0xc336d1bfa8f9804 + 39: CONST integer(0) + 40: CONST integer(100) + 42: CONST integer(0) + 54: FOR_OF -- hash: 0xb649de6a3c0b0603 + n: Var { frame_id: 3, ty: integer, index: 0 } + i: Var { frame_id: 3, ty: integer, index: 1 } + max_count: Var { frame_id: 3, ty: integer, index: 2 } + count: Var { frame_id: 3, ty: integer, index: 3 } + item: Var { frame_id: 3, ty: integer, index: 4 } + 53: AND -- hash: 0xada51cbb798a9af6 + 48: GT -- hash: 0xeeaeb61296e7af4e + 46: PATTERN_OFFSET Var { var: Var { frame_id: 3, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0xb04c0a9329e733c9 + 47: CONST integer(0) + 52: GT -- hash: 0x77ae50bc98adf661 + 50: PATTERN_OFFSET Var { var: Var { frame_id: 3, ty: integer, index: 4 }, type_value: integer(unknown) } INDEX -- hash: 0x43dbbef46c221d0a + 49: CONST integer(1) + 51: CONST integer(0) + 63: FOR_OF -- hash: 0xe68ac61aa5953ab8 + n: Var { frame_id: 4, ty: integer, index: 0 } + i: Var { frame_id: 4, ty: integer, index: 1 } + max_count: Var { frame_id: 4, ty: integer, index: 2 } + count: Var { frame_id: 4, ty: integer, index: 3 } + item: Var { frame_id: 4, ty: integer, index: 4 } + 62: AND -- hash: 0xdde6046be314cfab + 57: GT -- hash: 0x2f970015e0e80db6 + 55: PATTERN_LENGTH Var { var: Var { frame_id: 4, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x4dbda69535834f3e + 56: CONST integer(0) + 61: GT -- hash: 0x95f4118d25b93df3 + 59: PATTERN_LENGTH Var { var: Var { frame_id: 4, ty: integer, index: 4 }, type_value: integer(unknown) } INDEX -- hash: 0x84c408f7ba227b71 + 58: CONST integer(1) + 60: CONST integer(0) + 65: FOR_OF -- hash: 0xe716d23849fe7860 + n: Var { frame_id: 5, ty: integer, index: 0 } + i: Var { frame_id: 5, ty: integer, index: 1 } + max_count: Var { frame_id: 5, ty: integer, index: 2 } + count: Var { frame_id: 5, ty: integer, index: 3 } + item: Var { frame_id: 5, ty: integer, index: 4 } + 64: PATTERN_MATCH Var { var: Var { frame_id: 5, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x43f441662202a59c + 68: OF -- hash: 0xd907e19beae11f88 + 67: CONST boolean(false) + 66: CONST boolean(true) + 69: OF -- hash: 0xc1af08cf16d07e7 + 72: FOR_OF -- hash: 0xa985997e5b03a6d7 + n: Var { frame_id: 8, ty: integer, index: 0 } + i: Var { frame_id: 8, ty: integer, index: 1 } + max_count: Var { frame_id: 8, ty: integer, index: 2 } + count: Var { frame_id: 8, ty: integer, index: 3 } + item: Var { frame_id: 8, ty: integer, index: 4 } + 70: CONST integer(1) + 71: PATTERN_MATCH Var { var: Var { frame_id: 8, ty: integer, index: 4 }, type_value: integer(unknown) } -- hash: 0x1edcd4876d816429 + 80: FOR_IN -- hash: 0x808e64d8eb48ab96 + n: Var { frame_id: 9, ty: integer, index: 0 } + i: Var { frame_id: 9, ty: integer, index: 1 } + max_count: Var { frame_id: 9, ty: integer, index: 2 } + count: Var { frame_id: 9, ty: integer, index: 3 } + item: Var { frame_id: 9, ty: unknown, index: 4 } + 73: CONST integer(1) + 74: CONST integer(5) + 79: EQ -- hash: 0xe92c004f9190e2ec + 77: ADD -- hash: 0xb9090c9f9899e70f + 75: SYMBOL Var { var: Var { frame_id: 9, ty: integer, index: 5 }, type_value: integer(unknown) } + 76: CONST integer(1) + 78: CONST integer(2) + 84: NE -- hash: 0x92df6290b941eceb + 82: CONST integer(-2) + 83: CONST integer(0) + 89: EQ -- hash: 0x2772eae3cc6605b3 + 87: CONST integer(0) + 88: CONST integer(0) + 94: EQ -- hash: 0xe620d6a4866ed47d + 92: CONST integer(3) + 93: CONST integer(3) + 99: EQ -- hash: 0xe620d6a4866ed47d + 97: CONST integer(3) + 98: CONST integer(3) + 102: LT -- hash: 0xc2cd260920d8212b + 100: CONST integer(-1) + 101: CONST integer(0) + 107: EQ -- hash: 0x513c32b99dc13a3a + 105: CONST integer(2) + 106: CONST integer(2) + 112: EQ -- hash: 0xa4cec2653c77a348 + 110: CONST integer(6) + 111: CONST integer(6) + 117: EQ -- hash: 0x37b6700f88d99369 + 115: DIV -- hash: 0xe3d346244ff8cc57 + 113: CONST integer(6) + 114: CONST integer(2) + 116: CONST integer(3) + 122: EQ -- hash: 0x1a81b6c621408d88 + 120: MOD -- hash: 0x3b6ad7150dbd77e8 + 118: CONST integer(5) + 119: CONST integer(2) + 121: CONST integer(1) + 127: EQ -- hash: 0x7b057a8f6f1c6ec1 + 125: CONST integer(4) + 126: CONST integer(4) + 132: EQ -- hash: 0x7b057a8f6f1c6ec1 + 130: CONST integer(4) + 131: CONST integer(4) + 135: CONTAINS -- hash: 0x660fc7ce052cb681 + 133: CONST string("foo") + 134: CONST string("f") + 138: ICONTAINS -- hash: 0x377f84bcc413903b + 136: CONST string("foo") + 137: CONST string("F") + 141: STARTS_WITH -- hash: 0xd2d5574eed1ea15b + 139: CONST string("foo") + 140: CONST string("f") + 144: ISTARTS_WITH -- hash: 0xa445143dac057b15 + 142: CONST string("foo") + 143: CONST string("F") + 147: ENDS_WITH -- hash: 0xaf9269de21654fff + 145: CONST string("foo") + 146: CONST string("o") + 150: IENDS_WITH -- hash: 0xf81ff13400fb2d99 + 148: CONST string("foo") + 149: CONST string("O") + 153: IEQUALS -- hash: 0x59f750b89300b823 + 151: CONST string("foo") + 152: CONST string("FOO") + 157: CONTAINS -- hash: 0x69900714c5de042c + 154: CONST string("foo") + 156: CONST string("foo") + 161: DEFINED -- hash: 0xc649804070cd56ad + 160: FIELD_ACCESS -- hash: 0x89fe7b03f298d17c + 158: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 159: SYMBOL Field { index: 36, is_root: false, type_value: integer(unknown), acl: None, deprecation_notice: Some(DeprecationNotice { text: "this field is deprecated", help: Some("use `pe.sections.len()` instead"), replacement: Some("sections.len()") }) } + 170: EQ -- hash: 0xc86bbac0d41a5b9c + 168: FIELD_ACCESS -- hash: 0x6af92ddf1af8a3f2 + 166: LOOKUP -- hash: 0xb7e6fdca077aa568 + 164: FIELD_ACCESS -- hash: 0xb93ff31706b0e381 + 162: SYMBOL Field { index: 0, is_root: true, type_value: struct, acl: None, deprecation_notice: None } + 163: SYMBOL Field { index: 49, is_root: false, type_value: array, acl: None, deprecation_notice: None } + 165: CONST integer(0) + 167: SYMBOL Field { index: 0, is_root: false, type_value: string(unknown), acl: None, deprecation_notice: None } + 169: CONST string(".text") + diff --git a/lib/src/compiler/mod.rs b/lib/src/compiler/mod.rs index f7b964243..155490ca7 100644 --- a/lib/src/compiler/mod.rs +++ b/lib/src/compiler/mod.rs @@ -2932,7 +2932,18 @@ impl From for usize { /// For each pattern there's one or more sub-patterns, depending on the pattern /// and its modifiers. For example the pattern `"foo" ascii wide` may have one /// subpattern for the ascii case and another one for the wide case. -#[derive(Copy, Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)] +#[derive( + Copy, + Clone, + Debug, + Eq, + Hash, + PartialEq, + PartialOrd, + Ord, + Serialize, + Deserialize, +)] #[serde(transparent)] pub(crate) struct SubPatternId(u32); diff --git a/lib/src/compiler/rules.rs b/lib/src/compiler/rules.rs index 07e827414..e8d186de7 100644 --- a/lib/src/compiler/rules.rs +++ b/lib/src/compiler/rules.rs @@ -218,6 +218,14 @@ impl Rules { /// Deserializes the rules from a sequence of bytes produced by /// [`Rules::serialize`]. + /// + /// # Safety + /// + /// As long as you are deserializing rules from binary content produced + /// by [`Rules::serialize`] you are safe. But you should never attempt + /// to do so from binary content that was produced or could be manipulated + /// by a third party. This implies a security risk and your program may + /// panic during scanning. pub fn deserialize(bytes: B) -> Result where B: AsRef<[u8]>, @@ -284,6 +292,21 @@ impl Rules { rules.build_ac_automaton(); + // Make sure that the maximum SubPatternId is within the boundaries + // of sub_patterns array. This check is important because during + // the scanning phase we use SubPatternId as indexes in the array + // without boundary checks for better performance. + let max_sub_pattern_id = rules + .atoms + .iter() + .map(|atom| atom.sub_pattern_id) + .max() + .unwrap_or(SubPatternId(0)); + + if rules.sub_patterns.len() < max_sub_pattern_id.0 as usize { + return Err(SerializationError::InvalidFormat); + } + Ok(rules) } diff --git a/lib/src/models.rs b/lib/src/models.rs index 7bf583e81..b1440925b 100644 --- a/lib/src/models.rs +++ b/lib/src/models.rs @@ -203,9 +203,7 @@ impl<'r> Iterator for Metadata<'_, 'r> { compiler::MetaValue::Float(f) => MetaValue::Float(*f), compiler::MetaValue::String(id) => { let s = self.rules.lit_pool().get(*id).unwrap(); - // We can be sure that s is a valid UTF-8 string, because - // the type of meta is MetaValue::String. - let s = unsafe { s.to_str_unchecked() }; + let s = s.to_str().unwrap(); MetaValue::String(s) } compiler::MetaValue::Bytes(id) => { diff --git a/lib/src/modules/console.rs b/lib/src/modules/console.rs index 5df1c2e88..7e07399d1 100644 --- a/lib/src/modules/console.rs +++ b/lib/src/modules/console.rs @@ -213,6 +213,13 @@ mod tests { ] ); } + + #[test] + fn test_escape() { + assert_eq!(super::escape(b"hello"), "hello"); + assert_eq!(super::escape(b"hello\nworld"), "hello\\nworld"); + assert_eq!(super::escape(b"\xff\xfe"), "\\xff\\xfe"); + } } register_module!("console", Console, main); diff --git a/lib/src/modules/lnk/parser.rs b/lib/src/modules/lnk/parser.rs index 4fbeb03cd..d468ff321 100644 --- a/lib/src/modules/lnk/parser.rs +++ b/lib/src/modules/lnk/parser.rs @@ -573,3 +573,21 @@ impl LnkParser { fn filetime_to_unix_timestamp(filetime: u64) -> Option { (filetime / 10000000).checked_sub(11644473600) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_filetime_to_unix_timestamp() { + assert_eq!(filetime_to_unix_timestamp(0), None); + assert_eq!(filetime_to_unix_timestamp(116444736000000000), Some(0)); + assert_eq!(filetime_to_unix_timestamp(116444736000000000 + 10000000), Some(1)); + } + + #[test] + fn test_lnk_parser_invalid() { + let mut parser = LnkParser::new(); + assert!(parser.parse(b"too short").is_err()); + } +} diff --git a/lib/src/modules/tests.rs b/lib/src/modules/tests.rs index 879281802..7e62f7c24 100644 --- a/lib/src/modules/tests.rs +++ b/lib/src/modules/tests.rs @@ -138,6 +138,11 @@ fn test_modules() { .map(|s| s.as_os_str().to_str().unwrap()) .expect("can not extract module name from tests path"); + // Ignore the module of not among the registered modules. + if !module_names().any(|n| n == module_name) { + return; + } + // Construct a dummy YARA rule that only imports the module. let rule = format!( r#"import "{module_name}" rule test {{ condition: false }}"# diff --git a/lib/src/modules/utils/leb128.rs b/lib/src/modules/utils/leb128.rs index 868e39bfe..287c8003b 100644 --- a/lib/src/modules/utils/leb128.rs +++ b/lib/src/modules/utils/leb128.rs @@ -76,3 +76,34 @@ pub fn sleb128(input: &[u8]) -> IResult<&[u8], i64> { Ok((data, val)) } + +#[cfg(test)] +mod tests { + use super::*; + use nom::error::ErrorKind; + + #[test] + fn test_uleb128() { + assert_eq!(uleb128(&[0x00]), Ok((&[][..], 0))); + assert_eq!(uleb128(&[0x01]), Ok((&[][..], 1))); + assert_eq!(uleb128(&[0xe5, 0x8e, 0x26]), Ok((&[][..], 624485))); + assert_eq!(uleb128(&[0x80, 0x01, 0xff]), Ok((&[0xff][..], 128))); + let overflow = [0x80; 11]; + assert!( + matches!(uleb128(&overflow), Err(nom::Err::Error(e)) if e.code == ErrorKind::TooLarge) + ); + } + + #[test] + fn test_sleb128() { + assert_eq!(sleb128(&[0x00]), Ok((&[][..], 0))); + assert_eq!(sleb128(&[0x01]), Ok((&[][..], 1))); + assert_eq!(sleb128(&[0x7f]), Ok((&[][..], -1))); + assert_eq!(sleb128(&[0x80, 0x7f]), Ok((&[][..], -128))); + assert_eq!(sleb128(&[0x9b, 0xf1, 0x59]), Ok((&[][..], -624485))); + let overflow = [0x80; 11]; + assert!( + matches!(sleb128(&overflow), Err(nom::Err::Error(e)) if e.code == ErrorKind::TooLarge) + ); + } +} diff --git a/lib/src/modules/utils/zip.rs b/lib/src/modules/utils/zip.rs index b7e428e24..ae4c7d8e4 100644 --- a/lib/src/modules/utils/zip.rs +++ b/lib/src/modules/utils/zip.rs @@ -111,3 +111,27 @@ impl<'a> From<&CachedZip<'a>> for Zip { zip } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_zip_cache() { + assert!(matches!( + ZipCache::new(b"invalid zip data"), + ZipCache::NotZip + )); + + let eocd = [ + 0x50, 0x4b, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ]; + if let ZipCache::Cached(mut cached) = ZipCache::new(&eocd) { + assert!(cached.get_file_content("missing.txt").is_none()); + let zip_proto: Zip = (&cached).into(); + assert!(zip_proto.is_zip()); + assert_eq!(zip_proto.entries.len(), 0); + } + } +} diff --git a/ls/src/tests/testdata/completion10.response.json b/ls/src/tests/testdata/completion10.response.json index d84e614be..b10a8786c 100644 --- a/ls/src/tests/testdata/completion10.response.json +++ b/ls/src/tests/testdata/completion10.response.json @@ -49,11 +49,6 @@ "label": "math", "preselect": true }, - { - "kind": 9, - "label": "olecf", - "preselect": true - }, { "kind": 9, "label": "pe", @@ -79,11 +74,6 @@ "label": "time", "preselect": true }, - { - "kind": 9, - "label": "vba", - "preselect": true - }, { "kind": 9, "label": "vt", diff --git a/ls/src/tests/testdata/completion11.response.json b/ls/src/tests/testdata/completion11.response.json index d84e614be..b10a8786c 100644 --- a/ls/src/tests/testdata/completion11.response.json +++ b/ls/src/tests/testdata/completion11.response.json @@ -49,11 +49,6 @@ "label": "math", "preselect": true }, - { - "kind": 9, - "label": "olecf", - "preselect": true - }, { "kind": 9, "label": "pe", @@ -79,11 +74,6 @@ "label": "time", "preselect": true }, - { - "kind": 9, - "label": "vba", - "preselect": true - }, { "kind": 9, "label": "vt", diff --git a/ls/src/tests/testdata/completion14.response.json b/ls/src/tests/testdata/completion14.response.json index 51808a2be..dc386473a 100644 --- a/ls/src/tests/testdata/completion14.response.json +++ b/ls/src/tests/testdata/completion14.response.json @@ -296,25 +296,6 @@ "kind": 9, "label": "math" }, - { - "additionalTextEdits": [ - { - "newText": "import \"olecf\"\n", - "range": { - "end": { - "character": 0, - "line": 0 - }, - "start": { - "character": 0, - "line": 0 - } - } - } - ], - "kind": 9, - "label": "olecf" - }, { "kind": 9, "label": "pe" @@ -395,25 +376,6 @@ "kind": 9, "label": "time" }, - { - "additionalTextEdits": [ - { - "newText": "import \"vba\"\n", - "range": { - "end": { - "character": 0, - "line": 0 - }, - "start": { - "character": 0, - "line": 0 - } - } - } - ], - "kind": 9, - "label": "vba" - }, { "additionalTextEdits": [ { diff --git a/ls/src/tests/testdata/completion15.response.json b/ls/src/tests/testdata/completion15.response.json index cb071fc36..786644415 100644 --- a/ls/src/tests/testdata/completion15.response.json +++ b/ls/src/tests/testdata/completion15.response.json @@ -275,25 +275,6 @@ "kind": 9, "label": "math" }, - { - "additionalTextEdits": [ - { - "newText": "import \"olecf\"\n", - "range": { - "end": { - "character": 0, - "line": 0 - }, - "start": { - "character": 0, - "line": 0 - } - } - } - ], - "kind": 9, - "label": "olecf" - }, { "kind": 9, "label": "pe" @@ -374,25 +355,6 @@ "kind": 9, "label": "time" }, - { - "additionalTextEdits": [ - { - "newText": "import \"vba\"\n", - "range": { - "end": { - "character": 0, - "line": 0 - }, - "start": { - "character": 0, - "line": 0 - } - } - } - ], - "kind": 9, - "label": "vba" - }, { "additionalTextEdits": [ { diff --git a/ls/src/tests/testdata/completion2.response.json b/ls/src/tests/testdata/completion2.response.json index f035330df..4503a49c4 100644 --- a/ls/src/tests/testdata/completion2.response.json +++ b/ls/src/tests/testdata/completion2.response.json @@ -282,25 +282,6 @@ "kind": 9, "label": "math" }, - { - "additionalTextEdits": [ - { - "newText": "import \"olecf\"\n", - "range": { - "end": { - "character": 0, - "line": 0 - }, - "start": { - "character": 0, - "line": 0 - } - } - } - ], - "kind": 9, - "label": "olecf" - }, { "additionalTextEdits": [ { @@ -396,25 +377,6 @@ "kind": 9, "label": "time" }, - { - "additionalTextEdits": [ - { - "newText": "import \"vba\"\n", - "range": { - "end": { - "character": 0, - "line": 0 - }, - "start": { - "character": 0, - "line": 0 - } - } - } - ], - "kind": 9, - "label": "vba" - }, { "additionalTextEdits": [ { diff --git a/parser/src/ast/tests.rs b/parser/src/ast/tests.rs index 5408d2c71..e00d25546 100644 --- a/parser/src/ast/tests.rs +++ b/parser/src/ast/tests.rs @@ -4,7 +4,42 @@ use crate::{Parser, Span, ast}; #[test] fn ast_from_cst() { - let source = br#"rule test { condition: true }"#; + let source = br#" + global private rule test { + meta: + author = "test" + version = 3.14 + strings: + $a = "abc" ascii wide fullword + $b = "cde" base64 + $c = { 01 02 [1-2] ?? } + $d = /reg.*exp/i nocase + condition: + all of them and + any of ($a*) and + filesize > 100 and + (1 << 2) + (8 >> 1) >= 4 and + 1 == 1 and + 2 != 3 and + 4 < 5 and + 6 <= 6 and + 7 > 2 and + "foo" contains "f" and + "bar" icontains "B" and + "baz" startswith "b" + and "qux" istartswith "Q" and + "end" endswith "d" and + "IEND" iendswith "D" and + "eq" iequals "EQ" and + "str" matches /str/ and + not false and none of ($b*) and + (1 & 2) | (3 ^ 4) != ~0 and + 5 % 2 == 1 and + 2 * 3 == 6 and + 1 - 1 == 0 + } + "#; + let parser = Parser::new(source); let cst = CST::try_from(parser).unwrap(); let ast = AST::new(source, cst.iter()); @@ -14,6 +49,7 @@ fn ast_from_cst() { _ => panic!(), }; + assert!(ast.errors.is_empty()); assert_eq!(rule.identifier.name, "test"); let source = br#"foo"#; @@ -31,3 +67,40 @@ fn ast_from_cst() { } ); } + +#[test] +fn ast_dfs() { + use crate::ast::dfs::{DFSEvent, DFSIter}; + use crate::ast::*; + + let source = br#" + rule test { + strings: + $a = "foo" + condition: + $a and foo.bar[0].baz == 1 and not (-(-1) == 1) + } + "#; + let parser = Parser::new(source); + let cst = CST::try_from(parser).unwrap(); + let ast = AST::new(source, cst.iter()); + + let rule = match ast.items.first().unwrap() { + Item::Rule(rule) => rule, + _ => panic!(), + }; + + let iter = DFSIter::new(&rule.condition); + let mut enter_count = 0; + let mut leave_count = 0; + + for event in iter { + match event { + DFSEvent::Enter(_) => enter_count += 1, + DFSEvent::Leave(_) => leave_count += 1, + } + } + + assert!(enter_count > 0); + assert_eq!(enter_count, leave_count); +} diff --git a/parser/src/cst/tests.rs b/parser/src/cst/tests.rs index 034710dfe..aa1f337fb 100644 --- a/parser/src/cst/tests.rs +++ b/parser/src/cst/tests.rs @@ -524,3 +524,20 @@ test { Some(Event::Token { kind: SyntaxKind::L_BRACE, span: Span(25..26) }) ); } + +#[test] +fn cst_recovery_and_error_merging() { + let stream = CSTStream::from(Parser::new(b"rule /* unclosed comment")); + let mut has_error = false; + for event in stream { + if matches!( + event, + Event::Begin { kind: SyntaxKind::ERROR, .. } + | Event::Token { kind: SyntaxKind::ERROR, .. } + | Event::End { kind: SyntaxKind::ERROR, .. } + ) { + has_error = true; + } + } + assert!(has_error); +} diff --git a/parser/src/tokenizer/tests.rs b/parser/src/tokenizer/tests.rs index 230ad5dd9..72a097e6a 100644 --- a/parser/src/tokenizer/tests.rs +++ b/parser/src/tokenizer/tests.rs @@ -399,3 +399,24 @@ fn errors() { assert_eq!(lexer.next_token(), Some(Token::WHITESPACE(Span(3..4)))); assert_eq!(lexer.next_token(), Some(Token::INVALID_UTF8(Span(4..5)))); } + +#[test] +fn span_and_malformed_hex() { + use rowan::TextRange; + use rowan::TextSize; + + let s = Span(10..25); + assert_eq!(format!("{s}"), "[10..25]"); + + let r = TextRange::new(TextSize::from(5), TextSize::from(15)); + let span_from_r: Span = r.into(); + assert_eq!(span_from_r, Span(5..15)); + + let mut lexer = super::Tokenizer::new(b"[10-"); + lexer.enter_hex_pattern_mode(); + assert_eq!(lexer.next_token(), Some(Token::L_BRACKET(Span(0..1)))); + lexer.enter_hex_jump_mode(); + assert_eq!(lexer.next_token(), Some(Token::INTEGER_LIT(Span(1..3)))); + assert_eq!(lexer.next_token(), Some(Token::HYPHEN(Span(3..4)))); + assert_eq!(lexer.next_token(), None); +} diff --git a/test.yar b/test.yar new file mode 100644 index 000000000..d8dd87ec9 --- /dev/null +++ b/test.yar @@ -0,0 +1,33 @@ + global private rule rich_syntax { + meta: + author = "test" + version = 3.14 + strings: + $a = "abc" ascii wide fullword + $b = "cde" base64 + $c = { 01 02 [1-2] ?? } + $d = /reg.*exp/i nocase + condition: + all of them and + any of ($a*) and + filesize > 100 and + (1 << 2) + (8 >> 1) >= 4 and + 1 == 1 and + 2 != 3 and + 4 < 5 and + 6 <= 6 and + 7 > 2 and + "foo" contains "f" and + "bar" icontains "B" and + "baz" startswith "b" + and "qux" istartswith "Q" and + "end" endswith "d" and + "IEND" iendswith "D" and + "eq" iequals "EQ" and + "str" matches /str/ and + not false and none of ($b*) and + (1 & 2) | (3 ^ 4) != ~0 and + 5 % 2 == 1 and + 2 * 3 == 6 and + 1 - 1 == 0 + }