Ignore:
Timestamp:
Oct 20, 2008, 2:27:44 PM (17 years ago)
Author:
[email protected]
Message:

2008-10-16 Sam Weinig <[email protected]>

Reviewed by Cameron Zwarich.

Fix for https://bugs.webkit.org/show_bug.cgi?id=21683
Don't create intermediate StructureIDs for builtin objects

Second stage in reduce number of StructureIDs created when initializing the
JSGlobalObject.

  • Use putDirectWithoutTransition for the remaining singleton objects to reduce the number of StructureIDs create for about:blank from 132 to 73.
  • kjs/ArrayConstructor.cpp: (JSC::ArrayConstructor::ArrayConstructor):
  • kjs/BooleanConstructor.cpp: (JSC::BooleanConstructor::BooleanConstructor):
  • kjs/BooleanPrototype.cpp: (JSC::BooleanPrototype::BooleanPrototype):
  • kjs/DateConstructor.cpp: (JSC::DateConstructor::DateConstructor):
  • kjs/ErrorConstructor.cpp: (JSC::ErrorConstructor::ErrorConstructor):
  • kjs/ErrorPrototype.cpp: (JSC::ErrorPrototype::ErrorPrototype):
  • kjs/FunctionConstructor.cpp: (JSC::FunctionConstructor::FunctionConstructor):
  • kjs/FunctionPrototype.cpp: (JSC::FunctionPrototype::FunctionPrototype): (JSC::FunctionPrototype::addFunctionProperties):
  • kjs/FunctionPrototype.h: (JSC::FunctionPrototype::createStructureID):
  • kjs/InternalFunction.cpp:
  • kjs/InternalFunction.h: (JSC::InternalFunction::InternalFunction):
  • kjs/JSGlobalObject.cpp: (JSC::JSGlobalObject::reset):
  • kjs/JSObject.h:
  • kjs/MathObject.cpp: (JSC::MathObject::MathObject):
  • kjs/NumberConstructor.cpp: (JSC::NumberConstructor::NumberConstructor):
  • kjs/NumberPrototype.cpp: (JSC::NumberPrototype::NumberPrototype):
  • kjs/ObjectConstructor.cpp: (JSC::ObjectConstructor::ObjectConstructor):
  • kjs/RegExpConstructor.cpp: (JSC::RegExpConstructor::RegExpConstructor):
  • kjs/RegExpPrototype.cpp: (JSC::RegExpPrototype::RegExpPrototype):
  • kjs/StringConstructor.cpp: (JSC::StringConstructor::StringConstructor):
  • kjs/StringPrototype.cpp: (JSC::StringPrototype::StringPrototype):
  • kjs/StructureID.cpp: (JSC::StructureID::dumpStatistics):
  • kjs/StructureID.h: (JSC::StructureID::setPrototypeWithoutTransition):
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/JSGlobalObject.cpp

    r37684 r37747  
    201201    // Prototypes
    202202
    203     d()->functionPrototype = new (exec) FunctionPrototype(exec);
     203    d()->functionPrototype = new (exec) FunctionPrototype(exec, FunctionPrototype::createStructureID(jsNull())); // The real prototype will be set once ObjectPrototype is created.
     204    d()->prototypeFunctionStructure = PrototypeFunction::createStructureID(d()->functionPrototype);
     205    d()->functionPrototype->addFunctionProperties(exec, d()->prototypeFunctionStructure.get());
     206    d()->objectPrototype = new (exec) ObjectPrototype(exec, ObjectPrototype::createStructureID(jsNull()), d()->prototypeFunctionStructure.get());
     207    d()->functionPrototype->structureID()->setPrototypeWithoutTransition(d()->objectPrototype);
     208
     209    d()->emptyObjectStructure = d()->objectPrototype->inheritorID();
     210
    204211    d()->functionStructure = JSFunction::createStructureID(d()->functionPrototype);
    205212    d()->callbackFunctionStructure = JSCallbackFunction::createStructureID(d()->functionPrototype);
    206     d()->prototypeFunctionStructure = PrototypeFunction::createStructureID(d()->functionPrototype);
    207     d()->functionPrototype->addFunctionProperties(exec, d()->prototypeFunctionStructure.get());
    208 
    209     d()->objectPrototype = new (exec) ObjectPrototype(exec, ObjectPrototype::createStructureID(jsNull()), d()->prototypeFunctionStructure.get());
    210     d()->emptyObjectStructure = d()->objectPrototype->inheritorID();
    211     d()->functionPrototype->setPrototype(d()->objectPrototype);
    212213    d()->argumentsStructure = Arguments::createStructureID(d()->objectPrototype);
    213214    d()->callbackConstructorStructure = JSCallbackConstructor::createStructureID(d()->objectPrototype);
    214215    d()->callbackObjectStructure = JSCallbackObject<JSObject>::createStructureID(d()->objectPrototype);
     216
    215217    d()->arrayPrototype = new (exec) ArrayPrototype(ArrayPrototype::createStructureID(d()->objectPrototype));
    216218    d()->arrayStructure = JSArray::createStructureID(d()->arrayPrototype);
    217219    d()->regExpMatchesArrayStructure = RegExpMatchesArray::createStructureID(d()->arrayPrototype);
     220
    218221    d()->stringPrototype = new (exec) StringPrototype(exec, StringPrototype::createStructureID(d()->objectPrototype));
    219222    d()->stringObjectStructure = StringObject::createStructureID(d()->stringPrototype);
     223
    220224    d()->booleanPrototype = new (exec) BooleanPrototype(exec, BooleanPrototype::createStructureID(d()->objectPrototype), d()->prototypeFunctionStructure.get());
    221225    d()->booleanObjectStructure = BooleanObject::createStructureID(d()->booleanPrototype);
     226
    222227    d()->numberPrototype = new (exec) NumberPrototype(exec, NumberPrototype::createStructureID(d()->objectPrototype), d()->prototypeFunctionStructure.get());
    223228    d()->numberObjectStructure = NumberObject::createStructureID(d()->numberPrototype);
     229
    224230    d()->datePrototype = new (exec) DatePrototype(exec, DatePrototype::createStructureID(d()->objectPrototype));
    225231    d()->dateStructure = DateInstance::createStructureID(d()->datePrototype);
     232
    226233    d()->regExpPrototype = new (exec) RegExpPrototype(exec, RegExpPrototype::createStructureID(d()->objectPrototype), d()->prototypeFunctionStructure.get());
    227234    d()->regExpStructure = RegExpObject::createStructureID(d()->regExpPrototype);
     235
    228236    ErrorPrototype* errorPrototype = new (exec) ErrorPrototype(exec, ErrorPrototype::createStructureID(d()->objectPrototype), d()->prototypeFunctionStructure.get());
    229237    d()->errorStructure = ErrorInstance::createStructureID(errorPrototype);
     
    261269    d()->URIErrorConstructor = new (exec) NativeErrorConstructor(exec, nativeErrorStructure, URIErrorPrototype);
    262270
    263     d()->functionPrototype->putDirect(exec->propertyNames().constructor, functionConstructor, DontEnum);
    264 
    265271    d()->objectPrototype->putDirectWithoutTransition(exec->propertyNames().constructor, objectConstructor, DontEnum);
    266 
    267     d()->functionPrototype->putDirect(exec->propertyNames().constructor, functionConstructor, DontEnum);
    268     d()->arrayPrototype->putDirect(exec->propertyNames().constructor, arrayConstructor, DontEnum);
    269     d()->booleanPrototype->putDirect(exec->propertyNames().constructor, booleanConstructor, DontEnum);
    270     d()->stringPrototype->putDirect(exec->propertyNames().constructor, stringConstructor, DontEnum);
    271     d()->numberPrototype->putDirect(exec->propertyNames().constructor, numberConstructor, DontEnum);
    272     d()->datePrototype->putDirect(exec->propertyNames().constructor, dateConstructor, DontEnum);
    273     d()->regExpPrototype->putDirect(exec->propertyNames().constructor, d()->regExpConstructor, DontEnum);
    274     errorPrototype->putDirect(exec->propertyNames().constructor, d()->errorConstructor, DontEnum);
     272    d()->functionPrototype->putDirectWithoutTransition(exec->propertyNames().constructor, functionConstructor, DontEnum);
     273    d()->arrayPrototype->putDirectWithoutTransition(exec->propertyNames().constructor, arrayConstructor, DontEnum);
     274    d()->booleanPrototype->putDirectWithoutTransition(exec->propertyNames().constructor, booleanConstructor, DontEnum);
     275    d()->stringPrototype->putDirectWithoutTransition(exec->propertyNames().constructor, stringConstructor, DontEnum);
     276    d()->numberPrototype->putDirectWithoutTransition(exec->propertyNames().constructor, numberConstructor, DontEnum);
     277    d()->datePrototype->putDirectWithoutTransition(exec->propertyNames().constructor, dateConstructor, DontEnum);
     278    d()->regExpPrototype->putDirectWithoutTransition(exec->propertyNames().constructor, d()->regExpConstructor, DontEnum);
     279    errorPrototype->putDirectWithoutTransition(exec->propertyNames().constructor, d()->errorConstructor, DontEnum);
     280
    275281    evalErrorPrototype->putDirect(exec->propertyNames().constructor, d()->evalErrorConstructor, DontEnum);
    276282    rangeErrorPrototype->putDirect(exec->propertyNames().constructor, d()->rangeErrorConstructor, DontEnum);
     
    284290    // FIXME: These properties could be handled by a static hash table.
    285291
    286     putDirect(Identifier(exec, "Object"), objectConstructor, DontEnum);
    287     putDirect(Identifier(exec, "Function"), functionConstructor, DontEnum);
    288     putDirect(Identifier(exec, "Array"), arrayConstructor, DontEnum);
    289     putDirect(Identifier(exec, "Boolean"), booleanConstructor, DontEnum);
    290     putDirect(Identifier(exec, "String"), stringConstructor, DontEnum);
    291     putDirect(Identifier(exec, "Number"), numberConstructor, DontEnum);
    292     putDirect(Identifier(exec, "Date"), dateConstructor, DontEnum);
    293     putDirect(Identifier(exec, "RegExp"), d()->regExpConstructor, DontEnum);
    294     putDirect(Identifier(exec, "Error"), d()->errorConstructor, DontEnum);
    295     putDirect(Identifier(exec, "EvalError"), d()->evalErrorConstructor);
    296     putDirect(Identifier(exec, "RangeError"), d()->rangeErrorConstructor);
    297     putDirect(Identifier(exec, "ReferenceError"), d()->referenceErrorConstructor);
    298     putDirect(Identifier(exec, "SyntaxError"), d()->syntaxErrorConstructor);
    299     putDirect(Identifier(exec, "TypeError"), d()->typeErrorConstructor);
    300     putDirect(Identifier(exec, "URIError"), d()->URIErrorConstructor);
     292    putDirectWithoutTransition(Identifier(exec, "Object"), objectConstructor, DontEnum);
     293    putDirectWithoutTransition(Identifier(exec, "Function"), functionConstructor, DontEnum);
     294    putDirectWithoutTransition(Identifier(exec, "Array"), arrayConstructor, DontEnum);
     295    putDirectWithoutTransition(Identifier(exec, "Boolean"), booleanConstructor, DontEnum);
     296    putDirectWithoutTransition(Identifier(exec, "String"), stringConstructor, DontEnum);
     297    putDirectWithoutTransition(Identifier(exec, "Number"), numberConstructor, DontEnum);
     298    putDirectWithoutTransition(Identifier(exec, "Date"), dateConstructor, DontEnum);
     299    putDirectWithoutTransition(Identifier(exec, "RegExp"), d()->regExpConstructor, DontEnum);
     300    putDirectWithoutTransition(Identifier(exec, "Error"), d()->errorConstructor, DontEnum);
     301    putDirectWithoutTransition(Identifier(exec, "EvalError"), d()->evalErrorConstructor);
     302    putDirectWithoutTransition(Identifier(exec, "RangeError"), d()->rangeErrorConstructor);
     303    putDirectWithoutTransition(Identifier(exec, "ReferenceError"), d()->referenceErrorConstructor);
     304    putDirectWithoutTransition(Identifier(exec, "SyntaxError"), d()->syntaxErrorConstructor);
     305    putDirectWithoutTransition(Identifier(exec, "TypeError"), d()->typeErrorConstructor);
     306    putDirectWithoutTransition(Identifier(exec, "URIError"), d()->URIErrorConstructor);
    301307
    302308    // Set global values.
     
    313319
    314320    d()->evalFunction = new (exec) GlobalEvalFunction(exec, GlobalEvalFunction::createStructureID(d()->functionPrototype), 1, exec->propertyNames().eval, globalFuncEval, this);
    315     putDirectFunction(exec, d()->evalFunction, DontEnum);
    316     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 2, Identifier(exec, "parseInt"), globalFuncParseInt), DontEnum);
    317     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "parseFloat"), globalFuncParseFloat), DontEnum);
    318     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "isNaN"), globalFuncIsNaN), DontEnum);
    319     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "isFinite"), globalFuncIsFinite), DontEnum);
    320     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "escape"), globalFuncEscape), DontEnum);
    321     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "unescape"), globalFuncUnescape), DontEnum);
    322     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "decodeURI"), globalFuncDecodeURI), DontEnum);
    323     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "decodeURIComponent"), globalFuncDecodeURIComponent), DontEnum);
    324     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "encodeURI"), globalFuncEncodeURI), DontEnum);
    325     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "encodeURIComponent"), globalFuncEncodeURIComponent), DontEnum);
     321    putDirectFunctionWithoutTransition(exec, d()->evalFunction, DontEnum);
     322    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 2, Identifier(exec, "parseInt"), globalFuncParseInt), DontEnum);
     323    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "parseFloat"), globalFuncParseFloat), DontEnum);
     324    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "isNaN"), globalFuncIsNaN), DontEnum);
     325    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "isFinite"), globalFuncIsFinite), DontEnum);
     326    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "escape"), globalFuncEscape), DontEnum);
     327    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "unescape"), globalFuncUnescape), DontEnum);
     328    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "decodeURI"), globalFuncDecodeURI), DontEnum);
     329    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "decodeURIComponent"), globalFuncDecodeURIComponent), DontEnum);
     330    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "encodeURI"), globalFuncEncodeURI), DontEnum);
     331    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "encodeURIComponent"), globalFuncEncodeURIComponent), DontEnum);
    326332#ifndef NDEBUG
    327     putDirectFunction(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "kjsprint"), globalFuncKJSPrint), DontEnum);
     333    putDirectFunctionWithoutTransition(exec, new (exec) PrototypeFunction(exec, d()->prototypeFunctionStructure.get(), 1, Identifier(exec, "kjsprint"), globalFuncKJSPrint), DontEnum);
    328334#endif
    329335
Note: See TracChangeset for help on using the changeset viewer.