bennyxqg / lua-alchemy

Automatically exported from code.google.com/p/lua-alchemy
0 stars 0 forks source link

Coroutines vs. AS3 events #113

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
This does not work, but should (resume in event complains that coroutine is
running):

---------------------

local main; main = coroutine.create(function()
  local loader = as3.class.flash.net.URLLoader.new()
  loader.addEventListener(
      as3.class.flash.events.Event.COMPLETE,
      function() 
        assert(coroutine.resume(main)) 
      end,
      false, 0, true
    )

  loader.load(as3.class.flash.net.URLRequest.new("http://example.com/"))
  coroutine.yield()
  as3.trace(as3.tolua(loader.data))
end)

assert(coroutine.resume(main))

---------------------

However, this does work (coroutine is not resumed until event handler is
called):

---------------------

local main

local loader = as3.class.flash.net.URLLoader.new()
loader.addEventListener(
    as3.class.flash.events.Event.COMPLETE,
    function() 
      assert(coroutine.resume(main)) 
    end,
    false, 0, true
  )

main = coroutine.create(function()
  as3.trace(as3.tolua(loader.data))
end)

loader.load(as3.class.flash.net.URLRequest.new("http://example.com/"))

--------------------------

Even this works (loading a second file):

--------------------------

local main

local loader = as3.class.flash.net.URLLoader.new()
loader.addEventListener(
    as3.class.flash.events.Event.COMPLETE,
    function() 
      assert(coroutine.resume(main)) 
    end,
    false, 0, true
  )

main = coroutine.create(function()
  as3.trace("YAHOO", as3.tolua(loader.data))
  loader.load(as3.class.flash.net.URLRequest.new("http://google.com/"))
  coroutine.yield()
  as3.trace("GOOGLE", as3.tolua(loader.data))
end)

loader.load(as3.class.flash.net.URLRequest.new("http://example.com/"))

----------------

Attached is the minimal plain C sample (which works)

Original issue reported on code.google.com by aglad...@gmail.com on 15 Feb 2009 at 8:55

Attachments:

GoogleCodeExporter commented 9 years ago
When AS3 function wrapper on Lua function is created, we store lua_State of 
current
coroutine with it, but we must store the main lua_State instead. The workaround:

print = as3.makeprinter(output)

local main

local continue = as3.toas3(function() 
  assert(coroutine.resume(main)) 
end)

main = coroutine.create(function()
  local loader = as3.class.flash.net.URLLoader.new()
  loader.addEventListener(
      as3.class.flash.events.Event.COMPLETE,
      continue,
      false, 0, true
    )

  loader.load(as3.class.flash.net.URLRequest.new("http://example.com/"))
  coroutine.yield()
  print(as3.tolua(loader.data))
end)

assert(coroutine.resume(main))

Original comment by aglad...@gmail.com on 15 Feb 2009 at 7:15

GoogleCodeExporter commented 9 years ago

Original comment by aglad...@gmail.com on 11 May 2010 at 9:57