summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--class.c6
-rw-r--r--marshal.c3
-rw-r--r--parse.y21
4 files changed, 27 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index baf2abc790..329d48c8df 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Thu Mar 14 16:42:37 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * class.c (rb_define_class): should handle autoload.
+
+ * class.c (rb_define_module): ditto.
+
Thu Mar 14 00:29:12 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* re.c (rb_reg_match): should clear $~ if operand is nil.
diff --git a/class.c b/class.c
index ea3e124293..0a06c2d3e3 100644
--- a/class.c
+++ b/class.c
@@ -162,6 +162,9 @@ rb_define_class(name, super)
ID id;
id = rb_intern(name);
+ if (rb_autoload_defined(id)) {
+ rb_autoload_load(id);
+ }
if (rb_const_defined(rb_cObject, id)) {
klass = rb_const_get(rb_cObject, id);
if (TYPE(klass) != T_CLASS) {
@@ -242,6 +245,9 @@ rb_define_module(name)
ID id;
id = rb_intern(name);
+ if (rb_autoload_defined(id)) {
+ rb_autoload_load(id);
+ }
if (rb_const_defined(rb_cObject, id)) {
module = rb_const_get(rb_cObject, id);
if (TYPE(module) == T_MODULE)
diff --git a/marshal.c b/marshal.c
index 3bcb17b697..5009e82dae 100644
--- a/marshal.c
+++ b/marshal.c
@@ -471,11 +471,12 @@ w_object(obj, arg, limit)
VALUE klass = CLASS_OF(obj);
char *path;
- if (FL_TEST(klass, FL_SINGLETON)) {
+ while (FL_TEST(klass, FL_SINGLETON) || BUILTIN_TYPE(klass) == T_ICLASS) {
if (RCLASS(klass)->m_tbl->num_entries > 0 ||
RCLASS(klass)->iv_tbl->num_entries > 1) {
rb_raise(rb_eTypeError, "singleton can't be dumped");
}
+ klass = RCLASS(klass)->super;
}
path = rb_class2name(klass);
w_unique(path, arg);
diff --git a/parse.y b/parse.y
index c303e5e94f..c1f413a829 100644
--- a/parse.y
+++ b/parse.y
@@ -380,7 +380,7 @@ stmt : kALIAS fitem {lex_state = EXPR_FNAME;} fitem
if (in_def || in_single) {
yyerror("BEGIN in method");
}
- local_push();
+ local_push(1);
}
'{' compstmt '}'
{
@@ -1249,7 +1249,7 @@ primary : literal
if (in_def || in_single)
yyerror("class definition in method body");
class_nest++;
- local_push();
+ local_push(1);
$<num>$ = ruby_sourceline;
}
compstmt
@@ -1270,7 +1270,7 @@ primary : literal
$<num>$ = in_single;
in_single = 0;
class_nest++;
- local_push();
+ local_push(1);
}
compstmt
kEND
@@ -1287,7 +1287,7 @@ primary : literal
if (in_def || in_single)
yyerror("module definition in method body");
class_nest++;
- local_push();
+ local_push(1);
$<num>$ = ruby_sourceline;
}
compstmt
@@ -1305,7 +1305,7 @@ primary : literal
$<id>$ = cur_mid;
cur_mid = $2;
in_def++;
- local_push();
+ local_push(1);
}
f_arglist
compstmt
@@ -1333,7 +1333,7 @@ primary : literal
{
value_expr($2);
in_single++;
- local_push();
+ local_push(1);
lex_state = EXPR_END; /* force for args */
}
f_arglist
@@ -4684,11 +4684,12 @@ static struct local_vars {
int nofree;
int cnt;
int dlev;
+ struct RVarmap* dyna_vars;
struct local_vars *prev;
} *lvtbl;
static void
-local_push()
+local_push(int dyna_init)
{
struct local_vars *local;
@@ -4698,7 +4699,10 @@ local_push()
local->cnt = 0;
local->tbl = 0;
local->dlev = 0;
+ local->dyna_vars = ruby_dyna_vars;
lvtbl = local;
+
+ if (dyna_init) ruby_dyna_vars = (struct RVarmap* )0;
}
static void
@@ -4710,6 +4714,7 @@ local_pop()
if (!lvtbl->nofree) free(lvtbl->tbl);
else lvtbl->tbl[0] = lvtbl->cnt;
}
+ ruby_dyna_vars = lvtbl->dyna_vars;
free(lvtbl);
lvtbl = local;
}
@@ -4772,7 +4777,7 @@ local_id(id)
static void
top_local_init()
{
- local_push();
+ local_push(0);
lvtbl->cnt = ruby_scope->local_tbl?ruby_scope->local_tbl[0]:0;
if (lvtbl->cnt > 0) {
lvtbl->tbl = ALLOC_N(ID, lvtbl->cnt+3);