Issue #9507 has been updated by Eric Wong.


 rubylang.10.webmeister / spamgourmet.com wrote:
 > My config.h for ARMv5 contains both `#define HAVE_LONG_LONG 1` and
 > `#define HAVE_UINT64_T 1`, so for all versions of the code it will
 > always take the first path. The `unsigned long long` variant as well
 > as the `uint64_t` variant seem to be broken on ARMv5, so I decided to
 > try the third one (`unsigned long`) by simply removing all other
 > alternatives (patch attached). This successfully fixes the problem.
 
 Could be a compiler problem with 64-bit emulation.  Which
 compiler/version is this?  Can you try a newer one?
 Can you try any other code which uses 64-bit math?
 
 Also, it could be an alignment problem; but I don't see places
 where rb_serial_t is not 32-bit aligned...
 
 > I'm not sure why you use the different types in the first place. If it
 > works with `unsigned long` (i.e. you do not need more than 32 bits),
 > what is the benefit of using `unsigned long long`? If it does bring
 > some benefit for other architectures, could you disable its usage at
 > least on ARMv5 or check your code whether it makes some assumptions
 > about these types that do not hold on ARMv5?
 
 64-bits is needed to avoid overflow on VM state changes.
 Otherwise our caches could give false hits and crash.

----------------------------------------
Bug #9507: Ruby 2.1.0 is broken on ARMv5: tried to create Proc object without a block
https://bugs.ruby-lang.org/issues/9507#change-45551

* Author: _ _
* Status: Open
* Priority: Normal
* Assignee: Charlie Somerville
* Category: core
* Target version: current: 2.2.0
* ruby -v: ruby 2.1.0dev (2013-09-04 trunk 42822) [armv5tel-linux-eabi]
* Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN
----------------------------------------
I'm using Arch Linux ARM which currently ships with Ruby 2.1.0. On all my ARMv5 devices, trying to run Ruby fails with a strange error, which has also been reported here: https://github.com/archlinuxarm/PKGBUILDs/issues/705 ARMv6 and ARMv7 devices on the other hand seem to be fine.

Using git-bisect I was able to determine that the first bad commit is 2f522b9cc6f3e184404040b12af4486520a73b26 (r42822), which implements #8426:

    [root@alarm ~]# ruby --version
    ruby 2.1.0dev (2013-09-04 trunk 42822) [armv5tel-linux-eabi]
    [root@alarm ~]# ruby -e 'puts "foo"'
    /usr/lib/ruby/2.1.0/rubygems/requirement.rb:26:in `lambda': tried to create Proc object without a block (ArgumentError)
    	from /usr/lib/ruby/2.1.0/rubygems/requirement.rb:26:in `<class:Requirement>'
    	from /usr/lib/ruby/2.1.0/rubygems/requirement.rb:18:in `<top (required)>'
    	from /usr/lib/ruby/2.1.0/rubygems/specification.rb:10:in `require'
    	from /usr/lib/ruby/2.1.0/rubygems/specification.rb:10:in `<top (required)>'
    	from /usr/lib/ruby/2.1.0/rubygems.rb:1161:in `require'
    	from /usr/lib/ruby/2.1.0/rubygems.rb:1161:in `<module:Gem>'
    	from /usr/lib/ruby/2.1.0/rubygems.rb:114:in `<top (required)>'
    	from <internal:gem_prelude>:1:in `require'
    	from <internal:gem_prelude>:1:in `<compiled>'

The previous commit works correctly:

    [root@alarm ~]# ruby --version
    ruby 2.1.0dev (2013-09-04 trunk 42821) [armv5tel-linux-eabi]
    [root@alarm ~]# ruby -e 'puts "foo"'
    foo

The problem is still present in trunk (r44896).

---Files--------------------------------
0002-Use-only-unsigned-long-for-rb_serial_t.patch (538 Bytes)


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