summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorKOBAYASHI Shuji <[email protected]>2019-09-22 22:17:40 +0900
committerKOBAYASHI Shuji <[email protected]>2019-09-22 22:36:12 +0900
commit5dda4f5da357bba4c3db057b9d0ae93019835b6a (patch)
tree3b8b1fa4f0e8050e283d7860c6fbf6a7790e1d27 /include
parent7f044341f9f5c227d7c13c9c8ac2e9b00c8ed287 (diff)
downloadmruby-5dda4f5da357bba4c3db057b9d0ae93019835b6a.tar.gz
mruby-5dda4f5da357bba4c3db057b9d0ae93019835b6a.zip
Implement all type predicate macros for `MRB_WORD_BOXING`
The default implementations of type predicate macros use `mrb_type`. But `mrb_type` with `MRB_WORD_BOXING` isn't very efficient, so the new implementations avoid `mrb_type`.
Diffstat (limited to 'include')
-rw-r--r--include/mruby/boxing_word.h10
-rw-r--r--include/mruby/value.h12
2 files changed, 22 insertions, 0 deletions
diff --git a/include/mruby/boxing_word.h b/include/mruby/boxing_word.h
index 7fda4919d..22d549687 100644
--- a/include/mruby/boxing_word.h
+++ b/include/mruby/boxing_word.h
@@ -56,6 +56,8 @@ enum mrb_special_consts {
((o).w = (((unsigned long)(v)) << MRB_##n##_SHIFT) | MRB_##n##_FLAG)
#define BOXWORD_SHIFT_VALUE_P(o,n) \
(((o).w & MRB_##n##_MASK) == MRB_##n##_FLAG)
+#define BOXWORD_OBJ_TYPE_P(o,n) \
+ (!mrb_immediate_p(o) && (o).value.bp->tt == MRB_TT_##n)
/*
* mrb_value representation:
@@ -123,6 +125,14 @@ MRB_API mrb_value mrb_word_boxing_float_pool(struct mrb_state*, mrb_float);
#define mrb_nil_p(o) ((o).w == MRB_Qnil)
#define mrb_false_p(o) ((o).w == MRB_Qfalse)
#define mrb_true_p(o) ((o).w == MRB_Qtrue)
+#ifndef MRB_WITHOUT_FLOAT
+#define mrb_float_p(o) BOXWORD_OBJ_TYPE_P(o, FLOAT)
+#endif
+#define mrb_array_p(o) BOXWORD_OBJ_TYPE_P(o, ARRAY)
+#define mrb_string_p(o) BOXWORD_OBJ_TYPE_P(o, STRING)
+#define mrb_hash_p(o) BOXWORD_OBJ_TYPE_P(o, HASH)
+#define mrb_cptr_p(o) BOXWORD_OBJ_TYPE_P(o, CPTR)
+#define mrb_exception_p(o) BOXWORD_OBJ_TYPE_P(o, EXCEPTION)
#ifndef MRB_WITHOUT_FLOAT
#define SET_FLOAT_VALUE(mrb,r,v) ((r) = mrb_word_boxing_float_value(mrb, v))
diff --git a/include/mruby/value.h b/include/mruby/value.h
index 831334b9d..56dc20d79 100644
--- a/include/mruby/value.h
+++ b/include/mruby/value.h
@@ -197,13 +197,25 @@ typedef void mrb_value;
#define MRB_SYMBOL_MAX UINT32_MAX
#endif
#ifndef MRB_WITHOUT_FLOAT
+#ifndef mrb_float_p
#define mrb_float_p(o) (mrb_type(o) == MRB_TT_FLOAT)
#endif
+#endif
+#ifndef mrb_array_p
#define mrb_array_p(o) (mrb_type(o) == MRB_TT_ARRAY)
+#endif
+#ifndef mrb_string_p
#define mrb_string_p(o) (mrb_type(o) == MRB_TT_STRING)
+#endif
+#ifndef mrb_hash_p
#define mrb_hash_p(o) (mrb_type(o) == MRB_TT_HASH)
+#endif
+#ifndef mrb_cptr_p
#define mrb_cptr_p(o) (mrb_type(o) == MRB_TT_CPTR)
+#endif
+#ifndef mrb_exception_p
#define mrb_exception_p(o) (mrb_type(o) == MRB_TT_EXCEPTION)
+#endif
#define mrb_test(o) mrb_bool(o)
/**