void operator()(const java_bytecode_parse_treet &parse_tree) { add_array_types(); if(parse_tree.loading_successful) convert(parse_tree.parsed_class); else generate_class_stub(parse_tree.parsed_class.name); }
static code_block *generate_block(code_block *parent, block_statement *block, block_iter iter, void *iter_data) { for (symbol_entry *c = block->class_head; c; c = c->next) { generate_class_stub(parent->system, c->classtype); } for (symbol_entry *f = block->function_head; f; f = f->next) { generate_function_stub(parent->system, f->function); } for (symbol_entry *c = block->class_head; c; c = c->next) { generate_class(parent->system, c->classtype); } for (symbol_entry *f = block->function_head; f; f = f->next) { generate_function(parent->system, f->function); } for (statement *node = block->body; node; node = node->next) { switch (node->type) { case S_BLOCK: { code_block *body = fork_block(parent); body = generate_block(body, (block_statement*) node, NULL, NULL); parent = rejoin_block(parent, body); } break; case S_BREAK: case S_CONTINUE: generate_control(parent, (control_statement*) node); parent = NULL; break; case S_DEFINE: parent = generate_define(parent, (define_statement*) node); break; case S_LET: parent = generate_let(parent, (let_statement*) node); break; case S_DO_WHILE: case S_WHILE: parent = generate_loop(parent, (loop_statement*) node); break; case S_EXPRESSION: { expression_statement *express = (expression_statement*) node; parent = generate_expression(parent, express->value); } break; case S_IF: parent = generate_if(parent, (if_statement*) node); break; case S_RETURN: generate_return(parent, (return_statement*) node); parent = NULL; break; // already processed case S_CLASS: case S_FUNCTION: case S_TYPEDEF: break; } // most recently processed statement terminates abruptly if (parent == NULL) { if (node->next) { fprintf(stderr, "not reachable\n"); } return NULL; } if (iter != NULL) { iter(parent, iter_data); } } return parent; }