save symbol names in xhash
This commit is contained in:
		
							parent
							
								
									907a6a1207
								
							
						
					
					
						commit
						923a762411
					
				| 
						 | 
					@ -98,10 +98,10 @@ typedef struct {
 | 
				
			||||||
  pic_sym sADD, sSUB, sMUL, sDIV, sMINUS;
 | 
					  pic_sym sADD, sSUB, sMUL, sDIV, sMINUS;
 | 
				
			||||||
  pic_sym sEQ, sLT, sLE, sGT, sGE, sNOT;
 | 
					  pic_sym sEQ, sLT, sLE, sGT, sGE, sNOT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  xhash *sym_tbl;
 | 
					  xhash *syms;                  /* name to symbol */
 | 
				
			||||||
  const char **sym_pool;
 | 
					  xhash *sym_names;             /* symbol to name */
 | 
				
			||||||
  size_t slen, scapa;
 | 
					  int sym_cnt;
 | 
				
			||||||
  int uniq_sym_count;
 | 
					  int uniq_sym_cnt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  xhash *global_tbl;
 | 
					  xhash *global_tbl;
 | 
				
			||||||
  pic_value *globals;
 | 
					  pic_value *globals;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										19
									
								
								src/state.c
								
								
								
								
							
							
						
						
									
										19
									
								
								src/state.c
								
								
								
								
							| 
						 | 
					@ -52,11 +52,10 @@ pic_open(int argc, char *argv[], char **envp)
 | 
				
			||||||
  init_heap(pic->heap);
 | 
					  init_heap(pic->heap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* symbol table */
 | 
					  /* symbol table */
 | 
				
			||||||
  pic->sym_tbl = xh_new_str();
 | 
					  pic->syms = xh_new_str();
 | 
				
			||||||
  pic->sym_pool = (const char **)calloc(PIC_SYM_POOL_SIZE, sizeof(const char *));
 | 
					  pic->sym_names = xh_new_int();
 | 
				
			||||||
  pic->slen = 0;
 | 
					  pic->sym_cnt = 0;
 | 
				
			||||||
  pic->scapa = pic->slen + PIC_SYM_POOL_SIZE;
 | 
					  pic->uniq_sym_cnt = 0;
 | 
				
			||||||
  pic->uniq_sym_count = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* global variables */
 | 
					  /* global variables */
 | 
				
			||||||
  pic->global_tbl = xh_new_int();
 | 
					  pic->global_tbl = xh_new_int();
 | 
				
			||||||
| 
						 | 
					@ -129,7 +128,7 @@ pic_open(int argc, char *argv[], char **envp)
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
pic_close(pic_state *pic)
 | 
					pic_close(pic_state *pic)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  size_t i;
 | 
					  xh_iter it;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* free global stacks */
 | 
					  /* free global stacks */
 | 
				
			||||||
  free(pic->stbase);
 | 
					  free(pic->stbase);
 | 
				
			||||||
| 
						 | 
					@ -137,7 +136,7 @@ pic_close(pic_state *pic)
 | 
				
			||||||
  free(pic->rescue);
 | 
					  free(pic->rescue);
 | 
				
			||||||
  free(pic->globals);
 | 
					  free(pic->globals);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  xh_destroy(pic->sym_tbl);
 | 
					  xh_destroy(pic->syms);
 | 
				
			||||||
  xh_destroy(pic->global_tbl);
 | 
					  xh_destroy(pic->global_tbl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pic->glen = 0;
 | 
					  pic->glen = 0;
 | 
				
			||||||
| 
						 | 
					@ -157,10 +156,10 @@ pic_close(pic_state *pic)
 | 
				
			||||||
  free(pic->heap);
 | 
					  free(pic->heap);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* free symbol names */
 | 
					  /* free symbol names */
 | 
				
			||||||
  for (i = 0; i < pic->slen; ++i) {
 | 
					  for (xh_begin(pic->sym_names, &it); ! xh_isend(&it); xh_next(&it)) {
 | 
				
			||||||
    free((void *)pic->sym_pool[i]);
 | 
					    free((void *)it.e->val);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  free(pic->sym_pool);
 | 
					  free(pic->sym_names);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  PIC_BLK_DECREF(pic, pic->blk);
 | 
					  PIC_BLK_DECREF(pic, pic->blk);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										29
									
								
								src/symbol.c
								
								
								
								
							
							
						
						
									
										29
									
								
								src/symbol.c
								
								
								
								
							| 
						 | 
					@ -14,32 +14,23 @@ pic_intern_cstr(pic_state *pic, const char *str)
 | 
				
			||||||
  xh_entry *e;
 | 
					  xh_entry *e;
 | 
				
			||||||
  pic_sym id;
 | 
					  pic_sym id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  e = xh_get(pic->sym_tbl, str);
 | 
					  e = xh_get(pic->syms, str);
 | 
				
			||||||
  if (e) {
 | 
					  if (e) {
 | 
				
			||||||
    return e->val;
 | 
					    return e->val;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  str = pic_strdup(pic, str);
 | 
					  str = pic_strdup(pic, str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pic->slen >= pic->scapa) {
 | 
					  id = pic->sym_cnt++;
 | 
				
			||||||
 | 
					  xh_put(pic->syms, str, id);
 | 
				
			||||||
#if DEBUG
 | 
					  xh_put_int(pic->sym_names, id, (long)str);
 | 
				
			||||||
    puts("sym_pool realloced");
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    pic->scapa *= 2;
 | 
					 | 
				
			||||||
    pic->sym_pool = pic_realloc(pic, pic->sym_pool, sizeof(const char *) * pic->scapa);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  id = pic->slen++;
 | 
					 | 
				
			||||||
  pic->sym_pool[id] = str;
 | 
					 | 
				
			||||||
  xh_put(pic->sym_tbl, str, id);
 | 
					 | 
				
			||||||
  return id;
 | 
					  return id;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pic_sym
 | 
					pic_sym
 | 
				
			||||||
pic_gensym(pic_state *pic, pic_sym base)
 | 
					pic_gensym(pic_state *pic, pic_sym base)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int s = ++pic->uniq_sym_count;
 | 
					  int s = ++pic->uniq_sym_cnt;
 | 
				
			||||||
  char *str;
 | 
					  char *str;
 | 
				
			||||||
  pic_sym uniq;
 | 
					  pic_sym uniq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,12 +38,8 @@ pic_gensym(pic_state *pic, pic_sym base)
 | 
				
			||||||
  sprintf(str, "%s@%d", pic_symbol_name(pic, base), s);
 | 
					  sprintf(str, "%s@%d", pic_symbol_name(pic, base), s);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* don't put the symbol to pic->sym_tbl to keep it uninterned */
 | 
					  /* don't put the symbol to pic->sym_tbl to keep it uninterned */
 | 
				
			||||||
  if (pic->slen >= pic->scapa) {
 | 
					  uniq = pic->sym_cnt++;
 | 
				
			||||||
    pic->scapa *= 2;
 | 
					  xh_put_int(pic->sym_names, uniq, (long)str);
 | 
				
			||||||
    pic->sym_pool = pic_realloc(pic, pic->sym_pool, sizeof(const char *) * pic->scapa);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  uniq = pic->slen++;
 | 
					 | 
				
			||||||
  pic->sym_pool[uniq] = str;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return uniq;
 | 
					  return uniq;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -68,7 +55,7 @@ pic_interned_p(pic_state *pic, pic_sym sym)
 | 
				
			||||||
const char *
 | 
					const char *
 | 
				
			||||||
pic_symbol_name(pic_state *pic, pic_sym sym)
 | 
					pic_symbol_name(pic_state *pic, pic_sym sym)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  return pic->sym_pool[sym];
 | 
					  return (const char *)xh_get_int(pic->sym_names, sym)->val;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static pic_value
 | 
					static pic_value
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue