4 ** See Copyright Notice in mruby.h
8 #include <mruby/string.h>
9 #include <mruby/data.h>
10 #include <mruby/class.h>
13 mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *ptr, const mrb_data_type *type)
17 data = (struct RData*)mrb_obj_alloc(mrb, MRB_TT_DATA, klass);
25 mrb_data_check_type(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
27 if (!mrb_data_p(obj)) {
28 mrb_check_type(mrb, obj, MRB_TT_DATA);
30 if (DATA_TYPE(obj) != type) {
31 const mrb_data_type *t2 = DATA_TYPE(obj);
34 mrb_raisef(mrb, E_TYPE_ERROR, "wrong argument type %s (expected %s)",
35 t2->struct_name, type->struct_name);
38 mrb_raisef(mrb, E_TYPE_ERROR, "uninitialized %t (expected %s)",
39 obj, type->struct_name);
45 mrb_data_check_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
47 if (!mrb_data_p(obj)) {
50 if (DATA_TYPE(obj) != type) {
57 mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)
59 mrb_data_check_type(mrb, obj, type);
64 mrb_obj_to_sym(mrb_state *mrb, mrb_value name)
66 if (mrb_symbol_p(name)) return mrb_symbol(name);
67 if (mrb_string_p(name)) return mrb_intern_str(mrb, name);
68 mrb_raisef(mrb, E_TYPE_ERROR, "%!v is not a symbol nor a string", name);
69 return 0; /* not reached */
73 #ifdef MRB_WITHOUT_FLOAT
74 mrb_fixnum_id(mrb_int f)
76 mrb_float_id(mrb_float f)
79 const char *p = (const char*)&f;
83 #ifndef MRB_WITHOUT_FLOAT
84 /* normalize -0.0 to 0.0 */
97 mrb_obj_id(mrb_value obj)
99 mrb_int tt = mrb_type(obj);
101 #define MakeID2(p,t) (mrb_int)(((intptr_t)(p))^(t))
102 #define MakeID(p) MakeID2(p,tt)
107 return MakeID(0); /* not define */
115 return MakeID(mrb_symbol(obj));
117 #ifdef MRB_WITHOUT_FLOAT
118 return MakeID(mrb_fixnum_id(mrb_fixnum(obj)));
120 return MakeID2(mrb_float_id((mrb_float)mrb_fixnum(obj)), MRB_TT_FLOAT);
122 return MakeID(mrb_float_id(mrb_float(obj)));
134 case MRB_TT_EXCEPTION:
138 return MakeID(mrb_ptr(obj));
142 #if defined(MRB_NAN_BOXING) && defined(MRB_64BIT)
143 #define mrb_xxx_boxing_cptr_value mrb_nan_boxing_cptr_value
146 #ifdef MRB_WORD_BOXING
147 #define mrb_xxx_boxing_cptr_value mrb_word_boxing_cptr_value
149 #ifndef MRB_WITHOUT_FLOAT
151 mrb_word_boxing_float_value(mrb_state *mrb, mrb_float f)
155 v.value.p = mrb_obj_alloc(mrb, MRB_TT_FLOAT, mrb->float_class);
157 MRB_SET_FROZEN_FLAG(v.value.bp);
162 mrb_word_boxing_float_pool(mrb_state *mrb, mrb_float f)
164 struct RFloat *nf = (struct RFloat *)mrb_malloc(mrb, sizeof(struct RFloat));
165 nf->tt = MRB_TT_FLOAT;
166 nf->c = mrb->float_class;
168 MRB_SET_FROZEN_FLAG(nf);
169 return mrb_obj_value(nf);
171 #endif /* MRB_WITHOUT_FLOAT */
172 #endif /* MRB_WORD_BOXING */
174 #if defined(MRB_WORD_BOXING) || (defined(MRB_NAN_BOXING) && defined(MRB_64BIT))
176 mrb_xxx_boxing_cptr_value(mrb_state *mrb, void *p)
179 struct RCptr *cptr = (struct RCptr*)mrb_obj_alloc(mrb, MRB_TT_CPTR, mrb->object_class);
181 SET_OBJ_VALUE(v, cptr);
187 #if defined _MSC_VER && _MSC_VER < 1900
191 mrb_msvc_va_copy(va_list *dest, va_list src)
195 #define va_copy(dest, src) mrb_msvc_va_copy(&(dest), src)
199 mrb_msvc_vsnprintf(char *s, size_t n, const char *format, va_list arg)
204 if (n == 0 || (cnt = _vsnprintf_s(s, n, _TRUNCATE, format, argcp)) < 0) {
205 cnt = _vscprintf(format, arg);
212 mrb_msvc_snprintf(char *s, size_t n, const char *format, ...)
216 va_start(arg, format);
217 ret = mrb_msvc_vsnprintf(s, n, format, arg);
222 #endif /* defined _MSC_VER && _MSC_VER < 1900 */