             PR("const size_t _xact_work_count = " + c.variable_length_field.count + ";").
             PR("if (_xact_cursor * _xact_work_increment >= _xact_work_count)").
             IN().
-            PR("return (_xact_cursor == 0);").
+            PR("return false;").
             OUT().
             PR("size_t _xact_work = _xact_work_increment;").
+            PR("bool _xact_more = true;").
             PR("if ((_xact_cursor + 1) * _xact_work_increment >= _xact_work_count)").
+            PR("{").
             IN().
             PR("_xact_work = _xact_work_count - (_xact_cursor * _xact_work_increment);").
-            OUT();
+            PR("_xact_more = false;").
+            OUT().
+            PR("}");
         emitChunk(c.out, c.variable_length_field, "(_xact_cursor * _xact_work_increment)", "_xact_work");
-        c.out.PR("return true;");
+        c.out.PR("return _xact_more;");
     }
 
     function emitArrayUnchunked(c) {

                        }).
                    PR(c.out.get()).
                    PR("}").
                    NL().
                    PR("void " + c.cls + "::gcTrace(MMgc::GC* gc)").
                    PR("{").
                    IN().
                    PR("gcTraceSmallAsLarge(gc);").
                    OUT().
                    PR("}").
                    NL();
            }
            else {
                output.
                    PR("void " + c.cls + "::gcTrace(MMgc::GC* gc)").
                    PR("{").
                    IN().
                    PR("(void)gc;").
                    DO(function (output) {
                            if (output === builtins) {
                                output.

        // traced class has an exactly traced base class.

        if (c.base != null && !noUsefulTracer(c.base)) {
            c.out.PR(c.base + "::gcTrace(gc, 0);");
            if (interlockOutputFile != null)
                c.out.PR("(void)(" + cleanupNs(c.base) + "_isExactInterlock != 0);");
        }
