summaryrefslogtreecommitdiffstats
path: root/struct.c
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-03 09:00:52 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-09-03 09:00:52 +0000
commitf962544f0fee0c3b3af8d25e3a671ce7f4b92062 (patch)
tree71f148de518815dc3548c36896ad0ad142e9015a /struct.c
parent1ece9c7f20ffd30414bd2c23d84a6cd1d9e7fbbc (diff)
downloadruby-f962544f0fee0c3b3af8d25e3a671ce7f4b92062.tar.gz
ruby-f962544f0fee0c3b3af8d25e3a671ce7f4b92062.tar.xz
ruby-f962544f0fee0c3b3af8d25e3a671ce7f4b92062.zip
* struct.c (make_struct): remove redefining constant when
conflict. [ruby-dev:24210] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@6854 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'struct.c')
-rw-r--r--struct.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/struct.c b/struct.c
index e629f9827..b47d64749 100644
--- a/struct.c
+++ b/struct.c
@@ -177,6 +177,10 @@ make_struct(name, member, klass)
if (!rb_is_const_id(id)) {
rb_name_error(id, "identifier %s needs to be constant", cname);
}
+ if (rb_const_defined_at(klass, id)) {
+ rb_warn("redefining constant Struct::%s", cname);
+ rb_mod_remove_const(klass, ID2SYM(id));
+ }
nstr = rb_define_class_under(klass, cname, klass);
}
rb_iv_set(nstr, "__size__", LONG2NUM(RARRAY(member)->len));
@@ -455,6 +459,10 @@ inspect_struct(s)
if (NIL_P(member)) {
rb_bug("non-initialized struct");
}
+ if (RSTRUCT(s)->len != RARRAY(member)->len) {
+ rb_raise(rb_eTypeError, "struct size differs (%d required %d given)",
+ RARRAY(member)->len, RSTRUCT(s)->len);
+ }
str = rb_str_buf_new2("#<struct ");
rb_str_cat2(str, cname);