-
-
Save MasterDuke17/a124b178451becd1e55dd62dae69d6f9 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[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