@@ -2116,100 +2116,6 @@ inline op nqp_rxcommit(in PMC, in LABEL) :base_core {
2116
2116
}
2117
2117
}
2118
2118
2119
- inline op nqp_nfa_run(out PMC, in PMC, in STR, in INT) :base_core {
2120
- PMC *states = $2;
2121
- STRING *target = $3;
2122
- INTVAL offset = $4;
2123
- INTVAL eos = Parrot_str_length(interp, target);
2124
- PMC *fatepos = Parrot_pmc_new(interp, enum_class_ResizablePMCArray);
2125
- PMC *done = Parrot_pmc_new(interp, enum_class_ResizableIntegerArray);
2126
- INTVAL gen = 1;
2127
- PMC *curst = Parrot_pmc_new(interp, enum_class_ResizableIntegerArray);
2128
- PMC *nextst = Parrot_pmc_new(interp, enum_class_ResizableIntegerArray);
2129
- INTVAL i, num_states;
2130
-
2131
- /* Zero out the done array; we don't get zeroed memory by default. */
2132
- num_states = VTABLE_elements(interp, states);
2133
- for (i = 0; i < num_states; i++)
2134
- VTABLE_set_integer_keyed_int(interp, done, i, 0);
2135
-
2136
- VTABLE_push_integer(interp, nextst, 1);
2137
- while (VTABLE_elements(interp, nextst) && offset <= eos) {
2138
- /* Translation of:
2139
- * my @curst := @nextst;
2140
- * @nextst := [];
2141
- * But avoids an extra allocation per offset. */
2142
- PMC *temp = curst;
2143
- curst = nextst;
2144
- VTABLE_set_integer_native(interp, temp, 0);
2145
- nextst = temp;
2146
-
2147
- while (VTABLE_elements(interp, curst)) {
2148
- PMC *edge_info;
2149
- INTVAL edge_info_elems;
2150
-
2151
- INTVAL st = VTABLE_pop_integer(interp, curst);
2152
- if (VTABLE_get_integer_keyed_int(interp, done, st) == gen)
2153
- continue;
2154
- VTABLE_set_integer_keyed_int(interp, done, st, gen);
2155
-
2156
- edge_info = VTABLE_get_pmc_keyed_int(interp, states, st);
2157
- edge_info_elems = VTABLE_elements(interp, edge_info);
2158
- for (i = 0; i < edge_info_elems; i += 3) {
2159
- INTVAL act = VTABLE_get_integer_keyed_int(interp, edge_info, i);
2160
- INTVAL to = VTABLE_get_integer_keyed_int(interp, edge_info, i + 2);
2161
-
2162
- if (act == EDGE_FATE) {
2163
- INTVAL arg = VTABLE_get_integer_keyed_int(interp, edge_info, i + 1);
2164
- VTABLE_set_integer_keyed_int(interp, fatepos, arg, offset);
2165
- }
2166
- else if (act == EDGE_EPSILON && VTABLE_get_integer_keyed_int(interp, done, to) != gen) {
2167
- VTABLE_push_integer(interp, curst, to);
2168
- }
2169
- else if (offset >= eos) {
2170
- /* Can't match, so drop state. */
2171
- }
2172
- else if (act == EDGE_CODEPOINT) {
2173
- UINTVAL arg = VTABLE_get_integer_keyed_int(interp, edge_info, i + 1);
2174
- if (STRING_ord(interp, target, offset) == arg)
2175
- VTABLE_push_integer(interp, nextst, to);
2176
- }
2177
- else if (act == EDGE_CODEPOINT_NEG) {
2178
- UINTVAL arg = VTABLE_get_integer_keyed_int(interp, edge_info, i + 1);
2179
- if (STRING_ord(interp, target, offset) != arg)
2180
- VTABLE_push_integer(interp, nextst, to);
2181
- }
2182
- else if (act == EDGE_CHARCLASS) {
2183
- INTVAL arg = VTABLE_get_integer_keyed_int(interp, edge_info, i + 1);
2184
- if (Parrot_str_is_cclass(interp, arg, target, offset))
2185
- VTABLE_push_integer(interp, nextst, to);
2186
- }
2187
- else if (act == EDGE_CHARCLASS_NEG) {
2188
- INTVAL arg = VTABLE_get_integer_keyed_int(interp, edge_info, i + 1);
2189
- if (!Parrot_str_is_cclass(interp, arg, target, offset))
2190
- VTABLE_push_integer(interp, nextst, to);
2191
- }
2192
- else if (act == EDGE_CHARLIST) {
2193
- STRING *arg = VTABLE_get_string_keyed_int(interp, edge_info, i + 1);
2194
- STRING *chr = STRING_substr(interp, target, offset, 1);
2195
- if (STRING_index(interp, arg, chr, 0) >= 0)
2196
- VTABLE_push_integer(interp, nextst, to);
2197
- }
2198
- else if (act == EDGE_CHARLIST_NEG) {
2199
- STRING *arg = VTABLE_get_string_keyed_int(interp, edge_info, i + 1);
2200
- STRING *chr = STRING_substr(interp, target, offset, 1);
2201
- if (STRING_index(interp, arg, chr, 0) < 0)
2202
- VTABLE_push_integer(interp, nextst, to);
2203
- }
2204
- }
2205
- }
2206
- offset++;
2207
- gen++;
2208
- }
2209
-
2210
- $1 = fatepos;
2211
- }
2212
-
2213
2119
inline op nqp_nfa_run_new(out PMC, in PMC, in STR, in INT) :base_core {
2214
2120
PMC *states = $2;
2215
2121
STRING *target = $3;
0 commit comments