Exemplo n.º 1
0
/*
 * 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 */
Exemplo n.º 2
0
void generate_ASSIGN (quad* quad) 						{ generate_instr(assign_v, quad); }
Exemplo n.º 3
0
void generate_TABLESETELEM (quad* quad) 					{ generate_instr(tablesetelem_v, quad); }
Exemplo n.º 4
0
void generate_NEWTABLE (quad* quad) 					{ generate_instr(newtable_v, quad); }
Exemplo n.º 5
0
void generate_MOD (quad* quad) 						{ generate_instr(mod_v, quad); }
Exemplo n.º 6
0
void generate_DIV (quad* quad) 						{ generate_instr(div_v, quad); }
Exemplo n.º 7
0
void generate_MUL (quad* quad) 						{ generate_instr(mul_v, quad); }
Exemplo n.º 8
0
void generate_SUB (quad* quad) 						{ generate_instr(sub_v, quad); }
Exemplo n.º 9
0
void generate_ADD (quad* quad) 						{ generate_instr(add_v, quad); }