⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 profiler.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* * Copyright (C) 2008 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1.  Redistributions of source code must retain the above copyright *     notice, this list of conditions and the following disclaimer. * 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 *     its contributors may be used to endorse or promote products derived *     from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#include "config.h"#include "Profiler.h"#include "CommonIdentifiers.h"#include "CallFrame.h"#include "JSFunction.h"#include "JSGlobalObject.h"#include "Profile.h"#include "ProfileGenerator.h"#include "ProfileNode.h"#include <stdio.h>namespace JSC {static const char* GlobalCodeExecution = "(program)";static const char* AnonymousFunction = "(anonymous function)";static unsigned ProfilesUID = 0;static CallIdentifier createCallIdentifierFromFunctionImp(JSGlobalData*, JSFunction*);Profiler* Profiler::s_sharedProfiler = 0;Profiler* Profiler::s_sharedEnabledProfilerReference = 0;Profiler* Profiler::profiler(){    if (!s_sharedProfiler)        s_sharedProfiler = new Profiler();    return s_sharedProfiler;}   void Profiler::startProfiling(ExecState* exec, const UString& title){    ASSERT_ARG(title, !title.isNull());    // Check if we currently have a Profile for this global ExecState and title.    // If so return early and don't create a new Profile.    ExecState* globalExec = exec ? exec->lexicalGlobalObject()->globalExec() : 0;    for (size_t i = 0; i < m_currentProfiles.size(); ++i) {        ProfileGenerator* profileGenerator = m_currentProfiles[i].get();        if (profileGenerator->originatingGlobalExec() == globalExec && profileGenerator->title() == title)            return;    }    s_sharedEnabledProfilerReference = this;    RefPtr<ProfileGenerator> profileGenerator = ProfileGenerator::create(title, exec, ++ProfilesUID);    m_currentProfiles.append(profileGenerator);}PassRefPtr<Profile> Profiler::stopProfiling(ExecState* exec, const UString& title){    ExecState* globalExec = exec ? exec->lexicalGlobalObject()->globalExec() : 0;    for (ptrdiff_t i = m_currentProfiles.size() - 1; i >= 0; --i) {        ProfileGenerator* profileGenerator = m_currentProfiles[i].get();        if (profileGenerator->originatingGlobalExec() == globalExec && (title.isNull() || profileGenerator->title() == title)) {            profileGenerator->stopProfiling();            RefPtr<Profile> returnProfile = profileGenerator->profile();            m_currentProfiles.remove(i);            if (!m_currentProfiles.size())                s_sharedEnabledProfilerReference = 0;                        return returnProfile;        }    }    return 0;}static inline void dispatchFunctionToProfiles(const Vector<RefPtr<ProfileGenerator> >& profiles, ProfileGenerator::ProfileFunction function, const CallIdentifier& callIdentifier, unsigned currentProfileTargetGroup){    for (size_t i = 0; i < profiles.size(); ++i) {        if (profiles[i]->profileGroup() == currentProfileTargetGroup || !profiles[i]->originatingGlobalExec())            (profiles[i].get()->*function)(callIdentifier);    }}void Profiler::willExecute(ExecState* exec, JSValuePtr function){    ASSERT(!m_currentProfiles.isEmpty());    dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::willExecute, createCallIdentifier(&exec->globalData(), function, "", 0), exec->lexicalGlobalObject()->profileGroup());}void Profiler::willExecute(ExecState* exec, const UString& sourceURL, int startingLineNumber){    ASSERT(!m_currentProfiles.isEmpty());    CallIdentifier callIdentifier = createCallIdentifier(&exec->globalData(), noValue(), sourceURL, startingLineNumber);    dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::willExecute, callIdentifier, exec->lexicalGlobalObject()->profileGroup());}void Profiler::didExecute(ExecState* exec, JSValuePtr function){    ASSERT(!m_currentProfiles.isEmpty());    dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::didExecute, createCallIdentifier(&exec->globalData(), function, "", 0), exec->lexicalGlobalObject()->profileGroup());}void Profiler::didExecute(ExecState* exec, const UString& sourceURL, int startingLineNumber){    ASSERT(!m_currentProfiles.isEmpty());    dispatchFunctionToProfiles(m_currentProfiles, &ProfileGenerator::didExecute, createCallIdentifier(&exec->globalData(), noValue(), sourceURL, startingLineNumber), exec->lexicalGlobalObject()->profileGroup());}CallIdentifier Profiler::createCallIdentifier(JSGlobalData* globalData, JSValuePtr function, const UString& defaultSourceURL, int defaultLineNumber){    if (!function)        return CallIdentifier(GlobalCodeExecution, defaultSourceURL, defaultLineNumber);    if (!function.isObject())        return CallIdentifier("(unknown)", defaultSourceURL, defaultLineNumber);    if (asObject(function)->inherits(&JSFunction::info))        return createCallIdentifierFromFunctionImp(globalData, asFunction(function));    if (asObject(function)->inherits(&InternalFunction::info))        return CallIdentifier(static_cast<InternalFunction*>(asObject(function))->name(globalData), defaultSourceURL, defaultLineNumber);    return CallIdentifier("(" + asObject(function)->className() + " object)", defaultSourceURL, defaultLineNumber);}CallIdentifier createCallIdentifierFromFunctionImp(JSGlobalData* globalData, JSFunction* function){    const UString& name = function->name(globalData);    return CallIdentifier(name.isEmpty() ? AnonymousFunction : name, function->body()->sourceURL(), function->body()->lineNo());}} // namespace JSC

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -