1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* variable.c (rb_obj_remove_instance_variable): raise NameError if

specified instance variable is not defined.

* variable.c (generic_ivar_remove): modified to check ivar
  existence.

* file.c (rb_file_s_extname): new method based on the proposal
  (and patch) from Mike Hall. [new]

* eval.c (error_handle): default to 1 unless status is set.

* eval.c (ruby_options): guard error_handle() with PROT_NONE.

* eval.c (ruby_stop): ditto.

* math.c (math_acosh): added. [new]

* math.c (math_asinh): ditto.

* math.c (math_atanh): ditto.

* struct.c (rb_struct_each_pair): method added. [new]

* class.c (rb_singleton_class): wrong condition; was creating
  unnecessary singleton class.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@2348 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
matz 2002-04-10 08:45:26 +00:00
parent ff0abdc55e
commit 19c42c0740
14 changed files with 209 additions and 146 deletions

View file

@ -1,3 +1,12 @@
<<<<<<< ChangeLog
Wed Apr 10 17:30:19 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* variable.c (rb_obj_remove_instance_variable): raise NameError if
specified instance variable is not defined.
* variable.c (generic_ivar_remove): modified to check ivar
existence.
Wed Apr 10 14:16:45 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* misc/ruby-mode.el (ruby-font-lock-keywords): fontify symbols for
@ -29,6 +38,11 @@ Tue Apr 9 05:17:48 2002 Akinori MUSHA <knu@iDaemons.org>
* re.c (match_select): fix index references and make
MatchData#select actually work.
Tue Apr 9 00:20:52 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* file.c (rb_file_s_extname): new method based on the proposal
(and patch) from Mike Hall. [new]
Mon Apr 8 04:50:51 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* eval.c (error_handle): default to 1 unless status is set.
@ -37,6 +51,27 @@ Mon Apr 8 04:50:51 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* eval.c (ruby_stop): ditto.
Mon Apr 8 01:22:24 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* math.c (math_acosh): added. [new]
* math.c (math_asinh): ditto.
* math.c (math_atanh): ditto.
* struct.c (rb_struct_each_pair): method added. [new]
Sat Apr 6 02:04:49 2002 Guy Decoux <ts@moulon.inra.fr>
* class.c (rb_singleton_class): wrong condition; was creating
unnecessary singleton class.
Sat Apr 6 01:09:41 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* sprintf.c (remove_sign_bits): simplifies the condition.
* bignum.c (get2comp): calculate proper carry over.
Fri Apr 5 05:07:28 2002 Takaaki Tateishi <ttate@kt.jaist.ac.jp>
* ext/dl: Add dl/struct.rb.
@ -46,9 +81,9 @@ Thu Apr 4 14:08:52 2002 Takaaki Tateishi <ttate@kt.jaist.ac.jp>
* ext/dl/lib/dl/import.rb: Get rid of ineffective
encoding/decoding procedures.
Wed Apr 3 15:37:24 2002 Takaaki Tateishi <ttate@kt.jaist.ac.jp>
Thu Apr 4 01:08:23 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* ext/dl: Add dl/types.rb.
* numeric.c (int_step): step may be a float less than 1.
Wed Apr 3 20:42:34 2002 Takaaki Tateishi <ttate@kt.jaist.ac.jp>
@ -56,6 +91,10 @@ Wed Apr 3 20:42:34 2002 Takaaki Tateishi <ttate@kt.jaist.ac.jp>
* ext/dl/dl.h: define StringValuePtr for ruby-1.6.
Wed Apr 3 15:37:24 2002 Takaaki Tateishi <ttate@kt.jaist.ac.jp>
* ext/dl: Add dl/types.rb.
Wed Apr 3 01:54:10 2002 Nobuyoshi Nakada <nobu.nakada@nifty.ne.jp>
* ext/extmk.rb.in (enable_config): follow lib/mkmf.rb.

View file

@ -20,26 +20,12 @@ VALUE rb_cBignum;
#define USHORT _USHORT
#endif
#if SIZEOF_INT*2 <= SIZEOF_LONG_LONG
typedef unsigned int BDIGIT;
typedef unsigned LONG_LONG BDIGIT_DBL;
typedef LONG_LONG BDIGIT_DBL_SIGNED;
#elif SIZEOF_INT*2 <= SIZEOF_LONG
typedef unsigned int BDIGIT;
typedef unsigned long BDIGIT_DBL;
typedef LONG_LONG BDIGIT_DBL_SIGNED;
#else
typedef unsigned short BDIGIT;
typedef unsigned long BDIGIT_DBL;
typedef long BDIGIT_DBL_SIGNED;
#endif
#define BDIGITS(x) ((BDIGIT*)RBIGNUM(x)->digits)
#define BITSPERDIG (sizeof(BDIGIT)*CHAR_BIT)
#define BITSPERDIG (SIZEOF_BDIGITS*CHAR_BIT)
#define BIGRAD ((BDIGIT_DBL)1 << BITSPERDIG)
#define DIGSPERLONG ((unsigned int)(sizeof(long)/sizeof(BDIGIT)))
#define DIGSPERLONG ((unsigned int)(SIZEOF_LONG/SIZEOF_BDIGITS))
#if HAVE_LONG_LONG
# define DIGSPERLL ((unsigned int)(sizeof(LONG_LONG)/sizeof(BDIGIT)))
# define DIGSPERLL ((unsigned int)(SIZEOF_LONG_LONG/SIZEOF_BDIGITS))
#endif
#define BIGUP(x) ((BDIGIT_DBL)(x) << BITSPERDIG)
#define BIGDN(x) RSHIFT(x,BITSPERDIG)
@ -89,14 +75,10 @@ get2comp(x, carry) /* get 2's complement */
num = BIGDN(num);
} while (i < RBIGNUM(x)->len);
if (!carry) return;
if (ds[0] == 1 || ds[0] == 0) {
if (RBIGNUM(x)->len == 1) return;
for (i=1; i<RBIGNUM(x)->len; i++) {
if (ds[i] != 0) return;
}
if ((ds[RBIGNUM(x)->len-1] & (1<<(BITSPERDIG-1))) == 0) {
REALLOC_N(RBIGNUM(x)->digits, BDIGIT, RBIGNUM(x)->len++);
ds = BDIGITS(x);
ds[RBIGNUM(x)->len-1] = 1;
ds[RBIGNUM(x)->len-1] = ~0;
}
}
@ -118,7 +100,7 @@ bignorm(x)
while (len-- && !ds[len]) ;
RBIGNUM(x)->len = ++len;
if (len*sizeof(BDIGIT) <= sizeof(VALUE)) {
if (len*SIZEOF_BDIGITS <= sizeof(VALUE)) {
long num = 0;
while (len--) {
num = BIGUP(num) + ds[len];
@ -200,7 +182,7 @@ rb_int2inum(n)
#ifdef HAVE_LONG_LONG
#define DIGSPERLONGLONG ((unsigned int)(sizeof(LONG_LONG)/sizeof(BDIGIT)))
#define DIGSPERLONGLONG ((unsigned int)(SIZEOF_LONG_LONG/SIZEOF_BDIGITS))
void
rb_quad_pack(buf, val)
@ -224,7 +206,7 @@ rb_quad_pack(buf, val)
q += ds[len];
}
}
memcpy(buf, (char*)&q, sizeof(LONG_LONG));
memcpy(buf, (char*)&q, SIZEOF_LONG_LONG);
}
VALUE
@ -238,7 +220,7 @@ rb_quad_unpack(buf, sign)
BDIGIT *digits;
VALUE big;
memcpy(&q, buf, sizeof(LONG_LONG));
memcpy(&q, buf, SIZEOF_LONG_LONG);
if (sign) {
if (FIXABLE((LONG_LONG)q)) return INT2FIX((LONG_LONG)q);
if ((LONG_LONG)q < 0) {
@ -284,7 +266,7 @@ rb_quad_pack(buf, val)
if (FIXNUM_P(val)) {
val = rb_int2big(FIX2LONG(val));
}
len = RBIGNUM(val)->len * sizeof(BDIGIT);
len = RBIGNUM(val)->len * SIZEOF_BDIGITS;
if (len > QUAD_SIZE) len = QUAD_SIZE;
memcpy(buf, (char*)BDIGITS(val), len);
if (!RBIGNUM(val)->sign) {
@ -296,14 +278,14 @@ rb_quad_pack(buf, val)
}
}
#define BNEG(b) (RSHIFT(((BDIGIT*)b)[QUAD_SIZE/sizeof(BDIGIT)-1],BITSPERDIG-1) != 0)
#define BNEG(b) (RSHIFT(((BDIGIT*)b)[QUAD_SIZE/SIZEOF_BDIGITS-1],BITSPERDIG-1) != 0)
VALUE
rb_quad_unpack(buf, sign)
const char *buf;
int sign;
{
VALUE big = bignew(QUAD_SIZE/sizeof(BDIGIT), 1);
VALUE big = bignew(QUAD_SIZE/SIZEOF_BDIGITS, 1);
memcpy((char*)BDIGITS(big), buf, QUAD_SIZE);
if (sign && BNEG(buf)) {
@ -607,19 +589,19 @@ rb_big2str(x, base)
i = RBIGNUM(x)->len;
if (i == 0) return rb_str_new2("0");
if (base == 10) {
j = (sizeof(BDIGIT)/sizeof(char)*CHAR_BIT*i*241L)/800+2;
j = (SIZEOF_BDIGITS/sizeof(char)*CHAR_BIT*i*241L)/800+2;
hbase = 10000;
}
else if (base == 16) {
j = (sizeof(BDIGIT)/sizeof(char)*CHAR_BIT*i)/4+2;
j = (SIZEOF_BDIGITS/sizeof(char)*CHAR_BIT*i)/4+2;
hbase = 0x10000;
}
else if (base == 8) {
j = (sizeof(BDIGIT)/sizeof(char)*CHAR_BIT*i)+2;
j = (SIZEOF_BDIGITS/sizeof(char)*CHAR_BIT*i)+2;
hbase = 010000;
}
else if (base == 2) {
j = (sizeof(BDIGIT)*CHAR_BIT*i)+2;
j = (SIZEOF_BDIGITS*CHAR_BIT*i)+2;
hbase = 020;
}
else {
@ -682,7 +664,7 @@ big2ulong(x, type)
BDIGIT_DBL num;
BDIGIT *ds;
if (len > sizeof(long)/sizeof(BDIGIT))
if (len > SIZEOF_LONG/SIZEOF_BDIGITS)
rb_raise(rb_eRangeError, "bignum too big to convert into `%s'", type);
ds = BDIGITS(x);
num = 0;
@ -727,7 +709,7 @@ big2ull(x, type)
BDIGIT_DBL num;
BDIGIT *ds;
if (len > sizeof(LONG_LONG)/sizeof(BDIGIT))
if (len > SIZEOF_LONG_LONG/SIZEOF_BDIGITS)
rb_raise(rb_eRangeError, "bignum too big to convert into `%s'", type);
ds = BDIGITS(x);
num = 0;
@ -1715,7 +1697,7 @@ static VALUE
rb_big_size(big)
VALUE big;
{
return INT2FIX(RBIGNUM(big)->len*sizeof(BDIGIT));
return INT2FIX(RBIGNUM(big)->len*SIZEOF_BDIGITS);
}
static VALUE

View file

@ -695,8 +695,8 @@ rb_singleton_class(obj)
DEFER_INTS;
if (FL_TEST(RBASIC(obj)->klass, FL_SINGLETON) &&
(BUILTIN_TYPE(obj) == T_CLASS || BUILTIN_TYPE(obj) == T_MODULE) &&
rb_iv_get(RBASIC(obj)->klass, "__attached__") == obj) {
((BUILTIN_TYPE(obj) != T_CLASS && BUILTIN_TYPE(obj) != T_MODULE) ||
rb_iv_get(RBASIC(obj)->klass, "__attached__") == obj)) {
klass = RBASIC(obj)->klass;
}
else {

View file

@ -64,6 +64,23 @@ void xfree _((void*));
# define SIZEOF_LONG_LONG SIZEOF___INT64
#endif
#if SIZEOF_INT*2 <= SIZEOF_LONG_LONG
# define BDIGIT unsigned int
# define SIZEOF_BDIGITS SIZEOF_INT
# define BDIGIT_DBL unsigned LONG_LONG
# define BDIGIT_DBL_SIGNED LONG_LONG
#elif SIZEOF_INT*2 <= SIZEOF_LONG
# define BDIGIT unsigned int
# define SIZEOF_BDIGITS SIZEOF_INT
# define BDIGIT_DBL unsigned long
# define BDIGIT_DBL_SIGNED long
#else
# define BDIGIT unsigned short
# define SIZEOF_BDIGITS SIZEOF_SHORT
# define BDIGIT_DBL unsigned long
# define BDIGIT_DBL_SIGNED long
#endif
/* define RUBY_USE_EUC/SJIS for default kanji-code */
#ifndef DEFAULT_KCODE
#if defined(MSDOS) || defined(__CYGWIN__) || defined(__human68k__) || defined(__MACOS__) || defined(__EMX__) || defined(OS2) || defined(NT)

View file

@ -770,7 +770,7 @@ ruby_connect(fd, sockaddr, len, socks)
case EAGAIN:
#ifdef EINPROGRESS
case EINPROGRESS:
#if defined __CYGWIN__
#ifdef __CYGWIN__
case EALREADY:
wait_in_progress = 10;
#endif
@ -2224,6 +2224,10 @@ sock_s_unpack_sockaddr_in(self, addr)
struct sockaddr_in * sockaddr;
sockaddr = (struct sockaddr_in*)StringValuePtr(addr);
if (RSTRING(addr)->len != sizeof(struct sockaddr_in)) {
rb_raise(rb_eTypeError, "sockaddr_in size differs - %d required; %d given",
RSTRING(addr)->len, sizeof(struct sockaddr_in));
}
return rb_assoc_new(INT2NUM(ntohs(sockaddr->sin_port)), mkipaddr(sockaddr));
}
@ -2251,6 +2255,10 @@ sock_s_unpack_sockaddr_un(self, addr)
struct sockaddr_un * sockaddr;
sockaddr = (struct sockaddr_un*)StringValuePtr(addr);
if (RSTRING(addr)->len != sizeof(struct sockaddr_un)) {
rb_raise(rb_eTypeError, "sockaddr_un size differs - %d required; %d given",
RSTRING(addr)->len, sizeof(struct sockaddr_un));
}
/* xxx: should I check against sun_path size? */
return rb_tainted_str_new2(sockaddr->sun_path);
}

27
file.c
View file

@ -1564,9 +1564,9 @@ rmext(p, e)
{
int l1, l2;
l1 = strlen(p);
if (!e) return 0;
l1 = strlen(p);
l2 = strlen(e);
if (l2 == 2 && e[1] == '*') {
e = strrchr(p, *e);
@ -1628,10 +1628,32 @@ rb_file_s_dirname(klass, fname)
if (p == name)
p++;
dirname = rb_str_new(name, p - name);
if (OBJ_TAINTED(fname)) OBJ_TAINT(dirname);
OBJ_INFECT(dirname, fname);
return dirname;
}
static VALUE
rb_file_s_extname(klass, fname)
VALUE klass, fname;
{
char *name, *p, *e;
VALUE extname;
name = StringValuePtr(fname);
p = strrdirsep(name); /* get the last path component */
if (!p)
p = name;
else
p++;
e = strrchr(p, '.'); /* get the last dot of the last component */
if (!e || e == p) /* no dot, or the only dot is first? */
return rb_str_new2("");
extname = rb_str_new2(e); /* keep the dot, too! */
OBJ_INFECT(extname, fname);
return extname;
}
static VALUE
rb_file_s_split(klass, path)
VALUE klass, path;
@ -2559,6 +2581,7 @@ Init_File()
rb_define_singleton_method(rb_cFile, "expand_path", rb_file_s_expand_path, -1);
rb_define_singleton_method(rb_cFile, "basename", rb_file_s_basename, -1);
rb_define_singleton_method(rb_cFile, "dirname", rb_file_s_dirname, 1);
rb_define_singleton_method(rb_cFile, "extname", rb_file_s_extname, 1);
separator = rb_obj_freeze(rb_str_new2("/"));
rb_define_const(rb_cFile, "Separator", separator);

View file

@ -137,6 +137,7 @@ class CGI
end
def update
return unless @hash
@f.rewind
for k,v in @hash
@f.printf "%s=%s\n", CGI::escape(k), CGI::escape(String(v))

View file

@ -20,14 +20,6 @@
double strtod();
#endif
#if SIZEOF_INT*2 <= SIZEOF_LONG_LONG || SIZEOF_INT*2 <= SIZEOF_LONG
typedef unsigned int BDIGIT;
#define SIZEOF_BDIGITS SIZEOF_INT
#else
typedef unsigned short BDIGIT;
#define SIZEOF_BDIGITS SIZEOF_SHORT
#endif
#define BITSPERSHORT (2*CHAR_BIT)
#define SHORTMASK ((1<<BITSPERSHORT)-1)
#define SHORTDN(x) RSHIFT(x,BITSPERSHORT)

28
math.c
View file

@ -112,6 +112,30 @@ math_tanh(obj, x)
return rb_float_new(tanh(RFLOAT(x)->value));
}
static VALUE
math_acosh(obj, x)
VALUE obj, x;
{
Need_Float(x);
return rb_float_new(acosh(RFLOAT(x)->value));
}
static VALUE
math_asinh(obj, x)
VALUE obj, x;
{
Need_Float(x);
return rb_float_new(asinh(RFLOAT(x)->value));
}
static VALUE
math_atanh(obj, x)
VALUE obj, x;
{
Need_Float(x);
return rb_float_new(atanh(RFLOAT(x)->value));
}
static VALUE
math_exp(obj, x)
VALUE obj, x;
@ -212,6 +236,10 @@ Init_Math()
rb_define_module_function(rb_mMath, "sinh", math_sinh, 1);
rb_define_module_function(rb_mMath, "tanh", math_tanh, 1);
rb_define_module_function(rb_mMath, "acosh", math_acosh, 1);
rb_define_module_function(rb_mMath, "asinh", math_asinh, 1);
rb_define_module_function(rb_mMath, "atanh", math_atanh, 1);
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, "log10", math_log10, 1);

View file

@ -1483,7 +1483,7 @@ int_step(from, to, step)
VALUE i = from;
ID cmp;
if (NUM2INT(step) == 0) {
if (rb_equal(step, INT2FIX(0))) {
rb_raise(rb_eArgError, "step cannot be 0");
}

106
sprintf.c
View file

@ -26,78 +26,26 @@ remove_sign_bits(str, base)
int base;
{
char *s, *t, *end;
int len;
s = t = str;
end = str + strlen(str);
len = strlen(str);
end = str + len;
if (base == 16) {
x_retry:
switch (*t) {
case 'c': case 'C':
*t = '4';
break;
case 'd': case 'D':
*t = '5';
break;
case 'e': case 'E':
*t = '2';
break;
case 'f': case 'F':
if (t[1] > '8') {
t++;
goto x_retry;
}
*t = '1';
break;
case '1':
case '3':
case '7':
if (t[1] > '8') {
t++;
goto x_retry;
}
break;
}
switch (*t) {
case '1': *t = 'f'; break;
case '2': *t = 'e'; break;
case '3': *t = 'f'; break;
case '4': *t = 'c'; break;
case '5': *t = 'd'; break;
case '6': *t = 'e'; break;
case '7': *t = 'f'; break;
while (t<end && *t == 'f') {
t++;
}
}
else if (base == 8) {
o_retry:
switch (*t) {
case '6':
*t = '2';
break;
case '7':
if (t[1] > '3') {
t++;
goto o_retry;
}
*t = '1';
break;
case '1':
case '3':
if (t[1] > '3') {
t++;
goto o_retry;
}
break;
}
switch (*t) {
case '1': *t = '7'; break;
case '2': *t = '6'; break;
case '3': *t = '7'; break;
while (t<end && *t == '7') {
t++;
}
}
else if (base == 2) {
while (t<end && *t == '1') t++;
t--;
while (t<end && *t == '1') {
t++;
}
}
while (*t) *s++ = *t++;
*s = '\0';
@ -398,12 +346,12 @@ rb_f_sprintf(argc, argv)
case T_BIGNUM:
bignum = 1;
break;
default:
v = NUM2LONG(val);
break;
case T_FIXNUM:
v = FIX2LONG(val);
break;
default:
v = NUM2LONG(val);
break;
}
if (*p == 'u' || *p == 'd' || *p == 'i') base = 10;
@ -454,8 +402,7 @@ rb_f_sprintf(argc, argv)
remove_sign_bits(s, base);
switch (base) {
case 16:
d = 'f';
break;
d = 'f'; break;
case 8:
d = '7'; break;
}
@ -493,24 +440,27 @@ rb_f_sprintf(argc, argv)
val = rb_big2str(val, base);
s = RSTRING(val)->ptr;
if (*s == '-') {
remove_sign_bits(++s, base);
val = rb_str_new(0, 3+strlen(s));
t = RSTRING(val)->ptr;
if (base == 10) {
rb_warning("negative number for %%u specifier");
s++;
}
else {
remove_sign_bits(++s, base);
val = rb_str_new(0, 3+strlen(s));
t = RSTRING(val)->ptr;
strcpy(t, "..");
t += 2;
}
switch (base) {
case 16:
if (s[0] != 'f') strcpy(t++, "f"); break;
case 8:
if (s[0] != '7') strcpy(t++, "7"); break;
switch (base) {
case 16:
if (s[0] != 'f') strcpy(t++, "f"); break;
case 8:
if (s[0] != '7') strcpy(t++, "7"); break;
case 2:
if (s[0] != '1') strcpy(t++, "1"); break;
}
strcpy(t, s);
bignum = 2;
}
strcpy(t, s);
bignum = 2;
}
s = RSTRING(val)->ptr;

View file

@ -333,6 +333,23 @@ rb_struct_each(s)
return s;
}
static VALUE
rb_struct_each_pair(s)
VALUE s;
{
VALUE member;
long i;
member = rb_struct_iv_get(rb_obj_class(s), "__member__");
if (NIL_P(member)) {
rb_bug("non-initialized struct");
}
for (i=0; i<RSTRUCT(s)->len; i++) {
rb_yield(rb_assoc_new(RARRAY(member)->ptr[i], RSTRUCT(s)->ptr[i]));
}
return s;
}
static VALUE
rb_struct_to_s(s)
VALUE s;
@ -584,6 +601,7 @@ Init_Struct()
rb_define_method(rb_cStruct, "length", rb_struct_size, 0);
rb_define_method(rb_cStruct, "each", rb_struct_each, 0);
rb_define_method(rb_cStruct, "each_pair", rb_struct_each_pair, 0);
rb_define_method(rb_cStruct, "[]", rb_struct_aref, 1);
rb_define_method(rb_cStruct, "[]=", rb_struct_aset, 2);
rb_define_method(rb_cStruct, "select", rb_struct_select, -1);

View file

@ -259,7 +259,7 @@ rb_autoload_id(id, filename)
{
rb_secure(4);
if (!rb_is_const_id(id)) {
rb_name_error(id, "autoload must be constant name", rb_id2name(id));
rb_name_error(id, "autoload must be constant name");
}
if (!autoload_tbl) {
@ -845,22 +845,23 @@ generic_ivar_defined(obj, id)
return Qfalse;
}
static VALUE
generic_ivar_remove(obj, id)
static int
generic_ivar_remove(obj, id, valp)
VALUE obj;
ID id;
VALUE *valp;
{
st_table *tbl;
VALUE val;
int status;
if (!generic_iv_tbl) return Qnil;
if (!st_lookup(generic_iv_tbl, obj, &tbl)) return Qnil;
st_delete(tbl, &id, &val);
if (!generic_iv_tbl) return 0;
if (!st_lookup(generic_iv_tbl, obj, &tbl)) return 0;
status = st_delete(tbl, &id, valp);
if (tbl->num_entries == 0) {
st_delete(generic_iv_tbl, &obj, &tbl);
st_free_table(tbl);
}
return val;
return status;
}
void
@ -1052,16 +1053,20 @@ rb_obj_remove_instance_variable(obj, name)
case T_OBJECT:
case T_CLASS:
case T_MODULE:
if (ROBJECT(obj)->iv_tbl) {
st_delete(ROBJECT(obj)->iv_tbl, &id, &val);
if (ROBJECT(obj)->iv_tbl && st_delete(ROBJECT(obj)->iv_tbl, &id, &val)) {
return val;
}
break;
default:
if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj))
return generic_ivar_remove(obj, id);
if (FL_TEST(obj, FL_EXIVAR) || rb_special_const_p(obj)) {
if (generic_ivar_remove(obj, id, &val)) {
return val;
}
}
break;
}
return val;
rb_name_error(id, "instance variable %s not defined", rb_id2name(id));
return Qnil; /* not reached */
}
static int

View file

@ -1,4 +1,4 @@
#define RUBY_VERSION "1.7.2"
#define RUBY_RELEASE_DATE "2002-04-09"
#define RUBY_RELEASE_DATE "2002-04-10"
#define RUBY_VERSION_CODE 172
#define RUBY_RELEASE_CODE 20020409
#define RUBY_RELEASE_CODE 20020410