Changeset 15846 in webkit for trunk/JavaScriptCore/kjs/function.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/function.h

    r15526 r15846  
    6262    RefPtr<FunctionBodyNode> body;
    6363
     64    /**
     65     * Returns the scope of this object. This is used when execution declared
     66     * functions - the execution context for the function is initialized with
     67     * extra object in it's scope. An example of this is functions declared
     68     * inside other functions:
     69     *
     70     * \code
     71     * function f() {
     72     *
     73     *   function b() {
     74     *     return prototype;
     75     *   }
     76     *
     77     *   var x = 4;
     78     *   // do some stuff
     79     * }
     80     * f.prototype = new String();
     81     * \endcode
     82     *
     83     * When the function f.b is executed, its scope will include properties of
     84     * f. So in the example above the return value of f.b() would be the new
     85     * String object that was assigned to f.prototype.
     86     *
     87     * @param exec The current execution state
     88     * @return The function's scope
     89     */
     90    const ScopeChain &scope() const { return _scope; }
     91    void setScope(const ScopeChain &s) { _scope = s; }
     92
     93    virtual void mark();
    6494  protected:
    6595    OwnPtr<Parameter> param;
    6696
    6797  private:
     98    ScopeChain _scope;
     99
    68100    static JSValue *argumentsGetter(ExecState *, JSObject *, const Identifier &, const PropertySlot&);
    69101    static JSValue *lengthGetter(ExecState *, JSObject *, const Identifier &, const PropertySlot&);
Note: See TracChangeset for help on using the changeset viewer.