public static Cons walkFuncallTree(Cons tree, Object [] MV_returnarray) {
    if ((tree.value == Stella.SYM_STELLA_SYS_CALL_FUNCTION_CODE) ||
        (tree.value == Stella.SYM_STELLA_SYS_CALL_METHOD_CODE)) {
      { Cons _return_temp = tree;

        MV_returnarray[0] = ((StandardObject)(((Cons)(((Cons)(tree.rest.value)).value)).value));
        return (_return_temp);
      }
    }
    { StandardObject returntype = ((((StandardObject)(Stella.$TARGETTYPE$.get())) == Stella.SGT_STELLA_UNKNOWN) ? Stella.SGT_STELLA_VOID : ((StandardObject)(((StandardObject)(Stella.$TARGETTYPE$.get())))));
      Cons signature = Cons.cons(Cons.cons(returntype, Stella.NIL), Stella.NIL);

      { Stella_Object otree = null;
        StandardObject otype = null;

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

          otree = Stella_Object.walkExpressionTree(tree.rest.value, Stella.SGT_STELLA_CODE, Stella.SYM_STELLA_FUNCALL, true, caller_MV_returnarray);
          otype = ((StandardObject)(caller_MV_returnarray[0]));
        }
        tree.firstSetter(((otype == Stella.SGT_STELLA_METHOD_CODE) ? Stella.SYM_STELLA_SYS_CALL_METHOD_CODE : Stella.SYM_STELLA_SYS_CALL_FUNCTION_CODE));
        tree.secondSetter(otree);
      }
      { ConsIterator it = tree.rest.rest.allocateIterator();

        while (it.nextP()) {
          { Stella_Object argtree = null;
            StandardObject argtype = null;

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

              argtree = Stella_Object.walkATree(it.value, caller_MV_returnarray);
              argtype = ((StandardObject)(caller_MV_returnarray[0]));
            }
            it.valueSetter(argtree);
            signature = Cons.cons(argtype, signature);
          }
        }
      }
      tree.rest = Cons.cons(signature.reverse(), tree.rest);
      { Cons _return_temp = tree;

        MV_returnarray[0] = returntype;
        return (_return_temp);
      }
    }
  }