Reuse the temp variable of a DUP operation for further DUP operations

This commit is contained in:
Volker Berlin 2020-03-29 21:33:30 +02:00
parent f95b21a1f8
commit d4f4d9b7c6

View File

@ -1,93 +0,0 @@
/*
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.module;
import java.io.IOException;
import javax.annotation.Nonnull;
import de.inetsoftware.jwebassembly.wasm.AnyType;
import de.inetsoftware.jwebassembly.wasm.VariableOperator;
/**
* WasmInstruction that emulate the Java dup instruction which duplicate the value on the stack.
*
* @author Volker Berlin
*
*/
class WasmDupInstruction extends WasmInstruction {
private int idx;
private AnyType type;
private LocaleVariableManager localVariables;
/**
* Create an instance of a dup instruction
*
* @param idx
* the memory/slot idx of the temp variable
* @param type
* the type of the duplicate value
* @param localVariables
* the manager for local variables
* @param javaCodePos
* the code position/offset in the Java method
* @param lineNumber
* the line number in the Java source code
*/
WasmDupInstruction( int idx, AnyType type, LocaleVariableManager localVariables, int javaCodePos, int lineNumber ) {
super( javaCodePos, lineNumber );
this.idx = idx;
this.type = type;
this.localVariables = localVariables;
}
/**
* {@inheritDoc}
*/
@Override
Type getType() {
return Type.Dup;
}
/**
* {@inheritDoc}
*/
public void writeTo( @Nonnull ModuleWriter writer ) throws IOException {
// save it in a temporary variable and load it 2 times;
int index = localVariables.get( idx, getCodePosition() );
writer.writeLocal( VariableOperator.tee, index );
writer.writeLocal( VariableOperator.get, index );
}
/**
* {@inheritDoc}
*/
AnyType getPushValueType() {
return type;
}
/**
* {@inheritDoc}
*/
@Override
int getPopCount() {
return 0;
}
}