quote everything

This commit is contained in:
Yuichi Nishiwaki 2014-01-23 19:21:37 +09:00
parent 03e21218a5
commit 56e90f564c
1 changed files with 43 additions and 56 deletions

View File

@ -409,7 +409,7 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos)
if (pic_length(pic, obj) != 2) { if (pic_length(pic, obj) != 2) {
pic_error(pic, "syntax error"); pic_error(pic, "syntax error");
} }
return obj; /* TODO: quote only if necessary */ return obj;
} }
#define ARGC_ASSERT(n) do { \ #define ARGC_ASSERT(n) do { \
@ -547,9 +547,7 @@ analyze_node(analyze_state *state, pic_value obj, bool tailpos)
case PIC_TT_FLOAT: case PIC_TT_FLOAT:
case PIC_TT_INT: case PIC_TT_INT:
case PIC_TT_NIL: case PIC_TT_NIL:
case PIC_TT_CHAR: { case PIC_TT_CHAR:
return obj;
}
case PIC_TT_STRING: case PIC_TT_STRING:
case PIC_TT_VECTOR: case PIC_TT_VECTOR:
case PIC_TT_BLOB: { case PIC_TT_BLOB: {
@ -821,51 +819,9 @@ codegen(codegen_state *state, pic_value obj)
{ {
pic_state *pic = state->pic; pic_state *pic = state->pic;
codegen_context *cxt = state->cxt; codegen_context *cxt = state->cxt;
pic_value tag;
pic_sym sym; pic_sym sym;
switch (pic_type(obj)) { sym = pic_sym(pic_car(pic, obj));
case PIC_TT_BOOL:
if (pic_true_p(obj)) {
cxt->code[cxt->clen].insn = OP_PUSHTRUE;
} else {
cxt->code[cxt->clen].insn = OP_PUSHFALSE;
}
cxt->clen++;
return;
case PIC_TT_FLOAT:
cxt->code[cxt->clen].insn = OP_PUSHFLOAT;
cxt->code[cxt->clen].u.f = pic_float(obj);
cxt->clen++;
return;
case PIC_TT_INT:
cxt->code[cxt->clen].insn = OP_PUSHINT;
cxt->code[cxt->clen].u.i = pic_int(obj);
cxt->clen++;
return;
case PIC_TT_NIL:
cxt->code[cxt->clen].insn = OP_PUSHNIL;
cxt->clen++;
return;
case PIC_TT_CHAR:
cxt->code[cxt->clen].insn = OP_PUSHCHAR;
cxt->code[cxt->clen].u.c = pic_char(obj);
cxt->clen++;
return;
default:
break;
}
if (! pic_list_p(pic, obj)) {
pic_error(pic, "codegen: invalid AST given");
}
tag = pic_car(pic, obj);
if (! pic_symbol_p(tag)) {
pic_error(pic, "codegen: broken AST");
}
sym = pic_sym(tag);
if (sym == state->sGREF) { if (sym == state->sGREF) {
cxt->code[cxt->clen].insn = OP_GREF; cxt->code[cxt->clen].insn = OP_GREF;
cxt->code[cxt->clen].u.i = pic_int(pic_list_ref(pic, obj, 1)); cxt->code[cxt->clen].u.i = pic_int(pic_list_ref(pic, obj, 1));
@ -961,16 +917,47 @@ codegen(codegen_state *state, pic_value obj)
else if (sym == pic->sQUOTE) { else if (sym == pic->sQUOTE) {
int pidx; int pidx;
if (cxt->plen >= cxt->pcapa) { obj = pic_list_ref(pic, obj, 1);
cxt->pcapa *= 2; switch (pic_type(obj)) {
cxt->pool = (pic_value *)pic_realloc(pic, cxt->pool, sizeof(pic_value) * cxt->pcapa); case PIC_TT_BOOL:
if (pic_true_p(obj)) {
cxt->code[cxt->clen].insn = OP_PUSHTRUE;
} else {
cxt->code[cxt->clen].insn = OP_PUSHFALSE;
}
cxt->clen++;
return;
case PIC_TT_FLOAT:
cxt->code[cxt->clen].insn = OP_PUSHFLOAT;
cxt->code[cxt->clen].u.f = pic_float(obj);
cxt->clen++;
return;
case PIC_TT_INT:
cxt->code[cxt->clen].insn = OP_PUSHINT;
cxt->code[cxt->clen].u.i = pic_int(obj);
cxt->clen++;
return;
case PIC_TT_NIL:
cxt->code[cxt->clen].insn = OP_PUSHNIL;
cxt->clen++;
return;
case PIC_TT_CHAR:
cxt->code[cxt->clen].insn = OP_PUSHCHAR;
cxt->code[cxt->clen].u.c = pic_char(obj);
cxt->clen++;
return;
default:
if (cxt->plen >= cxt->pcapa) {
cxt->pcapa *= 2;
cxt->pool = (pic_value *)pic_realloc(pic, cxt->pool, sizeof(pic_value) * cxt->pcapa);
}
pidx = cxt->plen++;
cxt->pool[pidx] = obj;
cxt->code[cxt->clen].insn = OP_PUSHCONST;
cxt->code[cxt->clen].u.i = pidx;
cxt->clen++;
return;
} }
pidx = cxt->plen++;
cxt->pool[pidx] = pic_car(pic, pic_cdr(pic, obj));
cxt->code[cxt->clen].insn = OP_PUSHCONST;
cxt->code[cxt->clen].u.i = pidx;
cxt->clen++;
return;
} }
else if (sym == pic->sCONS) { else if (sym == pic->sCONS) {
codegen(state, pic_list_ref(pic, obj, 1)); codegen(state, pic_list_ref(pic, obj, 1));