Commit 3cf48713 authored by Rory OConnell's avatar Rory OConnell

Work around more MSC optimzer bugs

parent 6d565211
......@@ -220,12 +220,30 @@ mrb_ary_shuffle_bang(mrb_state *mrb, mrb_value ary)
/*
* MSC compiler bug generating invalid instructions with optimization
* enabled
* enabled. MSC errantly uses a hardcoded value with optimizations on
* when using a fixed value from a union.
* Creating a temp volatile variable and reassigning back to the original
* value tricks the compiler to not perform this optimization;
*/
#if defined _MSC_VER && _MSC_VER >= 1923
volatile mrb_value rr;
rr = r;
r = rr;
/* C++ will not cast away volatile easily, so we cannot do something like
* volatile mrb_value rr = r; r = (mrb_value)rr; with C++.
* That cast does work with C.
* We also have to trick the compiler to not optimize away the const_cast entirely
* by creating and manipulating an intermediate volatile pointer.
*/
volatile mrb_value *v_r;
volatile mrb_int ii;
mrb_value *p_r;
v_r = &r;
ii = 2;
v_r = v_r + 2;
#if defined __cplusplus
p_r = const_cast<mrb_value*>(v_r - ii);
#else
p_r = (mrb_value*)v_r - ii;
#endif
r = *p_r;
#endif
if (RARRAY_LEN(ary) > 1) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment