summaryrefslogtreecommitdiff
path: root/variable.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 /variable.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 'variable.c')
-rw-r--r--variable.c80
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);