diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-04-22 16:44:39 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2020-04-22 16:44:39 +0900 |
| commit | 87d1bbe94794304d92fc9a4af5cf17eab5d1534c (patch) | |
| tree | 820e8b289e58db55ea4a3b298d2af4e7a8fba0bc /src | |
| parent | 2e661e82d16cc1d68cf9415b3d4c872fdd798745 (diff) | |
| download | mruby-87d1bbe94794304d92fc9a4af5cf17eab5d1534c.tar.gz mruby-87d1bbe94794304d92fc9a4af5cf17eab5d1534c.zip | |
Add new function `mrb_singleton_class_ptr()`; ref #4973
The difference between `mrb_singleton_class` and `mrb_singleton_class_ptr`:
- `mrb_singleton_class_ptr` returns `struct RClass*`.
- `mrb_singleton_class_ptr` returns `NULL` on immediate values where
`mrb_singleton_class` raises exceptions.
Diffstat (limited to 'src')
| -rw-r--r-- | src/class.c | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/src/class.c b/src/class.c index c49f0f474..b0af74e74 100644 --- a/src/class.c +++ b/src/class.c @@ -1242,33 +1242,45 @@ mrb_mod_dummy_visibility(mrb_state *mrb, mrb_value mod) return mod; } -MRB_API mrb_value -mrb_singleton_class(mrb_state *mrb, mrb_value v) +/* returns mrb_class_ptr(mrb_singleton_class()) */ +/* except that it return NULL for immediate values */ +MRB_API struct RClass* +mrb_singleton_class_ptr(mrb_state *mrb, mrb_value v) { struct RBasic *obj; switch (mrb_type(v)) { case MRB_TT_FALSE: if (mrb_nil_p(v)) - return mrb_obj_value(mrb->nil_class); - return mrb_obj_value(mrb->false_class); + return mrb->nil_class; + return mrb->false_class; case MRB_TT_TRUE: - return mrb_obj_value(mrb->true_class); + return mrb->true_class; case MRB_TT_CPTR: - return mrb_obj_value(mrb->object_class); + return mrb->object_class; case MRB_TT_SYMBOL: case MRB_TT_FIXNUM: #ifndef MRB_WITHOUT_FLOAT case MRB_TT_FLOAT: #endif - mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton"); - return mrb_nil_value(); /* not reached */ + return NULL; default: break; } obj = mrb_basic_ptr(v); prepare_singleton_class(mrb, obj); - return mrb_obj_value(obj->c); + return obj->c; +} + +MRB_API mrb_value +mrb_singleton_class(mrb_state *mrb, mrb_value v) +{ + struct RClass *c = mrb_singleton_class_ptr(mrb, v); + + if (c == NULL) { + mrb_raise(mrb, E_TYPE_ERROR, "can't define singleton"); + } + return mrb_obj_value(c); } MRB_API void |
