mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 07:27:52 +01:00
write event section if exception handling is used.
This commit is contained in:
parent
861ba5c62f
commit
2d2a5f4b68
@ -64,7 +64,7 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
|
|||||||
|
|
||||||
private Map<String, Function> functions = new LinkedHashMap<>();
|
private Map<String, Function> functions = new LinkedHashMap<>();
|
||||||
|
|
||||||
private List<AnyType> locals = new ArrayList<>();
|
private List<AnyType> locals = new ArrayList<>();
|
||||||
|
|
||||||
private Map<String, Global> globals = new LinkedHashMap<>();
|
private Map<String, Global> globals = new LinkedHashMap<>();
|
||||||
|
|
||||||
@ -74,7 +74,9 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
|
|||||||
|
|
||||||
private Function function;
|
private Function function;
|
||||||
|
|
||||||
private FunctionTypeEntry functionType;
|
private FunctionTypeEntry functionType;
|
||||||
|
|
||||||
|
private int exceptionSignatureIndex = -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create new instance.
|
* Create new instance.
|
||||||
@ -109,6 +111,7 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
|
|||||||
writeSection( SectionType.Import, imports.values() );
|
writeSection( SectionType.Import, imports.values() );
|
||||||
writeSection( SectionType.Function, functions.values() );
|
writeSection( SectionType.Function, functions.values() );
|
||||||
writeSection( SectionType.Global, globals.values() );
|
writeSection( SectionType.Global, globals.values() );
|
||||||
|
writeEventSection();
|
||||||
writeExportSection();
|
writeExportSection();
|
||||||
writeCodeSection();
|
writeCodeSection();
|
||||||
writeDebugNames();
|
writeDebugNames();
|
||||||
@ -138,6 +141,25 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write the event section if needed.
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
* if any I/O error occur
|
||||||
|
*/
|
||||||
|
private void writeEventSection() throws IOException {
|
||||||
|
if( exceptionSignatureIndex >= 0 ) {
|
||||||
|
WasmOutputStream stream = new WasmOutputStream();
|
||||||
|
stream.writeVaruint32( 1 );
|
||||||
|
|
||||||
|
// event declaration
|
||||||
|
stream.writeVaruint32( 0 ); // event type: exception = 0
|
||||||
|
stream.writeVaruint32( exceptionSignatureIndex );
|
||||||
|
|
||||||
|
wasm.writeSection( SectionType.Export, stream );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write the export section to the output. This section contains a mapping from the external index to the type signature index.
|
* Write the export section to the output. This section contains a mapping from the external index to the type signature index.
|
||||||
*
|
*
|
||||||
@ -238,6 +260,22 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
|
|||||||
return typeId;
|
return typeId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void writeException() throws IOException {
|
||||||
|
if( exceptionSignatureIndex <= 0 ) {
|
||||||
|
FunctionTypeEntry exceptionType = new FunctionTypeEntry();
|
||||||
|
exceptionType.params.add( ValueType.anyref );
|
||||||
|
exceptionSignatureIndex = functionTypes.indexOf( exceptionType );
|
||||||
|
if( exceptionSignatureIndex < 0 ) {
|
||||||
|
exceptionSignatureIndex = functionTypes.size();
|
||||||
|
functionTypes.add( exceptionType );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
@ -371,6 +371,15 @@ public class ModuleGenerator {
|
|||||||
optimizer.optimze( instructions );
|
optimizer.optimze( instructions );
|
||||||
for( WasmInstruction instruction : instructions ) {
|
for( WasmInstruction instruction : instructions ) {
|
||||||
switch( instruction.getType() ) {
|
switch( instruction.getType() ) {
|
||||||
|
case Block:
|
||||||
|
switch( ((WasmBlockInstruction)instruction).getOperation() ) {
|
||||||
|
case TRY:
|
||||||
|
case CATCH:
|
||||||
|
writer.writeException();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
break;
|
||||||
case Call:
|
case Call:
|
||||||
functions.functionCall( ((WasmCallInstruction)instruction).getFunctionName() );
|
functions.functionCall( ((WasmCallInstruction)instruction).getFunctionName() );
|
||||||
break;
|
break;
|
||||||
|
@ -60,6 +60,14 @@ public abstract class ModuleWriter implements Closeable {
|
|||||||
*/
|
*/
|
||||||
protected abstract int writeStruct( String typeName, List<NamedStorageType> fields ) throws IOException;
|
protected abstract int writeStruct( String typeName, List<NamedStorageType> fields ) throws IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mark to write exceptions
|
||||||
|
*
|
||||||
|
* @throws IOException
|
||||||
|
* if any I/O error occur
|
||||||
|
*/
|
||||||
|
protected abstract void writeException() throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Prepare a imported single function in the prepare phase.
|
* Prepare a imported single function in the prepare phase.
|
||||||
*
|
*
|
||||||
|
@ -21,7 +21,6 @@ import java.io.IOException;
|
|||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
import de.inetsoftware.jwebassembly.module.WasmInstruction.Type;
|
|
||||||
import de.inetsoftware.jwebassembly.wasm.AnyType;
|
import de.inetsoftware.jwebassembly.wasm.AnyType;
|
||||||
import de.inetsoftware.jwebassembly.wasm.ValueType;
|
import de.inetsoftware.jwebassembly.wasm.ValueType;
|
||||||
import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator;
|
import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator;
|
||||||
@ -62,6 +61,14 @@ class WasmBlockInstruction extends WasmInstruction {
|
|||||||
return Type.Block;
|
return Type.Block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the operation
|
||||||
|
* @return the op
|
||||||
|
*/
|
||||||
|
WasmBlockOperator getOperation() {
|
||||||
|
return op;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
@ -57,6 +57,8 @@ public class TextModuleWriter extends ModuleWriter {
|
|||||||
|
|
||||||
private HashSet<String> globals = new HashSet<>();
|
private HashSet<String> globals = new HashSet<>();
|
||||||
|
|
||||||
|
private boolean useExceptions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new instance.
|
* Create a new instance.
|
||||||
*
|
*
|
||||||
@ -117,6 +119,21 @@ public class TextModuleWriter extends ModuleWriter {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritDoc}
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
protected void writeException() throws IOException {
|
||||||
|
if( !useExceptions ) {
|
||||||
|
useExceptions = true;
|
||||||
|
int oldInset = inset;
|
||||||
|
inset = 1;
|
||||||
|
newline( output );
|
||||||
|
output.append( "(event (param anyref))" );
|
||||||
|
inset = oldInset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user