static obj expanded_state( obj deq, UINT_32 expand_bytes ) { obj state, len = dequeue_count(deq); UINT_32 i, j, end, lim; obj result; result = alloc( expand_bytes + FXWORDS_TO_RIBYTES(len), vector_class ); state = DEQ_STATE(deq); j = 0; i = FXWORDS_TO_RIBYTES(DEQ_FRONT(deq)); end = FXWORDS_TO_RIBYTES(DEQ_BACK(deq)); lim = SIZEOF_PTR(state); while (i != end) { gvec_write_init( result, j, gvec_ref( state, i ) ); j += SLOT(1); i += SLOT(1); if (i >= lim) i = 0; } while (expand_bytes > 0) { gvec_write_init_non_ptr( result, j, FALSE_OBJ ); j += SLOT(1); expand_bytes -= SLOT(1); } return result; }
static obj copy_table_dir( obj src_vec ) { obj dst_vec, bucket; UINT_32 mask, j, n; n = SIZEOF_PTR(src_vec); dst_vec = alloc( n, vector_class ); for (j=0; j<n; j+=SLOT(1)) { bucket = gvec_read( src_vec, j ); if (!EQ(bucket,FALSE_OBJ)) { int n = fx2int( gvec_read( bucket, BUCKET_BITS ) ); mask = (~(SLOT(1)-1)) << n; if (j & mask) /* its a duplicate (shared) bucket, because * an upper bit (relative to the # bits it represents) * of its index is non-zero */ bucket = gvec_read( dst_vec, (j & ~mask) ); else /* its upper bits are zero, so it is the first occurrence * of the chain. hence, copy the chain, too */ bucket = copy_bucket_chain( bucket ); gvec_write_init_ptr( dst_vec, j, bucket ); } else gvec_write_init_non_ptr( dst_vec, j, FALSE_OBJ ); } return dst_vec; }
obj get_c_units( void ) { obj v; unsigned i, j; struct module_descr *m; v = alloc( SLOT(num_units), vector_class ); j = 0; for (i=0; i<UNIT_HASHDIR_SIZE; i++) { for (m=unit_hashdir[i]; m; m=m->next) { gvec_write_init_non_ptr( v, SLOT(j), RAW_PTR_TO_OBJ(m) ); j++; } } return v; }