summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog24
-rw-r--r--ToDo2
-rw-r--r--bignum.c2
-rw-r--r--configure.in2
-rw-r--r--dir.c6
-rw-r--r--eval.c80
-rw-r--r--ext/tcltklib/tcltklib.c4
-rw-r--r--file.c5
-rw-r--r--lib/mkmf.rb2
-rw-r--r--marshal.c6
-rw-r--r--object.c27
-rw-r--r--ruby.h17
-rw-r--r--string.c7
-rw-r--r--variable.c3
-rw-r--r--version.h4
15 files changed, 133 insertions, 58 deletions
diff --git a/ChangeLog b/ChangeLog
index 78b0c6ec22..49193ba133 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,27 @@
+Fri May 11 02:00:44 2001 Ryo HAYASAKA <ryoh@jaist.ac.jp>
+
+ * bignum.c (bigdivrem): access boundary bug.
+
+Thu May 10 02:40:47 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * marshal.c (w_object): prohibit dumping out singleton classes.
+
+ * object.c (rb_mod_to_s): distinguish singleton classes.
+
+ * variable.c (rb_class2name): it's ok to reveal NilClass,
+ TrueClass, FalseClass.
+
+Wed May 9 14:38:33 2001 K.Kosako <kosako@sofnec.co.jp>
+
+ * eval.c (rb_yield_0): preserve and restore ruby_cref as well.
+
+Tue May 8 17:12:43 2001 K.Kosako <kosako@sofnec.co.jp>
+
+ * eval.c (is_defined): core dumped during instance_eval for
+ special constants.
+
+ * eval.c (rb_eval): ditto.
+
Mon May 7 15:58:45 2001 Yukihiro Matsumoto <matz@ruby-lang.org>
* parse.y (arg): "||=" should not warn for uninitialized instance
diff --git a/ToDo b/ToDo
index 517a2ea4db..7a22319bef 100644
--- a/ToDo
+++ b/ToDo
@@ -26,7 +26,6 @@ Language Spec.
* to_i returns nil if str contains no digit.
* raise exception by `` error
* jar like combined library package.
-* "@foo ||= 44" should not warn you.
Hacking Interpreter
@@ -83,6 +82,7 @@ Standard Libraries
* warn, warning for Ruby level
* hash etc. should handle self referenceing array/hash
* move NameError under StandardError.
+* library to load per-user profile seeking .ruby_profile or ruby.ini file.
Extension Libraries
diff --git a/bignum.c b/bignum.c
index 3ddc50c673..c58de5d5bb 100644
--- a/bignum.c
+++ b/bignum.c
@@ -920,7 +920,7 @@ bigdivrem(x, y, divp, modp)
if (modp) { /* just normalize remainder */
*modp = rb_big_clone(z);
zds = BDIGITS(*modp);
- while (!zds[ny-1]) ny--;
+ while (ny-- && !zds[ny]); ++ny;
if (dd) {
t2 = 0; i = ny;
while(i--) {
diff --git a/configure.in b/configure.in
index b275a2bcb1..c758a8d0dc 100644
--- a/configure.in
+++ b/configure.in
@@ -596,6 +596,8 @@ if test "$with_dln_a_out" != yes; then
rb_cv_dlopen=yes;;
sysv4*) LDSHARED='ld -G'
rb_cv_dlopen=yes;;
+ nto-qnx*) LDSHARED="qcc -shared"
+ rb_cv_dlopen=yes ;;
esix*|uxpds*) LDSHARED="ld -G"
rb_cv_dlopen=yes ;;
osf*) LDSHARED="$CC -shared"
diff --git a/dir.c b/dir.c
index 772d53fe01..a49b244756 100644
--- a/dir.c
+++ b/dir.c
@@ -134,13 +134,13 @@ range(pat, test, flags)
((s) == string || pathname && isdirsep(*(s))))
static int
fnmatch(pat, string, flags)
- char *pat;
- char *string;
+ const char *pat;
+ const char *string;
int flags;
{
int c;
int test;
- char *s = string;
+ const char *s = string;
int escape = !(flags & FNM_NOESCAPE);
int pathname = flags & FNM_PATHNAME;
int period = flags & FNM_PERIOD;
diff --git a/eval.c b/eval.c
index 1901e8511d..5e6d4d0d46 100644
--- a/eval.c
+++ b/eval.c
@@ -173,6 +173,8 @@ print_undef(klass, id)
rb_class2name(klass));
}
+static ID removed, singleton_removed, undefined, singleton_undefined;
+
#define CACHE_SIZE 0x800
#define CACHE_MASK 0x7ff
#define EXPR1(c,m) ((((c)>>3)^(m))&CACHE_MASK)
@@ -319,6 +321,13 @@ remove_method(klass, mid)
rb_id2name(mid), rb_class2name(klass));
}
rb_clear_cache_by_id(mid);
+ if (FL_TEST(klass, FL_SINGLETON)) {
+ rb_funcall(rb_iv_get(klass, "__attached__"),
+ singleton_removed, 1, ID2SYM(mid));
+ }
+ else {
+ rb_funcall(klass, removed, 1, ID2SYM(mid));
+ }
}
void
@@ -435,8 +444,8 @@ rb_method_boundp(klass, id, ex)
return Qfalse;
}
-static ID init, eqq, each, aref, aset, match, to_ary;
-static ID missing, added, singleton_added;
+static ID init, eqq, each, aref, aset, match, to_ary, missing;
+static ID added, singleton_added;
static ID __id__, __send__;
void
@@ -1539,6 +1548,13 @@ rb_undef(klass, id)
}
rb_add_method(klass, id, 0, NOEX_PUBLIC);
rb_clear_cache_by_id(id);
+ if (FL_TEST(klass, FL_SINGLETON)) {
+ rb_funcall(rb_iv_get(klass, "__attached__"),
+ singleton_undefined, 1, ID2SYM(id));
+ }
+ else {
+ rb_funcall(klass, undefined, 1, ID2SYM(id));
+ }
}
static VALUE
@@ -1582,6 +1598,13 @@ rb_alias(klass, name, def)
st_insert(RCLASS(klass)->m_tbl, name,
NEW_METHOD(NEW_FBODY(body, def, origin), orig->nd_noex));
rb_clear_cache_by_id(name);
+ if (FL_TEST(klass, FL_SINGLETON)) {
+ rb_funcall(rb_iv_get(klass, "__attached__"),
+ singleton_added, 1, ID2SYM(name));
+ }
+ else {
+ rb_funcall(klass, added, 1, ID2SYM(name));
+ }
}
static VALUE
@@ -1808,6 +1831,12 @@ is_defined(self, node, buf)
break;
case NODE_CVAR:
+ if (NIL_P(ruby_cbase)) {
+ if (rb_cvar_defined(CLASS_OF(self), node->nd_vid)) {
+ return "class variable";
+ }
+ break;
+ }
if (!FL_TEST(ruby_cbase, FL_SINGLETON)) {
if (rb_cvar_defined(ruby_cbase, node->nd_vid)) {
return "class variable";
@@ -2725,6 +2754,10 @@ rb_eval(self, n)
break;
case NODE_CVAR: /* normal method */
+ if (NIL_P(ruby_cbase)) {
+ result = rb_cvar_get(CLASS_OF(self), node->nd_vid);
+ break;
+ }
if (!FL_TEST(ruby_cbase, FL_SINGLETON)) {
result = rb_cvar_get(ruby_cbase, node->nd_vid);
break;
@@ -3022,7 +3055,6 @@ rb_eval(self, n)
rb_raise(rb_eTypeError, "no class to make alias");
}
rb_alias(ruby_class, node->nd_new, node->nd_old);
- rb_funcall(ruby_class, added, 1, ID2SYM(node->nd_mid));
result = Qnil;
break;
@@ -3498,6 +3530,7 @@ rb_yield_0(val, self, klass, acheck)
{
NODE *node;
volatile VALUE result = Qnil;
+ volatile VALUE old_cref;
struct BLOCK *block;
struct SCOPE *old_scope;
struct FRAME frame;
@@ -3514,6 +3547,8 @@ rb_yield_0(val, self, klass, acheck)
frame = block->frame;
frame.prev = ruby_frame;
ruby_frame = &(frame);
+ old_cref = (VALUE)ruby_cref;
+ ruby_cref = (NODE*)ruby_frame->cbase;
old_scope = ruby_scope;
ruby_scope = block->scope;
ruby_block = block->prev;
@@ -3612,6 +3647,7 @@ rb_yield_0(val, self, klass, acheck)
POP_VARS();
ruby_block = block;
ruby_frame = ruby_frame->prev;
+ ruby_cref = (NODE*)old_cref;
if (ruby_scope->flags & SCOPE_DONT_RECYCLE)
scope_dup(old_scope);
ruby_scope = old_scope;
@@ -4876,6 +4912,12 @@ rb_f_eval(argc, argv, self)
int line = 1;
rb_scan_args(argc, argv, "13", &src, &scope, &vfile, &vline);
+ if (ruby_safe_level >= 4) {
+ StringValue(src);
+ }
+ else {
+ SafeStringValue(src);
+ }
if (argc >= 3) {
file = StringValuePtr(vfile);
}
@@ -4883,12 +4925,6 @@ rb_f_eval(argc, argv, self)
line = NUM2INT(vline);
}
- if (ruby_safe_level >= 4) {
- StringValue(src);
- }
- else {
- SafeStringValue(src);
- }
if (NIL_P(scope) && ruby_frame->prev) {
struct FRAME *prev;
VALUE val;
@@ -5206,19 +5242,16 @@ rb_feature_p(feature, wait)
const char *feature;
int wait;
{
- VALUE *p, *pend;
+ VALUE v;
char *f;
- int len;
+ int i, len = strlen(feature);
- p = RARRAY(rb_features)->ptr;
- pend = p + RARRAY(rb_features)->len;
- while (p < pend) {
- VALUE v = *p;
+ for (i = 0; i < RARRAY(rb_features)->len; ++i) {
+ v = RARRAY(rb_features)->ptr[i];
f = StringValuePtr(v);
if (strcmp(f, feature) == 0) {
goto load_wait;
}
- len = strlen(feature);
if (strncmp(f, feature, len) == 0) {
if (strcmp(f+len, ".so") == 0) {
return Qtrue;
@@ -5228,7 +5261,6 @@ rb_feature_p(feature, wait)
return Qtrue;
}
}
- p++;
}
return Qfalse;
@@ -5551,13 +5583,6 @@ rb_mod_modfunc(argc, argv, module)
}
static VALUE
-rb_mod_included(module, include)
- VALUE module, include;
-{
- return Qnil;
-}
-
-static VALUE
rb_mod_append_features(module, include)
VALUE module, include;
{
@@ -5841,6 +5866,10 @@ Init_eval()
missing = rb_intern("method_missing");
added = rb_intern("method_added");
singleton_added = rb_intern("singleton_method_added");
+ removed = rb_intern("method_removed");
+ singleton_removed = rb_intern("singleton_method_removed");
+ undefined = rb_intern("method_undefined");
+ singleton_undefined = rb_intern("singleton_method_undefined");
__id__ = rb_intern("__id__");
__send__ = rb_intern("__send__");
@@ -5884,7 +5913,6 @@ Init_eval()
rb_define_private_method(rb_cModule, "append_features", rb_mod_append_features, 1);
rb_define_private_method(rb_cModule, "extend_object", rb_mod_extend_object, 1);
rb_define_private_method(rb_cModule, "include", rb_mod_include, -1);
- rb_define_private_method(rb_cModule, "included", rb_mod_included, 1);
rb_define_private_method(rb_cModule, "public", rb_mod_public, -1);
rb_define_private_method(rb_cModule, "protected", rb_mod_protected, -1);
rb_define_private_method(rb_cModule, "private", rb_mod_private, -1);
@@ -6381,7 +6409,7 @@ proc_to_s(self, other)
VALUE str;
Data_Get_Struct(self, struct BLOCK, data);
- str = rb_str_new(0, strlen(cname)+6+16+1); /* 6:tags 16:addr 1:eos */
+ str = rb_str_new(0, strlen(cname)+6+16+1); /* 6:tags 16:addr 1:nul */
sprintf(RSTRING(str)->ptr, "#<%s:0x%lx>", cname, data->tag);
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
if (OBJ_TAINTED(self)) OBJ_TAINT(str);
diff --git a/ext/tcltklib/tcltklib.c b/ext/tcltklib/tcltklib.c
index cec025bb71..6c95b42b37 100644
--- a/ext/tcltklib/tcltklib.c
+++ b/ext/tcltklib/tcltklib.c
@@ -372,9 +372,9 @@ ip_invoke_real(argc, argv, obj)
/* object interface */
ov = (Tcl_Obj **)ALLOCA_N(Tcl_Obj *, argc+1);
for (i = 0; i < argc; ++i) {
- VALUE v = argv[i];
+ v = argv[i];
s = StringValuePtr(v);
- ov[i] = Tcl_NewStringObj(s, RSTRING(s)->len);
+ ov[i] = Tcl_NewStringObj(s, RSTRING(v)->len);
Tcl_IncrRefCount(ov[i]);
}
ov[argc] = (Tcl_Obj *)NULL;
diff --git a/file.c b/file.c
index c8f27acf08..128b667214 100644
--- a/file.c
+++ b/file.c
@@ -2206,8 +2206,7 @@ rb_find_file(file)
char *file;
{
extern VALUE rb_load_path;
- volatile VALUE vpath;
- VALUE fname;
+ VALUE vpath, fname;
char *path;
struct stat st;
@@ -2215,7 +2214,7 @@ rb_find_file(file)
if (is_macos_native_path(file)) {
FILE *f;
- if (safe_level >= 2 && !rb_path_check(file)) {
+ if (rb_safe_level() >= 2 && !rb_path_check(file)) {
rb_raise(rb_eSecurityError, "loading from unsafe file %s", file);
}
f= fopen(file, "r");
diff --git a/lib/mkmf.rb b/lib/mkmf.rb
index 0d308d9dc7..2208d6733f 100644
--- a/lib/mkmf.rb
+++ b/lib/mkmf.rb
@@ -15,6 +15,7 @@ $srcdir = CONFIG["srcdir"]
$libdir = CONFIG["libdir"]
$rubylibdir = CONFIG["rubylibdir"]
$archdir = CONFIG["archdir"]
+$sitedir = CONFIG["sitedir"]
$sitelibdir = CONFIG["sitelibdir"]
$sitearchdir = CONFIG["sitearchdir"]
@@ -453,6 +454,7 @@ exec_prefix = #{CONFIG["exec_prefix"].sub(drive, '')}
libdir = #{$libdir.sub(drive, '')}#{target_prefix}
rubylibdir = #{$rubylibdir.sub(drive, '')}#{target_prefix}
archdir = #{$archdir.sub(drive, '')}#{target_prefix}
+sitedir = #{$sitedir.sub(drive, '')}#{target_prefix}
sitelibdir = #{$sitelibdir.sub(drive, '')}#{target_prefix}
sitearchdir = #{$sitearchdir.sub(drive, '')}#{target_prefix}
diff --git a/marshal.c b/marshal.c
index 108379da41..a0dfb68b28 100644
--- a/marshal.c
+++ b/marshal.c
@@ -342,6 +342,9 @@ w_object(obj, arg, limit)
switch (BUILTIN_TYPE(obj)) {
case T_CLASS:
+ if (FL_TEST(obj, FL_SINGLETON)) {
+ rb_raise(rb_eTypeError, "singleton class can't be dumped");
+ }
w_byte(TYPE_CLASS, arg);
{
VALUE path = rb_class_path(obj);
@@ -460,7 +463,8 @@ w_object(obj, arg, limit)
char *path;
if (FL_TEST(klass, FL_SINGLETON)) {
- if (RCLASS(klass)->m_tbl->num_entries > 0) {
+ if (RCLASS(klass)->m_tbl->num_entries > 0 ||
+ RCLASS(klass)->iv_tbl->num_entries > 1) {
rb_raise(rb_eTypeError, "singleton can't be dumped");
}
}
diff --git a/object.c b/object.c
index 0d5f5a757a..ddf59093dd 100644
--- a/object.c
+++ b/object.c
@@ -130,7 +130,7 @@ rb_any_to_s(obj)
char *cname = rb_class2name(CLASS_OF(obj));
VALUE str;
- str = rb_str_new(0, strlen(cname)+6+16+1); /* 6:tags 16:addr 1:eos */
+ str = rb_str_new(0, strlen(cname)+6+16+1); /* 6:tags 16:addr 1:nul */
sprintf(RSTRING(str)->ptr, "#<%s:0x%lx>", cname, obj);
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
if (OBJ_TAINTED(obj)) OBJ_TAINT(str);
@@ -198,12 +198,12 @@ rb_obj_inspect(obj)
c = rb_class2name(CLASS_OF(obj));
if (rb_inspecting_p(obj)) {
- str = rb_str_new(0, strlen(c)+10+16+1); /* 10:tags 16:addr 1:eos */
+ str = rb_str_new(0, strlen(c)+10+16+1); /* 10:tags 16:addr 1:nul */
sprintf(RSTRING(str)->ptr, "#<%s:0x%lx ...>", c, obj);
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
return str;
}
- str = rb_str_new(0, strlen(c)+6+16+1); /* 6:tags 16:addr 1:eos */
+ str = rb_str_new(0, strlen(c)+6+16+1); /* 6:tags 16:addr 1:nul */
sprintf(RSTRING(str)->ptr, "-<%s:0x%lx", c, obj);
RSTRING(str)->len = strlen(RSTRING(str)->ptr);
return rb_protect_inspect(inspect_obj, obj, str);
@@ -522,7 +522,17 @@ sym_intern(sym)
static VALUE
rb_mod_to_s(klass)
VALUE klass;
+
{
+ if (FL_TEST(klass, FL_SINGLETON)) {
+ VALUE s = rb_str_new2("#<");
+
+ rb_str_cat2(s, "Class:");
+ rb_str_cat2(s, rb_class2name(klass));
+ rb_str_cat2(s, ">");
+
+ return s;
+ }
return rb_str_dup(rb_class_path(klass));
}
@@ -1111,6 +1121,10 @@ Init_Object()
rb_include_module(rb_cObject, rb_mKernel);
rb_define_private_method(rb_cObject, "initialize", rb_obj_dummy, 0);
rb_define_private_method(rb_cClass, "inherited", rb_obj_dummy, 1);
+ rb_define_private_method(rb_cModule, "included", rb_obj_dummy, 1);
+ rb_define_private_method(rb_cModule, "method_added", rb_obj_dummy, 1);
+ rb_define_private_method(rb_cModule, "method_removed", rb_obj_dummy, 1);
+ rb_define_private_method(rb_cModule, "method_undefined", rb_obj_dummy, 1);
/*
* Ruby's Class Hierarchy Chart
@@ -1138,8 +1152,8 @@ Init_Object()
rb_define_method(rb_mKernel, "nil?", rb_false, 0);
rb_define_method(rb_mKernel, "==", rb_obj_equal, 1);
- rb_define_alias(rb_mKernel, "equal?", "==");
- rb_define_alias(rb_mKernel, "===", "==");
+ rb_define_method(rb_mKernel, "equal?", rb_obj_equal, 1);
+ rb_define_method(rb_mKernel, "===", rb_obj_equal, 1);
rb_define_method(rb_mKernel, "=~", rb_false, 1);
rb_define_method(rb_mKernel, "eql?", rb_obj_equal, 1);
@@ -1176,6 +1190,8 @@ Init_Object()
rb_define_method(rb_mKernel, "is_a?", rb_obj_is_kind_of, 1);
rb_define_global_function("singleton_method_added", rb_obj_dummy, 1);
+ rb_define_global_function("singleton_method_removed", rb_obj_dummy, 1);
+ rb_define_global_function("singleton_method_undefined", rb_obj_dummy, 1);
rb_define_global_function("sprintf", rb_f_sprintf, -1);
rb_define_global_function("format", rb_f_sprintf, -1);
@@ -1242,7 +1258,6 @@ Init_Object()
rb_define_method(rb_cModule, "const_set", rb_mod_const_set, 2);
rb_define_method(rb_cModule, "const_defined?", rb_mod_const_defined, 1);
rb_define_private_method(rb_cModule, "remove_const", rb_mod_remove_const, 1);
- rb_define_private_method(rb_cModule, "method_added", rb_obj_dummy, 1);
rb_define_method(rb_cModule, "class_variables", rb_mod_class_variables, 0);
rb_define_private_method(rb_cModule, "remove_class_variable", rb_mod_remove_cvar, 1);
diff --git a/ruby.h b/ruby.h
index 166bc6e7d9..971a7e06b9 100644
--- a/ruby.h
+++ b/ruby.h
@@ -186,22 +186,19 @@ void rb_check_type _((VALUE,int));
#define Check_Type(v,t) rb_check_type((VALUE)(v),t)
VALUE rb_str_to_str _((VALUE));
-#define StringValue(v) do {\
- if (TYPE(v) != T_STRING) v = rb_str_to_str(v);\
-} while (0)
+VALUE rb_string_value _((VALUE*));
+
+#define StringValue(v) if (TYPE(v) != T_STRING) rb_string_value(&(v))
void rb_check_safe_str _((VALUE));
-/* obsolete macro - use SafeStringValue(v) */
-#define Check_SafeStr(v) rb_check_safe_str((VALUE)(v))
#define SafeStringValue(v) do {\
- if (TYPE(v) != T_STRING) v = rb_str_to_str(v);\
+ StringValue(v);\
rb_check_safe_str(v);\
} while (0)
-
-#define StringValuePtr(v) \
- (((TYPE(v) != T_STRING) ? v = rb_str_to_str(v) : (v)), RSTRING(v)->ptr)
+#define StringValuePtr(v) RSTRING((TYPE(v) == T_STRING) ? (v) : rb_string_value(&(v)))->ptr
+/* obsolete macro - use SafeStringValue(v) */
+#define Check_SafeStr(v) rb_check_safe_str((VALUE)(v))
void rb_secure _((int));
-
EXTERN int ruby_safe_level;
#define rb_safe_level() (ruby_safe_level)
void rb_set_safe_level _((int));
diff --git a/string.c b/string.c
index 70e188611e..b760301137 100644
--- a/string.c
+++ b/string.c
@@ -139,6 +139,13 @@ rb_str_to_str(str)
return rb_convert_type(str, T_STRING, "String", "to_str");
}
+VALUE
+rb_string_value(ptr)
+ VALUE *ptr;
+{
+ return *ptr = rb_str_to_str(*ptr);
+}
+
static void
rb_str_become(str, str2)
VALUE str, str2;
diff --git a/variable.c b/variable.c
index 156a36f757..16828a029d 100644
--- a/variable.c
+++ b/variable.c
@@ -257,9 +257,6 @@ char *
rb_class2name(klass)
VALUE klass;
{
- if (klass == rb_cNilClass) return "nil";
- if (klass == rb_cTrueClass) return "true";
- if (klass == rb_cFalseClass) return "false";
return RSTRING(rb_class_path(klass))->ptr;
}
diff --git a/version.h b/version.h
index edb99a11ca..240ddace9f 100644
--- a/version.h
+++ b/version.h
@@ -1,4 +1,4 @@
#define RUBY_VERSION "1.7.0"
-#define RUBY_RELEASE_DATE "2001-05-07"
+#define RUBY_RELEASE_DATE "2001-05-11"
#define RUBY_VERSION_CODE 170
-#define RUBY_RELEASE_CODE 20010507
+#define RUBY_RELEASE_CODE 20010511