From: Matthias Kramm Date: Tue, 24 Mar 2009 14:08:02 +0000 (+0100) Subject: added rollbacking functionality to trier (for namespaces) X-Git-Tag: release-0-9-0~44 X-Git-Url: http://git.asbjorn.biz/?p=swftools.git;a=commitdiff_plain;h=71c8242a8242eeb6e8b6dcf57239550a6f35c88a added rollbacking functionality to trier (for namespaces) --- diff --git a/lib/as3/parser.tab.c b/lib/as3/parser.tab.c index d2960e5..f4565e5 100644 --- a/lib/as3/parser.tab.c +++ b/lib/as3/parser.tab.c @@ -378,9 +378,7 @@ typedef struct _state { import_list_t*wildcard_imports; dict_t*import_toplevel_packages; dict_t*imports; - namespace_list_t*active_namespaces; - namespace_decl_list_t*new_namespaces; - dict_t*namespace2url; + char has_own_imports; char new_vars; // e.g. transition between two functions @@ -466,11 +464,11 @@ static void new_state() state = s; state->level++; state->has_own_imports = 0; - state->new_namespaces = 0; state->vars = dict_new(); state->old = oldstate; state->new_vars = 0; - state->namespace2url = 0; + + trie_remember(active_namespaces); } static void state_has_imports() { @@ -517,20 +515,14 @@ static void state_destroy(state_t*state) static void old_state() { + trie_rollback(active_namespaces); + if(!state || !state->old) syntaxerror("invalid nesting"); state_t*leaving = state; state = state->old; - namespace_decl_list_t*nl=leaving->new_namespaces; - while(nl) { - tokenizer_unregister_namespace(nl->namespace_decl->name); - nl = nl->next; - } - if(leaving->namespace2url) - dict_destroy(leaving->namespace2url); - if(as3_pass>1 && leaving->method && leaving->method != state->method && !leaving->method->inner) { free(leaving->method); leaving->method=0; @@ -554,6 +546,9 @@ void initialize_file(char*filename) if(state) { syntaxerror("invalid call to initialize_file during parsing of another file"); } + + active_namespaces = trie_new(); + new_state(); state->package = internal_filename_package = strdup(filename); @@ -873,7 +868,7 @@ static namespace_t modifiers2access(modifiers_t*mod) syntaxerror("invalid combination of access levels and namespaces"); ns.access = ACCESS_NAMESPACE; state_t*s = state; - const char*url = (const char*)dict_lookup(state->namespace2url, mod->ns); + const char*url = (const char*)trie_lookup(active_namespaces, mod->ns); if(!url) { /* shouldn't happen- the tokenizer only reports something as a namespace if it was already registered */ @@ -899,6 +894,12 @@ static namespace_t modifiers2access(modifiers_t*mod) } static slotinfo_t* find_class(const char*name); +memberinfo_t* findmember_nsset(classinfo_t*cls, const char*name, char recurse) +{ + /* FIXME- we need to loop through namespaces here */ + return registry_findmember(cls, "", name, recurse); +} + static void function_initvars(methodstate_t*m, params_t*params, int flags, char var0) { if(var0) { @@ -1500,7 +1501,7 @@ static abc_method_t* endfunction(modifiers_t*mod, enum yytokentype getset, char* //flash doesn't seem to allow us to access function slots //state->method->info->slot = slot; - if(mod->flags&FLAG_OVERRIDE) f->trait->attributes |= TRAIT_ATTR_OVERRIDE; + if(mod && mod->flags&FLAG_OVERRIDE) f->trait->attributes |= TRAIT_ATTR_OVERRIDE; if(getset == KW_GET) f->trait->kind = TRAIT_GETTER; if(getset == KW_SET) f->trait->kind = TRAIT_SETTER; if(params->varargs) f->flags |= METHOD_NEED_REST; @@ -1974,19 +1975,6 @@ char is_break_or_jump(code_t*c) return 0; } -void register_namespace(const char*name, const char*url) -{ - NEW(namespace_decl_t,n); - n->name = name; - n->url = url; - if(!state->namespace2url) { - state->namespace2url = dict_new(); - } - dict_put(state->namespace2url, name, url); - list_append(state->new_namespaces, n); - tokenizer_register_namespace(name); -} - #define IS_FINALLY_TARGET(op) \ ((op) == OPCODE___CONTINUE__ || \ (op) == OPCODE___BREAK__ || \ @@ -2111,7 +2099,7 @@ code_t* insert_finally(code_t*c, code_t*finally, int tempvar) /* Line 273 of skeleton.m4 */ -#line 2115 "parser.tab.c" +#line 2103 "parser.tab.c" #ifdef short # undef short @@ -2524,37 +2512,37 @@ static const yytype_int16 yyrhs[] = /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ static const yytype_uint16 yyrline[] = { - 0, 2093, 2093, 2095, 2095, 2096, 2097, 2099, 2100, 2101, - 2102, 2103, 2104, 2105, 2106, 2108, 2108, 2109, 2110, 2112, - 2113, 2114, 2115, 2116, 2117, 2118, 2120, 2121, 2123, 2124, - 2127, 2128, 2129, 2130, 2131, 2132, 2133, 2134, 2135, 2136, - 2137, 2138, 2139, 2140, 2143, 2144, 2145, 2146, 2147, 2148, - 2149, 2150, 2154, 2155, 2159, 2166, 2170, 2171, 2175, 2176, - 2178, 2179, 2181, 2242, 2243, 2246, 2246, 2265, 2266, 2267, - 2272, 2276, 2281, 2282, 2284, 2304, 2352, 2352, 2371, 2371, - 2386, 2389, 2392, 2395, 2399, 2400, 2401, 2402, 2403, 2404, - 2406, 2417, 2420, 2420, 2451, 2451, 2476, 2476, 2492, 2493, - 2494, 2495, 2503, 2512, 2512, 2561, 2565, 2576, 2586, 2603, - 2604, 2605, 2607, 2608, 2610, 2610, 2612, 2612, 2615, 2631, - 2648, 2649, 2650, 2651, 2659, 2660, 2661, 2662, 2663, 2664, - 2665, 2666, 2667, 2668, 2672, 2673, 2675, 2676, 2678, 2679, - 2683, 2681, 2689, 2687, 2696, 2697, 2698, 2699, 2700, 2701, - 2702, 2703, 2705, 2711, 2712, 2713, 2714, 2715, 2716, 2719, - 2732, 2732, 2734, 2734, 2736, 2737, 2739, 2814, 2815, 2817, - 2818, 2819, 2820, 2821, 2823, 2824, 2825, 2826, 2838, 2842, - 2848, 2854, 2862, 2867, 2873, 2881, 2889, 2890, 2891, 2894, - 2893, 2910, 2911, 2913, 2912, 2936, 2955, 2969, 2970, 2972, - 2973, 2975, 2976, 2977, 2986, 2987, 2991, 2992, 2994, 2995, - 2996, 2998, 3002, 3003, 3008, 3009, 3045, 3091, 3112, 3133, - 3136, 3143, 3144, 3145, 3151, 3157, 3159, 3161, 3163, 3165, - 3167, 3169, 3186, 3191, 3194, 3197, 3200, 3203, 3206, 3209, - 3212, 3215, 3219, 3222, 3225, 3228, 3231, 3234, 3237, 3240, - 3244, 3255, 3273, 3278, 3283, 3288, 3293, 3298, 3302, 3306, - 3311, 3315, 3319, 3328, 3337, 3347, 3352, 3364, 3370, 3375, - 3381, 3387, 3391, 3393, 3404, 3413, 3420, 3421, 3423, 3429, - 3438, 3445, 3457, 3463, 3469, 3475, 3481, 3487, 3493, 3499, - 3512, 3523, 3530, 3543, 3570, 3584, 3598, 3612, 3627, 3634, - 3641, 3648, 3655, 3666, 3716, 3821, 3828, 3835, 3842, 3857 + 0, 2081, 2081, 2083, 2083, 2084, 2085, 2087, 2088, 2089, + 2090, 2091, 2092, 2093, 2094, 2096, 2096, 2097, 2098, 2100, + 2101, 2102, 2103, 2104, 2105, 2106, 2108, 2109, 2111, 2112, + 2115, 2116, 2117, 2118, 2119, 2120, 2121, 2122, 2123, 2124, + 2125, 2126, 2127, 2128, 2131, 2132, 2133, 2134, 2135, 2136, + 2137, 2138, 2142, 2143, 2147, 2154, 2158, 2159, 2163, 2164, + 2166, 2167, 2169, 2230, 2231, 2234, 2234, 2253, 2254, 2255, + 2260, 2264, 2269, 2270, 2272, 2292, 2340, 2340, 2359, 2359, + 2374, 2377, 2380, 2383, 2387, 2388, 2389, 2390, 2391, 2392, + 2394, 2405, 2408, 2408, 2439, 2439, 2464, 2464, 2480, 2481, + 2482, 2483, 2491, 2500, 2500, 2549, 2553, 2564, 2574, 2591, + 2592, 2593, 2595, 2596, 2598, 2598, 2600, 2600, 2603, 2619, + 2636, 2637, 2638, 2639, 2646, 2647, 2648, 2649, 2650, 2651, + 2652, 2653, 2654, 2655, 2659, 2660, 2662, 2663, 2665, 2666, + 2670, 2668, 2676, 2674, 2683, 2684, 2685, 2686, 2687, 2688, + 2689, 2690, 2692, 2698, 2699, 2700, 2701, 2702, 2703, 2706, + 2719, 2719, 2721, 2721, 2723, 2724, 2726, 2801, 2802, 2804, + 2805, 2806, 2807, 2808, 2810, 2811, 2812, 2813, 2825, 2829, + 2835, 2841, 2849, 2854, 2860, 2868, 2876, 2877, 2878, 2881, + 2880, 2897, 2898, 2900, 2899, 2923, 2942, 2956, 2957, 2959, + 2960, 2962, 2963, 2964, 2973, 2974, 2978, 2979, 2981, 2982, + 2983, 2985, 2989, 2990, 2995, 2996, 3032, 3078, 3099, 3120, + 3123, 3130, 3131, 3132, 3138, 3144, 3146, 3148, 3150, 3152, + 3154, 3156, 3173, 3178, 3181, 3184, 3187, 3190, 3193, 3196, + 3199, 3202, 3206, 3209, 3212, 3215, 3218, 3221, 3224, 3227, + 3231, 3242, 3260, 3265, 3270, 3275, 3280, 3285, 3289, 3293, + 3298, 3302, 3306, 3315, 3324, 3334, 3339, 3351, 3357, 3362, + 3368, 3374, 3378, 3380, 3391, 3400, 3407, 3408, 3410, 3416, + 3425, 3432, 3444, 3450, 3456, 3462, 3468, 3474, 3480, 3486, + 3499, 3510, 3517, 3530, 3557, 3571, 3585, 3599, 3614, 3621, + 3628, 3635, 3642, 3653, 3703, 3808, 3815, 3822, 3829, 3844 }; #endif @@ -4349,7 +4337,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2120 "parser.y" +#line 2108 "parser.y" {(yyval.code)=(yyvsp[(1) - (1)].code);} } break; @@ -4360,7 +4348,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2121 "parser.y" +#line 2109 "parser.y" {(yyval.code)=code_new();} } break; @@ -4371,7 +4359,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2123 "parser.y" +#line 2111 "parser.y" {(yyval.code)=code_append((yyvsp[(1) - (2)].code),(yyvsp[(2) - (2)].code));} } break; @@ -4382,7 +4370,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2124 "parser.y" +#line 2112 "parser.y" {(yyval.code)=(yyvsp[(1) - (1)].code);} } break; @@ -4393,7 +4381,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2139 "parser.y" +#line 2127 "parser.y" {(yyval.code)=(yyvsp[(2) - (3)].code);} } break; @@ -4404,7 +4392,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2140 "parser.y" +#line 2128 "parser.y" {(yyval.code)=0;} } break; @@ -4415,7 +4403,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2143 "parser.y" +#line 2131 "parser.y" {(yyval.code)=0;} } break; @@ -4426,7 +4414,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2150 "parser.y" +#line 2138 "parser.y" {(yyval.code)=(yyvsp[(3) - (4)].code);} } break; @@ -4437,7 +4425,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2154 "parser.y" +#line 2142 "parser.y" {(yyval.code)=(yyvsp[(1) - (2)].code);} } break; @@ -4448,7 +4436,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2155 "parser.y" +#line 2143 "parser.y" {(yyval.code)=(yyvsp[(1) - (1)].code);} } break; @@ -4459,7 +4447,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2159 "parser.y" +#line 2147 "parser.y" { code_t**cc = &global->init->method->body->code; *cc = code_append(*cc, (yyvsp[(1) - (1)].code)); @@ -4473,7 +4461,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2170 "parser.y" +#line 2158 "parser.y" {(yyval.value)=(yyvsp[(2) - (2)].value);} } break; @@ -4484,7 +4472,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2171 "parser.y" +#line 2159 "parser.y" {(yyval.value).c=abc_pushundefined(0); (yyval.value).t=TYPE_ANY; } @@ -4497,7 +4485,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2175 "parser.y" +#line 2163 "parser.y" {(yyval.code)=(yyvsp[(2) - (2)].code);} } break; @@ -4508,7 +4496,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2176 "parser.y" +#line 2164 "parser.y" {(yyval.code)=(yyvsp[(2) - (2)].code);} } break; @@ -4519,7 +4507,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2178 "parser.y" +#line 2166 "parser.y" {(yyval.code) = (yyvsp[(1) - (1)].code);} } break; @@ -4530,7 +4518,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2179 "parser.y" +#line 2167 "parser.y" {(yyval.code) = code_append((yyvsp[(1) - (3)].code), (yyvsp[(3) - (3)].code));} } break; @@ -4541,7 +4529,7 @@ yyreduce: if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2182 "parser.y" +#line 2170 "parser.y" { PASS12 if(variable_exists((yyvsp[(1) - (3)].id))) @@ -4608,7 +4596,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2242 "parser.y" +#line 2230 "parser.y" {(yyval.code) = code_new();} } break; @@ -4619,7 +4607,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2243 "parser.y" +#line 2231 "parser.y" {(yyval.code)=(yyvsp[(2) - (2)].code);} } break; @@ -4630,7 +4618,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2246 "parser.y" +#line 2234 "parser.y" {PASS12 new_state();} } break; @@ -4641,7 +4629,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2246 "parser.y" +#line 2234 "parser.y" { (yyval.code) = code_new(); @@ -4669,7 +4657,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2265 "parser.y" +#line 2253 "parser.y" {(yyval.code)=code_new();} } break; @@ -4680,7 +4668,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2272 "parser.y" +#line 2260 "parser.y" { PASS1 (yyval.id)=(yyvsp[(2) - (3)].id);new_variable((yyvsp[(2) - (3)].id),0,1,0); PASS2 (yyval.id)=(yyvsp[(2) - (3)].id);new_variable((yyvsp[(2) - (3)].id),(yyvsp[(3) - (3)].classinfo),1,0); @@ -4694,7 +4682,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2276 "parser.y" +#line 2264 "parser.y" { PASS12 (yyval.id)=(yyvsp[(1) - (1)].id); @@ -4708,7 +4696,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2281 "parser.y" +#line 2269 "parser.y" {PASS12 new_state();(yyval.for_start).name=(yyvsp[(1) - (2)].id);(yyval.for_start).each=0;} } break; @@ -4719,7 +4707,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2282 "parser.y" +#line 2270 "parser.y" {PASS12 new_state();(yyval.for_start).name=(yyvsp[(1) - (3)].id);(yyval.for_start).each=1;} } break; @@ -4730,7 +4718,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2284 "parser.y" +#line 2272 "parser.y" { if((yyvsp[(1) - (8)].for_start).each) syntaxerror("invalid syntax: ; not allowed in for each statement"); (yyval.code) = code_new(); @@ -4759,7 +4747,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2304 "parser.y" +#line 2292 "parser.y" { variable_t*var = find_variable(state, (yyvsp[(2) - (6)].id)); if(!var) { @@ -4816,7 +4804,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2352 "parser.y" +#line 2340 "parser.y" {PASS12 new_state();} } break; @@ -4827,7 +4815,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2352 "parser.y" +#line 2340 "parser.y" { (yyval.code) = code_new(); @@ -4855,7 +4843,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2371 "parser.y" +#line 2359 "parser.y" {PASS12 new_state();} } break; @@ -4866,7 +4854,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2371 "parser.y" +#line 2359 "parser.y" { (yyval.code) = code_new(); code_t*loopstart = (yyval.code) = abc_label((yyval.code)); @@ -4890,7 +4878,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2386 "parser.y" +#line 2374 "parser.y" { (yyval.code) = abc___break__(0, ""); } @@ -4903,7 +4891,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2389 "parser.y" +#line 2377 "parser.y" { (yyval.code) = abc___break__(0, (yyvsp[(2) - (2)].id)); } @@ -4916,7 +4904,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2392 "parser.y" +#line 2380 "parser.y" { (yyval.code) = abc___continue__(0, ""); } @@ -4929,7 +4917,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2395 "parser.y" +#line 2383 "parser.y" { (yyval.code) = abc___continue__(0, (yyvsp[(2) - (2)].id)); } @@ -4942,7 +4930,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2399 "parser.y" +#line 2387 "parser.y" {(yyval.code)=0;} } break; @@ -4953,7 +4941,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2400 "parser.y" +#line 2388 "parser.y" {(yyval.code)=(yyvsp[(1) - (1)].code);} } break; @@ -4964,7 +4952,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2401 "parser.y" +#line 2389 "parser.y" {(yyval.code)=(yyvsp[(1) - (1)].code);} } break; @@ -4975,7 +4963,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2402 "parser.y" +#line 2390 "parser.y" {(yyval.code)=code_append((yyvsp[(1) - (2)].code),(yyvsp[(2) - (2)].code));} } break; @@ -4986,7 +4974,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2403 "parser.y" +#line 2391 "parser.y" {(yyval.code)=(yyvsp[(1) - (1)].code);} } break; @@ -4997,7 +4985,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2404 "parser.y" +#line 2392 "parser.y" {(yyval.code)=code_append((yyval.code),(yyvsp[(2) - (2)].code));} } break; @@ -5008,7 +4996,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2406 "parser.y" +#line 2394 "parser.y" { (yyval.code) = abc_getlocal(0, state->switch_var); (yyval.code) = code_append((yyval.code), (yyvsp[(2) - (4)].value).c); @@ -5029,7 +5017,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2417 "parser.y" +#line 2405 "parser.y" { (yyval.code) = (yyvsp[(3) - (3)].code); } @@ -5042,7 +5030,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2420 "parser.y" +#line 2408 "parser.y" {PASS12 new_state();state->switch_var=alloc_local();} } break; @@ -5053,7 +5041,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2420 "parser.y" +#line 2408 "parser.y" { (yyval.code)=(yyvsp[(4) - (8)].value).c; (yyval.code) = abc_setlocal((yyval.code), state->switch_var); @@ -5091,7 +5079,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2451 "parser.y" +#line 2439 "parser.y" {PASS12 new_state(); state->exception_name=(yyvsp[(3) - (5)].id); PASS1 new_variable((yyvsp[(3) - (5)].id), 0, 0, 0); @@ -5106,7 +5094,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2456 "parser.y" +#line 2444 "parser.y" { namespace_t name_ns = {ACCESS_PACKAGE, ""}; multiname_t name = {QNAME, &name_ns, 0, (yyvsp[(3) - (9)].id)}; @@ -5136,7 +5124,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2476 "parser.y" +#line 2464 "parser.y" {PASS12 new_state();state->exception_name=0;} } break; @@ -5147,7 +5135,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2476 "parser.y" +#line 2464 "parser.y" { (yyvsp[(4) - (5)].code) = var_block((yyvsp[(4) - (5)].code)); if(!(yyvsp[(4) - (5)].code)) { @@ -5172,7 +5160,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2492 "parser.y" +#line 2480 "parser.y" {(yyval.catch_list).l=list_new();(yyval.catch_list).finally=0;list_append((yyval.catch_list).l,(yyvsp[(1) - (1)].exception));} } break; @@ -5183,7 +5171,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2493 "parser.y" +#line 2481 "parser.y" {(yyval.catch_list)=(yyvsp[(1) - (2)].catch_list);list_append((yyval.catch_list).l,(yyvsp[(2) - (2)].exception));} } break; @@ -5194,7 +5182,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2494 "parser.y" +#line 2482 "parser.y" {(yyval.catch_list)=(yyvsp[(1) - (1)].catch_list);} } break; @@ -5205,7 +5193,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2495 "parser.y" +#line 2483 "parser.y" { (yyval.catch_list) = (yyvsp[(1) - (2)].catch_list); (yyval.catch_list).finally = 0; @@ -5223,7 +5211,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2503 "parser.y" +#line 2491 "parser.y" { (yyval.catch_list).l=list_new(); (yyval.catch_list).finally = 0; @@ -5241,7 +5229,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2512 "parser.y" +#line 2500 "parser.y" {PASS12 new_state(); state->method->has_exceptions=1; state->method->late_binding=1;//for invariant scope_code @@ -5255,7 +5243,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2515 "parser.y" +#line 2503 "parser.y" { code_t*out = abc_nop(0); @@ -5308,7 +5296,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2561 "parser.y" +#line 2549 "parser.y" { (yyval.code)=(yyvsp[(2) - (2)].value).c; (yyval.code)=abc_throw((yyval.code)); @@ -5322,7 +5310,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2565 "parser.y" +#line 2553 "parser.y" { if(!state->exception_name) syntaxerror("re-throw only possible within a catch block"); @@ -5340,7 +5328,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2576 "parser.y" +#line 2564 "parser.y" { new_state(); if(state->method->has_exceptions) { @@ -5360,7 +5348,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2586 "parser.y" +#line 2574 "parser.y" { /* remove getlocal;pushwith from scope code again */ state->method->scope_code = code_cutlast(code_cutlast(state->method->scope_code)); @@ -5384,7 +5372,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2604 "parser.y" +#line 2592 "parser.y" {PASS12 (yyval.id)="package";} } break; @@ -5395,7 +5383,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2605 "parser.y" +#line 2593 "parser.y" {PASS12 (yyval.id)=(yyvsp[(1) - (1)].id);} } break; @@ -5406,7 +5394,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2607 "parser.y" +#line 2595 "parser.y" {PASS12 (yyval.id) = concat3((yyvsp[(1) - (3)].id),".",(yyvsp[(3) - (3)].id));free((yyvsp[(1) - (3)].id));(yyvsp[(1) - (3)].id)=0;} } break; @@ -5417,7 +5405,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2608 "parser.y" +#line 2596 "parser.y" {PASS12 (yyval.id)=strdup((yyvsp[(1) - (1)].id));} } break; @@ -5428,7 +5416,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2610 "parser.y" +#line 2598 "parser.y" {PASS12 startpackage((yyvsp[(2) - (3)].id));free((yyvsp[(2) - (3)].id));(yyvsp[(2) - (3)].id)=0;} } break; @@ -5439,7 +5427,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2611 "parser.y" +#line 2599 "parser.y" {PASS12 endpackage();(yyval.code)=0;} } break; @@ -5450,7 +5438,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2612 "parser.y" +#line 2600 "parser.y" {PASS12 startpackage("");} } break; @@ -5461,7 +5449,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2613 "parser.y" +#line 2601 "parser.y" {PASS12 endpackage();(yyval.code)=0;} } break; @@ -5472,7 +5460,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2615 "parser.y" +#line 2603 "parser.y" { PASS12 slotinfo_t*s = registry_find((yyvsp[(2) - (2)].classinfo)->package, (yyvsp[(2) - (2)].classinfo)->name); @@ -5498,7 +5486,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2631 "parser.y" +#line 2619 "parser.y" { PASS12 if(strncmp("flash.", (yyvsp[(2) - (4)].id), 6) && as3_pass==1) { @@ -5522,7 +5510,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2648 "parser.y" +#line 2636 "parser.y" {PASS12 (yyval.flags).flags=0;(yyval.flags).ns=0;} } break; @@ -5533,7 +5521,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2649 "parser.y" +#line 2637 "parser.y" {PASS12 (yyval.flags)=(yyvsp[(1) - (1)].flags);} } break; @@ -5544,7 +5532,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2650 "parser.y" +#line 2638 "parser.y" {PASS12 (yyval.flags)=(yyvsp[(1) - (1)].flags);} } break; @@ -5555,7 +5543,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2651 "parser.y" +#line 2639 "parser.y" { PASS12 (yyval.flags).flags=(yyvsp[(1) - (2)].flags).flags|(yyvsp[(2) - (2)].flags).flags; @@ -5572,7 +5560,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2659 "parser.y" +#line 2646 "parser.y" {PASS12 (yyval.flags).flags=FLAG_PUBLIC;(yyval.flags).ns=0;} } break; @@ -5583,7 +5571,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2660 "parser.y" +#line 2647 "parser.y" {PASS12 (yyval.flags).flags=FLAG_PRIVATE;(yyval.flags).ns=0;} } break; @@ -5594,7 +5582,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2661 "parser.y" +#line 2648 "parser.y" {PASS12 (yyval.flags).flags=FLAG_PROTECTED;(yyval.flags).ns=0;} } break; @@ -5605,7 +5593,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2662 "parser.y" +#line 2649 "parser.y" {PASS12 (yyval.flags).flags=FLAG_STATIC;(yyval.flags).ns=0;} } break; @@ -5616,7 +5604,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2663 "parser.y" +#line 2650 "parser.y" {PASS12 (yyval.flags).flags=FLAG_DYNAMIC;(yyval.flags).ns=0;} } break; @@ -5627,7 +5615,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2664 "parser.y" +#line 2651 "parser.y" {PASS12 (yyval.flags).flags=FLAG_FINAL;(yyval.flags).ns=0;} } break; @@ -5638,7 +5626,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2665 "parser.y" +#line 2652 "parser.y" {PASS12 (yyval.flags).flags=FLAG_OVERRIDE;(yyval.flags).ns=0;} } break; @@ -5649,7 +5637,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2666 "parser.y" +#line 2653 "parser.y" {PASS12 (yyval.flags).flags=FLAG_NATIVE;(yyval.flags).ns=0;} } break; @@ -5660,7 +5648,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2667 "parser.y" +#line 2654 "parser.y" {PASS12 (yyval.flags).flags=FLAG_PACKAGEINTERNAL;(yyval.flags).ns=0;} } break; @@ -5671,7 +5659,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2668 "parser.y" +#line 2655 "parser.y" {PASS12 (yyval.flags).flags=FLAG_NAMESPACE; (yyval.flags).ns=(yyvsp[(1) - (1)].id); } @@ -5684,7 +5672,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2672 "parser.y" +#line 2659 "parser.y" {PASS12 (yyval.classinfo)=0;} } break; @@ -5695,7 +5683,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2673 "parser.y" +#line 2660 "parser.y" {PASS12 (yyval.classinfo)=(yyvsp[(2) - (2)].classinfo);} } break; @@ -5706,7 +5694,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2675 "parser.y" +#line 2662 "parser.y" {PASS12 (yyval.classinfo_list)=list_new();} } break; @@ -5717,7 +5705,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2676 "parser.y" +#line 2663 "parser.y" {PASS12 (yyval.classinfo_list)=(yyvsp[(2) - (2)].classinfo_list);} } break; @@ -5728,7 +5716,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2678 "parser.y" +#line 2665 "parser.y" {PASS12 (yyval.classinfo_list)=list_new();} } break; @@ -5739,7 +5727,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2679 "parser.y" +#line 2666 "parser.y" {PASS12 (yyval.classinfo_list)=(yyvsp[(2) - (2)].classinfo_list);} } break; @@ -5750,7 +5738,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2683 "parser.y" +#line 2670 "parser.y" {PASS12 startclass(&(yyvsp[(1) - (6)].flags),(yyvsp[(3) - (6)].id),(yyvsp[(4) - (6)].classinfo),(yyvsp[(5) - (6)].classinfo_list));} } break; @@ -5761,7 +5749,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2685 "parser.y" +#line 2672 "parser.y" {PASS12 endclass();(yyval.code)=0;} } break; @@ -5772,7 +5760,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2689 "parser.y" +#line 2676 "parser.y" {PASS12 (yyvsp[(1) - (5)].flags).flags|=FLAG_INTERFACE; startclass(&(yyvsp[(1) - (5)].flags),(yyvsp[(3) - (5)].id),0,(yyvsp[(4) - (5)].classinfo_list));} } @@ -5784,7 +5772,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2692 "parser.y" +#line 2679 "parser.y" {PASS12 endclass();(yyval.code)=0;} } break; @@ -5795,7 +5783,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2705 "parser.y" +#line 2692 "parser.y" { code_t*c = state->cls->static_init->header; c = code_append(c, (yyvsp[(1) - (1)].code)); @@ -5810,7 +5798,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2716 "parser.y" +#line 2703 "parser.y" { syntaxerror("variable declarations not allowed in interfaces"); } @@ -5823,7 +5811,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2719 "parser.y" +#line 2706 "parser.y" { PASS12 (yyvsp[(1) - (8)].flags).flags |= FLAG_PUBLIC; @@ -5843,7 +5831,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2734 "parser.y" +#line 2721 "parser.y" {setslotstate(&(yyvsp[(1) - (2)].flags),(yyvsp[(2) - (2)].token));} } break; @@ -5854,7 +5842,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2734 "parser.y" +#line 2721 "parser.y" {(yyval.code)=(yyvsp[(4) - (4)].code);setslotstate(0, 0);} } break; @@ -5865,7 +5853,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2736 "parser.y" +#line 2723 "parser.y" {(yyval.code) = (yyvsp[(1) - (1)].code);} } break; @@ -5876,7 +5864,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2737 "parser.y" +#line 2724 "parser.y" {(yyval.code) = code_append((yyvsp[(1) - (3)].code), (yyvsp[(3) - (3)].code));} } break; @@ -5887,7 +5875,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2740 "parser.y" +#line 2727 "parser.y" { int flags = slotstate_flags->flags; namespace_t ns = modifiers2access(slotstate_flags); @@ -5968,7 +5956,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2814 "parser.y" +#line 2801 "parser.y" {(yyval.constant)=0;} } break; @@ -5979,7 +5967,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2815 "parser.y" +#line 2802 "parser.y" {(yyval.constant)=(yyvsp[(2) - (2)].constant);} } break; @@ -5990,7 +5978,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2817 "parser.y" +#line 2804 "parser.y" {(yyval.constant) = constant_new_int((yyvsp[(1) - (1)].number_uint));} } break; @@ -6001,7 +5989,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2818 "parser.y" +#line 2805 "parser.y" {(yyval.constant) = constant_new_int((yyvsp[(1) - (1)].number_int));} } break; @@ -6012,7 +6000,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2819 "parser.y" +#line 2806 "parser.y" {(yyval.constant) = constant_new_uint((yyvsp[(1) - (1)].number_uint));} } break; @@ -6023,7 +6011,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2820 "parser.y" +#line 2807 "parser.y" {(yyval.constant) = constant_new_float((yyvsp[(1) - (1)].number_float));} } break; @@ -6034,7 +6022,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2821 "parser.y" +#line 2808 "parser.y" {(yyval.constant) = constant_new_string2((yyvsp[(1) - (1)].str).str,(yyvsp[(1) - (1)].str).len);free((char*)(yyvsp[(1) - (1)].str).str);} } break; @@ -6045,7 +6033,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2823 "parser.y" +#line 2810 "parser.y" {(yyval.constant) = constant_new_true((yyvsp[(1) - (1)].token));} } break; @@ -6056,7 +6044,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2824 "parser.y" +#line 2811 "parser.y" {(yyval.constant) = constant_new_false((yyvsp[(1) - (1)].token));} } break; @@ -6067,7 +6055,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2825 "parser.y" +#line 2812 "parser.y" {(yyval.constant) = constant_new_null((yyvsp[(1) - (1)].token));} } break; @@ -6078,7 +6066,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2826 "parser.y" +#line 2813 "parser.y" { if(!strcmp((yyvsp[(1) - (1)].id), "NaN")) { (yyval.constant) = constant_new_float(__builtin_nan("")); @@ -6096,7 +6084,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2838 "parser.y" +#line 2825 "parser.y" { PASS12 memset(&(yyval.params),0,sizeof((yyval.params))); @@ -6110,7 +6098,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2842 "parser.y" +#line 2829 "parser.y" { PASS12 (yyval.params)=(yyvsp[(1) - (1)].params); @@ -6124,7 +6112,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2848 "parser.y" +#line 2835 "parser.y" { PASS12 memset(&(yyval.params),0,sizeof((yyval.params))); @@ -6140,7 +6128,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2854 "parser.y" +#line 2841 "parser.y" { PASS12 (yyval.params) =(yyvsp[(1) - (4)].params); @@ -6156,7 +6144,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2862 "parser.y" +#line 2849 "parser.y" { PASS12 (yyval.params) = (yyvsp[(1) - (3)].params); @@ -6171,7 +6159,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2867 "parser.y" +#line 2854 "parser.y" { PASS12 memset(&(yyval.params),0,sizeof((yyval.params))); @@ -6186,7 +6174,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2873 "parser.y" +#line 2860 "parser.y" { PASS12 (yyval.param) = rfx_calloc(sizeof(param_t)); @@ -6204,7 +6192,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2881 "parser.y" +#line 2868 "parser.y" { PASS12 (yyval.param) = rfx_calloc(sizeof(param_t)); @@ -6222,7 +6210,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2891 "parser.y" +#line 2878 "parser.y" {PASS12 (yyval.token)=0;} } break; @@ -6233,7 +6221,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2894 "parser.y" +#line 2881 "parser.y" {PASS12 startfunction(&(yyvsp[(1) - (9)].flags),(yyvsp[(3) - (9)].token),(yyvsp[(4) - (9)].id),&(yyvsp[(6) - (9)].params),(yyvsp[(8) - (9)].classinfo));} } break; @@ -6244,7 +6232,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2895 "parser.y" +#line 2882 "parser.y" { PASS1 endfunction(&(yyvsp[(1) - (12)].flags),(yyvsp[(3) - (12)].token),(yyvsp[(4) - (12)].id),&(yyvsp[(6) - (12)].params),0,0); @@ -6268,7 +6256,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2911 "parser.y" +#line 2898 "parser.y" {PASS12 (yyval.id)=0;} } break; @@ -6279,7 +6267,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2913 "parser.y" +#line 2900 "parser.y" {PASS12 innerfunction((yyvsp[(2) - (7)].id),&(yyvsp[(4) - (7)].params),(yyvsp[(6) - (7)].classinfo));} } break; @@ -6290,7 +6278,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2914 "parser.y" +#line 2901 "parser.y" { PASS1 endfunction(0,0,(yyvsp[(2) - (10)].id),&(yyvsp[(4) - (10)].params),0,0); @@ -6318,7 +6306,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2936 "parser.y" +#line 2923 "parser.y" { PASS1 NEW(unresolvedinfo_t,c); memset(c, 0, sizeof(*c)); @@ -6346,7 +6334,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2955 "parser.y" +#line 2942 "parser.y" { PASS1 NEW(unresolvedinfo_t,c); memset(c, 0, sizeof(*c)); @@ -6369,7 +6357,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2972 "parser.y" +#line 2959 "parser.y" {PASS12 (yyval.classinfo_list)=list_new();list_append((yyval.classinfo_list), (yyvsp[(1) - (1)].classinfo));} } break; @@ -6380,7 +6368,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2973 "parser.y" +#line 2960 "parser.y" {PASS12 (yyval.classinfo_list)=(yyvsp[(1) - (3)].classinfo_list);list_append((yyval.classinfo_list),(yyvsp[(3) - (3)].classinfo));} } break; @@ -6391,7 +6379,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2975 "parser.y" +#line 2962 "parser.y" {PASS12 (yyval.classinfo)=(yyvsp[(1) - (1)].classinfo);} } break; @@ -6402,7 +6390,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2976 "parser.y" +#line 2963 "parser.y" {PASS12 (yyval.classinfo)=registry_getanytype();} } break; @@ -6413,7 +6401,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2977 "parser.y" +#line 2964 "parser.y" {PASS12 (yyval.classinfo)=registry_getanytype();} } break; @@ -6424,7 +6412,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2986 "parser.y" +#line 2973 "parser.y" {PASS12 (yyval.classinfo)=(yyvsp[(2) - (2)].classinfo);} } break; @@ -6435,7 +6423,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2987 "parser.y" +#line 2974 "parser.y" {PASS12 (yyval.classinfo)=0;} } break; @@ -6446,7 +6434,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2991 "parser.y" +#line 2978 "parser.y" {(yyval.value_list).cc=0;(yyval.value_list).number=0;} } break; @@ -6457,7 +6445,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2992 "parser.y" +#line 2979 "parser.y" {(yyval.value_list)=(yyvsp[(2) - (3)].value_list);} } break; @@ -6468,7 +6456,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2994 "parser.y" +#line 2981 "parser.y" {(yyval.value_list).cc=0;(yyval.value_list).number=0;} } break; @@ -6479,7 +6467,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 2998 "parser.y" +#line 2985 "parser.y" {(yyval.value_list).number=1; (yyval.value_list).cc = (yyvsp[(1) - (1)].value).c; } @@ -6492,7 +6480,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3002 "parser.y" +#line 2989 "parser.y" {(yyval.value_list) = (yyvsp[(1) - (2)].value_list);} } break; @@ -6503,7 +6491,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3003 "parser.y" +#line 2990 "parser.y" { (yyval.value_list).number= (yyvsp[(1) - (2)].value_list).number+1; (yyval.value_list).cc = code_append((yyvsp[(1) - (2)].value_list).cc, (yyvsp[(2) - (2)].value).c); @@ -6517,7 +6505,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3009 "parser.y" +#line 2996 "parser.y" { (yyval.value).c = (yyvsp[(2) - (4)].value).c; if((yyval.value).c->opcode == OPCODE_COERCE_A) (yyval.value).c = code_cutlast((yyval.value).c); @@ -6558,7 +6546,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3045 "parser.y" +#line 3032 "parser.y" { (yyval.value).c = (yyvsp[(1) - (4)].value).c; @@ -6613,7 +6601,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3091 "parser.y" +#line 3078 "parser.y" { if(!state->cls) syntaxerror("super() not allowed outside of a class"); if(!state->method) syntaxerror("super() not allowed outside of a function"); @@ -6643,7 +6631,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3112 "parser.y" +#line 3099 "parser.y" { (yyval.value).c = (yyvsp[(2) - (2)].value).c; if((yyval.value).c->opcode == OPCODE_COERCE_A) { @@ -6673,7 +6661,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3133 "parser.y" +#line 3120 "parser.y" { (yyval.code) = abc_returnvoid(0); } @@ -6686,7 +6674,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3136 "parser.y" +#line 3123 "parser.y" { (yyval.code) = (yyvsp[(2) - (2)].value).c; (yyval.code) = abc_returnvalue((yyval.code)); @@ -6700,7 +6688,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3143 "parser.y" +#line 3130 "parser.y" {(yyval.value)=(yyvsp[(1) - (1)].value);} } break; @@ -6711,7 +6699,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3144 "parser.y" +#line 3131 "parser.y" {(yyval.value) = (yyvsp[(1) - (1)].value);} } break; @@ -6722,7 +6710,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3145 "parser.y" +#line 3132 "parser.y" { (yyval.value).c = (yyvsp[(1) - (3)].value).c; (yyval.value).c = cut_last_push((yyval.value).c); @@ -6738,7 +6726,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3151 "parser.y" +#line 3138 "parser.y" { (yyval.code)=cut_last_push((yyvsp[(1) - (1)].value).c); } @@ -6751,7 +6739,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3157 "parser.y" +#line 3144 "parser.y" {(yyval.value) = (yyvsp[(1) - (1)].value);} } break; @@ -6762,7 +6750,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3161 "parser.y" +#line 3148 "parser.y" {(yyval.value) = (yyvsp[(1) - (1)].value);} } break; @@ -6773,7 +6761,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3163 "parser.y" +#line 3150 "parser.y" {(yyval.value) = (yyvsp[(1) - (1)].value);} } break; @@ -6784,7 +6772,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3165 "parser.y" +#line 3152 "parser.y" {(yyval.value) = (yyvsp[(1) - (1)].value);} } break; @@ -6795,7 +6783,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3169 "parser.y" +#line 3156 "parser.y" { (yyval.value).c = 0; namespace_t ns = {ACCESS_PACKAGE, ""}; @@ -6821,7 +6809,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3186 "parser.y" +#line 3173 "parser.y" {(yyval.value).c = abc_pushbyte(0, (yyvsp[(1) - (1)].number_uint)); //MULTINAME(m, registry_getintclass()); //$$.c = abc_coerce2($$.c, &m); // FIXME @@ -6836,7 +6824,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3191 "parser.y" +#line 3178 "parser.y" {(yyval.value).c = abc_pushshort(0, (yyvsp[(1) - (1)].number_uint)); (yyval.value).t = TYPE_INT; } @@ -6849,7 +6837,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3194 "parser.y" +#line 3181 "parser.y" {(yyval.value).c = abc_pushint(0, (yyvsp[(1) - (1)].number_int)); (yyval.value).t = TYPE_INT; } @@ -6862,7 +6850,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3197 "parser.y" +#line 3184 "parser.y" {(yyval.value).c = abc_pushuint(0, (yyvsp[(1) - (1)].number_uint)); (yyval.value).t = TYPE_UINT; } @@ -6875,7 +6863,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3200 "parser.y" +#line 3187 "parser.y" {(yyval.value).c = abc_pushdouble(0, (yyvsp[(1) - (1)].number_float)); (yyval.value).t = TYPE_FLOAT; } @@ -6888,7 +6876,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3203 "parser.y" +#line 3190 "parser.y" {(yyval.value).c = abc_pushstring2(0, &(yyvsp[(1) - (1)].str));free((char*)(yyvsp[(1) - (1)].str).str); (yyval.value).t = TYPE_STRING; } @@ -6901,7 +6889,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3206 "parser.y" +#line 3193 "parser.y" {(yyval.value).c = abc_pushundefined(0); (yyval.value).t = TYPE_ANY; } @@ -6914,7 +6902,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3209 "parser.y" +#line 3196 "parser.y" {(yyval.value).c = abc_pushtrue(0); (yyval.value).t = TYPE_BOOLEAN; } @@ -6927,7 +6915,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3212 "parser.y" +#line 3199 "parser.y" {(yyval.value).c = abc_pushfalse(0); (yyval.value).t = TYPE_BOOLEAN; } @@ -6940,7 +6928,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3215 "parser.y" +#line 3202 "parser.y" {(yyval.value).c = abc_pushnull(0); (yyval.value).t = TYPE_NULL; } @@ -6953,7 +6941,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3219 "parser.y" +#line 3206 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c);(yyval.value).c = abc_greaterequals((yyval.value).c);(yyval.value).c=abc_not((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; } @@ -6966,7 +6954,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3222 "parser.y" +#line 3209 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c);(yyval.value).c = abc_greaterthan((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; } @@ -6979,7 +6967,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3225 "parser.y" +#line 3212 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c);(yyval.value).c = abc_greaterthan((yyval.value).c);(yyval.value).c=abc_not((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; } @@ -6992,7 +6980,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3228 "parser.y" +#line 3215 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c);(yyval.value).c = abc_greaterequals((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; } @@ -7005,7 +6993,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3231 "parser.y" +#line 3218 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c);(yyval.value).c = abc_equals((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; } @@ -7018,7 +7006,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3234 "parser.y" +#line 3221 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c);(yyval.value).c = abc_strictequals((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; } @@ -7031,7 +7019,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3237 "parser.y" +#line 3224 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c);(yyval.value).c = abc_strictequals((yyval.value).c);(yyval.value).c = abc_not((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; } @@ -7044,7 +7032,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3240 "parser.y" +#line 3227 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c);(yyval.value).c = abc_equals((yyval.value).c);(yyval.value).c = abc_not((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; } @@ -7057,7 +7045,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3244 "parser.y" +#line 3231 "parser.y" {(yyval.value).t = join_types((yyvsp[(1) - (3)].value).t, (yyvsp[(3) - (3)].value).t, 'O'); (yyval.value).c = (yyvsp[(1) - (3)].value).c; (yyval.value).c = converttype((yyval.value).c, (yyvsp[(1) - (3)].value).t, (yyval.value).t); @@ -7078,7 +7066,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3255 "parser.y" +#line 3242 "parser.y" { (yyval.value).t = join_types((yyvsp[(1) - (3)].value).t, (yyvsp[(3) - (3)].value).t, 'A'); /*printf("%08x:\n",$1.t); @@ -7105,7 +7093,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3273 "parser.y" +#line 3260 "parser.y" {(yyval.value).c=(yyvsp[(2) - (2)].value).c; (yyval.value).c = abc_not((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; @@ -7119,7 +7107,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3278 "parser.y" +#line 3265 "parser.y" {(yyval.value).c=(yyvsp[(2) - (2)].value).c; (yyval.value).c = abc_bitnot((yyval.value).c); (yyval.value).t = TYPE_INT; @@ -7133,7 +7121,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3283 "parser.y" +#line 3270 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_bitand((yyval.value).c); (yyval.value).t = TYPE_INT; @@ -7147,7 +7135,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3288 "parser.y" +#line 3275 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_bitxor((yyval.value).c); (yyval.value).t = TYPE_INT; @@ -7161,7 +7149,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3293 "parser.y" +#line 3280 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_bitor((yyval.value).c); (yyval.value).t = TYPE_INT; @@ -7175,7 +7163,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3298 "parser.y" +#line 3285 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_rshift((yyval.value).c); (yyval.value).t = TYPE_INT; @@ -7189,7 +7177,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3302 "parser.y" +#line 3289 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_urshift((yyval.value).c); (yyval.value).t = TYPE_INT; @@ -7203,7 +7191,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3306 "parser.y" +#line 3293 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_lshift((yyval.value).c); (yyval.value).t = TYPE_INT; @@ -7217,7 +7205,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3311 "parser.y" +#line 3298 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_divide((yyval.value).c); (yyval.value).t = TYPE_NUMBER; @@ -7231,7 +7219,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3315 "parser.y" +#line 3302 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_modulo((yyval.value).c); (yyval.value).t = TYPE_NUMBER; @@ -7245,7 +7233,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3319 "parser.y" +#line 3306 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); if(BOTH_INT((yyvsp[(1) - (3)].value).t, (yyvsp[(3) - (3)].value).t)) { (yyval.value).c = abc_add_i((yyval.value).c); @@ -7264,7 +7252,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3328 "parser.y" +#line 3315 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); if(BOTH_INT((yyvsp[(1) - (3)].value).t,(yyvsp[(3) - (3)].value).t)) { (yyval.value).c = abc_subtract_i((yyval.value).c); @@ -7283,7 +7271,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3337 "parser.y" +#line 3324 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); if(BOTH_INT((yyvsp[(1) - (3)].value).t,(yyvsp[(3) - (3)].value).t)) { (yyval.value).c = abc_multiply_i((yyval.value).c); @@ -7302,7 +7290,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3347 "parser.y" +#line 3334 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c,(yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_in((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; @@ -7316,7 +7304,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3352 "parser.y" +#line 3339 "parser.y" {char use_astype=0; // flash player's astype works differently than astypelate if(use_astype && TYPE_IS_CLASS((yyvsp[(3) - (3)].value).t) && (yyvsp[(3) - (3)].value).t->data) { MULTINAME(m, (classinfo_t*)((yyvsp[(3) - (3)].value).t->data)); @@ -7337,7 +7325,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3365 "parser.y" +#line 3352 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c, (yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_instanceof((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; @@ -7351,7 +7339,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3370 "parser.y" +#line 3357 "parser.y" {(yyval.value).c = code_append((yyvsp[(1) - (3)].value).c, (yyvsp[(3) - (3)].value).c); (yyval.value).c = abc_istypelate((yyval.value).c); (yyval.value).t = TYPE_BOOLEAN; @@ -7365,7 +7353,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3375 "parser.y" +#line 3362 "parser.y" { (yyval.value).c = (yyvsp[(3) - (4)].value).c; (yyval.value).c = abc_typeof((yyval.value).c); @@ -7380,7 +7368,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3381 "parser.y" +#line 3368 "parser.y" { (yyval.value).c = cut_last_push((yyvsp[(2) - (2)].value).c); (yyval.value).c = abc_pushundefined((yyval.value).c); @@ -7395,7 +7383,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3387 "parser.y" +#line 3374 "parser.y" { (yyval.value).c = abc_pushundefined(0); (yyval.value).t = TYPE_ANY; } @@ -7408,7 +7396,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3391 "parser.y" +#line 3378 "parser.y" {(yyval.value)=(yyvsp[(2) - (3)].value);} } break; @@ -7419,7 +7407,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3393 "parser.y" +#line 3380 "parser.y" { (yyval.value)=(yyvsp[(2) - (2)].value); if(IS_INT((yyvsp[(2) - (2)].value).t)) { @@ -7439,7 +7427,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3404 "parser.y" +#line 3391 "parser.y" { (yyval.value).c = (yyvsp[(1) - (4)].value).c; (yyval.value).c = code_append((yyval.value).c, (yyvsp[(3) - (4)].value).c); @@ -7457,7 +7445,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3413 "parser.y" +#line 3400 "parser.y" { (yyval.value).c = code_new(); (yyval.value).c = code_append((yyval.value).c, (yyvsp[(2) - (3)].value_list).cc); @@ -7473,7 +7461,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3420 "parser.y" +#line 3407 "parser.y" {(yyval.value_list).cc=0;(yyval.value_list).number=0;} } break; @@ -7484,7 +7472,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3421 "parser.y" +#line 3408 "parser.y" {(yyval.value_list)=(yyvsp[(1) - (1)].value_list);} } break; @@ -7495,7 +7483,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3423 "parser.y" +#line 3410 "parser.y" { (yyval.value_list).cc = 0; (yyval.value_list).cc = code_append((yyval.value_list).cc, (yyvsp[(1) - (3)].value).c); @@ -7511,7 +7499,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3429 "parser.y" +#line 3416 "parser.y" { (yyval.value_list).cc = (yyvsp[(1) - (5)].value_list).cc; (yyval.value_list).number = (yyvsp[(1) - (5)].value_list).number+2; @@ -7527,7 +7515,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3438 "parser.y" +#line 3425 "parser.y" { (yyval.value).c = code_new(); (yyval.value).c = code_append((yyval.value).c, (yyvsp[(2) - (3)].value_list).cc); @@ -7543,7 +7531,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3445 "parser.y" +#line 3432 "parser.y" { code_t*c = (yyvsp[(3) - (3)].value).c; if(BOTH_INT((yyvsp[(1) - (3)].value).t,(yyvsp[(3) - (3)].value).t)) { @@ -7564,7 +7552,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3457 "parser.y" +#line 3444 "parser.y" { code_t*c = abc_modulo((yyvsp[(3) - (3)].value).c); c=converttype(c, join_types((yyvsp[(1) - (3)].value).t, (yyvsp[(3) - (3)].value).t, '%'), (yyvsp[(1) - (3)].value).t); @@ -7580,7 +7568,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3463 "parser.y" +#line 3450 "parser.y" { code_t*c = abc_lshift((yyvsp[(3) - (3)].value).c); c=converttype(c, join_types((yyvsp[(1) - (3)].value).t, (yyvsp[(3) - (3)].value).t, '<'), (yyvsp[(1) - (3)].value).t); @@ -7596,7 +7584,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3469 "parser.y" +#line 3456 "parser.y" { code_t*c = abc_rshift((yyvsp[(3) - (3)].value).c); c=converttype(c, join_types((yyvsp[(1) - (3)].value).t, (yyvsp[(3) - (3)].value).t, '>'), (yyvsp[(1) - (3)].value).t); @@ -7612,7 +7600,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3475 "parser.y" +#line 3462 "parser.y" { code_t*c = abc_urshift((yyvsp[(3) - (3)].value).c); c=converttype(c, join_types((yyvsp[(1) - (3)].value).t, (yyvsp[(3) - (3)].value).t, 'U'), (yyvsp[(1) - (3)].value).t); @@ -7628,7 +7616,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3481 "parser.y" +#line 3468 "parser.y" { code_t*c = abc_divide((yyvsp[(3) - (3)].value).c); c=converttype(c, join_types((yyvsp[(1) - (3)].value).t, (yyvsp[(3) - (3)].value).t, '/'), (yyvsp[(1) - (3)].value).t); @@ -7644,7 +7632,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3487 "parser.y" +#line 3474 "parser.y" { code_t*c = abc_bitor((yyvsp[(3) - (3)].value).c); c=converttype(c, TYPE_INT, (yyvsp[(1) - (3)].value).t); @@ -7660,7 +7648,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3493 "parser.y" +#line 3480 "parser.y" { code_t*c = abc_bitxor((yyvsp[(3) - (3)].value).c); c=converttype(c, TYPE_INT, (yyvsp[(1) - (3)].value).t); @@ -7676,7 +7664,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3499 "parser.y" +#line 3486 "parser.y" { code_t*c = (yyvsp[(3) - (3)].value).c; @@ -7699,7 +7687,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3512 "parser.y" +#line 3499 "parser.y" { code_t*c = (yyvsp[(3) - (3)].value).c; if(TYPE_IS_INT((yyvsp[(1) - (3)].value).t)) { c=abc_subtract_i(c); @@ -7720,7 +7708,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3523 "parser.y" +#line 3510 "parser.y" { code_t*c = 0; c = code_append(c, (yyvsp[(3) - (3)].value).c); c = converttype(c, (yyvsp[(3) - (3)].value).t, (yyvsp[(1) - (3)].value).t); @@ -7736,7 +7724,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3530 "parser.y" +#line 3517 "parser.y" { (yyval.value).t = join_types((yyvsp[(3) - (5)].value).t,(yyvsp[(5) - (5)].value).t,'?'); (yyval.value).c = (yyvsp[(1) - (5)].value).c; @@ -7758,7 +7746,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3543 "parser.y" +#line 3530 "parser.y" { code_t*c = 0; classinfo_t*type = (yyvsp[(1) - (2)].value).t; if(is_getlocal((yyvsp[(1) - (2)].value).c) && (TYPE_IS_INT((yyvsp[(1) - (2)].value).t) || TYPE_IS_NUMBER((yyvsp[(1) - (2)].value).t))) { @@ -7793,7 +7781,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3570 "parser.y" +#line 3557 "parser.y" { code_t*c = 0; classinfo_t*type = (yyvsp[(1) - (2)].value).t; if(TYPE_IS_INT(type) || TYPE_IS_UINT(type)) { @@ -7816,7 +7804,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3584 "parser.y" +#line 3571 "parser.y" { code_t*c = 0; classinfo_t*type = (yyvsp[(2) - (2)].value).t; if(TYPE_IS_INT(type) || TYPE_IS_UINT(type)) { @@ -7839,7 +7827,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3598 "parser.y" +#line 3585 "parser.y" { code_t*c = 0; classinfo_t*type = (yyvsp[(2) - (2)].value).t; if(TYPE_IS_INT(type) || TYPE_IS_UINT(type)) { @@ -7862,13 +7850,13 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3613 "parser.y" +#line 3600 "parser.y" { if(!state->cls->info) syntaxerror("super keyword not allowed outside a class"); classinfo_t*t = state->cls->info->superclass; if(!t) t = TYPE_OBJECT; - memberinfo_t*f = registry_findmember_nsset(t, state->active_namespaces, (yyvsp[(3) - (3)].id), 1); + memberinfo_t*f = findmember_nsset(t, (yyvsp[(3) - (3)].id), 1); MEMBER_MULTINAME(m, f, (yyvsp[(3) - (3)].id)); (yyval.value).c = 0; @@ -7885,7 +7873,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3627 "parser.y" +#line 3614 "parser.y" { // attribute TODO (yyval.value).c = abc_pushundefined(0); @@ -7901,7 +7889,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3634 "parser.y" +#line 3621 "parser.y" { // child attribute TODO (yyval.value).c = abc_pushundefined(0); @@ -7917,7 +7905,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3641 "parser.y" +#line 3628 "parser.y" { // namespace declaration TODO (yyval.value).c = abc_pushundefined(0); @@ -7933,7 +7921,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3648 "parser.y" +#line 3635 "parser.y" { // descendants TODO (yyval.value).c = abc_pushundefined(0); @@ -7949,7 +7937,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3655 "parser.y" +#line 3642 "parser.y" { // filter TODO (yyval.value).c = abc_pushundefined(0); @@ -7965,7 +7953,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3666 "parser.y" +#line 3653 "parser.y" { (yyval.value).c = (yyvsp[(1) - (3)].value).c; classinfo_t*t = (yyvsp[(1) - (3)].value).t; @@ -7978,7 +7966,7 @@ PASS2 if(t->subtype==INFOTYPE_UNRESOLVED) { syntaxerror("syntaxerror: trying to resolve property '%s' on incomplete object '%s'", (yyvsp[(3) - (3)].id), t->name); } - memberinfo_t*f = registry_findmember_nsset(t, state->active_namespaces, (yyvsp[(3) - (3)].id), 1); + memberinfo_t*f = findmember_nsset(t, (yyvsp[(3) - (3)].id), 1); char noslot = 0; if(f && !is_static != !(f->flags&FLAG_STATIC)) noslot=1; @@ -8024,7 +8012,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3716 "parser.y" +#line 3703 "parser.y" { PASS1 /* Queue unresolved identifiers for checking against the parent @@ -8066,7 +8054,7 @@ PASS2 int i_am_static = (state->method && state->method->info)?(state->method->info->flags&FLAG_STATIC):FLAG_STATIC; /* look at current class' members */ - if(state->cls && (f = registry_findmember_nsset(state->cls->info, state->active_namespaces, (yyvsp[(1) - (1)].id), 1)) && + if(state->cls && (f = findmember_nsset(state->cls->info, (yyvsp[(1) - (1)].id), 1)) && (f->flags&FLAG_STATIC) >= i_am_static) { // $1 is a function in this class int var_is_static = (f->flags&FLAG_STATIC); @@ -8136,7 +8124,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3821 "parser.y" +#line 3808 "parser.y" { PASS12 NEW(namespace_decl_t,n); @@ -8153,7 +8141,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3828 "parser.y" +#line 3815 "parser.y" { PASS12 NEW(namespace_decl_t,n); @@ -8170,7 +8158,7 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3835 "parser.y" +#line 3822 "parser.y" { PASS12 NEW(namespace_decl_t,n); @@ -8187,10 +8175,10 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3842 "parser.y" +#line 3829 "parser.y" { PASS12 - register_namespace((yyvsp[(2) - (2)].namespace_decl)->name, (yyvsp[(2) - (2)].namespace_decl)->url); + trie_put(active_namespaces, (yyvsp[(2) - (2)].namespace_decl)->name, (void*)(yyvsp[(2) - (2)].namespace_decl)->url); namespace_t access = modifiers2access(&(yyvsp[(1) - (2)].flags)); varinfo_t* var = varinfo_register_global(access.access, state->package, (yyvsp[(2) - (2)].namespace_decl)->name); @@ -8211,11 +8199,11 @@ PASS2 if(as3_pass==2) { /* Line 1464 of skeleton.m4 */ -#line 3857 "parser.y" +#line 3844 "parser.y" { PASS12 char*url = 0; - register_namespace((yyvsp[(3) - (3)].classinfo)->name, url); + trie_put(active_namespaces, (yyvsp[(3) - (3)].classinfo)->name, url); (yyval.code)=0; } } @@ -8225,7 +8213,7 @@ PASS2 /* Line 1464 of skeleton.m4 */ -#line 8229 "parser.tab.c" +#line 8217 "parser.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); diff --git a/lib/as3/parser.y b/lib/as3/parser.y index 1d18b74..a81e4e0 100644 --- a/lib/as3/parser.y +++ b/lib/as3/parser.y @@ -354,9 +354,7 @@ typedef struct _state { import_list_t*wildcard_imports; dict_t*import_toplevel_packages; dict_t*imports; - namespace_list_t*active_namespaces; - namespace_decl_list_t*new_namespaces; - dict_t*namespace2url; + char has_own_imports; char new_vars; // e.g. transition between two functions @@ -442,11 +440,11 @@ static void new_state() state = s; state->level++; state->has_own_imports = 0; - state->new_namespaces = 0; state->vars = dict_new(); state->old = oldstate; state->new_vars = 0; - state->namespace2url = 0; + + trie_remember(active_namespaces); } static void state_has_imports() { @@ -493,20 +491,14 @@ static void state_destroy(state_t*state) static void old_state() { + trie_rollback(active_namespaces); + if(!state || !state->old) syntaxerror("invalid nesting"); state_t*leaving = state; state = state->old; - namespace_decl_list_t*nl=leaving->new_namespaces; - while(nl) { - tokenizer_unregister_namespace(nl->namespace_decl->name); - nl = nl->next; - } - if(leaving->namespace2url) - dict_destroy(leaving->namespace2url); - if(as3_pass>1 && leaving->method && leaving->method != state->method && !leaving->method->inner) { free(leaving->method); leaving->method=0; @@ -530,6 +522,9 @@ void initialize_file(char*filename) if(state) { syntaxerror("invalid call to initialize_file during parsing of another file"); } + + active_namespaces = trie_new(); + new_state(); state->package = internal_filename_package = strdup(filename); @@ -849,7 +844,7 @@ static namespace_t modifiers2access(modifiers_t*mod) syntaxerror("invalid combination of access levels and namespaces"); ns.access = ACCESS_NAMESPACE; state_t*s = state; - const char*url = (const char*)dict_lookup(state->namespace2url, mod->ns); + const char*url = (const char*)trie_lookup(active_namespaces, mod->ns); if(!url) { /* shouldn't happen- the tokenizer only reports something as a namespace if it was already registered */ @@ -875,6 +870,12 @@ static namespace_t modifiers2access(modifiers_t*mod) } static slotinfo_t* find_class(const char*name); +memberinfo_t* findmember_nsset(classinfo_t*cls, const char*name, char recurse) +{ + /* FIXME- we need to loop through namespaces here */ + return registry_findmember(cls, "", name, recurse); +} + static void function_initvars(methodstate_t*m, params_t*params, int flags, char var0) { if(var0) { @@ -1476,7 +1477,7 @@ static abc_method_t* endfunction(modifiers_t*mod, enum yytokentype getset, char* //flash doesn't seem to allow us to access function slots //state->method->info->slot = slot; - if(mod->flags&FLAG_OVERRIDE) f->trait->attributes |= TRAIT_ATTR_OVERRIDE; + if(mod && mod->flags&FLAG_OVERRIDE) f->trait->attributes |= TRAIT_ATTR_OVERRIDE; if(getset == KW_GET) f->trait->kind = TRAIT_GETTER; if(getset == KW_SET) f->trait->kind = TRAIT_SETTER; if(params->varargs) f->flags |= METHOD_NEED_REST; @@ -1950,19 +1951,6 @@ char is_break_or_jump(code_t*c) return 0; } -void register_namespace(const char*name, const char*url) -{ - NEW(namespace_decl_t,n); - n->name = name; - n->url = url; - if(!state->namespace2url) { - state->namespace2url = dict_new(); - } - dict_put(state->namespace2url, name, url); - list_append(state->new_namespaces, n); - tokenizer_register_namespace(name); -} - #define IS_FINALLY_TARGET(op) \ ((op) == OPCODE___CONTINUE__ || \ (op) == OPCODE___BREAK__ || \ @@ -2655,7 +2643,6 @@ MODIFIER_LIST : MODIFIER_LIST MODIFIER { $$.ns=$1.ns?$1.ns:$2.ns; } - MODIFIER : KW_PUBLIC {PASS12 $$.flags=FLAG_PUBLIC;$$.ns=0;} | KW_PRIVATE {PASS12 $$.flags=FLAG_PRIVATE;$$.ns=0;} | KW_PROTECTED {PASS12 $$.flags=FLAG_PROTECTED;$$.ns=0;} @@ -3615,7 +3602,7 @@ E : "super" '.' T_IDENTIFIER classinfo_t*t = state->cls->info->superclass; if(!t) t = TYPE_OBJECT; - memberinfo_t*f = registry_findmember_nsset(t, state->active_namespaces, $3, 1); + memberinfo_t*f = findmember_nsset(t, $3, 1); MEMBER_MULTINAME(m, f, $3); $$.c = 0; @@ -3675,7 +3662,7 @@ E : E '.' T_IDENTIFIER { if(t->subtype==INFOTYPE_UNRESOLVED) { syntaxerror("syntaxerror: trying to resolve property '%s' on incomplete object '%s'", $3, t->name); } - memberinfo_t*f = registry_findmember_nsset(t, state->active_namespaces, $3, 1); + memberinfo_t*f = findmember_nsset(t, $3, 1); char noslot = 0; if(f && !is_static != !(f->flags&FLAG_STATIC)) noslot=1; @@ -3754,7 +3741,7 @@ VAR_READ : T_IDENTIFIER { int i_am_static = (state->method && state->method->info)?(state->method->info->flags&FLAG_STATIC):FLAG_STATIC; /* look at current class' members */ - if(state->cls && (f = registry_findmember_nsset(state->cls->info, state->active_namespaces, $1, 1)) && + if(state->cls && (f = findmember_nsset(state->cls->info, $1, 1)) && (f->flags&FLAG_STATIC) >= i_am_static) { // $1 is a function in this class int var_is_static = (f->flags&FLAG_STATIC); @@ -3841,7 +3828,7 @@ NAMESPACE_ID : "namespace" T_IDENTIFIER '=' T_STRING { } NAMESPACE_DECLARATION : MAYBE_MODIFIERS NAMESPACE_ID { PASS12 - register_namespace($2->name, $2->url); + trie_put(active_namespaces, $2->name, (void*)$2->url); namespace_t access = modifiers2access(&$1); varinfo_t* var = varinfo_register_global(access.access, state->package, $2->name); @@ -3857,7 +3844,7 @@ NAMESPACE_DECLARATION : MAYBE_MODIFIERS NAMESPACE_ID { USE_NAMESPACE : "use" "namespace" CLASS_SPEC { PASS12 char*url = 0; - register_namespace($3->name, url); + trie_put(active_namespaces, $3->name, url); $$=0; } diff --git a/lib/as3/registry.h b/lib/as3/registry.h index 60ac6cc..52ea55a 100644 --- a/lib/as3/registry.h +++ b/lib/as3/registry.h @@ -77,7 +77,7 @@ struct _classinfo { classinfo_t*superclass; dict_t members; void*data; //TODO: get rid of this- parser.y should pass type/value/code triples around - classinfo_t*interfaces[0]; + classinfo_t*interfaces[]; }; struct _memberinfo { U8 kind,subtype,flags,access; diff --git a/lib/as3/tokenizer.h b/lib/as3/tokenizer.h index ef6d07b..64ad39f 100644 --- a/lib/as3/tokenizer.h +++ b/lib/as3/tokenizer.h @@ -81,6 +81,8 @@ extern char start_of_expression; typedef token_t*tokenptr_t; +extern trie_t*active_namespaces; + #include "parser.tab.h" extern int as3_verbosity; @@ -94,9 +96,6 @@ void as3_softwarning(const char*format, ...); void as3_buffer_input(void*buffer, int len); void as3_file_input(FILE*fi); -void tokenizer_register_namespace(const char*id); -void tokenizer_unregister_namespace(const char*id); - #define T_EOF 0 extern int avm2_lex(); diff --git a/lib/as3/tokenizer.lex b/lib/as3/tokenizer.lex index 7752bd5..732c97f 100644 --- a/lib/as3/tokenizer.lex +++ b/lib/as3/tokenizer.lex @@ -516,18 +516,18 @@ static inline void c() { current_column+=yyleng; } -static trie_t*namespaces = 0; -void tokenizer_register_namespace(const char*id) +trie_t*active_namespaces = 0; +/*void tokenizer_register_namespace(const char*id) { - trie_put(&namespaces, id); + trie_put(namespaces, id, 0); } void tokenizer_unregister_namespace(const char*id) { trie_remove(namespaces, id); -} +}*/ static inline tokenizer_is_namespace(const char*id) { - return trie_lookup(namespaces, id); + return trie_contains(active_namespaces, id); } static inline int handleIdentifier() diff --git a/lib/as3/tokenizer.yy.c b/lib/as3/tokenizer.yy.c index 9d58314..86a1539 100644 --- a/lib/as3/tokenizer.yy.c +++ b/lib/as3/tokenizer.yy.c @@ -1831,18 +1831,18 @@ static inline void c() { current_column+=as3_leng; } -static trie_t*namespaces = 0; -void tokenizer_register_namespace(const char*id) +trie_t*active_namespaces = 0; +/*void tokenizer_register_namespace(const char*id) { - trie_put(&namespaces, id); + trie_put(namespaces, id, 0); } void tokenizer_unregister_namespace(const char*id) { trie_remove(namespaces, id); -} +}*/ static inline tokenizer_is_namespace(const char*id) { - return trie_lookup(namespaces, id); + return trie_contains(active_namespaces, id); } static inline int handleIdentifier() diff --git a/lib/q.c b/lib/q.c index b1553b5..519da40 100644 --- a/lib/q.c +++ b/lib/q.c @@ -280,30 +280,42 @@ void** heap_flatten(heap_t*h) // ------------------------------- trie -------------------------------------- -void trie_put(trie_t**t, unsigned const char*id) +trie_t*trie_new() +{ + return (trie_t*)rfx_calloc(sizeof(trie_t)); +} +static char _trie_put(trielayer_t**t, unsigned const char*id, void*data) { if(!*t) { (*t) = rfx_calloc(sizeof(trie_t)); (*t)->rest = (unsigned char*)strdup(id); - return; + (*t)->data = data; + return 0; } if((*t)->rest && (*t)->rest[0]) { - // shift whatever's currently in here one node down - trie_put(&(*t)->row[(*t)->rest[0]], (*t)->rest+1); + // make room: shift whatever's currently in here one node down + _trie_put(&(*t)->row[(*t)->rest[0]], (*t)->rest+1, (*t)->data); (*t)->rest = 0; } if(id[0]) { - trie_put(&(*t)->row[id[0]], id+1); + return _trie_put(&(*t)->row[id[0]], id+1, data); } else { + char overwrite = 0; + if((*t)->rest) + overwrite = 1; (*t)->rest = strdup(""); + (*t)->data = data; + return overwrite; } } - -int trie_lookup(trie_t*t, unsigned const char*id) +static char _trie_remove(trielayer_t*t, unsigned const char*id) { while(t) { - if(t->rest && !strcmp(t->rest, id)) + if(t->rest && !strcmp(t->rest, id)) { + free(t->rest); + t->rest = 0; return 1; + } if(!*id) return 0; t = t->row[*id++]; @@ -311,18 +323,123 @@ int trie_lookup(trie_t*t, unsigned const char*id) return 0; } +static void trie_rollback_removes(trie_t*t, unsigned const char*id, void*data); +static void trie_rollback_adds(trie_t*t, unsigned const char*id, void*data); + +void trie_put(trie_t*t, unsigned const char*id, void*data) +{ + if(!t->rollback) { + _trie_put(&t->start, id, data); + } else { + char contains = trie_contains(t, id); + void*olddata = contains?trie_lookup(t, id):0; + trie_rollback_removes(t, id, data); + _trie_put(&t->start, id, data); + if(contains) { + trie_rollback_adds(t, id, olddata); + } + } +} char trie_remove(trie_t*t, unsigned const char*id) { + if(!t->rollback) { + return _trie_remove(t->start, id); + } else { + void*olddata = trie_lookup(t, id); + char exists = _trie_remove(t->start, id); + if(exists) { + trie_rollback_removes(t, id, olddata); + } + return exists; + } +} +int trie_contains(trie_t*trie, unsigned const char*id) +{ + trielayer_t*t = trie->start; while(t) { - if(t->rest && !strcmp(t->rest, id)) { - free(t->rest); - t->rest = 0; + if(t->rest && !strcmp(t->rest, id)) return 1; - } if(!*id) return 0; t = t->row[*id++]; } + return 0; +} +void* trie_lookup(trie_t*trie, unsigned const char*id) +{ + trielayer_t*t = trie->start; + while(t) { + if(t->rest && !strcmp(t->rest, id)) + return t->data; + if(!*id) + return 0; + t = t->row[*id++]; + } + return 0; +} + +typedef struct _triememory { + const unsigned char*key; + void*data; + struct _triememory*next; +} triememory_t; + +typedef struct _trierollback { + triememory_t*add; + triememory_t*remove; + struct _trierollback*prev; +} trierollback_t; + +static void trie_rollback_removes(trie_t*t, unsigned const char*id, void*data) +{ + trierollback_t*rollback = (trierollback_t*)t->rollback; + triememory_t*m = (triememory_t*)rfx_calloc(sizeof(triememory_t)); + m->key = id; + m->data = data; + m->next = rollback->add; + rollback->add = m; +} +static void trie_rollback_adds(trie_t*t, unsigned const char*id, void*data) +{ + trierollback_t*rollback = (trierollback_t*)t->rollback; + triememory_t*m = (triememory_t*)rfx_calloc(sizeof(triememory_t)); + m->key = id; + m->data = data; + m->next = rollback->remove; + rollback->remove = m; +} + +void trie_remember(trie_t*t) +{ + trierollback_t*old = (trierollback_t*)t->rollback; + t->rollback = (trierollback_t*)rfx_calloc(sizeof(trierollback_t)); + ((trierollback_t*)t->rollback)->prev = old; +} + +void trie_rollback(trie_t*t) +{ + trierollback_t*rollback = (trierollback_t*)t->rollback; + if(!rollback) { + fprintf(stderr, "Internal error: can't roll back this trie any further\n"); + return; + } + t->rollback = ((trierollback_t*)t->rollback)->prev; + + triememory_t*remove = rollback->remove; + while(remove) { + triememory_t*next = remove->next; + if(!trie_remove(t, remove->key)) { + fprintf(stderr, "Internal error: can't delete key %s in trie during rollback\n", remove->key); + } + free(remove); + remove = next; + } + triememory_t*add = rollback->add; + while(add) { + triememory_t*next = add->next; + trie_put(t, add->key, add->data); + add = next; + } } @@ -1295,3 +1412,4 @@ void*list_clone_(void*_list) return dest; } + diff --git a/lib/q.h b/lib/q.h index db55cd6..3d09c25 100644 --- a/lib/q.h +++ b/lib/q.h @@ -110,8 +110,7 @@ typedef struct _stringarray_t } stringarray_t; /* heap */ -typedef struct _heap -{ +typedef struct _heap { void**elements; char*data; int elem_size; @@ -120,11 +119,17 @@ typedef struct _heap int(*compare)(const void *, const void *); } heap_t; -typedef struct _trie { - struct _trie*row[256]; +/* trie (with rollback) */ +typedef struct _trielayer { + struct _trielayer*row[256]; unsigned char*rest; -} trie_t; + void*data; +} trielayer_t; +typedef struct _trie { + trielayer_t* start; + void*rollback; +} trie_t; char* strdup_n(const char*str, int size); @@ -211,9 +216,13 @@ void* heap_chopmax(heap_t*h); void heap_dump(heap_t*h, FILE*fi); void** heap_flatten(heap_t*h); -void trie_put(trie_t**t, unsigned const char*id); +trie_t*trie_new(); +void trie_put(trie_t*t, unsigned const char*id, void*data); char trie_remove(trie_t*t, unsigned const char*id); -int trie_lookup(trie_t*t, unsigned const char*id); +void*trie_lookup(trie_t*t, unsigned const char*id); +int trie_contains(trie_t*t, unsigned const char*id); +void trie_remember(trie_t*t); +void trie_rollback(trie_t*t); array_t* array_new(); array_t* array_new2(type_t*type);