nan-boxing support
This commit is contained in:
		
							parent
							
								
									e056586ab9
								
							
						
					
					
						commit
						d9cb5d4eee
					
				|  | @ -4,6 +4,9 @@ | ||||||
| /* switch normal VM and direct threaded VM */ | /* switch normal VM and direct threaded VM */ | ||||||
| #define PIC_DIRECT_THREADED_VM 1 | #define PIC_DIRECT_THREADED_VM 1 | ||||||
| 
 | 
 | ||||||
|  | /* switch internal value representation */ | ||||||
|  | #define PIC_NAN_BOXING 1 | ||||||
|  | 
 | ||||||
| /* enable readline module */ | /* enable readline module */ | ||||||
| #define PIC_ENABLE_READLINE 1 | #define PIC_ENABLE_READLINE 1 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -16,6 +16,37 @@ enum pic_vtype { | ||||||
|   PIC_VTYPE_HEAP |   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 { | typedef struct { | ||||||
|   enum pic_vtype type; |   enum pic_vtype type; | ||||||
|   union { |   union { | ||||||
|  | @ -31,6 +62,8 @@ typedef struct { | ||||||
| #define pic_vtype(v) ((v).type) | #define pic_vtype(v) ((v).type) | ||||||
| #define pic_init_value(v,vtype) ((v).type = (vtype), (v).u.data = NULL) | #define pic_init_value(v,vtype) ((v).type = (vtype), (v).u.data = NULL) | ||||||
| 
 | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| enum pic_tt { | enum pic_tt { | ||||||
|   /* immediate */ |   /* immediate */ | ||||||
|   PIC_TT_NIL, |   PIC_TT_NIL, | ||||||
|  |  | ||||||
							
								
								
									
										70
									
								
								src/value.c
								
								
								
								
							
							
						
						
									
										70
									
								
								src/value.c
								
								
								
								
							|  | @ -1,7 +1,43 @@ | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| #include <stdbool.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 | enum pic_tt | ||||||
| pic_type(pic_value v) | pic_type(pic_value v) | ||||||
|  | @ -32,6 +68,8 @@ pic_type(pic_value v) | ||||||
|   abort(); |   abort(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| const char * | const char * | ||||||
| pic_type_repr(enum pic_tt tt) | pic_type_repr(enum pic_tt tt) | ||||||
| { | { | ||||||
|  | @ -91,6 +129,34 @@ pic_bool_value(bool b) | ||||||
|   return v; |   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_value | ||||||
| pic_obj_value(void *ptr) | pic_obj_value(void *ptr) | ||||||
| { | { | ||||||
|  | @ -111,6 +177,8 @@ pic_float_value(double f) | ||||||
|   return v; |   return v; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| pic_value | pic_value | ||||||
| pic_int_value(int i) | pic_int_value(int i) | ||||||
| { | { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Yuichi Nishiwaki
						Yuichi Nishiwaki