Example #1
0
 public StringBuffer getCodeBuffer() {
   StringBuffer sb = new StringBuffer();
   List<String> lines = cl.getCode();
   for (String line : lines) {
     sb.append(line);
     sb.append(EOL);
   }
   return sb;
 }
Example #2
0
 public String getSlice(int startLine, int endLine) {
   StringBuffer sb = new StringBuffer();
   List lines = cl.getCode();
   for (int i = (startLine == 0 ? startLine : startLine - 1);
       i < endLine && i < lines.size();
       i++) {
     if (sb.length() != 0) {
       sb.append(EOL);
     }
     sb.append((String) lines.get(i));
   }
   return sb.toString();
 }
Example #3
0
  public CompiledScript compile(Script script, String className) {
    try (CodeSizeAnalysis analysis = new CodeSizeAnalysis()) {
      analysis.submit(script);
    } catch (CodeSizeException e) {
      e.printStackTrace();
      throw new CompilationException(e.getMessage());
    }

    // set-up
    // prepend '#' to mark generated classes, cf. ErrorPrototype
    String clazzName = "#" + className;
    String superClassName = Types.CompiledScript.getInternalName();
    Code code = new Code(clazzName, superClassName, script.getSourceFile(), sourceMap(script));

    // generate code
    try (CodeGenerator codegen = new CodeGenerator(code, script.getOptions())) {
      codegen.compile(script);
    }

    // finalize
    CodeLoader loader = new CodeLoader();
    List<ClassCode> classes = code.getClasses();
    for (ClassCode classCode : classes) {
      byte[] bytes = classCode.toByteArray();
      if (compilerOptions.contains(Option.Debug)) {
        debug(bytes);
      }
      // System.out.printf("define class '%s'%n", classCode.className);
      loader.defineClass(classCode.className, bytes);
    }

    try {
      Class<?> c = loader.loadClass(clazzName);
      return (CompiledScript) c.newInstance();
    } catch (ReflectiveOperationException e) {
      throw new RuntimeException(e);
    }
  }
Example #4
0
  private CompiledFunction compile(FunctionNode function, String className) {
    try (CodeSizeAnalysis analysis = new CodeSizeAnalysis()) {
      analysis.submit(function);
    } catch (CodeSizeException e) {
      throw new CompilationException(e.getMessage());
    }

    // set-up
    // prepend '#' to mark generated classes, cf. ErrorPrototype
    String clazzName = "#" + className;
    String superClassName = Types.CompiledFunction.getInternalName();
    Code code = new Code(clazzName, superClassName, "<Function>", null);

    // generate code
    try (CodeGenerator codegen = new CodeGenerator(code, optionsFrom(function))) {
      codegen.compileFunction(function);
    }

    // finalize
    CodeLoader loader = new CodeLoader();
    List<ClassCode> classes = code.getClasses();
    for (ClassCode classCode : classes) {
      byte[] bytes = classCode.toByteArray();
      if (compilerOptions.contains(Option.Debug)) {
        debug(bytes);
      }
      loader.defineClass(classCode.className, bytes);
    }

    try {
      Class<?> c = loader.loadClass(clazzName);
      return (CompiledFunction) c.newInstance();
    } catch (ReflectiveOperationException e) {
      throw new RuntimeException(e);
    }
  }
  public static FieldAccessor generate(
      String fieldName, Class<?> cls, CodeLoader loader, boolean isStatic)
      throws NoSuchFieldException, InstantiationException, IOException, IllegalAccessException {
    String tempClassName = "_" + (loader.nextCount() & 0x7fffffff);
    ClassFile cf =
        new ClassFile(
            tempClassName,
            "dynamicinvoke.impl.FieldAccessor",
            null,
            (short) (Constants.ACC_PUBLIC | Constants.ACC_FINAL));
    Field field = cls.getField(fieldName);
    Class<?> type = field.getType();
    String param = makeSignature(type);

    cf.openMethod("<init>", "()V", Constants.ACC_PUBLIC);
    cf.add(Opcode.ALOAD_0);
    cf.add(Opcode.INVOKESPECIAL, "dynamicinvoke.impl.FieldAccessor", "<init>", "()", "V");
    cf.add(Opcode.RETURN);
    cf.closeMethod();

    cf.openMethod("get", "(Ljava/lang/Object;)Ljava/lang/Object;", Constants.ACC_PUBLIC);
    if (type.isPrimitive()) {
      cf.add(Opcode.NEW, DynamicProxyFactory.wrapperClass(type));
      cf.add(Opcode.DUP);
      if (isStatic) {
        cf.add(Opcode.GETSTATIC, cls.getName(), fieldName, param);
      } else {
        cf.add(Opcode.ALOAD_1);
        if (!cls.equals(Object.class)) {
          cf.add(Opcode.CHECKCAST, cls.getName());
        }
        cf.add(Opcode.GETFIELD, cls.getName(), fieldName, param);
      }
      cf.add(
          Opcode.INVOKESPECIAL,
          DynamicProxyFactory.wrapperClass(type),
          "<init>",
          "(" + ClassFile.signature(type) + ")",
          "V");
    } else {
      if (isStatic) {
        cf.add(Opcode.GETSTATIC, cls.getName(), fieldName, param);
      } else {
        cf.add(Opcode.ALOAD_1);
        if (!cls.equals(Object.class)) {
          cf.add(Opcode.CHECKCAST, cls.getName());
        }
        cf.add(Opcode.GETFIELD, cls.getName(), fieldName, param);
      }
    }
    cf.add(Opcode.ARETURN);
    cf.closeMethod();

    cf.openMethod("set", "(Ljava/lang/Object;Ljava/lang/Object;)V", Constants.ACC_PUBLIC);

    if (isStatic) {
      cf.add(Opcode.ALOAD_1);
      if (type.isPrimitive()) {
        DynamicProxyFactory.castParam(cf, type);
      } else {
        cf.add(Opcode.CHECKCAST, type.getName());
      }
      cf.add(Opcode.PUTSTATIC, cls.getName(), fieldName, param);
    } else {
      cf.add(Opcode.ALOAD_1);
      if (!cls.equals(Object.class)) {
        cf.add(Opcode.CHECKCAST, cls.getName());
      }
      cf.add(Opcode.ALOAD_2);
      if (type.isPrimitive()) {
        DynamicProxyFactory.castParam(cf, type);
      } else {
        cf.add(Opcode.CHECKCAST, type.getName());
      }
      cf.add(Opcode.PUTFIELD, cls.getName(), fieldName, param);
    }
    cf.add(Opcode.RETURN);
    cf.closeMethod();

    ByteArrayOutputStream bout = new ByteArrayOutputStream();
    DataOutputStream dout = new DataOutputStream(bout);
    cf.write(dout);

    /* debug(cf); */

    Class<?> clazz = loader.define(tempClassName, bout.toByteArray(), 0, bout.size());
    loader.resolve(clazz);
    return (FieldAccessor) clazz.newInstance();
  }
Example #6
0
 /**
  * Within Sonar Ecosystem - absolute path to file containing code, whereas in fact existence of
  * such file not guaranteed - see {@link StringCodeLoader}.
  */
 public String getFileName() {
   return cl.getFileName();
 }
Example #7
0
 public List<String> getCode() {
   return cl.getCode();
 }