mirror of
https://github.com/i-net-software/JWebAssembly.git
synced 2025-03-25 07:27:52 +01:00
get_local --> local.get, set_local --> local.set, see #3
This commit is contained in:
parent
de320797a6
commit
f5ed8aeeb6
@ -40,6 +40,7 @@ import de.inetsoftware.jwebassembly.wasm.NumericOperator;
|
|||||||
import de.inetsoftware.jwebassembly.wasm.AnyType;
|
import de.inetsoftware.jwebassembly.wasm.AnyType;
|
||||||
import de.inetsoftware.jwebassembly.wasm.StructOperator;
|
import de.inetsoftware.jwebassembly.wasm.StructOperator;
|
||||||
import de.inetsoftware.jwebassembly.wasm.ValueType;
|
import de.inetsoftware.jwebassembly.wasm.ValueType;
|
||||||
|
import de.inetsoftware.jwebassembly.wasm.VariableOperator;
|
||||||
import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator;
|
import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -350,17 +351,19 @@ public class BinaryModuleWriter extends ModuleWriter implements InstructionOpcod
|
|||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void writeLoad( int idx ) throws IOException {
|
protected void writeLocal( VariableOperator op, int idx ) throws IOException {
|
||||||
codeStream.writeOpCode( GET_LOCAL );
|
int code;
|
||||||
codeStream.writeVaruint32( idx );
|
switch( op ) {
|
||||||
}
|
case get:
|
||||||
|
code = LOCAL_GET;
|
||||||
/**
|
break;
|
||||||
* {@inheritDoc}
|
case set:
|
||||||
*/
|
code = LOCAL_SET;
|
||||||
@Override
|
break;
|
||||||
protected void writeStore( int idx ) throws IOException {
|
default:
|
||||||
codeStream.writeOpCode( SET_LOCAL );
|
code = LOCAL_TEE;
|
||||||
|
}
|
||||||
|
codeStream.writeOpCode( code );
|
||||||
codeStream.writeVaruint32( idx );
|
codeStream.writeVaruint32( idx );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2017 - 2018 Volker Berlin (i-net software)
|
* Copyright 2017 - 2019 Volker Berlin (i-net software)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -90,11 +90,11 @@ interface InstructionOpcodes {
|
|||||||
|
|
||||||
// === Variable access ===========
|
// === Variable access ===========
|
||||||
|
|
||||||
static final int GET_LOCAL = 0x20;
|
static final int LOCAL_GET = 0x20;
|
||||||
|
|
||||||
static final int SET_LOCAL = 0x21;
|
static final int LOCAL_SET = 0x21;
|
||||||
|
|
||||||
static final int TEE_LOCAL = 0x22;
|
static final int LOCAL_TEE = 0x22;
|
||||||
|
|
||||||
static final int GET_GLOBAL = 0x23;
|
static final int GET_GLOBAL = 0x23;
|
||||||
|
|
||||||
|
@ -276,7 +276,7 @@ class JavaMethodWasmCodeBuilder extends WasmCodeBuilder {
|
|||||||
case 89: // dup: duplicate the value on top of the stack
|
case 89: // dup: duplicate the value on top of the stack
|
||||||
case 92: // dup2
|
case 92: // dup2
|
||||||
storeType = findPreviousPushInstructionPushValueType();
|
storeType = findPreviousPushInstructionPushValueType();
|
||||||
addCallInstruction( new SyntheticFunctionName( "dup" + storeType, "get_local 0 get_local 0 return", storeType, null, storeType, storeType ), codePos );
|
addCallInstruction( new SyntheticFunctionName( "dup" + storeType, "local.get 0 local.get 0 return", storeType, null, storeType, storeType ), codePos );
|
||||||
break;
|
break;
|
||||||
case 90: // dup_x1
|
case 90: // dup_x1
|
||||||
case 91: // dup_x2
|
case 91: // dup_x2
|
||||||
|
@ -29,6 +29,7 @@ import de.inetsoftware.jwebassembly.wasm.NumericOperator;
|
|||||||
import de.inetsoftware.jwebassembly.wasm.AnyType;
|
import de.inetsoftware.jwebassembly.wasm.AnyType;
|
||||||
import de.inetsoftware.jwebassembly.wasm.StructOperator;
|
import de.inetsoftware.jwebassembly.wasm.StructOperator;
|
||||||
import de.inetsoftware.jwebassembly.wasm.ValueType;
|
import de.inetsoftware.jwebassembly.wasm.ValueType;
|
||||||
|
import de.inetsoftware.jwebassembly.wasm.VariableOperator;
|
||||||
import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator;
|
import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -138,24 +139,16 @@ public abstract class ModuleWriter implements Closeable {
|
|||||||
protected abstract void writeConst( Number value, ValueType valueType ) throws IOException;
|
protected abstract void writeConst( Number value, ValueType valueType ) throws IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a variable load.
|
* Write a local variable operation.
|
||||||
*
|
*
|
||||||
|
* @param op
|
||||||
|
* the operation
|
||||||
* @param idx
|
* @param idx
|
||||||
* the index of the parameter variable
|
* the index of the parameter variable
|
||||||
* @throws IOException
|
* @throws IOException
|
||||||
* if any I/O error occur
|
* if any I/O error occur
|
||||||
*/
|
*/
|
||||||
protected abstract void writeLoad( int idx ) throws IOException;
|
protected abstract void writeLocal( VariableOperator op, int idx ) throws IOException;
|
||||||
|
|
||||||
/**
|
|
||||||
* Write a variable store.
|
|
||||||
*
|
|
||||||
* @param idx
|
|
||||||
* the index of the parameter variable
|
|
||||||
* @throws IOException
|
|
||||||
* if any I/O error occur
|
|
||||||
*/
|
|
||||||
protected abstract void writeStore( int idx ) throws IOException;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Write a set_global variable
|
* Write a set_global variable
|
||||||
|
@ -21,8 +21,10 @@ import java.io.IOException;
|
|||||||
import javax.annotation.Nonnegative;
|
import javax.annotation.Nonnegative;
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
|
||||||
import de.inetsoftware.jwebassembly.module.WasmInstruction.Type;
|
|
||||||
import de.inetsoftware.jwebassembly.wasm.AnyType;
|
import de.inetsoftware.jwebassembly.wasm.AnyType;
|
||||||
|
import de.inetsoftware.jwebassembly.wasm.VariableOperator;
|
||||||
|
|
||||||
|
import static de.inetsoftware.jwebassembly.wasm.VariableOperator.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WasmInstruction for load and store local variables.
|
* WasmInstruction for load and store local variables.
|
||||||
@ -32,7 +34,7 @@ import de.inetsoftware.jwebassembly.wasm.AnyType;
|
|||||||
*/
|
*/
|
||||||
class WasmLocalInstruction extends WasmInstruction {
|
class WasmLocalInstruction extends WasmInstruction {
|
||||||
|
|
||||||
private boolean load;
|
private VariableOperator op;
|
||||||
|
|
||||||
private int idx;
|
private int idx;
|
||||||
|
|
||||||
@ -48,7 +50,7 @@ class WasmLocalInstruction extends WasmInstruction {
|
|||||||
*/
|
*/
|
||||||
WasmLocalInstruction( boolean load, @Nonnegative int idx, int javaCodePos ) {
|
WasmLocalInstruction( boolean load, @Nonnegative int idx, int javaCodePos ) {
|
||||||
super( javaCodePos );
|
super( javaCodePos );
|
||||||
this.load = load;
|
this.op = load ? get : set;
|
||||||
this.idx = idx;
|
this.idx = idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,11 +77,7 @@ class WasmLocalInstruction extends WasmInstruction {
|
|||||||
*/
|
*/
|
||||||
public void writeTo( @Nonnull ModuleWriter writer ) throws IOException {
|
public void writeTo( @Nonnull ModuleWriter writer ) throws IOException {
|
||||||
int index = getIndex();
|
int index = getIndex();
|
||||||
if( load ) {
|
writer.writeLocal( op, index );
|
||||||
writer.writeLoad( index );
|
|
||||||
} else {
|
|
||||||
writer.writeStore( index );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -94,6 +92,6 @@ class WasmLocalInstruction extends WasmInstruction {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
int getPopCount() {
|
int getPopCount() {
|
||||||
return load ? 0 : 1;
|
return op == get ? 0 : 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,7 @@ import de.inetsoftware.jwebassembly.wasm.NumericOperator;
|
|||||||
import de.inetsoftware.jwebassembly.wasm.AnyType;
|
import de.inetsoftware.jwebassembly.wasm.AnyType;
|
||||||
import de.inetsoftware.jwebassembly.wasm.StructOperator;
|
import de.inetsoftware.jwebassembly.wasm.StructOperator;
|
||||||
import de.inetsoftware.jwebassembly.wasm.ValueType;
|
import de.inetsoftware.jwebassembly.wasm.ValueType;
|
||||||
|
import de.inetsoftware.jwebassembly.wasm.VariableOperator;
|
||||||
import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator;
|
import de.inetsoftware.jwebassembly.wasm.WasmBlockOperator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -194,18 +195,9 @@ public class TextModuleWriter extends ModuleWriter {
|
|||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
protected void writeLoad( int idx ) throws IOException {
|
protected void writeLocal( VariableOperator op, int idx ) throws IOException {
|
||||||
newline( methodOutput );
|
newline( methodOutput );
|
||||||
methodOutput.append( "get_local " ).append( Integer.toString( idx ) );
|
methodOutput.append( "local." ).append( op ).append( ' ' ).append( Integer.toString( idx ) );
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* {@inheritDoc}
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
protected void writeStore( int idx ) throws IOException {
|
|
||||||
newline( methodOutput );
|
|
||||||
methodOutput.append( "set_local " ).append( Integer.toString( idx ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
28
src/de/inetsoftware/jwebassembly/wasm/VariableOperator.java
Normal file
28
src/de/inetsoftware/jwebassembly/wasm/VariableOperator.java
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*
|
||||||
|
Copyright 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.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|
||||||
|
*/
|
||||||
|
package de.inetsoftware.jwebassembly.wasm;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Operation on Variables.
|
||||||
|
*
|
||||||
|
* @author Volker Berlin
|
||||||
|
*/
|
||||||
|
public enum VariableOperator {
|
||||||
|
get,
|
||||||
|
set,
|
||||||
|
tee,
|
||||||
|
}
|
@ -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");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@ -55,10 +55,10 @@ public class WatParser extends WasmCodeBuilder {
|
|||||||
int javaCodePos = i;
|
int javaCodePos = i;
|
||||||
String tok = tokens.get( i );
|
String tok = tokens.get( i );
|
||||||
switch( tok ) {
|
switch( tok ) {
|
||||||
case "get_local":
|
case "local.get":
|
||||||
addLocalInstruction( true, getInt( tokens, ++i), javaCodePos );
|
addLocalInstruction( true, getInt( tokens, ++i), javaCodePos );
|
||||||
break;
|
break;
|
||||||
case "set_local":
|
case "local.set":
|
||||||
addLocalInstruction( false, getInt( tokens, ++i), javaCodePos );
|
addLocalInstruction( false, getInt( tokens, ++i), javaCodePos );
|
||||||
break;
|
break;
|
||||||
// case "get_global":
|
// case "get_global":
|
||||||
|
@ -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");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -88,13 +88,13 @@ public class WatParserTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void getLocal() throws IOException {
|
public void Local_get() throws IOException {
|
||||||
test( "get_local 1" );
|
test( "local.get 1" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void setLocal() throws IOException {
|
public void Local_set() throws IOException {
|
||||||
test( "set_local 2" );
|
test( "local.set 2" );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2017 - 2018 Volker Berlin (i-net software)
|
* Copyright 2017 - 2019 Volker Berlin (i-net software)
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@ -82,8 +82,8 @@ public class CallFunctions extends AbstractBaseTest {
|
|||||||
return nativeMax( 4.5F,5.5F);
|
return nativeMax( 4.5F,5.5F);
|
||||||
}
|
}
|
||||||
|
|
||||||
@WasmTextCode( "get_local 0 " //
|
@WasmTextCode( "local.get 0 " //
|
||||||
+ "get_local 1 " //
|
+ "local.get 1 " //
|
||||||
+ "f32.max " //
|
+ "f32.max " //
|
||||||
+ "return" )
|
+ "return" )
|
||||||
private static float nativeMax( float a, float b) {
|
private static float nativeMax( float a, float b) {
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
(module
|
(module
|
||||||
(export "abc" (func $de/inetsoftware/jwebassembly/samples/FunctionParameters.singleInt))
|
(export "abc" (func $de/inetsoftware/jwebassembly/samples/FunctionParameters.singleInt))
|
||||||
(func $de/inetsoftware/jwebassembly/samples/FunctionParameters.singleInt (param i32) (local i32)
|
(func $de/inetsoftware/jwebassembly/samples/FunctionParameters.singleInt (param i32) (local i32)
|
||||||
get_local 0
|
local.get 0
|
||||||
i32.const 1
|
i32.const 1
|
||||||
i32.add
|
i32.add
|
||||||
set_local 1
|
local.set 1
|
||||||
return
|
return
|
||||||
)
|
)
|
||||||
)
|
)
|
Loading…
x
Reference in New Issue
Block a user