Hi, There's a line in array.c which confuses the Borland 5.5 compiler optimizer into corrupting a pointer held in a register. Use of -O2 flag with the 'free' compiler causes a SEGV in miniruby during the bccwin32 build process. I tried to produce a small test case for the Borland community to comment on but without success, so I can't say if this is a known problem or even what the problem is. It doesn't occur anywhere else in the 183p1 source. Fix has a much smaller impact than adding 'volatile' would have. I don't like the code change, especially as it means the same thing but it will be preferable to the SEGV if you can bear it. --- * array.c (sort_2): work around SEGV caused by rare Borland 5.5 compiler bug when using optimize -O2 flag [ruby-core:5152] ======================================================================= --- array_1_137_2_23.c Fri May 13 03:38:18 2005 +++ array_patched.c Mon Jun 06 17:35:30 2005 @@ -1584,7 +1584,7 @@ sort_2(ap, bp, data) if ((long)a < (long)b) return -1; return 0; } - if (TYPE(a) == T_STRING && TYPE(b) == T_STRING) { + if (TYPE(a) == T_STRING) if (TYPE(b) == T_STRING) { /* OK: && */ return rb_str_cmp(a, b); } ======================================================================= In case you're interested, here's the offending part of the assembler expansion: ; ; if (TYPE(a) == T_STRING && TYPE(b) == T_STRING) { ; ; EBX = a, ESI = b ; returns EDX ; <snip> ; [ TYPE(a) ] if (a == Qundef) return T_UNDEF; cmp ebx,6 jne short @542 mov edx,60 jmp short @543 @542: ; [ TYPE(a) ] if (SYMBOL_P(a)) return T_SYMBOL; and ebx,255 ; <---*** VALUE 'a' in EBX corrupted *** cmp ebx,14 jne short @544 mov edx,36 jmp short @545 @544: ; return BUILTIN_TYPE(a); mov edx,dword ptr [ebx] ; <---*** SEGV (ebx) and edx,63 @543: @545: ; <snip> same for TYPE(b) } The bug sends its apologies :-o daz begin 666 array_bccO2.patch M+2TM(&%R<F%Y7S%?,3,W7S)?,C,N8PE&<FD@36%Y(#$S(# S.C,X.C$X(#(P M,#4**RLK(&%R<F%Y7W!A=&-H960N8PD)36]N($IU;B P-B Q-SHS-3HS," R M,# U"D! ("TQ-3@T+#<@*S$U.#0L-R! 0"!S;W)T7S(H87 L(&)P+"!D871A M*0H@"6EF("@H;&]N9REA(#P@*&QO;F<I8BD@<F5T=7)N("TQ.PH@"7)E='5R M;B P.PH@(" @('T*+2 @("!I9B H5%E012AA*2 ]/2!47U-44DE.1R F)B!4 M65!%*&(I(#T](%1?4U1224Y'*2!["BL@(" @:68@*%194$4H82D@/3T@5%]3 M5%))3D<I(&EF("A465!%*&(I(#T](%1?4U1224Y'*2![(" O*B!/2SH@)B8@ E*B\*( ER971U<FX@<F)?<W1R7V-M<"AA+"!B*3L*(" @("!]"@`` ` end