At 11:13 -0500 2003.11.19, Dan Sugalski wrote: >On Wed, 19 Nov 2003, Rafael Garcia-Suarez wrote: > >> Dan Sugalski wrote: >> > Basically you're using a variable that can be affected by external things >> > in a way that pretty much guarantees that external things will be >> > happening. That it changes isn't much of a surprise. ($!/$^E may get >> > modified by some signal handlers too, depending on what you do, so there's >> > not even any guarantee that "$^E = 42; $^E++;" will end up with $^E set to >> > 43. >> >> Using the Mac OS X equivalent of truss/strace might help to find out >> why errno changes there. > >My bet would be that the print triggers an errno update, which strikes me >as perfectly reasonable.
Yes, I just realized you might think that, and I should have been more descriptive: it happens regardless of print. $ ktrace perl -le '$! = -1728; $x = $^E+0; $y = $^E+0; print $x; print $y' -1728 22 It has nothing to do with addition, either: :-) $ ktrace perl -le '$! = -1728; $x = $^E; $y = $^E; print $x; print $y' Unknown error: -1728 Invalid argument And since it doesn't change with $!, it is not merely because the error is unknown: $ ktrace perl -le '$! = -1728; $x = $!; $y = $!; print $x; print $y' Unknown error: -1728 Unknown error: -1728 Also, the ktrace output of that is identical to the output of the original (modulo addresses and PIDs): $ ktrace perl -le '$! = -1728; print $^E+0 for 0,1' -1728 22 No syscalls between the two assignments. No reason for errno to update. And even if it did, why would it only update when $^E is printed, and not $!? ktrace/kdump output below if anyone cares. But there's got to be something different about $^E from $! that is causing this bug. 1343 ktrace RET ktrace 0 1343 ktrace CALL execve(0xbffff3b0,0xbffff9e8,0xbffff9f8) 1343 ktrace NAMI "/Users/pudge/bin/perl" 1343 ktrace RET execve -1 errno 2 No such file or directory 1343 ktrace CALL execve(0xbffff3b0,0xbffff9e8,0xbffff9f8) 1343 ktrace NAMI "/usr/local/slash/bin/perl" 1343 ktrace RET execve -1 errno 2 No such file or directory 1343 ktrace CALL execve(0xbffff3b0,0xbffff9e8,0xbffff9f8) 1343 ktrace NAMI "/usr/local/apache/bin/perl" 1343 ktrace RET execve -1 errno 2 No such file or directory 1343 ktrace CALL execve(0xbffff3b0,0xbffff9e8,0xbffff9f8) 1343 ktrace NAMI "/usr/local/bin/perl" 1343 ktrace NAMI "/usr/lib/dyld" 1343 perl RET execve 0 1343 perl CALL getuid 1343 perl RET getuid 502/0x1f6 1343 perl CALL getuid 1343 perl RET getuid 502/0x1f6 1343 perl CALL getuid 1343 perl RET getuid 502/0x1f6 1343 perl CALL getgid 1343 perl RET getgid 20/0x14 1343 perl CALL getgid 1343 perl RET getgid 20/0x14 1343 perl CALL open(0x13d8,0,0) 1343 perl NAMI "/usr/local/lib/perl5/5.8.0/darwin/CORE/libperl.dylib" 1343 perl RET open 3 1343 perl CALL fstat(0x3,0xbffff770) 1343 perl RET fstat 0 1343 perl CALL close(0x3) 1343 perl RET close 0 1343 perl CALL open(0x1428,0,0) 1343 perl NAMI "/usr/lib/libSystem.B.dylib" 1343 perl RET open 3 1343 perl CALL fstat(0x3,0xbffff770) 1343 perl RET fstat 0 1343 perl CALL load_shared_file(0x1428,0x22b000,0x1798fc,0xbffff580,0x4,0xbffff510,0xbffff584) 1343 perl NAMI "/usr/lib/libSystem.B.dylib" 1343 perl RET load_shared_file 0 1343 perl CALL close(0x3) 1343 perl RET close 0 1343 perl CALL open(0x900006e8,0,0) 1343 perl NAMI "/usr/lib/system/libmathCommon.A.dylib" 1343 perl RET open 3 1343 perl CALL fstat(0x3,0xbffff700) 1343 perl RET fstat 0 1343 perl CALL load_shared_file(0x900006e8,0x7000,0x6ac4,0xbffff510,0x3,0xbffff4a0,0xbffff514) 1343 perl NAMI "/usr/lib/system/libmathCommon.A.dylib" 1343 perl RET load_shared_file 0 1343 perl CALL close(0x3) 1343 perl RET close 0 1343 perl CALL __sysctl(0xbffff918,0x2,0xbffff920,0xbffff924,0,0) 1343 perl RET __sysctl 0 1343 perl CALL sigaction(0x8,0xbffff850,0xbffff8c0) 1343 perl RET sigaction 0 1343 perl CALL getuid 1343 perl RET getuid 502/0x1f6 1343 perl CALL getuid 1343 perl RET getuid 502/0x1f6 1343 perl CALL getgid 1343 perl RET getgid 20/0x14 1343 perl CALL getgid 1343 perl RET getgid 20/0x14 1343 perl CALL open(0x3011c0,0,0x1b6) 1343 perl NAMI "/dev/null" 1343 perl RET open 3 1343 perl CALL fcntl(0x3,0x2,0x1) 1343 perl RET fcntl 0 1343 perl CALL sigaction(0x14,0,0xbffff3e0) 1343 perl RET sigaction 0 1343 perl CALL getpid 1343 perl RET getpid 1343/0x55a 1343 perl CALL close(0x3) 1343 perl RET close 0 1343 perl CALL fstat(0x1,0xbffff100) 1343 perl RET fstat 0 1343 perl CALL ioctl(0x1,FIODTYPE,0xbffff150) 1343 perl RET ioctl 0 1343 perl CALL write(0x1,0x7000,0x6) 1343 perl GIO fd 1 wrote 6 bytes "-1728 " 1343 perl RET write 6 1343 perl CALL write(0x1,0x7000,0x3) 1343 perl GIO fd 1 wrote 3 bytes "22 " 1343 perl RET write 3 1343 perl CALL exit(0) -- Chris Nandor [EMAIL PROTECTED] http://pudge.net/ Open Source Development Network [EMAIL PROTECTED] http://osdn.com/