compile all implementations of used interfaces.

This commit is contained in:
Volker Berlin 2020-05-03 11:17:57 +02:00
parent c4d4bf04be
commit f277238d14
2 changed files with 39 additions and 7 deletions

View File

@ -447,13 +447,9 @@ public class TypeManager {
}
// add all interfaces to the instanceof set
for(ConstantClass interClass : classFile.getInterfaces() ) {
StructType type = types.structTypes.get( interClass.getName() );
if( type != null ) {
instanceOFs.add( type );
}
}
listInterface( classFile, functions, types, classFileLoader );
// List stuff of super class
ConstantClass superClass = classFile.getSuperClass();
if( superClass != null ) {
String superClassName = superClass.getName();
@ -463,6 +459,7 @@ public class TypeManager {
fields.add( new NamedStorageType( ValueType.i32, className, FIELD_HASHCODE ) );
}
// list all fields
for( FieldInfo field : classFile.getFields() ) {
if( field.isStatic() ) {
continue;
@ -500,6 +497,41 @@ public class TypeManager {
}
}
/**
* List all interfaces and and mark all instance methods of used interfaces.
*
* @param classFile
* the class file
* @param functions
* the used functions for the vtables of the types
* @param types
* for types of fields
* @param classFileLoader
* for loading the class files
* @throws IOException
* if any I/O error occur on loading or writing
*/
private void listInterface( ClassFile classFile, FunctionManager functions, TypeManager types, ClassFileLoader classFileLoader ) throws IOException {
for( ConstantClass interClass : classFile.getInterfaces() ) {
String interName = interClass.getName();
StructType type = types.structTypes.get( interName );
if( type != null ) {
// add all interfaces to the instanceof set
instanceOFs.add( type );
}
ClassFile interClassFile = classFileLoader.get( interName );
for( MethodInfo interMethod : interClassFile.getMethods() ) {
FunctionName funcName = new FunctionName( interMethod );
if( functions.isUsed( funcName ) ) {
MethodInfo method = classFile.getMethod( funcName.methodName, funcName.signature );
if( method != null ) {
functions.markAsNeeded( new FunctionName( method ) );
}
}
}
}
}
/**
* {@inheritDoc}
*/

View File

@ -651,7 +651,7 @@ public abstract class WasmCodeBuilder {
* the line number in the Java source code
*/
protected void addCallInterfaceInstruction( FunctionName name, int javaCodePos, int lineNumber ) {
//TODO name = functions.markAsNeeded( name );
name = functions.markAsNeeded( name );
addCallIndirectInstruction( new WasmCallInterfaceInstruction( name, javaCodePos, lineNumber, types, options ) );
functions.markClassAsUsed( name.className );
}