| Index: src/compiler/escape-analysis.cc
|
| diff --git a/src/compiler/escape-analysis.cc b/src/compiler/escape-analysis.cc
|
| index 540699701224a72022f4d15bafd4a241d2a373d7..b8a9188701fcb4bf832795d760a0a4be968e41a3 100644
|
| --- a/src/compiler/escape-analysis.cc
|
| +++ b/src/compiler/escape-analysis.cc
|
| @@ -849,6 +849,7 @@ void EscapeStatusAnalysis::DebugPrint() {
|
| EscapeAnalysis::EscapeAnalysis(Graph* graph, CommonOperatorBuilder* common,
|
| Zone* zone)
|
| : zone_(zone),
|
| + slot_not_analyzed_(graph->NewNode(common->NumberConstant(0x1c0debad))),
|
| common_(common),
|
| status_analysis_(new (zone) EscapeStatusAnalysis(this, graph, zone)),
|
| virtual_states_(zone),
|
| @@ -1460,6 +1461,15 @@ void EscapeAnalysis::ProcessStoreField(Node* node) {
|
| if (obj && obj->IsTracked() &&
|
| static_cast<size_t>(offset) < obj->field_count()) {
|
| Node* val = ResolveReplacement(NodeProperties::GetValueInput(node, 1));
|
| + // TODO(mstarzinger): The following is a workaround to not track the code
|
| + // entry field in virtual JSFunction objects. We only ever store the inner
|
| + // pointer into the compile lazy stub in this field and the deoptimizer has
|
| + // this assumption hard-coded in {TranslatedState::MaterializeAt} as well.
|
| + if (val->opcode() == IrOpcode::kInt32Constant ||
|
| + val->opcode() == IrOpcode::kInt64Constant) {
|
| + DCHECK_EQ(JSFunction::kCodeEntryOffset, FieldAccessOf(node->op()).offset);
|
| + val = slot_not_analyzed_;
|
| + }
|
| if (obj->GetField(offset) != val) {
|
| obj = CopyForModificationAt(obj, state, node);
|
| obj->SetField(offset, val);
|
|
|