diff options
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGVariableEventStream.cpp')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGVariableEventStream.cpp | 49 |
1 files changed, 20 insertions, 29 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGVariableEventStream.cpp b/Source/JavaScriptCore/dfg/DFGVariableEventStream.cpp index 6392f14a9..98e08f6ff 100644 --- a/Source/JavaScriptCore/dfg/DFGVariableEventStream.cpp +++ b/Source/JavaScriptCore/dfg/DFGVariableEventStream.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012-2015 Apple Inc. All rights reserved. + * Copyright (C) 2012, 2013 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,8 +31,7 @@ #include "CodeBlock.h" #include "DFGJITCode.h" #include "DFGValueSource.h" -#include "InlineCallFrame.h" -#include "JSCInlines.h" +#include "Operations.h" #include <wtf/DataLog.h> #include <wtf/HashMap.h> @@ -49,14 +48,11 @@ namespace { struct MinifiedGenerationInfo { bool filled; // true -> in gpr/fpr/pair, false -> spilled - bool alive; VariableRepresentation u; DataFormat format; MinifiedGenerationInfo() - : filled(false) - , alive(false) - , format(DataFormatNone) + : format(DataFormatNone) { } @@ -66,19 +62,13 @@ struct MinifiedGenerationInfo { case BirthToFill: case Fill: filled = true; - alive = true; break; case BirthToSpill: case Spill: filled = false; - alive = true; break; - case Birth: - alive = true; - return; case Death: format = DataFormatNone; - alive = false; return; default: return; @@ -91,23 +81,25 @@ struct MinifiedGenerationInfo { } // namespace -bool VariableEventStream::tryToSetConstantRecovery(ValueRecovery& recovery, MinifiedNode* node) const +bool VariableEventStream::tryToSetConstantRecovery(ValueRecovery& recovery, CodeBlock* codeBlock, MinifiedNode* node) const { if (!node) return false; - if (node->hasConstant()) { - recovery = ValueRecovery::constant(node->constant()); + if (node->hasConstantNumber()) { + recovery = ValueRecovery::constant( + codeBlock->constantRegister( + FirstConstantRegisterIndex + node->constantNumber()).get()); return true; } - if (node->op() == PhantomDirectArguments) { - recovery = ValueRecovery::directArgumentsThatWereNotCreated(node->id()); + if (node->hasWeakConstant()) { + recovery = ValueRecovery::constant(node->weakConstant()); return true; } - if (node->op() == PhantomClonedArguments) { - recovery = ValueRecovery::outOfBandArgumentsThatWereNotCreated(node->id()); + if (node->op() == PhantomArguments) { + recovery = ValueRecovery::argumentsThatWereNotCreated(); return true; } @@ -123,9 +115,9 @@ void VariableEventStream::reconstruct( unsigned numVariables; if (codeOrigin.inlineCallFrame) - numVariables = baselineCodeBlockForInlineCallFrame(codeOrigin.inlineCallFrame)->m_numCalleeLocals + VirtualRegister(codeOrigin.inlineCallFrame->stackOffset).toLocal() + 1; + numVariables = baselineCodeBlockForInlineCallFrame(codeOrigin.inlineCallFrame)->m_numCalleeRegisters + VirtualRegister(codeOrigin.inlineCallFrame->stackOffset).toLocal() + 1; else - numVariables = baselineCodeBlock->m_numCalleeLocals; + numVariables = baselineCodeBlock->m_numCalleeRegisters; // Crazy special case: if we're at index == 0 then this must be an argument check // failure, in which case all variables are already set up. The recoveries should @@ -156,8 +148,7 @@ void VariableEventStream::reconstruct( // nothing to do. break; case BirthToFill: - case BirthToSpill: - case Birth: { + case BirthToSpill: { MinifiedGenerationInfo info; info.update(event); generationInfos.add(event.id(), info); @@ -196,20 +187,20 @@ void VariableEventStream::reconstruct( ASSERT(source.kind() == HaveNode); MinifiedNode* node = graph.at(source.id()); + if (tryToSetConstantRecovery(valueRecoveries[i], codeBlock, node)) + continue; + MinifiedGenerationInfo info = generationInfos.get(source.id()); - if (!info.alive) { + if (info.format == DataFormatNone) { valueRecoveries[i] = ValueRecovery::constant(jsUndefined()); continue; } - - if (tryToSetConstantRecovery(valueRecoveries[i], node)) - continue; ASSERT(info.format != DataFormatNone); if (info.filled) { if (info.format == DataFormatDouble) { - valueRecoveries[i] = ValueRecovery::inFPR(info.u.fpr, DataFormatDouble); + valueRecoveries[i] = ValueRecovery::inFPR(info.u.fpr); continue; } #if USE(JSVALUE32_64) |