+
+ /* generate code statistics */
+ for(t=0;t<file->method_bodies->num;t++) {
+ abc_method_body_t*m = (abc_method_body_t*)array_getvalue(file->method_bodies, t);
+ m->stats = code_get_statistics(m->code, m->exceptions);
+ }
+
+ /* level init scope depths: The init scope depth of a method is
+ always as least as high as the init scope depth of it's surrounding
+ class.
+ A method has it's own init_scope_depth if it's an init method
+ (then its init scope depth is zero), or if it's used as a closure.
+
+ Not sure yet what to do with methods which are used at different
+ locations- e.g. the nullmethod is used all over the place.
+ EDIT: flashplayer doesn't allow this anyway- a method can only
+ be used once
+
+ Also, I have the strong suspicion that flash player uses only
+ the difference between max_scope_stack and init_scope_stack, anyway.
+ */
+ for(t=0;t<file->classes->num;t++) {
+ abc_class_t*c = (abc_class_t*)array_getvalue(file->classes, t);
+ trait_list_t*traits = c->traits;
+ if(c->constructor && c->constructor->body &&
+ c->constructor->body->init_scope_depth < c->init_scope_depth) {
+ c->constructor->body->init_scope_depth = c->init_scope_depth;
+ }
+ if(c->static_constructor && c->static_constructor->body &&
+ c->static_constructor->body->init_scope_depth < c->init_scope_depth) {
+ c->static_constructor->body->init_scope_depth = c->init_scope_depth;
+ }
+ while(traits) {
+ trait_t*trait = traits->trait;
+ if(trait_is_method(trait) && trait->method->body) {
+ abc_method_body_t*body = trait->method->body;
+ if(body->init_scope_depth < c->init_scope_depth) {
+ body->init_scope_depth = c->init_scope_depth;
+ }
+ }
+ traits = traits->next;
+ }
+ }
+