Operand class

Пакет: com.hypixel.hytale.server.npc.util.expression

Файл: com/hypixel/hytale/server/npc/util/expression/ExecutionContext.java

Поля (7)

МодификаторыТипИмя
public boolean bool
public boolean[] boolArray
public double number
public double[] numberArray
public String string
public String[] stringArray
public ValueType type

Методы (9)

МодификаторыВозвратСигнатура
private void reInitprivate void reInit(ValueType var1)
public ValueType setpublic ValueType set(String var1)
public ValueType setpublic ValueType set(double var1)
public ValueType setpublic ValueType set(boolean var1)
public ValueType setpublic ValueType set(String[] var1)
public ValueType setpublic ValueType set(double[] var1)
public ValueType setpublic ValueType set(boolean[] var1)
public ValueType setEmptyArraypublic ValueType setEmptyArray()
public String toStringpublic String toString()

Исходный код

Показать/скрыть
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)
            + "}";
      }
   }
}