summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--NEWS2
-rw-r--r--include/ruby/intern.h2
-rw-r--r--internal.h1
-rw-r--r--load.c2
-rw-r--r--variable.c24
6 files changed, 32 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 538aeb2efd..745c288aad 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Sun Dec 6 19:52:31 2015 Eric Wong <e@80x24.org>
+
+ * include/ruby/intern.h (rb_autoload): deprecate
+ * internal.h (rb_autoload_str): declare
+ * load.c (rb_mod_autoload): use rb_autoload_str
+ * variable.c (rb_autoload): become compatibility wrapper
+ (rb_autoload_str): hoisted out from old rb_autoload
+ [ruby-core:71369] [Feature #11664]
+
Sun Dec 6 19:02:55 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
* configure.in: add missing x.
diff --git a/NEWS b/NEWS
index 88cbefc08b..3b4d66b6fd 100644
--- a/NEWS
+++ b/NEWS
@@ -241,6 +241,8 @@ with all sufficient information, see the ChangeLog file.
* rb_time_timespec_new() is added to create a time object with epoch,
nanosecond, and UTC/localtime/time offset arguments. [Feature #11558]
+* rb_autoload() deprecated, use rb_funcall() instead. [Feature #11664]
+
=== Build system updates
=== Implementation changes
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 3fb1637593..d43dc67780 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -937,7 +937,7 @@ VALUE rb_path_to_class(VALUE);
VALUE rb_path2class(const char*);
void rb_name_class(VALUE, ID);
VALUE rb_class_name(VALUE);
-void rb_autoload(VALUE, ID, const char*);
+DEPRECATED(void rb_autoload(VALUE, ID, const char*));
VALUE rb_autoload_load(VALUE, ID);
VALUE rb_autoload_p(VALUE, ID);
VALUE rb_f_trace_var(int, const VALUE*);
diff --git a/internal.h b/internal.h
index 1018d0bd30..df594c171f 100644
--- a/internal.h
+++ b/internal.h
@@ -1205,6 +1205,7 @@ size_t rb_generic_ivar_memsize(VALUE);
VALUE rb_search_class_path(VALUE);
VALUE rb_attr_delete(VALUE, ID);
VALUE rb_ivar_lookup(VALUE obj, ID id, VALUE undef);
+void rb_autoload_str(VALUE mod, ID id, VALUE file);
/* version.c */
extern const char ruby_engine[];
diff --git a/load.c b/load.c
index 3f5e143084..96b92fc8e8 100644
--- a/load.c
+++ b/load.c
@@ -1099,7 +1099,7 @@ rb_mod_autoload(VALUE mod, VALUE sym, VALUE file)
ID id = rb_to_id(sym);
FilePathValue(file);
- rb_autoload(mod, id, RSTRING_PTR(file));
+ rb_autoload_str(mod, id, file);
return Qnil;
}
diff --git a/variable.c b/variable.c
index 18a70a0c8d..f6dd3ee47d 100644
--- a/variable.c
+++ b/variable.c
@@ -1916,8 +1916,17 @@ static const rb_data_type_t autoload_data_i_type = {
void
rb_autoload(VALUE mod, ID id, const char *file)
{
+ if (!file || !*file) {
+ rb_raise(rb_eArgError, "empty file name");
+ }
+ rb_autoload_str(mod, id, rb_fstring_cstr(file));
+}
+
+void
+rb_autoload_str(VALUE mod, ID id, VALUE file)
+{
st_data_t av;
- VALUE ad, fn;
+ VALUE ad;
struct st_table *tbl;
struct autoload_data_i *ele;
rb_const_entry_t *ce;
@@ -1926,7 +1935,9 @@ rb_autoload(VALUE mod, ID id, const char *file)
rb_raise(rb_eNameError, "autoload must be constant name: %"PRIsVALUE"",
QUOTE_ID(id));
}
- if (!file || !*file) {
+
+ Check_Type(file, T_STRING);
+ if (!RSTRING_LEN(file)) {
rb_raise(rb_eArgError, "empty file name");
}
@@ -1947,12 +1958,13 @@ rb_autoload(VALUE mod, ID id, const char *file)
RB_OBJ_WRITTEN(mod, Qnil, av);
DATA_PTR(av) = tbl = st_init_numtable();
}
- fn = rb_str_new2(file);
- FL_UNSET(fn, FL_TAINT);
- OBJ_FREEZE(fn);
ad = TypedData_Make_Struct(0, struct autoload_data_i, &autoload_data_i_type, ele);
- ele->feature = fn;
+ if (OBJ_TAINTED(file)) {
+ file = rb_str_dup(file);
+ FL_UNSET(file, FL_TAINT);
+ }
+ ele->feature = rb_fstring(file);
ele->safe_level = rb_safe_level();
ele->value = Qundef;
ele->state = 0;