Changeset 15846 in webkit for trunk/JavaScriptCore/kjs/object.h


Ignore:
Timestamp:
Aug 13, 2006, 8:06:14 PM (19 years ago)
Author:
mjs
Message:

JavaScriptCore:

Reviewed (and tweaked a little) by Maciej.


  • shrank the size of JSObject by 8 bytes and made the corresponding reduction to the cell size, resulting in a 1.2% speed improvement on JS iBench (and probably overall memory savings).

This was done by removing _scope and _internalValue data members
from JSObject and moving them only to the subclasses that actually
make use of them.


  • kjs/object.cpp: (KJS::JSObject::mark): No need to mark scope or internal value here.
  • kjs/object.h: (KJS::JSObject::JSObject): Don't initialize them.
  • kjs/JSWrapperObject.cpp: Added. New base class for object types that wrap primitive values (Number, String, Boolean, Date). (KJS::JSWrapperObject::mark):
  • kjs/JSWrapperObject.h: Added. (KJS::JSWrapperObject::JSWrapperObject): (KJS::JSWrapperObject::internalValue): (KJS::JSWrapperObject::setInternalValue):
  • kjs/array_object.cpp: (ArrayPrototype::ArrayPrototype): Don't set useless internal value.
  • kjs/bool_object.cpp: (BooleanInstance::BooleanInstance): Inherit from JSWrapperObject. (BooleanProtoFunc::callAsFunction): Fixed to account for fact that not all JSObjects have an internal value. (BooleanObjectImp::construct): ditto.
  • kjs/bool_object.h:
  • kjs/collector.cpp: Lowered cell size to 48. (KJS::Collector::allocate): meaningless whitespace change
  • kjs/date_object.cpp: (KJS::DateInstance::DateInstance): Inherit from JSWrapperObject. (KJS::DateProtoFunc::callAsFunction): adjusted for move of internalValue (KJS::DateObjectImp::construct): ditto
  • kjs/date_object.h:
  • kjs/error_object.cpp: (ErrorPrototype::ErrorPrototype): don't set internal value
  • kjs/function.cpp: move _scope and related handling here (KJS::FunctionImp::mark): mark scope
  • kjs/function.h: (KJS::FunctionImp::scope): moved here from JSObject (KJS::FunctionImp::setScope): ditto
  • kjs/number_object.cpp: (NumberInstance::NumberInstance): inherit from JSWrapperObject (NumberProtoFunc::callAsFunction): adjusted (NumberObjectImp::construct): adjusted
  • kjs/number_object.h: shring RegExp-related objects a little
  • kjs/regexp_object.cpp: (RegExpPrototype::RegExpPrototype): Adjust for size tweaks (RegExpObjectImp::RegExpObjectImp): ditto
  • kjs/regexp_object.h:
  • kjs/string_object.cpp: (StringInstance::StringInstance): inherit from JSWrapperObject (StringProtoFunc::callAsFunction): adjusted
  • kjs/string_object.h:
  • JavaScriptCore.exp: Exported new methods as needed.
  • JavaScriptCore.xcodeproj/project.pbxproj: Added new files to build.

WebCore:

Reviewed (and tweaked a little) by Maciej.


  • shrank the size of JSObject by 8 bytes and made the corresponding reduction to the cell size, resulting in a 1.2% speed improvement on JS iBench (and probably overall memory savings).

The WebCore part of this is to expect only FunctionImp to have a scope, not all JSObjects.


  • bindings/js/kjs_events.cpp: (KJS::JSLazyEventListener::parseCode):
File:
1 edited

Legend:

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

    r15557 r15846  
    413413    virtual bool hasInstance(ExecState *exec, JSValue *value);
    414414
    415     /**
    416      * Returns the scope of this object. This is used when execution declared
    417      * functions - the execution context for the function is initialized with
    418      * extra object in it's scope. An example of this is functions declared
    419      * inside other functions:
    420      *
    421      * \code
    422      * function f() {
    423      *
    424      *   function b() {
    425      *     return prototype;
    426      *   }
    427      *
    428      *   var x = 4;
    429      *   // do some stuff
    430      * }
    431      * f.prototype = new String();
    432      * \endcode
    433      *
    434      * When the function f.b is executed, its scope will include properties of
    435      * f. So in the example above the return value of f.b() would be the new
    436      * String object that was assigned to f.prototype.
    437      *
    438      * @param exec The current execution state
    439      * @return The function's scope
    440      */
    441     const ScopeChain &scope() const { return _scope; }
    442     void setScope(const ScopeChain &s) { _scope = s; }
    443 
    444415    virtual void getPropertyNames(ExecState*, PropertyNameArray&);
    445 
    446     /**
    447      * Returns the internal value of the object. This is used for objects such
    448      * as String and Boolean which are wrappers for native types. The interal
    449      * value is the actual value represented by the wrapper objects.
    450      *
    451      * @see ECMA 8.6.2
    452      * @return The internal value of the object
    453      */
    454     JSValue *internalValue() const;
    455 
    456     /**
    457      * Sets the internal value of the object
    458      *
    459      * @see internalValue()
    460      *
    461      * @param v The new internal value
    462      */
    463     void setInternalValue(JSValue *v);
    464416
    465417    virtual JSValue *toPrimitive(ExecState *exec, JSType preferredType = UnspecifiedType) const;
     
    508460    const HashEntry* findPropertyHashEntry( const Identifier& propertyName ) const;
    509461    JSValue *_proto;
    510     JSValue *_internalValue;
    511     ScopeChain _scope;
    512462  };
    513463
     
    556506    : JSCell(destructorIsThreadSafe)
    557507    , _proto(proto)
    558     , _internalValue(0)
    559508{
    560509    assert(proto);
     
    564513    : JSCell(destructorIsThreadSafe)
    565514    , _proto(jsNull())
    566     , _internalValue(0)
    567 {
    568 }
    569 
    570 inline JSValue *JSObject::internalValue() const
    571 {
    572     return _internalValue;
    573 }
    574 
    575 inline void JSObject::setInternalValue(JSValue *v)
    576 {
    577     _internalValue = v;
     515{
    578516}
    579517
     
    647585    return false;
    648586}
     587
    649588
    650589// FIXME: Put this function in a separate file named something like scope_chain_mark.h -- can't put it in scope_chain.h since it depends on JSObject.
Note: See TracChangeset for help on using the changeset viewer.