Browse Source

properly free tokens

master
wes 9 years ago
parent
commit
81e7051d60
  1. 30
      tokenize.cpp
  2. 4
      tokenize.h

30
tokenize.cpp

@ -117,6 +117,12 @@ pop_token(token_stream *tokens) {
CHECK(tokens); CHECK(tokens);
len = tokens->length; len = tokens->length;
tok_t ttype = tokens->tokens[len].token_type;
if ((ttype != QUOTE) &&
(ttype != WSPACE) &&
(ttype != EMPTY)) {
free_token(tokens->tokens[len], ttype);
}
assert(len != 0); assert(len != 0);
len--; len--;
@ -423,11 +429,27 @@ tokenize(source_t source,
} }
int int
free_token( void *key, free_token(token_t val,
void *val) { tok_t ttype) {
/* silence warnings about unused parameters, key and val point to the same data*/ /* silence warnings about unused parameters, key and val point to the same data*/
(void)key; switch (ttype) {
free((char *)val); case SYMBOL:
free((void *)val.token.symbol);
break;
case IDENTIFIER:
free((void *)val.token.identifier);
break;
case INTEGER:
free((void *)val.token.integer);
break;
case FLOATING:
free((void *)val.token.floating);
break;
case QUOTE:
free((void *)val.token.string);
break;
default: return true;
}
return true; return true;
} }

4
tokenize.h

@ -68,7 +68,7 @@ match_symbol(source_t, uint32_t, const uint32_t);
#endif #endif
int int
free_token(const void *, free_token(token_t,
const void *); tok_t);
token_t token_t
testfunc(void); testfunc(void);