Yes, and resume occurs in fact before you reach the end of that method, on
the *second* time it is called, when it is restarted. So if you save the
return value somewhere, you can just return it there. But, this is
confusing.

So we should have a proper API for this. I implemented one in

https://github.com/kripken/emscripten/commit/d80417c665dd45e1893cb85aa8523efe57c7d58c

, see the testcase there. The resume() function has a post argument, which
runs right after the stack was recreated and we are about to finish the
async operation. That means it is right before the async-causing function
exits, so it is a proper time to return a value. I made it so return values
from that post will be returned. Note that you need to return
EmterpreterAsync.handle() for that to work, as in the testcase in that
commit.

- Alon


On Fri, Apr 10, 2015 at 8:37 PM, 王璐 <[email protected]> wrote:

> Did you mean something like this?
>
> EmterpreterAsync.handle(...);
> return something;
>
>
> But the return value might not be available until the callback, e.g. to
> get a key input, so I need to set the return value in `resume`.
>
>
>
> regards,
> - Lu
>
> On Saturday, April 11, 2015 at 5:07:37 AM UTC+8, Alon Zakai wrote:
>>
>> I think if you add a return in g - outside of the handle() call - it will
>> just be returned. It will however be returned both the first time when
>> called (and starting to unwind the stack) and the second time when
>> restarted (after reconstructing the stack). You could tell which of those
>> you are in using EmterpreterAsync.state. Might be nicer to add an API for
>> that.
>>
>> - Alon
>>
>>
>> On Fri, Apr 10, 2015 at 3:47 AM, Lu Wang <[email protected]> wrote:
>>
>>> Hi all,
>>>
>>>    Is there a way to return something from an async function with
>>> emterpreter? For example:
>>>
>>> ///main.c
>>> void f() {
>>>   printf("%d\n", g());
>>> }
>>>
>>> ///main.js
>>> function g() {
>>>   EmterpreterAsync.handle(function(resume) {
>>>     setTimeout(function() {
>>>       resume(return_value); // ???
>>>     }, 1000);
>>>   });
>>> }
>>>
>>>
>>>    I saw that `resume` already takes a few parameters, so maybe we
>>> cannot simply do so. Currently the closet way is to write the return value
>>> into some memory address, but it would be better if the return value can be
>>> passed directly to the C code.
>>>
>>>
>>>   regards,
>>>   - Lu
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "emscripten-discuss" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>  --
> You received this message because you are subscribed to the Google Groups
> "emscripten-discuss" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to