Class SwitchExpressionWriter

java.lang.Object
org.codehaus.groovy.classgen.asm.SwitchExpressionWriter
Direct Known Subclasses:
StaticTypesSwitchExpressionWriter

public class SwitchExpressionWriter extends Object
Emits JVM bytecode for a SwitchExpression. Completing arms leave the result on the operand stack and jump to a shared join point — the same shape javac uses for JEP 361 switch expressions.

This writer implements sequential isCase matching so Class, regex, Collection and Closure cases keep working. Tableswitch / lookupswitch specializations live on the static-compilation subclass.

Since:
6.0.0
  • Field Details

    • controller

      protected final WriterController controller
      The controller coordinating all bytecode writers for the current class.
  • Constructor Details

    • SwitchExpressionWriter

      public SwitchExpressionWriter(WriterController controller)
      Creates a switch-expression writer with the given controller.
      Parameters:
      controller - the writer controller
  • Method Details

    • writeSwitchExpression

      public void writeSwitchExpression(SwitchExpression expression)
      Generates bytecode for a switch expression. The result is left on the operand stack with the expression's resolved type.
      Parameters:
      expression - the switch expression to compile
    • writeYield

      public void writeYield(YieldStatement statement)
      Generates bytecode for a yield statement: evaluate the operand, cast it to the enclosing switch-expression result type, apply intervening finally blocks, and jump to the expression join point.
      Parameters:
      statement - the yield statement to compile
    • prepareSelectorType

      protected ClassNode prepareSelectorType(OperandStack operandStack)
      Returns the type to store the selector under. Dynamic compilation boxes so the subsequent isCase tests see a reference.
    • writeOptimizedSwitch

      protected boolean writeOptimizedSwitch(SwitchExpression expression, int selectorIndex, ClassNode selectorType)
      Attempts a specialized dispatch (tableswitch / lookupswitch). The base writer has none; static compilation overrides this.
      Returns:
      true if specialized bytecode was emitted
    • writeIsCaseComparison

      protected void writeIsCaseComparison(CaseStatement caseStatement, int selectorIndex, ClassNode selectorType)
    • writeDefaultOrThrow

      protected void writeDefaultOrThrow(SwitchExpression expression, int selectorIndex, ClassNode selectorType, boolean completeEnum)
      Emits the default arm, or an unmatched-selector throw.
      Parameters:
      completeEnum - true when a complete enum switch should throw IncompatibleClassChangeError instead of IllegalStateException
    • throwUnmatchedSelector

      protected void throwUnmatchedSelector(int selectorIndex, ClassNode selectorType)
      Throws IllegalStateException naming the unmatched selector.
    • throwIncompatibleClassChangeError

      protected void throwIncompatibleClassChangeError()
      Throws IncompatibleClassChangeError for an enum constant added after an exhaustive switch expression was compiled.
    • resolveResultType

      protected ClassNode resolveResultType(SwitchExpression expression)
      Resolves the type left on the operand stack at the switch-expression join.
    • isIntegralType

      protected static boolean isIntegralType(ClassNode type)
    • isIntegralWrapper

      protected static boolean isIntegralWrapper(ClassNode type)
    • intConstant

      protected static Integer intConstant(Expression expression)
    • stringConstant

      protected static String stringConstant(Expression expression)
    • unwrapEnumType

      protected static ClassNode unwrapEnumType(ClassNode type)
    • enumConstantCount

      protected static int enumConstantCount(ClassNode enumType)
    • enumConstantName

      protected static String enumConstantName(Expression expression, ClassNode enumType)