1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Support shareable_constant_value pragma

This commit is contained in:
Nobuyoshi Nakada 2020-10-09 20:06:30 +09:00
parent 7060d6b721
commit b1bd223085
Notes: git 2020-12-14 19:19:48 +09:00
2 changed files with 19 additions and 0 deletions

13
parse.y
View file

@ -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},

View file

@ -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")}}