/*
- * Copyright (C) 2011, 2012 Apple Inc. All rights reserved.
+ * Copyright (C) 2011, 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
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
- * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
+ * 3. Neither the name of Apple Inc. ("Apple") nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
#ifndef ValueProfile_h
#define ValueProfile_h
-#include <wtf/Platform.h>
-
-#if ENABLE(VALUE_PROFILER)
-
+#include "ConcurrentJITLock.h"
+#include "Heap.h"
#include "JSArray.h"
-#include "PredictedType.h"
+#include "SpeculatedType.h"
#include "Structure.h"
#include "WriteBarrier.h"
+#include <wtf/PrintStream.h>
+#include <wtf/StringPrintStream.h>
namespace JSC {
ValueProfileBase()
: m_bytecodeOffset(-1)
- , m_prediction(PredictNone)
+ , m_prediction(SpecNone)
, m_numberOfSamplesInPrediction(0)
{
for (unsigned i = 0; i < totalNumberOfBuckets; ++i)
ValueProfileBase(int bytecodeOffset)
: m_bytecodeOffset(bytecodeOffset)
- , m_prediction(PredictNone)
+ , m_prediction(SpecNone)
, m_numberOfSamplesInPrediction(0)
{
for (unsigned i = 0; i < totalNumberOfBuckets; ++i)
return false;
}
- void dump(FILE* out)
+ CString briefDescription(const ConcurrentJITLocker& locker)
{
- fprintf(out,
- "samples = %u, prediction = %s",
- totalNumberOfSamples(),
- predictionToString(m_prediction));
+ computeUpdatedPrediction(locker);
+
+ StringPrintStream out;
+ out.print("predicting ", SpeculationDump(m_prediction));
+ return out.toCString();
+ }
+
+ void dump(PrintStream& out)
+ {
+ out.print("samples = ", totalNumberOfSamples(), " prediction = ", SpeculationDump(m_prediction));
bool first = true;
for (unsigned i = 0; i < totalNumberOfBuckets; ++i) {
JSValue value = JSValue::decode(m_buckets[i]);
if (!!value) {
if (first) {
- fprintf(out, ": ");
+ out.printf(": ");
first = false;
} else
- fprintf(out, ", ");
- fprintf(out, "%s", value.description());
+ out.printf(", ");
+ out.print(value);
}
}
}
- // Updates the prediction and returns the new one.
- PredictedType computeUpdatedPrediction()
+ // Updates the prediction and returns the new one. Never call this from any thread
+ // that isn't executing the code.
+ SpeculatedType computeUpdatedPrediction(const ConcurrentJITLocker&)
{
for (unsigned i = 0; i < totalNumberOfBuckets; ++i) {
JSValue value = JSValue::decode(m_buckets[i]);
continue;
m_numberOfSamplesInPrediction++;
- mergePrediction(m_prediction, predictionFromValue(value));
+ mergeSpeculation(m_prediction, speculationFromValue(value));
m_buckets[i] = JSValue::encode(JSValue());
}
int m_bytecodeOffset; // -1 for prologue
- PredictedType m_prediction;
+ SpeculatedType m_prediction;
unsigned m_numberOfSamplesInPrediction;
EncodedJSValue m_buckets[totalNumberOfBuckets];
} // namespace JSC
-#endif // ENABLE(VALUE_PROFILER)
-
#endif // ValueProfile_h