public static Stella_Object walkMvExpressionTree(Stella_Object tree, List targettypes, Symbol operator, Object [] MV_returnarray) {
    { Object old$Targettype$000 = Stella.$TARGETTYPE$.get();

      try {
        Native.setSpecial(Stella.$TARGETTYPE$, ((targettypes.length() == 1) ? ((StandardObject)(((StandardObject)(targettypes.first())))) : Stella.SGT_STELLA_UNKNOWN));
        { Stella_Object otree = null;
          Cons valuestree = null;
          List sourcetypes = null;

          { Object [] caller_MV_returnarray = new Object[2];

            otree = Stella_Object.walkMvTree(tree, caller_MV_returnarray);
            valuestree = ((Cons)(caller_MV_returnarray[0]));
            sourcetypes = ((List)(caller_MV_returnarray[1]));
          }
          if (!(sourcetypes.length() == targettypes.length())) {
            if ((sourcetypes.length() == 1) &&
                (Stella.SGT_STELLA_UNKNOWN == ((StandardObject)(sourcetypes.first())))) {
              Stella_Object.warnAboutUnknownSourceType(otree);
            }
            else {
              { Object old$PrintreadablyP$000 = Stella.$PRINTREADABLYp$.get();

                try {
                  Native.setBooleanSpecial(Stella.$PRINTREADABLYp$, true);
                  Stella.signalTranslationError();
                  if (!(Stella.suppressWarningsP())) {
                    Stella.printErrorContext(">> ERROR: ", Stella.STANDARD_ERROR);
                    {
                      Stella.STANDARD_ERROR.nativeStream.println();
                      Stella.STANDARD_ERROR.nativeStream.println(" `" + Stella_Object.deUglifyParseTree(operator) + "' operator expected `" + targettypes.length() + "' value(s) from `" + Stella_Object.deUglifyParseTree(tree) + "'.");
                    }
;
                  }

                } finally {
                  Stella.$PRINTREADABLYp$.set(old$PrintreadablyP$000);
                }
              }
            }
            { Stella_Object _return_temp = otree;

              MV_returnarray[0] = valuestree;
              MV_returnarray[1] = targettypes.copy();
              return (_return_temp);
            }
          }
          if (sourcetypes.emptyP()) {
            { Stella_Object _return_temp = otree;

              MV_returnarray[0] = valuestree;
              MV_returnarray[1] = sourcetypes;
              return (_return_temp);
            }
          }
          if (valuestree != null) {
            { Object [] caller_MV_returnarray = new Object[2];

              tree = Stella_Object.coerceMvTree(valuestree, operator, sourcetypes, targettypes, caller_MV_returnarray);
              valuestree = ((Cons)(caller_MV_returnarray[0]));
              targettypes = ((List)(caller_MV_returnarray[1]));
            }
          }
          else {
            { Object [] caller_MV_returnarray = new Object[2];

              otree = Stella_Object.coerceMvTree(otree, operator, sourcetypes, targettypes, caller_MV_returnarray);
              valuestree = ((Cons)(caller_MV_returnarray[0]));
              targettypes = ((List)(caller_MV_returnarray[1]));
            }
          }
          sourcetypes.free();
          { Stella_Object _return_temp = otree;

            MV_returnarray[0] = valuestree;
            MV_returnarray[1] = targettypes;
            return (_return_temp);
          }
        }

      } finally {
        Stella.$TARGETTYPE$.set(old$Targettype$000);
      }
    }
  }