mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* insns.def (defineclass): check if cbase is a class or a module.
[ruby-core:16118] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@15894 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
9729ba32d0
commit
ccf20a6d3f
3 changed files with 23 additions and 8 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Thu Apr 3 19:59:42 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
|
* insns.def (defineclass): check if cbase is a class or a module.
|
||||||
|
[ruby-core:16118]
|
||||||
|
|
||||||
Thu Apr 3 14:42:11 2008 NAKAMURA Usaku <usa@ruby-lang.org>
|
Thu Apr 3 14:42:11 2008 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
* common.mk (INSNS): add insns_info.inc.
|
* common.mk (INSNS): add insns_info.inc.
|
||||||
|
|
|
@ -943,6 +943,8 @@ defineclass
|
||||||
cbase = vm_get_cbase(th);
|
cbase = vm_get_cbase(th);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vm_check_if_namespace(cbase);
|
||||||
|
|
||||||
/* find klass */
|
/* find klass */
|
||||||
if (rb_const_defined_at(cbase, id)) {
|
if (rb_const_defined_at(cbase, id)) {
|
||||||
/* already exist */
|
/* already exist */
|
||||||
|
@ -981,6 +983,8 @@ defineclass
|
||||||
cbase = vm_get_cbase(th);
|
cbase = vm_get_cbase(th);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vm_check_if_namespace(cbase);
|
||||||
|
|
||||||
/* find klass */
|
/* find klass */
|
||||||
if (rb_const_defined_at(cbase, id)) {
|
if (rb_const_defined_at(cbase, id)) {
|
||||||
klass = rb_const_get_at(cbase, id);
|
klass = rb_const_get_at(cbase, id);
|
||||||
|
|
|
@ -976,6 +976,19 @@ vm_getspecial(rb_thread_t *th, VALUE *lfp, VALUE key, rb_num_t type)
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
vm_check_if_namespace(VALUE klass)
|
||||||
|
{
|
||||||
|
switch (TYPE(klass)) {
|
||||||
|
case T_CLASS:
|
||||||
|
case T_MODULE:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rb_raise(rb_eTypeError, "%s is not a class/module",
|
||||||
|
RSTRING_PTR(rb_obj_as_string(klass)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline VALUE
|
static inline VALUE
|
||||||
vm_get_ev_const(rb_thread_t *th, rb_iseq_t *iseq,
|
vm_get_ev_const(rb_thread_t *th, rb_iseq_t *iseq,
|
||||||
VALUE klass, ID id, int is_defined)
|
VALUE klass, ID id, int is_defined)
|
||||||
|
@ -1030,14 +1043,7 @@ vm_get_ev_const(rb_thread_t *th, rb_iseq_t *iseq,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
switch (TYPE(klass)) {
|
vm_check_if_namespace(klass);
|
||||||
case T_CLASS:
|
|
||||||
case T_MODULE:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
rb_raise(rb_eTypeError, "%s is not a class/module",
|
|
||||||
RSTRING_PTR(rb_obj_as_string(klass)));
|
|
||||||
}
|
|
||||||
if (is_defined) {
|
if (is_defined) {
|
||||||
return rb_const_defined(klass, id);
|
return rb_const_defined(klass, id);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue