"What I'd recommend is to call CompileModule() again to get another Module object [...]"
Yes, sure, that should work, and the recompilation overhead is hardly a concern for us. It's just an unfortunate API design that almost invites incorrect usage. A simple enhancement might be for V8 to throw an exception when an imported module has already been evaluated in a different context. On Thursday, June 20, 2019 at 1:28:14 PM UTC-4, Adam Klein wrote: > > On Wed, Jun 19, 2019 at 9:27 PM ClearScript Developers < > clearsc...@gmail.com <javascript:>> wrote: > >> "When you say "local to the evaluation context", what do you mean?" >> >> Suppose you have an isolate with two contexts, C1 and C2, and a module >> whose evaluation produces side effects. Once you've evaluated the module in >> C1, there's no way to apply its side effects to C2. You can import it into >> C2, but doing so doesn't replicate the side effects. You can use its >> exports in C2, but they won't work correctly if they rely on the side >> effects. >> >> "The current API is designed to allow one evaluation per v8::Context" >> >> But it doesn't do that. It allows one evaluation per isolate. Evaluating >> a module in one context breaks it for others. >> > > What I'd recommend is to call CompileModule() again to get another Module > object; I believe this should hit the in-memory cache and be very fast, and > should let you go back through the Instantiate/Evaluate cycle in C2. > > >> On Wednesday, June 19, 2019 at 5:21:43 PM UTC-4, Adam Klein wrote: >>> >>> When you say "local to the evaluation context", what do you mean? >>> Modules can't have side-effects on the lexical top-level scope of the >>> importing module; they can only affect the broader "realm" (in ECMAScript >>> spec terms), the v8::Context (in V8 API terms) or the mutable global state >>> (in more common terms). The current API is designed to allow one evaluation >>> per v8::Context, since part of Instantiation >>> <https://cs.chromium.org/chromium/src/v8/include/v8.h?rcl=ab5fb228bcaf387cc72dfd93cdc62c1db4867ebf&l=1302> >>> >>> is tying a v8::Module to a v8::Context. So if you instantatiate a module in >>> multiple context, multiple evaluations should still work. >>> >>> On Thu, Jun 13, 2019 at 7:12 AM ClearScript Developers < >>> clearsc...@gmail.com> wrote: >>> >>>> Sorry to revive this thread, but we're encountering the same issue. >>>> >>>> v8::Script is not a replacement for v8::Module; for one thing, scripts >>>> can't import modules :) >>>> >>>> In any case, V8's API seems deficient here. Modules can be imported >>>> specifically for their side effects. There's even unique syntax for that >>>> (see >>>> https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#Import_a_module_for_its_side_effects_only). >>>> >>>> And since side effects can be local to the evaluation context, it should >>>> be >>>> possible to evaluate a module in multiple contexts. >>>> >>>> Opinions? >>>> >>>> On Wednesday, February 20, 2019 at 2:54:26 PM UTC-5, Adam Klein wrote: >>>>> >>>>> Modules are designed (in the JavaScript spec) to only have their >>>>> top-level code run once. To "re-use" a cached module, the expectation is >>>>> that other modules would use imports to access the exports of that >>>>> module. >>>>> In particular, in your code snippet, you'd return the already-evaluated >>>>> module from the ResolveCallback passed to the module that wishes to >>>>> import >>>>> from it. >>>>> >>>>> If what you want to do is compile some code and run it multiple times, >>>>> a v8::Script is probably want you want instead. >>>>> >>>>> On Tue, Feb 12, 2019 at 5:11 PM Jane Chen <jxch...@gmail.com> wrote: >>>>> >>>>>> Embedding v8 6.7. >>>>>> >>>>>> I found the following test in test-modules.cc: >>>>>> >>>>>> CHECK(module->Evaluate(env.local()) >>>>>> .ToLocalChecked() >>>>>> ->StrictEquals(v8_str("gaga"))); >>>>>> CHECK_EQ(Module::kEvaluated, module->GetStatus()); >>>>>> >>>>>> CHECK(module->Evaluate(env.local()).ToLocalChecked()->IsUndefined()); >>>>>> >>>>>> and it is consistent with what I'm seeing. Basically, evaluating an >>>>>> evaluated module returns undefined. I don't get the rational for this >>>>>> behavior. Once a module is evaluated, it is no good for evaluation? >>>>>> Then >>>>>> how am I supposed to re-use a cached module? Re-instantiating it >>>>>> doesn't >>>>>> seem to help. >>>>>> >>>>>> -- >>>>>> -- >>>>>> v8-users mailing list >>>>>> v8-u...@googlegroups.com >>>>>> http://groups.google.com/group/v8-users >>>>>> --- >>>>>> You received this message because you are subscribed to the Google >>>>>> Groups "v8-users" group. >>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>> send an email to v8-u...@googlegroups.com. >>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>> >>>>> -- >>>> -- >>>> v8-users mailing list >>>> v8-u...@googlegroups.com >>>> http://groups.google.com/group/v8-users >>>> --- >>>> You received this message because you are subscribed to the Google >>>> Groups "v8-users" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to v8-u...@googlegroups.com. >>>> To view this discussion on the web visit >>>> https://groups.google.com/d/msgid/v8-users/a7260cfa-cc60-4870-b11d-b2d00c79eb01%40googlegroups.com >>>> >>>> <https://groups.google.com/d/msgid/v8-users/a7260cfa-cc60-4870-b11d-b2d00c79eb01%40googlegroups.com?utm_medium=email&utm_source=footer> >>>> . >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> -- >> -- >> v8-users mailing list >> v8-u...@googlegroups.com <javascript:> >> http://groups.google.com/group/v8-users >> --- >> You received this message because you are subscribed to the Google Groups >> "v8-users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to v8-u...@googlegroups.com <javascript:>. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/v8-users/55686a62-e8dc-439b-9acb-f3edb6ddf60c%40googlegroups.com >> >> <https://groups.google.com/d/msgid/v8-users/55686a62-e8dc-439b-9acb-f3edb6ddf60c%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > -- -- v8-users mailing list v8-users@googlegroups.com http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to v8-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/v8-users/fccb8e6b-c30e-4960-b21f-552704beb433%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.