diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/JavaScriptCore/profiler/ProfilerCompilation.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/JavaScriptCore/profiler/ProfilerCompilation.cpp')
-rw-r--r-- | Source/JavaScriptCore/profiler/ProfilerCompilation.cpp | 99 |
1 files changed, 77 insertions, 22 deletions
diff --git a/Source/JavaScriptCore/profiler/ProfilerCompilation.cpp b/Source/JavaScriptCore/profiler/ProfilerCompilation.cpp index 55766ce5c..255f8319c 100644 --- a/Source/JavaScriptCore/profiler/ProfilerCompilation.cpp +++ b/Source/JavaScriptCore/profiler/ProfilerCompilation.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012, 2013 Apple Inc. All rights reserved. + * Copyright (C) 2012-2014, 2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -28,8 +28,9 @@ #include "JSGlobalObject.h" #include "ObjectConstructor.h" -#include "Operations.h" +#include "JSCInlines.h" #include "ProfilerDatabase.h" +#include "Watchpoint.h" #include <wtf/StringPrintStream.h> namespace JSC { namespace Profiler { @@ -37,9 +38,11 @@ namespace JSC { namespace Profiler { Compilation::Compilation(Bytecodes* bytecodes, CompilationKind kind) : m_bytecodes(bytecodes) , m_kind(kind) + , m_jettisonReason(NotJettisoned) , m_numInlinedGetByIds(0) , m_numInlinedPutByIds(0) , m_numInlinedCalls(0) + , m_uid(UID::create()) { } @@ -67,6 +70,11 @@ void Compilation::addDescription(const CompiledBytecode& compiledBytecode) m_descriptions.append(compiledBytecode); } +void Compilation::addDescription(const OriginStack& stack, const CString& description) +{ + addDescription(CompiledBytecode(stack, description)); +} + ExecutionCounter* Compilation::executionCounterFor(const OriginStack& origin) { std::unique_ptr<ExecutionCounter>& counter = m_counters.add(origin, nullptr).iterator->value; @@ -87,45 +95,92 @@ OSRExit* Compilation::addOSRExit(unsigned id, const OriginStack& originStack, Ex return &m_osrExits.last(); } +void Compilation::setJettisonReason(JettisonReason jettisonReason, const FireDetail* detail) +{ + if (m_jettisonReason != NotJettisoned) + return; // We only care about the original jettison reason. + + m_jettisonReason = jettisonReason; + if (detail) + m_additionalJettisonReason = toCString(*detail); + else + m_additionalJettisonReason = CString(); +} + +void Compilation::dump(PrintStream& out) const +{ + out.print("Comp", m_uid); +} + JSValue Compilation::toJS(ExecState* exec) const { + VM& vm = exec->vm(); + auto scope = DECLARE_THROW_SCOPE(vm); JSObject* result = constructEmptyObject(exec); - - result->putDirect(exec->vm(), exec->propertyNames().bytecodesID, jsNumber(m_bytecodes->id())); - result->putDirect(exec->vm(), exec->propertyNames().compilationKind, jsString(exec, String::fromUTF8(toCString(m_kind)))); + RETURN_IF_EXCEPTION(scope, { }); + result->putDirect(vm, exec->propertyNames().bytecodesID, jsNumber(m_bytecodes->id())); + result->putDirect(vm, exec->propertyNames().compilationKind, jsString(exec, String::fromUTF8(toCString(m_kind)))); JSArray* profiledBytecodes = constructEmptyArray(exec, 0); - for (unsigned i = 0; i < m_profiledBytecodes.size(); ++i) - profiledBytecodes->putDirectIndex(exec, i, m_profiledBytecodes[i].toJS(exec)); - result->putDirect(exec->vm(), exec->propertyNames().profiledBytecodes, profiledBytecodes); + RETURN_IF_EXCEPTION(scope, { }); + for (unsigned i = 0; i < m_profiledBytecodes.size(); ++i) { + auto value = m_profiledBytecodes[i].toJS(exec); + RETURN_IF_EXCEPTION(scope, { }); + profiledBytecodes->putDirectIndex(exec, i, value); + RETURN_IF_EXCEPTION(scope, { }); + } + result->putDirect(vm, exec->propertyNames().profiledBytecodes, profiledBytecodes); JSArray* descriptions = constructEmptyArray(exec, 0); - for (unsigned i = 0; i < m_descriptions.size(); ++i) - descriptions->putDirectIndex(exec, i, m_descriptions[i].toJS(exec)); - result->putDirect(exec->vm(), exec->propertyNames().descriptions, descriptions); + RETURN_IF_EXCEPTION(scope, { }); + for (unsigned i = 0; i < m_descriptions.size(); ++i) { + auto value = m_descriptions[i].toJS(exec); + RETURN_IF_EXCEPTION(scope, { }); + descriptions->putDirectIndex(exec, i, value); + RETURN_IF_EXCEPTION(scope, { }); + } + result->putDirect(vm, exec->propertyNames().descriptions, descriptions); JSArray* counters = constructEmptyArray(exec, 0); + RETURN_IF_EXCEPTION(scope, { }); for (auto it = m_counters.begin(), end = m_counters.end(); it != end; ++it) { JSObject* counterEntry = constructEmptyObject(exec); - counterEntry->putDirect(exec->vm(), exec->propertyNames().origin, it->key.toJS(exec)); - counterEntry->putDirect(exec->vm(), exec->propertyNames().executionCount, jsNumber(it->value->count())); + RETURN_IF_EXCEPTION(scope, { }); + auto value = it->key.toJS(exec); + RETURN_IF_EXCEPTION(scope, { }); + counterEntry->putDirect(vm, exec->propertyNames().origin, value); + counterEntry->putDirect(vm, exec->propertyNames().executionCount, jsNumber(it->value->count())); counters->push(exec, counterEntry); + RETURN_IF_EXCEPTION(scope, { }); } - result->putDirect(exec->vm(), exec->propertyNames().counters, counters); + result->putDirect(vm, exec->propertyNames().counters, counters); JSArray* exitSites = constructEmptyArray(exec, 0); - for (unsigned i = 0; i < m_osrExitSites.size(); ++i) - exitSites->putDirectIndex(exec, i, m_osrExitSites[i].toJS(exec)); - result->putDirect(exec->vm(), exec->propertyNames().osrExitSites, exitSites); + RETURN_IF_EXCEPTION(scope, { }); + for (unsigned i = 0; i < m_osrExitSites.size(); ++i) { + auto value = m_osrExitSites[i].toJS(exec); + RETURN_IF_EXCEPTION(scope, { }); + exitSites->putDirectIndex(exec, i, value); + RETURN_IF_EXCEPTION(scope, { }); + } + result->putDirect(vm, exec->propertyNames().osrExitSites, exitSites); JSArray* exits = constructEmptyArray(exec, 0); - for (unsigned i = 0; i < m_osrExits.size(); ++i) + RETURN_IF_EXCEPTION(scope, { }); + for (unsigned i = 0; i < m_osrExits.size(); ++i) { exits->putDirectIndex(exec, i, m_osrExits[i].toJS(exec)); - result->putDirect(exec->vm(), exec->propertyNames().osrExits, exits); + RETURN_IF_EXCEPTION(scope, { }); + } + result->putDirect(vm, exec->propertyNames().osrExits, exits); + + result->putDirect(vm, exec->propertyNames().numInlinedGetByIds, jsNumber(m_numInlinedGetByIds)); + result->putDirect(vm, exec->propertyNames().numInlinedPutByIds, jsNumber(m_numInlinedPutByIds)); + result->putDirect(vm, exec->propertyNames().numInlinedCalls, jsNumber(m_numInlinedCalls)); + result->putDirect(vm, exec->propertyNames().jettisonReason, jsString(exec, String::fromUTF8(toCString(m_jettisonReason)))); + if (!m_additionalJettisonReason.isNull()) + result->putDirect(vm, exec->propertyNames().additionalJettisonReason, jsString(exec, String::fromUTF8(m_additionalJettisonReason))); - result->putDirect(exec->vm(), exec->propertyNames().numInlinedGetByIds, jsNumber(m_numInlinedGetByIds)); - result->putDirect(exec->vm(), exec->propertyNames().numInlinedPutByIds, jsNumber(m_numInlinedPutByIds)); - result->putDirect(exec->vm(), exec->propertyNames().numInlinedCalls, jsNumber(m_numInlinedCalls)); + result->putDirect(vm, exec->propertyNames().uid, m_uid.toJS(exec)); return result; } |