- virts = thisp->prochead+M[ thisp->prochead ]+VIRTSC;
- storevirt(*old, virts); /* preserve for compactification */
- request(M[ t1 ], &t2, &t3); /* book field */
- fresh->addr = t2; /* ah */
- fresh->mark = M[ fresh->addr+1 ];
- t1 = M[ M[ virts ] ];
- for (t2 = 1; t2 < M[ t1 ]; t2++ )
- M[ t3+t2 ] = M[ t1+t2 ];
- if (notrecord)
- {
- storevirt(*fresh, t3+M[ t3 ]+DL); /* loop up DL */
- M[ t3+M[ t3 ]+STATSL ] = 0; /* not in any SL chain */
+ /* not none */
+ else {
+ /* am of old */
+ t1 = M[old->addr];
+ /* assume it is a record */
+ notrecord = FALSE;
+ t2 = M[t1 + PROTNUM];
+ /* if not array nor file */
+ if (t2 != AINT && t2 != AREAL && t2 != AVIRT &&
+ t2 != FILEOBJECT) {
+ ptr = prototype[t2];
+ /* our assumption was wrong */
+ if (ptr->kind != RECORD) {
+ notrecord = TRUE;
+ t3 = t1 + M[t1] + DL;
+ /* non-terminated object */
+ if (M[t3] != old->addr ||
+ M[t3 + 1] != old->mark) {
+ errsignal(RTEILLCP);
+ }
+ }
+ }
+ virts = thisp->prochead + M[thisp->prochead] + VIRTSC;
+ /* preserve for compactification */
+ storevirt(*old, virts);
+ /* book field */
+ request(M[ t1 ], &t2, &t3);
+ /* ah */
+ fresh->addr = t2;
+ fresh->mark = M[fresh->addr + 1];
+ t1 = M[M[virts]];
+ for (t2 = 1; t2 < M[t1]; t2++)
+ M[t3 + t2] = M[t1 + t2];
+
+ if (notrecord) {
+ /* loop up DL */
+ storevirt(*fresh, t3 + M[t3] + DL);
+ /* not in any SL chain */
+ M[t3 + M[t3] + STATSL] = 0;
+ }