diff options
Diffstat (limited to 'include')
| -rw-r--r-- | include/mrbconf.h | 20 | ||||
| -rw-r--r-- | include/mruby.h | 19 | ||||
| -rw-r--r-- | include/mruby/array.h | 10 | ||||
| -rw-r--r-- | include/mruby/boxing_nan.h | 14 | ||||
| -rw-r--r-- | include/mruby/boxing_no.h | 1 | ||||
| -rw-r--r-- | include/mruby/boxing_word.h | 56 | ||||
| -rw-r--r-- | include/mruby/class.h | 7 | ||||
| -rw-r--r-- | include/mruby/common.h | 10 | ||||
| -rw-r--r-- | include/mruby/compile.h | 15 | ||||
| -rw-r--r-- | include/mruby/dump.h | 18 | ||||
| -rw-r--r-- | include/mruby/irep.h | 10 | ||||
| -rw-r--r-- | include/mruby/numeric.h | 1 | ||||
| -rw-r--r-- | include/mruby/ops.h | 1 | ||||
| -rw-r--r-- | include/mruby/string.h | 15 | ||||
| -rw-r--r-- | include/mruby/value.h | 31 | ||||
| -rw-r--r-- | include/mruby/version.h | 8 |
16 files changed, 137 insertions, 99 deletions
diff --git a/include/mrbconf.h b/include/mrbconf.h index b86ce82e8..2b1adb24e 100644 --- a/include/mrbconf.h +++ b/include/mrbconf.h @@ -38,21 +38,24 @@ /* add -DMRB_METHOD_T_STRUCT on machines that use higher bits of pointers */ /* no MRB_METHOD_T_STRUCT requires highest 2 bits of function pointers to be zero */ -//#define MRB_METHOD_T_STRUCT - -/* add -DMRB_INT16 to use 16bit integer for mrb_int; conflict with MRB_INT32 and MRB_INT64 */ -//#define MRB_INT16 +#ifndef MRB_METHOD_T_STRUCT + // can't use highest 2 bits of function pointers at least on 32bit + // Windows and 32bit Linux. +# ifdef MRB_32BIT +# define MRB_METHOD_T_STRUCT +# endif +#endif -/* add -DMRB_INT32 to use 32bit integer for mrb_int; conflict with MRB_INT16 and MRB_INT64; +/* add -DMRB_INT32 to use 32bit integer for mrb_int; conflict with MRB_INT64; Default for 32-bit CPU mode. */ //#define MRB_INT32 -/* add -DMRB_INT64 to use 64bit integer for mrb_int; conflict with MRB_INT16 and MRB_INT32; +/* add -DMRB_INT64 to use 64bit integer for mrb_int; conflict with MRB_INT32; Default for 64-bit CPU mode. */ //#define MRB_INT64 /* if no specific integer type is chosen */ -#if !defined(MRB_INT16) && !defined(MRB_INT32) && !defined(MRB_INT64) +#if !defined(MRB_INT32) && !defined(MRB_INT64) # if defined(MRB_64BIT) && !defined(MRB_NAN_BOXING) /* Use 64bit integers on 64bit architecture (without MRB_NAN_BOXING) */ # define MRB_INT64 @@ -62,9 +65,6 @@ # endif #endif -#define MRB_COMPLEX_NUMBERS -#define MRB_RATIONAL_NUMBERS - /* define on big endian machines; used by MRB_NAN_BOXING, etc. */ #ifndef MRB_ENDIAN_BIG # if (defined(BYTE_ORDER) && defined(BIG_ENDIAN) && BYTE_ORDER == BIG_ENDIAN) || \ diff --git a/include/mruby.h b/include/mruby.h index 04e0c0df7..2fd075112 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -70,7 +70,13 @@ #include "mrbconf.h" +#include <mruby/common.h> +#include <mruby/value.h> +#include <mruby/gc.h> +#include <mruby/version.h> + #ifndef MRB_WITHOUT_FLOAT +#include <float.h> #ifndef FLT_EPSILON #define FLT_EPSILON (1.19209290e-07f) #endif @@ -88,11 +94,6 @@ #endif #endif -#include <mruby/common.h> -#include <mruby/value.h> -#include <mruby/gc.h> -#include <mruby/version.h> - /** * MRuby C API entry point */ @@ -164,8 +165,8 @@ struct mrb_context { struct RProc **ensure; /* ensure handler stack */ uint16_t esize, eidx; - enum mrb_fiber_state status; - mrb_bool vmexec; + enum mrb_fiber_state status : 4; + mrb_bool vmexec : 1; struct RFiber *fib; }; @@ -317,7 +318,9 @@ MRB_API struct RClass *mrb_define_class(mrb_state *mrb, const char *name, struct * @return [struct RClass *] Reference to the newly defined module. */ MRB_API struct RClass *mrb_define_module(mrb_state *mrb, const char *name); + MRB_API mrb_value mrb_singleton_class(mrb_state *mrb, mrb_value val); +MRB_API struct RClass *mrb_singleton_class_ptr(mrb_state *mrb, mrb_value val); /** * Include a module in another class or module. @@ -1148,7 +1151,6 @@ MRB_API void mrb_close(mrb_state *mrb); MRB_API void* mrb_default_allocf(mrb_state*, void*, size_t, void*); MRB_API mrb_value mrb_top_self(mrb_state *mrb); -MRB_API mrb_value mrb_run(mrb_state *mrb, struct RProc* proc, mrb_value self); MRB_API mrb_value mrb_top_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep); MRB_API mrb_value mrb_vm_run(mrb_state *mrb, struct RProc *proc, mrb_value self, unsigned int stack_keep); MRB_API mrb_value mrb_vm_exec(mrb_state *mrb, struct RProc *proc, const mrb_code *iseq); @@ -1232,6 +1234,7 @@ MRB_API mrb_noreturn void mrb_raise(mrb_state *mrb, struct RClass *c, const char MRB_API mrb_noreturn void mrb_raisef(mrb_state *mrb, struct RClass *c, const char *fmt, ...); MRB_API mrb_noreturn void mrb_name_error(mrb_state *mrb, mrb_sym id, const char *fmt, ...); MRB_API mrb_noreturn void mrb_frozen_error(mrb_state *mrb, void *frozen_obj); +MRB_API mrb_noreturn void mrb_argnum_error(mrb_state *mrb, mrb_int argc, int min, int max); MRB_API void mrb_warn(mrb_state *mrb, const char *fmt, ...); MRB_API mrb_noreturn void mrb_bug(mrb_state *mrb, const char *fmt, ...); MRB_API void mrb_print_backtrace(mrb_state *mrb); diff --git a/include/mruby/array.h b/include/mruby/array.h index 9664214d6..92c86a8c5 100644 --- a/include/mruby/array.h +++ b/include/mruby/array.h @@ -17,7 +17,7 @@ MRB_BEGIN_DECL typedef struct mrb_shared_array { int refcnt; - mrb_int len; + mrb_ssize len; mrb_value *ptr; } mrb_shared_array; @@ -26,9 +26,9 @@ struct RArray { MRB_OBJECT_HEADER; union { struct { - mrb_int len; + mrb_ssize len; union { - mrb_int capa; + mrb_ssize capa; mrb_shared_array *shared; } aux; mrb_value *ptr; @@ -239,6 +239,7 @@ MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset); * @param head Beginning position of a replacement subsequence. * @param len Length of a replacement subsequence. * @param rpl The array of replacement elements. + * It is possible to pass `mrb_undef_value()` instead of an empty array. * @return The receiver array. */ MRB_API mrb_value mrb_ary_splice(mrb_state *mrb, mrb_value self, mrb_int head, mrb_int len, mrb_value rpl); @@ -291,6 +292,9 @@ MRB_API mrb_value mrb_ary_join(mrb_state *mrb, mrb_value ary, mrb_value sep); */ MRB_API mrb_value mrb_ary_resize(mrb_state *mrb, mrb_value ary, mrb_int new_len); +/* helper functions */ +mrb_value mrb_ary_subseq(mrb_state *mrb, mrb_value ary, mrb_int beg, mrb_int len); + MRB_END_DECL #endif /* MRUBY_ARRAY_H */ diff --git a/include/mruby/boxing_nan.h b/include/mruby/boxing_nan.h index af598e34e..fae3b7630 100644 --- a/include/mruby/boxing_nan.h +++ b/include/mruby/boxing_nan.h @@ -20,6 +20,7 @@ #endif #define MRB_FIXNUM_SHIFT 0 +#define MRB_SYMBOL_SHIFT 0 /* value representation by nan-boxing: * float : FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF @@ -43,6 +44,9 @@ typedef struct mrb_value { }; ) }; +#ifdef MRB_64BIT + struct RCptr *vp; +#endif } value; }; } mrb_value; @@ -53,13 +57,15 @@ typedef struct mrb_value { #define mrb_type(o) (enum mrb_vtype)((uint32_t)0xfff00000 < (o).value.ttt ? mrb_tt(o) : MRB_TT_FLOAT) #define mrb_ptr(o) ((void*)((((uintptr_t)0x3fffffffffff)&((uintptr_t)((o).value.p)))<<2)) #define mrb_float(o) (o).f -#define mrb_cptr(o) mrb_ptr(o) #define mrb_fixnum(o) (o).value.i #define mrb_symbol(o) (o).value.sym #ifdef MRB_64BIT +MRB_API mrb_value mrb_nan_boxing_cptr_value(struct mrb_state*, void*); +#define mrb_cptr(o) (((struct RCptr*)mrb_ptr(o))->p) #define BOXNAN_SHIFT_LONG_POINTER(v) (((uintptr_t)(v)>>34)&0x3fff) #else +#define mrb_cptr(o) ((o).value.p) #define BOXNAN_SHIFT_LONG_POINTER(v) 0 #endif @@ -89,7 +95,11 @@ typedef struct mrb_value { #define SET_INT_VALUE(r,n) BOXNAN_SET_VALUE(r, MRB_TT_FIXNUM, value.i, (n)) #define SET_SYM_VALUE(r,v) BOXNAN_SET_VALUE(r, MRB_TT_SYMBOL, value.sym, (v)) #define SET_OBJ_VALUE(r,v) BOXNAN_SET_OBJ_VALUE(r, (((struct RObject*)(v))->tt), (v)) -#define SET_CPTR_VALUE(mrb,r,v) BOXNAN_SET_OBJ_VALUE(r, MRB_TT_CPTR, v) +#ifdef MRB_64BIT +#define SET_CPTR_VALUE(mrb,r,v) ((r) = mrb_nan_boxing_cptr_value(mrb, v)) +#else +#define SET_CPTR_VALUE(mrb,r,v) BOXNAN_SET_VALUE(r, MRB_TT_CPTR, value.p, v) +#endif #define SET_UNDEF_VALUE(r) BOXNAN_SET_VALUE(r, MRB_TT_UNDEF, value.i, 0) #endif /* MRUBY_BOXING_NAN_H */ diff --git a/include/mruby/boxing_no.h b/include/mruby/boxing_no.h index 19372b587..7573428e6 100644 --- a/include/mruby/boxing_no.h +++ b/include/mruby/boxing_no.h @@ -8,6 +8,7 @@ #define MRUBY_BOXING_NO_H #define MRB_FIXNUM_SHIFT 0 +#define MRB_SYMBOL_SHIFT 0 union mrb_value_union { #ifndef MRB_WITHOUT_FLOAT diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h index d763ffaf8..c0d7087e0 100644 --- a/include/mruby/boxing_word.h +++ b/include/mruby/boxing_word.h @@ -7,10 +7,6 @@ #ifndef MRUBY_BOXING_WORD_H #define MRUBY_BOXING_WORD_H -#if defined(MRB_INT16) -# error MRB_INT16 is too small for MRB_WORD_BOXING. -#endif - #if defined(MRB_INT64) && !defined(MRB_64BIT) #error MRB_INT64 cannot be used with MRB_WORD_BOXING in 32-bit mode. #endif @@ -22,11 +18,6 @@ struct RFloat { }; #endif -struct RCptr { - MRB_OBJECT_HEADER; - void *p; -}; - enum mrb_special_consts { MRB_Qnil = 0, MRB_Qfalse = 4, @@ -34,41 +25,46 @@ enum mrb_special_consts { MRB_Qundef = 20, }; -#define MRB_FIXNUM_SHIFT 1 -#define MRB_SYMBOL_SHIFT 2 -#define MRB_FIXNUM_FLAG (1 << (MRB_FIXNUM_SHIFT - 1)) -#define MRB_SYMBOL_FLAG (1 << (MRB_SYMBOL_SHIFT - 1)) -#define MRB_FIXNUM_MASK ((1 << MRB_FIXNUM_SHIFT) - 1) -#define MRB_SYMBOL_MASK ((1 << MRB_SYMBOL_SHIFT) - 1) -#define MRB_IMMEDIATE_MASK 0x07 +#if defined(MRB_64BIT) && defined(MRB_INT32) +#define MRB_FIXNUM_SHIFT 0 +#else +#define MRB_FIXNUM_SHIFT BOXWORD_FIXNUM_SHIFT +#endif +#define MRB_SYMBOL_SHIFT BOXWORD_SYMBOL_SHIFT +#define BOXWORD_FIXNUM_BIT_POS 1 +#define BOXWORD_SYMBOL_BIT_POS 2 +#define BOXWORD_FIXNUM_SHIFT BOXWORD_FIXNUM_BIT_POS #ifdef MRB_64BIT -#define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT) -#define MRB_SYMBOL_MAX UINT32_MAX +#define BOXWORD_SYMBOL_SHIFT 0 #else -#define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT - MRB_SYMBOL_SHIFT) -#define MRB_SYMBOL_MAX (UINT32_MAX >> MRB_SYMBOL_SHIFT) +#define BOXWORD_SYMBOL_SHIFT BOXWORD_SYMBOL_BIT_POS #endif +#define BOXWORD_FIXNUM_FLAG (1 << (BOXWORD_FIXNUM_BIT_POS - 1)) +#define BOXWORD_SYMBOL_FLAG (1 << (BOXWORD_SYMBOL_BIT_POS - 1)) +#define BOXWORD_FIXNUM_MASK ((1 << BOXWORD_FIXNUM_BIT_POS) - 1) +#define BOXWORD_SYMBOL_MASK ((1 << BOXWORD_SYMBOL_BIT_POS) - 1) +#define BOXWORD_IMMEDIATE_MASK 0x07 #define BOXWORD_SHIFT_VALUE(o,n,t) \ - ((((t)(o).w)) >> MRB_##n##_SHIFT) + (t)(((long)(o).w) >> BOXWORD_##n##_SHIFT) #define BOXWORD_SET_SHIFT_VALUE(o,n,v) \ - ((o).w = (((unsigned long)(v)) << MRB_##n##_SHIFT) | MRB_##n##_FLAG) + ((o).w = (((unsigned long)(v)) << BOXWORD_##n##_SHIFT) | BOXWORD_##n##_FLAG) #define BOXWORD_SHIFT_VALUE_P(o,n) \ - (((o).w & MRB_##n##_MASK) == MRB_##n##_FLAG) + (((o).w & BOXWORD_##n##_MASK) == BOXWORD_##n##_FLAG) #define BOXWORD_OBJ_TYPE_P(o,n) \ (!mrb_immediate_p(o) && (o).value.bp->tt == MRB_TT_##n) /* * mrb_value representation: * - * nil : ...0000 0000 (all bits are zero) - * false : ...0000 0100 + * nil : ...0000 0000 (all bits are 0) + * false : ...0000 0100 (mrb_fixnum(v) != 0) * true : ...0000 1100 * undef : ...0001 0100 * fixnum: ...IIII III1 - * symbol: ...SSSS SS10 (high-order 32-bit are symbol value in 64-bit mode) - * object: ...PPPP P000 + * symbol: ...SSSS SS10 (use only upper 32-bit as symbol value on 64-bit CPU) + * object: ...PPPP P000 (any bits are 1) */ typedef union mrb_value { union { @@ -114,10 +110,10 @@ MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float); #endif #define mrb_bool(o) (((o).w & ~(unsigned long)MRB_Qfalse) != 0) -#define mrb_immediate_p(o) ((o).w & MRB_IMMEDIATE_MASK || (o).w == MRB_Qnil) +#define mrb_immediate_p(o) ((o).w & BOXWORD_IMMEDIATE_MASK || (o).w == MRB_Qnil) #define mrb_fixnum_p(o) BOXWORD_SHIFT_VALUE_P(o, FIXNUM) #ifdef MRB_64BIT -#define mrb_symbol_p(o) ((o).value.sym_flag == MRB_SYMBOL_FLAG) +#define mrb_symbol_p(o) ((o).value.sym_flag == BOXWORD_SYMBOL_FLAG) #else #define mrb_symbol_p(o) BOXWORD_SHIFT_VALUE_P(o, SYMBOL) #endif @@ -159,7 +155,7 @@ MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float); #define SET_BOOL_VALUE(r,b) ((b) ? SET_TRUE_VALUE(r) : SET_FALSE_VALUE(r)) #define SET_INT_VALUE(r,n) BOXWORD_SET_SHIFT_VALUE(r, FIXNUM, n) #ifdef MRB_64BIT -#define SET_SYM_VALUE(r,v) ((r).value.sym = v, (r).value.sym_flag = MRB_SYMBOL_FLAG) +#define SET_SYM_VALUE(r,v) ((r).value.sym = v, (r).value.sym_flag = BOXWORD_SYMBOL_FLAG) #else #define SET_SYM_VALUE(r,n) BOXWORD_SET_SHIFT_VALUE(r, SYMBOL, n) #endif diff --git a/include/mruby/class.h b/include/mruby/class.h index 7c925f3b3..cbf96fef2 100644 --- a/include/mruby/class.h +++ b/include/mruby/class.h @@ -90,10 +90,17 @@ mrb_value mrb_instance_new(mrb_state *mrb, mrb_value cv); void mrb_class_name_class(mrb_state*, struct RClass*, struct RClass*, mrb_sym); mrb_bool mrb_const_name_p(mrb_state*, const char*, mrb_int); mrb_value mrb_class_find_path(mrb_state*, struct RClass*); +mrb_value mrb_mod_to_s(mrb_state*, mrb_value); void mrb_gc_mark_mt(mrb_state*, struct RClass*); size_t mrb_gc_mark_mt_size(mrb_state*, struct RClass*); void mrb_gc_free_mt(mrb_state*, struct RClass*); +#ifdef MRB_METHOD_CACHE +void mrb_mc_clear_by_class(mrb_state *mrb, struct RClass* c); +#else +#define mrb_mc_clear_by_class(mrb,c) +#endif + MRB_END_DECL #endif /* MRUBY_CLASS_H */ diff --git a/include/mruby/common.h b/include/mruby/common.h index 5be9a40c6..f704ef8df 100644 --- a/include/mruby/common.h +++ b/include/mruby/common.h @@ -74,6 +74,16 @@ MRB_BEGIN_DECL #endif #endif +/** Declare mingw versions */ +#if defined(__MINGW32__) || defined(__MINGW64__) +# include <_mingw.h> +# if defined(__MINGW64_VERSION_MAJOR) +# define MRB_MINGW64_VERSION (__MINGW64_VERSION_MAJOR * 1000 + __MINGW64_VERSION_MINOR) +# elif defined(__MINGW32_MAJOR_VERSION) +# define MRB_MINGW32_VERSION (__MINGW32_MAJOR_VERSION * 1000 + __MINGW32_MINOR_VERSION) +# endif +#endif + MRB_END_DECL #endif /* MRUBY_COMMON_H */ diff --git a/include/mruby/compile.h b/include/mruby/compile.h index ac9a9892a..7b878d460 100644 --- a/include/mruby/compile.h +++ b/include/mruby/compile.h @@ -33,7 +33,7 @@ typedef struct mrbc_context { mrb_bool no_exec:1; mrb_bool keep_lv:1; mrb_bool no_optimize:1; - mrb_bool on_eval:1; + struct RProc *upper; size_t parser_nerr; } mrbc_context; @@ -151,8 +151,8 @@ struct mrb_parser_state { mrb_ast_node *tree; mrb_bool no_optimize:1; - mrb_bool on_eval:1; mrb_bool capture_errors:1; + struct RProc *upper; struct mrb_parser_message error_buffer[10]; struct mrb_parser_message warn_buffer[10]; @@ -161,6 +161,7 @@ struct mrb_parser_state { uint16_t current_filename_index; struct mrb_jmpbuf* jmp; + mrb_ast_node *nvars; }; MRB_API struct mrb_parser_state* mrb_parser_new(mrb_state*); @@ -179,7 +180,15 @@ MRB_API struct mrb_parser_state* mrb_parse_nstring(mrb_state*,const char*,size_t MRB_API struct RProc* mrb_generate_code(mrb_state*, struct mrb_parser_state*); MRB_API mrb_value mrb_load_exec(mrb_state *mrb, struct mrb_parser_state *p, mrbc_context *c); -/* program load functions */ +/** program load functions +* Please note! Currently due to interactions with the GC calling these functions will +* leak one RProc object per function call. +* To prevent this save the current memory arena before calling and restore the arena +* right after, like so +* int ai = mrb_gc_arena_save(mrb); +* mrb_value status = mrb_load_string(mrb, buffer); +* mrb_gc_arena_restore(mrb, ai); +*/ #ifndef MRB_DISABLE_STDIO MRB_API mrb_value mrb_load_file(mrb_state*,FILE*); MRB_API mrb_value mrb_load_file_cxt(mrb_state*,FILE*, mrbc_context *cxt); diff --git a/include/mruby/dump.h b/include/mruby/dump.h index 46c3b63ce..db3e287d3 100644 --- a/include/mruby/dump.h +++ b/include/mruby/dump.h @@ -17,10 +17,6 @@ MRB_BEGIN_DECL #define DUMP_DEBUG_INFO 1 -#define DUMP_ENDIAN_BIG 2 -#define DUMP_ENDIAN_LIL 4 -#define DUMP_ENDIAN_NAT 6 -#define DUMP_ENDIAN_MASK 6 int mrb_dump_irep(mrb_state *mrb, mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *bin_size); #ifndef MRB_DISABLE_STDIO @@ -52,8 +48,7 @@ MRB_API mrb_irep *mrb_read_irep_buf(mrb_state*, const void*, size_t); /* Rite Binary File header */ #define RITE_BINARY_IDENT "RITE" -#define RITE_BINARY_IDENT_LIL "ETIR" -#define RITE_BINARY_FORMAT_VER "0006" +#define RITE_BINARY_FORMAT_VER "0007" #define RITE_COMPILER_NAME "MATZ" #define RITE_COMPILER_VERSION "0000" @@ -106,17 +101,6 @@ struct rite_binary_footer { RITE_SECTION_HEADER; }; -static inline int -bigendian_p() -{ - int i; - char *p; - - i = 1; - p = (char*)&i; - return p[0]?0:1; -} - static inline size_t uint8_to_bin(uint8_t s, uint8_t *bin) { diff --git a/include/mruby/irep.h b/include/mruby/irep.h index 4393129c7..661ef2b48 100644 --- a/include/mruby/irep.h +++ b/include/mruby/irep.h @@ -49,6 +49,16 @@ typedef struct mrb_irep { MRB_API mrb_irep *mrb_add_irep(mrb_state *mrb); +/** load mruby bytecode functions +* Please note! Currently due to interactions with the GC calling these functions will +* leak one RProc object per function call. +* To prevent this save the current memory arena before calling and restore the arena +* right after, like so +* int ai = mrb_gc_arena_save(mrb); +* mrb_value status = mrb_load_irep(mrb, buffer); +* mrb_gc_arena_restore(mrb, ai); +*/ + /* @param [const uint8_t*] irep code, expected as a literal */ MRB_API mrb_value mrb_load_irep(mrb_state*, const uint8_t*); diff --git a/include/mruby/numeric.h b/include/mruby/numeric.h index a176d96cd..06a33cc6f 100644 --- a/include/mruby/numeric.h +++ b/include/mruby/numeric.h @@ -37,6 +37,7 @@ MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, mrb_int base); /* ArgumentError if format string doesn't match /%(\.[0-9]+)?[aAeEfFgG]/ */ #ifndef MRB_WITHOUT_FLOAT MRB_API mrb_value mrb_float_to_str(mrb_state *mrb, mrb_value x, const char *fmt); +MRB_API int mrb_float_to_cstr(mrb_state *mrb, char *buf, size_t len, const char *fmt, mrb_float f); MRB_API mrb_float mrb_to_flo(mrb_state *mrb, mrb_value x); MRB_API mrb_value mrb_int_value(mrb_state *mrb, mrb_float f); #endif diff --git a/include/mruby/ops.h b/include/mruby/ops.h index 2327c33fd..c8990ae43 100644 --- a/include/mruby/ops.h +++ b/include/mruby/ops.h @@ -115,3 +115,4 @@ OPCODE(EXT1, Z) /* make 1st operand 16bit */ OPCODE(EXT2, Z) /* make 2nd operand 16bit */ OPCODE(EXT3, Z) /* make 1st and 2nd operands 16bit */ OPCODE(STOP, Z) /* stop VM */ +OPCODE(LOADI16, BS) /* R(a) = mrb_int(b) */ diff --git a/include/mruby/string.h b/include/mruby/string.h index 9039aaab3..93c94ef5d 100644 --- a/include/mruby/string.h +++ b/include/mruby/string.h @@ -23,9 +23,9 @@ struct RString { MRB_OBJECT_HEADER; union { struct { - mrb_int len; + mrb_ssize len; union { - mrb_int capa; + mrb_ssize capa; struct mrb_shared_string *shared; struct RString *fshared; } aux; @@ -54,7 +54,7 @@ struct RStringEmbed { RSTR_SET_EMBED_LEN((s),(n));\ }\ else {\ - (s)->as.heap.len = (mrb_int)(n);\ + (s)->as.heap.len = (mrb_ssize)(n);\ }\ } while (0) #define RSTR_EMBED_PTR(s) (((struct RStringEmbed*)(s))->ary) @@ -115,8 +115,8 @@ MRB_API mrb_int mrb_str_strlen(mrb_state*, struct RString*); #define MRB_STR_POOL 16 /* status flags from here */ #define MRB_STR_ASCII 32 #define MRB_STR_EMBED_LEN_SHIFT 6 -#define MRB_STR_EMBED_LEN_BITSIZE 5 -#define MRB_STR_EMBED_LEN_MASK (((1 << MRB_STR_EMBED_LEN_BITSIZE) - 1) << MRB_STR_EMBED_LEN_SHIFT) +#define MRB_STR_EMBED_LEN_BIT 5 +#define MRB_STR_EMBED_LEN_MASK (((1 << MRB_STR_EMBED_LEN_BIT) - 1) << MRB_STR_EMBED_LEN_SHIFT) #define MRB_STR_TYPE_MASK (MRB_STR_POOL - 1) @@ -447,7 +447,7 @@ MRB_API int mrb_str_cmp(mrb_state *mrb, mrb_value str1, mrb_value str2); */ MRB_API char *mrb_str_to_cstr(mrb_state *mrb, mrb_value str); -mrb_value mrb_str_pool(mrb_state *mrb, mrb_value str); +mrb_value mrb_str_pool(mrb_state *mrb, const char *s, mrb_int len, mrb_bool nofree); uint32_t mrb_str_hash(mrb_state *mrb, mrb_value str); mrb_value mrb_str_dump(mrb_state *mrb, mrb_value str); @@ -465,7 +465,8 @@ mrb_bool mrb_str_beg_len(mrb_int str_len, mrb_int *begp, mrb_int *lenp); mrb_value mrb_str_byte_subseq(mrb_state *mrb, mrb_value str, mrb_int beg, mrb_int len); #ifdef MRB_UTF8_STRING -mrb_int mrb_utf8_len(const char *str, mrb_int byte_len); +mrb_int mrb_utf8len(const char *str, const char *end); +mrb_int mrb_utf8_strlen(const char *str, mrb_int byte_len); #endif MRB_END_DECL diff --git a/include/mruby/value.h b/include/mruby/value.h index 84ea7fb0a..33c70f15a 100644 --- a/include/mruby/value.h +++ b/include/mruby/value.h @@ -34,10 +34,6 @@ typedef uint32_t mrb_sym; typedef uint8_t mrb_bool; struct mrb_state; -#if defined(MRB_INT16) && defined(MRB_INT64) -# error "You can't define MRB_INT16 and MRB_INT64 at the same time." -#endif - #if defined _MSC_VER && _MSC_VER < 1800 # define PRIo64 "llo" # define PRId64 "lld" @@ -63,14 +59,6 @@ struct mrb_state; # define MRB_PRIo PRIo64 # define MRB_PRId PRId64 # define MRB_PRIx PRIx64 -#elif defined(MRB_INT16) - typedef int16_t mrb_int; -# define MRB_INT_BIT 16 -# define MRB_INT_MIN (INT16_MIN>>MRB_FIXNUM_SHIFT) -# define MRB_INT_MAX (INT16_MAX>>MRB_FIXNUM_SHIFT) -# define MRB_PRIo PRIo16 -# define MRB_PRId PRId16 -# define MRB_PRIx PRIx16 #else typedef int32_t mrb_int; # define MRB_INT_BIT 32 @@ -161,6 +149,13 @@ typedef void mrb_value; #endif +#if defined(MRB_WORD_BOXING) || (defined(MRB_NAN_BOXING) && defined(MRB_64BIT)) +struct RCptr { + MRB_OBJECT_HEADER; + void *p; +}; +#endif + #if defined(MRB_NAN_BOXING) #include "boxing_nan.h" #elif defined(MRB_WORD_BOXING) @@ -169,9 +164,15 @@ typedef void mrb_value; #include "boxing_no.h" #endif -#if !defined(MRB_SYMBOL_BITSIZE) -#define MRB_SYMBOL_BITSIZE (sizeof(mrb_sym) * CHAR_BIT) -#define MRB_SYMBOL_MAX UINT32_MAX +#define MRB_SYMBOL_BIT (sizeof(mrb_sym) * CHAR_BIT - MRB_SYMBOL_SHIFT) +#define MRB_SYMBOL_MAX (UINT32_MAX >> MRB_SYMBOL_SHIFT) + +#if INTPTR_MAX < MRB_INT_MAX + typedef intptr_t mrb_ssize; +# define MRB_SSIZE_MAX (INTPTR_MAX>>MRB_FIXNUM_SHIFT) +#else + typedef mrb_int mrb_ssize; +# define MRB_SSIZE_MAX MRB_INT_MAX #endif #ifndef mrb_immediate_p diff --git a/include/mruby/version.h b/include/mruby/version.h index 1c7655a47..f4ef21021 100644 --- a/include/mruby/version.h +++ b/include/mruby/version.h @@ -42,12 +42,12 @@ MRB_BEGIN_DECL /* * Minor release version number. */ -#define MRUBY_RELEASE_MINOR 0 +#define MRUBY_RELEASE_MINOR 1 /* * Tiny release version number. */ -#define MRUBY_RELEASE_TEENY 1 +#define MRUBY_RELEASE_TEENY 0 /* * The mruby version. @@ -67,12 +67,12 @@ MRB_BEGIN_DECL /* * Release month. */ -#define MRUBY_RELEASE_MONTH 4 +#define MRUBY_RELEASE_MONTH 11 /* * Release day. */ -#define MRUBY_RELEASE_DAY 4 +#define MRUBY_RELEASE_DAY 19 /* * Release date as a string. |
