Commit 546939fe authored by Camillo Bruni's avatar Camillo Bruni Committed by Commit Bot

[api] Simplify ScriptOrigin

- Use C++ primitives (int, bool) for the ScriptOrigin constructor.
- Deprecate the old accessors and constructor

Bug: v8:11195
Change-Id: I739edd6b4c58e19a8a16ddce863eea14ec933697
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2555005Reviewed-by: 's avatarRoss McIlroy <rmcilroy@chromium.org>
Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#71384}
parent 52892c1a
......@@ -1424,10 +1424,10 @@ class ScriptOriginOptions {
*/
class ScriptOrigin {
public:
V8_INLINE ScriptOrigin(
Local<Value> resource_name,
Local<Integer> resource_line_offset = Local<Integer>(),
Local<Integer> resource_column_offset = Local<Integer>(),
V8_DEPRECATE_SOON("Use constructor with primitvie C++ types")
V8_INLINE explicit ScriptOrigin(
Local<Value> resource_name, Local<Integer> resource_line_offset,
Local<Integer> resource_column_offset,
Local<Boolean> resource_is_shared_cross_origin = Local<Boolean>(),
Local<Integer> script_id = Local<Integer>(),
Local<Value> source_map_url = Local<Value>(),
......@@ -1435,21 +1435,36 @@ class ScriptOrigin {
Local<Boolean> is_wasm = Local<Boolean>(),
Local<Boolean> is_module = Local<Boolean>(),
Local<PrimitiveArray> host_defined_options = Local<PrimitiveArray>());
V8_INLINE explicit ScriptOrigin(
Local<Value> resource_name, int resource_line_offset = 0,
int resource_column_offset = 0,
bool resource_is_shared_cross_origin = false, int script_id = -1,
Local<Value> source_map_url = Local<Value>(),
bool resource_is_opaque = false, bool is_wasm = false,
bool is_module = false,
Local<PrimitiveArray> host_defined_options = Local<PrimitiveArray>());
V8_INLINE Local<Value> ResourceName() const;
V8_DEPRECATE_SOON("Use getter with primitvie C++ types.")
V8_INLINE Local<Integer> ResourceLineOffset() const;
V8_DEPRECATE_SOON("Use getter with primitvie C++ types.")
V8_INLINE Local<Integer> ResourceColumnOffset() const;
V8_DEPRECATE_SOON("Use getter with primitvie C++ types.")
V8_INLINE Local<Integer> ScriptID() const;
V8_INLINE int LineOffset() const;
V8_INLINE int ColumnOffset() const;
V8_INLINE int ScriptId() const;
V8_INLINE Local<Value> SourceMapUrl() const;
V8_INLINE Local<PrimitiveArray> HostDefinedOptions() const;
V8_INLINE ScriptOriginOptions Options() const { return options_; }
private:
Isolate* isolate_;
Local<Value> resource_name_;
Local<Integer> resource_line_offset_;
Local<Integer> resource_column_offset_;
int resource_line_offset_;
int resource_column_offset_;
ScriptOriginOptions options_;
Local<Integer> script_id_;
int script_id_;
Local<Value> source_map_url_;
Local<PrimitiveArray> host_defined_options_;
};
......@@ -1748,8 +1763,8 @@ class V8_EXPORT ScriptCompiler {
// Source takes ownership of CachedData.
V8_INLINE Source(Local<String> source_string, const ScriptOrigin& origin,
CachedData* cached_data = nullptr);
V8_INLINE Source(Local<String> source_string,
CachedData* cached_data = nullptr);
V8_INLINE explicit Source(Local<String> source_string,
CachedData* cached_data = nullptr);
V8_INLINE ~Source();
// Ownership of the CachedData or its buffers is *not* transferred to the
......@@ -1770,8 +1785,8 @@ class V8_EXPORT ScriptCompiler {
// Origin information
Local<Value> resource_name;
Local<Integer> resource_line_offset;
Local<Integer> resource_column_offset;
int resource_line_offset;
int resource_column_offset;
ScriptOriginOptions resource_options;
Local<Value> source_map_url;
Local<PrimitiveArray> host_defined_options;
......@@ -11377,23 +11392,33 @@ int FunctionCallbackInfo<T>::Length() const {
return length_;
}
ScriptOrigin::ScriptOrigin(Local<Value> resource_name,
Local<Integer> resource_line_offset,
Local<Integer> resource_column_offset,
Local<Boolean> resource_is_shared_cross_origin,
Local<Integer> script_id,
Local<Value> source_map_url,
Local<Boolean> resource_is_opaque,
Local<Boolean> is_wasm, Local<Boolean> is_module,
ScriptOrigin::ScriptOrigin(
Local<Value> resource_name, Local<Integer> line_offset,
Local<Integer> column_offset, Local<Boolean> is_shared_cross_origin,
Local<Integer> script_id, Local<Value> source_map_url,
Local<Boolean> is_opaque, Local<Boolean> is_wasm, Local<Boolean> is_module,
Local<PrimitiveArray> host_defined_options)
: ScriptOrigin(
resource_name,
line_offset.IsEmpty() ? 0 : static_cast<int>(line_offset->Value()),
column_offset.IsEmpty() ? 0
: static_cast<int>(column_offset->Value()),
!is_shared_cross_origin.IsEmpty() && is_shared_cross_origin->IsTrue(),
static_cast<int>(script_id.IsEmpty() ? -1 : script_id->Value()),
source_map_url, !is_opaque.IsEmpty() && is_opaque->IsTrue(),
!is_wasm.IsEmpty() && is_wasm->IsTrue(),
!is_module.IsEmpty() && is_module->IsTrue(), host_defined_options) {}
ScriptOrigin::ScriptOrigin(Local<Value> resource_name, int line_offset,
int column_offset, bool is_shared_cross_origin,
int script_id, Local<Value> source_map_url,
bool is_opaque, bool is_wasm, bool is_module,
Local<PrimitiveArray> host_defined_options)
: resource_name_(resource_name),
resource_line_offset_(resource_line_offset),
resource_column_offset_(resource_column_offset),
options_(!resource_is_shared_cross_origin.IsEmpty() &&
resource_is_shared_cross_origin->IsTrue(),
!resource_is_opaque.IsEmpty() && resource_is_opaque->IsTrue(),
!is_wasm.IsEmpty() && is_wasm->IsTrue(),
!is_module.IsEmpty() && is_module->IsTrue()),
: isolate_(Isolate::GetCurrent()),
resource_name_(resource_name),
resource_line_offset_(line_offset),
resource_column_offset_(column_offset),
options_(is_shared_cross_origin, is_opaque, is_wasm, is_module),
script_id_(script_id),
source_map_url_(source_map_url),
host_defined_options_(host_defined_options) {}
......@@ -11405,17 +11430,22 @@ Local<PrimitiveArray> ScriptOrigin::HostDefinedOptions() const {
}
Local<Integer> ScriptOrigin::ResourceLineOffset() const {
return resource_line_offset_;
return v8::Integer::New(isolate_, resource_line_offset_);
}
Local<Integer> ScriptOrigin::ResourceColumnOffset() const {
return resource_column_offset_;
return v8::Integer::New(isolate_, resource_column_offset_);
}
Local<Integer> ScriptOrigin::ScriptID() const {
return v8::Integer::New(isolate_, script_id_);
}
int ScriptOrigin::LineOffset() const { return resource_line_offset_; }
Local<Integer> ScriptOrigin::ScriptID() const { return script_id_; }
int ScriptOrigin::ColumnOffset() const { return resource_column_offset_; }
int ScriptOrigin::ScriptId() const { return script_id_; }
Local<Value> ScriptOrigin::SourceMapUrl() const { return source_map_url_; }
......@@ -11423,8 +11453,8 @@ ScriptCompiler::Source::Source(Local<String> string, const ScriptOrigin& origin,
CachedData* data)
: source_string(string),
resource_name(origin.ResourceName()),
resource_line_offset(origin.ResourceLineOffset()),
resource_column_offset(origin.ResourceColumnOffset()),
resource_line_offset(origin.LineOffset()),
resource_column_offset(origin.ColumnOffset()),
resource_options(origin.Options()),
source_map_url(origin.SourceMapUrl()),
host_defined_options(origin.HostDefinedOptions()),
......
......@@ -372,18 +372,12 @@ static ScriptOrigin GetScriptOriginForScript(i::Isolate* isolate,
i::Handle<i::Object> source_map_url(script->source_mapping_url(), isolate);
i::Handle<i::FixedArray> host_defined_options(script->host_defined_options(),
isolate);
v8::Isolate* v8_isolate = reinterpret_cast<v8::Isolate*>(isolate);
ScriptOriginOptions options(script->origin_options());
v8::ScriptOrigin origin(
Utils::ToLocal(scriptName),
v8::Integer::New(v8_isolate, script->line_offset()),
v8::Integer::New(v8_isolate, script->column_offset()),
v8::Boolean::New(v8_isolate, options.IsSharedCrossOrigin()),
v8::Integer::New(v8_isolate, script->id()),
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()),
Utils::ToLocal(scriptName), script->line_offset(),
script->column_offset(), options.IsSharedCrossOrigin(), script->id(),
Utils::ToLocal(source_map_url), options.IsOpaque(),
script->type() == i::Script::TYPE_WASM, options.IsModule(),
Utils::ToLocal(host_defined_options));
return origin;
}
......@@ -2430,26 +2424,19 @@ void Module::SetSyntheticModuleExport(Local<String> export_name,
namespace {
i::Compiler::ScriptDetails GetScriptDetails(
i::Isolate* isolate, Local<Value> resource_name,
Local<Integer> resource_line_offset, Local<Integer> resource_column_offset,
Local<Value> source_map_url, Local<PrimitiveArray> host_defined_options) {
i::Isolate* isolate, Local<Value> resource_name, int resource_line_offset,
int resource_column_offset, Local<Value> source_map_url,
Local<PrimitiveArray> host_defined_options) {
i::Compiler::ScriptDetails script_details;
if (!resource_name.IsEmpty()) {
script_details.name_obj = Utils::OpenHandle(*(resource_name));
}
if (!resource_line_offset.IsEmpty()) {
script_details.line_offset =
static_cast<int>(resource_line_offset->Value());
}
if (!resource_column_offset.IsEmpty()) {
script_details.column_offset =
static_cast<int>(resource_column_offset->Value());
}
script_details.host_defined_options = isolate->factory()->empty_fixed_array();
if (!host_defined_options.IsEmpty()) {
script_details.host_defined_options =
Utils::OpenHandle(*(host_defined_options));
}
script_details.line_offset = resource_line_offset;
script_details.column_offset = resource_column_offset;
script_details.host_defined_options =
host_defined_options.IsEmpty()
? isolate->factory()->empty_fixed_array()
: Utils::OpenHandle(*(host_defined_options));
if (!source_map_url.IsEmpty()) {
script_details.source_map_url = Utils::OpenHandle(*(source_map_url));
}
......@@ -2685,10 +2672,10 @@ i::MaybeHandle<i::SharedFunctionInfo> CompileStreamedSource(
i::Isolate* isolate, ScriptCompiler::StreamedSource* v8_source,
Local<String> full_source_string, const ScriptOrigin& origin) {
i::Handle<i::String> str = Utils::OpenHandle(*(full_source_string));
i::Compiler::ScriptDetails script_details = GetScriptDetails(
isolate, origin.ResourceName(), origin.ResourceLineOffset(),
origin.ResourceColumnOffset(), origin.SourceMapUrl(),
origin.HostDefinedOptions());
i::Compiler::ScriptDetails script_details =
GetScriptDetails(isolate, origin.ResourceName(), origin.LineOffset(),
origin.ColumnOffset(), origin.SourceMapUrl(),
origin.HostDefinedOptions());
i::ScriptStreamingData* data = v8_source->impl();
return i::Compiler::GetSharedFunctionInfoForStreamedScript(
isolate, str, script_details, origin.Options(), data);
......@@ -5128,9 +5115,7 @@ Local<Value> Function::GetDisplayName() const {
ScriptOrigin Function::GetScriptOrigin() const {
auto self = Utils::OpenHandle(this);
if (!self->IsJSFunction()) {
return v8::ScriptOrigin(Local<Value>());
}
if (!self->IsJSFunction()) return v8::ScriptOrigin(Local<Value>());
auto func = i::Handle<i::JSFunction>::cast(self);
if (func->shared().script().IsScript()) {
i::Handle<i::Script> script(i::Script::cast(func->shared().script()),
......
......@@ -912,9 +912,9 @@ MaybeLocal<Module> Shell::FetchModuleTree(Local<Module> referrer,
return MaybeLocal<Module>();
}
ScriptOrigin origin(
String::NewFromUtf8(isolate, file_name.c_str()).ToLocalChecked(),
Local<Integer>(), Local<Integer>(), Local<Boolean>(), Local<Integer>(),
Local<Value>(), Local<Boolean>(), Local<Boolean>(), True(isolate));
String::NewFromUtf8(isolate, file_name.c_str()).ToLocalChecked(), 0, 0,
false, -1, Local<Value>(), false, false, true);
ScriptCompiler::Source source(source_text, origin);
Local<Module> module;
if (!CompileString<Module>(isolate, context, source_text, origin)
......
......@@ -800,8 +800,8 @@ Response InjectedScript::createExceptionDetails(
: message->GetStartColumn(m_context->context()).FromMaybe(0))
.build();
if (!message.IsEmpty()) {
exceptionDetails->setScriptId(String16::fromInteger(
static_cast<int>(message->GetScriptOrigin().ScriptID()->Value())));
exceptionDetails->setScriptId(
String16::fromInteger(message->GetScriptOrigin().ScriptId()));
v8::Local<v8::StackTrace> stackTrace = message->GetStackTrace();
if (!stackTrace.IsEmpty() && stackTrace->GetFrameCount() > 0) {
std::unique_ptr<V8StackTraceImpl> v8StackTrace =
......
......@@ -97,12 +97,7 @@ v8::MaybeLocal<v8::Value> V8InspectorImpl::compileAndRunInternalScript(
v8::MaybeLocal<v8::Script> V8InspectorImpl::compileScript(
v8::Local<v8::Context> context, const String16& code,
const String16& fileName) {
v8::ScriptOrigin origin(
toV8String(m_isolate, fileName), v8::Integer::New(m_isolate, 0),
v8::Integer::New(m_isolate, 0),
v8::False(m_isolate), // sharable
v8::Local<v8::Integer>(), toV8String(m_isolate, String16()), // sourceMap
v8::True(m_isolate)); // opaqueresource
v8::ScriptOrigin origin(toV8String(m_isolate, fileName), 0, 0, false);
v8::ScriptCompiler::Source source(toV8String(m_isolate, code), origin);
return v8::ScriptCompiler::Compile(context, &source,
v8::ScriptCompiler::kNoCompileOptions);
......
......@@ -408,9 +408,8 @@ static inline int32_t v8_run_int32value(v8::Local<v8::Script> script) {
static inline v8::Local<v8::Script> CompileWithOrigin(
v8::Local<v8::String> source, v8::Local<v8::String> origin_url,
v8::Local<v8::Boolean> is_shared_cross_origin) {
v8::ScriptOrigin origin(origin_url, v8::Local<v8::Integer>(),
v8::Local<v8::Integer>(), is_shared_cross_origin);
bool is_shared_cross_origin) {
v8::ScriptOrigin origin(origin_url, 0, 0, is_shared_cross_origin);
v8::ScriptCompiler::Source script_source(source, origin);
return v8::ScriptCompiler::Compile(
v8::Isolate::GetCurrent()->GetCurrentContext(), &script_source)
......@@ -420,14 +419,13 @@ static inline v8::Local<v8::Script> CompileWithOrigin(
static inline v8::Local<v8::Script> CompileWithOrigin(
v8::Local<v8::String> source, const char* origin_url,
bool is_shared_cross_origin) {
return CompileWithOrigin(source, v8_str(origin_url),
v8_bool(is_shared_cross_origin));
return CompileWithOrigin(source, v8_str(origin_url), is_shared_cross_origin);
}
static inline v8::Local<v8::Script> CompileWithOrigin(
const char* source, const char* origin_url, bool is_shared_cross_origin) {
return CompileWithOrigin(v8_str(source), v8_str(origin_url),
v8_bool(is_shared_cross_origin));
is_shared_cross_origin);
}
// Helper functions that compile and run the source.
......@@ -488,9 +486,7 @@ static inline v8::Local<v8::Value> CompileRunWithOrigin(const char* source,
int column_number) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Local<v8::Context> context = isolate->GetCurrentContext();
v8::ScriptOrigin origin(v8_str(origin_url),
v8::Integer::New(isolate, line_number),
v8::Integer::New(isolate, column_number));
v8::ScriptOrigin origin(v8_str(origin_url), line_number, column_number);
v8::ScriptCompiler::Source script_source(v8_str(source), origin);
return CompileRun(context, &script_source,
v8::ScriptCompiler::CompileOptions());
......
......@@ -73,10 +73,8 @@ v8::Local<v8::Script> BytecodeExpectationsPrinter::CompileScript(
v8::Local<v8::Module> BytecodeExpectationsPrinter::CompileModule(
const char* program) const {
ScriptOrigin origin(
Local<v8::Value>(), Local<v8::Integer>(), Local<v8::Integer>(),
Local<v8::Boolean>(), Local<v8::Integer>(), Local<v8::Value>(),
Local<v8::Boolean>(), Local<v8::Boolean>(), True(isolate_));
ScriptOrigin origin(Local<v8::Value>(), 0, 0, false, -1, Local<v8::Value>(),
false, false, true);
v8::ScriptCompiler::Source source(V8StringFromUTF8(program), origin);
return v8::ScriptCompiler::CompileModule(isolate_, &source).ToLocalChecked();
}
......
......@@ -325,9 +325,7 @@ TEST(CaptureStackTrace) {
"eval('new baz();');";
v8::Local<v8::String> detailed_src = v8_str(detailed_source);
// Make the script using a non-zero line and column offset.
v8::Local<v8::Integer> line_offset = v8::Integer::New(isolate, 3);
v8::Local<v8::Integer> column_offset = v8::Integer::New(isolate, 5);
v8::ScriptOrigin detailed_origin(origin, line_offset, column_offset);
v8::ScriptOrigin detailed_origin(origin, 3, 5);
v8::ScriptCompiler::Source script_source2(detailed_src, detailed_origin);
v8::Local<v8::UnboundScript> detailed_script(
v8::ScriptCompiler::CompileUnboundScript(isolate, &script_source2)
......
This diff is collapsed.
......@@ -652,9 +652,7 @@ TEST(CompileFunctionInContextScriptOrigin) {
CcTest::InitializeVM();
v8::HandleScope scope(CcTest::isolate());
LocalContext env;
v8::ScriptOrigin origin(v8_str("test"),
v8::Integer::New(CcTest::isolate(), 22),
v8::Integer::New(CcTest::isolate(), 41));
v8::ScriptOrigin origin(v8_str("test"), 22, 41);
v8::ScriptCompiler::Source script_source(v8_str("throw new Error()"), origin);
Local<ScriptOrModule> script;
v8::Local<v8::Function> fun =
......@@ -700,7 +698,7 @@ void TestCompileFunctionInContextToStringImpl() {
// Regression test for v8:6190
{
v8::ScriptOrigin origin(v8_str("test"), v8_int(22), v8_int(41));
v8::ScriptOrigin origin(v8_str("test"), 22, 41);
v8::ScriptCompiler::Source script_source(v8_str("return event"), origin);
v8::Local<v8::String> params[] = {v8_str("event")};
......@@ -727,7 +725,7 @@ void TestCompileFunctionInContextToStringImpl() {
// With no parameters:
{
v8::ScriptOrigin origin(v8_str("test"), v8_int(17), v8_int(31));
v8::ScriptOrigin origin(v8_str("test"), 17, 31);
v8::ScriptCompiler::Source script_source(v8_str("return 0"), origin);
v8::TryCatch try_catch(CcTest::isolate());
......@@ -752,7 +750,7 @@ void TestCompileFunctionInContextToStringImpl() {
// With a name:
{
v8::ScriptOrigin origin(v8_str("test"), v8_int(17), v8_int(31));
v8::ScriptOrigin origin(v8_str("test"), 17, 31);
v8::ScriptCompiler::Source script_source(v8_str("return 0"), origin);
v8::TryCatch try_catch(CcTest::isolate());
......
......@@ -2848,8 +2848,7 @@ TEST(PauseInScript) {
const char* src = "(function (evt) {})";
const char* script_name = "StepInHandlerTest";
v8::ScriptOrigin origin(v8_str(env->GetIsolate(), script_name),
v8::Integer::New(env->GetIsolate(), 0));
v8::ScriptOrigin origin(v8_str(env->GetIsolate(), script_name));
v8::Local<v8::Script> script =
v8::Script::Compile(context, v8_str(env->GetIsolate(), src), &origin)
.ToLocalChecked();
......@@ -4527,8 +4526,7 @@ UNINITIALIZED_TEST(LoadedAtStartupScripts) {
LocalContext context(isolate);
std::vector<i::Handle<i::Script>> scripts;
CompileWithOrigin(v8_str("function foo(){}"), v8_str("normal.js"),
v8_bool(false));
CompileWithOrigin(v8_str("function foo(){}"), v8_str("normal.js"), false);
std::unordered_map<int, int> count_by_type;
{
i::DisallowGarbageCollection no_gc;
......
......@@ -299,8 +299,7 @@ TEST(Issue23768) {
// Script needs to have a name in order to trigger InitLineEnds execution.
v8::Local<v8::String> origin =
v8::String::NewFromUtf8Literal(CcTest::isolate(), "issue-23768-test");
v8::Local<v8::Script> evil_script =
CompileWithOrigin(source, origin, v8_bool(false));
v8::Local<v8::Script> evil_script = CompileWithOrigin(source, origin, false);
CHECK(!evil_script.IsEmpty());
CHECK(!evil_script->Run(env).IsEmpty());
i::Handle<i::ExternalTwoByteString> i_source(
......
......@@ -21,10 +21,8 @@ using v8::String;
using v8::Value;
ScriptOrigin ModuleOrigin(Local<v8::Value> resource_name, Isolate* isolate) {
ScriptOrigin origin(resource_name, Local<v8::Integer>(), Local<v8::Integer>(),
Local<v8::Boolean>(), Local<v8::Integer>(),
Local<v8::Value>(), Local<v8::Boolean>(),
Local<v8::Boolean>(), True(isolate));
ScriptOrigin origin(resource_name, 0, 0, false, -1, Local<v8::Value>(), false,
false, true);
return origin;
}
......
......@@ -256,8 +256,7 @@ int IsolateData::HandleMessage(v8::Local<v8::Message> message,
IsolateData::FromContext(context)->inspector_.get();
v8::Local<v8::StackTrace> stack = message->GetStackTrace();
int script_id =
static_cast<int>(message->GetScriptOrigin().ScriptID()->Value());
int script_id = message->GetScriptOrigin().ScriptId();
if (!stack.IsEmpty() && stack->GetFrameCount() > 0) {
int top_script_id = stack->GetFrame(isolate, 0)->GetScriptId();
if (top_script_id == script_id) script_id = 0;
......
......@@ -20,16 +20,13 @@ void ExecuteStringTask::Run(IsolateData* data) {
v8::HandleScope handle_scope(data->isolate());
v8::Local<v8::Context> context = data->GetDefaultContext(context_group_id_);
v8::Context::Scope context_scope(context);
v8::ScriptOrigin origin(
ToV8String(data->isolate(), name_),
v8::Integer::New(data->isolate(), line_offset_),
v8::Integer::New(data->isolate(), column_offset_),
/* resource_is_shared_cross_origin */ v8::Local<v8::Boolean>(),
/* script_id */ v8::Local<v8::Integer>(),
/* source_map_url */ v8::Local<v8::Value>(),
/* resource_is_opaque */ v8::Local<v8::Boolean>(),
/* is_wasm */ v8::Local<v8::Boolean>(),
v8::Boolean::New(data->isolate(), is_module_));
v8::ScriptOrigin origin(ToV8String(data->isolate(), name_), line_offset_,
column_offset_,
/* resource_is_shared_cross_origin */ false,
/* script_id */ -1,
/* source_map_url */ v8::Local<v8::Value>(),
/* resource_is_opaque */ false,
/* is_wasm */ false, is_module_);
v8::Local<v8::String> source;
if (expression_.size() != 0)
source = ToV8String(data->isolate(), expression_);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment