add OP_PUSHCONST
This commit is contained in:
		
							parent
							
								
									5e43fe58fe
								
							
						
					
					
						commit
						a49675c322
					
				| 
						 | 
					@ -14,6 +14,7 @@
 | 
				
			||||||
#define PIC_IREP_SIZE 256
 | 
					#define PIC_IREP_SIZE 256
 | 
				
			||||||
#define PIC_GLOBALS_SIZE 1024
 | 
					#define PIC_GLOBALS_SIZE 1024
 | 
				
			||||||
#define PIC_SYM_TBL_SIZE 128
 | 
					#define PIC_SYM_TBL_SIZE 128
 | 
				
			||||||
 | 
					#define PIC_POOL_SIZE 1024
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* enable all debug flags */
 | 
					/* enable all debug flags */
 | 
				
			||||||
#define DEBUG 1
 | 
					#define DEBUG 1
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,6 +34,8 @@ typedef struct {
 | 
				
			||||||
  size_t glen, gcapa;
 | 
					  size_t glen, gcapa;
 | 
				
			||||||
  struct pic_irep **irep;
 | 
					  struct pic_irep **irep;
 | 
				
			||||||
  size_t ilen, icapa;
 | 
					  size_t ilen, icapa;
 | 
				
			||||||
 | 
					  pic_value *pool;
 | 
				
			||||||
 | 
					  size_t plen, pcapa;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  jmp_buf *jmp;
 | 
					  jmp_buf *jmp;
 | 
				
			||||||
  const char *errmsg;
 | 
					  const char *errmsg;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -7,6 +7,7 @@ enum pic_opcode {
 | 
				
			||||||
  OP_PUSHTRUE,
 | 
					  OP_PUSHTRUE,
 | 
				
			||||||
  OP_PUSHFALSE,
 | 
					  OP_PUSHFALSE,
 | 
				
			||||||
  OP_PUSHNUM,
 | 
					  OP_PUSHNUM,
 | 
				
			||||||
 | 
					  OP_PUSHCONST,
 | 
				
			||||||
  OP_GREF,
 | 
					  OP_GREF,
 | 
				
			||||||
  OP_GSET,
 | 
					  OP_GSET,
 | 
				
			||||||
  OP_LREF,
 | 
					  OP_LREF,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,6 +107,11 @@ print_irep(pic_state *pic, struct pic_irep *irep)
 | 
				
			||||||
    case OP_PUSHNUM:
 | 
					    case OP_PUSHNUM:
 | 
				
			||||||
      printf("OP_PUSHNUM\t%g\n", irep->code[i].u.f);
 | 
					      printf("OP_PUSHNUM\t%g\n", irep->code[i].u.f);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					    case OP_PUSHCONST:
 | 
				
			||||||
 | 
					      printf("OP_PUSHCONST\t");
 | 
				
			||||||
 | 
					      pic_debug(pic, pic->pool[irep->code[i].u.i]);
 | 
				
			||||||
 | 
					      puts("");
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
    case OP_GREF:
 | 
					    case OP_GREF:
 | 
				
			||||||
      printf("OP_GREF\t%i\n", irep->code[i].u.i);
 | 
					      printf("OP_GREF\t%i\n", irep->code[i].u.i);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
| 
						 | 
					@ -180,7 +185,7 @@ static struct pic_irep *pic_gen_lambda(pic_state *, pic_value, struct pic_env *)
 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_env *env)
 | 
					pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_env *env)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  pic_value sDEFINE, sLAMBDA, sIF, sBEGIN;
 | 
					  pic_value sDEFINE, sLAMBDA, sIF, sBEGIN, sQUOTE;
 | 
				
			||||||
  pic_value sCONS, sCAR, sCDR, sNILP;
 | 
					  pic_value sCONS, sCAR, sCDR, sNILP;
 | 
				
			||||||
  pic_value sADD, sSUB, sMUL, sDIV;
 | 
					  pic_value sADD, sSUB, sMUL, sDIV;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -188,6 +193,7 @@ pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_env *en
 | 
				
			||||||
  sLAMBDA = pic->sLAMBDA;
 | 
					  sLAMBDA = pic->sLAMBDA;
 | 
				
			||||||
  sIF = pic->sIF;
 | 
					  sIF = pic->sIF;
 | 
				
			||||||
  sBEGIN = pic->sBEGIN;
 | 
					  sBEGIN = pic->sBEGIN;
 | 
				
			||||||
 | 
					  sQUOTE = pic->sQUOTE;
 | 
				
			||||||
  sCONS = pic->sCONS;
 | 
					  sCONS = pic->sCONS;
 | 
				
			||||||
  sCAR = pic->sCAR;
 | 
					  sCAR = pic->sCAR;
 | 
				
			||||||
  sCDR = pic->sCDR;
 | 
					  sCDR = pic->sCDR;
 | 
				
			||||||
| 
						 | 
					@ -280,6 +286,15 @@ pic_gen(pic_state *pic, struct pic_irep *irep, pic_value obj, struct pic_env *en
 | 
				
			||||||
      irep->clen--;
 | 
					      irep->clen--;
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    else if (pic_eq_p(pic, proc, sQUOTE)) {
 | 
				
			||||||
 | 
					      int pidx;
 | 
				
			||||||
 | 
					      pidx = pic->plen++;
 | 
				
			||||||
 | 
					      pic->pool[pidx] = pic_car(pic, pic_cdr(pic, obj));
 | 
				
			||||||
 | 
					      irep->code[irep->clen].insn = OP_PUSHCONST;
 | 
				
			||||||
 | 
					      irep->code[irep->clen].u.i = pidx;
 | 
				
			||||||
 | 
					      irep->clen++;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    else if (pic_eq_p(pic, proc, sCONS)) {
 | 
					    else if (pic_eq_p(pic, proc, sCONS)) {
 | 
				
			||||||
      pic_gen(pic, irep, pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj))), env);
 | 
					      pic_gen(pic, irep, pic_car(pic, pic_cdr(pic, pic_cdr(pic, obj))), env);
 | 
				
			||||||
      pic_gen(pic, irep, pic_car(pic, pic_cdr(pic, obj)), env);
 | 
					      pic_gen(pic, irep, pic_car(pic, pic_cdr(pic, obj)), env);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										17
									
								
								src/gc.c
								
								
								
								
							
							
						
						
									
										17
									
								
								src/gc.c
								
								
								
								
							| 
						 | 
					@ -5,6 +5,7 @@
 | 
				
			||||||
#include "picrin/irep.h"
 | 
					#include "picrin/irep.h"
 | 
				
			||||||
#include "picrin/proc.h"
 | 
					#include "picrin/proc.h"
 | 
				
			||||||
#include "picrin/string.h"
 | 
					#include "picrin/string.h"
 | 
				
			||||||
 | 
					#include "picrin/symbol.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if GC_DEBUG
 | 
					#if GC_DEBUG
 | 
				
			||||||
# include <stdio.h>
 | 
					# include <stdio.h>
 | 
				
			||||||
| 
						 | 
					@ -203,9 +204,25 @@ gc_mark_phase(pic_state *pic)
 | 
				
			||||||
    gc_mark(pic, pic->globals[i]);
 | 
					    gc_mark(pic, pic->globals[i]);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* pool */
 | 
				
			||||||
 | 
					  for (i = 0; i < pic->plen; ++i) {
 | 
				
			||||||
 | 
					    gc_mark(pic, pic->pool[i]);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* symbol table */
 | 
				
			||||||
 | 
					  for (i = 0; i < pic->sym_tbl->size; ++i) {
 | 
				
			||||||
 | 
					    gc_mark(pic, pic->sym_tbl->tbl[i]);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gc_mark(pic, pic->sDEFINE);
 | 
					  gc_mark(pic, pic->sDEFINE);
 | 
				
			||||||
  gc_mark(pic, pic->sLAMBDA);
 | 
					  gc_mark(pic, pic->sLAMBDA);
 | 
				
			||||||
 | 
					  gc_mark(pic, pic->sIF);
 | 
				
			||||||
 | 
					  gc_mark(pic, pic->sBEGIN);
 | 
				
			||||||
 | 
					  gc_mark(pic, pic->sQUOTE);
 | 
				
			||||||
  gc_mark(pic, pic->sCONS);
 | 
					  gc_mark(pic, pic->sCONS);
 | 
				
			||||||
 | 
					  gc_mark(pic, pic->sCAR);
 | 
				
			||||||
 | 
					  gc_mark(pic, pic->sCDR);
 | 
				
			||||||
 | 
					  gc_mark(pic, pic->sNILP);
 | 
				
			||||||
  gc_mark(pic, pic->sADD);
 | 
					  gc_mark(pic, pic->sADD);
 | 
				
			||||||
  gc_mark(pic, pic->sSUB);
 | 
					  gc_mark(pic, pic->sSUB);
 | 
				
			||||||
  gc_mark(pic, pic->sMUL);
 | 
					  gc_mark(pic, pic->sMUL);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										13
									
								
								src/parse.y
								
								
								
								
							
							
						
						
									
										13
									
								
								src/parse.y
								
								
								
								
							| 
						 | 
					@ -28,9 +28,10 @@ int yylex(struct parser_control *);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%token tLPAREN tRPAREN tDOT
 | 
					%token tLPAREN tRPAREN tDOT
 | 
				
			||||||
 | 
					%token tQUOTE
 | 
				
			||||||
%token <datum> tSYMBOL tNUMBER tBOOLEAN
 | 
					%token <datum> tSYMBOL tNUMBER tBOOLEAN
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%type <datum> datum simple_datum symbol compound_datum
 | 
					%type <datum> datum simple_datum symbol compound_datum abbrev
 | 
				
			||||||
%type <datum> number boolean list list_data
 | 
					%type <datum> number boolean list list_data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%%
 | 
					%%
 | 
				
			||||||
| 
						 | 
					@ -79,6 +80,7 @@ boolean
 | 
				
			||||||
 | 
					
 | 
				
			||||||
compound_datum
 | 
					compound_datum
 | 
				
			||||||
	: list
 | 
						: list
 | 
				
			||||||
 | 
						| abbrev
 | 
				
			||||||
;
 | 
					;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
list
 | 
					list
 | 
				
			||||||
| 
						 | 
					@ -103,8 +105,17 @@ list_data
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
;
 | 
					;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					abbrev
 | 
				
			||||||
 | 
						: tQUOTE datum
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						  $$ = pic_cons(p->pic, p->pic->sQUOTE, pic_cons(p->pic, $2, pic_nil_value()));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
incomplete_datum
 | 
					incomplete_datum
 | 
				
			||||||
	: tLPAREN incomplete_data
 | 
						: tLPAREN incomplete_data
 | 
				
			||||||
 | 
						| tQUOTE
 | 
				
			||||||
 | 
						| tQUOTE incomplete_datum
 | 
				
			||||||
;
 | 
					;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
incomplete_data
 | 
					incomplete_data
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,6 +35,7 @@ infnan		"+inf.0"|"-inf.0"|"+nan.0"|"-nan.0"
 | 
				
			||||||
"."		return tDOT;
 | 
					"."		return tDOT;
 | 
				
			||||||
"("		return tLPAREN;
 | 
					"("		return tLPAREN;
 | 
				
			||||||
")"		return tRPAREN;
 | 
					")"		return tRPAREN;
 | 
				
			||||||
 | 
					"'"		return tQUOTE;
 | 
				
			||||||
{boolean}	{ yylval.datum = pic_bool_value(strcmp(yytext, "#t") == 0 || strcmp(yytext, "#true") == 0); return tBOOLEAN; }
 | 
					{boolean}	{ yylval.datum = pic_bool_value(strcmp(yytext, "#t") == 0 || strcmp(yytext, "#true") == 0); return tBOOLEAN; }
 | 
				
			||||||
{real} 		{ yylval.datum = pic_float_value(atof(yytext)); return tNUMBER; }
 | 
					{real} 		{ yylval.datum = pic_float_value(atof(yytext)); return tNUMBER; }
 | 
				
			||||||
{identifier}	{ yylval.datum = pic_intern_cstr(p->pic, yytext); return tSYMBOL; }
 | 
					{identifier}	{ yylval.datum = pic_intern_cstr(p->pic, yytext); return tSYMBOL; }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -51,6 +51,11 @@ pic_open()
 | 
				
			||||||
  pic->glen = 0;
 | 
					  pic->glen = 0;
 | 
				
			||||||
  pic->gcapa = PIC_GLOBALS_SIZE;
 | 
					  pic->gcapa = PIC_GLOBALS_SIZE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  /* pool */
 | 
				
			||||||
 | 
					  pic->pool = (pic_value *)malloc(sizeof(pic_value) * PIC_POOL_SIZE);
 | 
				
			||||||
 | 
					  pic->plen = 0;
 | 
				
			||||||
 | 
					  pic->pcapa = PIC_POOL_SIZE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /* error handling */
 | 
					  /* error handling */
 | 
				
			||||||
  pic->jmp = NULL;
 | 
					  pic->jmp = NULL;
 | 
				
			||||||
  pic->errmsg = NULL;
 | 
					  pic->errmsg = NULL;
 | 
				
			||||||
| 
						 | 
					@ -62,6 +67,7 @@ pic_open()
 | 
				
			||||||
  pic->sLAMBDA = pic_intern_cstr(pic, "lambda");
 | 
					  pic->sLAMBDA = pic_intern_cstr(pic, "lambda");
 | 
				
			||||||
  pic->sIF = pic_intern_cstr(pic, "if");
 | 
					  pic->sIF = pic_intern_cstr(pic, "if");
 | 
				
			||||||
  pic->sBEGIN = pic_intern_cstr(pic, "begin");
 | 
					  pic->sBEGIN = pic_intern_cstr(pic, "begin");
 | 
				
			||||||
 | 
					  pic->sQUOTE = pic_intern_cstr(pic, "quote");
 | 
				
			||||||
  pic->sCONS = pic_intern_cstr(pic, "cons");
 | 
					  pic->sCONS = pic_intern_cstr(pic, "cons");
 | 
				
			||||||
  pic->sCAR = pic_intern_cstr(pic, "car");
 | 
					  pic->sCAR = pic_intern_cstr(pic, "car");
 | 
				
			||||||
  pic->sCDR = pic_intern_cstr(pic, "cdr");
 | 
					  pic->sCDR = pic_intern_cstr(pic, "cdr");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										9
									
								
								src/vm.c
								
								
								
								
							
							
						
						
									
										9
									
								
								src/vm.c
								
								
								
								
							| 
						 | 
					@ -69,7 +69,7 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
 | 
				
			||||||
#if PIC_DIRECT_THREADED_VM
 | 
					#if PIC_DIRECT_THREADED_VM
 | 
				
			||||||
  static void *oplabels[] = {
 | 
					  static void *oplabels[] = {
 | 
				
			||||||
    &&L_OP_POP, &&L_OP_PUSHNIL, &&L_OP_PUSHTRUE, &&L_OP_PUSHFALSE, &&L_OP_PUSHNUM,
 | 
					    &&L_OP_POP, &&L_OP_PUSHNIL, &&L_OP_PUSHTRUE, &&L_OP_PUSHFALSE, &&L_OP_PUSHNUM,
 | 
				
			||||||
    &&L_OP_GREF, &&L_OP_GSET, &&L_OP_LREF, &&L_OP_JMP, &&L_OP_JMPIF,
 | 
					    &&L_OP_PUSHCONST, &&L_OP_GREF, &&L_OP_GSET, &&L_OP_LREF, &&L_OP_JMP, &&L_OP_JMPIF,
 | 
				
			||||||
    &&L_OP_CALL, &&L_OP_RET, &&L_OP_LAMBDA, &&L_OP_CONS, &&L_OP_CAR, &&L_OP_CDR,
 | 
					    &&L_OP_CALL, &&L_OP_RET, &&L_OP_LAMBDA, &&L_OP_CONS, &&L_OP_CAR, &&L_OP_CDR,
 | 
				
			||||||
    &&L_OP_NILP, &&L_OP_ADD, &&L_OP_SUB, &&L_OP_MUL, &&L_OP_DIV, &&L_OP_STOP
 | 
					    &&L_OP_NILP, &&L_OP_ADD, &&L_OP_SUB, &&L_OP_MUL, &&L_OP_DIV, &&L_OP_STOP
 | 
				
			||||||
  };
 | 
					  };
 | 
				
			||||||
| 
						 | 
					@ -111,6 +111,10 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
 | 
				
			||||||
      PUSH(pic_float_value(pc->u.f));
 | 
					      PUSH(pic_float_value(pc->u.f));
 | 
				
			||||||
      NEXT;
 | 
					      NEXT;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    CASE(OP_PUSHCONST) {
 | 
				
			||||||
 | 
					      PUSH(pic->pool[pc->u.i]);
 | 
				
			||||||
 | 
					      NEXT;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    CASE(OP_GREF) {
 | 
					    CASE(OP_GREF) {
 | 
				
			||||||
      PUSH(pic->globals[pc->u.i]);
 | 
					      PUSH(pic->globals[pc->u.i]);
 | 
				
			||||||
      NEXT;
 | 
					      NEXT;
 | 
				
			||||||
| 
						 | 
					@ -166,8 +170,9 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
 | 
				
			||||||
      pic_value v;
 | 
					      pic_value v;
 | 
				
			||||||
      pic_callinfo *ci;
 | 
					      pic_callinfo *ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    L_RAISE:
 | 
					 | 
				
			||||||
      if (pic->errmsg) {
 | 
					      if (pic->errmsg) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      L_RAISE:
 | 
				
			||||||
	goto L_STOP;
 | 
						goto L_STOP;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      else {
 | 
					      else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue