code: @Override
      public void translate(Code dest) {
          int max;
          int ofs;
          int var;
          int[] vars;
          ClassRef type;
          ClassRef[] types;
          Class[] tmp;
          Class optType;
          int i;
          int unwrapOptionLabel;
          int pushTailingLabel;
  
          tmp = getParameterTypes();
          ofs = optional + 1;
          max = tmp.length - ofs;
          vars = new int[max];
          types = new ClassRef[max];
          // pop tailing args
          for (i = max - 1; i >= 0; i--) {
              type = new ClassRef(tmp[i + ofs]);
              types[i] = type;
              var = dest.allocate(type);
              vars[i] = var;
              type.emitStore(dest, var);
          }
          optType = with.getParameterTypes()[optional]; // ask "with", not tmp!
  
          unwrapOptionLabel = dest.declareLabel();
          pushTailingLabel = dest.declareLabel();
  
          // optional argument is on top of the stack now
          dest.emit(DUP); // optional argument is always a refenrence
          dest.emit(GETSTATIC,
                    new FieldRef(new ClassRef(Option.class), "TAG",
                                                      ClassRef.OBJECT));
          dest.emit(IF_ACMPNE, unwrapOptionLabel);
  
          // remove TAG, push constant
          dest.emit(POP); // discard TAG, always a reference
          new ClassRef(optType).emitDefault(dest);
          dest.emit(GOTO, pushTailingLabel);
  
          dest.defineLabel(unwrapOptionLabel);
          // optional value has to be a reference type!
          Util.unwrap(optType, dest);
  
          dest.defineLabel(pushTailingLabel);
          for (i = 0; i < max; i++) {
              types[i].emitLoad(dest, vars[i]);
          }
          with.translate(dest);
      }
docs: TODO: drop the parameter wrapping?