summaryrefslogtreecommitdiffhomepage
path: root/src/etc.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2016-02-04 23:22:01 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2016-02-04 23:22:01 +0900
commit5e514c910fdde7ec29c9110e8c9535d8e83b2a8f (patch)
tree85bc7f67f92b92b23a63b5baa2766a18189b3760 /src/etc.c
parent4344ca0acab1196ccdc515d181259003fb0cfe94 (diff)
downloadmruby-5e514c910fdde7ec29c9110e8c9535d8e83b2a8f.tar.gz
mruby-5e514c910fdde7ec29c9110e8c9535d8e83b2a8f.zip
cache mrb_regexp_p(); ref #980
Diffstat (limited to 'src/etc.c')
-rw-r--r--src/etc.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/etc.c b/src/etc.c
index 0ad56fe96..183e2f070 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -179,7 +179,18 @@ mrb_word_boxing_cptr_value(mrb_state *mrb, void *p)
MRB_API mrb_bool
mrb_regexp_p(mrb_state *mrb, mrb_value v)
{
- return mrb_class_defined(mrb, REGEXP_CLASS) && mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS));
+ if (mrb->flags & MRB_STATE_NO_REGEXP) {
+ return FALSE;
+ }
+ if ((mrb->flags & MRB_STATE_REGEXP) || mrb_class_defined(mrb, REGEXP_CLASS)) {
+ mrb->flags |= MRB_STATE_REGEXP;
+ return mrb_obj_is_kind_of(mrb, v, mrb_class_get(mrb, REGEXP_CLASS));
+ }
+ else {
+ mrb->flags |= MRB_STATE_REGEXP;
+ mrb->flags |= MRB_STATE_NO_REGEXP;
+ }
+ return FALSE;
}
#if defined _MSC_VER && _MSC_VER < 1900