summaryrefslogtreecommitdiff
path: root/deps/v8/src/objects
diff options
context:
space:
mode:
authorMichaƫl Zasso <targos@protonmail.com>2019-10-22 15:07:21 +0200
committerRich Trott <rtrott@gmail.com>2019-10-26 16:22:37 -0700
commitd29f0eda152b0407bf6bd1e63f548bd39cd2fcd3 (patch)
tree600150647f177f6d8b2b37edf8b38bcf13cf5d44 /deps/v8/src/objects
parent7b2de22d72a5fef171d835560a975615a938eaf3 (diff)
downloadandroid-node-v8-d29f0eda152b0407bf6bd1e63f548bd39cd2fcd3.tar.gz
android-node-v8-d29f0eda152b0407bf6bd1e63f548bd39cd2fcd3.tar.bz2
android-node-v8-d29f0eda152b0407bf6bd1e63f548bd39cd2fcd3.zip
deps: V8: backport 777fa98
Original commit message: Make SetSyntheticModuleExport throw instead of crash for nonexistent export name Per spec, Module::SetSyntheticModuleExport should throw a ReferenceError when called with an export name that was not supplied when constructing that SyntheticModule. Instead, the current implementation crashes with a failed CHECK(). Add a new Module::SyntheticModuleSetExport that throws (without an ensuing crash) for this case, and deprecate the old Module::SetSyntheticModuleExport. Bug: v8:9828 Change-Id: I3b3d353064c3851882781818099bd8f6ee74c809 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1860996 Reviewed-by: Adam Klein <adamk@chromium.org> Reviewed-by: Georg Neis <neis@chromium.org> Commit-Queue: Dan Clark <daniec@microsoft.com> Cr-Commit-Position: refs/heads/master@{#64438} Refs: https://github.com/v8/v8/commit/777fa98cc47ac32f0fde3d9aafd830949deb5d23 PR-URL: https://github.com/nodejs/node/pull/30062 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Gireesh Punathil <gpunathi@in.ibm.com> Reviewed-By: Gus Caplan <me@gus.host> Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'deps/v8/src/objects')
-rw-r--r--deps/v8/src/objects/synthetic-module.cc30
-rw-r--r--deps/v8/src/objects/synthetic-module.h18
2 files changed, 40 insertions, 8 deletions
diff --git a/deps/v8/src/objects/synthetic-module.cc b/deps/v8/src/objects/synthetic-module.cc
index 0cca30a37b..850721ac99 100644
--- a/deps/v8/src/objects/synthetic-module.cc
+++ b/deps/v8/src/objects/synthetic-module.cc
@@ -17,16 +17,36 @@ namespace internal {
// Implements SetSyntheticModuleBinding:
// https://heycam.github.io/webidl/#setsyntheticmoduleexport
-void SyntheticModule::SetExport(Isolate* isolate,
- Handle<SyntheticModule> module,
- Handle<String> export_name,
- Handle<Object> export_value) {
+Maybe<bool> SyntheticModule::SetExport(Isolate* isolate,
+ Handle<SyntheticModule> module,
+ Handle<String> export_name,
+ Handle<Object> export_value) {
Handle<ObjectHashTable> exports(module->exports(), isolate);
Handle<Object> export_object(exports->Lookup(export_name), isolate);
- CHECK(export_object->IsCell());
+
+ if (!export_object->IsCell()) {
+ isolate->Throw(*isolate->factory()->NewReferenceError(
+ MessageTemplate::kModuleExportUndefined, export_name));
+ return Nothing<bool>();
+ }
+
Handle<Cell> export_cell(Handle<Cell>::cast(export_object));
// Spec step 2: Set the mutable binding of export_name to export_value
export_cell->set_value(*export_value);
+
+ return Just(true);
+}
+
+void SyntheticModule::SetExportStrict(Isolate* isolate,
+ Handle<SyntheticModule> module,
+ Handle<String> export_name,
+ Handle<Object> export_value) {
+ Handle<ObjectHashTable> exports(module->exports(), isolate);
+ Handle<Object> export_object(exports->Lookup(export_name), isolate);
+ CHECK(export_object->IsCell());
+ Maybe<bool> set_export_result =
+ SetExport(isolate, module, export_name, export_value);
+ CHECK(set_export_result.FromJust());
}
// Implements Synthetic Module Record's ResolveExport concrete method:
diff --git a/deps/v8/src/objects/synthetic-module.h b/deps/v8/src/objects/synthetic-module.h
index 6f3bb0438e..77a6eed276 100644
--- a/deps/v8/src/objects/synthetic-module.h
+++ b/deps/v8/src/objects/synthetic-module.h
@@ -24,9 +24,21 @@ class SyntheticModule
DECL_VERIFIER(SyntheticModule)
DECL_PRINTER(SyntheticModule)
- static void SetExport(Isolate* isolate, Handle<SyntheticModule> module,
- Handle<String> export_name,
- Handle<Object> export_value);
+ // Set module's exported value for the specified export_name to the specified
+ // export_value. An error will be thrown if export_name is not one
+ // of the export_names that were supplied during module construction.
+ // Returns Just(true) on success, Nothing<bool>() if an error was thrown.
+ static Maybe<bool> SetExport(Isolate* isolate, Handle<SyntheticModule> module,
+ Handle<String> export_name,
+ Handle<Object> export_value);
+ // The following redundant method should be deleted when the deprecated
+ // version of v8::SetSyntheticModuleExport is removed. It differs from
+ // SetExport in that it crashes rather than throwing an error if the caller
+ // attempts to set an export_name that was not present during construction of
+ // the module.
+ static void SetExportStrict(Isolate* isolate, Handle<SyntheticModule> module,
+ Handle<String> export_name,
+ Handle<Object> export_value);
using BodyDescriptor = SubclassBodyDescriptor<
Module::BodyDescriptor,