/* * This function performs functions hoisting. * * Each scope consists of four parts: * 1) Header with 'use strict' marker and reg_var_decl opcode * 2) Variable declarations, dumped by the preparser * 3) Function declarations * 4) Computational code * * Header and var_decls are dumped first, * then we shall recursively dump function declaration, * and finally, other instructions. * * For each instructions block (size of block is defined in bytecode-data.h) * literal indexes 'hash' table is filled. */ static void merge_subscopes (scopes_tree tree, /**< scopes tree to merge */ vm_instr_t *data_p, /**< instruction array, where the scopes are merged to */ lit_id_hash_table *lit_ids_p) /**< literal indexes 'hash' table */ { assert_tree (tree); JERRY_ASSERT (data_p); vm_instr_counter_t instr_pos; bool header = true; for (instr_pos = 0; instr_pos < tree->instrs_count; instr_pos++) { op_meta *om_p = extract_op_meta (tree->instrs, instr_pos); if (om_p->op.op_idx != VM_OP_VAR_DECL && om_p->op.op_idx != VM_OP_META && !header) { break; } if (om_p->op.op_idx == VM_OP_REG_VAR_DECL) { header = false; } data_p[global_oc] = generate_instr (tree->instrs, instr_pos, lit_ids_p); global_oc++; } for (vm_instr_counter_t var_decl_pos = 0; var_decl_pos < tree->var_decls_cout; var_decl_pos++) { data_p[global_oc] = generate_instr (tree->var_decls, var_decl_pos, lit_ids_p); global_oc++; } for (uint8_t child_id = 0; child_id < tree->t.children_num; child_id++) { merge_subscopes (*(scopes_tree *) linked_list_element (tree->t.children, child_id), data_p, lit_ids_p); } for (; instr_pos < tree->instrs_count; instr_pos++) { data_p[global_oc] = generate_instr (tree->instrs, instr_pos, lit_ids_p); global_oc++; } } /* merge_subscopes */
void generate_ASSIGN (quad* quad) { generate_instr(assign_v, quad); }
void generate_TABLESETELEM (quad* quad) { generate_instr(tablesetelem_v, quad); }
void generate_NEWTABLE (quad* quad) { generate_instr(newtable_v, quad); }
void generate_MOD (quad* quad) { generate_instr(mod_v, quad); }
void generate_DIV (quad* quad) { generate_instr(div_v, quad); }
void generate_MUL (quad* quad) { generate_instr(mul_v, quad); }
void generate_SUB (quad* quad) { generate_instr(sub_v, quad); }
void generate_ADD (quad* quad) { generate_instr(add_v, quad); }