[前][次][番号順一覧][スレッド一覧]

ruby-changes:50739

From: nagachika <ko1@a...>
Date: Sun, 25 Mar 2018 14:35:23 +0900 (JST)
Subject: [ruby-changes:50739] nagachika:r62916 (ruby_2_4): merge revision(s) 62394, 62395: [Backport #14469]

nagachika	2018-03-25 14:35:17 +0900 (Sun, 25 Mar 2018)

  New Revision: 62916

  https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=62916

  Log:
    merge revision(s) 62394,62395: [Backport #14469]
    
    vm_insnhelper.c: rb_autoloading_value flag
    
    * vm_insnhelper.c (vm_get_ev_const): add flag argument of
      `rb_autoloading_value`.
    
    * constant.h (rb_autoloading_value): moved the declaration from
      vm_core.h for `rb_const_flag_t`.  [ruby-core:85516] [Bug #14469]
    
    variable.c: flags at autoloading
    
    * variable.c (const_tbl_update): flags by deprecate_constant /
      private_constant set during autoloading should be preserved
      after required.  [ruby-core:85516] [Bug #14469]

  Modified directories:
    branches/ruby_2_4/
  Modified files:
    branches/ruby_2_4/constant.h
    branches/ruby_2_4/test/ruby/test_autoload.rb
    branches/ruby_2_4/variable.c
    branches/ruby_2_4/version.h
    branches/ruby_2_4/vm_core.h
    branches/ruby_2_4/vm_insnhelper.c
Index: ruby_2_4/variable.c
===================================================================
--- ruby_2_4/variable.c	(revision 62915)
+++ ruby_2_4/variable.c	(revision 62916)
@@ -1903,6 +1903,7 @@ struct autoload_state { https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L1903
 struct autoload_data_i {
     VALUE feature;
     int safe_level;
+    rb_const_flag_t flag;
     VALUE value;
     struct autoload_state *state; /* points to on-stack struct */
 };
@@ -1985,6 +1986,7 @@ rb_autoload_str(VALUE mod, ID id, VALUE https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L1986
     ele->safe_level = rb_safe_level();
     ele->value = Qundef;
     ele->state = 0;
+    ele->flag = CONST_PUBLIC;
     st_insert(tbl, (st_data_t)id, (st_data_t)ad);
 }
 
@@ -2060,7 +2062,7 @@ check_autoload_required(VALUE mod, ID id https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2062
 }
 
 int
-rb_autoloading_value(VALUE mod, ID id, VALUE* value)
+rb_autoloading_value(VALUE mod, ID id, VALUE* value, rb_const_flag_t *flag)
 {
     VALUE load;
     struct autoload_data_i *ele;
@@ -2073,6 +2075,9 @@ rb_autoloading_value(VALUE mod, ID id, V https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2075
 	    if (value) {
 		*value = ele->value;
 	    }
+	    if (flag) {
+		*flag = ele->flag;
+	    }
 	    return 1;
 	}
     }
@@ -2087,13 +2092,14 @@ autoload_defined_p(VALUE mod, ID id) https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2092
     if (!ce || ce->value != Qundef) {
 	return 0;
     }
-    return !rb_autoloading_value(mod, id, NULL);
+    return !rb_autoloading_value(mod, id, NULL, NULL);
 }
 
 struct autoload_const_set_args {
     VALUE mod;
     ID id;
     VALUE value;
+    rb_const_flag_t flag;
 };
 
 static void const_tbl_update(struct autoload_const_set_args *);
@@ -2140,6 +2146,7 @@ autoload_reset(VALUE arg) https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2146
 	args.mod = state->mod;
 	args.id = state->id;
 	args.value = state->ele->value;
+	args.flag = state->ele->flag;
 	safe_backup = rb_safe_level();
 	rb_set_safe_level_force(state->ele->safe_level);
 	rb_ensure(autoload_const_set, (VALUE)&args,
@@ -2286,6 +2293,7 @@ static VALUE https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2293
 rb_const_search(VALUE klass, ID id, int exclude, int recurse, int visibility)
 {
     VALUE value, tmp, av;
+    rb_const_flag_t flag;
     int mod_retry = 0;
 
     tmp = klass;
@@ -2304,7 +2312,7 @@ rb_const_search(VALUE klass, ID id, int https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2312
 	    if (value == Qundef) {
 		if (am == tmp) break;
 		am = tmp;
-		if (rb_autoloading_value(tmp, id, &av)) return av;
+		if (rb_autoloading_value(tmp, id, &av, &flag)) return av;
 		rb_autoload_load(tmp, id);
 		continue;
 	    }
@@ -2556,7 +2564,7 @@ rb_const_defined_0(VALUE klass, ID id, i https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2564
 		return (int)Qfalse;
 	    }
 	    if (ce->value == Qundef && !check_autoload_required(tmp, id, 0) &&
-		    !rb_autoloading_value(tmp, id, 0))
+		!rb_autoloading_value(tmp, id, NULL, NULL))
 		return (int)Qfalse;
 	    return (int)Qtrue;
 	}
@@ -2637,6 +2645,7 @@ rb_const_set(VALUE klass, ID id, VALUE v https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2645
 	args.mod = klass;
 	args.id = id;
 	args.value = val;
+	args.flag = CONST_PUBLIC;
 	const_tbl_update(&args);
     }
     /*
@@ -2668,6 +2677,21 @@ rb_const_set(VALUE klass, ID id, VALUE v https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2677
     }
 }
 
+static struct autoload_data_i *
+current_autoload_data(VALUE mod, ID id)
+{
+    struct autoload_data_i *ele;
+    VALUE load = autoload_data(mod, id);
+    if (!load) return 0;
+    ele = check_autoload_data(load);
+    if (!ele) return 0;
+    /* for autoloading thread, keep the defined value to autoloading storage */
+    if (ele->state && (ele->state->thread == rb_thread_current())) {
+	return ele;
+    }
+    return 0;
+}
+
 static void
 const_tbl_update(struct autoload_const_set_args *args)
 {
@@ -2676,19 +2700,15 @@ const_tbl_update(struct autoload_const_s https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2700
     VALUE val = args->value;
     ID id = args->id;
     struct rb_id_table *tbl = RCLASS_CONST_TBL(klass);
-    rb_const_flag_t visibility = CONST_PUBLIC;
+    rb_const_flag_t visibility = args->flag;
     rb_const_entry_t *ce;
 
     if (rb_id_table_lookup(tbl, id, &value)) {
 	ce = (rb_const_entry_t *)value;
 	if (ce->value == Qundef) {
-	    VALUE load;
-	    struct autoload_data_i *ele;
+	    struct autoload_data_i *ele = current_autoload_data(klass, id);
 
-	    load = autoload_data(klass, id);
-	    /* for autoloading thread, keep the defined value to autoloading storage */
-	    if (load && (ele = check_autoload_data(load)) && ele->state &&
-			(ele->state->thread == rb_thread_current())) {
+	    if (ele) {
 		rb_clear_constant_cache();
 
 		ele->value = val; /* autoload_i is non-WB-protected */
@@ -2777,6 +2797,13 @@ set_const_visibility(VALUE mod, int argc https://github.com/ruby/ruby/blob/trunk/ruby_2_4/variable.c#L2797
 	if ((ce = rb_const_lookup(mod, id))) {
 	    ce->flag &= ~mask;
 	    ce->flag |= flag;
+	    if (ce->value == Qundef) {
+		struct autoload_data_i *ele = current_autoload_data(mod, id);
+		if (ele) {
+		    ele->flag &= ~mask;
+		    ele->flag |= flag;
+		}
+	    }
 	}
 	else {
 	    if (i > 0) {
Index: ruby_2_4/version.h
===================================================================
--- ruby_2_4/version.h	(revision 62915)
+++ ruby_2_4/version.h	(revision 62916)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_4/version.h#L1
 #define RUBY_VERSION "2.4.4"
 #define RUBY_RELEASE_DATE "2018-03-25"
-#define RUBY_PATCHLEVEL 285
+#define RUBY_PATCHLEVEL 286
 
 #define RUBY_RELEASE_YEAR 2018
 #define RUBY_RELEASE_MONTH 3
Index: ruby_2_4/test/ruby/test_autoload.rb
===================================================================
--- ruby_2_4/test/ruby/test_autoload.rb	(revision 62915)
+++ ruby_2_4/test/ruby/test_autoload.rb	(revision 62916)
@@ -246,6 +246,46 @@ p Foo::Bar https://github.com/ruby/ruby/blob/trunk/ruby_2_4/test/ruby/test_autoload.rb#L246
     assert_ruby_status([script], '', '[ruby-core:81016] [Bug #13526]')
   end
 
+  def test_autoload_private_constant
+    Dir.mktmpdir('autoload') do |tmpdir|
+      File.write(tmpdir+"/zzz.rb", "#{<<~"begin;"}\n#{<<~'end;'}")
+      begin;
+        class AutoloadTest
+          ZZZ = :ZZZ
+          private_constant :ZZZ
+        end
+      end;
+      assert_separately(%W[-I #{tmpdir}], "#{<<-"begin;"}\n#{<<-'end;'}")
+      bug = '[ruby-core:85516] [Bug #14469]'
+      begin;
+        class AutoloadTest
+          autoload :ZZZ, "zzz.rb"
+        end
+        assert_raise(NameError, bug) {AutoloadTest::ZZZ}
+      end;
+    end
+  end
+
+  def test_autoload_deprecate_constant
+    Dir.mktmpdir('autoload') do |tmpdir|
+      File.write(tmpdir+"/zzz.rb", "#{<<~"begin;"}\n#{<<~'end;'}")
+      begin;
+        class AutoloadTest
+          ZZZ = :ZZZ
+          deprecate_constant :ZZZ
+        end
+      end;
+      assert_separately(%W[-I #{tmpdir}], "#{<<-"begin;"}\n#{<<-'end;'}")
+      bug = '[ruby-core:85516] [Bug #14469]'
+      begin;
+        class AutoloadTest
+          autoload :ZZZ, "zzz.rb"
+        end
+        assert_warning(/ZZZ is deprecated/, bug) {AutoloadTest::ZZZ}
+      end;
+    end
+  end
+
   def add_autoload(path)
     (@autoload_paths ||= []) << path
     ::Object.class_eval {autoload(:AutoloadTest, path)}
Index: ruby_2_4/vm_insnhelper.c
===================================================================
--- ruby_2_4/vm_insnhelper.c	(revision 62915)
+++ ruby_2_4/vm_insnhelper.c	(revision 62916)
@@ -790,7 +790,7 @@ vm_get_ev_const(rb_thread_t *th, VALUE o https://github.com/ruby/ruby/blob/trunk/ruby_2_4/vm_insnhelper.c#L790
 			if (am == klass) break;
 			am = klass;
 			if (is_defined) return 1;
-			if (rb_autoloading_value(klass, id, &av)) return av;
+			if (rb_autoloading_value(klass, id, &av, NULL)) return av;
 			rb_autoload_load(klass, id);
 			goto search_continue;
 		    }
Index: ruby_2_4/constant.h
===================================================================
--- ruby_2_4/constant.h	(revision 62915)
+++ ruby_2_4/constant.h	(revision 62916)
@@ -46,5 +46,6 @@ int rb_public_const_defined(VALUE klass, https://github.com/ruby/ruby/blob/trunk/ruby_2_4/constant.h#L46
 int rb_public_const_defined_at(VALUE klass, ID id);
 int rb_public_const_defined_from(VALUE klass, ID id);
 rb_const_entry_t *rb_const_lookup(VALUE klass, ID id);
+int rb_autoloading_value(VALUE mod, ID id, VALUE *value, rb_const_flag_t *flag);
 
 #endif /* CONSTANT_H */
Index: ruby_2_4/vm_core.h
===================================================================
--- ruby_2_4/vm_core.h	(revision 62915)
+++ ruby_2_4/vm_core.h	(revision 62916)
@@ -1477,8 +1477,6 @@ void rb_vm_register_special_exception(en https://github.com/ruby/ruby/blob/trunk/ruby_2_4/vm_core.h#L1477
 
 void rb_gc_mark_machine_stack(rb_thread_t *th);
 
-int rb_autoloading_value(VALUE mod, ID id, VALUE* value);
-
 void rb_vm_rewrite_cref(rb_cref_t *node, VALUE old_klass, VALUE new_klass, rb_cref_t **new_cref_ptr);
 
 const rb_callable_method_entry_t *rb_vm_frame_method_entry(const rb_control_frame_t *cfp);
Index: ruby_2_4
===================================================================
--- ruby_2_4	(revision 62915)
+++ ruby_2_4	(revision 62916)

Property changes on: ruby_2_4
___________________________________________________________________
Modified: svn:mergeinfo
## -0,0 +0,1 ##
   Merged /trunk:r62394-62395

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]