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)
            + "}";
      }
   }
}