*/ void Init_Words(REBFLG only) /* ** Only flags BIND_Table creation only (for threads). ** ***********************************************************************/ { REBCNT n = Get_Hash_Prime(WORD_TABLE_SIZE * 4); // extra to reduce rehashing if (!only) { // Create the hash for locating words quickly: // Note that the TAIL is never changed for this series. PG_Word_Table.hashes = Make_Series(n+1, sizeof(REBCNT), FALSE); KEEP_SERIES(PG_Word_Table.hashes, "word hashes"); // pointer array Clear_Series(PG_Word_Table.hashes); PG_Word_Table.hashes->tail = n; // The word (symbol) table itself: PG_Word_Table.series = Make_Block(WORD_TABLE_SIZE); SET_NONE(BLK_HEAD(PG_Word_Table.series)); // Put a NONE at head. KEEP_SERIES(PG_Word_Table.series, "word table"); // words are never GC'd BARE_SERIES(PG_Word_Table.series); // don't bother to GC scan it PG_Word_Table.series->tail = 1; // prevent the zero case // A normal char array to hold symbol names: PG_Word_Names = Make_Binary(6 * WORD_TABLE_SIZE); // average word size KEEP_SERIES(PG_Word_Names, "word names"); } // The bind table. Used to cache context indexes for given symbols. Bind_Table = Make_Series(SERIES_REST(PG_Word_Table.series), 4, FALSE); KEEP_SERIES(Bind_Table, "bind table"); // numeric table CLEAR_SERIES(Bind_Table); Bind_Table->tail = PG_Word_Table.series->tail; }
*/ void Enable_Backtrace(REBFLG on) /* ***********************************************************************/ { if (on) { if (Trace_Limit == 0) { Trace_Limit = 100000; Trace_Buffer = Make_Binary(Trace_Limit); KEEP_SERIES(Trace_Buffer, "trace-buffer"); // !!! use better way } } else { if (Trace_Limit) Free_Series(Trace_Buffer); Trace_Limit = 0; Trace_Buffer = 0; } }