diff --git a/spec/tags/1.9/ruby/core/struct/members_tags.txt b/spec/tags/1.9/ruby/core/struct/members_tags.txt deleted file mode 100644 index f5e0746f370..00000000000 --- a/spec/tags/1.9/ruby/core/struct/members_tags.txt +++ /dev/null @@ -1 +0,0 @@ -fails:Struct#members returns an array of attribute names diff --git a/src/org/jruby/RubyStruct.java b/src/org/jruby/RubyStruct.java index e0e29898a12..3c7e8a5443e 100644 --- a/src/org/jruby/RubyStruct.java +++ b/src/org/jruby/RubyStruct.java @@ -305,10 +305,15 @@ public static IRubyObject newStruct(IRubyObject recv, IRubyObject arg0, IRubyObj return RubyStruct.newStruct(recv, arg0, arg1, arg2, block); } - @JRubyMethod + @JRubyMethod(name = "members", compat = CompatVersion.RUBY1_8) public static IRubyObject members(IRubyObject recv, Block block) { return RubyStruct.members(recv, block); } + + @JRubyMethod(name = "members", compat = CompatVersion.RUBY1_9) + public static IRubyObject members19(IRubyObject recv, Block block) { + return RubyStruct.members19(recv, block); + } } /** Create new Structure. @@ -428,10 +433,28 @@ public static RubyArray members(IRubyObject recv, Block block) { return result; } - @JRubyMethod + public static RubyArray members19(IRubyObject recv, Block block) { + RubyArray member = (RubyArray) getInternalVariable((RubyClass) recv, "__member__"); + + assert !member.isNil() : "uninitialized struct"; + + RubyArray result = recv.getRuntime().newArray(member.getLength()); + for (int i = 0,k=member.getLength(); i < k; i++) { + result.append(member.eltInternal(i)); + } + + return result; + } + + @JRubyMethod(name = "members", compat = CompatVersion.RUBY1_8) public RubyArray members() { return members(classOf(), Block.NULL_BLOCK); } + + @JRubyMethod(name = "members", compat = CompatVersion.RUBY1_9) + public RubyArray members19() { + return members19(classOf(), Block.NULL_BLOCK); + } @JRubyMethod public RubyArray select(ThreadContext context, Block block) {