Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}