Changeset 37257 in webkit for trunk/JavaScriptCore/kjs/JSString.h


Ignore:
Timestamp:
Oct 3, 2008, 2:39:16 PM (17 years ago)
Author:
Darin Adler
Message:

JavaScriptCore:

2008-10-03 Darin Adler <Darin Adler>

Reviewed by Geoff Garen.

Remove m_globalObject and m_globalData from ExecState.

SunSpider says this is a wash (slightly faster but not statistically
significant); which is good enough since it's a preparation step and
not supposed to be a spedup.

  • API/JSCallbackFunction.cpp: (JSC::JSCallbackFunction::JSCallbackFunction):
  • kjs/ArrayConstructor.cpp: (JSC::ArrayConstructor::ArrayConstructor):
  • kjs/BooleanConstructor.cpp: (JSC::BooleanConstructor::BooleanConstructor):
  • kjs/DateConstructor.cpp: (JSC::DateConstructor::DateConstructor):
  • kjs/ErrorConstructor.cpp: (JSC::ErrorConstructor::ErrorConstructor):
  • kjs/FunctionPrototype.cpp: (JSC::FunctionPrototype::FunctionPrototype):
  • kjs/JSFunction.cpp: (JSC::JSFunction::JSFunction):
  • kjs/NativeErrorConstructor.cpp: (JSC::NativeErrorConstructor::NativeErrorConstructor):
  • kjs/NumberConstructor.cpp: (JSC::NumberConstructor::NumberConstructor):
  • kjs/ObjectConstructor.cpp: (JSC::ObjectConstructor::ObjectConstructor):
  • kjs/PrototypeFunction.cpp: (JSC::PrototypeFunction::PrototypeFunction):
  • kjs/RegExpConstructor.cpp: (JSC::RegExpConstructor::RegExpConstructor):
  • kjs/StringConstructor.cpp: (JSC::StringConstructor::StringConstructor): Pass JSGlobalData* instead of ExecState* to the InternalFunction constructor.
  • API/OpaqueJSString.cpp: Added now-needed include.
  • VM/CTI.cpp: (JSC::CTI::emitSlowScriptCheck): Changed to use ARGS_globalData instead of ARGS_exec.
  • VM/CTI.h: Added a new argument to the CTI, the global data pointer. While it's possible to get to the global data pointer using the ExecState pointer, it's slow enough that it's better to just keep it around in the CTI arguments.
  • VM/CodeBlock.h: Moved the CodeType enum here from ExecState.h.
  • VM/Machine.cpp: (JSC::Machine::execute): Pass fewer arguments when constructing ExecState, and pass the global data pointer when invoking CTI. (JSC::Machine::firstCallFrame): Added. Used to get the dynamic global object, which is in the scope chain of the first call frame. (JSC::Machine::cti_op_add): Use globalData instead of exec when possible, to keep fast cases fast, since it's now more expensive to get to it through the exec pointer. (JSC::Machine::cti_timeout_check): Ditto. (JSC::Machine::cti_op_put_by_id_second): Ditto. (JSC::Machine::cti_op_get_by_id_second): Ditto. (JSC::Machine::cti_op_mul): Ditto. (JSC::Machine::cti_vm_compile): Ditto. (JSC::Machine::cti_op_get_by_val): Ditto. (JSC::Machine::cti_op_sub): Ditto. (JSC::Machine::cti_op_put_by_val): Ditto. (JSC::Machine::cti_op_put_by_val_array): Ditto. (JSC::Machine::cti_op_negate): Ditto. (JSC::Machine::cti_op_div): Ditto. (JSC::Machine::cti_op_pre_dec): Ditto. (JSC::Machine::cti_op_post_inc): Ditto. (JSC::Machine::cti_op_lshift): Ditto. (JSC::Machine::cti_op_bitand): Ditto. (JSC::Machine::cti_op_rshift): Ditto. (JSC::Machine::cti_op_bitnot): Ditto. (JSC::Machine::cti_op_mod): Ditto. (JSC::Machine::cti_op_post_dec): Ditto. (JSC::Machine::cti_op_urshift): Ditto. (JSC::Machine::cti_op_bitxor): Ditto. (JSC::Machine::cti_op_bitor): Ditto. (JSC::Machine::cti_op_call_eval): Ditto. (JSC::Machine::cti_op_throw): Ditto. (JSC::Machine::cti_op_is_string): Ditto. (JSC::Machine::cti_op_debug): Ditto. (JSC::Machine::cti_vm_throw): Ditto.
  • VM/Machine.h: Added firstCallFrame.
  • kjs/DebuggerCallFrame.cpp: (JSC::DebuggerCallFrame::evaluate): Pass fewer arguments when constructing ExecState.
  • kjs/ExecState.cpp: Deleted contents. Later we'll remove the file altogether.
  • kjs/ExecState.h: Removed m_globalObject and m_globalData. Moved CodeType into another header. (JSC::ExecState::ExecState): Take only a single argument, a call frame pointer. (JSC::ExecState::dynamicGlobalObject): Get the object from the first call frame since it's no longer stored. (JSC::ExecState::globalData): Get the global data from the scope chain, since we no longer store a pointer to it here. (JSC::ExecState::identifierTable): Ditto. (JSC::ExecState::propertyNames): Ditto. (JSC::ExecState::emptyList): Ditto. (JSC::ExecState::lexer): Ditto. (JSC::ExecState::parser): Ditto. (JSC::ExecState::machine): Ditto. (JSC::ExecState::arrayTable): Ditto. (JSC::ExecState::dateTable): Ditto. (JSC::ExecState::mathTable): Ditto. (JSC::ExecState::numberTable): Ditto. (JSC::ExecState::regExpTable): Ditto. (JSC::ExecState::regExpConstructorTable): Ditto. (JSC::ExecState::stringTable): Ditto. (JSC::ExecState::heap): Ditto.
  • kjs/FunctionConstructor.cpp: (JSC::FunctionConstructor::FunctionConstructor): Pass JSGlobalData* instead of ExecState* to the InternalFunction constructor. (JSC::constructFunction): Pass the global data pointer when constructing a new scope chain.
  • kjs/InternalFunction.cpp: (JSC::InternalFunction::InternalFunction): Take a JSGlobalData* instead of an ExecState*. Later we can change more places to work this way -- it's more efficient to take the type you need since the caller might already have it.
  • kjs/InternalFunction.h: Ditto.
  • kjs/JSCell.h: (JSC::JSCell::operator new): Added an overload that takes a JSGlobalData* so you can construct without an ExecState*.
  • kjs/JSGlobalObject.cpp: (JSC::JSGlobalObject::init): Moved creation of the global scope chain in here, since it now requires a pointer to the global data. Moved the initialization of the call frame in here since it requires the global scope chain node. Removed the extra argument to ExecState when creating the global ExecState*.
  • kjs/JSGlobalObject.h: Removed initialization of globalScopeChain and the call frame from the JSGlobalObjectData constructor. Added a thisValue argument to the init function.
  • kjs/JSNumberCell.cpp: Added versions of jsNumberCell that take JSGlobalData* rather than ExecState*.
  • kjs/JSNumberCell.h: (JSC::JSNumberCell::operator new): Added a version that takes JSGlobalData*. (JSC::JSNumberCell::JSNumberCell): Ditto. (JSC::jsNumber): Ditto.
  • kjs/JSString.cpp: (JSC::jsString): Ditto. (JSC::jsSubstring): Ditto. (JSC::jsOwnedString): Ditto.
  • kjs/JSString.h: (JSC::JSString::JSString): Changed to take JSGlobalData*. (JSC::jsEmptyString): Added a version that takes JSGlobalData*. (JSC::jsSingleCharacterString): Ditto. (JSC::jsSingleCharacterSubstring): Ditto. (JSC::jsNontrivialString): Ditto. (JSC::JSString::getIndex): Ditto. (JSC::jsString): Ditto. (JSC::jsSubstring): Ditto. (JSC::jsOwnedString): Ditto.
  • kjs/ScopeChain.h: Added a globalData pointer to each node. (JSC::ScopeChainNode::ScopeChainNode): Initialize the globalData pointer. (JSC::ScopeChainNode::push): Set the global data pointer in the new node. (JSC::ScopeChain::ScopeChain): Take a globalData argument.
  • kjs/SmallStrings.cpp: (JSC::SmallStrings::createEmptyString): Take JSGlobalData* instead of ExecState*. (JSC::SmallStrings::createSingleCharacterString): Ditto.
  • kjs/SmallStrings.h: (JSC::SmallStrings::emptyString): Ditto. (JSC::SmallStrings::singleCharacterString): Ditto.

WebCore:

2008-10-03 Darin Adler <Darin Adler>

Reviewed by Geoff Garen.

Remove m_globalObject and m_globalData from ExecState.

  • bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::JSDOMWindowBaseData::JSDOMWindowBaseData): Removed an argument now that JSGlobalObject doesn't need it any more. (WebCore::JSDOMWindowBase::JSDOMWindowBase): Removed the argument from the JSDOMWindowBaseData constructor, and added the this argument to the JSGlobalObject constructor. This is because a couple key bits of initialization moved from the data constructor to the JSGlobalObject constructor.
  • bindings/js/JSDOMWindowBase.h: Ditto.
  • bridge/qt/qt_runtime.cpp: (JSC::Bindings::QtRuntimeMethod::QtRuntimeMethod):
  • bridge/runtime_method.cpp: (JSC::RuntimeMethod::RuntimeMethod): Pass JSGlobalData* instead of ExecState* to the InternalFunction constructor.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/JSString.h

    r36755 r37257  
    3434    class JSString;
    3535
     36    JSString* jsEmptyString(JSGlobalData*);
    3637    JSString* jsEmptyString(ExecState*);
     38    JSString* jsString(JSGlobalData*, const UString&); // returns empty string if passed null string
    3739    JSString* jsString(ExecState*, const UString&); // returns empty string if passed null string
    3840
     41    JSString* jsSingleCharacterString(JSGlobalData*, UChar);
    3942    JSString* jsSingleCharacterString(ExecState*, UChar);
     43    JSString* jsSingleCharacterSubstring(JSGlobalData*, const UString&, unsigned offset);
    4044    JSString* jsSingleCharacterSubstring(ExecState*, const UString&, unsigned offset);
     45    JSString* jsSubstring(JSGlobalData*, const UString&, unsigned offset, unsigned length);
    4146    JSString* jsSubstring(ExecState*, const UString&, unsigned offset, unsigned length);
    4247
    4348    // Non-trivial strings are two or more characters long.
    4449    // These functions are faster than just calling jsString.
     50    JSString* jsNontrivialString(JSGlobalData*, const UString&);
    4551    JSString* jsNontrivialString(ExecState*, const UString&);
     52    JSString* jsNontrivialString(JSGlobalData*, const char*);
    4653    JSString* jsNontrivialString(ExecState*, const char*);
    4754
     
    4956    // likely outlive the JSValue this makes, such as the parse tree or a
    5057    // DOM object that contains a UString
     58    JSString* jsOwnedString(JSGlobalData*, const UString&);
    5159    JSString* jsOwnedString(ExecState*, const UString&);
    5260
     
    5664
    5765    public:
    58         JSString(ExecState* exec, const UString& value)
    59             : JSCell(exec->globalData().stringStructureID.get())
     66        JSString(JSGlobalData* globalData, const UString& value)
     67            : JSCell(globalData->stringStructureID.get())
    6068            , m_value(value)
    6169        {
     
    6472
    6573        enum HasOtherOwnerType { HasOtherOwner };
    66         JSString(ExecState* exec, const UString& value, HasOtherOwnerType)
    67             : JSCell(exec->globalData().stringStructureID.get())
     74        JSString(JSGlobalData* globalData, const UString& value, HasOtherOwnerType)
     75            : JSCell(globalData->stringStructureID.get())
    6876            , m_value(value)
    6977        {
    7078        }
    71         JSString(ExecState* exec, PassRefPtr<UString::Rep> value, HasOtherOwnerType)
    72             : JSCell(exec->globalData().stringStructureID.get())
     79        JSString(JSGlobalData* globalData, PassRefPtr<UString::Rep> value, HasOtherOwnerType)
     80            : JSCell(globalData->stringStructureID.get())
    7381            , m_value(value)
    7482        {
     
    8189
    8290        bool canGetIndex(unsigned i) { return i < static_cast<unsigned>(m_value.size()); }
    83         JSString* getIndex(ExecState*, unsigned);
     91        JSString* getIndex(JSGlobalData*, unsigned);
    8492
    8593        static PassRefPtr<StructureID> createStructureID(JSValue* proto) { return StructureID::create(proto, TypeInfo(StringType)); }
     
    110118    };
    111119
    112     inline JSString* jsEmptyString(ExecState* exec)
    113     {
    114         return exec->globalData().smallStrings.emptyString(exec);
    115     }
    116 
    117     inline JSString* jsSingleCharacterString(ExecState* exec, UChar c)
     120    inline JSString* jsEmptyString(JSGlobalData* globalData)
     121    {
     122        return globalData->smallStrings.emptyString(globalData);
     123    }
     124
     125    inline JSString* jsSingleCharacterString(JSGlobalData* globalData, UChar c)
    118126    {
    119127        if (c <= 0xFF)
    120             return exec->globalData().smallStrings.singleCharacterString(exec, c);
    121         return new (exec) JSString(exec, UString(&c, 1));
    122     }
    123 
    124     inline JSString* jsSingleCharacterSubstring(ExecState* exec, const UString& s, unsigned offset)
     128            return globalData->smallStrings.singleCharacterString(globalData, c);
     129        return new (globalData) JSString(globalData, UString(&c, 1));
     130    }
     131
     132    inline JSString* jsSingleCharacterSubstring(JSGlobalData* globalData, const UString& s, unsigned offset)
    125133    {
    126134        ASSERT(offset < static_cast<unsigned>(s.size()));
    127135        UChar c = s.data()[offset];
    128136        if (c <= 0xFF)
    129             return exec->globalData().smallStrings.singleCharacterString(exec, c);
    130         return new (exec) JSString(exec, UString::Rep::create(s.rep(), offset, 1));
    131     }
    132 
    133     inline JSString* jsNontrivialString(ExecState* exec, const char* s)
     137            return globalData->smallStrings.singleCharacterString(globalData, c);
     138        return new (globalData) JSString(globalData, UString::Rep::create(s.rep(), offset, 1));
     139    }
     140
     141    inline JSString* jsNontrivialString(JSGlobalData* globalData, const char* s)
    134142    {
    135143        ASSERT(s);
    136144        ASSERT(s[0]);
    137145        ASSERT(s[1]);
    138         return new (exec) JSString(exec, s);
    139     }
    140 
    141     inline JSString* jsNontrivialString(ExecState* exec, const UString& s)
     146        return new (globalData) JSString(globalData, s);
     147    }
     148
     149    inline JSString* jsNontrivialString(JSGlobalData* globalData, const UString& s)
    142150    {
    143151        ASSERT(s.size() > 1);
    144         return new (exec) JSString(exec, s);
    145     }
    146 
    147     inline JSString* JSString::getIndex(ExecState* exec, unsigned i)
     152        return new (globalData) JSString(globalData, s);
     153    }
     154
     155    inline JSString* JSString::getIndex(JSGlobalData* globalData, unsigned i)
    148156    {
    149157        ASSERT(canGetIndex(i));
    150         return jsSingleCharacterSubstring(exec, m_value, i);
    151     }
     158        return jsSingleCharacterSubstring(globalData, m_value, i);
     159    }
     160
     161    inline JSString* jsEmptyString(ExecState* exec) { return jsEmptyString(&exec->globalData()); }
     162    inline JSString* jsString(ExecState* exec, const UString& s) { return jsString(&exec->globalData(), s); }
     163    inline JSString* jsSingleCharacterString(ExecState* exec, UChar c) { return jsSingleCharacterString(&exec->globalData(), c); }
     164    inline JSString* jsSingleCharacterSubstring(ExecState* exec, const UString& s, unsigned offset) { return jsSingleCharacterSubstring(&exec->globalData(), s, offset); }
     165    inline JSString* jsSubstring(ExecState* exec, const UString& s, unsigned offset, unsigned length) { return jsSubstring(&exec->globalData(), s, offset, length); }
     166    inline JSString* jsNontrivialString(ExecState* exec, const UString& s) { return jsNontrivialString(&exec->globalData(), s); }
     167    inline JSString* jsNontrivialString(ExecState* exec, const char* s) { return jsNontrivialString(&exec->globalData(), s); }
     168    inline JSString* jsOwnedString(ExecState* exec, const UString& s) { return jsOwnedString(&exec->globalData(), s); }
    152169
    153170    ALWAYS_INLINE bool JSString::getStringPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
Note: See TracChangeset for help on using the changeset viewer.