Esempio n. 1
0
  /**
   * Write the local variable table. The necessary constants have already been added to the constant
   * table by the collect() method. The flowFields method is used to determine which variables are
   * alive at each pc.
   */
  public void writeLocalVariableTable(
      Environment env, MemberDefinition field, DataOutputStream out, ConstantPool tab)
      throws IOException {
    MemberDefinition locals[] = new MemberDefinition[maxvar];
    int i = 0;

    // Initialize arguments
    if ((field != null) && (field.getArguments() != null)) {
      int reg = 0;
      Vector v = field.getArguments();
      for (Enumeration e = v.elements(); e.hasMoreElements(); ) {
        MemberDefinition f = ((MemberDefinition) e.nextElement());
        locals[reg] = f;
        reg += f.getType().stackSize();
      }
    }

    flowFields(env, first, locals);
    LocalVariableTable lvtab = new LocalVariableTable();

    // Initialize arguments again
    for (i = 0; i < maxvar; i++) locals[i] = null;
    if ((field != null) && (field.getArguments() != null)) {
      int reg = 0;
      Vector v = field.getArguments();
      for (Enumeration e = v.elements(); e.hasMoreElements(); ) {
        MemberDefinition f = ((MemberDefinition) e.nextElement());
        locals[reg] = f;
        lvtab.define(f, reg, 0, maxpc);
        reg += f.getType().stackSize();
      }
    }

    int pcs[] = new int[maxvar];

    for (Instruction inst = first; inst != null; inst = inst.next) {
      switch (inst.opc) {
        case opc_istore:
        case opc_istore_0:
        case opc_istore_1:
        case opc_istore_2:
        case opc_istore_3:
        case opc_fstore:
        case opc_fstore_0:
        case opc_fstore_1:
        case opc_fstore_2:
        case opc_fstore_3:
        case opc_astore:
        case opc_astore_0:
        case opc_astore_1:
        case opc_astore_2:
        case opc_astore_3:
        case opc_lstore:
        case opc_lstore_0:
        case opc_lstore_1:
        case opc_lstore_2:
        case opc_lstore_3:
        case opc_dstore:
        case opc_dstore_0:
        case opc_dstore_1:
        case opc_dstore_2:
        case opc_dstore_3:
          if (inst.value instanceof LocalVariable) {
            LocalVariable v = (LocalVariable) inst.value;
            int pc = (inst.next != null) ? inst.next.pc : inst.pc;
            if (locals[v.slot] != null) {
              lvtab.define(locals[v.slot], v.slot, pcs[v.slot], pc);
            }
            pcs[v.slot] = pc;
            locals[v.slot] = v.field;
          }
          break;

        case opc_label:
          {
            // flush  previous labels
            for (i = 0; i < maxvar; i++) {
              if (locals[i] != null) {
                lvtab.define(locals[i], i, pcs[i], inst.pc);
              }
            }
            // init new labels
            int pc = inst.pc;
            MemberDefinition[] labelLocals = ((Label) inst).locals;
            if (labelLocals == null) { // unreachable code??
              for (i = 0; i < maxvar; i++) locals[i] = null;
            } else {
              System.arraycopy(labelLocals, 0, locals, 0, maxvar);
            }
            for (i = 0; i < maxvar; i++) {
              pcs[i] = pc;
            }
            break;
          }
      }
    }

    // flush  remaining labels
    for (i = 0; i < maxvar; i++) {
      if (locals[i] != null) {
        lvtab.define(locals[i], i, pcs[i], maxpc);
      }
    }

    // write the local variable table
    lvtab.write(env, out, tab);
  }