Example #1
0
 private void createField(Element field) throws IllegalXMLVMException {
   String name = field.getAttributeValue("name");
   Type t = parseTypeString(field.getAttributeValue("type"));
   short flags = getAccessFlags(field);
   FieldGen f = new FieldGen(flags, t, name, _cp);
   _cg.addField(f.getField());
 }
  private Expression deserializeClassSimple(
      final int version,
      SerializerBuilder.StaticMethods staticMethods,
      CompatibilityLevel compatibilityLevel) {
    Expression local = let(constructor(this.getRawType()));

    List<Expression> list = new ArrayList<>();
    list.add(local);
    for (String fieldName : fields.keySet()) {
      FieldGen fieldGen = fields.get(fieldName);

      if (!fieldGen.hasVersion(version)) continue;

      Variable field = field(local, fieldName);
      fieldGen.serializer.prepareDeserializeStaticMethods(
          version, staticMethods, compatibilityLevel);
      list.add(
          set(
              field,
              fieldGen.serializer.deserialize(
                  fieldGen.getRawType(), version, staticMethods, compatibilityLevel)));
    }
    list.add(local);
    return sequence(list);
  }
 private Expression callFactory(Map<String, Expression> map, int version) {
   Expression[] param = new Expression[factoryParams.size()];
   int i = 0;
   for (String fieldName : factoryParams) {
     final FieldGen fieldGen = fields.get(fieldName);
     checkNotNull(fieldGen, "Field '%s' is not found in '%s'", fieldName, factory);
     if (fieldGen.hasVersion(version)) {
       param[i++] = map.get(fieldName);
     } else {
       param[i++] = pushDefaultValue(fieldGen.getAsmType());
     }
   }
   return callStatic(factory.getDeclaringClass(), factory.getName(), param);
 }
  @Override
  public void prepareSerializeStaticMethods(
      int version,
      SerializerBuilder.StaticMethods staticMethods,
      CompatibilityLevel compatibilityLevel) {
    if (staticMethods.startSerializeStaticMethod(this, version)) {
      return;
    }

    List<Expression> list = new ArrayList<>();
    for (String fieldName : fields.keySet()) {

      FieldGen fieldGen = fields.get(fieldName);
      if (!fieldGen.hasVersion(version)) continue;

      Class<?> type = fieldGen.serializer.getRawType();
      if (!fieldGen.getRawType().equals(Object.class)) type = fieldGen.getRawType();

      if (fieldGen.field != null) {
        fieldGen.serializer.prepareSerializeStaticMethods(
            version, staticMethods, compatibilityLevel);
        list.add(
            set(
                arg(1),
                fieldGen.serializer.serialize(
                    arg(0),
                    arg(1),
                    cast(field(arg(2), fieldName), type),
                    version,
                    staticMethods,
                    compatibilityLevel)));
      } else if (fieldGen.method != null) {
        fieldGen.serializer.prepareSerializeStaticMethods(
            version, staticMethods, compatibilityLevel);
        list.add(
            set(
                arg(1),
                fieldGen.serializer.serialize(
                    arg(0),
                    arg(1),
                    cast(call(arg(2), fieldGen.method.getName()), type),
                    version,
                    staticMethods,
                    compatibilityLevel)));
      } else throw new AssertionError();
    }
    list.add(arg(1));

    staticMethods.registerStaticSerializeMethod(this, version, sequence(list));
  }
  private Expression callConstructor(
      Class<?> targetType, final Map<String, Expression> map, int version) {
    Expression[] param;
    if (constructorParams == null) {
      param = new Expression[0];
      return constructor(targetType, param);
    }
    param = new Expression[constructorParams.size()];

    int i = 0;
    for (String fieldName : constructorParams) {
      FieldGen fieldGen = fields.get(fieldName);
      checkNotNull(fieldGen, "Field '%s' is not found in '%s'", fieldName, constructor);
      if (fieldGen.hasVersion(version)) {
        param[i++] = map.get(fieldName);
      } else {
        param[i++] = pushDefaultValue(fieldGen.getAsmType());
      }
    }
    return constructor(targetType, param);
  }
  private Expression deserializeInterface(
      Class<?> targetType,
      final int version,
      SerializerBuilder.StaticMethods staticMethods,
      CompatibilityLevel compatibilityLevel) {
    ClassBuilder<?> asmFactory =
        ClassBuilder.create(staticMethods.getDefiningClassLoader(), targetType);
    for (String fieldName : fields.keySet()) {
      FieldGen fieldGen = fields.get(fieldName);

      Method method = checkNotNull(fieldGen.method);

      asmFactory =
          asmFactory
              .withField(fieldName, method.getReturnType())
              .withMethod(method.getName(), field(self(), fieldName));
    }

    Class<?> newClass = asmFactory.build();

    Expression local = let(constructor(newClass));
    List<Expression> list = new ArrayList<>();
    list.add(local);

    for (String fieldName : fields.keySet()) {
      FieldGen fieldGen = fields.get(fieldName);
      if (!fieldGen.hasVersion(version)) continue;
      Variable field = field(local, fieldName);

      fieldGen.serializer.prepareDeserializeStaticMethods(
          version, staticMethods, compatibilityLevel);
      Expression expression =
          fieldGen.serializer.deserialize(
              fieldGen.getRawType(), version, staticMethods, compatibilityLevel);
      list.add(set(field, expression));
    }

    list.add(local);
    return sequence(list);
  }
Example #7
0
 byte[] counterAdaptClass(final InputStream is, final String name) throws Exception {
   JavaClass jc = new ClassParser(is, name + ".class").parse();
   ClassGen cg = new ClassGen(jc);
   String cName = cg.getClassName();
   ConstantPoolGen cp = cg.getConstantPool();
   if (!cg.isInterface()) {
     FieldGen fg = new FieldGen(ACC_PUBLIC, Type.getType("I"), "_counter", cp);
     cg.addField(fg.getField());
   }
   Method[] ms = cg.getMethods();
   for (int j = 0; j < ms.length; ++j) {
     MethodGen mg = new MethodGen(ms[j], cg.getClassName(), cp);
     if (!mg.getName().equals("<init>") && !mg.isStatic() && !mg.isAbstract() && !mg.isNative()) {
       if (mg.getInstructionList() != null) {
         InstructionList il = new InstructionList();
         il.append(new ALOAD(0));
         il.append(new ALOAD(0));
         il.append(new GETFIELD(cp.addFieldref(name, "_counter", "I")));
         il.append(new ICONST(1));
         il.append(new IADD());
         il.append(new PUTFIELD(cp.addFieldref(name, "_counter", "I")));
         mg.getInstructionList().insert(il);
         mg.setMaxStack(Math.max(mg.getMaxStack(), 2));
         boolean lv = ms[j].getLocalVariableTable() == null;
         boolean ln = ms[j].getLineNumberTable() == null;
         if (lv) {
           mg.removeLocalVariables();
         }
         if (ln) {
           mg.removeLineNumbers();
         }
         cg.replaceMethod(ms[j], mg.getMethod());
       }
     }
   }
   return cg.getJavaClass().getBytes();
 }
 public void addGetter(Method method, SerializerGen serializer, int added, int removed) {
   check(method.getGenericParameterTypes().length == 0);
   check(isPublic(method.getModifiers()));
   String fieldName = stripGet(method.getName(), method.getReturnType());
   check(!fields.containsKey(fieldName), "Duplicate field '%s'", method);
   FieldGen fieldGen = new FieldGen();
   fieldGen.method = method;
   fieldGen.serializer = serializer;
   fieldGen.versionAdded = added;
   fieldGen.versionDeleted = removed;
   fieldGen.offset = lastOffset;
   lastOffset += getType(method.getReturnType()).getSize();
   fields.put(fieldName, fieldGen);
 }
 public void addField(Field field, SerializerGen serializer, int added, int removed) {
   check(implInterface || !dataTypeIn.isInterface());
   check(isPublic(field.getModifiers()));
   String fieldName = field.getName();
   check(!fields.containsKey(fieldName), "Duplicate field '%s'", field);
   FieldGen fieldGen = new FieldGen();
   fieldGen.field = field;
   fieldGen.serializer = serializer;
   fieldGen.versionAdded = added;
   fieldGen.versionDeleted = removed;
   fieldGen.offset = lastOffset;
   lastOffset += getType(field.getType()).getSize();
   fields.put(fieldName, fieldGen);
 }
  @Override
  public void prepareDeserializeStaticMethods(
      int version,
      SerializerBuilder.StaticMethods staticMethods,
      CompatibilityLevel compatibilityLevel) {
    if (staticMethods.startDeserializeStaticMethod(this, version)) {
      return;
    }

    if (!implInterface && dataTypeIn.isInterface()) {
      Expression expression =
          deserializeInterface(this.getRawType(), version, staticMethods, compatibilityLevel);
      staticMethods.registerStaticDeserializeMethod(this, version, expression);
      return;
    }
    if (!implInterface && constructor == null && factory == null && setters.isEmpty()) {
      Expression expression = deserializeClassSimple(version, staticMethods, compatibilityLevel);
      staticMethods.registerStaticDeserializeMethod(this, version, expression);
      return;
    }

    List<Expression> list = new ArrayList<>();
    final Map<String, Expression> map = new HashMap<>();
    for (String fieldName : fields.keySet()) {
      FieldGen fieldGen = fields.get(fieldName);

      if (!fieldGen.hasVersion(version)) continue;

      fieldGen.serializer.prepareDeserializeStaticMethods(
          version, staticMethods, compatibilityLevel);
      Expression expression =
          let(
              fieldGen.serializer.deserialize(
                  fieldGen.getRawType(), version, staticMethods, compatibilityLevel));
      list.add(expression);
      map.put(fieldName, cast(expression, fieldGen.getRawType()));
    }

    Expression constructor;
    if (factory == null) {
      constructor = callConstructor(this.getRawType(), map, version);
    } else {
      constructor = callFactory(map, version);
    }

    Expression local = let(constructor);
    list.add(local);

    for (Method method : setters.keySet()) {
      boolean found = false;
      for (String fieldName : setters.get(method)) {
        FieldGen fieldGen = fields.get(fieldName);
        Preconditions.checkNotNull(fieldGen, "Field '%s' is not found in '%s'", fieldName, method);
        if (fieldGen.hasVersion(version)) {
          found = true;
          break;
        }
      }
      if (found) {
        Expression[] temp = new Expression[method.getParameterTypes().length];
        int i = 0;
        for (String fieldName : setters.get(method)) {
          FieldGen fieldGen = fields.get(fieldName);
          assert fieldGen != null;
          if (fieldGen.hasVersion(version)) {
            temp[i++] = map.get(fieldName);
          } else {
            temp[i++] = pushDefaultValue(fieldGen.getAsmType());
          }
        }
        list.add(call(local, method.getName(), temp));
      }
    }

    for (String fieldName : fields.keySet()) {
      FieldGen fieldGen = fields.get(fieldName);
      if (!fieldGen.hasVersion(version)) continue;
      if (fieldGen.field == null || isFinal(fieldGen.field.getModifiers())) continue;
      Variable field = field(local, fieldName);
      list.add(set(field, map.get(fieldName)));
    }

    list.add(local);
    staticMethods.registerStaticDeserializeMethod(this, version, sequence(list));
  }