Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport: Set dynamic import callback #17823

Closed
wants to merge 5 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lib/internal/v8_prof_polyfill.js
lib/punycode.js
test/addons/??_*
test/es-module/test-esm-dynamic-import.js
test/fixtures
test/message/esm_display_syntax_error.mjs
tools/node_modules
Expand Down
2 changes: 1 addition & 1 deletion common.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@

# Reset this number to 0 on major V8 upgrades.
# Increment by one for each non-official patch applied to deps/v8.
'v8_embedder_string': '-node.18',
'v8_embedder_string': '-node.19',

# Enable disassembler for `--print-code` v8 options
'v8_enable_disassembler': 1,
Expand Down
75 changes: 67 additions & 8 deletions deps/v8/include/v8.h
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ class String;
class StringObject;
class Symbol;
class SymbolObject;
class PrimitiveArray;
class Private;
class Uint32;
class Utils;
Expand Down Expand Up @@ -978,6 +979,48 @@ class V8_EXPORT Data {
Data();
};

/**
* This is an unfinished experimental feature, and is only exposed
* here for internal testing purposes. DO NOT USE.
*
* A container type that holds relevant metadata for module loading.
*
* This is passed back to the embedder as part of
* HostImportDynamicallyCallback for module loading.
*/
class V8_EXPORT ScriptOrModule {
public:
/**
* The name that was passed by the embedder as ResourceName to the
* ScriptOrigin. This can be either a v8::String or v8::Undefined.
*/
Local<Value> GetResourceName();

/**
* The options that were passed by the embedder as HostDefinedOptions to
* the ScriptOrigin.
*/
Local<PrimitiveArray> GetHostDefinedOptions();
};

/**
* This is an unfinished experimental feature, and is only exposed
* here for internal testing purposes. DO NOT USE.
*
* An array to hold Primitive values. This is used by the embedder to
* pass host defined options to the ScriptOptions during compilation.
*
* This is passed back to the embedder as part of
* HostImportDynamicallyCallback for module loading.
*
*/
class V8_EXPORT PrimitiveArray {
public:
static Local<PrimitiveArray> New(Isolate* isolate, int length);
int Length() const;
void Set(int index, Local<Primitive> item);
Local<Primitive> Get(int index);
};

/**
* The optional attributes of ScriptOrigin.
Expand Down Expand Up @@ -1027,13 +1070,17 @@ class ScriptOrigin {
Local<Value> source_map_url = Local<Value>(),
Local<Boolean> resource_is_opaque = Local<Boolean>(),
Local<Boolean> is_wasm = Local<Boolean>(),
Local<Boolean> is_module = Local<Boolean>());
Local<Boolean> is_module = Local<Boolean>() /*,
// Backed out for ABI compatibility with V8 6.2
Local<PrimitiveArray> host_defined_options = Local<PrimitiveArray>() */);

V8_INLINE Local<Value> ResourceName() const;
V8_INLINE Local<Integer> ResourceLineOffset() const;
V8_INLINE Local<Integer> ResourceColumnOffset() const;
V8_INLINE Local<Integer> ScriptID() const;
V8_INLINE Local<Value> SourceMapUrl() const;
// Backed out for ABI compatibility with V8 6.2
// V8_INLINE Local<PrimitiveArray> HostDefinedOptions() const;
V8_INLINE ScriptOriginOptions Options() const { return options_; }

private:
Expand All @@ -1043,6 +1090,8 @@ class ScriptOrigin {
ScriptOriginOptions options_;
Local<Integer> script_id_;
Local<Value> source_map_url_;
// Backed out for ABI compatibility with V8 6.2
// Local<PrimitiveArray> host_defined_options_;
};

/**
Expand Down Expand Up @@ -1289,6 +1338,7 @@ class V8_EXPORT ScriptCompiler {
Local<Integer> resource_column_offset;
ScriptOriginOptions resource_options;
Local<Value> source_map_url;
// Local<PrimitiveArray> host_defined_options;

// Cached data from previous compilation (if a kConsume*Cache flag is
// set), or hold newly generated cache data (kProduce*Cache flags) are
Expand Down Expand Up @@ -6209,8 +6259,8 @@ typedef void (*DeprecatedCallCompletedCallback)();
* embedder to load a module. This is used as part of the dynamic
* import syntax.
*
* The referrer is the name of the file which calls the dynamic
* import. The referrer can be used to resolve the module location.
* The referrer contains metadata about the script/module that calls
* import.
*
* The specifier is the name of the module that should be imported.
*
Expand All @@ -6225,7 +6275,8 @@ typedef void (*DeprecatedCallCompletedCallback)();
* that exception by returning an empty MaybeLocal.
*/
typedef MaybeLocal<Promise> (*HostImportModuleDynamicallyCallback)(
Local<Context> context, Local<String> referrer, Local<String> specifier);
Local<Context> context, Local<ScriptOrModule> referrer,
Local<String> specifier);

/**
* PromiseHook with type kInit is called when a new promise is
Expand Down Expand Up @@ -9545,7 +9596,9 @@ ScriptOrigin::ScriptOrigin(Local<Value> resource_name,
Local<Integer> script_id,
Local<Value> source_map_url,
Local<Boolean> resource_is_opaque,
Local<Boolean> is_wasm, Local<Boolean> is_module)
Local<Boolean> is_wasm, Local<Boolean> is_module /*,
// Backed out for ABI compatibility with V8 6.2
Local<PrimitiveArray> host_defined_options */)
: resource_name_(resource_name),
resource_line_offset_(resource_line_offset),
resource_column_offset_(resource_column_offset),
Expand All @@ -9555,10 +9608,16 @@ ScriptOrigin::ScriptOrigin(Local<Value> resource_name,
!is_wasm.IsEmpty() && is_wasm->IsTrue(),
!is_module.IsEmpty() && is_module->IsTrue()),
script_id_(script_id),
source_map_url_(source_map_url) {}
source_map_url_(source_map_url) /*,
// Backed out for ABI compatibility with V8 6.2
host_defined_options_(host_defined_options) */ {}

Local<Value> ScriptOrigin::ResourceName() const { return resource_name_; }

// Backed out for ABI compatibility with V8 6.2
// Local<PrimitiveArray> ScriptOrigin::HostDefinedOptions() const {
// return host_defined_options_;
// }

Local<Integer> ScriptOrigin::ResourceLineOffset() const {
return resource_line_offset_;
Expand All @@ -9575,7 +9634,6 @@ Local<Integer> ScriptOrigin::ScriptID() const { return script_id_; }

Local<Value> ScriptOrigin::SourceMapUrl() const { return source_map_url_; }


ScriptCompiler::Source::Source(Local<String> string, const ScriptOrigin& origin,
CachedData* data)
: source_string(string),
Expand All @@ -9584,9 +9642,10 @@ ScriptCompiler::Source::Source(Local<String> string, const ScriptOrigin& origin,
resource_column_offset(origin.ResourceColumnOffset()),
resource_options(origin.Options()),
source_map_url(origin.SourceMapUrl()),
// Backed out for ABI compatibility with V8 6.2
// host_defined_options(origin.HostDefinedOptions()),
cached_data(data) {}


ScriptCompiler::Source::Source(Local<String> string,
CachedData* data)
: source_string(string), cached_data(data) {}
Expand Down
81 changes: 78 additions & 3 deletions deps/v8/src/api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,9 @@ static ScriptOrigin GetScriptOriginForScript(i::Isolate* isolate,
i::Handle<i::Script> script) {
i::Handle<i::Object> scriptName(script->GetNameOrSourceURL(), isolate);
i::Handle<i::Object> source_map_url(script->source_mapping_url(), isolate);
// Backed out for ABI compatibility with V8 6.2
// i::Handle<i::FixedArray> host_defined_options(script->host_defined_options(),
// isolate);
v8::Isolate* v8_isolate =
reinterpret_cast<v8::Isolate*>(script->GetIsolate());
ScriptOriginOptions options(script->origin_options());
Expand All @@ -290,7 +293,9 @@ static ScriptOrigin GetScriptOriginForScript(i::Isolate* isolate,
Utils::ToLocal(source_map_url),
v8::Boolean::New(v8_isolate, options.IsOpaque()),
v8::Boolean::New(v8_isolate, script->type() == i::Script::TYPE_WASM),
v8::Boolean::New(v8_isolate, options.IsModule()));
v8::Boolean::New(v8_isolate, options.IsModule()) /*,
// Backed out for ABI compatibility with V8 6.2
Utils::ToLocal(host_defined_options) */);
return origin;
}

Expand Down Expand Up @@ -2082,13 +2087,70 @@ Local<Value> Script::Run() {
RETURN_TO_LOCAL_UNCHECKED(Run(context), Value);
}

Local<Value> ScriptOrModule::GetResourceName() {
i::Handle<i::Script> obj = Utils::OpenHandle(this);
i::Isolate* isolate = obj->GetIsolate();
ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate);
i::Handle<i::Object> val(obj->name(), isolate);
return ToApiHandle<Value>(val);
}

Local<PrimitiveArray> ScriptOrModule::GetHostDefinedOptions() {
i::Handle<i::Script> obj = Utils::OpenHandle(this);
i::Isolate* isolate = obj->GetIsolate();
ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate);
// Backed out for ABI compatibility with V8 6.2
// i::Handle<i::FixedArray> val(obj->host_defined_options(), isolate);
// return ToApiHandle<PrimitiveArray>(val);
return Local<PrimitiveArray>();
}

Local<UnboundScript> Script::GetUnboundScript() {
i::Handle<i::Object> obj = Utils::OpenHandle(this);
return ToApiHandle<UnboundScript>(
i::Handle<i::SharedFunctionInfo>(i::JSFunction::cast(*obj)->shared()));
}

// static
Local<PrimitiveArray> PrimitiveArray::New(Isolate* v8_isolate, int length) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(v8_isolate);
ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate);
Utils::ApiCheck(length >= 0, "v8::PrimitiveArray::New",
"length must be equal or greater than zero");
i::Handle<i::FixedArray> array = isolate->factory()->NewFixedArray(length);
return ToApiHandle<PrimitiveArray>(array);
}

int PrimitiveArray::Length() const {
i::Handle<i::FixedArray> array = Utils::OpenHandle(this);
i::Isolate* isolate = array->GetIsolate();
ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate);
return array->length();
}

void PrimitiveArray::Set(int index, Local<Primitive> item) {
i::Handle<i::FixedArray> array = Utils::OpenHandle(this);
i::Isolate* isolate = array->GetIsolate();
ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate);
Utils::ApiCheck(index >= 0 && index < array->length(),
"v8::PrimitiveArray::Set",
"index must be greater than or equal to 0 and less than the "
"array length");
i::Handle<i::Object> i_item = Utils::OpenHandle(*item);
array->set(index, *i_item);
}

Local<Primitive> PrimitiveArray::Get(int index) {
i::Handle<i::FixedArray> array = Utils::OpenHandle(this);
i::Isolate* isolate = array->GetIsolate();
ENTER_V8_NO_SCRIPT_NO_EXCEPTION(isolate);
Utils::ApiCheck(index >= 0 && index < array->length(),
"v8::PrimitiveArray::Get",
"index must be greater than or equal to 0 and less than the "
"array length");
i::Handle<i::Object> i_item(array->get(index), isolate);
return ToApiHandle<Primitive>(i_item);
}

Module::Status Module::GetStatus() const {
i::Handle<i::Module> self = Utils::OpenHandle(this);
Expand Down Expand Up @@ -2225,11 +2287,18 @@ MaybeLocal<UnboundScript> ScriptCompiler::CompileUnboundInternal(
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "V8.CompileScript");
i::Handle<i::Object> name_obj;
i::Handle<i::Object> source_map_url;
// Backed out for ABI compatibility with V8 6.2
// i::Handle<i::FixedArray> host_defined_options =
// isolate->factory()->empty_fixed_array();
int line_offset = 0;
int column_offset = 0;
if (!source->resource_name.IsEmpty()) {
name_obj = Utils::OpenHandle(*(source->resource_name));
}
// Backed out for ABI compatibility with V8 6.2
// if (!source->host_defined_options.IsEmpty()) {
// host_defined_options = Utils::OpenHandle(*(source->host_defined_options));
// }
if (!source->resource_line_offset.IsEmpty()) {
line_offset = static_cast<int>(source->resource_line_offset->Value());
}
Expand All @@ -2243,7 +2312,7 @@ MaybeLocal<UnboundScript> ScriptCompiler::CompileUnboundInternal(
result = i::Compiler::GetSharedFunctionInfoForScript(
str, name_obj, line_offset, column_offset, source->resource_options,
source_map_url, isolate->native_context(), NULL, &script_data, options,
i::NOT_NATIVES_CODE);
i::NOT_NATIVES_CODE /*, host_defined_options */);
has_pending_exception = result.is_null();
if (has_pending_exception && script_data != NULL) {
// This case won't happen during normal operation; we have compiled
Expand Down Expand Up @@ -2508,6 +2577,10 @@ MaybeLocal<Script> ScriptCompiler::Compile(Local<Context> context,
if (!origin.ResourceName().IsEmpty()) {
script->set_name(*Utils::OpenHandle(*(origin.ResourceName())));
}
// if (!origin.HostDefinedOptions().IsEmpty()) {
// script->set_host_defined_options(
// *Utils::OpenHandle(*(origin.HostDefinedOptions())));
// }
if (!origin.ResourceLineOffset().IsEmpty()) {
script->set_line_offset(
static_cast<int>(origin.ResourceLineOffset()->Value()));
Expand Down Expand Up @@ -9828,7 +9901,9 @@ MaybeLocal<UnboundScript> debug::CompileInspectorScript(Isolate* v8_isolate,
i::Handle<i::Object>(), isolate->native_context(), NULL, &script_data,
ScriptCompiler::kNoCompileOptions,
i::FLAG_expose_inspector_scripts ? i::NOT_NATIVES_CODE
: i::INSPECTOR_CODE);
: i::INSPECTOR_CODE /*,
// Backed out for ABI compatibility with V8 6.2
i::Handle<i::FixedArray>() */);
has_pending_exception = result.is_null();
RETURN_ON_FAILED_EXECUTION(UnboundScript);
}
Expand Down
14 changes: 13 additions & 1 deletion deps/v8/src/api.h
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,10 @@ class RegisteredExtension {
V(NativeWeakMap, JSWeakMap) \
V(debug::GeneratorObject, JSGeneratorObject) \
V(debug::Script, Script) \
V(Promise, JSPromise)
V(Promise, JSPromise) \
V(Primitive, Object) \
V(PrimitiveArray, FixedArray) \
V(ScriptOrModule, Script)

class Utils {
public:
Expand Down Expand Up @@ -209,6 +212,12 @@ class Utils {
v8::internal::Handle<v8::internal::JSWeakMap> obj);
static inline Local<Function> CallableToLocal(
v8::internal::Handle<v8::internal::JSReceiver> obj);
static inline Local<Primitive> ToLocalPrimitive(
v8::internal::Handle<v8::internal::Object> obj);
static inline Local<PrimitiveArray> ToLocal(
v8::internal::Handle<v8::internal::FixedArray> obj);
static inline Local<ScriptOrModule> ScriptOrModuleToLocal(
v8::internal::Handle<v8::internal::Script> obj);

#define DECLARE_OPEN_HANDLE(From, To) \
static inline v8::internal::Handle<v8::internal::To> \
Expand Down Expand Up @@ -325,6 +334,9 @@ MAKE_TO_LOCAL(Uint32ToLocal, Object, Uint32)
MAKE_TO_LOCAL(ExternalToLocal, JSObject, External)
MAKE_TO_LOCAL(NativeWeakMapToLocal, JSWeakMap, NativeWeakMap)
MAKE_TO_LOCAL(CallableToLocal, JSReceiver, Function)
MAKE_TO_LOCAL(ToLocalPrimitive, Object, Primitive)
MAKE_TO_LOCAL(ToLocal, FixedArray, PrimitiveArray)
MAKE_TO_LOCAL(ScriptOrModuleToLocal, Script, ScriptOrModule)

#undef MAKE_TO_LOCAL_TYPED_ARRAY
#undef MAKE_TO_LOCAL
Expand Down
4 changes: 4 additions & 0 deletions deps/v8/src/bootstrapper.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3540,6 +3540,8 @@ bool Bootstrapper::CompileNative(Isolate* isolate, Vector<const char> name,
Compiler::GetSharedFunctionInfoForScript(
source, script_name, 0, 0, ScriptOriginOptions(), Handle<Object>(),
context, NULL, NULL, ScriptCompiler::kNoCompileOptions, natives_flag);
// Backed out for ABI compatibility with V8 6.2
// Handle<FixedArray>());
if (function_info.is_null()) return false;

DCHECK(context->IsNativeContext());
Expand Down Expand Up @@ -3602,6 +3604,8 @@ bool Genesis::CompileExtension(Isolate* isolate, v8::Extension* extension) {
function_info = Compiler::GetSharedFunctionInfoForScript(
source, script_name, 0, 0, ScriptOriginOptions(), Handle<Object>(),
context, extension, NULL, ScriptCompiler::kNoCompileOptions,
// Backed out for ABI compatibility with V8 6.2
// EXTENSION_CODE, Handle<FixedArray>());
EXTENSION_CODE);
if (function_info.is_null()) return false;
cache->Add(name, function_info);
Expand Down
7 changes: 7 additions & 0 deletions deps/v8/src/compiler.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1192,6 +1192,9 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForScript(
int column_offset, ScriptOriginOptions resource_options,
Handle<Object> source_map_url, Handle<Context> context,
v8::Extension* extension, ScriptData** cached_data,
// Backed out for ABI compatibility with V8 6.2
// ScriptCompiler::CompileOptions compile_options, NativesFlag natives,
// Handle<FixedArray> host_defined_options) {
ScriptCompiler::CompileOptions compile_options, NativesFlag natives) {
Isolate* isolate = source->GetIsolate();
if (compile_options == ScriptCompiler::kNoCompileOptions) {
Expand Down Expand Up @@ -1288,6 +1291,10 @@ Handle<SharedFunctionInfo> Compiler::GetSharedFunctionInfoForScript(
if (!source_map_url.is_null()) {
script->set_source_mapping_url(*source_map_url);
}
// Backed out for ABI compatibility with V8 6.2
// if (!host_defined_options.is_null()) {
// script->set_host_defined_options(*host_defined_options);
// }

// Compile the function and add it to the cache.
ParseInfo parse_info(script);
Expand Down
Loading