Skip to content

Instantly share code, notes, and snippets.

@MasterDuke17
Last active November 5, 2020 21:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save MasterDuke17/a124b178451becd1e55dd62dae69d6f9 to your computer and use it in GitHub Desktop.
Save MasterDuke17/a124b178451becd1e55dd62dae69d6f9 to your computer and use it in GitHub Desktop.
Thread 1 "moar" hit Breakpoint 1, MVM_string_index (tc=0x555555559ec0, Haystack=pointer to '123def78', needle=pointer to 'def', start=0) at src/strings/ops.c:561
561 MVMint64 MVM_string_index(MVMThreadContext *tc, MVMString *Haystack, MVMString *needle, MVMint64 start) {
(gdb) bt
#0 MVM_string_index (tc=0x555555559ec0, Haystack=pointer to '123def78', needle=pointer to 'def', start=0) at src/strings/ops.c:561
#1 0x00007ffff78a0952 in MVM_interp_run (tc=0x555555559ec0, initial_invoke=0x555555e6fa60, initial_invoke@entry=0x7ffff79a6120 <toplevel_initial_invoke>, invoke_data=0x555555e6fa60,
invoke_data@entry=0x7ffff79a6120 <toplevel_initial_invoke>, outer_runloop=outer_runloop@entry=0x0) at src/core/interp.c:1624
#2 0x00007ffff79a72d4 in MVM_vm_run_file (instance=<optimized out>, filename=<optimized out>) at src/moar.c:486
#3 0x000055555555573d in main (argc=6, argv=0x7fffffffe338) at src/main.c:305
(gdb) call MVM_dump_backtrace(tc)
at <unknown>:1 (<ephemeral file>:)
from gen/moar/stage2/QRegex.nqp:2258 (/home/dan/Source/perl6/nqp/QRegex.moarvm:parse)
from gen/moar/stage2/QRegex.nqp:2351 (/home/dan/Source/perl6/nqp/QRegex.moarvm:ACCEPTS)
from <unknown>:1 (/home/dan/Source/perl6/nqp/NQPCORE.setting.moarvm:ACCEPTS)
from -e:1 (<ephemeral file>:<mainline>)
from gen/moar/stage2/NQPHLL.nqp:1945 (/home/dan/Source/perl6/nqp/NQPHLL.moarvm:eval)
from gen/moar/stage2/NQPHLL.nqp:2055 (/home/dan/Source/perl6/nqp/NQPHLL.moarvm:)
from gen/moar/stage2/NQPHLL.nqp:2054 (/home/dan/Source/perl6/nqp/NQPHLL.moarvm:command_eval)
from gen/moar/stage2/NQPHLL.nqp:2035 (/home/dan/Source/perl6/nqp/NQPHLL.moarvm:command_line)
from gen/moar/stage2/NQP.nqp:4178 (nqp.moarvm:MAIN)
from gen/moar/stage2/NQP.nqp:1 (nqp.moarvm:<mainline>)
from <unknown>:1 (nqp.moarvm:<main>)
from <unknown>:1 (nqp.moarvm:<entry>)
(gdb)
[dan@alexandria nqp]$ NQP_LIT_REGEX_OPT=1 ./nqp-m --target=mbc --output=o.mbc -e 'if "123def78" ~~ / "def" / { say("match") } else { say("no match") }'
- QAST::Regex+{QAST::RegexCursorType}(:rxtype(concat) :subtype() :cursor_type(NQPMatch))
- QAST::Regex(:rxtype(scan) :subtype())
- def
- QAST::Regex(:rxtype(literal) :subtype()) \"def\"
- def
- QAST::Regex(:rxtype(pass) :subtype())
[dan@alexandria nqp]$ ../MoarVM/moar --dump o.mbc
MoarVM dump of binary compilation unit:
SC_0 : 16E7374520010EC2654FB5713418E6DF3AB3DB3B-0
SC_1 : 8F0F6ABFDA96805559BFB26C8A8FA610A6886F22-0
SC_2 : D80DB955F36E2E5699BB1F80671BFC21E50C0CBE-0
Callsite_0 :
num_pos: 1
arg_count: 1
Arg 1 : positional obj
Callsite_1 :
num_pos: 2
arg_count: 4
Arg 1 : positional obj
Arg 2 : positional int
Arg 3 : named(backtrack) int
Callsite_2 :
num_pos: 2
arg_count: 2
Arg 1 : positional obj
Arg 2 : positional obj
Callsite_3 :
num_pos: 2
arg_count: 2
Arg 1 : positional obj
Arg 2 : positional str
Callsite_4 :
num_pos: 1
arg_count: 1
Arg 1 : positional str
Callsite_5 :
num_pos: 0
arg_count: 0
Callsite_6 :
num_pos: 1
arg_count: 1
Arg 1 : flat obj flat
Frame_0 :
cuuid : 2
name : <mainline>
Locals :
0: loc_0_obj
1: loc_1_obj
2: loc_2_str
3: loc_3_obj
4: loc_4_int
5: loc_5_int
6: loc_6_obj
7: loc_7_obj
8: loc_8_obj
9: loc_9_obj
10: loc_10_obj
11: loc_11_obj
Lexicals :
0: lex_Frame_0_GLOBALish_obj
1: lex_Frame_0_$?PACKAGE_obj
2: lex_Frame_0_EXPORT_obj
Instructions :
00000 getcode loc_11_obj, Frame_1
00001 takeclosure loc_11_obj, loc_11_obj
00002 checkarity 0, -1
00003 param_sp loc_0_obj, 0
00004 paramnamesused
00005 const_s loc_2_str, '$*CTXSAVE'
00006 getdynlex loc_3_obj, loc_2_str
00007 set loc_1_obj, loc_3_obj
00008 isnull loc_4_int, loc_1_obj
00009 if_i loc_4_int, label_1(00019)
00010 decont loc_3_obj, loc_1_obj
00011 const_s loc_2_str, 'ctxsave'
00012 can_s loc_5_int, loc_3_obj, loc_2_str
00013 unless_i loc_5_int, label_1(00019)
00014 decont loc_6_obj, loc_1_obj
00015 findmeth loc_3_obj, loc_6_obj, 'ctxsave'
00016 prepargs Callsite_0
00017 arg_o 0, loc_1_obj
00018 invoke_o loc_3_obj, loc_3_obj
annotation: -e:1
label_1:
00019 getlex loc_6_obj, lex_Frame_0_$?PACKAGE_obj
00020 decont loc_7_obj, loc_6_obj
00021 getwho loc_7_obj, loc_7_obj
00022 const_s loc_2_str, 'NQPRegex'
00023 atkey_o loc_7_obj, loc_7_obj, loc_2_str
00024 ifnonnull loc_7_obj, label_3(00035)
00025 wval loc_9_obj, 0, 0
00026 getwho loc_9_obj, loc_9_obj
00027 const_s loc_2_str, 'NQPRegex'
00028 atkey_o loc_9_obj, loc_9_obj, loc_2_str
00029 set loc_8_obj, loc_9_obj
00030 ifnonnull loc_9_obj, label_2(00033)
00031 wval loc_10_obj, 1, 44
00032 set loc_8_obj, loc_10_obj
label_2:
00033 set loc_6_obj, loc_8_obj
00034 goto label_4(00036)
label_3:
00035 set loc_6_obj, loc_7_obj
label_4:
00036 decont loc_7_obj, loc_6_obj
00037 findmeth loc_8_obj, loc_7_obj, 'new'
00038 prepargs Callsite_2
00039 arg_o 0, loc_6_obj
00040 arg_o 1, loc_11_obj
00041 invoke_o loc_8_obj, loc_8_obj
00042 const_s loc_2_str, '123def78'
00043 decont loc_7_obj, loc_8_obj
00044 findmeth loc_6_obj, loc_7_obj, 'ACCEPTS'
00045 prepargs Callsite_3
00046 arg_o 0, loc_8_obj
00047 arg_s 1, loc_2_str
00048 invoke_o loc_6_obj, loc_6_obj
00049 decont loc_8_obj, loc_6_obj
00050 unless_o loc_8_obj, label_5(00058)
annotation: -e:1
00051 getlex_no loc_8_obj, '&say'
00052 decont loc_8_obj, loc_8_obj
00053 const_s loc_2_str, 'match'
00054 prepargs Callsite_4
00055 arg_s 0, loc_2_str
00056 invoke_v loc_8_obj
00057 goto label_6(00064)
annotation: -e:1
label_5:
00058 getlex_no loc_8_obj, '&say'
00059 decont loc_8_obj, loc_8_obj
00060 const_s loc_2_str, 'no match'
00061 prepargs Callsite_4
00062 arg_s 0, loc_2_str
00063 invoke_v loc_8_obj
label_6:
00064 null loc_6_obj
00065 return_o loc_6_obj
Frame_1 :
cuuid : 1
name :
outer : Frame_0
Locals :
0: loc_0_obj
1: loc_1_obj
2: loc_2_obj
3: loc_3_str
4: loc_4_obj
5: loc_5_str
6: loc_6_str
7: loc_7_int
8: loc_8_int
9: loc_9_int
10: loc_10_int
11: loc_11_int
12: loc_12_obj
13: loc_13_obj
14: loc_14_obj
15: loc_15_int
16: loc_16_int
17: loc_17_int
18: loc_18_int
19: loc_19_int
20: loc_20_int
21: loc_21_obj
22: loc_22_obj
23: loc_23_obj
24: loc_24_obj
25: loc_25_int
26: loc_26_int
27: loc_27_obj
28: loc_28_int
29: loc_29_int
30: loc_30_obj
31: loc_31_int
32: loc_32_int
33: loc_33_int
34: loc_34_int
35: loc_35_obj
36: loc_36_obj
37: loc_37_obj
38: loc_38_int
39: loc_39_int
40: loc_40_int
41: loc_41_int
42: loc_42_int
43: loc_43_int
44: loc_44_obj
45: loc_45_obj
46: loc_46_obj
47: loc_47_obj
48: loc_48_int
49: loc_49_int
50: loc_50_obj
51: loc_51_int
52: loc_52_obj
Lexicals :
0: lex_Frame_1_$¢_obj
Instructions :
00000 checkarity 1, 1
00001 param_rp_o loc_0_obj, 0
00002 paramnamesused
00003 set loc_1_obj, loc_0_obj
00004 decont loc_4_obj, loc_1_obj
00005 smrt_strify loc_3_str, loc_4_obj
00006 say loc_3_str
00007 getlex_no loc_4_obj, '$_'
00008 decont loc_4_obj, loc_4_obj
00009 smrt_strify loc_5_str, loc_4_obj
00010 const_s loc_6_str, 'def'
00011 const_i64_16 loc_7_int, 0
00012 index_s loc_7_int, loc_5_str, loc_6_str, loc_7_int
00013 const_i64_16 loc_8_int, 0
00014 ge_i loc_8_int, loc_7_int, loc_8_int
00015 unless_i loc_8_int, label_8(00100)
00016 const_i64_16 loc_15_int, -1
00017 const_i64_16 loc_16_int, 0
00018 const_i64_16 loc_17_int, 1
00019 const_i64_16 loc_18_int, 2
00020 const_i64_16 loc_19_int, 3
00021 const_i64_16 loc_20_int, 4
00022 findmeth loc_22_obj, loc_1_obj, '!cursor_start'
00023 prepargs Callsite_0
00024 arg_o 0, loc_1_obj
00025 invoke_o loc_4_obj, loc_22_obj
00026 wval loc_27_obj, 2, 147
00027 set loc_12_obj, loc_27_obj
00028 getattr_o loc_24_obj, loc_1_obj, loc_12_obj, '$!shared', 5
00029 wval loc_27_obj, 2, 36
00030 getattr_s loc_6_str, loc_24_obj, loc_27_obj, '$!target', 2
00031 getattr_i loc_7_int, loc_4_obj, loc_12_obj, '$!from', 2
00032 getattr_o loc_13_obj, loc_4_obj, loc_12_obj, '$!bstack', 7
00033 getattr_o loc_23_obj, loc_1_obj, loc_12_obj, '$!restart', 10
00034 isconcrete loc_25_int, loc_23_obj
00035 bindlex lex_Frame_1_$¢_obj, loc_4_obj
00036 chars loc_10_int, loc_6_str
00037 eq_i loc_26_int, loc_17_int, loc_25_int
00038 if_i loc_26_int, label_6(00076)
00039 gt_i loc_26_int, loc_7_int, loc_10_int
00040 if_i loc_26_int, label_6(00076)
00041 getattr_i loc_25_int, loc_1_obj, loc_12_obj, '$!from', 2
00042 ne_i loc_25_int, loc_25_int, loc_15_int
00043 if_i loc_25_int, label_5(00063)
00044 goto label_2(00051)
label_1:
00045 inc_i loc_7_int
00046 const_s loc_5_str, 'def'
00047 index_s loc_7_int, loc_6_str, loc_5_str, loc_7_int
00048 eq_i loc_25_int, loc_7_int, loc_15_int
00049 if_i loc_25_int, label_6(00076)
00050 bindattr_i loc_4_obj, loc_12_obj, '$!from', loc_7_int, -1
label_2:
00051 const_i64_16 loc_26_int, 1
00052 elems loc_28_int, loc_13_obj
00053 gt_i loc_29_int, loc_28_int, loc_16_int
00054 if_i loc_29_int, label_3(00057)
00055 set loc_29_int, loc_16_int
00056 goto label_4(00059)
label_3:
00057 dec_i loc_28_int
00058 atpos_i loc_29_int, loc_13_obj, loc_28_int
label_4:
00059 push_i loc_13_obj, loc_26_int
00060 push_i loc_13_obj, loc_7_int
00061 push_i loc_13_obj, loc_16_int
00062 push_i loc_13_obj, loc_29_int
label_5:
00063 const_s loc_5_str, 'def'
00064 eqat_s loc_29_int, loc_6_str, loc_5_str, loc_7_int
00065 unless_i loc_29_int, label_6(00076)
00066 const_i64_16 loc_29_int, 3
00067 add_i loc_7_int, loc_7_int, loc_29_int
00068 findmeth loc_30_obj, loc_4_obj, '!cursor_pass'
00069 prepargs Callsite_1
00070 arg_o 0, loc_4_obj
00071 arg_i 1, loc_7_int
00072 argconst_s 2, 'backtrack'
00073 arg_i 3, loc_17_int
00074 invoke_o loc_30_obj, loc_30_obj
00075 return_o loc_4_obj
label_6:
00076 isnull loc_29_int, loc_13_obj
00077 if_i loc_29_int, label_7(00094)
00078 elems loc_29_int, loc_13_obj
00079 gt_i loc_29_int, loc_29_int, loc_16_int
00080 unless_i loc_29_int, label_7(00094)
00081 pop_i loc_28_int, loc_13_obj
00082 pop_i loc_11_int, loc_13_obj
00083 pop_i loc_7_int, loc_13_obj
00084 pop_i loc_28_int, loc_13_obj
00085 lt_i loc_29_int, loc_7_int, loc_15_int
00086 if_i loc_29_int, label_7(00094)
00087 lt_i loc_29_int, loc_7_int, loc_16_int
00088 if_i loc_29_int, label_6(00076)
00089 eq_i loc_29_int, loc_28_int, loc_16_int
00090 if_i loc_29_int, label_6(00076)
00091 jumplist 2, loc_28_int
00092 goto label_7(00094)
00093 goto label_1(00045)
label_7:
00094 findmeth loc_22_obj, loc_4_obj, '!cursor_fail'
00095 prepargs Callsite_0
00096 arg_o 0, loc_4_obj
00097 invoke_v loc_22_obj
00098 set loc_52_obj, loc_4_obj
00099 goto label_11(00150)
label_8:
00100 const_i64_16 loc_38_int, -1
00101 const_i64_16 loc_39_int, 0
00102 const_i64_16 loc_40_int, 1
00103 const_i64_16 loc_41_int, 2
00104 const_i64_16 loc_42_int, 3
00105 const_i64_16 loc_43_int, 4
00106 findmeth loc_45_obj, loc_1_obj, '!cursor_start'
00107 prepargs Callsite_0
00108 arg_o 0, loc_1_obj
00109 invoke_o loc_30_obj, loc_45_obj
00110 findmeth loc_47_obj, loc_1_obj, '!shared'
00111 prepargs Callsite_0
00112 arg_o 0, loc_1_obj
00113 invoke_o loc_47_obj, loc_47_obj
00114 getwhat loc_50_obj, loc_47_obj
00115 getattr_o loc_35_obj, loc_47_obj, loc_50_obj, '$!CUR_CLASS', -1
00116 getattr_s loc_5_str, loc_47_obj, loc_50_obj, '$!target', 2
00117 getattr_i loc_31_int, loc_30_obj, loc_35_obj, '$!from', -1
00118 getattr_o loc_36_obj, loc_30_obj, loc_35_obj, '$!bstack', -1
00119 getattr_o loc_46_obj, loc_1_obj, loc_35_obj, '$!restart', -1
00120 isconcrete loc_48_int, loc_46_obj
00121 bindlex lex_Frame_1_$¢_obj, loc_30_obj
00122 chars loc_33_int, loc_5_str
00123 eq_i loc_49_int, loc_40_int, loc_48_int
00124 if_i loc_49_int, label_9(00128)
00125 gt_i loc_49_int, loc_31_int, loc_33_int
00126 if_i loc_49_int, label_9(00128)
00127 goto label_9(00128)
label_9:
00128 isnull loc_48_int, loc_36_obj
00129 if_i loc_48_int, label_10(00145)
00130 elems loc_48_int, loc_36_obj
00131 gt_i loc_48_int, loc_48_int, loc_39_int
00132 unless_i loc_48_int, label_10(00145)
00133 pop_i loc_49_int, loc_36_obj
00134 pop_i loc_34_int, loc_36_obj
00135 pop_i loc_31_int, loc_36_obj
00136 pop_i loc_49_int, loc_36_obj
00137 lt_i loc_48_int, loc_31_int, loc_38_int
00138 if_i loc_48_int, label_10(00145)
00139 lt_i loc_48_int, loc_31_int, loc_39_int
00140 if_i loc_48_int, label_9(00128)
00141 eq_i loc_48_int, loc_49_int, loc_39_int
00142 if_i loc_48_int, label_9(00128)
00143 jumplist 1, loc_49_int
00144 goto label_10(00145)
label_10:
00145 findmeth loc_45_obj, loc_30_obj, '!cursor_fail'
00146 prepargs Callsite_0
00147 arg_o 0, loc_30_obj
00148 invoke_v loc_45_obj
00149 set loc_52_obj, loc_30_obj
label_11:
00150 return_o loc_52_obj
Frame_2 :
cuuid : 3
name : <dependencies+deserialize>
Locals :
0: loc_0_obj
1: loc_1_str
2: loc_2_obj
3: loc_3_obj
4: loc_4_obj
5: loc_5_obj
6: loc_6_obj
7: loc_7_obj
8: loc_8_str
9: loc_9_obj
10: loc_10_int
11: loc_11_str
12: loc_12_obj
Instructions :
00000 getcode loc_9_obj, Frame_3
00001 takeclosure loc_9_obj, loc_9_obj
00002 checkarity 0, 0
00003 paramnamesused
00004 const_s loc_1_str, 'ModuleLoader'
00005 getcurhllsym loc_2_obj, loc_1_str
00006 set loc_0_obj, loc_2_obj
00007 ifnonnull loc_2_obj, label_1(00013)
00008 const_s loc_1_str, 'ModuleLoader.moarvm'
00009 loadbytecode loc_1_str, loc_1_str
00010 hllboxtype_s loc_3_obj
00011 box_s loc_3_obj, loc_1_str, loc_3_obj
00012 set loc_0_obj, loc_3_obj
label_1:
00013 getcode loc_3_obj, Frame_0
00014 const_s loc_1_str, 'ModuleLoader'
00015 getcurhllsym loc_2_obj, loc_1_str
00016 const_s loc_1_str, 'NQPCORE'
00017 decont loc_5_obj, loc_2_obj
00018 findmeth loc_4_obj, loc_5_obj, 'load_setting'
00019 prepargs Callsite_3
00020 arg_o 0, loc_2_obj
00021 arg_s 1, loc_1_str
00022 invoke_o loc_4_obj, loc_4_obj
00023 forceouterctx loc_3_obj, loc_4_obj
00024 const_s loc_1_str, 'ModuleLoader'
00025 getcurhllsym loc_4_obj, loc_1_str
00026 const_s loc_1_str, 'NQPP6QRegex'
00027 decont loc_5_obj, loc_4_obj
00028 findmeth loc_2_obj, loc_5_obj, 'load_module'
00029 prepargs Callsite_3
00030 arg_o 0, loc_4_obj
00031 arg_s 1, loc_1_str
00032 invoke_o loc_2_obj, loc_2_obj
00033 const_s loc_1_str, '16E7374520010EC2654FB5713418E6DF3AB3DB3B-0'
00034 createsc loc_4_obj, loc_1_str
00035 set loc_6_obj, loc_4_obj
00036 const_s loc_1_str, '-e'
00037 scsetdesc loc_6_obj, loc_1_str
00038 hlllist loc_4_obj
00039 create loc_4_obj, loc_4_obj
00040 set loc_7_obj, loc_4_obj
00041 null_s loc_8_str
00042 null loc_4_obj
00043 prepargs Callsite_5
00044 invoke_o loc_5_obj, loc_9_obj
00045 deserialize loc_8_str, loc_6_obj, loc_4_obj, loc_5_obj, loc_7_obj
00046 elems loc_10_int, loc_7_obj
00047 unless_i loc_10_int, label_2(00050)
00048 const_s loc_11_str, 'Repossession conflicts occurred during deserialization'
00049 die loc_5_obj, loc_11_str
label_2:
00050 null loc_4_obj
00051 return_o loc_4_obj
Frame_3 :
cuuid : 4
name :
outer : Frame_2
Locals :
0: loc_0_obj
1: loc_1_obj
Instructions :
00000 checkarity 0, 0
00001 paramnamesused
00002 bootarray loc_0_obj
00003 create loc_0_obj, loc_0_obj
00004 getcode loc_1_obj, Frame_1
00005 push_o loc_0_obj, loc_1_obj
00006 return_o loc_0_obj
Frame_4 :
cuuid : 5
name : <load>
Locals :
0: loc_0_obj
1: loc_1_obj
Instructions :
00000 checkarity 0, 0
00001 paramnamesused
00002 getcode loc_0_obj, Frame_0
00003 decont loc_0_obj, loc_0_obj
00004 prepargs Callsite_5
00005 invoke_o loc_0_obj, loc_0_obj
00006 return_o loc_0_obj
Frame_5 :
cuuid : 6
name : <entry>
Locals :
0: loc_0_obj
1: loc_1_obj
2: loc_2_obj
Instructions :
00000 getcode loc_0_obj, Frame_6
00001 takeclosure loc_0_obj, loc_0_obj
00002 checkarity 0, 0
00003 paramnamesused
00004 decont loc_1_obj, loc_0_obj
00005 clargs loc_2_obj
00006 prepargs Callsite_0
00007 arg_o 0, loc_2_obj
00008 invoke_o loc_1_obj, loc_1_obj
00009 return_o loc_1_obj
Frame_6 :
cuuid : 7
name : <main>
outer : Frame_5
Locals :
0: loc_0_obj
1: loc_1_obj
2: loc_2_obj
Instructions :
00000 checkarity 0, -1
00001 param_sp loc_1_obj, 0
00002 paramnamesused
00003 getcode loc_0_obj, Frame_0
00004 decont loc_0_obj, loc_0_obj
00005 prepargs Callsite_6
00006 arg_o 0, loc_1_obj
00007 invoke_o loc_0_obj, loc_0_obj
00008 return_o loc_0_obj
[dan@alexandria nqp]$ ./nqp-m -e 'if "123def789" ~~ / "def" / { say("match") } else { say("no match") }'
- QAST::Regex+{QAST::RegexCursorType}(:rxtype(concat) :subtype() :cursor_type(NQPMatch))
- QAST::Regex(:rxtype(scan) :subtype())
- def
- QAST::Regex(:rxtype(literal) :subtype()) \"def\"
- def
- QAST::Regex(:rxtype(pass) :subtype())
no match
diff --git src/QRegex/P6Regex/Optimizer.nqp src/QRegex/P6Regex/Optimizer.nqp
index 320abb63c..a6b247044 100644
--- src/QRegex/P6Regex/Optimizer.nqp
+++ src/QRegex/P6Regex/Optimizer.nqp
@@ -9,7 +9,27 @@ class QRegex::Optimizer {
@!outer := [$outer];
my $type := $node.rxtype;
if $type eq 'concat' {
- return self.visit_concat($node);
+ my $c := self.visit_concat($node);
+ if nqp::existskey(nqp::getenvhash(), 'NQP_LIT_REGEX_OPT') &&
+ nqp::elems(@($c)) == 3 &&
+ $c[0].rxtype eq 'scan' &&
+ $c[1].rxtype eq 'literal' &&
+ $c[2].rxtype eq 'pass' {
+ note($c.dump);
+ my $if_index :=
+ QAST::Stmts.new(
+ QAST::Op.new(:op('say'), QAST::Var.new(:name('self'), :scope('local'))),
+ QAST::Op.new(:op('if'),
+ QAST::Op.new(:op('isge_i'),
+ QAST::Op.new(:op('index'), QAST::Var.new(:name('$_'), :scope('lexical')), QAST::SVal.new(:value($c[1][0])), QAST::IVal.new(:value(0))),
+ QAST::IVal.new(:value(0))),
+ @!outer[0][1],
+ QAST::Regex.new( :rxtype<anchor>, :subtype<fail>, <!> )));
+ #note($if_index.dump);
+ @!outer[0][1] := $if_index;
+ #note(@!outer[0].dump);
+ }
+ return $c;
} elsif $type eq 'subrule' {
$node := $!main_opt($node) if $!main_opt;
return self.simplify_assertion($node);
[dan@alexandria nqp]$ NQP_LIT_REGEX_OPT=1 ./nqp-m --target=optimize -e 'if "123def789" ~~ / "def" / { say("match") } else { say("no match") }'
- QAST::Regex+{QAST::RegexCursorType}(:rxtype(concat) :subtype() :cursor_type(NQPMatch))
- QAST::Regex(:rxtype(scan) :subtype())
- def
- QAST::Regex(:rxtype(literal) :subtype()) \"def\"
- def
- QAST::Regex(:rxtype(pass) :subtype())
- QAST::CompUnit
[post_deserialize]
- QAST::Op(forceouterctx)
- QAST::BVal(2)
- QAST::Op(callmethod load_setting)
- QAST::Op(getcurhllsym)
- QAST::SVal(ModuleLoader)
- QAST::SVal(NQPCORE)
- QAST::Stmts
- QAST::Op(bindattr)
- QAST::WVal(NQPRegex)
- QAST::WVal(NQPRegex)
- QAST::SVal($!do)
- QAST::BVal(1)
- QAST::Stmts
[main]
- QAST::Stmts
- QAST::Op(call)
- QAST::BVal(2)
- QAST::Var+{QAST::SpecialArg}(local ARGS :decl(param) :flat)
[load]
- QAST::Op(call)
- QAST::BVal(2)
[children]
- QAST::Block(:name(<mainline>) :cuid(2))
│ - QAST::Var(local __lowered_lex_3 :decl(param))
│ - QAST::Stmts
│ - QAST::Var(lexical GLOBALish :decl(static))
│ - QAST::Var(lexical $?PACKAGE :decl(static))
│ - QAST::Var(lexical EXPORT :decl(static))
│ - QAST::Stmts
│ - QAST::Op(bind)
│ - QAST::Var(local ctxsave :decl(var))
│ - QAST::Var(contextual $*CTXSAVE)
│ - QAST::Op(unless)
│ - QAST::Op(isnull)
│ - QAST::Var(local ctxsave)
│ - QAST::Op(if)
│ - QAST::Op(can)
│ - QAST::Var(local ctxsave)
│ - QAST::SVal(ctxsave)
│ - QAST::Op(callmethod ctxsave)
│ - QAST::Var(local ctxsave)
│ - QAST::Stmts if \"123def789\" ~~ / \"def\" / { say(\"match\") }...
│ - QAST::Stmts
│ - QAST::Op(if) \"123def789\" ~~ / \"def\" / { say(\"match\") }
│ - QAST::Op(callmethod ACCEPTS) ~~
│ - QAST::Op(callmethod new) :sink<?>
│ - QAST::VarWithFallback(associative )
│ [fallback]
│ - QAST::Op(ifnull)
│ - QAST::Op(atkey)
│ - QAST::Op(who)
│ - QAST::WVal(GLOBALish)
│ - QAST::SVal(NQPRegex)
│ - QAST::WVal(NQPMu)
│ [children]
│ - QAST::Op(who)
│ - QAST::Var(lexical $?PACKAGE)
│ - QAST::SVal(NQPRegex)
│ - QAST::Block(:name() :cuid(1)) :orig_qast<?> :compile_time_dummy<?>
│ │ - QAST::Stmts
│ │ - QAST::Var(local __lowered_lex_1 :decl(param))
│ │ - QAST::Op(bind)
│ │ - QAST::Var(local self :decl(var))
│ │ - QAST::Var(local __lowered_lex_1)
│ │ - QAST::Var(lexical $¢ :decl(var))
│ │ - QAST::Var(local __lowered_lex_2 :decl(var))
│ │ - QAST::Op(if)
│ │ - QAST::Op(isge_i)
│ │ - QAST::Op(index)
│ │ - QAST::Var(local self)
│ │ - QAST::SVal(def)
│ │ - QAST::IVal(0)
│ │ - QAST::IVal(0)
│ │ - QAST::Regex+{QAST::RegexCursorType}(:rxtype(concat) :subtype() :cursor_type(NQPMatch))
│ │ - QAST::Regex(:rxtype(scan) :subtype())
│ │ - def
│ │ - QAST::Regex(:rxtype(literal) :subtype()) \"def\"
│ │ - def
│ │ - QAST::Regex(:rxtype(pass) :subtype())
Oops!!! Cannot stringify this object of type P6opaque (QAST::Regex)
│ - QAST::SVal(123def789)
│ - QAST::Stmts { say(\"match\") }
│ - QAST::Stmts
│ - QAST::Stmts say(\"match\")
│ - QAST::Stmts
│ - QAST::Op(call &say) say(\"match\")
│ - QAST::SVal(match)
│ - QAST::Stmts { say(\"no match\") }
│ - QAST::Stmts
│ - QAST::Stmts say(\"no match\")
│ - QAST::Stmts
│ - QAST::Op(call &say) say(\"no match\")
│ - QAST::SVal(no match)
│ - QAST::Stmts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment