mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 07:27:52 +01:00
Write the "this" parameter type of a method as ref type instead of anyref.
This commit is contained in:
parent
e8a4613d74
commit
b08a986945
@ -467,10 +467,7 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
|
|||||||
localsStream.writeVaruint32( locals.size() );
|
localsStream.writeVaruint32( locals.size() );
|
||||||
for( AnyType valueType : locals ) {
|
for( AnyType valueType : locals ) {
|
||||||
localsStream.writeVaruint32( 1 ); // TODO optimize, write the count of same types.
|
localsStream.writeVaruint32( 1 ); // TODO optimize, write the count of same types.
|
||||||
if( valueType.getCode() >= 0 ) {
|
localsStream.writeRefValueType( valueType );
|
||||||
localsStream.writeValueType( ValueType.ref_type );
|
|
||||||
}
|
|
||||||
localsStream.writeValueType( valueType );
|
|
||||||
}
|
}
|
||||||
WasmOutputStream functionsStream = function.functionsStream = new WasmOutputStream();
|
WasmOutputStream functionsStream = function.functionsStream = new WasmOutputStream();
|
||||||
functionsStream.writeVaruint32( localsStream.size() + codeStream.size() + 1 );
|
functionsStream.writeVaruint32( localsStream.size() + codeStream.size() + 1 );
|
||||||
|
@ -48,11 +48,11 @@ class FunctionTypeEntry extends TypeEntry {
|
|||||||
void writeSectionEntryDetails( WasmOutputStream stream ) throws IOException {
|
void writeSectionEntryDetails( WasmOutputStream stream ) throws IOException {
|
||||||
stream.writeVaruint32( this.params.size() );
|
stream.writeVaruint32( this.params.size() );
|
||||||
for( AnyType valueType : this.params ) {
|
for( AnyType valueType : this.params ) {
|
||||||
stream.writeValueType( valueType );
|
stream.writeRefValueType( valueType );
|
||||||
}
|
}
|
||||||
stream.writeVaruint32( this.results.size() );
|
stream.writeVaruint32( this.results.size() );
|
||||||
for( AnyType valueType : this.results ) {
|
for( AnyType valueType : this.results ) {
|
||||||
stream.writeValueType( valueType );
|
stream.writeRefValueType( valueType );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,10 +56,7 @@ class StructTypeEntry extends TypeEntry {
|
|||||||
stream.writeVaruint32( this.fields.size() );
|
stream.writeVaruint32( this.fields.size() );
|
||||||
for( NamedStorageType field : this.fields ) {
|
for( NamedStorageType field : this.fields ) {
|
||||||
stream.writeVarint( 1 ); // 0 - immutable; 1 - mutable
|
stream.writeVarint( 1 ); // 0 - immutable; 1 - mutable
|
||||||
if( field.getType().getCode() > 0 ) {
|
stream.writeRefValueType( field.getType() );
|
||||||
stream.writeValueType( ValueType.ref_type );
|
|
||||||
}
|
|
||||||
stream.writeValueType( field.getType() );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,6 +96,21 @@ class WasmOutputStream extends FilterOutputStream {
|
|||||||
writeVarint( type.getCode() );
|
writeVarint( type.getCode() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the value type. If it is a struct type then as reference type.
|
||||||
|
*
|
||||||
|
* @param type
|
||||||
|
* a type constant
|
||||||
|
* @throws IOException
|
||||||
|
* if an I/O error occurs.
|
||||||
|
*/
|
||||||
|
public void writeRefValueType( AnyType type ) throws IOException {
|
||||||
|
if( type.getCode() >= 0 ) {
|
||||||
|
writeValueType( ValueType.ref_type );
|
||||||
|
}
|
||||||
|
writeValueType( type );
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a integer little endian (ever 4 bytes)
|
* Write a integer little endian (ever 4 bytes)
|
||||||
*
|
*
|
||||||
|
@ -210,9 +210,7 @@ public class ModuleGenerator {
|
|||||||
*/
|
*/
|
||||||
private void setStructType( WasmStructInstruction instruction ) throws IOException {
|
private void setStructType( WasmStructInstruction instruction ) throws IOException {
|
||||||
StructType type = instruction.getStructType();
|
StructType type = instruction.getStructType();
|
||||||
if( type != null && type.getCode() == Integer.MAX_VALUE ) {
|
writeStructType( type );
|
||||||
writeStructType( type );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -224,6 +222,9 @@ public class ModuleGenerator {
|
|||||||
* if any I/O error occur
|
* if any I/O error occur
|
||||||
*/
|
*/
|
||||||
private void writeStructType( StructType type ) throws IOException {
|
private void writeStructType( StructType type ) throws IOException {
|
||||||
|
if( type == null || type.getCode() != Integer.MAX_VALUE ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
String className = type.getName();
|
String className = type.getName();
|
||||||
List<NamedStorageType> list = new ArrayList<>();
|
List<NamedStorageType> list = new ArrayList<>();
|
||||||
listStructFields( className, list );
|
listStructFields( className, list );
|
||||||
@ -231,14 +232,15 @@ public class ModuleGenerator {
|
|||||||
int id = writer.writeStruct( className, list );
|
int id = writer.writeStruct( className, list );
|
||||||
types.useType( type, id, list );
|
types.useType( type, id, list );
|
||||||
for( NamedStorageType namedType : list ) {
|
for( NamedStorageType namedType : list ) {
|
||||||
if( namedType.getType().getCode() == Integer.MAX_VALUE ) {
|
AnyType fieldType = namedType.getType();
|
||||||
writeStructType( (StructType)namedType.getType() );
|
if( fieldType.getCode() == Integer.MAX_VALUE ) {
|
||||||
|
writeStructType( (StructType)fieldType );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* List the non static fields of the class and its superclasses.
|
* List the non static fields of the class and its super classes.
|
||||||
*
|
*
|
||||||
* @param className
|
* @param className
|
||||||
* the className
|
* the className
|
||||||
@ -488,7 +490,9 @@ public class ModuleGenerator {
|
|||||||
private void writeMethodSignature( FunctionName name, boolean isStatic, WasmCodeBuilder codeBuilder ) throws IOException, WasmException {
|
private void writeMethodSignature( FunctionName name, boolean isStatic, WasmCodeBuilder codeBuilder ) throws IOException, WasmException {
|
||||||
int paramCount = 0;
|
int paramCount = 0;
|
||||||
if( !isStatic ) {
|
if( !isStatic ) {
|
||||||
writer.writeMethodParam( "param", ValueType.anyref, "this" );
|
StructType instanceType = types.valueOf( name.className );
|
||||||
|
writeStructType( instanceType );
|
||||||
|
writer.writeMethodParam( "param", instanceType, "this" );
|
||||||
}
|
}
|
||||||
Iterator<AnyType> parser = name.getSignature();
|
Iterator<AnyType> parser = name.getSignature();
|
||||||
AnyType type;
|
AnyType type;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user