use volatile string

This commit is contained in:
Yuichi Nishiwaki 2014-03-01 00:19:57 +09:00
parent 0b8c7a8ccb
commit a51dc51a09
2 changed files with 14 additions and 12 deletions

View File

@ -89,12 +89,12 @@ yy_abbrev(struct parser_control *p, pic_sym sym, pic_value datum)
} }
pic_value pic_value
yy_str_new_cstr(struct parser_control *p, const char *cstr) yy_str_new(struct parser_control *p, const char *buf, size_t len)
{ {
struct pic_string *str; pic_str *str;
str = (struct pic_string *)yy_obj_alloc(p, sizeof(struct pic_string), PIC_TT_STRING); str = (struct pic_string *)yy_obj_alloc(p, sizeof(struct pic_string), PIC_TT_STRING);
str->rope = xr_new_volatile(cstr, strlen(cstr)); str->rope = xr_new_volatile(buf, len);
return pic_obj_value(str); return pic_obj_value(str);
} }
@ -138,7 +138,10 @@ void yyerror(struct parser_control *, const char *);
%union { %union {
int i; int i;
double f; double f;
char *cstr; struct {
char *buf;
size_t len;
} str;
char c; char c;
struct { struct {
char *dat; char *dat;
@ -152,7 +155,7 @@ void yyerror(struct parser_control *, const char *);
%token tQUOTE tQUASIQUOTE tUNQUOTE tUNQUOTE_SPLICING %token tQUOTE tQUASIQUOTE tUNQUOTE tUNQUOTE_SPLICING
%token <i> tINT tBOOLEAN %token <i> tINT tBOOLEAN
%token <f> tFLOAT %token <f> tFLOAT
%token <cstr> tSYMBOL tSTRING %token <str> tSYMBOL tSTRING
%token <c> tCHAR %token <c> tCHAR
%token <blob> tBYTEVECTOR %token <blob> tBYTEVECTOR
@ -210,13 +213,11 @@ datum
simple_datum simple_datum
: tSYMBOL : tSYMBOL
{ {
$$ = pic_symbol_value(pic_intern_cstr(p->pic, $1)); $$ = pic_symbol_value(pic_intern(p->pic, $1.buf, $1.len));
free($1);
} }
| tSTRING | tSTRING
{ {
$$ = yy_str_new_cstr(p, $1); $$ = yy_str_new(p, $1.buf, $1.len);
free($1);
} }
| tINT | tINT
{ {

View File

@ -116,7 +116,8 @@ infnan "+inf.0"|"-inf.0"|"+nan.0"|"-nan.0"
} }
{identifier} { {identifier} {
yylvalp->cstr = pic_strdup(yyextra->pic, yytext); yylvalp->str.buf = yytext;
yylvalp->str.len = yyleng;
return tSYMBOL; return tSYMBOL;
} }
@ -127,8 +128,8 @@ infnan "+inf.0"|"-inf.0"|"+nan.0"|"-nan.0"
yymore(); yymore();
} }
<STRING>"\"" { <STRING>"\"" {
yytext[yyleng-1] = '\0'; yylvalp->str.buf = yytext;
yylvalp->cstr = pic_strdup(yyextra->pic, yytext); yylvalp->str.len = yyleng - 1;
BEGIN(INITIAL); BEGIN(INITIAL);
return tSTRING; return tSTRING;
} }