Issue #3861 has been updated by Naohisa Goto.

File fiddle-sparcv9.patch added
Status changed from Rejected to Open
Priority changed from Low to Normal
ruby -v changed from ruby 1.9.2p0 (2010-08-18 revision 29036) [sparc64-openbsd4.8] to ruby 1.9.4dev (2011-08-05 trunk 32863) [sparc64-solaris2.10]

This is also reproduced on sparc64 Solaris10 with latest Ruby.
This is not because of endian, nor libffi bug, but a bug of Fiddle.
Patch is attached.

The manpage of ffi_call(3) (http://linux.die.net/man/3/ffi_call ) says:
"rvalue must point to storage that is sizeof(long) or larger. For smaller return value sizes, the ffi_arg or ffi_sarg integral type must be used to hold the return value."
but Fiddle did not use ffi_arg nor ffi_sarg for getting the "rvalue" after ffi_call and closure callback.

Note that value_to_generic and generic_to_value are asymmetric after the patch.
In addition, to avoid potential bug in big-endian architecture, the patch also modifies value_to_generic() to strictly distinguish char, short and int.
----------------------------------------
Bug #3861: Endian bugs in fiddle/dl on sparc64
http://redmine.ruby-lang.org/issues/3861

Author: Jeremy Evans
Status: Open
Priority: Normal
Assignee: Aaron Patterson
Category: lib
Target version: 
ruby -v: ruby 1.9.4dev (2011-08-05 trunk 32863) [sparc64-solaris2.10]


=begin
 Running the test suite for 1.9.2 on sparc64 on OpenBSD, the following errors on received:
 
   2) Failure:
 test_callback(DL::TestDL)
 [/usr/ports/pobj/ruby-1.9.2-p0/ruby-1.9.2-p0/test/dl/test_dl2.rb:144]:
 <"aabbfoorz"> expected but was
 <"zabrfbooa">.
 
   3) Failure:
 test_isdigit(DL::TestFunc)
 [/usr/ports/pobj/ruby-1.9.2-p0/ruby-1.9.2-p0/test/dl/test_func.rb:67]:
 Expected 0 to be > 0.
 
   4) Failure:
 test_qsort1(DL::TestFunc)
 [/usr/ports/pobj/ruby-1.9.2-p0/ruby-1.9.2-p0/test/dl/test_func.rb:95]:
 <"1349"> expected but was
 <"9341">.
 
   5) Failure:
 test_qsort2(DL::TestFunc)
 [/usr/ports/pobj/ruby-1.9.2-p0/ruby-1.9.2-p0/test/dl/test_func.rb:105]:
 <"1349"> expected but was
 <"9341">.
 
   6) Failure:
 test_isdigit(DL::TestImport)
 [/usr/ports/pobj/ruby-1.9.2-p0/ruby-1.9.2-p0/test/dl/test_import.rb:126]:
 Expected 0 to be > 0.
 
 It's possible this is an upstream issue with libffi.  If so, please let me know and I'll report it to the libffi developers.
=end



-- 
http://redmine.ruby-lang.org