| Index: src/messages.cc
|
| diff --git a/src/messages.cc b/src/messages.cc
|
| index b55a1a505aced16cf4eef8fe6172e72462db4501..a5597e225722143d5bc1735996a41fc5c2efec9c 100644
|
| --- a/src/messages.cc
|
| +++ b/src/messages.cc
|
| @@ -165,6 +165,115 @@ std::unique_ptr<char[]> MessageHandler::GetLocalizedMessage(
|
| return GetMessage(isolate, data)->ToCString(DISALLOW_NULLS);
|
| }
|
|
|
| +namespace {
|
| +
|
| +Object* EvalFromFunctionName(Isolate* isolate, Handle<Script> script) {
|
| + if (script->eval_from_shared()->IsUndefined(isolate))
|
| + return isolate->heap()->undefined_value();
|
| +
|
| + Handle<SharedFunctionInfo> shared(
|
| + SharedFunctionInfo::cast(script->eval_from_shared()));
|
| + // Find the name of the function calling eval.
|
| + if (shared->name()->BooleanValue()) {
|
| + return shared->name();
|
| + }
|
| +
|
| + return shared->inferred_name();
|
| +}
|
| +
|
| +Object* EvalFromScript(Isolate* isolate, Handle<Script> script) {
|
| + if (script->eval_from_shared()->IsUndefined(isolate))
|
| + return isolate->heap()->undefined_value();
|
| +
|
| + Handle<SharedFunctionInfo> eval_from_shared(
|
| + SharedFunctionInfo::cast(script->eval_from_shared()));
|
| + return eval_from_shared->script()->IsScript()
|
| + ? eval_from_shared->script()
|
| + : isolate->heap()->undefined_value();
|
| +}
|
| +
|
| +MaybeHandle<String> FormatEvalOrigin(Isolate* isolate, Handle<Script> script) {
|
| + Handle<Object> sourceURL(script->GetNameOrSourceURL(), isolate);
|
| + if (!sourceURL->IsUndefined(isolate)) {
|
| + DCHECK(sourceURL->IsString());
|
| + return Handle<String>::cast(sourceURL);
|
| + }
|
| +
|
| + IncrementalStringBuilder builder(isolate);
|
| + builder.AppendCString("eval at ");
|
| +
|
| + Handle<Object> eval_from_function_name =
|
| + handle(EvalFromFunctionName(isolate, script), isolate);
|
| + if (eval_from_function_name->BooleanValue()) {
|
| + Handle<String> str;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + isolate, str, Object::ToString(isolate, eval_from_function_name),
|
| + String);
|
| + builder.AppendString(str);
|
| + } else {
|
| + builder.AppendCString("<anonymous>");
|
| + }
|
| +
|
| + Handle<Object> eval_from_script_obj =
|
| + handle(EvalFromScript(isolate, script), isolate);
|
| + if (eval_from_script_obj->IsScript()) {
|
| + Handle<Script> eval_from_script =
|
| + Handle<Script>::cast(eval_from_script_obj);
|
| + builder.AppendCString(" (");
|
| + if (eval_from_script->compilation_type() == Script::COMPILATION_TYPE_EVAL) {
|
| + // Eval script originated from another eval.
|
| + Handle<String> str;
|
| + ASSIGN_RETURN_ON_EXCEPTION(
|
| + isolate, str, FormatEvalOrigin(isolate, eval_from_script), String);
|
| + builder.AppendString(str);
|
| + } else {
|
| + DCHECK(eval_from_script->compilation_type() !=
|
| + Script::COMPILATION_TYPE_EVAL);
|
| + // eval script originated from "real" source.
|
| + Handle<Object> name_obj = handle(eval_from_script->name(), isolate);
|
| + if (eval_from_script->name()->IsString()) {
|
| + builder.AppendString(Handle<String>::cast(name_obj));
|
| +
|
| + Script::PositionInfo info;
|
| + if (Script::GetPositionInfo(eval_from_script, script->GetEvalPosition(),
|
| + &info, Script::NO_OFFSET)) {
|
| + builder.AppendCString(":");
|
| +
|
| + Handle<String> str = isolate->factory()->NumberToString(
|
| + handle(Smi::FromInt(info.line + 1), isolate));
|
| + builder.AppendString(str);
|
| +
|
| + builder.AppendCString(":");
|
| +
|
| + str = isolate->factory()->NumberToString(
|
| + handle(Smi::FromInt(info.column + 1), isolate));
|
| + builder.AppendString(str);
|
| + }
|
| + } else {
|
| + DCHECK(!eval_from_script->name()->IsString());
|
| + builder.AppendCString("unknown source");
|
| + }
|
| + }
|
| + builder.AppendCString(")");
|
| + }
|
| +
|
| + Handle<String> result;
|
| + ASSIGN_RETURN_ON_EXCEPTION(isolate, result, builder.Finish(), String);
|
| + return result;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +Handle<Object> StackFrameBase::GetEvalOrigin() {
|
| + if (!HasScript()) return isolate_->factory()->undefined_value();
|
| + return FormatEvalOrigin(isolate_, GetScript()).ToHandleChecked();
|
| +}
|
| +
|
| +bool StackFrameBase::IsEval() {
|
| + return HasScript() &&
|
| + GetScript()->compilation_type() == Script::COMPILATION_TYPE_EVAL;
|
| +}
|
| +
|
| void JSStackFrame::FromFrameArray(Isolate* isolate, Handle<FrameArray> array,
|
| int frame_ix) {
|
| DCHECK(!array->IsWasmFrame(frame_ix));
|
| @@ -179,10 +288,12 @@ void JSStackFrame::FromFrameArray(Isolate* isolate, Handle<FrameArray> array,
|
| is_strict_ = (flags & FrameArray::kIsStrict) != 0;
|
| }
|
|
|
| +JSStackFrame::JSStackFrame() {}
|
| +
|
| JSStackFrame::JSStackFrame(Isolate* isolate, Handle<Object> receiver,
|
| Handle<JSFunction> function,
|
| Handle<AbstractCode> code, int offset)
|
| - : isolate_(isolate),
|
| + : StackFrameBase(isolate),
|
| receiver_(receiver),
|
| function_(function),
|
| code_(code),
|
| @@ -190,8 +301,6 @@ JSStackFrame::JSStackFrame(Isolate* isolate, Handle<Object> receiver,
|
| force_constructor_(false),
|
| is_strict_(false) {}
|
|
|
| -JSStackFrame::JSStackFrame() {}
|
| -
|
| Handle<Object> JSStackFrame::GetFunction() const {
|
| return Handle<Object>::cast(function_);
|
| }
|
| @@ -298,105 +407,6 @@ Handle<Object> JSStackFrame::GetMethodName() {
|
| return isolate_->factory()->null_value();
|
| }
|
|
|
| -namespace {
|
| -
|
| -Object* EvalFromFunctionName(Isolate* isolate, Handle<Script> script) {
|
| - if (script->eval_from_shared()->IsUndefined(isolate))
|
| - return isolate->heap()->undefined_value();
|
| -
|
| - Handle<SharedFunctionInfo> shared(
|
| - SharedFunctionInfo::cast(script->eval_from_shared()));
|
| - // Find the name of the function calling eval.
|
| - if (shared->name()->BooleanValue()) {
|
| - return shared->name();
|
| - }
|
| -
|
| - return shared->inferred_name();
|
| -}
|
| -
|
| -Object* EvalFromScript(Isolate* isolate, Handle<Script> script) {
|
| - if (script->eval_from_shared()->IsUndefined(isolate))
|
| - return isolate->heap()->undefined_value();
|
| -
|
| - Handle<SharedFunctionInfo> eval_from_shared(
|
| - SharedFunctionInfo::cast(script->eval_from_shared()));
|
| - return eval_from_shared->script()->IsScript()
|
| - ? eval_from_shared->script()
|
| - : isolate->heap()->undefined_value();
|
| -}
|
| -
|
| -MaybeHandle<String> FormatEvalOrigin(Isolate* isolate, Handle<Script> script) {
|
| - Handle<Object> sourceURL(script->GetNameOrSourceURL(), isolate);
|
| - if (!sourceURL->IsUndefined(isolate)) {
|
| - DCHECK(sourceURL->IsString());
|
| - return Handle<String>::cast(sourceURL);
|
| - }
|
| -
|
| - IncrementalStringBuilder builder(isolate);
|
| - builder.AppendCString("eval at ");
|
| -
|
| - Handle<Object> eval_from_function_name =
|
| - handle(EvalFromFunctionName(isolate, script), isolate);
|
| - if (eval_from_function_name->BooleanValue()) {
|
| - Handle<String> str;
|
| - ASSIGN_RETURN_ON_EXCEPTION(
|
| - isolate, str, Object::ToString(isolate, eval_from_function_name),
|
| - String);
|
| - builder.AppendString(str);
|
| - } else {
|
| - builder.AppendCString("<anonymous>");
|
| - }
|
| -
|
| - Handle<Object> eval_from_script_obj =
|
| - handle(EvalFromScript(isolate, script), isolate);
|
| - if (eval_from_script_obj->IsScript()) {
|
| - Handle<Script> eval_from_script =
|
| - Handle<Script>::cast(eval_from_script_obj);
|
| - builder.AppendCString(" (");
|
| - if (eval_from_script->compilation_type() == Script::COMPILATION_TYPE_EVAL) {
|
| - // Eval script originated from another eval.
|
| - Handle<String> str;
|
| - ASSIGN_RETURN_ON_EXCEPTION(
|
| - isolate, str, FormatEvalOrigin(isolate, eval_from_script), String);
|
| - builder.AppendString(str);
|
| - } else {
|
| - DCHECK(eval_from_script->compilation_type() !=
|
| - Script::COMPILATION_TYPE_EVAL);
|
| - // eval script originated from "real" source.
|
| - Handle<Object> name_obj = handle(eval_from_script->name(), isolate);
|
| - if (eval_from_script->name()->IsString()) {
|
| - builder.AppendString(Handle<String>::cast(name_obj));
|
| -
|
| - Script::PositionInfo info;
|
| - if (Script::GetPositionInfo(eval_from_script, script->GetEvalPosition(),
|
| - &info, Script::NO_OFFSET)) {
|
| - builder.AppendCString(":");
|
| -
|
| - Handle<String> str = isolate->factory()->NumberToString(
|
| - handle(Smi::FromInt(info.line + 1), isolate));
|
| - builder.AppendString(str);
|
| -
|
| - builder.AppendCString(":");
|
| -
|
| - str = isolate->factory()->NumberToString(
|
| - handle(Smi::FromInt(info.column + 1), isolate));
|
| - builder.AppendString(str);
|
| - }
|
| - } else {
|
| - DCHECK(!eval_from_script->name()->IsString());
|
| - builder.AppendCString("unknown source");
|
| - }
|
| - }
|
| - builder.AppendCString(")");
|
| - }
|
| -
|
| - Handle<String> result;
|
| - ASSIGN_RETURN_ON_EXCEPTION(isolate, result, builder.Finish(), String);
|
| - return result;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| Handle<Object> JSStackFrame::GetTypeName() {
|
| // TODO(jgruber): Check for strict/constructor here as in
|
| // CallSitePrototypeGetThis.
|
| @@ -411,11 +421,6 @@ Handle<Object> JSStackFrame::GetTypeName() {
|
| return JSReceiver::GetConstructorName(receiver_object);
|
| }
|
|
|
| -Handle<Object> JSStackFrame::GetEvalOrigin() {
|
| - if (!HasScript()) return isolate_->factory()->undefined_value();
|
| - return FormatEvalOrigin(isolate_, GetScript()).ToHandleChecked();
|
| -}
|
| -
|
| int JSStackFrame::GetLineNumber() {
|
| DCHECK_LE(0, GetPosition());
|
| if (HasScript()) return Script::GetLineNumber(GetScript(), GetPosition()) + 1;
|
| @@ -439,11 +444,6 @@ bool JSStackFrame::IsToplevel() {
|
| receiver_->IsUndefined(isolate_);
|
| }
|
|
|
| -bool JSStackFrame::IsEval() {
|
| - return HasScript() &&
|
| - GetScript()->compilation_type() == Script::COMPILATION_TYPE_EVAL;
|
| -}
|
| -
|
| bool JSStackFrame::IsConstructor() {
|
| if (force_constructor_) return true;
|
| if (!receiver_->IsJSObject()) return false;
|
| @@ -619,6 +619,8 @@ Handle<Script> JSStackFrame::GetScript() const {
|
| return handle(Script::cast(function_->shared()->script()), isolate_);
|
| }
|
|
|
| +WasmStackFrame::WasmStackFrame() {}
|
| +
|
| void WasmStackFrame::FromFrameArray(Isolate* isolate, Handle<FrameArray> array,
|
| int frame_ix) {
|
| // This function is called for both wasm and asm.js->wasm frames.
|
| @@ -681,6 +683,16 @@ Handle<Object> WasmStackFrame::Null() const {
|
| return isolate_->factory()->null_value();
|
| }
|
|
|
| +bool WasmStackFrame::HasScript() const { return true; }
|
| +
|
| +Handle<Script> WasmStackFrame::GetScript() const {
|
| + return WasmInstanceObject::cast(*wasm_instance_)
|
| + ->get_compiled_module()
|
| + ->script();
|
| +}
|
| +
|
| +AsmJsWasmStackFrame::AsmJsWasmStackFrame() {}
|
| +
|
| void AsmJsWasmStackFrame::FromFrameArray(Isolate* isolate,
|
| Handle<FrameArray> array,
|
| int frame_ix) {
|
|
|