Issue #9507 has been updated by _ _.

File 0002-Use-only-unsigned-long-for-rb_serial_t.patch added

With the bug still being present in both ruby_2_1 (r45227) and trunk (r45225), I had a more detailed look at the commit that first introduced this problem. The only somewhat architecture-dependent change in the original commit is this in internal.h:

    +#if HAVE_UINT64_T
    +    typedef uint64_t vm_state_version_t;
    +#else
    +    typedef unsigned long long vm_state_version_t;
    +#endif

In the current code base the corresponding fragment reads:

    #if defined(HAVE_LONG_LONG)
    typedef unsigned LONG_LONG rb_serial_t;
    #define SERIALT2NUM ULL2NUM
    #elif defined(HAVE_UINT64_T)
    typedef uint64_t rb_serial_t;
    #define SERIALT2NUM SIZET2NUM
    #else
    typedef unsigned long rb_serial_t;
    #define SERIALT2NUM ULONG2NUM
    #endif

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.

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?

----------------------------------------
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-45545

* 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/