Skip to content
This repository has been archived by the owner on Oct 30, 2023. It is now read-only.

Commit

Permalink
fix: new WebAssembly API support in Node.js (electron#36420)
Browse files Browse the repository at this point in the history
  • Loading branch information
codebytere authored and khalwa committed Feb 22, 2023
1 parent 12e16fe commit af85dd7
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 9 deletions.
1 change: 0 additions & 1 deletion script/node-disabled-tests.json
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,6 @@
"parallel/test-trace-events-v8",
"parallel/test-trace-events-vm",
"parallel/test-trace-events-worker-metadata",
"parallel/test-wasm-web-api",
"parallel/test-webcrypto-derivebits-cfrg",
"parallel/test-webcrypto-derivekey-cfrg",
"parallel/test-webcrypto-encrypt-decrypt",
Expand Down
9 changes: 6 additions & 3 deletions shell/app/node_main.cc
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,11 @@ int NodeMain(int argc, char* argv[]) {
uv_loop_configure(loop, UV_METRICS_IDLE_TIME);

// Initialize gin::IsolateHolder.
JavascriptEnvironment gin_env(loop);
bool setup_wasm_streaming =
node::per_process::cli_options->get_per_isolate_options()
->get_per_env_options()
->experimental_fetch;
JavascriptEnvironment gin_env(loop, setup_wasm_streaming);

v8::Isolate* isolate = gin_env.isolate();

Expand All @@ -226,8 +230,7 @@ int NodeMain(int argc, char* argv[]) {
static_cast<node::EnvironmentFlags::Flags>(env_flags));
CHECK_NE(nullptr, env);

node::IsolateSettings is;
node::SetIsolateUpForNode(isolate, is);
node::SetIsolateUpForNode(isolate);

gin_helper::Dictionary process(isolate, env->process_object());
process.SetMethod("crash", &ElectronBindings::Crash);
Expand Down
20 changes: 17 additions & 3 deletions shell/browser/javascript_environment.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "shell/common/gin_helper/cleaned_up_at_exit.h"
#include "shell/common/node_includes.h"
#include "third_party/blink/public/common/switches.h"
#include "third_party/electron_node/src/node_wasm_web_api.h"

namespace {
v8::Isolate* g_isolate;
Expand Down Expand Up @@ -73,8 +74,9 @@ struct base::trace_event::TraceValue::Helper<

namespace electron {

JavascriptEnvironment::JavascriptEnvironment(uv_loop_t* event_loop)
: isolate_(Initialize(event_loop)),
JavascriptEnvironment::JavascriptEnvironment(uv_loop_t* event_loop,
bool setup_wasm_streaming)
: isolate_(Initialize(event_loop, setup_wasm_streaming)),
isolate_holder_(base::ThreadTaskRunnerHandle::Get(),
gin::IsolateHolder::kSingleThread,
gin::IsolateHolder::kAllowAtomicsWait,
Expand Down Expand Up @@ -247,7 +249,8 @@ class TracingControllerImpl : public node::tracing::TracingController {
}
};

v8::Isolate* JavascriptEnvironment::Initialize(uv_loop_t* event_loop) {
v8::Isolate* JavascriptEnvironment::Initialize(uv_loop_t* event_loop,
bool setup_wasm_streaming) {
auto* cmd = base::CommandLine::ForCurrentProcess();

// --js-flags.
Expand Down Expand Up @@ -276,6 +279,17 @@ v8::Isolate* JavascriptEnvironment::Initialize(uv_loop_t* event_loop) {

v8::Isolate* isolate = v8::Isolate::Allocate();
platform_->RegisterIsolate(isolate, event_loop);

// This is done here because V8 checks for the callback in NewContext.
// Our setup order doesn't allow for calling SetupIsolateForNode
// before NewContext without polluting JavaScriptEnvironment with
// Node.js logic and so we conditionally do it here to keep
// concerns separate.
if (setup_wasm_streaming) {
isolate->SetWasmStreamingCallback(
node::wasm_web_api::StartStreamingCompilation);
}

g_isolate = isolate;

return isolate;
Expand Down
5 changes: 3 additions & 2 deletions shell/browser/javascript_environment.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ class MicrotasksRunner;
// Manage the V8 isolate and context automatically.
class JavascriptEnvironment {
public:
explicit JavascriptEnvironment(uv_loop_t* event_loop);
explicit JavascriptEnvironment(uv_loop_t* event_loop,
bool setup_wasm_streaming = false);
~JavascriptEnvironment();

// disable copy
Expand All @@ -41,7 +42,7 @@ class JavascriptEnvironment {
static v8::Isolate* GetIsolate();

private:
v8::Isolate* Initialize(uv_loop_t* event_loop);
v8::Isolate* Initialize(uv_loop_t* event_loop, bool setup_wasm_streaming);
std::unique_ptr<node::MultiIsolatePlatform> platform_;

v8::Isolate* isolate_;
Expand Down

0 comments on commit af85dd7

Please sign in to comment.