From 522f25c326bdf0c10bf244845b02abe19bc3b6bf Mon Sep 17 00:00:00 2001 From: Volker Berlin Date: Sun, 13 Jan 2019 14:42:24 +0100 Subject: [PATCH] improve supported array opertions --- .../module/JavaMethodWasmCodeBuilder.java | 65 ++++++++++---- .../jwebassembly/wasm/ValueType.java | 2 + .../jwebassembly/runtime/Arrays.java | 84 ++++++++++++++++++- 3 files changed, 132 insertions(+), 19 deletions(-) diff --git a/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java b/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java index 7b9d20e..a5ffe8b 100644 --- a/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java +++ b/src/de/inetsoftware/jwebassembly/module/JavaMethodWasmCodeBuilder.java @@ -28,6 +28,7 @@ import de.inetsoftware.classparser.ConstantRef; import de.inetsoftware.jwebassembly.WasmException; import de.inetsoftware.jwebassembly.wasm.ArrayOperator; import de.inetsoftware.jwebassembly.wasm.NumericOperator; +import de.inetsoftware.jwebassembly.wasm.StorageType; import de.inetsoftware.jwebassembly.wasm.StructOperator; import de.inetsoftware.jwebassembly.wasm.ValueType; import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator; @@ -175,13 +176,28 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder { case 46: // iaload addArrayInstruction( ArrayOperator.GET, ValueType.i32, codePos ); break; - //TODO case 47: // laload - //TODO case 48: // faload - //TODO case 49: // daload - //TODO case 50: // aaload - //TODO case 51: // baload - //TODO case 52: // caload - //TODO case 53: // saload + case 47: // laload + addArrayInstruction( ArrayOperator.GET, ValueType.i64, codePos ); + break; + case 48: // faload + addArrayInstruction( ArrayOperator.GET, ValueType.f32, codePos ); + break; + case 49: // daload + addArrayInstruction( ArrayOperator.GET, ValueType.f64, codePos ); + break; + case 50: // aaload + StorageType storeType = findPreviousPushInstructionPushValueType(); + addArrayInstruction( ArrayOperator.GET, storeType, codePos ); + break; + case 51: // baload + addArrayInstruction( ArrayOperator.GET, ValueType.i8, codePos ); + break; + case 52: // caload + addArrayInstruction( ArrayOperator.GET, ValueType.i16, codePos ); + break; + case 53: // saload + addArrayInstruction( ArrayOperator.GET, ValueType.i16, codePos ); + break; case 54: // istore addLoadStoreInstruction( ValueType.i32, false, byteCode.readUnsignedByte(), codePos ); break; @@ -230,13 +246,28 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder { case 79: // iastore addArrayInstruction( ArrayOperator.SET, ValueType.i32, codePos ); break; - //TODO case 80: // lastore - //TODO case 81: // fastore - //TODO case 82: // dastore - //TODO case 83: // aastore - //TODO case 84: // bastore - //TODO case 85: // castore - //TODO case 86: // sastore + case 80: // lastore + addArrayInstruction( ArrayOperator.SET, ValueType.i64, codePos ); + break; + case 81: // fastore + addArrayInstruction( ArrayOperator.SET, ValueType.f32, codePos ); + break; + case 82: // dastore + addArrayInstruction( ArrayOperator.SET, ValueType.f64, codePos ); + break; + case 83: // aastore + storeType = findPreviousPushInstructionPushValueType(); + addArrayInstruction( ArrayOperator.SET, storeType, codePos ); + break; + case 84: // bastore + addArrayInstruction( ArrayOperator.SET, ValueType.i8, codePos ); + break; + case 85: // castore + addArrayInstruction( ArrayOperator.SET, ValueType.i16, codePos ); + break; + case 86: // sastore + addArrayInstruction( ArrayOperator.SET, ValueType.i16, codePos ); + break; case 87: // pop case 88: // pop2 addBlockInstruction( WasmBlockOperator.DROP, null, codePos ); @@ -579,7 +610,11 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder { } addArrayInstruction( ArrayOperator.NEW, type, codePos ); break; - //TODO case 189: // anewarray + case 189: // anewarray + name = ((ConstantClass)constantPool.get( byteCode.readUnsignedShort() )).getName(); + type = ValueType.anyref; //TODO we need to use the right type from name + addArrayInstruction( ArrayOperator.NEW, type, codePos ); + break; case 190: // arraylength addArrayInstruction( ArrayOperator.LENGTH, ValueType.i32, codePos ); break; diff --git a/src/de/inetsoftware/jwebassembly/wasm/ValueType.java b/src/de/inetsoftware/jwebassembly/wasm/ValueType.java index 1b5a398..c8d7efc 100644 --- a/src/de/inetsoftware/jwebassembly/wasm/ValueType.java +++ b/src/de/inetsoftware/jwebassembly/wasm/ValueType.java @@ -23,6 +23,8 @@ public enum ValueType implements StorageType { i64(-0x02), f32(-0x03), f64(-0x04), + i8(-0x05), //TODO dummy value for https://github.com/WebAssembly/gc + i16(-0x06), //TODO dummy value for https://github.com/WebAssembly/gc anyfunc(-0x10), anyref(-0x11), except_ref(-0x18), // https://github.com/WebAssembly/exception-handling/blob/master/proposals/Exceptions.md diff --git a/test/de/inetsoftware/jwebassembly/runtime/Arrays.java b/test/de/inetsoftware/jwebassembly/runtime/Arrays.java index 5601306..13a4bf2 100644 --- a/test/de/inetsoftware/jwebassembly/runtime/Arrays.java +++ b/test/de/inetsoftware/jwebassembly/runtime/Arrays.java @@ -1,5 +1,5 @@ /* - * Copyright 2018 Volker Berlin (i-net software) + * Copyright 2018 - 2019 Volker Berlin (i-net software) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,6 @@ package de.inetsoftware.jwebassembly.runtime; import java.util.ArrayList; import java.util.Collection; -import org.junit.Assume; import org.junit.ClassRule; import org.junit.Ignore; import org.junit.Test; @@ -43,7 +42,14 @@ public class Arrays extends AbstractBaseTest { for( ScriptEngine[] val : ScriptEngine.testParams() ) { ScriptEngine script = val[0]; addParam( list, script, "length" ); - addParam( list, script, "loop" ); + addParam( list, script, "loopByte" ); + addParam( list, script, "loopShort" ); + addParam( list, script, "loopChar" ); + addParam( list, script, "loopInt" ); + addParam( list, script, "loopLong" ); + addParam( list, script, "loopFloat" ); + addParam( list, script, "loopDouble" ); + addParam( list, script, "loopObject" ); } return list; } @@ -62,7 +68,37 @@ public class Arrays extends AbstractBaseTest { } @Export - static int loop() { + static byte loopByte() { + byte[] data = {-1,2,3}; + byte sum = 0; + for( byte i : data ) { + sum += i; + } + return sum; + } + + @Export + static short loopShort() { + short[] data = {-1,-2,-3}; + short sum = 0; + for( short i : data ) { + sum += i; + } + return sum; + } + + @Export + static char loopChar() { + char[] data = {1,2,0x8000}; + char sum = 0; + for( char i : data ) { + sum += i; + } + return sum; + } + + @Export + static int loopInt() { int[] data = {1,2,3}; int sum = 0; for( int i : data ) { @@ -70,5 +106,45 @@ public class Arrays extends AbstractBaseTest { } return sum; } + + @Export + static int loopLong() { + long[] data = {1,2,3}; + long sum = 0; + for( long i : data ) { + sum += i; + } + return (int)sum; + } + + @Export + static float loopFloat() { + float[] data = {1,2,3}; + float sum = 0; + for( float i : data ) { + sum += i; + } + return sum; + } + + @Export + static double loopDouble() { + double[] data = {1,2,3}; + double sum = 0; + for( double i : data ) { + sum += i; + } + return sum; + } + + @Export + static int loopObject() { + Object[] data = {null,null,null}; + int sum = 0; + for( Object obj : data ) { + sum++; + } + return sum; + } } }