| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 5a6286593eacb53c32adbec9ffa5e6ed0731a69f..be76d127c0f42598dc2886f0d155b56c2e9546b7 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -12,9 +12,9 @@
|
|
|
| #include "src/accessors.h"
|
| #include "src/allocation-site-scopes.h"
|
| -#include "src/api.h"
|
| #include "src/api-arguments.h"
|
| #include "src/api-natives.h"
|
| +#include "src/api.h"
|
| #include "src/base/bits.h"
|
| #include "src/base/utils/random-number-generator.h"
|
| #include "src/bootstrapper.h"
|
| @@ -30,6 +30,7 @@
|
| #include "src/field-index-inl.h"
|
| #include "src/field-index.h"
|
| #include "src/field-type.h"
|
| +#include "src/frames-inl.h"
|
| #include "src/full-codegen/full-codegen.h"
|
| #include "src/ic/ic.h"
|
| #include "src/identity-map.h"
|
| @@ -13000,6 +13001,45 @@ void Oddball::Initialize(Isolate* isolate, Handle<Oddball> oddball,
|
| oddball->set_kind(kind);
|
| }
|
|
|
| +void Script::SetEvalOrigin(Handle<Script> script,
|
| + Handle<SharedFunctionInfo> outer_info,
|
| + int eval_position) {
|
| + if (eval_position == RelocInfo::kNoPosition) {
|
| + // If the position is missing, attempt to get the code offset from the
|
| + // current activation. Do not translate the code offset into source
|
| + // position, but store it as negative value for lazy translation.
|
| + StackTraceFrameIterator it(script->GetIsolate());
|
| + if (!it.done() && it.is_javascript()) {
|
| + FrameSummary summary = FrameSummary::GetFirst(it.javascript_frame());
|
| + script->set_eval_from_shared(summary.function()->shared());
|
| + script->set_eval_from_position(-summary.code_offset());
|
| + return;
|
| + }
|
| + eval_position = 0;
|
| + }
|
| + script->set_eval_from_shared(*outer_info);
|
| + script->set_eval_from_position(eval_position);
|
| +}
|
| +
|
| +int Script::GetEvalPosition() {
|
| + DisallowHeapAllocation no_gc;
|
| + DCHECK(compilation_type() == Script::COMPILATION_TYPE_EVAL);
|
| + int position = eval_from_position();
|
| + if (position < 0) {
|
| + // Due to laziness, the position may not have been translated from code
|
| + // offset yet, which would be encoded as negative integer. In that case,
|
| + // translate and set the position.
|
| + if (eval_from_shared()->IsUndefined()) {
|
| + position = 0;
|
| + } else {
|
| + SharedFunctionInfo* shared = SharedFunctionInfo::cast(eval_from_shared());
|
| + position = shared->abstract_code()->SourcePosition(-position);
|
| + }
|
| + DCHECK(position >= 0);
|
| + set_eval_from_position(position);
|
| + }
|
| + return position;
|
| +}
|
|
|
| void Script::InitLineEnds(Handle<Script> script) {
|
| if (!script->line_ends()->IsUndefined()) return;
|
|
|