diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-09-03 09:00:52 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2004-09-03 09:00:52 +0000 |
commit | 880d7af47a66f021712eac17adffac2686d08aad (patch) | |
tree | 71f148de518815dc3548c36896ad0ad142e9015a | |
parent | 7cf8256075020e1dd80800807e3d92f3350511e6 (diff) | |
download | ruby-880d7af47a66f021712eac17adffac2686d08aad.tar.gz |
* 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-- | ChangeLog | 5 | ||||
-rw-r--r-- | bignum.c | 8 | ||||
-rw-r--r-- | eval.c | 34 | ||||
-rw-r--r-- | math.c | 23 | ||||
-rw-r--r-- | struct.c | 8 |
5 files changed, 43 insertions, 35 deletions
@@ -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 @@ -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)); } @@ -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; @@ -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); @@ -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); |