Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

times macro confuses defining class lookup #72

Closed
nedgar opened this issue Mar 28, 2011 · 7 comments
Closed

times macro confuses defining class lookup #72

nedgar opened this issue Mar 28, 2011 · 7 comments

Comments

@nedgar
Copy link

nedgar commented Mar 28, 2011

Using mirah-0.0.8.dev-20110326

The following program:

def run(r:Runnable)
    r.run
end

run do 
    puts "Hi"
end

prints "Hi", but

def run(r:Runnable)
    r.run
end

100.times do
run do 
    puts "Hi"
end
end

fails with:

TimesRepeatTest.mirah:6: undefined method `defining_class' for #
run do 
^^^^^^^^
    puts "Hi"
^^^^^^^^^^^
end
^^^
Exception in thread "main" file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/ast/structure.rb:147:in `prepare': undefined method `defining_class' for # (Mirah::InternalCompilerError)
    from file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/ast/call.rb:96:in `infer'
    from file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:274:in `infer'
    from file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/ast/flow.rb:125:in `infer'
    from file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/ast/flow.rb:121:in `map'
    from file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/ast/flow.rb:121:in `infer'
    from file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/ast/call.rb:192:in `infer'
    from file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:274:in `infer'
    from file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:323:in `resolve'
     ... 14 levels...
    from src/org/mirah/mirah_command.rb:52:in `run'
    from src/org/mirah/mirah_command.rb:39:in `main'
    from :1
    ...internal jruby stack elided...
    from Mirah::Typer::Simple.infer(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/ast/flow.rb:125)
    from Mirah::AST::Loop.infer(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/ast/flow.rb:121)
    from Array.map(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/ast/flow.rb:121)
    from Mirah::AST::Loop.infer(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/META-INF/jruby.home/lib/ruby/1.8/delegate.rb:292)
    from #.method_missing(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/ast/call.rb:192)
    from Mirah::AST::Call.infer(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/META-INF/jruby.home/lib/ruby/1.8/delegate.rb:292)
    from #.method_missing(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:274)
    from Mirah::Typer::Simple.infer(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:323)
    from Mirah::Typer::Simple.resolve(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:321)
    from Hash.each(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:321)
    from Mirah::Typer::Simple.resolve(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:235)
    from Mirah::Typer::Simple.cycle(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:232)
    from Integer.times(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:232)
    from Mirah::Typer::Simple.cycle(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/typer/simple.rb:318)
    from Mirah::Typer::Simple.resolve(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/generator.rb:49)
    from Mirah::Generator.infer_asts(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/generator.rb:35)
    from Mirah::Generator.generate(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/commands/run.rb:30)
    from Mirah::Commands::Run.execute(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/commands/base.rb:40)
    from Mirah::Commands::Base.execute_base(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/commands/base.rb:37)
    from Kernel.catch(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/commands/base.rb:37)
    from Mirah::Commands::Base.execute_base(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah/commands/run.rb:23)
    from Mirah::Commands::Run.execute(file:/Users/nedgar/Mirah/mirah-0.0.8.dev/lib/mirah-complete.jar!/mirah.rb:40)
    from #.run(src/org/mirah/mirah_command.rb:52)
    from #.run(src/org/mirah/mirah_command.rb:39)
    from #.main(:1)
    from (unknown).(unknown)(:1)
@nedgar
Copy link
Author

nedgar commented Mar 28, 2011

It fails in the same way for:
class Runner
def run(r:Runnable)
r.run
end
end

Runner.new.run do
  i = 0
  while i < 100
    Runner.new.run do 
    puts "Hi"
    end
    i += 1
  end
end

If instead run is defined as a top-level method:
def run(r:Runnable)
r.run
end

run do
  i = 0
  while i < 100
    run do 
    puts "Hi"
    end
    i += 1
  end
end

it fails with:
Inference Error:
Cannot find instance method run(block) on TimesRepeatTest$__xform_tmp_2
TimesRepeatTest.mirah:8: Cannot find instance method run(block) on TimesRepeatTest$__xform_tmp_2
run do
^^^^^^^^
puts "Hi"
^^^^^^^^^^^
end
^^^

@nedgar
Copy link
Author

nedgar commented Mar 28, 2011

I thought maybe the hidden run method implementing Runnable.run was probably conflicting with the outer run, but if I rename the outer run to doit:
def doit(r:Runnable)
r.run
end

doit do
    i = 0
    while i < 100
        doit do 
            puts "Hi"
        end
        i += 1
    end
end

it still fails with: Cannot find instance method doit(block) on TimesRepeatTest$__xform_tmp_2

@nedgar
Copy link
Author

nedgar commented Mar 28, 2011

What I'm really trying to do involves several layers of block nesting, e.g.
class Display
def syncExec(r:Runnable)
r.run
end
end

display = Display.new

thread = Thread.new do
    100.times do |i|
        display.syncExec do
            puts i
        end
    end
end
thread.start

@baroquebobcat
Copy link
Member

Reproduced that there is an error. But with latest the error is different.

DashE:6: undefined method `defining_class' for #<Mirah::AST::Block:0x3f26f816>
Mirah::InternalCompilerError: undefined method `defining_class' for #<Mirah::AST::Block:0x3f26f816>
           infer at mirah/lib/mirah/typer/simple.rb:280

@nedgar
Copy link
Author

nedgar commented Sep 6, 2011

By 'latest' do you mean the latest source or the latest downloadable distro?

@baroquebobcat
Copy link
Member

latest source.

@baroquebobcat
Copy link
Member

The underlying problem is that nested closures don't work. I've opened an issue specifically about that #155. Closing this one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants