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

📄 jsglobaldata.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 "JSGlobalData.h"#include "ArgList.h"#include "Collector.h"#include "CommonIdentifiers.h"#include "FunctionConstructor.h"#include "Interpreter.h"#include "JSActivation.h"#include "JSArray.h"#include "JSByteArray.h"#include "JSClassRef.h"#include "JSLock.h"#include "JSNotAnObject.h"#include "JSStaticScopeObject.h"#include "Parser.h"#include "Lexer.h"#include "Lookup.h"#include "Nodes.h"#if ENABLE(JSC_MULTIPLE_THREADS)#include <wtf/Threading.h>#endif#if PLATFORM(MAC)#include "ProfilerServer.h"#endifusing namespace WTF;namespace JSC {extern const HashTable arrayTable;extern const HashTable dateTable;extern const HashTable mathTable;extern const HashTable numberTable;extern const HashTable regExpTable;extern const HashTable regExpConstructorTable;extern const HashTable stringTable;struct VPtrSet {    VPtrSet();    void* jsArrayVPtr;    void* jsByteArrayVPtr;    void* jsStringVPtr;    void* jsFunctionVPtr;};VPtrSet::VPtrSet(){    // Bizarrely, calling fastMalloc here is faster than allocating space on the stack.    void* storage = fastMalloc(sizeof(CollectorBlock));    JSCell* jsArray = new (storage) JSArray(JSArray::createStructure(jsNull()));    jsArrayVPtr = jsArray->vptr();    jsArray->~JSCell();    JSCell* jsByteArray = new (storage) JSByteArray(JSByteArray::VPtrStealingHack);    jsByteArrayVPtr = jsByteArray->vptr();    jsByteArray->~JSCell();    JSCell* jsString = new (storage) JSString(JSString::VPtrStealingHack);    jsStringVPtr = jsString->vptr();    jsString->~JSCell();    JSCell* jsFunction = new (storage) JSFunction(JSFunction::createStructure(jsNull()));    jsFunctionVPtr = jsFunction->vptr();    jsFunction->~JSCell();    fastFree(storage);}JSGlobalData::JSGlobalData(bool isShared, const VPtrSet& vptrSet)    : isSharedInstance(isShared)    , clientData(0)    , arrayTable(new HashTable(JSC::arrayTable))    , dateTable(new HashTable(JSC::dateTable))    , mathTable(new HashTable(JSC::mathTable))    , numberTable(new HashTable(JSC::numberTable))    , regExpTable(new HashTable(JSC::regExpTable))    , regExpConstructorTable(new HashTable(JSC::regExpConstructorTable))    , stringTable(new HashTable(JSC::stringTable))    , activationStructure(JSActivation::createStructure(jsNull()))    , interruptedExecutionErrorStructure(JSObject::createStructure(jsNull()))    , staticScopeStructure(JSStaticScopeObject::createStructure(jsNull()))    , stringStructure(JSString::createStructure(jsNull()))    , notAnObjectErrorStubStructure(JSNotAnObjectErrorStub::createStructure(jsNull()))    , notAnObjectStructure(JSNotAnObject::createStructure(jsNull()))#if !USE(ALTERNATE_JSIMMEDIATE)    , numberStructure(JSNumberCell::createStructure(jsNull()))#endif    , jsArrayVPtr(vptrSet.jsArrayVPtr)    , jsByteArrayVPtr(vptrSet.jsByteArrayVPtr)    , jsStringVPtr(vptrSet.jsStringVPtr)    , jsFunctionVPtr(vptrSet.jsFunctionVPtr)    , identifierTable(createIdentifierTable())    , propertyNames(new CommonIdentifiers(this))    , emptyList(new ArgList)    , lexer(new Lexer(this))    , parser(new Parser)    , interpreter(new Interpreter)#if ENABLE(JIT)    , jitStubs(this)#endif    , heap(this)    , exception(noValue())    , initializingLazyNumericCompareFunction(false)    , newParserObjects(0)    , parserObjectExtraRefCounts(0)    , head(0)    , dynamicGlobalObject(0)    , scopeNodeBeingReparsed(0){#if PLATFORM(MAC)    startProfilerServerIfNeeded();#endif}JSGlobalData::~JSGlobalData(){    // By the time this is destroyed, heap.destroy() must already have been called.    delete interpreter;#ifndef NDEBUG    // Zeroing out to make the behavior more predictable when someone attempts to use a deleted instance.    interpreter = 0;#endif    arrayTable->deleteTable();    dateTable->deleteTable();    mathTable->deleteTable();    numberTable->deleteTable();    regExpTable->deleteTable();    regExpConstructorTable->deleteTable();    stringTable->deleteTable();    delete arrayTable;    delete dateTable;    delete mathTable;    delete numberTable;    delete regExpTable;    delete regExpConstructorTable;    delete stringTable;    delete parser;    delete lexer;    deleteAllValues(opaqueJSClassData);    delete emptyList;    delete propertyNames;    deleteIdentifierTable(identifierTable);    delete newParserObjects;    delete parserObjectExtraRefCounts;        delete clientData;}PassRefPtr<JSGlobalData> JSGlobalData::create(bool isShared){    return adoptRef(new JSGlobalData(isShared, VPtrSet()));}PassRefPtr<JSGlobalData> JSGlobalData::createLeaked(){#ifndef NDEBUG    Structure::startIgnoringLeaks();    RefPtr<JSGlobalData> data = create();    Structure::stopIgnoringLeaks();    return data.release();#else    return create();#endif}bool JSGlobalData::sharedInstanceExists(){    return sharedInstanceInternal();}JSGlobalData& JSGlobalData::sharedInstance(){    JSGlobalData*& instance = sharedInstanceInternal();    if (!instance) {        instance = create(true).releaseRef();#if ENABLE(JSC_MULTIPLE_THREADS)        instance->makeUsableFromMultipleThreads();#endif    }    return *instance;}JSGlobalData*& JSGlobalData::sharedInstanceInternal(){    ASSERT(JSLock::currentThreadIsHoldingLock());    static JSGlobalData* sharedInstance;    return sharedInstance;}// FIXME: We can also detect forms like v1 < v2 ? -1 : 0, reverse comparison, etc.const Vector<Instruction>& JSGlobalData::numericCompareFunction(ExecState* exec){    if (!lazyNumericCompareFunction.size() && !initializingLazyNumericCompareFunction) {        initializingLazyNumericCompareFunction = true;        RefPtr<ProgramNode> programNode = parser->parse<ProgramNode>(exec, 0, makeSource(UString("(function (v1, v2) { return v1 - v2; })")), 0, 0);        RefPtr<FunctionBodyNode> functionBody = extractFunctionBody(programNode.get());        lazyNumericCompareFunction = functionBody->bytecode(exec->scopeChain()).instructions();        initializingLazyNumericCompareFunction = false;    }    return lazyNumericCompareFunction;}JSGlobalData::ClientData::~ClientData(){}} // namespace JSC

⌨️ 快捷键说明

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