private int pushDouble() { stack = new StackFrame(stack, DOUBLE_FIRST_HALF); stack = new StackFrame(stack, DOUBLE_SECOND_HALF); return stack.next.depth; }
@Override public Date getModificationDate(String className) { return classPathMapper.getModificationDate(className); } }
public ResourceClassHolderMapper(ResourceReader resourceReader, ReferenceCache referenceCache) { this.resourceReader = resourceReader; parser = new Parser(referenceCache); }
@Override public void visit(ConstructArrayInstruction insn) { insn.setItemType(rename(insn.getItemType())); }
private static ClassHolderSource getClassSource(ClassLoader classLoader) { return classSources.computeIfAbsent(classLoader, cl -> new PreOptimizingClassHolderSource( new ClasspathClassHolderSource(classLoader))); }
public ClasspathResourceMapper(Properties properties, ReferenceCache referenceCache, Mapper<String, ClassHolder> innerMapper) { this.innerMapper = innerMapper; this.referenceCache = referenceCache; Map<String, Transformation> transformationMap = new HashMap<>(); loadProperties(properties, transformationMap); transformations.addAll(transformationMap.values()); renamer = new ClassRefsRenamer(referenceCache, new CachedMapper<>(classNameMapper)); }
@Override public Date getModificationDate(String className) { ModificationDate mdate = modificationDates.get(className); if (mdate == null) { mdate = new ModificationDate(); modificationDates.put(className, mdate); mdate.date = calculateModificationDate(className); } return mdate.date; }
private void emitAssignInsn(int source, int target) { AssignInstruction insn = new AssignInstruction(); insn.setAssignee(getVariable(source)); insn.setReceiver(getVariable(target)); addInstruction(insn); }
private void emitNextBasicBlock() { if (index + 1 < basicBlocks.size()) { getBasicBlock(index + 1); } }
private Transformation getTransformation(Map<String, Transformation> cache, String packageName) { Transformation transformation = cache.get(packageName); if (transformation == null) { transformation = new Transformation(); transformation.packageName = packageName + "."; transformation.fullPrefix = packageName + "."; cache.put(packageName, transformation); } return transformation; }
private Date calculateModificationDate(String className) { int dotIndex = className.lastIndexOf('.'); String packageName; String simpleName; if (dotIndex > 0) { packageName = className.substring(0, dotIndex + 1); simpleName = className.substring(dotIndex + 1); } else { packageName = ""; simpleName = className; } for (Transformation transformation : transformations) { if (packageName.startsWith(transformation.packageName)) { String fullName = transformation.packagePrefix + packageName + transformation.classPrefix + simpleName; Date date = getOriginalModificationDate(fullName); if (date != null) { return date; } } } return getOriginalModificationDate(className); }
@Override public void visitIincInsn(int var, int increment) { var = minLocal + mapLocal(var); int tmp = pushSingle(); popSingle(); IntegerConstantInstruction intInsn = new IntegerConstantInstruction(); intInsn.setConstant(increment); intInsn.setReceiver(getVariable(tmp)); addInstruction(intInsn); emitBinary(BinaryOperation.ADD, NumericOperandType.INT, var, tmp, var); }
@Override public void visit(ClassConstantInstruction insn) { insn.setConstant(rename(insn.getConstant())); }
public TeaVMBuilder(TeaVMTarget target) { this.target = target; classLoader = TeaVMBuilder.class.getClassLoader(); classSource = !isBootstrap() ? new ClasspathClassHolderSource(classLoader) : name -> null; }
private int pushSingle() { stack = new StackFrame(stack, SINGLE); return stack.depth; }
@Override public void visit(IsInstanceInstruction insn) { insn.setType(rename(insn.getType())); }
@Override public void visit(CastInstruction insn) { insn.setTargetType(rename(insn.getTargetType())); }
@Override public void visit(ConstructMultiArrayInstruction insn) { insn.setItemType(rename(insn.getItemType())); }
private RuntimeConstant rename(RuntimeConstant cst) { switch (cst.getKind()) { case RuntimeConstant.TYPE: return new RuntimeConstant(rename(cst.getValueType())); case RuntimeConstant.METHOD: return new RuntimeConstant(rename(cst.getMethodType())); case RuntimeConstant.METHOD_HANDLE: return new RuntimeConstant(rename(cst.getMethodHandle())); default: return cst; } }
public FieldHolder rename(FieldHolder field) { FieldHolder renamedField = new FieldHolder(field.getName()); renamedField.getModifiers().addAll(field.getModifiers()); renamedField.setLevel(field.getLevel()); renamedField.setType(rename(field.getType())); renamedField.setInitialValue(field.getInitialValue()); rename(field.getAnnotations(), renamedField.getAnnotations()); return renamedField; }