summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authorYukihiro Matsumoto <matz@ruby-lang.org>1995-05-19 15:33:23 +0900
committerTakashi Kokubun <takashikkbn@gmail.com>2019-08-17 22:09:32 +0900
commit8bf1c909dc31fd4bcdc1488cda9fe89a62bc2830 (patch)
tree6899d116a280ba8f99f65e21fe9259706474c0aa /eval.c
parentb2420d8ffa4d347a75efbbdc376f4ce65c0eb172 (diff)
version 0.76v0_76
https://cache.ruby-lang.org/pub/ruby/1.0/ruby-0.76.tar.gz Fri May 19 15:33:23 1995 Yukihiro Matsumoto <matz@ix-02> * version 0.76 Fri May 19 00:48:08 1995 Yukihiro Matsumoto (matz@dyna) * string.c (Fstr_each): イテレータブロック中で文字列の変更が行われ たかどうかをチェック.ポインタの値が変わっていれば例外を発生する. * ruby-mode.el: ruby-electric-braceの新設. Thu May 18 12:27:23 1995 Yukihiro Matsumoto <matz@ix-02> * string.c (Fstr_tr): trの置換対象に`\0'を含む時に正しく置換を行わ ないバグがあった.更に置換文字列をASCII順に指定しないと動作しな い問題もあった.結果としてtrを書き換えたので,copyrightの問題は 無くなった(と思う). * gc.c (gc): the_scopeをマークしていなかったので,ローカル変数が間 違って開放される場合があった. * gc.c (mark_locations_array): 若干の高速化. Mon May 15 11:43:49 1995 Yukihiro Matsumoto <matz@ix-02> * ext/extmk.rb.in: Dynamic Loadモジュールのコンパイル用チェックを 行うruby script.autoconfに近い感覚で使える.新しいモジュールを 提供したい人はextの下にディレクトリを作るだけで良い.必須のファ イルはファイル名の一覧を記録した`MANIFEST'というファイルのみ.必 要に応じて`depend'(ファイルの依存関係を記述するファイル gcc -MM の出力),`extconf.rb'(コンパイル用にライブラリと関数の存在チェッ クするファイル)を用意できる. * eval.c (rb_call): rubyメソッドの引数チェック時に未初期化の jmp_bufを使用していた. * parse.y: `or'と`and'の優先順位を同じにした. Wed May 3 18:21:36 1995 Yukihiro Matsumoto (matz@dyna) * dln.c: Linuxでは`__.SYMDEF/'であった. * dln.c: system callのエラーチェックを忘れていた. Wed Apr 26 09:50:56 1995 Yukihiro Matsumoto (matz@ix-02) * parse.y: イテレータブロックの変数宣言を`|'で括るようにした.これ でイテレータ変数がない時は宣言そのものを省略できる.文法の変更は 久しぶりだ. Tue Apr 25 12:04:17 1995 Yukihiro Matsumoto (matz@ix-02) * eval.c(require): loadからダイナミックロードの機能を移してきた. さらに拡張子の補完機能を追加してユーザがdln/dlopenの差を意識する 必要のないようにした. * string.c(sub,sub): イテレータとしても動作するように. * object.c: init_object -> initialize. Mon Apr 24 14:22:39 1995 Yukihiro Matsumoto (matz@ix-02) * NEWS-OS 3.4対応 * io.c: Solarisのstdioの動作が違うようだ.signalでEOFを返してしま う….perlでも同様の問題がある. Fri Apr 21 20:04:39 1995 Yukihiro Matsumoto (matz@ix-02) * version 0.75 * signal.c: trapがなくなっていた.うーむ. * configure: Solaris 2.3対応. * io.c: #elifのないcppもある. * dir.c: autoconf 2.xへの対応が不十分 Thu Apr 20 12:31:24 1995 Yukihiro Matsumoto (matz@ix-02) * version 0.74 * env.h, gc.c, regex.c: IRIXへの移植対応 * configure: picを生成するoptionの検出のため,システムタイプをチェッ クするように. Tue Apr 18 19:08:17 1995 Yukihiro Matsumoto (matz@ix-02) * gc.c(xrealloc): ptr=nilの時,malloc()と同じ働きを * array.c(astore): 空の配列の0番目の要素に代入するとsize=0で realloc()を呼んでいた. * configure, glob.c: Solaris 2.xでコンパイルできるように
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c85
1 files changed, 51 insertions, 34 deletions
diff --git a/eval.c b/eval.c
index ed3860a..a96e84e 100644
--- a/eval.c
+++ b/eval.c
@@ -6,7 +6,7 @@
$Date: 1995/01/12 08:54:45 $
created at: Thu Jun 10 14:22:17 JST 1993
- Copyright (C) 1995 Yukihiro Matsumoto
+ Copyright (C) 1993-1995 Yukihiro Matsumoto
************************************************/
@@ -454,7 +454,7 @@ ruby_init(argc, argv, envp)
if ((state = EXEC_TAG()) == 0) {
rb_call_inits();
the_class = (struct RClass*)C_Object;
- ruby_init0(argc, argv, envp);
+ ruby_options(argc, argv, envp);
}
POP_ITER();
POP_TAG();
@@ -632,7 +632,7 @@ rb_trap_eval(cmd)
}
}
-#define SETUP_ARGS {\
+#define SETUP_ARGS do {\
NODE *n = node->nd_args;\
if (!n) {\
argc = 0;\
@@ -658,7 +658,7 @@ rb_trap_eval(cmd)
argv = ALLOCA_N(VALUE, argc);\
MEMCPY(argv, RARRAY(args)->ptr, VALUE, argc);\
}\
-}
+} while (0)
static VALUE
rb_eval(node)
@@ -1289,6 +1289,7 @@ rb_eval(node)
if (super == Qnil) super = C_Object;
class = rb_define_class_id(node->nd_cname, super);
rb_const_set(the_class, node->nd_cname, class);
+ rb_set_class_path(class,the_class,rb_id2name(node->nd_cname));
}
module_setup(class, node->nd_body);
@@ -1308,6 +1309,7 @@ rb_eval(node)
else {
module = rb_define_module_id(node->nd_cname);
rb_const_set(the_class, node->nd_cname, module);
+ rb_set_class_path(module,the_class,rb_id2name(node->nd_cname));
}
module_setup(module, node->nd_body);
@@ -1992,7 +1994,6 @@ rb_call(class, recv, mid, argc, argv, scope)
sourcefile = body->file;
PUSH_SCOPE();
- PUSH_TAG();
if (body->nd_cnt > 0) {
local_vars = ALLOCA_N(VALUE, body->nd_cnt);
@@ -2032,6 +2033,7 @@ rb_call(class, recv, mid, argc, argv, scope)
}
}
}
+ PUSH_TAG();
state = EXEC_TAG();
if (state == 0) {
result = rb_eval(body);
@@ -2200,7 +2202,7 @@ find_file(file)
{
extern VALUE rb_load_path;
VALUE sep, vpath;
- char *path, *found;
+ char *path;
if (file[0] == '/') return file;
@@ -2215,10 +2217,7 @@ find_file(file)
path = Qnil;
}
- found = dln_find_file(file, path);
- if (found == Qnil) Fail("No such file to load -- %s", file);
-
- return found;
+ return dln_find_file(file, path);
}
VALUE
@@ -2232,28 +2231,8 @@ Fload(obj, fname)
Check_Type(fname, T_STRING);
file = find_file(fname->ptr);
+ if (!file) Fail("No such file to load -- %s", file);
-#ifdef USE_DL
- {
- static int rb_dln_init = 0;
- extern char *rb_dln_argv0;
- int len = strlen(file);
-
- if (len > 3
- && file[len-1] == 'o' && file[len-2] == '.'
- || len > 4
- && file[len-1] == 'o' && file[len-2] == 's' && file[len-3] == '.'){
- if (rb_dln_init == 0 && dln_init(rb_dln_argv0) == -1) {
- Fail("%s: %s", rb_dln_argv0, dln_strerror());
- }
-
- if (dln_load(file) == -1)
- Fail(dln_strerror());
-
- return TRUE;
- }
- }
-#endif
PUSH_SELF(TopSelf);
PUSH_TAG();
PUSH_CLASS();
@@ -2291,6 +2270,18 @@ Frequire(obj, fname)
Check_Type(fname, T_STRING);
file = find_file(fname->ptr);
+ if (!file) {
+ char *buf = ALLOCA_N(char, strlen(fname->ptr) + 4);
+ sprintf(buf, "%s.rb", fname->ptr);
+ file = find_file(buf);
+#ifdef USE_DL
+ if (!file) {
+ sprintf(buf, "%s%s", fname->ptr, DLEXT);
+ file = find_file(buf);
+ }
+#endif
+ if (!file) Fail("No such file to load -- %s", file);
+ }
p = RARRAY(rb_loadfiles)->ptr;
pend = p + RARRAY(rb_loadfiles)->len;
@@ -2298,10 +2289,36 @@ Frequire(obj, fname)
Check_Type(*p, T_STRING);
if (strcmp(RSTRING(*p)->ptr, file) == 0) return FALSE;
}
- ary_push(rb_loadfiles, str_new2(file));
+ fname = (struct RString*)str_new2(file);
+ ary_push(rb_loadfiles, fname);
+ file = fname->ptr;
- Fload(obj, fname);
- return TRUE;
+#ifdef USE_DL
+ {
+ int len = strlen(file), extsiz = sizeof(DLEXT);
+
+ if (len > extsiz) {
+ int i;
+ for (i=1;i<extsiz;i++) {
+ if (file[len-i] != DLEXT[extsiz-i-1]) break;
+ }
+ if (i==extsiz) {
+ static int rb_dln_init = 0;
+ extern char *rb_dln_argv0;
+
+ if (rb_dln_init == 0 && dln_init(rb_dln_argv0) == -1) {
+ Fail("%s: %s", rb_dln_argv0, dln_strerror());
+ }
+
+ if (dln_load(file) == -1)
+ Fail(dln_strerror());
+
+ return TRUE;
+ }
+ }
+ }
+#endif
+ return Fload(obj, fname);
}
#ifndef RUBY_LIB