+ UNGCPRO;
+ break;
+
+ case 3:
+ GCPROn(vals, len);
+
+ for (size_t i = 0;
+ /* traverse to the last 3-divisible index */
+ i+3 <= nseq; i += 3) {
+ Lisp_Object args[4] = {
+ fun, seqelts[i], seqelts[i+1],
+ seqelts[i+2]};
+ vals[len++] = Ffuncall(countof(args), args);
+ if (UNLIKELY(deco.sep != Qnull_pointer)) {
+ vals[len++] = deco.sep;
+ }
+ }
+ if (UNLIKELY(deco.sep != Qnull_pointer)) {
+ /* strike the last separator */
+ len--;
+ }
+
+ UNGCPRO;
+ break;
+
+ default:
+ GCPROn(vals, len);
+
+ for (size_t i = 0;
+ /* traverse to the last 3-divisible index */
+ i+arity <= nseq; i += arity) {
+ Lisp_Object args[arity+1];
+
+ args[0] = fun;
+ args[1] = seqelts[i];
+ args[2] = seqelts[i+1];
+ args[3] = seqelts[i+2];
+ args[4] = seqelts[i+3];
+ for (size_t j = 4; j < arity; j++) {
+ args[j+1] = seqelts[i+j];
+ }
+ vals[len++] = Ffuncall(countof(args), args);
+ if (UNLIKELY(deco.sep != Qnull_pointer)) {
+ /* add separator */
+ vals[len++] = deco.sep;
+ }
+ }
+ if (UNLIKELY(deco.sep != Qnull_pointer)) {
+ /* kick the last one */
+ len--;
+ }
+
+ UNGCPRO;
+ break;
+ }