Instruction interface
Пакет: com.hypixel.hytale.server.npc.util.expression
Файл: com/hypixel/hytale/server/npc/util/expression/ExecutionContext.java
Методы (1)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
void |
executevoid execute(ExecutionContext var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.util.expression;
class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import java.util.Arrays;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.function.BooleanSupplier;
class="kw">import java.util.function.DoubleSupplier;
class="kw">import java.util.function.Supplier;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">public class ExecutionContext {
class="kw">public class="kw">static class="kw">final int STACK_GROW_INCREMENT = 8;
@Nullable
class="kw">protected Scope scope;
@Nullable
class="kw">protected Map<String, ? class="kw">extends ForwardedModifier> forwardedModifiers;
class="kw">protected ExecutionContext.Operand[] operandStack;
class="kw">protected int stackTop;
class="kw">protected ValueType lastPushedType;
class="kw">protected String combatConfig;
class="kw">protected Map<String, String> interactionVars;
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction UNARY_PLUS = var0 -> {};
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction UNARY_MINUS = var0 -> var0.push(-var0.popNumber());
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction LOGICAL_NOT = var0 -> var0.push(!var0.popBoolean());
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction BITWISE_NOT = var0 -> var0.push(~var0.popInt());
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction EXPONENTIATION = var0 -> var0.popPush(Math.pow(var0.getNumber(1), var0.getNumber(0)), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction REMAINDER = var0 -> var0.popPush(var0.getNumber(1) % var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction DIVIDE = var0 -> var0.popPush(var0.getNumber(1) / var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction MULTIPLY = var0 -> var0.popPush(var0.getNumber(1) * var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction MINUS = var0 -> var0.popPush(var0.getNumber(1) - var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction PLUS = var0 -> var0.popPush(var0.getNumber(1) + var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction GREATER_EQUAL = var0 -> var0.popPush(var0.getNumber(1) >= var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction GREATER = var0 -> var0.popPush(var0.getNumber(1) > var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction LESS_EQUAL = var0 -> var0.popPush(var0.getNumber(1) <= var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction LESS = var0 -> var0.popPush(var0.getNumber(1) < var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction NOT_EQUAL = var0 -> var0.popPush(var0.getNumber(1) != var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction EQUAL = var0 -> var0.popPush(var0.getNumber(1) == var0.getNumber(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction NOT_EQUAL_BOOL = var0 -> var0.popPush(var0.getBoolean(1) != var0.getBoolean(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction EQUAL_BOOL = var0 -> var0.popPush(var0.getBoolean(1) == var0.getBoolean(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction BITWISE_AND = var0 -> var0.popPush(var0.getInt(1) & var0.getInt(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction BITWISE_XOR = var0 -> var0.popPush(var0.getInt(1) ^ var0.getInt(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction BITWISE_OR = var0 -> var0.popPush(var0.getInt(1) | var0.getInt(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction LOGICAL_AND = var0 -> var0.popPush(var0.getBoolean(1) && var0.getBoolean(0), 2);
class="kw">public class="kw">static class="kw">final ExecutionContext.Instruction LOGICAL_OR = var0 -> var0.popPush(var0.getBoolean(1) || var0.getBoolean(0), 2);
class="kw">public ExecutionContext(@Nullable Scope var1) {
this.scope = var1;
this.stackTop = -1;
this.lastPushedType = ValueType.VOID;
this.operandStack = new ExecutionContext.Operand[8];
for (int var2 = 0; var2 < this.operandStack.length; var2++) {
this.operandStack[var2] = new ExecutionContext.Operand();
}
}
class="kw">public ExecutionContext() {
this(null);
}
class="kw">public ValueType execute(@Nonnull List<ExecutionContext.Instruction> var1, Scope var2) {
this.setScope(var2);
class="kw">return this.execute(var1);
}
class="kw">public ValueType execute(@Nonnull List<ExecutionContext.Instruction> var1) {
Objects.requireNonNull(this.scope, "Scope not initialised executing instructions");
Objects.requireNonNull(var1, "Instruction sequence is null executing instructions");
this.stackTop = -1;
this.lastPushedType = ValueType.VOID;
var1.forEach(var1x -> var1x.execute(this));
class="kw">return this.getType();
}
class="kw">public ValueType execute(@Nonnull ExecutionContext.Instruction[] var1, Scope var2) {
this.setScope(var2);
class="kw">return this.execute(var1);
}
class="kw">public ValueType execute(@Nonnull ExecutionContext.Instruction[] var1) {
Objects.requireNonNull(this.scope, "Scope not initialised executing instructions");
Objects.requireNonNull(var1, "Instruction sequence is null executing instructions");
try {
this.stackTop = -1;
this.lastPushedType = ValueType.VOID;
for (ExecutionContext.Instruction var5 : var1) {
var5.execute(this);
}
class="kw">return this.getType();
} catch (Throwable var6) {
throw new IllegalStateException("Failed to execute instruction sequence: ", var6);
}
}
class="kw">public ValueType getType() {
class="kw">return this.lastPushedType;
}
class="kw">public ExecutionContext.Operand top() {
class="kw">return this.get(0);
}
@Nullable
class="kw">public Scope setScope(@Nullable Scope var1) {
Scope var2 = this.scope;
this.scope = var1;
class="kw">return var2;
}
@Nullable
class="kw">public Scope getScope() {
class="kw">return this.scope;
}
@Nullable
class="kw">public Map<String, ? class="kw">extends ForwardedModifier> setForwardedModifiers(@Nullable Map<String, ? class="kw">extends ForwardedModifier> var1) {
Map var2 = this.forwardedModifiers;
this.forwardedModifiers = var1;
class="kw">return var2;
}
@Nullable
class="kw">public Map<String, ? class="kw">extends ForwardedModifier> getForwardedModifiers() {
class="kw">return this.forwardedModifiers;
}
class="kw">public boolean hasScope() {
class="kw">return this.scope != null;
}
class="kw">public String getCombatConfig() {
class="kw">return this.combatConfig;
}
class="kw">public void setCombatConfig(String var1) {
this.combatConfig = var1;
}
class="kw">public Map<String, String> getInteractionVars() {
class="kw">return this.interactionVars;
}
class="kw">public void setInteractionVars(Map<String, String> var1) {
this.interactionVars = var1;
}
class="kw">protected ExecutionContext.Operand push() {
this.stackTop++;
if (this.operandStack.length <= this.stackTop) {
int var1 = this.operandStack.length;
this.operandStack = Arrays.copyOf(this.operandStack, var1 + 8);
while (var1 < this.operandStack.length) {
this.operandStack[var1++] = new ExecutionContext.Operand();
}
}
class="kw">return this.operandStack[this.stackTop];
}
class="kw">public void push(String var1) {
this.lastPushedType = this.push().set(var1);
}
class="kw">public void push(double var1) {
this.lastPushedType = this.push().set(var1);
}
class="kw">public void push(int var1) {
this.lastPushedType = this.push().set(var1);
}
class="kw">public void push(boolean var1) {
this.lastPushedType = this.push().set(var1);
}
class="kw">public void push(String[] var1) {
this.lastPushedType = this.push().set(var1);
}
class="kw">public void push(double[] var1) {
this.lastPushedType = this.push().set(var1);
}
class="kw">public void push(boolean[] var1) {
this.lastPushedType = this.push().set(var1);
}
class="kw">public void pushEmptyArray() {
this.lastPushedType = this.push().setEmptyArray();
}
class="kw">protected ExecutionContext.Operand popPush(int var1) {
this.ensureCanPopCount("popPush", var1);
this.stackTop -= var1 - 1;
class="kw">return this.operandStack[this.stackTop];
}
class="kw">public void popPush(String var1, int var2) {
this.lastPushedType = this.popPush(var2).set(var1);
}
class="kw">public void popPush(double var1, int var3) {
this.lastPushedType = this.popPush(var3).set(var1);
}
class="kw">public void popPush(int var1, int var2) {
this.lastPushedType = this.popPush(var2).set(var1);
}
class="kw">public void popPush(boolean var1, int var2) {
this.lastPushedType = this.popPush(var2).set(var1);
}
class="kw">public void popPush(String[] var1, int var2) {
this.lastPushedType = this.popPush(var2).set(var1);
}
class="kw">public void popPush(double[] var1, int var2) {
this.lastPushedType = this.popPush(var2).set(var1);
}
class="kw">public void popPush(boolean[] var1, int var2) {
this.lastPushedType = this.popPush(var2).set(var1);
}
class="kw">public void popPushEmptyArray(int var1) {
this.lastPushedType = this.popPush(var1).setEmptyArray();
}
class="kw">protected ExecutionContext.Operand pop() {
this.ensureCanPop("pop");
this.lastPushedType = ValueType.VOID;
class="kw">return this.operandStack[this.stackTop--];
}
class="kw">public double popNumber() {
class="kw">return this.pop().number;
}
class="kw">public int popInt() {
class="kw">return (int)this.pop().number;
}
class="kw">public String popString() {
class="kw">return this.pop().string;
}
class="kw">public boolean popBoolean() {
class="kw">return this.pop().bool;
}
class="kw">public double[] popNumberArray() {
class="kw">return this.top().type != ValueType.EMPTY_ARRAY ? this.pop().numberArray : ArrayUtil.EMPTY_DOUBLE_ARRAY;
}
@Nullable
class="kw">public String[] popStringArray() {
class="kw">return this.top().type != ValueType.EMPTY_ARRAY ? this.pop().stringArray : ArrayUtil.EMPTY_STRING_ARRAY;
}
class="kw">public boolean[] popBooleanArray() {
class="kw">return this.top().type != ValueType.EMPTY_ARRAY ? this.pop().boolArray : ArrayUtil.EMPTY_BOOLEAN_ARRAY;
}
class="kw">public String popAsString() {
ExecutionContext.Operand var1 = this.pop();
class="kw">return class="kw">switch (var1.type) {
case VOID -> "null";
case STRING -> var1.string;
case NUMBER -> Double.toString(var1.number);
case BOOLEAN -> Boolean.toString(var1.bool);
case NUMBER_ARRAY -> Arrays.toString(var1.numberArray);
case STRING_ARRAY -> Arrays.toString(var1.stringArray);
case BOOLEAN_ARRAY -> Arrays.toString(var1.boolArray);
case EMPTY_ARRAY -> "[]";
};
}
class="kw">protected ExecutionContext.Operand get(int var1) {
this.ensureCanAccessRelativeIndex("get", var1);
class="kw">return this.operandStack[this.stackTop - var1];
}
class="kw">private void ensureCanPop(String var1) {
if (this.stackTop < 0) {
throw new IllegalStateException("Expression stack underflow in " + var1 + " (stackTop=" + this.stackTop + ")");
}
}
class="kw">private void ensureCanPopCount(String var1, int var2) {
if (var2 <= 0) {
throw new IllegalStateException("Expression stack pop count must be > 0 in " + var1 + " (popCount=" + var2 + ", stackTop=" + this.stackTop + ")");
}
if (this.stackTop - (var2 - 1) < 0) {
throw new IllegalStateException("Expression stack underflow in " + var1 + " (popCount=" + var2 + ", stackTop=" + this.stackTop + ")");
}
}
class="kw">private void ensureCanAccessRelativeIndex(String var1, int var2) {
if (var2 < 0) {
throw new IllegalStateException("Expression stack index must be >= 0 in " + var1 + " (index=" + var2 + ", stackTop=" + this.stackTop + ")");
}
if (this.stackTop - var2 < 0) {
throw new IllegalStateException("Expression stack underflow in " + var1 + " (index=" + var2 + ", stackTop=" + this.stackTop + ")");
}
}
class="kw">public double getNumber(int var1) {
class="kw">return this.get(var1).number;
}
class="kw">public int getInt(int var1) {
class="kw">return (int)this.get(var1).number;
}
class="kw">public String getString(int var1) {
class="kw">return this.get(var1).string;
}
class="kw">public boolean getBoolean(int var1) {
class="kw">return this.get(var1).bool;
}
class="kw">public double[] getNumberArray(int var1) {
class="kw">return this.get(var1).numberArray;
}
@Nullable
class="kw">public String[] getStringArray(int var1) {
class="kw">return this.get(var1).stringArray;
}
class="kw">public boolean[] getBooleanArray(int var1) {
class="kw">return this.get(var1).boolArray;
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genPUSH(String var0) {
class="kw">return var1 -> var1.push(var0);
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genPUSH(double var0) {
class="kw">return var2 -> var2.push(var0);
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genPUSH(boolean var0) {
class="kw">return var1 -> var1.push(var0);
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genPUSH(String[] var0) {
class="kw">return var1 -> var1.push(var0);
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genPUSH(double[] var0) {
class="kw">return var1 -> var1.push(var0);
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genPUSH(boolean[] var0) {
class="kw">return var1 -> var1.push(var0);
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genPUSHEmptyArray() {
class="kw">return ExecutionContext::pushEmptyArray;
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genREAD(String var0, @Nonnull ValueType var1, @Nullable Scope var2) {
if (var2 == null) {
class="kw">return class="kw">switch (var1) {
case STRING -> var1x -> var1x.push(var1x.scope.getString(var0));
case NUMBER -> var1x -> var1x.push(var1x.scope.getNumber(var0));
case BOOLEAN -> var1x -> var1x.push(var1x.scope.getBoolean(var0));
case NUMBER_ARRAY -> var1x -> var1x.push(var1x.scope.getNumberArray(var0));
case STRING_ARRAY -> var1x -> var1x.push(var1x.scope.getStringArray(var0));
case BOOLEAN_ARRAY -> var1x -> var1x.push(var1x.scope.getBooleanArray(var0));
class="kw">default -> throw new RuntimeException("ExecutionContext: Invalid read type");
};
} else {
class="kw">return class="kw">switch (var1) {
case STRING -> {
Supplier var8 = var2.getStringSupplier(var0);
yield var1x -> var1x.push(var8.get());
}
case NUMBER -> {
DoubleSupplier var7 = var2.getNumberSupplier(var0);
yield var1x -> var1x.push(var7.getAsDouble());
}
case BOOLEAN -> {
BooleanSupplier var6 = var2.getBooleanSupplier(var0);
yield var1x -> var1x.push(var6.getAsBoolean());
}
case NUMBER_ARRAY -> {
Supplier var5 = var2.getNumberArraySupplier(var0);
yield var1x -> var1x.push(var5.get());
}
case STRING_ARRAY -> {
Supplier var4 = var2.getStringArraySupplier(var0);
yield var1x -> var1x.push(var4.get());
}
case BOOLEAN_ARRAY -> {
Supplier var3 = var2.getBooleanArraySupplier(var0);
yield var1x -> var1x.push(var3.get());
}
class="kw">default -> throw new RuntimeException("ExecutionContext: Invalid read type");
};
}
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genCALL(String var0, int var1, @Nullable Scope var2) {
if (var2 == null) {
class="kw">return var2x -> var2x.scope.getFunction(var0).call(var2x, var1);
}
Scope.Function var3 = var2.getFunction(var0);
class="kw">return var2x -> var3.call(var2x, var1);
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genNumberPACK(int var0) {
class="kw">return var1 -> {
double[] var2 = new double[var0];
for (int var3 = 0; var3 < var0; var3++) {
var2[var3] = var1.getNumber(var0 - 1 - var3);
}
var1.popPush(var2, var0);
};
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genStringPACK(int var0) {
class="kw">return var1 -> {
String[] var2 = new String[var0];
for (int var3 = 0; var3 < var0; var3++) {
var2[var3] = var1.getString(var0 - 1 - var3);
}
var1.popPush(var2, var0);
};
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genBooleanPACK(int var0) {
class="kw">return var1 -> {
boolean[] var2 = new boolean[var0];
for (int var3 = 0; var3 < var0; var3++) {
var2[var3] = var1.getBoolean(var0 - 1 - var3);
}
var1.popPush(var2, var0);
};
}
@Nonnull
class="kw">public class="kw">static ExecutionContext.Instruction genPACK(@Nonnull ValueType var0, int var1) {
class="kw">return class="kw">switch (var0) {
case NUMBER_ARRAY -> genNumberPACK(var1);
case STRING_ARRAY -> genStringPACK(var1);
case BOOLEAN_ARRAY -> genBooleanPACK(var1);
class="kw">default -> throw new IllegalStateException("Cannot create PACK instruction for type " + var0);
};
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "ExecutionContext{scope="
+ this.scope
+ ", operandStack="
+ Arrays.toString(this.operandStack)
+ ", stackTop="
+ this.stackTop
+ ", lastPushedType="
+ this.lastPushedType
+ "}";
}
@FunctionalInterface
class="kw">public class="kw">interface Instruction {
void execute(ExecutionContext var1);
}
class="kw">public class="kw">static class Operand {
class="kw">public ValueType type;
class="kw">public String string;
class="kw">public double number;
class="kw">public boolean bool;
@Nullable
class="kw">public double[] numberArray;
@Nullable
class="kw">public String[] stringArray;
@Nullable
class="kw">public boolean[] boolArray;
class="kw">public Operand() {
}
class="kw">public ValueType set(String var1) {
this.reInit(ValueType.STRING);
this.string = var1;
class="kw">return this.type;
}
class="kw">public ValueType set(double var1) {
this.reInit(ValueType.NUMBER);
this.number = var1;
class="kw">return this.type;
}
class="kw">public ValueType set(boolean var1) {
this.reInit(ValueType.BOOLEAN);
this.bool = var1;
class="kw">return this.type;
}
class="kw">public ValueType set(String[] var1) {
this.reInit(ValueType.STRING_ARRAY);
this.stringArray = var1;
class="kw">return this.type;
}
class="kw">public ValueType set(double[] var1) {
this.reInit(ValueType.NUMBER_ARRAY);
this.numberArray = var1;
class="kw">return this.type;
}
class="kw">public ValueType set(boolean[] var1) {
this.reInit(ValueType.BOOLEAN_ARRAY);
this.boolArray = var1;
class="kw">return this.type;
}
class="kw">public ValueType setEmptyArray() {
this.reInit(ValueType.EMPTY_ARRAY);
class="kw">return this.type;
}
class="kw">private void reInit(ValueType var1) {
this.type = var1;
this.numberArray = null;
this.stringArray = null;
this.boolArray = null;
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return "Operand{type="
+ this.type
+ ", string='"
+ this.string
+ "', number="
+ this.number
+ ", bool="
+ this.bool
+ ", numberArray="
+ Arrays.toString(this.numberArray)
+ ", stringArray="
+ Arrays.toString(this.stringArray)
+ ", boolArray="
+ Arrays.toString(this.boolArray)
+ "}";
}
}
}