Пример #1
0
NOINLINE static void js_gc_mark()
{
    uint32_t stack_dummy;
    intptr_t** ptrptr = (intptr_t**)stack_top;
    alloc_t* alloc;
    global_t* g;
    while((intptr_t)ptrptr > (intptr_t)&stack_dummy) {
        if(((intptr_t)*ptrptr & 3) == 0) {
            intptr_t p = (intptr_t)*ptrptr;
            if(sizeof(intptr_t) == 8) {
                p &= 0x7ffffffffffful;
            }
            alloc = allocs_lookup((intptr_t*)p);
            if(alloc) {
                js_gc_mark_allocation(alloc);
            }
        }
        ptrptr--;
    }
    for(g = globals; g; g = g->next) {
        uint32_t i;
        for(i = 0; i < g->size; i++) {
            alloc = allocs_lookup(g->ptr[i]);
            if(alloc) {
                js_gc_mark_allocation(alloc);
            }
        }
    }
}
Пример #2
0
Файл: gc.c Проект: filp/jsos
static void js_gc_mark()
{
    uint32_t stack_dummy;
    intptr_t** ptrptr = (intptr_t**)stack_top;
    alloc_t* alloc;
    global_t* g;
    while((intptr_t)ptrptr > (intptr_t)&stack_dummy) {
        alloc = allocs_lookup(*ptrptr);
        if(alloc) {
            js_gc_mark_allocation(alloc);
        }
        ptrptr--;
    }
    for(g = globals; g; g = g->next) {
        uint32_t i;
        for(i = 0; i < g->size; i++) {
            alloc = allocs_lookup(g->ptr[i]);
            if(alloc) {
                js_gc_mark_allocation(alloc);
            }
        }
    }
}
Пример #3
0
Файл: gc.c Проект: filp/jsos
static void js_gc_mark_allocation(alloc_t* alloc)
{
    intptr_t** ptrptr = alloc->ptr;
    alloc_t* suballoc;
    if(alloc->flag == current_mark_flag) {
        return;
    }
    alloc->flag = current_mark_flag;
    if(alloc->no_pointer) {
        return;
    }
    while((intptr_t)ptrptr < (intptr_t)((intptr_t)alloc->ptr + alloc->size)) {
        suballoc = allocs_lookup(*ptrptr);
        if(suballoc) {
            js_gc_mark_allocation(suballoc);
        }
        ptrptr++;
    }
}