diff options
author | Michaƫl Zasso <targos@protonmail.com> | 2019-10-22 15:07:21 +0200 |
---|---|---|
committer | Rich Trott <rtrott@gmail.com> | 2019-10-26 16:22:37 -0700 |
commit | d29f0eda152b0407bf6bd1e63f548bd39cd2fcd3 (patch) | |
tree | 600150647f177f6d8b2b37edf8b38bcf13cf5d44 /deps/v8/src/objects | |
parent | 7b2de22d72a5fef171d835560a975615a938eaf3 (diff) | |
download | android-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.cc | 30 | ||||
-rw-r--r-- | deps/v8/src/objects/synthetic-module.h | 18 |
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, |