示例#1
0
文件: fasl.c 项目: mschaef/vcsh
static void fasl_ensure_valid_table_index(lref_t reader, size_t index)
{
    if (NULLP(FASL_READER_STREAM(reader)->table))
    {
        FASL_READER_STREAM(reader)->table =
            vectorcons((index >=
                        DEFAULT_FASL_TABLE_SIZE) ? index +
                       DEFAULT_FASL_TABLE_SIZE : DEFAULT_FASL_TABLE_SIZE, NIL);
    }
    else
    {
        lref_t fasl_table = FASL_READER_STREAM(reader)->table;
        assert(VECTORP(fasl_table));
        size_t old_len = fasl_table->as.vector.dim;

        if (index >= old_len)
        {
            size_t new_len =
                (index >= old_len * 2) ? index + DEFAULT_FASL_TABLE_SIZE : (old_len * 2);

            FASL_READER_STREAM(reader)->table =
                vector_resize(fasl_table, new_len > SIZE_MAX ? SIZE_MAX : (size_t) new_len, NIL);
        }
    }

    assert(VECTORP(FASL_READER_STREAM(reader)->table));
    assert(index < (FASL_READER_STREAM(reader)->table)->as.vector.dim);
}
示例#2
0
文件: fasl.c 项目: mschaef/vcsh
static void fast_read_structure(lref_t reader, lref_t * st)
{
    lref_t st_meta;
    fast_read(reader, &st_meta, false);

    if (!CONSP(st_meta))
        vmerror_fast_read("Expected list for structure metadata", reader, st_meta);

    lref_t st_length;
    fast_read(reader, &st_length, false);

    if (!FIXNUMP(st_length))
        vmerror_fast_read("Expected fixnum for structure length", reader, st_length);

    *st = lstructurecons(vectorcons(FIXNM(st_length), NIL), st_meta);

    for (fixnum_t ii = 0; ii < FIXNM(st_length); ii++)
    {
        lref_t object;
        fast_read(reader, &object, false);

        if (EOFP(object))
            vmerror_fast_read("incomplete structure definition", reader, *st);

        SET_STRUCTURE_ELEM(*st, ii, object);
    }
}
示例#3
0
lref_t lifoplog_snapshot()
{
     lref_t result = vectorcons(FOPLOG_SIZE, fixcons(-1));

     for(int ii = 0; ii < FOPLOG_SIZE; ii++)
          SET_VECTOR_ELEM(result, ii, CURRENT_TIB()->foplog[ii]);

     return result;
}
示例#4
0
lref_t lstress_c_heap(lref_t c, lref_t s)
{
     if (!FIXNUMP(c))
          vmerror_wrong_type_n(1, c);

     if (!FIXNUMP(s))
          vmerror_wrong_type_n(2, s);

     fixnum_t count = FIXNM(c);
     fixnum_t size = FIXNM(s);

     for (fixnum_t i = 0; i < count; i++)
          vectorcons(size, NIL);

     return NIL;
}
示例#5
0
文件: fasl.c 项目: mschaef/vcsh
static void fast_read_vector(lref_t reader, lref_t * vec)
{
    lref_t vec_length;
    fast_read(reader, &vec_length, false);

    if (!FIXNUMP(vec_length))
        vmerror_fast_read("Expected fixnum for vector length", reader, vec_length);

    *vec = vectorcons(FIXNM(vec_length), NIL);

    for (fixnum_t ii = 0; ii < FIXNM(vec_length); ii++)
    {
        lref_t object;
        fast_read(reader, &object, false);

        if (EOFP(object))
            vmerror_fast_read("incomplete vector definition", reader, *vec);

        (*vec)->as.vector.data[ii] = object;
    }
}
示例#6
0
lref_t lheap_cell_count_by_typecode()
{
     lref_t obj, org, end;
     enum typecode_t type;
     lref_t result = NIL;

     size_t internal_type_counts[LAST_INTERNAL_TYPEC + 1];

     for (size_t ii = 0; ii < LAST_INTERNAL_TYPEC + 1; ii++)
          internal_type_counts[ii] = 0;

     /* Traverse the heaps, counting each type */
     for (size_t heap_no = 0; heap_no < interp.gc_max_heap_segments; heap_no++)
     {
          if (interp.gc_heap_segments[heap_no] == NULL)
               continue;

          org = interp.gc_heap_segments[heap_no];
          end = org + interp.gc_heap_segment_size;

          for (obj = org; obj < end; ++obj)
          {
               type = TYPE(obj);

               internal_type_counts[type]++;
          }
     }

     /* Build the result list */
     result = vectorcons(LAST_INTERNAL_TYPEC + 1, NIL);

     for (size_t ii = 0; ii <= LAST_INTERNAL_TYPEC; ii++)
          result->as.vector.data[ii] = fixcons(internal_type_counts[ii]);

     return result;
}