improve supported array opertions

This commit is contained in:
Volker Berlin 2019-01-13 14:42:24 +01:00
parent 9e4d83861c
commit 522f25c326
3 changed files with 132 additions and 19 deletions

View File

@ -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;

View File

@ -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

View File

@ -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;
}
}
}