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

📄 jscell.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
字号:
/* *  Copyright (C) 1999-2001 Harri Porten (porten@kde.org) *  Copyright (C) 2001 Peter Kelly (pmk@post.com) *  Copyright (C) 2003, 2007, 2008 Apple Inc. All rights reserved. * *  This library is free software; you can redistribute it and/or *  modify it under the terms of the GNU Library General Public *  License as published by the Free Software Foundation; either *  version 2 of the License, or (at your option) any later version. * *  This library is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU *  Library General Public License for more details. * *  You should have received a copy of the GNU Library General Public License *  along with this library; see the file COPYING.LIB.  If not, write to *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, *  Boston, MA 02110-1301, USA. * */#include "config.h"#include "JSCell.h"#include "JSFunction.h"#include "JSString.h"#include "JSObject.h"#include <wtf/MathExtras.h>namespace JSC {#if defined NAN && defined INFINITYextern const double NaN = NAN;extern const double Inf = INFINITY;#else // !(defined NAN && defined INFINITY)// The trick is to define the NaN and Inf globals with a different type than the declaration.// This trick works because the mangled name of the globals does not include the type, although// I'm not sure that's guaranteed. There could be alignment issues with this, since arrays of// characters don't necessarily need the same alignment doubles do, but for now it seems to work.// It would be good to figure out a 100% clean way that still avoids code that runs at init time.// Note, we have to use union to ensure alignment. Otherwise, NaN_Bytes can start anywhere,// while NaN_double has to be 4-byte aligned for 32-bits.// With -fstrict-aliasing enabled, unions are the only safe way to do type masquerading.static const union {    struct {        unsigned char NaN_Bytes[8];        unsigned char Inf_Bytes[8];    } bytes;        struct {        double NaN_Double;        double Inf_Double;    } doubles;    } NaNInf = { {#if PLATFORM(BIG_ENDIAN)    { 0x7f, 0xf8, 0, 0, 0, 0, 0, 0 },    { 0x7f, 0xf0, 0, 0, 0, 0, 0, 0 }#elif PLATFORM(MIDDLE_ENDIAN)    { 0, 0, 0xf8, 0x7f, 0, 0, 0, 0 },    { 0, 0, 0xf0, 0x7f, 0, 0, 0, 0 }#else    { 0, 0, 0, 0, 0, 0, 0xf8, 0x7f },    { 0, 0, 0, 0, 0, 0, 0xf0, 0x7f }#endif} } ;extern const double NaN = NaNInf.doubles.NaN_Double;extern const double Inf = NaNInf.doubles.Inf_Double; #endif // !(defined NAN && defined INFINITY)void* JSCell::operator new(size_t size, ExecState* exec){#ifdef JAVASCRIPTCORE_BUILDING_ALL_IN_ONE_FILE    return exec->heap()->inlineAllocate(size);#else    return exec->heap()->allocate(size);#endif}bool JSCell::getUInt32(uint32_t&) const{    return false;}bool JSCell::getTruncatedInt32(int32_t&) const{    return false;}bool JSCell::getTruncatedUInt32(uint32_t&) const{    return false;}bool JSCell::getString(UString&stringValue) const{    if (!isString())        return false;    stringValue = static_cast<const JSString*>(this)->value();    return true;}UString JSCell::getString() const{    return isString() ? static_cast<const JSString*>(this)->value() : UString();}JSObject* JSCell::getObject(){    return isObject() ? static_cast<JSObject*>(this) : 0;}const JSObject* JSCell::getObject() const{    return isObject() ? static_cast<const JSObject*>(this) : 0;}CallType JSCell::getCallData(CallData&){    return CallTypeNone;}ConstructType JSCell::getConstructData(ConstructData&){    return ConstructTypeNone;}bool JSCell::getOwnPropertySlot(ExecState* exec, const Identifier& identifier, PropertySlot& slot){    // This is not a general purpose implementation of getOwnPropertySlot.    // It should only be called by JSValue::get.    // It calls getPropertySlot, not getOwnPropertySlot.    JSObject* object = toObject(exec);    slot.setBase(object);    if (!object->getPropertySlot(exec, identifier, slot))        slot.setUndefined();    return true;}bool JSCell::getOwnPropertySlot(ExecState* exec, unsigned identifier, PropertySlot& slot){    // This is not a general purpose implementation of getOwnPropertySlot.    // It should only be called by JSValue::get.    // It calls getPropertySlot, not getOwnPropertySlot.    JSObject* object = toObject(exec);    slot.setBase(object);    if (!object->getPropertySlot(exec, identifier, slot))        slot.setUndefined();    return true;}void JSCell::put(ExecState* exec, const Identifier& identifier, JSValuePtr value, PutPropertySlot& slot){    toObject(exec)->put(exec, identifier, value, slot);}void JSCell::put(ExecState* exec, unsigned identifier, JSValuePtr value){    toObject(exec)->put(exec, identifier, value);}bool JSCell::deleteProperty(ExecState* exec, const Identifier& identifier){    return toObject(exec)->deleteProperty(exec, identifier);}bool JSCell::deleteProperty(ExecState* exec, unsigned identifier){    return toObject(exec)->deleteProperty(exec, identifier);}JSObject* JSCell::toThisObject(ExecState* exec) const{    return toObject(exec);}UString JSCell::toThisString(ExecState* exec) const{    return toThisObject(exec)->toString(exec);}JSString* JSCell::toThisJSString(ExecState* exec){    return jsString(exec, toThisString(exec));}const ClassInfo* JSCell::classInfo() const{    return 0;}JSValuePtr JSCell::getJSNumber(){    return noValue();}bool JSCell::isGetterSetter() const{    return false;}} // namespace JSC

⌨️ 快捷键说明

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