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 /variable.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 'variable.c')
-rw-r--r-- | variable.c | 80 |
1 files changed, 72 insertions, 8 deletions
diff --git a/variable.c b/variable.c index 34bd8f4de5..c6b180736d 100644 --- a/variable.c +++ b/variable.c @@ -19,7 +19,11 @@ st_table *rb_class_tbl; #define class_tbl rb_class_tbl #define instance_tbl (RBASIC(Qself)->iv_tbl) -st_table *new_idhash() +VALUE rb_const_bound(); +VALUE rb_const_get(); + +st_table * +new_idhash() { return st_init_table(ST_NUMCMP, ST_NUMHASH); } @@ -31,13 +35,77 @@ Init_var_tables() class_tbl = new_idhash(); } +char * +rb_class2path(class) + VALUE class; +{ + VALUE path = rb_ivar_get_1(class, rb_intern("__classpath__")); + if (TYPE(path) != T_STRING) Bug("class path does not set properly"); + return RSTRING(path)->ptr; +} + +void +rb_set_class_path(class, under, name) + VALUE class, under; + char *name; +{ + VALUE str; + char *s; + + str = str_new2(name); + if (under) { + str_cat(str, ":", 1); + s = rb_class2path(under); + str_cat(str, s, strlen(s)); + } + rb_ivar_set_1(class, rb_intern("__classpath__"), str); +} + +VALUE +rb_path2class(path) + char *path; +{ + char *p, *name, *s; + ID id; + VALUE class; + + p = path; + while (*p) { + if (*p == ':') break; + *p++; + } + if (*p == '\0') { /* pre-defined class */ + if (!st_lookup(class_tbl, rb_intern(path), &class)) { + Fail("Undefined class -- %s", path); + } + return class; + } + class = rb_path2class(p+1); + name = ALLOCA_N(char, p-path+1); + s = name; + while (path<p) { + *s++ = *path++; + } + *s = '\0'; + id = rb_intern(name); + if (!rb_const_bound(class, id)) + Fail("%s not defined", name); + class = rb_const_get(class, id); + switch (TYPE(class)) { + case T_CLASS: + case T_MODULE: + break; + default: + Fail("%s not a module/class"); + } + return class; +} + void rb_name_class(class, id) VALUE class; ID id; { - VALUE body; - rb_ivar_set_1(class, rb_intern("__classname__"), INT2FIX(id)); } @@ -58,14 +126,10 @@ rb_class2name(class) Fail("0x%x is not a class/module", class); } - while (FL_TEST(class, FL_SINGLE)) { + while (FL_TEST(class, FL_SINGLE) || TYPE(class) == T_ICLASS) { class = (struct RClass*)class->super; } - while (TYPE(class) == T_ICLASS) { - class = (struct RClass*)class->super; - } - name = rb_ivar_get_1(class, rb_intern("__classname__")); if (name) { name = FIX2INT(name); |