blob: 3a52c85d56629c0ec962c6484d08c29ef4eb30b3 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package org.chromium.bytecode;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
/**
* A ClassWriter that uses a custom class loader.
*/
class CustomClassLoaderClassWriter extends ClassWriter {
private ClassLoader mClassLoader;
public CustomClassLoaderClassWriter(ClassLoader classLoader, ClassReader reader, int flags) {
super(reader, flags);
this.mClassLoader = classLoader;
}
/**
* The only modifications from the org.objectweb.asm.ClassWriter implementations is that this
* method is final and it uses a custom ClassLoader.
*
* See https://github.com/llbit/ow2-asm/blob/master/src/org/objectweb/asm/ClassWriter.java.
*/
@Override
protected final String getCommonSuperClass(final String type1, final String type2) {
Class<?> c, d;
try {
c = Class.forName(type1.replace('/', '.'), false, mClassLoader);
d = Class.forName(type2.replace('/', '.'), false, mClassLoader);
} catch (Exception e) {
throw new RuntimeException(e.toString());
}
if (c.isAssignableFrom(d)) {
return type1;
}
if (d.isAssignableFrom(c)) {
return type2;
}
if (c.isInterface() || d.isInterface()) {
return "java/lang/Object";
} else {
do {
c = c.getSuperclass();
} while (!c.isAssignableFrom(d));
return c.getName().replace('.', '/');
}
}
}