public StringBuffer getCodeBuffer() { StringBuffer sb = new StringBuffer(); List<String> lines = cl.getCode(); for (String line : lines) { sb.append(line); sb.append(EOL); } return sb; }
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(); }
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); } }
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(); }
/** * 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(); }
public List<String> getCode() { return cl.getCode(); }