summaryrefslogtreecommitdiff
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
commit880d7af47a66f021712eac17adffac2686d08aad (patch)
tree71f148de518815dc3548c36896ad0ad142e9015a
parent7cf8256075020e1dd80800807e3d92f3350511e6 (diff)
* struct.c (make_struct): remove redefining constant when
conflict. [ruby-dev:24210] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6854 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--bignum.c8
-rw-r--r--eval.c34
-rw-r--r--math.c23
-rw-r--r--struct.c8
5 files changed, 43 insertions, 35 deletions
diff --git a/ChangeLog b/ChangeLog
index 7d1a1b492a..e14357c40f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri Sep 3 17:47:58 2004 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * struct.c (make_struct): remove redefining constant when
+ conflict. [ruby-dev:24210]
+
Fri Sep 3 11:31:44 2004 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
* ext/tk/lib/tk.rb: Tk.after makes TkCore::INTERP.tk_cmd_tbl grow
diff --git a/bignum.c b/bignum.c
index 5f008544c0..accd14d958 100644
--- a/bignum.c
+++ b/bignum.c
@@ -1752,15 +1752,17 @@ rb_big_or(xx, yy)
*/
VALUE
-rb_big_xor(x, y)
- VALUE x, y;
+rb_big_xor(xx, yy)
+ VALUE xx, yy;
{
+ volatile VALUE x, y;
VALUE z;
BDIGIT *ds1, *ds2, *zds;
long i, l1, l2;
char sign;
- y = rb_to_int(y);
+ x = xx;
+ y = rb_to_int(yy);
if (FIXNUM_P(y)) {
y = rb_int2big(FIX2LONG(y));
}
diff --git a/eval.c b/eval.c
index 3829be617f..46c687dc4e 100644
--- a/eval.c
+++ b/eval.c
@@ -1717,37 +1717,6 @@ rb_eval_cmd(cmd, arg, level)
return val;
}
-static VALUE
-superclass(self, node)
- VALUE self;
- NODE *node;
-{
- VALUE val = Qnil; /* OK */
- int state;
-
- PUSH_TAG(PROT_NONE);
- if ((state = EXEC_TAG()) == 0) {
- val = rb_eval(self, node);
- }
- POP_TAG();
- if (state) {
- switch (nd_type(node)) {
- case NODE_COLON2:
- rb_raise(rb_eTypeError, "undefined superclass `%s'",
- rb_id2name(node->nd_mid));
- case NODE_CONST:
- rb_raise(rb_eTypeError, "undefined superclass `%s'",
- rb_id2name(node->nd_vid));
- default:
- break;
- }
- JUMP_TAG(state);
- }
- rb_check_inheritable(val);
-
- return val;
-}
-
#define ruby_cbase (ruby_cref->nd_clss)
static VALUE
@@ -3772,7 +3741,8 @@ rb_eval(self, n)
rb_raise(rb_eTypeError, "no outer class/module");
}
if (node->nd_super) {
- super = superclass(self, node->nd_super);
+ super = rb_eval(self, node->nd_super);
+ rb_check_inheritable(super);
}
else {
super = 0;
diff --git a/math.c b/math.c
index 5b9294e781..cea7bb801d 100644
--- a/math.c
+++ b/math.c
@@ -333,6 +333,28 @@ math_log(obj, x)
/*
* call-seq:
+ * Math.log2(numeric) => float
+ *
+ * Returns the base 2 logarithm of <i>numeric</i>.
+ */
+
+static VALUE
+math_log2(obj, x)
+ VALUE obj, x;
+{
+ double d;
+
+ Need_Float(x);
+ errno = 0;
+ d = log2(RFLOAT(x)->value);
+ if (errno) {
+ rb_sys_fail("log2");
+ }
+ return rb_float_new(d);
+}
+
+/*
+ * call-seq:
* Math.log10(numeric) => float
*
* Returns the base 10 logarithm of <i>numeric</i>.
@@ -511,6 +533,7 @@ Init_Math()
rb_define_module_function(rb_mMath, "exp", math_exp, 1);
rb_define_module_function(rb_mMath, "log", math_log, 1);
+ rb_define_module_function(rb_mMath, "log2", math_log, 1);
rb_define_module_function(rb_mMath, "log10", math_log10, 1);
rb_define_module_function(rb_mMath, "sqrt", math_sqrt, 1);
diff --git a/struct.c b/struct.c
index e629f9827d..b47d647490 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);