diff options
author | Yukihiro Matsumoto <matz@ruby-lang.org> | 1995-05-19 15:33:23 +0900 |
---|---|---|
committer | Takashi Kokubun <takashikkbn@gmail.com> | 2019-08-17 22:09:32 +0900 |
commit | 8bf1c909dc31fd4bcdc1488cda9fe89a62bc2830 (patch) | |
tree | 6899d116a280ba8f99f65e21fe9259706474c0aa /eval.c | |
parent | b2420d8ffa4d347a75efbbdc376f4ce65c0eb172 (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.c | 85 |
1 files changed, 51 insertions, 34 deletions
@@ -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 |