@Override
  public Object evaluate(EvaluationContextImpl context) throws EvaluateException {
    Object switchValue = myExpressionEvaluator.evaluate(context);
    Object unboxedSwitchValue = switchValue != null ? UnBoxingEvaluator.unbox(switchValue, context) : null;
    Object res = null;
    try {
      boolean caseFound = false;
      int defaultLabelNum = -1;
      for (int i = 0; i < myBodyEvaluators.length; i++) {
        Evaluator evaluator = myBodyEvaluators[i];
        if (caseFound) {
          res = evaluator.evaluate(context);
        }
        else {
          Evaluator e = DisableGC.unwrap(evaluator);
          if (e instanceof SwitchCaseEvaluator caseEvaluator) {
            if (caseEvaluator.myDefaultCase) {
              defaultLabelNum = i;
              continue;
            }
            res = caseEvaluator.match(unboxedSwitchValue, context);
            if (Boolean.TRUE.equals(res)) {
              caseFound = true;
            }
            else if (res instanceof Value) {
              return res;
            }
          }
        }
      }
      if (!caseFound && defaultLabelNum != -1) {
        for (int i = defaultLabelNum; i < myBodyEvaluators.length; i++) {
          Evaluator evaluator = myBodyEvaluators[i];
          if (caseFound) {
            res = evaluator.evaluate(context);
          }
          else {
            caseFound = true;
            Evaluator e = DisableGC.unwrap(evaluator);
            if (e instanceof SwitchCaseEvaluator) {
              res = ((SwitchCaseEvaluator)e).match(unboxedSwitchValue, context);
              if (res instanceof Value) {
                return res;
              }
            }
          }
        }
      }
    }
    catch (YieldException e) {
      return e.getValue();
    }
    catch (BreakException e) {
      if (!Objects.equals(e.getLabelName(), myLabelName)) {
        throw e;
      }
    }
    return res;
  }
@Override
  public Object evaluate(EvaluationContextImpl context)