summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2020-10-09 20:06:30 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2020-12-14 19:19:16 +0900
commitb1bd223085d7b97d8de8679894a81b7993c26b28 (patch)
tree67ce568039110f8c6fc4190179983c6a6b66302a
parent7060d6b721092d56f1cbc084940db960e01671fd (diff)
Support shareable_constant_value pragma
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3681
-rw-r--r--parse.y13
-rw-r--r--test/ruby/test_parse.rb6
2 files changed, 19 insertions, 0 deletions
diff --git a/parse.y b/parse.y
index ff413d8b1b..3c9b9e0d43 100644
--- a/parse.y
+++ b/parse.y
@@ -31,6 +31,7 @@ struct lex_context {
unsigned int in_kwarg: 1;
unsigned int in_def: 1;
unsigned int in_class: 1;
+ unsigned int shareable_constant_value: 1;
};
#include "internal.h"
@@ -959,6 +960,7 @@ restore_defun(struct parser_params *p, NODE *name)
YYSTYPE c = {.val = name->nd_cval};
p->cur_arg = name->nd_vid;
p->ctxt.in_def = c.ctxt.in_def;
+ p->ctxt.shareable_constant_value = c.ctxt.shareable_constant_value;
}
static void
@@ -3087,6 +3089,7 @@ primary : literal
/*% ripper: class!($2, $3, $5) %*/
local_pop(p);
p->ctxt.in_class = $<ctxt>1.in_class;
+ p->ctxt.shareable_constant_value = $<ctxt>1.shareable_constant_value;
}
| k_class tLSHFT expr
{
@@ -3108,6 +3111,7 @@ primary : literal
local_pop(p);
p->ctxt.in_def = $<ctxt>1.in_def;
p->ctxt.in_class = $<ctxt>1.in_class;
+ p->ctxt.shareable_constant_value = $<ctxt>1.shareable_constant_value;
}
| k_module cpath
{
@@ -3130,6 +3134,7 @@ primary : literal
/*% ripper: module!($2, $4) %*/
local_pop(p);
p->ctxt.in_class = $<ctxt>1.in_class;
+ p->ctxt.shareable_constant_value = $<ctxt>1.shareable_constant_value;
}
| defn_head
f_arglist
@@ -7978,6 +7983,13 @@ parser_set_compile_option_flag(struct parser_params *p, const char *name, const
(b ? Qtrue : Qfalse));
}
+static void
+parser_set_shareable_constant_value(struct parser_params *p, const char *name, const char *val)
+{
+ int b = parser_get_bool(p, name, val);
+ if (b >= 0) p->ctxt.shareable_constant_value = b;
+}
+
# if WARN_PAST_SCOPE
static void
parser_set_past_scope(struct parser_params *p, const char *name, const char *val)
@@ -7997,6 +8009,7 @@ static const struct magic_comment magic_comments[] = {
{"coding", magic_comment_encoding, parser_encode_length},
{"encoding", magic_comment_encoding, parser_encode_length},
{"frozen_string_literal", parser_set_compile_option_flag},
+ {"shareable_constant_value", parser_set_shareable_constant_value},
{"warn_indent", parser_set_token_info},
# if WARN_PAST_SCOPE
{"warn_past_scope", parser_set_past_scope},
diff --git a/test/ruby/test_parse.rb b/test/ruby/test_parse.rb
index 422a7cba58..1ed92d59a4 100644
--- a/test/ruby/test_parse.rb
+++ b/test/ruby/test_parse.rb
@@ -1174,6 +1174,12 @@ x = __ENCODING__
assert_equal(1, ex.message.scan(w).size, "same #{w.inspect} warning should be just once")
end
+ def test_shareable_constant_value
+ assert_warning(/invalid value/) do
+ assert_valid_syntax("# shareable_constant_value: invalid-option", verbose: true)
+ end
+ end
+
=begin
def test_past_scope_variable
assert_warning(/past scope/) {catch {|tag| eval("BEGIN{throw tag}; tap {a = 1}; a")}}