| Index: src/runtime/runtime.cc
|
| diff --git a/src/runtime/runtime.cc b/src/runtime/runtime.cc
|
| index 151e240f2505c89d6db87b4ed3829533df6c3471..c4f4120c80cbac9493ffb42351f866a9702b869b 100644
|
| --- a/src/runtime/runtime.cc
|
| +++ b/src/runtime/runtime.cc
|
| @@ -5,10 +5,14 @@
|
| #include "src/runtime/runtime.h"
|
|
|
| #include "src/assembler.h"
|
| +#include "src/ast/prettyprinter.h"
|
| #include "src/contexts.h"
|
| +#include "src/frames-inl.h"
|
| #include "src/handles-inl.h"
|
| #include "src/heap/heap.h"
|
| +#include "src/isolate-inl.h"
|
| #include "src/isolate.h"
|
| +#include "src/parsing/parser.h"
|
| #include "src/runtime/runtime-utils.h"
|
|
|
| namespace v8 {
|
| @@ -125,6 +129,50 @@ const Runtime::Function* Runtime::RuntimeFunctionTable(Isolate* isolate) {
|
| }
|
| }
|
|
|
| +bool Runtime::ComputeLocation(Isolate* isolate, MessageLocation* target) {
|
| + JavaScriptFrameIterator it(isolate);
|
| + if (!it.done()) {
|
| + JavaScriptFrame* frame = it.frame();
|
| + JSFunction* fun = frame->function();
|
| + Object* script = fun->shared()->script();
|
| + if (script->IsScript() &&
|
| + !(Script::cast(script)->source()->IsUndefined())) {
|
| + Handle<Script> casted_script(Script::cast(script));
|
| + // Compute the location from the function and the relocation info of the
|
| + // baseline code. For optimized code this will use the deoptimization
|
| + // information to get canonical location information.
|
| + List<FrameSummary> frames(FLAG_max_inlining_levels + 1);
|
| + it.frame()->Summarize(&frames);
|
| + FrameSummary& summary = frames.last();
|
| + int pos = summary.abstract_code()->SourcePosition(summary.code_offset());
|
| + *target = MessageLocation(casted_script, pos, pos + 1, handle(fun));
|
| + return true;
|
| + }
|
| + }
|
| + return false;
|
| +}
|
| +
|
| +Handle<String> Runtime::RenderCallSite(Isolate* isolate,
|
| + Handle<Object> object) {
|
| + MessageLocation location;
|
| + if (ComputeLocation(isolate, &location)) {
|
| + Zone zone;
|
| + base::SmartPointer<ParseInfo> info(
|
| + location.function()->shared()->is_function()
|
| + ? new ParseInfo(&zone, location.function())
|
| + : new ParseInfo(&zone, location.script()));
|
| + if (Parser::ParseStatic(info.get())) {
|
| + CallPrinter printer(isolate, location.function()->shared()->IsBuiltin());
|
| + const char* string = printer.Print(info->literal(), location.start_pos());
|
| + if (strlen(string) > 0) {
|
| + return isolate->factory()->NewStringFromAsciiChecked(string);
|
| + }
|
| + } else {
|
| + isolate->clear_pending_exception();
|
| + }
|
| + }
|
| + return Object::TypeOf(isolate, object);
|
| +}
|
|
|
| std::ostream& operator<<(std::ostream& os, Runtime::FunctionId id) {
|
| return os << Runtime::FunctionForId(id)->name;
|
|
|