protected int resolveLabel(LabelNode label) {
   if (labels.containsKey(label)) {
     return labels.get(label);
   } else {
     int newLabelIndex = labels.size() + 1;
     labels.put(label, newLabelIndex);
     return newLabelIndex;
   }
 }
  public LabelNode getOrCreateGotoLabel(String name) {
    name = name.toLowerCase();
    if (gotoLabels == null) gotoLabels = new HashMap<String, LabelNode>();

    LabelNode label = gotoLabels.get(name);
    if (label == null) gotoLabels.put(name, label = new LabelNode());

    return label;
  }
  @SuppressWarnings("unchecked")
  void writeFooter() {
    LabelNode endL = new LabelNode();
    node.instructions.add(endL);

    for (LocalVariable variable : localVariables.values()) {
      String description =
          Type.getDescriptor(variable.getClazz() == null ? Object.class : variable.getClazz());
      if (variable.name.equals("~this")) {
        // if (variable.getClazz() != Memory.class && !clazz.statement.isTrait()) {
        description = "L" + clazz.entity.getCompiledInternalName() + ";";
        // }
      }

      node.localVariables.add(
          new LocalVariableNode(
              variable.name,
              description,
              null,
              variable.label == null ? labelStart : variable.label,
              variable.getEndLabel() == null ? endL : variable.getEndLabel(),
              variable.index));
    }

    // node.maxStack = this.stackMaxSize;  !!! we don't need this, see: ClassWriter.COMPUTE_FRAMES
    // node.maxLocals = this.localVariables.size();
  }
 public LocalVariable getLocalVariable(String variable) {
   return localVariables.get(variable);
 }
 public LocalVariable addLocalVariable(String variable, LabelNode label, Class clazz) {
   LocalVariable result;
   localVariables.put(
       variable, result = new LocalVariable(variable, localVariables.size(), label, clazz));
   return result;
 }
 public LabelNode getGotoLabel(String name) {
   return gotoLabels == null ? null : gotoLabels.get(name.toLowerCase());
 }