lang/ruby21: fix setjmp clobbered variables

PR:		206108
Submitted by:	dim
This commit is contained in:
Steve Wills 2016-12-08 02:57:06 +00:00
parent 7c4332af9c
commit 14dbe10ed5
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=428094
6 changed files with 91 additions and 1 deletions

View file

@ -155,7 +155,7 @@ RUBY?= ${LOCALBASE}/bin/${RUBY_NAME}
# Ruby 2.1
#
RUBY_RELVERSION= 2.1.10
RUBY_PORTREVISION= 0
RUBY_PORTREVISION= 1
RUBY_PORTEPOCH= 1
RUBY_PATCHLEVEL= 0
RUBY21= "" # PLIST_SUB helpers

View file

@ -0,0 +1,20 @@
--- eval.c.orig 2015-01-21 17:09:59.000000000 +0100
+++ eval.c 2016-01-09 22:22:34.009232000 +0100
@@ -743,7 +743,7 @@ rb_rescue2(VALUE (* b_proc) (ANYARGS), V
{
int state;
rb_thread_t *th = GET_THREAD();
- rb_control_frame_t *cfp = th->cfp;
+ rb_control_frame_t *volatile cfp = th->cfp;
volatile VALUE result = Qfalse;
volatile VALUE e_info = th->errinfo;
va_list args;
@@ -809,7 +809,7 @@ rb_protect(VALUE (* proc) (VALUE), VALUE
volatile VALUE result = Qnil;
volatile int status;
rb_thread_t *th = GET_THREAD();
- rb_control_frame_t *cfp = th->cfp;
+ rb_control_frame_t *volatile cfp = th->cfp;
struct rb_vm_protect_tag protect_tag;
rb_jmpbuf_t org_jmpbuf;

View file

@ -0,0 +1,15 @@
--- eval_error.c.orig 2013-06-24 15:03:35.000000000 +0200
+++ eval_error.c 2016-01-10 01:00:43.200335000 +0100
@@ -80,9 +80,9 @@ static void
error_print(void)
{
volatile VALUE errat = Qundef;
- rb_thread_t *th = GET_THREAD();
- VALUE errinfo = th->errinfo;
- int raised_flag = th->raised_flag;
+ rb_thread_t *volatile th = GET_THREAD();
+ volatile VALUE errinfo = th->errinfo;
+ volatile int raised_flag = th->raised_flag;
volatile VALUE eclass = Qundef, e = Qundef;
const char *volatile einfo;
volatile long elen;

View file

@ -0,0 +1,13 @@
--- thread.c.orig 2015-03-09 18:40:36.000000000 +0100
+++ thread.c 2016-01-10 18:50:57.451040000 +0100
@@ -420,8 +420,8 @@ rb_threadptr_unlock_all_locking_mutexes(
void
rb_thread_terminate_all(void)
{
- rb_thread_t *th = GET_THREAD(); /* main thread */
- rb_vm_t *vm = th->vm;
+ rb_thread_t *volatile th = GET_THREAD(); /* main thread */
+ rb_vm_t *volatile vm = th->vm;
if (vm->main_thread != th) {
rb_bug("rb_thread_terminate_all: called by child thread (%p, %p)",

View file

@ -0,0 +1,31 @@
--- vm_eval.c.orig 2015-07-03 10:55:40.000000000 +0200
+++ vm_eval.c 2016-01-10 18:53:23.030473000 +0100
@@ -1062,7 +1062,7 @@ rb_iterate(VALUE (* it_proc) (VALUE), VA
int state;
volatile VALUE retval = Qnil;
NODE *node = NEW_IFUNC(bl_proc, data2);
- rb_thread_t *th = GET_THREAD();
+ rb_thread_t *volatile th = GET_THREAD();
rb_control_frame_t *volatile cfp = th->cfp;
node->nd_aid = rb_frame_this_func();
@@ -1190,7 +1190,7 @@ eval_string_with_cref(VALUE self, VALUE
int state;
VALUE result = Qundef;
VALUE envval;
- rb_thread_t *th = GET_THREAD();
+ rb_thread_t *volatile th = GET_THREAD();
rb_env_t *env = NULL;
rb_block_t block, *base_block;
volatile int parse_in_eval;
@@ -1843,8 +1843,8 @@ rb_catch_protect(VALUE t, rb_block_call_
{
int state;
volatile VALUE val = Qnil; /* OK */
- rb_thread_t *th = GET_THREAD();
- rb_control_frame_t *saved_cfp = th->cfp;
+ rb_thread_t *volatile th = GET_THREAD();
+ rb_control_frame_t *volatile saved_cfp = th->cfp;
volatile VALUE tag = t;
TH_PUSH_TAG(th);

View file

@ -0,0 +1,11 @@
--- vm_trace.c.orig 2015-11-18 12:26:40.000000000 +0100
+++ vm_trace.c 2016-01-10 18:54:08.421021000 +0100
@@ -392,7 +392,7 @@ rb_suppress_tracing(VALUE (*func)(VALUE)
volatile int raised;
volatile int outer_state;
VALUE result = Qnil;
- rb_thread_t *th = GET_THREAD();
+ rb_thread_t *volatile th = GET_THREAD();
int state;
const int tracing = th->trace_arg ? 1 : 0;
rb_trace_arg_t dummy_trace_arg;