Changeset 2945

Show
Ignore:
Timestamp:
12/09/07 20:22:48 (13 months ago)
Author:
mokehehe
Message:

未使用のセルをリストにして、そこから取り出すように。
(ガベコレ組込み準備)

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lang/c/misc/mlisp/src/mlisp.cpp

    r2383 r2945  
    142142 
    143143private: 
     144        void collect_garbage(); 
     145 
    144146        SExp read_string(FILE* fp); 
    145147        SExp read_list(FILE* fp); 
     
    166168 
    167169        Cell g_cell_buf[MAX_CELL]; 
    168         int g_cell_free_p; 
     170        SExp g_free_cell; 
     171        int free_cell_num; 
    169172 
    170173        Symbol g_symbol_buf[MAX_SYMBOL]; 
     
    244247        memset(flags, 0x00, sizeof(flags)); 
    245248 
    246         g_cell_free_p = 0; 
    247249        g_symbol_free_p = 0; 
    248250        g_stack_p = 0; 
    249251        g_builtin_p = 0; 
     252 
     253                // �Z������‚Ȃ��āA�t���[�Z���Ƃ���        for (int i=0; i<MAX_CELL-1; ++i) { 
     254                Cell* p = &g_cell_buf[i]; 
     255                p->cdr = MAKE_SEXP(tCell, i+1); 
     256        } 
     257        Cell* p = &g_cell_buf[MAX_CELL-1]; 
     258        p->cdr = cNil; 
     259        g_free_cell = MAKE_SEXP(tCell, 0); 
     260        free_cell_num = MAX_CELL; 
    250261} 
    251262 
     
    261272void MLContext::dump() 
    262273{ 
    263         printf("#cell:%d\n", g_cell_free_p); 
    264274        printf("#symbol:%d\n", g_symbol_free_p); 
    265275        for (int i=0; i<g_symbol_free_p; ++i) { 
     
    267277        } 
    268278        printf("\n"); 
     279        printf("#free cell:%d\n", free_cell_num); 
    269280} 
    270281 
     
    287298} 
    288299 
     300void MLContext::collect_garbage() 
     301{ 
     302        assert(!"not implemented"); 
     303} 
     304 
    289305SExp MLContext::cons(SExp a, SExp d) 
    290306{ 
    291         assert(g_cell_free_p < MAX_CELL); 
    292         int idx = g_cell_free_p++; 
     307        if (g_free_cell == cNil) { 
     308                collect_garbage(); 
     309        } 
     310        SExp res = g_free_cell; 
     311        assert(SEXP_TYPE(res) == tCell); 
     312        assert(free_cell_num > 0); 
     313        g_free_cell = cdr(res); 
     314        --free_cell_num; 
     315 
     316        int idx = SEXP_UVAL(res); 
    293317 
    294318        Cell* p = &g_cell_buf[idx];