diff options
author | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-01-08 07:47:49 +0000 |
---|---|---|
committer | nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2016-01-08 07:47:49 +0000 |
commit | 7d9054e2d315a5f3fdcb0fac4bc639e485bf835a (patch) | |
tree | e2068aebbe9cd72db52a8be4c3777fd3f1d857f7 /iseq.c | |
parent | c62897b2671afeb5c78e535c382648c9a23f8c4b (diff) | |
download | ruby-7d9054e2d315a5f3fdcb0fac4bc639e485bf835a.tar.gz |
iseq.c: make local variables volatile
* iseq.c (rb_iseq_compile_with_option): prepare arguments outside
EXEC_TAG, and make local variables volatile not to be clobbered
by longjmp.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@53460 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'iseq.c')
-rw-r--r-- | iseq.c | 28 |
1 files changed, 16 insertions, 12 deletions
@@ -606,21 +606,25 @@ rb_iseq_compile_with_option(VALUE src, VALUE file, VALUE absolute_path, VALUE li const rb_iseq_t *const parent = base_block ? base_block->iseq : NULL; rb_compile_option_t option; const enum iseq_type type = parent ? ISEQ_TYPE_EVAL : ISEQ_TYPE_TOP; - - StringValueCStr(file); - - make_compile_option(&option, opt); +#if defined(__GNUC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 8 +# define INITIALIZED volatile /* suppress warnings by gcc 4.8 */ +#else +# define INITIALIZED volatile +#endif + /* safe results first */ + const INITIALIZED int ln = (make_compile_option(&option, opt), NUM2INT(line)); + NODE *(*const INITIALIZED parse)(VALUE vparser, VALUE fname, VALUE file, int start) = + (StringValueCStr(file), RB_TYPE_P(src, T_FILE)) ? + rb_parser_compile_file_path : + (StringValue(src), rb_parser_compile_string_path); + /* should never fail usually */ + const INITIALIZED VALUE label = parent ? + parent->body->location.label : + rb_fstring_cstr("<compiled>"); th->base_block = base_block; TH_PUSH_TAG(th); if ((state = EXEC_TAG()) == 0) { - VALUE label = parent ? parent->body->location.label : - rb_fstring_cstr("<compiled>"); - int ln = NUM2INT(line); - NODE *(*parse)(VALUE vparser, VALUE fname, VALUE file, int start) = - (RB_TYPE_P(src, T_FILE) ? - rb_parser_compile_file_path : - (StringValue(src), rb_parser_compile_string_path)); NODE *node = (*parse)(rb_parser_new(), file, src, ln); if (node) { /* TODO: check err */ iseq = rb_iseq_new_with_opt(node, label, file, absolute_path, line, @@ -631,10 +635,10 @@ rb_iseq_compile_with_option(VALUE src, VALUE file, VALUE absolute_path, VALUE li th->base_block = prev_base_block; - if (!iseq) rb_exc_raise(th->errinfo); if (state) { JUMP_TAG(state); } + if (!iseq) rb_exc_raise(th->errinfo); return iseq; } |