Esempio n. 1
0
  /**
   * Processes the fields of the given class.
   *
   * @param cf {@code non-null;} class being translated
   * @param out {@code non-null;} output class
   */
  private static void processFields(DirectClassFile cf, ClassDefItem out) {
    CstType thisClass = cf.getThisClass();
    FieldList fields = cf.getFields();
    int sz = fields.size();

    for (int i = 0; i < sz; i++) {
      Field one = fields.get(i);
      try {
        CstFieldRef field = new CstFieldRef(thisClass, one.getNat());
        int accessFlags = one.getAccessFlags();

        if (AccessFlags.isStatic(accessFlags)) {
          TypedConstant constVal = one.getConstantValue();
          EncodedField fi = new EncodedField(field, accessFlags);
          if (constVal != null) {
            constVal = coerceConstant(constVal, field.getType());
          }
          out.addStaticField(fi, constVal);
        } else {
          EncodedField fi = new EncodedField(field, accessFlags);
          out.addInstanceField(fi);
        }

        Annotations annotations = AttributeTranslator.getAnnotations(one.getAttributes());
        if (annotations.size() != 0) {
          out.addFieldAnnotations(field, annotations);
        }
      } catch (RuntimeException ex) {
        String msg =
            "...while processing " + one.getName().toHuman() + " " + one.getDescriptor().toHuman();
        throw ExceptionWithContext.withContext(ex, msg);
      }
    }
  }