nan-boxing support
This commit is contained in:
		
							parent
							
								
									e056586ab9
								
							
						
					
					
						commit
						d9cb5d4eee
					
				|  | @ -4,6 +4,9 @@ | |||
| /* switch normal VM and direct threaded VM */ | ||||
| #define PIC_DIRECT_THREADED_VM 1 | ||||
| 
 | ||||
| /* switch internal value representation */ | ||||
| #define PIC_NAN_BOXING 1 | ||||
| 
 | ||||
| /* enable readline module */ | ||||
| #define PIC_ENABLE_READLINE 1 | ||||
| 
 | ||||
|  |  | |||
|  | @ -16,6 +16,37 @@ enum pic_vtype { | |||
|   PIC_VTYPE_HEAP | ||||
| }; | ||||
| 
 | ||||
| #if PIC_NAN_BOXING | ||||
| 
 | ||||
| /**
 | ||||
|  * value representation by nan-boxing: | ||||
|  *   float : FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF | ||||
|  *   ptr   : 111111111111TTTT PPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPP PPPPPPPPPPPPPPPP | ||||
|  *   int   : 1111111111110110 0000000000000000 IIIIIIIIIIIIIIII IIIIIIIIIIIIIIII | ||||
|  *   sym   : 1111111111110111 0000000000000000 SSSSSSSSSSSSSSSS SSSSSSSSSSSSSSSS | ||||
|  *   char  : 1111111111111000 0000000000000000 CCCCCCCCCCCCCCCC ................ | ||||
|  */ | ||||
| typedef struct { | ||||
|   union { | ||||
|     void *data; | ||||
|     double f; | ||||
|     struct { | ||||
|       union { | ||||
| 	int i; | ||||
| 	pic_sym sym; | ||||
| 	char c; | ||||
|       }; | ||||
|       unsigned int type_; | ||||
|     }; | ||||
|   } u; | ||||
| } pic_value; | ||||
| 
 | ||||
| #define pic_ptr(v) ((void *)((long long)0xffffffffffff & (long long)(v).u.data)) | ||||
| #define pic_vtype(v) (((v).u.type_ & 0xf0000)>>16) | ||||
| #define pic_init_value(v,vtype) (((v).u.type_ = ((unsigned int)0xfff00000|((vtype)<<16))), (v).u.i = 0) | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| typedef struct { | ||||
|   enum pic_vtype type; | ||||
|   union { | ||||
|  | @ -31,6 +62,8 @@ typedef struct { | |||
| #define pic_vtype(v) ((v).type) | ||||
| #define pic_init_value(v,vtype) ((v).type = (vtype), (v).u.data = NULL) | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| enum pic_tt { | ||||
|   /* immediate */ | ||||
|   PIC_TT_NIL, | ||||
|  |  | |||
							
								
								
									
										70
									
								
								src/value.c
								
								
								
								
							
							
						
						
									
										70
									
								
								src/value.c
								
								
								
								
							|  | @ -1,7 +1,43 @@ | |||
| #include <stdlib.h> | ||||
| #include <stdbool.h> | ||||
| 
 | ||||
| #include "picrin/value.h" | ||||
| #include "picrin.h" | ||||
| 
 | ||||
| #if PIC_NAN_BOXING | ||||
| 
 | ||||
| enum pic_tt | ||||
| pic_type(pic_value v) | ||||
| { | ||||
|   if ((int)0xfff00000 >= v.u.type_) | ||||
|     return PIC_TT_FLOAT; | ||||
| 
 | ||||
|   switch (pic_vtype(v)) { | ||||
|   case PIC_VTYPE_NIL: | ||||
|     return PIC_TT_NIL; | ||||
|   case PIC_VTYPE_TRUE: | ||||
|     return PIC_TT_BOOL; | ||||
|   case PIC_VTYPE_FALSE: | ||||
|     return PIC_TT_BOOL; | ||||
|   case PIC_VTYPE_UNDEF: | ||||
|     return PIC_TT_UNDEF; | ||||
|   case PIC_VTYPE_FLOAT: | ||||
|     return PIC_TT_FLOAT; | ||||
|   case PIC_VTYPE_INT: | ||||
|     return PIC_TT_INT; | ||||
|   case PIC_VTYPE_SYMBOL: | ||||
|     return PIC_TT_SYMBOL; | ||||
|   case PIC_VTYPE_CHAR: | ||||
|     return PIC_TT_CHAR; | ||||
|   case PIC_VTYPE_EOF: | ||||
|     return PIC_TT_EOF; | ||||
|   case PIC_VTYPE_HEAP: | ||||
|     return ((struct pic_object *)pic_ptr(v))->tt; | ||||
|   } | ||||
|   /* logic flaw (suppress warnings gcc will emit) */ | ||||
|   abort(); | ||||
| } | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| enum pic_tt | ||||
| pic_type(pic_value v) | ||||
|  | @ -32,6 +68,8 @@ pic_type(pic_value v) | |||
|   abort(); | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| const char * | ||||
| pic_type_repr(enum pic_tt tt) | ||||
| { | ||||
|  | @ -91,6 +129,34 @@ pic_bool_value(bool b) | |||
|   return v; | ||||
| } | ||||
| 
 | ||||
| #if PIC_NAN_BOXING | ||||
| 
 | ||||
| pic_value | ||||
| pic_obj_value(void *ptr) | ||||
| { | ||||
|   pic_value v; | ||||
| 
 | ||||
|   pic_init_value(v, PIC_VTYPE_HEAP); | ||||
|   v.u.data = (void*)((long long)v.u.data | ((long long)ptr)); | ||||
|   return v; | ||||
| } | ||||
| 
 | ||||
| pic_value | ||||
| pic_float_value(double f) | ||||
| { | ||||
|   pic_value v; | ||||
| 
 | ||||
|   if (f != f) { | ||||
|     v.u.type_ = 0x7ff80000; | ||||
|     v.u.i = 0; | ||||
|   } else { | ||||
|     v.u.f = f; | ||||
|   } | ||||
|   return v; | ||||
| } | ||||
| 
 | ||||
| #else | ||||
| 
 | ||||
| pic_value | ||||
| pic_obj_value(void *ptr) | ||||
| { | ||||
|  | @ -111,6 +177,8 @@ pic_float_value(double f) | |||
|   return v; | ||||
| } | ||||
| 
 | ||||
| #endif | ||||
| 
 | ||||
| pic_value | ||||
| pic_int_value(int i) | ||||
| { | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki