diff --git a/goblins/core.rkt b/goblins/core.rkt index 6df8b5c..7f52b52 100644 --- a/goblins/core.rkt +++ b/goblins/core.rkt @@ -1244,9 +1244,17 @@ ;; If we're pointing at another near promise then we recurse ;; to _handle-messages with the next promise... [(? local-promise-refr?) - ;; (We don't use call-with-resolution because the next one will!) - (_handle-message (message point-to resolve-me kws kw-vals args) - display-or-log-error)] + ;; Now we need to see if it's in the same vat... + (cond + [(near-refr? point-to) + ;; (We don't use call-with-resolution because the next one will!) + (_handle-message (message point-to resolve-me kws kw-vals args) + display-or-log-error)] + [else + ;; Otherwise, we need to forward this message to the appropriate + ;; vat + (_send-message kws kw-vals point-to resolve-me args) + `#(success ,(void))])] ;; But if it's a remote promise then we queue it in the waiting ;; messages because we prefer to have messages "swim as close ;; as possible to the machine barrier where possible", with @@ -1262,7 +1270,7 @@ point-to history (cons msg waiting-messages))) ;; But we should return that this was deferred - '#(deferred #f)])] + '#(deferred ,(void))])] ;; Similar to the above w/ remote promises, except that we really ;; just don't know where things go *at all* yet, so no swimming ;; occurs. @@ -1272,7 +1280,7 @@ (mactor:naive resolver-unsealer resolver-tm? listeners (cons msg waiting-messages))) - '#(deferred #f)] + `#(deferred ,(void))] ;; Questions should forward their messages to the captp thread ;; to deal with using the relevant question-finder. [(? mactor:question?)