Compare commits

...

2 Commits

Author SHA1 Message Date
5ba858545a fix: defer handles of async functions 2024-03-09 00:28:30 +02:00
446ecd8f2b fix: promise defers callback twice 2024-03-08 17:23:50 +02:00
4 changed files with 23 additions and 20 deletions

View File

@@ -1,4 +1,4 @@
project_group = me.topchetoeu
project_name = jscript
project_version = 0.9.9-beta
project_version = 0.9.11-beta
main_class = me.topchetoeu.jscript.utils.JScriptRepl

View File

@@ -54,7 +54,7 @@ public class AsyncFunctionLib extends FunctionValue {
public void onReject(EngineException err) {
next(ctx, Values.NO_RETURN, err);
}
});
}.defer(ctx));
}
}

View File

@@ -62,7 +62,7 @@ public class AsyncGeneratorLib {
@Override public void onReject(EngineException err) {
next(ctx, Values.NO_RETURN, Values.NO_RETURN, err);
}
});
}.defer(ctx));
}
else if (state == 2) {
var obj = new ObjectValue();

View File

@@ -53,26 +53,29 @@ public class PromiseLib {
private Object val;
private void resolveSynchronized(Context ctx, Object val, int newState) {
if (!ctx.hasNotNull(EventLoop.KEY)) throw EngineException.ofError("No event loop");
this.val = val;
this.state = newState;
ctx.get(EventLoop.KEY).pushMsg(() -> {
this.val = val;
this.state = newState;
for (var handle : handles) {
if (newState == STATE_FULFILLED) handle.onFulfil(val);
if (newState == STATE_REJECTED) {
handle.onReject((EngineException)val);
handled = true;
}
for (var handle : handles) {
if (newState == STATE_FULFILLED) handle.onFulfil(val);
if (newState == STATE_REJECTED) {
handle.onReject((EngineException)val);
handled = true;
}
}
if (state == STATE_REJECTED && !handled) {
Values.printError(((EngineException)val).setCtx(ctx), "(in promise)");
}
if (state == STATE_REJECTED && !handled) {
Values.printError(((EngineException)val).setCtx(ctx), "(in promise)");
}
handles = null;
}, true);
handles = null;
// ctx.get(EventLoop.KEY).pushMsg(() -> {
// if (!ctx.hasNotNull(EventLoop.KEY)) throw EngineException.ofError("No event loop");
// handles = null;
// }, true);
}
private synchronized void resolve(Context ctx, Object val, int newState) {