diff --git a/classlib/src/main/java/org/teavm/classlib/impl/ServiceLoaderWasmGCSupport.java b/classlib/src/main/java/org/teavm/classlib/impl/ServiceLoaderWasmGCSupport.java index c17d55797..23904c86e 100644 --- a/classlib/src/main/java/org/teavm/classlib/impl/ServiceLoaderWasmGCSupport.java +++ b/classlib/src/main/java/org/teavm/classlib/impl/ServiceLoaderWasmGCSupport.java @@ -172,7 +172,6 @@ public class ServiceLoaderWasmGCSupport implements WasmGCCustomGeneratorFactory function.setReferenced(true); function.setName(context.names().topLevel("teavm@emptyServicesInitializer")); context.module().functions.add(function); - function.getBody().add(new WasmReturn()); return function; } } diff --git a/core/src/main/java/org/teavm/backend/wasm/WasmGCModuleGenerator.java b/core/src/main/java/org/teavm/backend/wasm/WasmGCModuleGenerator.java index a012ec99b..e2050b3ad 100644 --- a/core/src/main/java/org/teavm/backend/wasm/WasmGCModuleGenerator.java +++ b/core/src/main/java/org/teavm/backend/wasm/WasmGCModuleGenerator.java @@ -27,7 +27,6 @@ import org.teavm.backend.wasm.model.expression.WasmExpression; import org.teavm.backend.wasm.model.expression.WasmFunctionReference; import org.teavm.backend.wasm.model.expression.WasmGetGlobal; import org.teavm.backend.wasm.model.expression.WasmGetLocal; -import org.teavm.backend.wasm.model.expression.WasmReturn; import org.teavm.backend.wasm.model.expression.WasmSetGlobal; import org.teavm.backend.wasm.runtime.WasmGCSupport; import org.teavm.model.MethodReference; @@ -51,7 +50,6 @@ public class WasmGCModuleGenerator { private void fillInitializer() { declarationsGenerator.contributeToInitializer(initializer); - initializer.getBody().add(new WasmReturn()); } public WasmFunction generateMainFunction(String entryPoint) { @@ -66,7 +64,6 @@ public class WasmGCModuleGenerator { var callToMainFunction = new WasmCall(mainFunction, new WasmGetLocal(argsLocal)); mainFunctionCaller.getBody().add(callToMainFunction); - mainFunctionCaller.getBody().add(new WasmReturn()); return mainFunctionCaller; } @@ -76,7 +73,7 @@ public class WasmGCModuleGenerator { WasmGCSupport.class, "createStringBuilder", StringBuilder.class)); var caller = new WasmFunction(function.getType()); caller.getBody().add(callInitializer()); - caller.getBody().add(new WasmReturn(new WasmCall(function))); + caller.getBody().add(new WasmCall(function)); declarationsGenerator.module.functions.add(caller); return caller; } @@ -88,7 +85,7 @@ public class WasmGCModuleGenerator { var sizeLocal = new WasmLocal(WasmType.INT32, "length"); caller.add(sizeLocal); caller.getBody().add(callInitializer()); - caller.getBody().add(new WasmReturn(new WasmCall(function, new WasmGetLocal(sizeLocal)))); + caller.getBody().add(new WasmCall(function, new WasmGetLocal(sizeLocal))); declarationsGenerator.module.functions.add(caller); return caller; } @@ -105,7 +102,6 @@ public class WasmGCModuleGenerator { caller.getBody().add(callInitializer()); caller.getBody().add(new WasmDrop(new WasmCall(function, new WasmGetLocal(stringBuilderLocal), new WasmGetLocal(codeLocal)))); - caller.getBody().add(new WasmReturn()); declarationsGenerator.module.functions.add(caller); return caller; } @@ -119,7 +115,7 @@ public class WasmGCModuleGenerator { var stringBuilderLocal = new WasmLocal(stringBuilderType, "stringBuilder"); caller.add(stringBuilderLocal); caller.getBody().add(callInitializer()); - caller.getBody().add(new WasmReturn(new WasmCall(function, new WasmGetLocal(stringBuilderLocal)))); + caller.getBody().add(new WasmCall(function, new WasmGetLocal(stringBuilderLocal))); declarationsGenerator.module.functions.add(caller); return caller; } @@ -137,8 +133,8 @@ public class WasmGCModuleGenerator { caller.add(indexLocal); caller.add(valueLocal); caller.getBody().add(callInitializer()); - caller.getBody().add(new WasmReturn(new WasmCall(function, new WasmGetLocal(arrayLocal), - new WasmGetLocal(indexLocal), new WasmGetLocal(valueLocal)))); + caller.getBody().add(new WasmCall(function, new WasmGetLocal(arrayLocal), + new WasmGetLocal(indexLocal), new WasmGetLocal(valueLocal))); declarationsGenerator.module.functions.add(caller); return caller; } @@ -151,7 +147,7 @@ public class WasmGCModuleGenerator { var stringLocal = new WasmLocal(stringType, "string"); caller.add(stringLocal); caller.getBody().add(callInitializer()); - caller.getBody().add(new WasmReturn(new WasmCall(function, new WasmGetLocal(stringLocal)))); + caller.getBody().add(new WasmCall(function, new WasmGetLocal(stringLocal))); declarationsGenerator.module.functions.add(caller); return caller; } @@ -166,8 +162,8 @@ public class WasmGCModuleGenerator { caller.add(stringLocal); caller.add(indexLocal); caller.getBody().add(callInitializer()); - caller.getBody().add(new WasmReturn(new WasmCall(function, new WasmGetLocal(stringLocal), - new WasmGetLocal(indexLocal)))); + caller.getBody().add(new WasmCall(function, new WasmGetLocal(stringLocal), + new WasmGetLocal(indexLocal))); declarationsGenerator.module.functions.add(caller); return caller; } diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerationVisitor.java b/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerationVisitor.java index 61cb640ef..4cca348fb 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerationVisitor.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/WasmGenerationVisitor.java @@ -784,7 +784,7 @@ public class WasmGenerationVisitor extends BaseWasmGenerationVisitor { } @Override - protected WasmExpression allocateMultiArray(List target, ValueType itemType, + protected WasmExpression allocateMultiArray(List target, ValueType arrayType, Supplier> dimensions, TextLocation location) { int dimensionList = -1; var dimensionsValue = dimensions.get(); @@ -797,7 +797,7 @@ public class WasmGenerationVisitor extends BaseWasmGenerationVisitor { WasmInt32Subtype.INT32)); } - int classPointer = classGenerator.getClassPointer(itemType); + int classPointer = classGenerator.getClassPointer(arrayType); var allocFunction = context.functions().forStaticMethod(new MethodReference(Allocator.class, "allocateMultiArray", RuntimeClass.class, Address.class, int.class, RuntimeArray.class)); var call = new WasmCall(allocFunction); diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/common/methods/BaseWasmGenerationVisitor.java b/core/src/main/java/org/teavm/backend/wasm/generate/common/methods/BaseWasmGenerationVisitor.java index d73e7e073..fccdd8022 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/common/methods/BaseWasmGenerationVisitor.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/common/methods/BaseWasmGenerationVisitor.java @@ -1041,7 +1041,7 @@ public abstract class BaseWasmGenerationVisitor implements StatementVisitor, Exp protected abstract void allocateArray(ValueType itemType, Supplier length, TextLocation location, WasmLocal local, List target); - protected abstract WasmExpression allocateMultiArray(List target, ValueType itemType, + protected abstract WasmExpression allocateMultiArray(List target, ValueType arrayType, Supplier> dimensions, TextLocation location); @Override @@ -1107,9 +1107,6 @@ public abstract class BaseWasmGenerationVisitor implements StatementVisitor, Exp callSiteId.generateRegister(block.getBody(), expr.getLocation()); var arrayType = expr.getType(); - for (var dimension : expr.getDimensions()) { - arrayType = ValueType.arrayOf(arrayType); - } block.setType(mapType(arrayType)); var call = allocateMultiArray(block.getBody(), expr.getType(), () -> { var wasmDimensions = new ArrayList(); diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassGenerator.java b/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassGenerator.java index 0fd395c4c..874c9af0f 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassGenerator.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassGenerator.java @@ -19,6 +19,7 @@ import com.carrotsearch.hppc.ObjectIntHashMap; import com.carrotsearch.hppc.ObjectIntMap; import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; @@ -67,7 +68,6 @@ import org.teavm.backend.wasm.model.expression.WasmIntBinary; import org.teavm.backend.wasm.model.expression.WasmIntBinaryOperation; import org.teavm.backend.wasm.model.expression.WasmIntType; import org.teavm.backend.wasm.model.expression.WasmNullConstant; -import org.teavm.backend.wasm.model.expression.WasmReturn; import org.teavm.backend.wasm.model.expression.WasmSetGlobal; import org.teavm.backend.wasm.model.expression.WasmSetLocal; import org.teavm.backend.wasm.model.expression.WasmSignedType; @@ -355,7 +355,7 @@ public class WasmGCClassGenerator implements WasmGCClassInfoProvider, WasmGCInit var req = metadataRequirements.getInfo(type); if (req != null) { if (req.newArray()) { - classInfo.initArrayFunction = getArrayConstructor(ValueType.arrayOf(classInfo.getValueType())); + classInfo.initArrayFunction = getArrayConstructor(classInfo.getValueType(), 1); classInfo.initArrayFunction.setReferenced(true); } if (req.isAssignable()) { @@ -369,12 +369,23 @@ public class WasmGCClassGenerator implements WasmGCClassInfoProvider, WasmGCInit } @Override - public WasmFunction getArrayConstructor(ValueType.Array type) { + public WasmFunction getArrayConstructor(ValueType type, int depth) { var arrayInfo = getClassInfo(type); - if (arrayInfo.newArrayFunction == null) { - arrayInfo.newArrayFunction = newArrayGenerator.generateNewArrayFunction(type.getItemType()); + if (arrayInfo.newArrayFunctions == null) { + arrayInfo.newArrayFunctions = new ArrayList<>(); } - return arrayInfo.newArrayFunction; + if (depth >= arrayInfo.newArrayFunctions.size()) { + arrayInfo.newArrayFunctions.addAll(Collections.nCopies( + depth - arrayInfo.newArrayFunctions.size() + 1, null)); + } + var function = arrayInfo.newArrayFunctions.get(depth); + if (function == null) { + function = depth == 1 + ? newArrayGenerator.generateNewArrayFunction(type) + : newArrayGenerator.generateNewMultiArrayFunction(type, depth); + arrayInfo.newArrayFunctions.set(depth, function); + } + return function; } public int getClassTagOffset() { @@ -631,7 +642,7 @@ public class WasmGCClassGenerator implements WasmGCClassInfoProvider, WasmGCInit } } - function.getBody().add(new WasmReturn(copy)); + function.getBody().add(copy); return function; } @@ -697,7 +708,7 @@ public class WasmGCClassGenerator implements WasmGCClassInfoProvider, WasmGCInit var castObject = new WasmCast(new WasmGetLocal(objectLocal), objectStructure.getNonNullReference()); var arrayField = new WasmStructGet(objectStructure, castObject, ARRAY_DATA_FIELD_OFFSET); var result = new WasmArrayLength(arrayField); - function.getBody().add(new WasmReturn(result)); + function.getBody().add(result); return function; } @@ -728,7 +739,7 @@ public class WasmGCClassGenerator implements WasmGCClassInfoProvider, WasmGCInit var array = new WasmCast(new WasmGetLocal(objectLocal), arrayStruct.getNonNullReference()); var arrayData = new WasmStructGet(arrayStruct, array, ARRAY_DATA_FIELD_OFFSET); var result = new WasmArrayGet(arrayDataType, arrayData, new WasmGetLocal(indexLocal)); - arrayGetObjectFunction.getBody().add(new WasmReturn(result)); + arrayGetObjectFunction.getBody().add(result); } return arrayGetObjectFunction; } @@ -797,7 +808,7 @@ public class WasmGCClassGenerator implements WasmGCClassInfoProvider, WasmGCInit var method = new MethodReference(wrapperType, "valueOf", primitiveType, wrapperType); var wrapFunction = functionProvider.forStaticMethod(method); var castResult = new WasmCall(wrapFunction, result); - function.getBody().add(new WasmReturn(castResult)); + function.getBody().add(castResult); return function; } @@ -842,7 +853,7 @@ public class WasmGCClassGenerator implements WasmGCClassInfoProvider, WasmGCInit call.getArguments().add(new WasmGetLocal(params[i])); wrapperFunction.add(params[i]); } - wrapperFunction.getBody().add(new WasmReturn(call)); + wrapperFunction.getBody().add(call); function = wrapperFunction; } function.setReferenced(true); @@ -1441,7 +1452,7 @@ public class WasmGCClassGenerator implements WasmGCClassInfoProvider, WasmGCInit var block = new WasmBlock(false); block.setType(enumArrayStruct.getReference()); util.allocateArrayWithElements(ValueType.parse(Enum.class), () -> fields, null, null, block.getBody()); - function.getBody().add(new WasmReturn(block)); + function.getBody().add(block); tempVars.release(local); return function; diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassInfo.java b/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassInfo.java index f2a4b396e..c71ed8b98 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassInfo.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassInfo.java @@ -32,7 +32,7 @@ public class WasmGCClassInfo { WasmGlobal pointer; WasmGlobal initializerPointer; Consumer> initializer; - WasmFunction newArrayFunction; + List newArrayFunctions; WasmFunction initArrayFunction; WasmFunction supertypeFunction; diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassInfoProvider.java b/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassInfoProvider.java index 0c6becf3c..c3b4257e1 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassInfoProvider.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCClassInfoProvider.java @@ -35,7 +35,7 @@ public interface WasmGCClassInfoProvider { WasmGlobal getStaticFieldLocation(FieldReference fieldRef); - WasmFunction getArrayConstructor(ValueType.Array type); + WasmFunction getArrayConstructor(ValueType type, int depth); int getVirtualMethodsOffset(); diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCNewArrayFunctionGenerator.java b/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCNewArrayFunctionGenerator.java index c89931de6..d779f38d4 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCNewArrayFunctionGenerator.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCNewArrayFunctionGenerator.java @@ -15,19 +15,33 @@ */ package org.teavm.backend.wasm.generate.gc.classes; +import java.util.Arrays; import java.util.List; import java.util.Queue; import org.teavm.backend.wasm.WasmFunctionTypes; import org.teavm.backend.wasm.generate.TemporaryVariablePool; import org.teavm.backend.wasm.generate.gc.WasmGCNameProvider; import org.teavm.backend.wasm.generate.gc.methods.WasmGCGenerationUtil; +import org.teavm.backend.wasm.model.WasmArray; import org.teavm.backend.wasm.model.WasmFunction; import org.teavm.backend.wasm.model.WasmFunctionType; import org.teavm.backend.wasm.model.WasmLocal; import org.teavm.backend.wasm.model.WasmModule; import org.teavm.backend.wasm.model.WasmType; +import org.teavm.backend.wasm.model.expression.WasmArraySet; +import org.teavm.backend.wasm.model.expression.WasmBlock; +import org.teavm.backend.wasm.model.expression.WasmBranch; +import org.teavm.backend.wasm.model.expression.WasmCall; +import org.teavm.backend.wasm.model.expression.WasmExpression; import org.teavm.backend.wasm.model.expression.WasmGetLocal; -import org.teavm.backend.wasm.model.expression.WasmReturn; +import org.teavm.backend.wasm.model.expression.WasmInt32Constant; +import org.teavm.backend.wasm.model.expression.WasmIntBinary; +import org.teavm.backend.wasm.model.expression.WasmIntBinaryOperation; +import org.teavm.backend.wasm.model.expression.WasmIntType; +import org.teavm.backend.wasm.model.expression.WasmIntUnary; +import org.teavm.backend.wasm.model.expression.WasmIntUnaryOperation; +import org.teavm.backend.wasm.model.expression.WasmSetLocal; +import org.teavm.backend.wasm.model.expression.WasmStructGet; import org.teavm.model.ValueType; class WasmGCNewArrayFunctionGenerator { @@ -66,7 +80,75 @@ class WasmGCNewArrayFunctionGenerator { var targetVar = new WasmLocal(classInfo.getType(), "result"); function.add(targetVar); genUtil.allocateArray(itemType, () -> new WasmGetLocal(sizeLocal), null, targetVar, function.getBody()); - function.getBody().add(new WasmReturn(new WasmGetLocal(targetVar))); + function.getBody().add(new WasmGetLocal(targetVar)); + }); + return function; + } + + WasmFunction generateNewMultiArrayFunction(ValueType itemType, int depth) { + var arrayType = itemType; + for (var i = 0; i < depth; ++i) { + arrayType = ValueType.arrayOf(arrayType); + } + var classInfo = classInfoProvider.getClassInfo(arrayType); + + var parameterTypes = new WasmType[depth]; + Arrays.fill(parameterTypes, WasmType.INT32); + var functionType = functionTypes.of(classInfo.getType(), parameterTypes); + + var function = new WasmFunction(functionType); + function.setName(names.topLevel(names.suggestForType(arrayType) + "@new:" + depth)); + module.functions.add(function); + + var finalArrayType = arrayType; + queue.add(() -> { + var dimensionLocals = new WasmLocal[depth]; + for (var i = 0; i < depth; ++i) { + var dimensionLocal = new WasmLocal(WasmType.INT32, "dim" + i); + dimensionLocals[i] = dimensionLocal; + function.add(dimensionLocal); + } + var indexLocal = new WasmLocal(WasmType.INT32, "index"); + function.add(indexLocal); + + var dataField = classInfo.getStructure().getFields().get(WasmGCClassInfoProvider.ARRAY_DATA_FIELD_OFFSET); + var dataFieldTypeRef = (WasmType.CompositeReference) dataField.getUnpackedType(); + var dataArray = (WasmArray) dataFieldTypeRef.composite; + var dataLocal = new WasmLocal(dataArray.getReference(), "data"); + function.add(dataLocal); + + var resultVar = new WasmLocal(classInfo.getType(), "result"); + function.add(resultVar); + + var arrayItemType = ((ValueType.Array) finalArrayType).getItemType(); + var allocFunction = classInfoProvider.getArrayConstructor(arrayItemType, 1); + function.getBody().add(new WasmSetLocal(resultVar, new WasmCall(allocFunction, + new WasmGetLocal(dimensionLocals[0])))); + function.getBody().add(new WasmSetLocal(dataLocal, new WasmStructGet(classInfo.getStructure(), + new WasmGetLocal(resultVar), WasmGCClassInfoProvider.ARRAY_DATA_FIELD_OFFSET))); + + var zeroGuard = new WasmBlock(false); + function.getBody().add(zeroGuard); + zeroGuard.getBody().add(new WasmBranch(new WasmIntUnary(WasmIntType.INT32, WasmIntUnaryOperation.EQZ, + new WasmGetLocal(dimensionLocals[0])), zeroGuard)); + + var loop = new WasmBlock(true); + zeroGuard.getBody().add(loop); + var itemFunction = classInfoProvider.getArrayConstructor(itemType, depth - 1); + var args = new WasmExpression[depth - 1]; + for (var i = 0; i < args.length; ++i) { + args[i] = new WasmGetLocal(dimensionLocals[i + 1]); + } + loop.getBody().add(new WasmArraySet(dataArray, new WasmGetLocal(dataLocal), new WasmGetLocal(indexLocal), + new WasmCall(itemFunction, args))); + var incrementIndex = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.ADD, + new WasmGetLocal(indexLocal), new WasmInt32Constant(1)); + loop.getBody().add(new WasmSetLocal(indexLocal, incrementIndex)); + var continueCondition = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.LT_UNSIGNED, + new WasmGetLocal(indexLocal), new WasmGetLocal(dimensionLocals[0])); + loop.getBody().add(new WasmBranch(continueCondition, loop)); + + function.getBody().add(new WasmGetLocal(resultVar)); }); return function; } diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCSupertypeFunctionGenerator.java b/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCSupertypeFunctionGenerator.java index bf73a591f..316368a32 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCSupertypeFunctionGenerator.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/gc/classes/WasmGCSupertypeFunctionGenerator.java @@ -92,7 +92,7 @@ public class WasmGCSupertypeFunctionGenerator implements WasmGCSupertypeFunction } else { var expected = classGenerator.getClassInfo(type).pointer; var condition = new WasmReferencesEqual(new WasmGetLocal(subtypeVar), new WasmGetGlobal(expected)); - function.getBody().add(new WasmReturn(condition)); + function.getBody().add(condition); } return function; @@ -102,7 +102,7 @@ public class WasmGCSupertypeFunctionGenerator implements WasmGCSupertypeFunction var body = function.getBody(); var ranges = tagRegistry.getRanges(className); if (ranges.isEmpty()) { - body.add(new WasmReturn(new WasmInt32Constant(0))); + body.add(new WasmInt32Constant(0)); return; } @@ -147,7 +147,7 @@ public class WasmGCSupertypeFunctionGenerator implements WasmGCSupertypeFunction testLower.getThenBlock().getBody().add(testUpper); } - body.add(new WasmReturn(new WasmInt32Constant(1))); + body.add(new WasmInt32Constant(1)); } private void generateIsArray(WasmLocal subtypeVar, ValueType itemType, List body) { @@ -164,7 +164,7 @@ public class WasmGCSupertypeFunctionGenerator implements WasmGCSupertypeFunction delegateToItem.getArguments().add(new WasmGetLocal(subtypeVar)); itemTest.getElseBlock().getBody().add(delegateToItem); - body.add(new WasmReturn(itemTest)); + body.add(itemTest); } public WasmFunctionType getFunctionType() { diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/gc/methods/WasmGCGenerationVisitor.java b/core/src/main/java/org/teavm/backend/wasm/generate/gc/methods/WasmGCGenerationVisitor.java index d55660aa2..822391c0b 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/gc/methods/WasmGCGenerationVisitor.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/gc/methods/WasmGCGenerationVisitor.java @@ -395,7 +395,7 @@ public class WasmGCGenerationVisitor extends BaseWasmGenerationVisitor { @Override public void visit(NewArrayExpr expr) { accept(expr.getLength(), WasmType.INT32); - var function = context.classInfoProvider().getArrayConstructor(ValueType.arrayOf(expr.getType())); + var function = context.classInfoProvider().getArrayConstructor(expr.getType(), 1); var call = new WasmCall(function, result); call.setLocation(expr.getLocation()); result = call; @@ -408,9 +408,17 @@ public class WasmGCGenerationVisitor extends BaseWasmGenerationVisitor { } @Override - protected WasmExpression allocateMultiArray(List target, ValueType itemType, + protected WasmExpression allocateMultiArray(List target, ValueType arrayType, Supplier> dimensions, TextLocation location) { - return null; + var dimensionsValue = dimensions.get(); + var itemType = arrayType; + for (var i = 0; i < dimensionsValue.size(); ++i) { + itemType = ((ValueType.Array) itemType).getItemType(); + } + var function = context.classInfoProvider().getArrayConstructor(itemType, dimensionsValue.size()); + var call = new WasmCall(function, dimensionsValue.toArray(new WasmExpression[0])); + call.setLocation(location); + return call; } @Override diff --git a/core/src/main/java/org/teavm/backend/wasm/generate/gc/methods/WasmGCMethodGenerator.java b/core/src/main/java/org/teavm/backend/wasm/generate/gc/methods/WasmGCMethodGenerator.java index bd5e38d19..fcbc4680a 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generate/gc/methods/WasmGCMethodGenerator.java +++ b/core/src/main/java/org/teavm/backend/wasm/generate/gc/methods/WasmGCMethodGenerator.java @@ -45,7 +45,6 @@ import org.teavm.backend.wasm.model.WasmModule; import org.teavm.backend.wasm.model.WasmTag; import org.teavm.backend.wasm.model.WasmType; import org.teavm.backend.wasm.model.expression.WasmFunctionReference; -import org.teavm.backend.wasm.model.expression.WasmReturn; import org.teavm.backend.wasm.model.expression.WasmSetGlobal; import org.teavm.diagnostics.Diagnostics; import org.teavm.interop.Import; @@ -342,7 +341,6 @@ public class WasmGCMethodGenerator implements BaseWasmFunctionRepository { public WasmFunction getDummyInitializer() { if (dummyInitializer == null) { dummyInitializer = new WasmFunction(functionTypes.of(null)); - dummyInitializer.getBody().add(new WasmReturn()); dummyInitializer.setName(names.topLevel("teavm@dummyInitializer")); dummyInitializer.setReferenced(true); module.functions.add(dummyInitializer); diff --git a/core/src/main/java/org/teavm/backend/wasm/generators/gc/ArrayGenerator.java b/core/src/main/java/org/teavm/backend/wasm/generators/gc/ArrayGenerator.java index b7f14d73d..80245eedf 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generators/gc/ArrayGenerator.java +++ b/core/src/main/java/org/teavm/backend/wasm/generators/gc/ArrayGenerator.java @@ -20,7 +20,6 @@ import org.teavm.backend.wasm.model.WasmLocal; import org.teavm.backend.wasm.model.WasmType; import org.teavm.backend.wasm.model.expression.WasmCallReference; import org.teavm.backend.wasm.model.expression.WasmGetLocal; -import org.teavm.backend.wasm.model.expression.WasmReturn; import org.teavm.backend.wasm.model.expression.WasmStructGet; import org.teavm.model.MethodReference; @@ -40,6 +39,6 @@ public class ArrayGenerator implements WasmGCCustomGenerator { ); var result = new WasmCallReference(constructorRef, functionType); result.getArguments().add(new WasmGetLocal(sizeLocal)); - function.getBody().add(new WasmReturn(result)); + function.getBody().add(result); } } diff --git a/core/src/main/java/org/teavm/backend/wasm/generators/gc/ClassGenerators.java b/core/src/main/java/org/teavm/backend/wasm/generators/gc/ClassGenerators.java index f5ffd0bd2..f146411a2 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generators/gc/ClassGenerators.java +++ b/core/src/main/java/org/teavm/backend/wasm/generators/gc/ClassGenerators.java @@ -23,7 +23,6 @@ import org.teavm.backend.wasm.model.expression.WasmCallReference; import org.teavm.backend.wasm.model.expression.WasmConditional; import org.teavm.backend.wasm.model.expression.WasmGetLocal; import org.teavm.backend.wasm.model.expression.WasmIsNull; -import org.teavm.backend.wasm.model.expression.WasmReturn; import org.teavm.backend.wasm.model.expression.WasmStructGet; import org.teavm.backend.wasm.model.expression.WasmThrow; import org.teavm.backend.wasm.runtime.WasmGCSupport; @@ -62,6 +61,6 @@ public class ClassGenerators implements WasmGCCustomGenerator { context.functionTypes().of(WasmType.INT32, classCls.getType())); call.getArguments().add(new WasmGetLocal(otherClassVar)); - function.getBody().add(new WasmReturn(call)); + function.getBody().add(call); } } diff --git a/core/src/main/java/org/teavm/backend/wasm/generators/gc/WasmGCStringPoolGenerator.java b/core/src/main/java/org/teavm/backend/wasm/generators/gc/WasmGCStringPoolGenerator.java index a18c37051..9c0307fe3 100644 --- a/core/src/main/java/org/teavm/backend/wasm/generators/gc/WasmGCStringPoolGenerator.java +++ b/core/src/main/java/org/teavm/backend/wasm/generators/gc/WasmGCStringPoolGenerator.java @@ -27,7 +27,6 @@ import org.teavm.backend.wasm.model.expression.WasmIntBinary; import org.teavm.backend.wasm.model.expression.WasmIntBinaryOperation; import org.teavm.backend.wasm.model.expression.WasmIntType; import org.teavm.backend.wasm.model.expression.WasmLoadInt32; -import org.teavm.backend.wasm.model.expression.WasmReturn; import org.teavm.backend.wasm.model.expression.WasmSetGlobal; import org.teavm.backend.wasm.model.expression.WasmSetLocal; import org.teavm.model.MethodReference; @@ -48,6 +47,6 @@ public class WasmGCStringPoolGenerator implements WasmGCCustomGenerator { var increment = new WasmIntBinary(WasmIntType.INT32, WasmIntBinaryOperation.ADD, new WasmGetGlobal(pointer), new WasmInt32Constant(1)); function.getBody().add(new WasmSetGlobal(pointer, increment)); - function.getBody().add(new WasmReturn(new WasmGetLocal(resultLocal))); + function.getBody().add(new WasmGetLocal(resultLocal)); } } diff --git a/core/src/main/java/org/teavm/model/analysis/BaseTypeInference.java b/core/src/main/java/org/teavm/model/analysis/BaseTypeInference.java index 4aed8c685..d3205c423 100644 --- a/core/src/main/java/org/teavm/model/analysis/BaseTypeInference.java +++ b/core/src/main/java/org/teavm/model/analysis/BaseTypeInference.java @@ -358,9 +358,6 @@ public abstract class BaseTypeInference { @Override public void visit(ConstructMultiArrayInstruction insn) { var type = insn.getItemType(); - for (var i = 0; i < insn.getDimensions().size(); ++i) { - type = ValueType.arrayOf(type); - } type(insn.getReceiver(), type); }