diff options
10 files changed, 370 insertions, 19 deletions
diff --git a/ChangeLog b/ChangeLog
index d2fa799..9fda8fc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,16 @@
+Fri Oct 3 10:51:10 1997 Yukihiro Matsumoto <>
+ * version 1.0-971003
+ * eval.c (ruby_options): f_require() called too early.
+ * eval.c (rb_provide): module extentions should always be `.o'.
Thu Oct 2 17:59:18 1997 Yukihiro Matsumoto <>
+ * ext/marshal/marshal.c (r_object): remove temporal regist for
+ structs. (caused problem if structs form cycles.)
* version 1.0-971002
Wed Oct 1 14:01:49 1997 WATANABE Hirofumi <>
diff --git a/MANIFEST b/MANIFEST
index 587294b..a1129f9 100644
@@ -48,6 +48,7 @@ re.c
diff --git a/eval.c b/eval.c
index 564ff9a..fdc338b 100644
--- a/eval.c
+++ b/eval.c
@@ -675,13 +675,14 @@ ruby_options(argc, argv)
if ((state = EXEC_TAG()) == 0) {
- NODE *save = eval_tree;
+ NODE *save;
ext_init = 1;
+ ruby_process_options(argc, argv);
+ save = eval_tree;
eval_tree = save;
- ruby_process_options(argc, argv);
if (state) error_print();
@@ -3537,8 +3538,19 @@ void
char *feature;
- if (!rb_provided(feature))
+ char *buf, *ext;
+ if (!rb_provided(feature)) {
+ ext = strrchr(feature, '.');
+ if (strcmp(DLEXT, ext) == 0) {
+ buf = ALLOCA_N(char, strlen(feature)+1);
+ strcpy(buf, feature);
+ ext = strrchr(buf, '.');
+ strcpy(ext, ".o");
+ feature = buf;
+ }
ary_push(rb_features, str_new2(feature));
+ }
diff --git a/ext/ b/ext/
index f1acef5..80e2a3c 100644
--- a/ext/
+++ b/ext/
@@ -243,7 +243,7 @@ libdir = @libdir@/ruby/@arch@
mfile.printf $objs.join(" ")
mfile.printf "\n"
- dots = if "@INSTALL@" =~ /^\// then "" else "#{$topdir}/" end
+ dots = if "@INSTALL@" =~ /^\// then "" else "#{$topdir}/ext" end
mfile.printf "\
TARGET = %s.%s
diff --git a/ext/marshal/marshal.c b/ext/marshal/marshal.c
index 47cb0fc..a74ecd7 100644
--- a/ext/marshal/marshal.c
+++ b/ext/marshal/marshal.c
@@ -620,7 +620,9 @@ r_object(arg)
+#ifndef atof
double atof();
char *buf;
r_bytes(buf, arg);
@@ -695,15 +697,17 @@ r_object(arg)
len = r_long(arg);
values = ary_new2(len);
- i = 0;
+ for (i=0; i<len; i++) {
+ ary_push(values, Qnil);
+ }
+ v = struct_alloc(class, values);
+ r_regist(v, arg);
for (i=0; i<len; i++) {
ID slot = r_symbol(arg);
if (RARRAY(mem)->ptr[i] != INT2FIX(slot))
TypeError("struct not compatible");
- ary_push(values, r_object(arg));
+ struct_aset(v, INT2FIX(i), r_object(arg));
- v = struct_alloc(class, values);
- st_insert(arg->data, num, v); /* re-regist */
return v;
diff --git a/ruby.1 b/ruby.1
new file mode 100644
index 0000000..b066804
--- /dev/null
+++ b/ruby.1
@@ -0,0 +1,323 @@
+.\"Ruby is copyrighted by Yukihiro Matsumoto <>.
+.\"This source is distributed under the conditions blow:
+.\" 1. You may make and give away verbatim copies of the source form of
+.\" the software without restriction, provided that you do not modify
+.\" the original distribution files.
+.\" If you want to distribute the modified version in any way, contact
+.\" the author.
+.\" 2. You may distribute the software in object code or executable
+.\" form, provided that you distribute it with instructions on where
+.\" to get the software.
+.\" 3. You may modify the software in any way, provided that you do not
+.\" distribute the modified version.
+.\" 4. You may modify and include the part of the software into any other
+.\" software (possibly commercial). But some files in the distribution
+.\" are not written by the author, so that they are not under this terms.
+.\" They are gc.c(partly),utils.c(partly), regex.[ch],fnmatch.[ch],
+.\" glob.c, st.[ch] and somme files under the ./missing directory. See
+.\" each files for the copying condition.
+.\" 5. The scripts and library files supplied as input to or produced as
+.\" output from the software do not automatically fall under the
+.\" copyright of the software, but belong to whomever generated them,
+.\" and may be sold commercially, and may be aggregated with this
+.\" software.
+.\" $Id$
+.TH RUBY 1 "ruby 1.0" "19/Sep/97" "Ruby Programmers Reference Guide"
+ruby - Interpreted scripting language
+.B ruby \c
+ [ \c
+.BI -version \c
+ ] [ \c
+.BI -c \c
+ ] [ \c
+.BI -w \c
+ ] [ \c
+.BI -d \c
+ ] [ \c
+.BI -l \c
+ ]
+ [ \c
+.BI -p \c
+ ] [ \c
+.BI -n \c
+ ] [ \c
+.BI -a \c
+ ] [ \c
+.BI -s \c
+ ] [ \c
+.BI -0 "[digit]"\c
+ ]
+ [ \c
+.BI -K "c"\c
+ ] [ \c
+.BI -e "script"\c
+ ] [ \c
+.BI -F "pattern"\c
+ ]
+ [ \c
+.BI -i "[extension]"\c
+ ] [ \c
+.BI -I "dir"\c
+ ] [ \c
+.BI -r "filename"\c
+ ]
+ [ \c
+.BI -S \c
+ ] [ \c
+.BI -v \c
+ ] [ \c
+.BI -x "[dir]"\c
+ ] [ \c
+.BI -X "[dir]"\c
+ ] [ \c
+.BI -y \c
+ [ \c
+.BI -- \c
+ ] [ programfile ] [ argument ] ...
+Ruby is the interpreted scripting language for quick and easy
+object-oriented programming. It has many features to process text
+files and to do system management tasks (as in perl). It is simple,
+straight-forward, and extensible.
+If you want a language for easy object-oriented programming, or you
+don't like the PERL ugliness, or you do like the concept of lisp, but
+don't like too much parentheses, ruby may be the language of the
+Ruby's features are as follows:
+.B "\(bu Interpretive"
+Ruby is the interpreted language, so you don't have to
+recompile to execute the program written in ruby.
+.B "\(bu Variables have no type (dynamic typing)"
+Variables in ruby can contain data of any type. You don't have
+to worry about variable typing. Consequently, it has weaker
+compile time check.
+.B "\(bu No declaration needed"
+You can use variables in your ruby programs without any
+declarations. Variable name itself denotes its scope (local,
+global, instance, etc.)
+.B "\(bu Simple syntax"
+Ruby has simple syntax influenced slightly from Eiffel.
+.B "\(bu No user-level memory management"
+Ruby has automatic memory management. Objects no longer
+referenced from anywhere are automatically collected by the
+garbage collector built in the interpreter.
+.B "\(bu Everything is object"
+Ruby is the pure object-oriented language from the beginning.
+Even basic data like integers are treated uniformly as objects.
+.B "\(bu Class, inheritance, methods"
+Of course, as a O-O language, ruby has basic features like
+classes, inheritance, methods, etc.
+.B "\(bu Singleton methods"
+Ruby has the feature to define methods for certain specified
+object. For example, you can define a press-button action for
+certain GUI button by defining a singleton method for the
+button. Or, you can make up your own prototype based object
+system using singleton methods (if you want to).
+.B "\(bu Mix-in by modules"
+Ruby does not have the multiple inheritance intentionally. IMO,
+It is the source of confusion. Instead, ruby has modules to
+share the implementation across the inheritance tree. It is
+often called "Mix-in."
+.B "\(bu Iterators"
+Ruby has iterators for loop abstraction.
+.B "\(bu Closures"
+In ruby, you can objectify the procedure.
+.B "\(bu Text processing and regular expression"
+Ruby has bunch of text processing features like in perl.
+.B "\(bu Bignums"
+With bu ilt-in bignums, you can calculate factorial(400), for
+.B "\(bu Exception handling"
+As in Java(tm).
+.B "\(bu Direct access to OS"
+Ruby can call most of system calls on UNIX boxes. It can be
+used in system programming.
+.B "\(bu Dynamic loading"
+You can load object files into ruby interpreter on-the-fly, on
+most of UNIXes.
+.SH Command line options
+Ruby interpreter accepts following command-line options (switches).
+Basically they are quite similar to those of Perl.
+.B -0digit
+specifies the input record separator ($/) as an octal number.
+If no digits given, the null character is the separator. Other
+switches may follow the digits. -00 turns ruby into paragraph
+mode. -0777 makes ruby read whole file at once as a single
+string, since there is no legal character with that value.
+.B -a
+turns on auto-split mode when used with -n or -p. In auto-split
+mode, ruby executes 1
+\& $F = $_.split
+at beginning of each loop.
+.B -c
+causes ruby to check the syntax of the script and exit without
+executing. If there is no syntax error, ruby will print "Syntax
+OK" to the standard output.
+.B -Kc
+specifies KANJI (Japanese character) code-set.
+-d --debug
+turns on debug mode. $DEBUG will set TRUE.
+.B -e script
+specifies script from command-line. if -e switch specified,
+ruby will not look for a script filename in the arguments.
+.B -F regexp
+specifies input field separator ($;).
+.B -i extension
+specifies in-place-edit mode. The extension, if specified, is
+added to old filename to make a backup copy.
+example: 8
+\& % echo matz > /tmp/junk
+\& % cat /tmp/junk
+\& matz
+\& % ruby -p -i.bak -e '$_.upcase!' /tmp/junk
+\& % cat /tmp/junk
+\& MATZ
+\& % cat /tmp/junk.bak
+\& matz
+.B -I directory
+used to tell ruby where to load the library scripts. Directory
+path will be added to the load-path variable ($:').
+.B -l
+enables automatic line-ending processing, which means firstly
+set $\ to the value of $/, and secondly chops every line read
+using chop!.
+.B -n
+causes ruby to assume the following loop around your script,
+which makes it iterate over filename arguments somewhat like
+sed -n or awk. 3
+\& while gets
+\& ...
+\& end
+.B -p
+acts mostly same as -n switch, but print the value of variable
+$_ at the each end of the loop.
+example: 2
+\& % echo matz | ruby -p -e '$! "a-z", "A-Z"'
+\& MATZ
+.B -r filename
+causes ruby to load the file using [4]require. It is useful
+with switches -n or -p.
+.B -s
+enables some switch parsing for switches after script name but
+before any filename arguments (or before a --). Any switches
+found there is removed from ARGV and set the corresponding
+variable in the script.
+example: 3
+\& #! /usr/local/bin/ruby -s
+\& # prints "true" if invoked with `-xyz' switch.
+\& print "true\n" if $xyz
+.B -S
+makes ruby uses the PATH environment variable to search for
+script, unless if its name begins with a slash. This is used to
+emulate #! on machines that don't support it, in the following
+manner: 2
+\& #! /usr/local/bin/ruby
+\& # This line makes the next one a comment in ruby \
+\& exec /usr/local/bin/ruby -S $0 $*
+On some systems $0 does not always contain the full pathname,
+so you need -S switch to tell ruby to search for the script if
+To handle embedded spaces or such, A better construct than $*
+would be ${1+"$@"}, but it does not work if the script is being
+interpreted by csh.
+.B -v --verbose
+enables verbose mode. Ruby will prints its version at the
+beginning, and set the variable `$VERBOSE' to TRUE. Some
+methods prints extra messages if this variable is TRUE. If this
+switch is given, and no other switches present, ruby quits
+after printing its version.
+.B --version
+prints the version of ruby executable.
+.B -w
+enables verbose mode without printing version message at the
+beginning. It set the variable `$VERBOSE' to TRUE.
+.B -x[directory]
+tells ruby that the script is embedded in a message. Leading
+garbage will be discarded until the first that starts with "#!"
+and contains string "ruby". Any meaningful switches on that
+line will applied. The end of script must be specified with
+either EOF, ^D (control-D), ^Z (control-Z), or reserved word
+__END__.If the directory name is specified, ruby will switch to
+that directory before executing script.
+.B -X directory
+causes ruby to switch to the directory.
+.B -y --yydebug
+turns on compiler debug mode. ruby will print bunch of internal
+state messages during compiling scripts. You don't have to
+specify this switch, unless you are going to debug the ruby
+interpreter itself.
+ Ruby is designed and implemented by Yukihiro Matsumoto <>.
diff --git a/sample/test.rb b/sample/test.rb
index c940f00..382ca94 100644
--- a/sample/test.rb
+++ b/sample/test.rb
@@ -434,7 +434,6 @@ def fact(n)
f *= n
n -= 1
- p f
return f
@@ -453,14 +452,14 @@ ok(2-(2**32) == -(2**32-2))
ok(2**32 - 5 == (2**32-3)-2)
$good = TRUE;
-for i in 1000..3000
+for i in 1000..1024
$good = FALSE if ((1<<i) != (2**i))
$good = TRUE;
-for i in 0..3000
+for i in 1000..1024
$good = FALSE if ((1<<i) != n1)
n1 *= 2
@@ -468,7 +467,7 @@ ok($good)
$good = TRUE;
-for i in 3000..-1
+for i in 1..10
n1 = n1 / 2
n2 = n2 >> 1
$good = FALSE if (n1 != n2)
@@ -476,7 +475,7 @@ end
$good = TRUE;
-for i in 3500..4000
+for i in 4000..4192
n1 = 1 << i;
$good = FALSE if ((n1**2-1) / (n1+1) != (n1-1))
diff --git a/struct.c b/struct.c
index ae1abc5..d9e68a2 100644
--- a/struct.c
+++ b/struct.c
@@ -329,7 +329,7 @@ struct_clone(s)
return (VALUE)st;
-static VALUE
struct_aref(s, idx)
struct RStruct *s;
VALUE idx;
@@ -345,7 +345,7 @@ struct_aref(s, idx)
return s->ptr[i];
-static VALUE
struct_aset(s, idx, val)
struct RStruct *s;
VALUE idx, val;
diff --git a/top.sed b/top.sed
index f8d56fc..d91a80e 100644
--- a/top.sed
+++ b/top.sed
@@ -1,5 +1,6 @@
s/@CPP@/gcc -E/
diff --git a/version.h b/version.h
index 2002a99..5d53852 100644
--- a/version.h
+++ b/version.h
@@ -1,2 +1,2 @@
-#define RUBY_VERSION "1.0-971002"
-#define VERSION_DATE "97/10/02"
+#define RUBY_VERSION "1.0-971003"
+#define VERSION_DATE "97/10/03"