add OP_CREF
This commit is contained in:
		
							parent
							
								
									bd851318d1
								
							
						
					
					
						commit
						4b31901bce
					
				| 
						 | 
				
			
			@ -11,6 +11,7 @@ enum pic_opcode {
 | 
			
		|||
  OP_GREF,
 | 
			
		||||
  OP_GSET,
 | 
			
		||||
  OP_LREF,
 | 
			
		||||
  OP_CREF,
 | 
			
		||||
  OP_JMP,
 | 
			
		||||
  OP_JMPIF,
 | 
			
		||||
  OP_CALL,
 | 
			
		||||
| 
						 | 
				
			
			@ -32,6 +33,10 @@ struct pic_code {
 | 
			
		|||
  union {
 | 
			
		||||
    double f;
 | 
			
		||||
    int i;
 | 
			
		||||
    struct {
 | 
			
		||||
      short depth;
 | 
			
		||||
      short idx;
 | 
			
		||||
    } c;
 | 
			
		||||
  } u;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -506,6 +506,9 @@ print_irep(pic_state *pic, struct pic_irep *irep)
 | 
			
		|||
    case OP_LREF:
 | 
			
		||||
      printf("OP_LREF\t%d\n", irep->code[i].u.i);
 | 
			
		||||
      break;
 | 
			
		||||
    case OP_CREF:
 | 
			
		||||
      printf("OP_CREF\t%d\t%d\n", irep->code[i].u.c.depth, irep->code[i].u.c.idx);
 | 
			
		||||
      break;
 | 
			
		||||
    case OP_JMP:
 | 
			
		||||
      printf("OP_JMP\t%d\n", irep->code[i].u.i);
 | 
			
		||||
      break;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								src/vm.c
								
								
								
								
							
							
						
						
									
										18
									
								
								src/vm.c
								
								
								
								
							| 
						 | 
				
			
			@ -118,9 +118,10 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
 | 
			
		|||
#if PIC_DIRECT_THREADED_VM
 | 
			
		||||
  static void *oplabels[] = {
 | 
			
		||||
    &&L_OP_POP, &&L_OP_PUSHNIL, &&L_OP_PUSHTRUE, &&L_OP_PUSHFALSE, &&L_OP_PUSHNUM,
 | 
			
		||||
    &&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_NILP, &&L_OP_ADD, &&L_OP_SUB, &&L_OP_MUL, &&L_OP_DIV, &&L_OP_STOP
 | 
			
		||||
    &&L_OP_PUSHCONST, &&L_OP_GREF, &&L_OP_GSET, &&L_OP_LREF, &&L_OP_CREF,
 | 
			
		||||
    &&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_NILP, &&L_OP_ADD, &&L_OP_SUB, &&L_OP_MUL,
 | 
			
		||||
    &&L_OP_DIV, &&L_OP_STOP
 | 
			
		||||
  };
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -177,6 +178,17 @@ pic_run(pic_state *pic, struct pic_proc *proc, pic_value args)
 | 
			
		|||
      PUSH(pic->ci->fp[pc->u.i]);
 | 
			
		||||
      NEXT;
 | 
			
		||||
    }
 | 
			
		||||
    CASE(OP_CREF) {
 | 
			
		||||
      int depth = pc->u.c.depth;
 | 
			
		||||
      struct pic_env *env;
 | 
			
		||||
 | 
			
		||||
      env = pic_proc_ptr(*pic->ci->fp)->env;
 | 
			
		||||
      while (depth--) {
 | 
			
		||||
	env = env->up;
 | 
			
		||||
      }
 | 
			
		||||
      PUSH(env->values[pc->u.c.idx]);
 | 
			
		||||
      NEXT;
 | 
			
		||||
    }
 | 
			
		||||
    CASE(OP_JMP) {
 | 
			
		||||
      pc += pc->u.i;
 | 
			
		||||
      JUMP;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue