List of usage examples for org.objectweb.asm.tree.analysis SimpleVerifier setClassLoader
public void setClassLoader(final ClassLoader loader)
ClassLoader to be used in #getClass . From source file:org.ballerinalang.compiler.backend.jvm.ClassVerifier.java
License:Open Source License
/** * This method is an extension of/*from w ww. j a va 2 s . c o m*/ * {@code jdk.internal.org.objectweb.asm.util.CheckClassAdapter#verify(ClassReader, boolean, java.io.PrintWriter)}. * * @param bytes Bytes stream of the class to be verified. * @return An optional error, if there are verification errors. */ private static Optional<ErrorValue> verify(byte[] bytes, ClassLoader classLoader) { ClassReader classReader = new ClassReader(bytes); ClassNode classNode = new ClassNode(); classReader.accept(new CheckClassAdapter(Opcodes.ASM7, classNode, false) { }, ClassReader.SKIP_DEBUG); Type syperType = classNode.superName == null ? null : Type.getObjectType(classNode.superName); List<MethodNode> methods = classNode.methods; List<Type> interfaces = new ArrayList<>(); for (String interfaceName : classNode.interfaces) { interfaces.add(Type.getObjectType(interfaceName)); } for (MethodNode method : methods) { SimpleVerifier verifier = new SimpleVerifier(Type.getObjectType(classNode.name), syperType, interfaces, (classNode.access & Opcodes.ACC_INTERFACE) != 0); Analyzer<BasicValue> analyzer = new Analyzer<>(verifier); if (classLoader != null) { verifier.setClassLoader(classLoader); } try { analyzer.analyze(classNode.name, method); } catch (AnalyzerException e) { return Optional.of(BallerinaErrors.createError(e.getMessage())); } } return Optional.empty(); }