add unary minus operator
This commit is contained in:
		
							parent
							
								
									ae376b4903
								
							
						
					
					
						commit
						84c1156b9d
					
				|  | @ -30,6 +30,7 @@ enum pic_opcode { | |||
|   OP_SUB, | ||||
|   OP_MUL, | ||||
|   OP_DIV, | ||||
|   OP_MINUS, | ||||
|   OP_EQ, | ||||
|   OP_LT, | ||||
|   OP_LE, | ||||
|  |  | |||
							
								
								
									
										17
									
								
								src/vm.c
								
								
								
								
							
							
						
						
									
										17
									
								
								src/vm.c
								
								
								
								
							|  | @ -260,7 +260,7 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value argv) | |||
|     &&L_OP_GREF, &&L_OP_GSET, &&L_OP_LREF, &&L_OP_LSET, &&L_OP_CREF, &&L_OP_CSET, | ||||
|     &&L_OP_JMP, &&L_OP_JMPIF, &&L_OP_CALL, &&L_OP_TAILCALL, &&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_ADD, &&L_OP_SUB, &&L_OP_MUL, &&L_OP_DIV, &&L_OP_MINUS, | ||||
|     &&L_OP_EQ, &&L_OP_LT, &&L_OP_LE, &&L_OP_STOP | ||||
|   }; | ||||
| #endif | ||||
|  | @ -577,6 +577,21 @@ pic_apply(pic_state *pic, struct pic_proc *proc, pic_value argv) | |||
|       NEXT; | ||||
|     } | ||||
| 
 | ||||
|     CASE(OP_MINUS) { | ||||
|       pic_value n; | ||||
|       n = POP(); | ||||
|       if (pic_int_p(n)) { | ||||
| 	PUSH(pic_int_value(-pic_int(n))); | ||||
|       } | ||||
|       else if (pic_float_p(n)) { | ||||
| 	PUSH(pic_float_value(-pic_float(n))); | ||||
|       } | ||||
|       else { | ||||
| 	pic->errmsg = "unary - got a non-number operand"; | ||||
|       } | ||||
|       NEXT; | ||||
|     } | ||||
| 
 | ||||
| #define DEFINE_COMP_OP(opcode, op)				\ | ||||
|     CASE(opcode) {						\ | ||||
|       pic_value a, b;						\ | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki