-
weinig@apple.com authored
2008-09-01 Geoffrey Garen <ggaren@apple.com> Reviewed by Darin Adler. First cut at inline caching for access to vanilla JavaScript properties. SunSpider says 4% faster. Tests heavy on dictionary-like access have regressed a bit -- we have a lot of room to improve in this area, but this patch is over-ripe as-is. JSCells now have a StructureID that uniquely identifies their layout, and holds their prototype. JSValue::put takes a PropertySlot& argument, so it can fill in details about where it put a value, for the sake of caching. * VM/CodeGenerator.cpp: (KJS::CodeGenerator::CodeGenerator): Avoid calling removeDirect if we can, since it disables inline caching in the global object. This can probably improve in the future. * kjs/JSGlobalObject.cpp: Nixed reset(), since it complicates caching, and wasn't really necessary. * kjs/JSObject.cpp: Tweaked getter / setter behavior not to rely on the IsGetterSetter flag, since the flag was buggy. This is necessary in order to avoid accidentally accessing a getter / setter as a normal property. Also changed getter / setter creation to honor ReadOnly, matching Mozilla. * kjs/PropertyMap.cpp: Nixed clear(), since it complicates caching and isn't necessary. * kjs/Shell.cpp: Moved SamplingTool dumping outside the loop. This allows you to aggregate sampling of multiple files (or the same file repeatedly), which helped me track down regressions. * kjs/ustring.h: Moved IdentifierRepHash here to share it. WebCore: 2008-09-01 Geoffrey Garen <ggaren@apple.com> Reviewed by Darin Adler. First cut at inline caching for access to vanilla JavaScript properties. Updated for JavaScriptCore changes. Mostly mechanical addition of StructureIDs to WebCore classes, and PutPropertySlot& arguments to put functions. (WebCore::JSCSSStyleDeclaration::customPut): Be sure to play nice with inline caching for global properties, so global assignment can be optimized. * ForwardingHeaders/kjs/StructureID.h: Added. * bindings/js/JSDOMBinding.h: (WebCore::DOMObject::DOMObject): * bindings/js/JSDOMWindowBase.cpp: (WebCore::JSDOMWindowBase::put): * bindings/js/JSDOMWindowBase.h: * bindings/js/JSDOMWindowCustom.h: (WebCore::JSDOMWindow::customPut): * bindings/js/JSDOMWindowShell.cpp: (WebCore::JSDOMWindowShell::JSDOMWindowShell): (WebCore::JSDOMWindowShell::put): * bindings/js/JSDOMWindowShell.h: * bindings/js/JSEventTargetBase.h: (WebCore::JSEventTargetBase::put): * bindings/js/JSEventTargetNode.h: (WebCore::JSEventTargetNode::put): * bindings/js/JSHTMLAppletElementCustom.cpp: (WebCore::JSHTMLAppletElement::customPut): * bindings/js/JSHTMLEmbedElementCustom.cpp: (WebCore::JSHTMLEmbedElement::customPut): * bindings/js/JSHTMLInputElementBase.cpp: (WebCore::JSHTMLInputElementBase::put): * bindings/js/JSHTMLInputElementBase.h: * bindings/js/JSHTMLObjectElementCustom.cpp: (WebCore::JSHTMLObjectElement::customPut): * bindings/js/JSHistoryCustom.cpp: (WebCore::JSHistory::customPut): * bindings/js/JSInspectedObjectWrapper.cpp: (WebCore::JSInspectedObjectWrapper::wrap): (WebCore::JSInspectedObjectWrapper::JSInspectedObjectWrapper): * bindings/js/JSInspectedObjectWrapper.h: * bindings/js/JSInspectorCallbackWrapper.cpp: (WebCore::JSInspectorCallbackWrapper::wrap): (WebCore::JSInspectorCallbackWrapper::JSInspectorCallbackWrapper): * bindings/js/JSInspectorCallbackWrapper.h: * bindings/js/JSLocationCustom.cpp: (WebCore::JSLocation::customPut): * bindings/js/JSPluginElementFunctions.cpp: (WebCore::runtimeObjectCustomPut): * bindings/js/JSPluginElementFunctions.h: * bindings/js/JSQuarantinedObjectWrapper.cpp: (WebCore::JSQuarantinedObjectWrapper::JSQuarantinedObjectWrapper): (WebCore::JSQuarantinedObjectWrapper::put): * bindings/js/JSQuarantinedObjectWrapper.h: * bindings/js/JSStorageCustom.cpp: (WebCore::JSStorage::customPut): * bindings/objc/WebScriptObject.mm: (-[WebScriptObject setValue:forKey:]): * bindings/scripts/CodeGeneratorJS.pm: * bridge/NP_jsobject.cpp: (_NPN_SetProperty): * bridge/jni/jni_jsobject.mm: (JavaJSObject::setMember): * bridge/objc/objc_class.mm: (KJS::Bindings::ObjcClass::fallbackObject): * bridge/objc/objc_runtime.h: * bridge/objc/objc_runtime.mm: (ObjcFallbackObjectImp::ObjcFallbackObjectImp): (ObjcFallbackObjectImp::put): * bridge/runtime.cpp: (KJS::Bindings::Instance::createRuntimeObject): * bridge/runtime_array.cpp: (RuntimeArray::put): * bridge/runtime_array.h: * bridge/runtime_object.cpp: (RuntimeObjectImp::RuntimeObjectImp): (RuntimeObjectImp::put): * bridge/runtime_object.h: LayoutTests: 2008-09-01 Geoffrey Garen <ggaren@apple.com> Reviewed by Darin Adler. First cut at inline caching for access to vanilla JavaScript properties. Tests for things I broke along the way. * fast/dom/getter-on-window-object2-expected.txt: * fast/js/pic: Added. * fast/js/pic/cached-deleted-properties-expected.txt: Added. * fast/js/pic/cached-deleted-properties.html: Added. * fast/js/pic/cached-getter-dictionary-and-proto-expected.txt: Added. * fast/js/pic/cached-getter-dictionary-and-proto.html: Added. * fast/js/pic/cached-getter-setter-expected.txt: Added. * fast/js/pic/cached-getter-setter.html: Added. * fast/js/pic/cached-prototype-setter-expected.txt: Added. * fast/js/pic/cached-prototype-setter.html: Added. * fast/js/pic/cached-single-entry-transition-expected.txt: Added. * fast/js/pic/cached-single-entry-transition.html: Added. * fast/js/pic/get-empty-string-expected.txt: Added. * fast/js/pic/get-empty-string.html: Added. * fast/js/pic/get-set-proxy-object-expected.txt: Added. * fast/js/pic/get-set-proxy-object.html: Added. * fast/js/pic/rehash-poisons-structure-expected.txt: Added. * fast/js/pic/rehash-poisons-structure.html: Added. git-svn-id: http://svn.webkit.org/repository/webkit/trunk@36016 268f45cc-cd09-0410-ab3c-d52691b4dbfc
3412bb43