Skip to content

Commit 4a7fbb6

Browse files
authored
src: update contextify to use DictionaryTemplate
PR-URL: #60059 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Chengzhong Wu <[email protected]> Reviewed-By: Tobias Nießen <[email protected]>
1 parent 81b7119 commit 4a7fbb6

File tree

2 files changed

+63
-43
lines changed

2 files changed

+63
-43
lines changed

src/env_properties.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,8 @@
389389
V(cipherinfo_detail_template, v8::DictionaryTemplate) \
390390
V(cipherinfo_template, v8::DictionaryTemplate) \
391391
V(cname_record_template, v8::DictionaryTemplate) \
392+
V(compiled_function_cjs_template, v8::DictionaryTemplate) \
393+
V(compiled_function_template, v8::DictionaryTemplate) \
392394
V(contextify_global_template, v8::ObjectTemplate) \
393395
V(contextify_wrapper_template, v8::ObjectTemplate) \
394396
V(cpu_usage_template, v8::DictionaryTemplate) \

src/node_contextify.cc

Lines changed: 61 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ using v8::Array;
4545
using v8::ArrayBufferView;
4646
using v8::Boolean;
4747
using v8::Context;
48+
using v8::DictionaryTemplate;
4849
using v8::EscapableHandleScope;
4950
using v8::Function;
5051
using v8::FunctionCallbackInfo;
@@ -1088,35 +1089,34 @@ void ContextifyScript::New(const FunctionCallbackInfo<Value>& args) {
10881089
new_cached_data.reset(ScriptCompiler::CreateCodeCache(v8_script));
10891090
}
10901091

1092+
auto self = args.This();
1093+
10911094
if (contextify_script->object()
10921095
->SetPrivate(context, env->host_defined_option_symbol(), id_symbol)
10931096
.IsNothing()) {
10941097
return;
10951098
}
1096-
10971099
if (StoreCodeCacheResult(env,
1098-
args.This(),
1100+
self,
10991101
compile_options,
11001102
source,
11011103
produce_cached_data,
11021104
std::move(new_cached_data))
11031105
.IsNothing()) {
11041106
return;
11051107
}
1106-
1107-
if (args.This()
1108-
->Set(env->context(),
1108+
if (self->Set(env->context(),
11091109
env->source_url_string(),
11101110
v8_script->GetSourceURL())
1111-
.IsNothing())
1111+
.IsNothing()) {
11121112
return;
1113-
1114-
if (args.This()
1115-
->Set(env->context(),
1113+
}
1114+
if (self->Set(env->context(),
11161115
env->source_map_url_string(),
11171116
v8_script->GetSourceMappingURL())
1118-
.IsNothing())
1117+
.IsNothing()) {
11191118
return;
1119+
}
11201120

11211121
TRACE_EVENT_END0(TRACING_CATEGORY_NODE2(vm, script), "ContextifyScript::New");
11221122
}
@@ -1566,25 +1566,35 @@ MaybeLocal<Object> ContextifyFunction::CompileFunctionAndCacheResult(
15661566
return {};
15671567
}
15681568

1569-
Isolate* isolate = env->isolate();
1570-
Local<Object> result = Object::New(isolate);
1571-
if (result->Set(parsing_context, env->function_string(), fn).IsNothing())
1572-
return {};
1573-
1574-
// ScriptOrigin::ResourceName() returns SourceURL magic comment content if
1575-
// present.
1576-
if (result
1577-
->Set(parsing_context,
1578-
env->source_url_string(),
1579-
fn->GetScriptOrigin().ResourceName())
1580-
.IsNothing()) {
1581-
return {};
1569+
auto tmpl = env->compiled_function_template();
1570+
if (tmpl.IsEmpty()) {
1571+
static constexpr std::string_view names[] = {
1572+
"function",
1573+
"sourceURL",
1574+
"sourceMapURL",
1575+
"cachedDataRejected",
1576+
"cachedDataProduced",
1577+
"cachedData",
1578+
};
1579+
tmpl = DictionaryTemplate::New(env->isolate(), names);
1580+
env->set_compiled_function_template(tmpl);
15821581
}
1583-
if (result
1584-
->Set(parsing_context,
1585-
env->source_map_url_string(),
1586-
fn->GetScriptOrigin().SourceMapUrl())
1587-
.IsNothing()) {
1582+
1583+
auto scriptOrigin = fn->GetScriptOrigin();
1584+
MaybeLocal<Value> values[] = {
1585+
fn,
1586+
// ScriptOrigin::ResourceName() returns SourceURL magic comment content if
1587+
// present.
1588+
scriptOrigin.ResourceName(),
1589+
scriptOrigin.SourceMapUrl(),
1590+
// These are conditionally filled in by StoreCodeCacheResult below.
1591+
Undefined(env->isolate()), // cachedDataRejected
1592+
Undefined(env->isolate()), // cachedDataProduced
1593+
Undefined(env->isolate()), // cachedData
1594+
};
1595+
1596+
Local<Object> result;
1597+
if (!NewDictionaryInstance(env->context(), tmpl, values).ToLocal(&result)) {
15881598
return {};
15891599
}
15901600

@@ -1799,12 +1809,12 @@ static void CompileFunctionForCJSLoader(
17991809
// be reparsed as ESM.
18001810
Utf8Value filename_utf8(isolate, filename);
18011811
std::string url = url::FromFilePath(filename_utf8.ToStringView());
1802-
Local<String> url_value;
1803-
if (!String::NewFromUtf8(isolate, url.c_str()).ToLocal(&url_value)) {
1812+
Local<Value> url_value;
1813+
if (!ToV8Value(context, url).ToLocal(&url_value)) {
18041814
return;
18051815
}
1806-
can_parse_as_esm =
1807-
ShouldRetryAsESM(realm, cjs_message->Get(), code, url_value);
1816+
can_parse_as_esm = ShouldRetryAsESM(
1817+
realm, cjs_message->Get(), code, url_value.As<String>());
18081818
if (!can_parse_as_esm) {
18091819
// The syntax error is not related to ESM, throw the original error.
18101820
isolate->ThrowException(cjs_exception);
@@ -1827,15 +1837,22 @@ static void CompileFunctionForCJSLoader(
18271837
}
18281838
}
18291839

1840+
auto tmpl = env->compiled_function_cjs_template();
1841+
if (tmpl.IsEmpty()) {
1842+
static constexpr std::string_view names[] = {
1843+
"cachedDataRejected",
1844+
"sourceMapURL",
1845+
"sourceURL",
1846+
"function",
1847+
"canParseAsESM",
1848+
};
1849+
tmpl = DictionaryTemplate::New(isolate, names);
1850+
env->set_compiled_function_cjs_template(tmpl);
1851+
}
1852+
18301853
Local<Value> undefined = v8::Undefined(isolate);
1831-
Local<Name> names[] = {
1832-
env->cached_data_rejected_string(),
1833-
env->source_map_url_string(),
1834-
env->source_url_string(),
1835-
env->function_string(),
1836-
FIXED_ONE_BYTE_STRING(isolate, "canParseAsESM"),
1837-
};
1838-
Local<Value> values[] = {
1854+
1855+
MaybeLocal<Value> values[] = {
18391856
Boolean::New(isolate, cache_rejected),
18401857
fn.IsEmpty() ? undefined : fn->GetScriptOrigin().SourceMapUrl(),
18411858
// ScriptOrigin::ResourceName() returns SourceURL magic comment content if
@@ -1844,9 +1861,10 @@ static void CompileFunctionForCJSLoader(
18441861
fn.IsEmpty() ? undefined : fn.As<Value>(),
18451862
Boolean::New(isolate, can_parse_as_esm),
18461863
};
1847-
Local<Object> result = Object::New(
1848-
isolate, v8::Null(isolate), &names[0], &values[0], arraysize(names));
1849-
args.GetReturnValue().Set(result);
1864+
Local<Object> result;
1865+
if (NewDictionaryInstance(env->context(), tmpl, values).ToLocal(&result)) {
1866+
args.GetReturnValue().Set(result);
1867+
}
18501868
}
18511869

18521870
bool ShouldRetryAsESM(Realm* realm,

0 commit comments

Comments
 (0)