try {
while (true) {
IRubyObject tmp;
while (i < ary.realLength) {
IRubyObject elt = ary.values[ary.begin + i++];
tmp = elt.checkArrayType();
if (tmp.isNil() || (level >= 0 && stack.realLength / 2 >= level)) {
result.append(elt);
} else {
modified = true;
if (memo.get(tmp) != null) throw runtime.newArgumentError("tried to flatten recursive array");