mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-15 10:44:47 +01:00
improve supported array opertions
This commit is contained in:
parent
9e4d83861c
commit
522f25c326
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user