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) { |