[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

ruby19 and defined?

Joel VanderWerf

3/21/2008 5:12:00 PM


This seems to be a change in 1.9 that's breaking some code (it was
reported by a user of the bit-struct library). Here's the test case:

class C; def self.foo; end; end
class D<C
p superclass
p defined?(superclass.foo)
p defined?(superclass.fooz)
end

$ ruby -v bug.rb
ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-linux]
C
"method"
nil
$ ruby19 -v bug.rb
ruby 1.9.0 (2007-12-25 revision 14709) [i686-linux]
C
true
true
$ ruby19svn -v bug.rb
ruby 1.9.0 (2008-03-21 revision 15824) [i686-linux]
C
true
true

I don't see anything quite relevant in
http://eigenclass.org/hiki/Changes+i....

--
vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407

4 Answers

Roger Pack

3/21/2008 5:54:00 PM

0

I know there was an RCR related to this once. Maybe it was accepted.
GL.
-R

> $ ruby -v bug.rb
> ruby 1.8.6 (2007-09-24 patchlevel 111) [i686-linux]
> C
> "method"
> nil
> $ ruby19 -v bug.rb
> ruby 1.9.0 (2007-12-25 revision 14709) [i686-linux]
> C
> true
> true
--
Posted via http://www.ruby-....

Sebastian Hungerecker

3/22/2008 9:53:00 AM

0

Roger Pack wrote:
> I know there was an RCR related to this once. =C2=A0Maybe it was accepted.

You mean an RCR proposing that defined? return true, right?
The problem here is not that defined? returns true instead of "method" thou=
gh.
The problem is that it returns true instead of nil for the method that does=
n't
exist. I doubt that that behaviour was proposed in an RCR.

=2D-=20
Jabber: sepp2k@jabber.org
ICQ: 205544826

Rick DeNatale

3/22/2008 1:12:00 PM

0

On 3/22/08, Sebastian Hungerecker <sepp2k@googlemail.com> wrote:
> Roger Pack wrote:
> > I know there was an RCR related to this once. Maybe it was accepted.
>
>
> You mean an RCR proposing that defined? return true, right?
> The problem here is not that defined? returns true instead of "method" though.
> The problem is that it returns true instead of nil for the method that doesn't
> exist. I doubt that that behaviour was proposed in an RCR.

Hmmmm, not so sure that that's actually a bug.

I've not found a good definition for what define? is supposed to do
when given an expression instead of a simple term. It certainly never
evaluated the expression. I don't know that I've ever used it with an
expression, but my impression was that it works syntactically more
than semantically, so whether or not a given expression would raise an
exception when evaluated wouldn't affect whether the expression was
defined. For example, I'd expect that

defined?(1/0)

would not indicate that the expression was undefined just because it
represents a divide by zero.

Having just looked at the latest beta of Pickaxe 3, I notice that Dave
still has define? returning strings instead of true/nil, and the page
has the red header indicating that it's been updated for 1.9.

Personally, I'm unhappy if 1.9 is no longer returning a description of
the syntactical class of the argument to defined? seems like a loss of
valuable information, and I'd hope that it was the returning of nil
rather than 'method' which is a bug.


--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denh...

ts

3/22/2008 1:21:00 PM

0

Rick DeNatale wrote:
> Hmmmm, not so sure that that's actually a bug.

It's a bug

Here the bytecode

vgs% ./ruby -ve 'puts
VM::InstructionSequence.compile("defined?(a.b)").disasm'
ruby 1.9.0 (2008-03-21 revision 15825) [i686-linux]
<compiled>:1: warning: useless use of defined? in void context
== disasm: <ISeq:<compiled>@<compiled>>=================================
0000 putself ( 1)
0001 defined 21, :a, false
0005 leave
0006 pop
0007 branchif 12
0009 putnil
0010 leave
0011 pop
0012 putnil
0013 send :a, 0, nil, 24, <ic>
0019 defined 13, :b, true
0023 leave
vgs%

Now if I add 'p'

vgs% ./ruby -ve 'puts VM::InstructionSequence.compile("p
defined?(a.b)").disasm'
ruby 1.9.0 (2008-03-21 revision 15825) [i686-linux]
== disasm: <ISeq:<compiled>@<compiled>>=================================
0000 putnil ( 1)
0001 putself
0002 defined 21, :a, false
0006 jump 24
0008 branchif 13
0010 putnil
0011 jump 24
0013 putnil
0014 send :a, 0, nil, 24, <ic>
0020 defined 13, :b, true
0024 send :p, 1, nil, 8, <ic>
0030 leave
vgs%



See the bytecode 'jump 24' in 0006


Guy Decoux