From 53319942ae99e6f16af1526c5ba6275cb7961cdc Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sun, 15 Sep 2019 15:42:50 +0200 Subject: [PATCH] set initial values of non GC struct values --- .../jwebassembly/module/ModuleGenerator.java | 4 +++- .../module/WasmStructInstruction.java | 23 ++++++++++++++++++- .../jwebassembly/runtime/StructsNonGC.java | 2 +- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java b/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java index 1455290..e6e4b03 100644 --- a/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java +++ b/src/de/inetsoftware/jwebassembly/module/ModuleGenerator.java @@ -22,7 +22,6 @@ import java.net.URL; import java.net.URLClassLoader; import java.nio.file.Files; import java.nio.file.Path; -import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -500,6 +499,9 @@ public class ModuleGenerator { ((WasmCallInstruction)instruction).markAsNeeded( functions, false ); break; case Struct: + if( !writer.options.useGC() ) { + break; + } WasmStructInstruction instr = (WasmStructInstruction)instruction; if( instr.getOperator() == StructOperator.NEW_DEFAULT ) { StructType structType = instr.getStructType(); diff --git a/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java b/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java index e0cf8ac..5a13f19 100644 --- a/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java +++ b/src/de/inetsoftware/jwebassembly/module/WasmStructInstruction.java @@ -82,7 +82,28 @@ class WasmStructInstruction extends WasmInstruction { case NEW: case NEW_DEFAULT: functionName = new JavaScriptSyntheticFunctionName( "NonGC", "new_" + type.getName().replace( '/', '_' ), () -> { - return "() => {return {0:0}}"; //TODO default values of fields and then use Object.seal() + // create the default values of a new type + StringBuilder js = new StringBuilder("() => Object.seal({"); + List list = type.getFields(); + for( int i = 0; i < list.size(); i++ ) { + if( i > 0 ) { + js.append( ',' ); + } + js.append( i ).append( ':' ); + NamedStorageType storageType = list.get( i ); + if( TypeManager.VTABLE == storageType.getName() ) { + js.append( type.getVTable() ); + } else { + AnyType fieldType = storageType.getType(); + if( fieldType instanceof ValueType && fieldType != ValueType.anyref ) { + js.append( '0' ); + } else { + js.append( "null" ); + } + } + } + js.append( "})" ); + return js.toString(); }, null, type ); break; case SET: diff --git a/test/de/inetsoftware/jwebassembly/runtime/StructsNonGC.java b/test/de/inetsoftware/jwebassembly/runtime/StructsNonGC.java index 5edcade..2325982 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/StructsNonGC.java +++ b/test/de/inetsoftware/jwebassembly/runtime/StructsNonGC.java @@ -50,7 +50,7 @@ public class StructsNonGC extends AbstractBaseTest { addParam( list, script, "isNotSame" ); addParam( list, script, "simple" ); addParam( list, script, "callSuperMethod" ); - //TODO addParam( list, script, "callVirtualMethod" ); + addParam( list, script, "callVirtualMethod" ); addParam( list, script, "useGlobalObject" ); addParam( list, script, "multipleAssign" ); }