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