I'm getting Neko to go into an infinite loop with Int32 operations (source code as haXe).
I can reproduce it easily enough, but not with a fixed set of input --
that is, it happens at random, but frequently.
The code, in haXe is a Mersenne Twister initilization loop:
inline static var _N = 624;
public function initializeGenerator( seed : Int ) {
mt[0] = Int32.ofInt( seed );
for( i in 1..._N ) {
mt[i] = Int32.add( uintMul( Int32.make( 0x6c07, 0x8965 ), Int32.xor(
mt[i-1], ( Int32.ushr( mt[i-1], 30) ) ) ), Int32.ofInt( i ) );
}
}
Some stack traces from GDB, obtained by breaking when I detect a loop
and dumping the stack. I then "cont" and break a few times to get
different stacks.
Program received signal SIGINT, Interrupt.
0x00002ae72cdd1fa0 in memcpy () from /lib/libc.so.6
(gdb) back
#0 0x00002ae72cdd1fa0 in memcpy () from /lib/libc.so.6
#1 0x00002ae72cb3ffad in neko_interp () from /usr/local/lib/libneko.so
#2 0x00002ae72cb3a9fa in neko_val_callEx () from /usr/local/lib/libneko.so
#3 0x00002ae72cb3e4a5 in neko_interp_loop () from /usr/local/lib/libneko.so
#4 0x00002ae72cb400e9 in neko_interp () from /usr/local/lib/libneko.so
#5 0x00002ae72cb3a9fa in neko_val_callEx () from /usr/local/lib/libneko.so
#6 0x00002ae72cb39270 in builtin_call () from /usr/local/lib/libneko.so
#7 0x00002ae72cb3eb02 in neko_interp_loop () from /usr/local/lib/libneko.so
#8 0x00002ae72cb400e9 in neko_interp () from /usr/local/lib/libneko.so
#9 0x00002ae72cb40248 in neko_vm_execute () from /usr/local/lib/libneko.so
#10 0x00002ae72cb40e12 in loader_loadmodule () from
/usr/local/lib/libneko.so
#11 0x00002ae72cb3a8b9 in neko_val_callEx () from /usr/local/lib/libneko.so
#12 0x0000000000401e38 in neko_stats_measure ()
#13 0x00002ae72cd7a4ca in __libc_start_main () from /lib/libc.so.6
#14 0x00000000004012fa in ?? ()
#15 0x00007fff7e08c6f8 in ?? ()
#16 0x0000000000000000 in ?? ()
Program received signal SIGINT, Interrupt.
0x00002ae72cc51531 in pthread_getspecific () from /lib/libpthread.so.0
(gdb) break
Breakpoint 1 at 0x2ae72cc51531
(gdb) back
#0 0x00002ae72cc51531 in pthread_getspecific () from /lib/libpthread.so.0
#1 0x00002ae72cb3a560 in neko_val_callEx () from /usr/local/lib/libneko.so
#2 0x00002ae72cb3e4a5 in neko_interp_loop () from /usr/local/lib/libneko.so
#3 0x00002ae72cb400e9 in neko_interp () from /usr/local/lib/libneko.so
#4 0x00002ae72cb3a9fa in neko_val_callEx () from /usr/local/lib/libneko.so
#5 0x00002ae72cb39270 in builtin_call () from /usr/local/lib/libneko.so
#6 0x00002ae72cb3eb02 in neko_interp_loop () from /usr/local/lib/libneko.so
#7 0x00002ae72cb400e9 in neko_interp () from /usr/local/lib/libneko.so
#8 0x00002ae72cb40248 in neko_vm_execute () from /usr/local/lib/libneko.so
#9 0x00002ae72cb40e12 in loader_loadmodule () from
/usr/local/lib/libneko.so
#10 0x00002ae72cb3a8b9 in neko_val_callEx () from /usr/local/lib/libneko.so
#11 0x0000000000401e38 in neko_stats_measure ()
#12 0x00002ae72cd7a4ca in __libc_start_main () from /lib/libc.so.6
#13 0x00000000004012fa in ?? ()
#14 0x00007fff7e08c6f8 in ?? ()
#15 0x0000000000000000 in ?? ()
rogram received signal SIGINT, Interrupt.
0x00002ae72cdd1f96 in memcpy () from /lib/libc.so.6
(gdb) back
#0 0x00002ae72cdd1f96 in memcpy () from /lib/libc.so.6
#1 0x00002ae72cb3ffad in neko_interp () from /usr/local/lib/libneko.so
#2 0x00002ae72cb3a9fa in neko_val_callEx () from /usr/local/lib/libneko.so
#3 0x00002ae72cb3e4a5 in neko_interp_loop () from /usr/local/lib/libneko.so
#4 0x00002ae72cb400e9 in neko_interp () from /usr/local/lib/libneko.so
#5 0x00002ae72cb3a9fa in neko_val_callEx () from /usr/local/lib/libneko.so
#6 0x00002ae72cb39270 in builtin_call () from /usr/local/lib/libneko.so
#7 0x00002ae72cb3eb02 in neko_interp_loop () from /usr/local/lib/libneko.so
#8 0x00002ae72cb400e9 in neko_interp () from /usr/local/lib/libneko.so
#9 0x00002ae72cb40248 in neko_vm_execute () from /usr/local/lib/libneko.so
#10 0x00002ae72cb40e12 in loader_loadmodule () from
/usr/local/lib/libneko.so
#11 0x00002ae72cb3a8b9 in neko_val_callEx () from /usr/local/lib/libneko.so
#12 0x0000000000401e38 in neko_stats_measure ()
#13 0x00002ae72cd7a4ca in __libc_start_main () from /lib/libc.so.6
#14 0x00000000004012fa in ?? ()
#15 0x00007fff7e08c6f8 in ?? ()
#16 0x0000000000000000 in ?? ()
The code for uintMul is:
/**
* Public only for test cases
* Ref: http://www.cs.uaf.edu/~cs301/notes/Chapter5/node5.html
*/
public function uintMul( a : Int32, b : Int32 )
{
//FEATURE: could we probably just use normal ints after this
initial
transformation?
var A = Int32.ushr( a, 16 );
var B = Int32.and( a, Int32.ofInt( 0xffff ) );
var C = Int32.ushr( b, 16 );
var D = Int32.and( b, Int32.ofInt( 0xffff ) );
var BD = Int32.mul( B, D );
var AD = Int32.mul( A, D );
var CB = Int32.mul( C, B );
//we have no place to store the AC so we don't calculate that
part
var hi = Int32.add( Int32.add( Int32.ushr( BD, 16 ), AD ), CB );
var lo = Int32.and( BD, Int32.ofInt( 0xffff ) );
return Int32.add( lo, Int32.shl( hi, 16 ) );
}
--
edA-qa mort-ora-y
http://disemia.com/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Have a look in my brain:
http://brainbrain.eu/
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
Sign: Please digitally sign your emails.
Encrypt: I'm also happy to receive encrypted mail.
signature.asc
Description: OpenPGP digital signature
-- Neko : One VM to run them all (http://nekovm.org)
