diff --git a/error.c b/error.c index b898183..93e5e7c 100644 --- a/error.c +++ b/error.c @@ -1597,6 +1597,7 @@ rb_mod_sys_fail(VALUE mod, const char *mesg) { VALUE exc = make_errno_exc(mesg); rb_extend_object(exc, mod); + FL_SET(CLASS_OF(exc), RCLASS_EPHEMERAL); rb_exc_raise(exc); } @@ -1605,6 +1606,7 @@ rb_mod_syserr_fail(VALUE mod, int e, const char *mesg) { VALUE exc = rb_syserr_new(e, mesg); rb_extend_object(exc, mod); + FL_SET(CLASS_OF(exc), RCLASS_EPHEMERAL); rb_exc_raise(exc); } diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c index 3122c0e..5c197d1 100644 --- a/ext/openssl/ossl_ssl.c +++ b/ext/openssl/ossl_ssl.c @@ -1076,6 +1076,7 @@ write_would_block(int nonblock) if (nonblock) { VALUE exc = ossl_exc_new(eSSLError, "write would block"); rb_extend_object(exc, rb_mWaitWritable); + FL_SET(CLASS_OF(exc), RCLASS_EPHEMERAL); rb_exc_raise(exc); } } @@ -1086,6 +1087,7 @@ read_would_block(int nonblock) if (nonblock) { VALUE exc = ossl_exc_new(eSSLError, "read would block"); rb_extend_object(exc, rb_mWaitReadable); + FL_SET(CLASS_OF(exc), RCLASS_EPHEMERAL); rb_exc_raise(exc); } } diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h index c8790df..143cd07 100644 --- a/include/ruby/ruby.h +++ b/include/ruby/ruby.h @@ -621,6 +621,7 @@ struct RClass { struct st_table *m_tbl; struct st_table *iv_index_tbl; }; +#define RCLASS_EPHEMERAL FL_USER1 #define RCLASS_IV_TBL(c) (RCLASS(c)->ptr->iv_tbl) #define RCLASS_CONST_TBL(c) (RCLASS(c)->ptr->const_tbl) #define RCLASS_M_TBL(c) (RCLASS(c)->m_tbl) diff --git a/vm_method.c b/vm_method.c index 2087371..a771992 100644 --- a/vm_method.c +++ b/vm_method.c @@ -85,6 +85,10 @@ rb_clear_cache_by_class(VALUE klass) { struct cache_entry *ent, *end; + /* ephemeral class does not write to cache */ + if (FL_TEST(klass, RCLASS_EPHEMERAL)) + return; + rb_vm_change_state(); if (!ruby_running) @@ -417,8 +421,9 @@ rb_method_entry_get_without_cache(VALUE klass, ID id) { rb_method_entry_t *me = search_method(klass, id); - if (ruby_running) { + if (ruby_running && ! FL_TEST(klass, RCLASS_EPHEMERAL)) { struct cache_entry *ent; + ent = cache + EXPR1(klass, id); ent->klass = klass;