diff --git a/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java b/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java index 2baf348..fc05c78 100644 --- a/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java +++ b/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java @@ -473,7 +473,7 @@ public class ModuleGenerator { return javaCodeBuilder; } else { FunctionName name = new FunctionName( method ); - if( "de/inetsoftware/jwebassembly/module/ReplacementForClass.typeTableMemoryOffset()I".equals( name.signatureName ) ) { + if( "java/lang/Class.typeTableMemoryOffset()I".equals( name.signatureName ) ) { return types.getTypeTableMemoryOffsetFunctionName().getCodeBuilder( watParser ); } throw new WasmException( "Abstract or native method can not be used: " + name.signatureName, -1 ); diff --git a/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java b/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java index acec700..750652d 100644 --- a/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java +++ b/src/de/inetsoftware/jwebassembly/module/ReplacementForClass.java @@ -57,7 +57,14 @@ class ReplacementForClass { */ @WasmTextCode( "local.get 0 " // THIS + "struct.get java/lang/Object .vtable " // vtable is on index 0 - + "call $de/inetsoftware/jwebassembly/module/ReplacementForClass.classConstant(I)Lde/inetsoftware/jwebassembly/module/ReplacementForClass; " // + + "local.tee 1 " // save the vtable location + + "i32.const " + TypeManager.TYPE_DESCRIPTION_INSTANCEOF_OFFSET + " " // vtable is on index 0 + + "i32.add " // + + "call $java/lang/Class.getIntFromMemory(I)I " // + + "local.get 1 " // get the vtable location + + "i32.add " // + + "call $java/lang/Class.getIntFromMemory(I)I " // + + "call $java/lang/Class.classConstant(I)Lde/inetsoftware/jwebassembly/module/ReplacementForClass; " // + "return " // ) @Replace( "java/lang/Object.getClass()Ljava/lang/Class;" ) @@ -122,7 +129,7 @@ class ReplacementForClass { */ @WasmTextCode( "local.get 0 " + // "local.get 1 " + // - "table.set 2 " + // + "table.set 2 " + // table 2 is used for classes "return" ) private static native void setClassIntoTable( int strIdx, ReplacementForClass clazz ); diff --git a/src/de/inetsoftware/jwebassembly/module/TypeManager.java b/src/de/inetsoftware/jwebassembly/module/TypeManager.java index 78f04af..3e2d083 100644 --- a/src/de/inetsoftware/jwebassembly/module/TypeManager.java +++ b/src/de/inetsoftware/jwebassembly/module/TypeManager.java @@ -127,10 +127,11 @@ public class TypeManager { } // write type table - ByteArrayOutputStream dataStream = writer.dataStream; - typeTableOffset = dataStream.size(); + @SuppressWarnings( "resource" ) + LittleEndianOutputStream dataStream = new LittleEndianOutputStream( writer.dataStream ); + typeTableOffset = writer.dataStream.size(); for( StructType type : structTypes.values() ) { - dataStream.write( type.vtableOffset ); + dataStream.writeInt32( type.vtableOffset ); } } @@ -141,7 +142,7 @@ public class TypeManager { */ WatCodeSyntheticFunctionName getTypeTableMemoryOffsetFunctionName() { WatCodeSyntheticFunctionName offsetFunction = - new WatCodeSyntheticFunctionName( "de/inetsoftware/jwebassembly/module/ReplacementForClass", "typeTableMemoryOffset", "()I", "", null, ValueType.i32 ) { + new WatCodeSyntheticFunctionName( "java/lang/Class", "typeTableMemoryOffset", "()I", "", null, ValueType.i32 ) { protected String getCode() { return "i32.const " + typeTableOffset; } @@ -219,7 +220,7 @@ public class TypeManager { "instanceof", "local.get 0 " // THIS + "struct.get java/lang/Object .vtable " // vtable is on index 0 + "local.tee 2 " // save the vtable location - + "i32.load offset=4 align=4 " // get offset of instanceof inside vtable (int position 1, byte position 4) + + "i32.load offset=" + TYPE_DESCRIPTION_INSTANCEOF_OFFSET + " align=4 " // get offset of instanceof inside vtable (int position 1, byte position 4) + "local.get 2 " // get the vtable location + "i32.add " // + "local.tee 2 " // save the instanceof location