source: webkit/trunk/JavaScriptCore/kjs/RegExpObject.cpp@ 37048

Last change on this file since 37048 was 36977, checked in by [email protected], 17 years ago

JavaScriptCore:

2008-09-26 Sam Weinig <[email protected]>

Reviewed by Darin Adler.

Patch for https://bugs.webkit.org/show_bug.cgi?id=21152
Speedup static property get/put

Convert getting/setting static property values to use static functions
instead of storing an integer and switching in getValueProperty/putValueProperty.

  • kjs/JSObject.cpp: (JSC::JSObject::deleteProperty): (JSC::JSObject::getPropertyAttributes):
  • kjs/MathObject.cpp: (JSC::MathObject::getOwnPropertySlot):
  • kjs/NumberConstructor.cpp: (JSC::numberConstructorNaNValue): (JSC::numberConstructorNegInfinity): (JSC::numberConstructorPosInfinity): (JSC::numberConstructorMaxValue): (JSC::numberConstructorMinValue):
  • kjs/PropertySlot.h: (JSC::PropertySlot::):
  • kjs/RegExpConstructor.cpp: (JSC::regExpConstructorDollar1): (JSC::regExpConstructorDollar2): (JSC::regExpConstructorDollar3): (JSC::regExpConstructorDollar4): (JSC::regExpConstructorDollar5): (JSC::regExpConstructorDollar6): (JSC::regExpConstructorDollar7): (JSC::regExpConstructorDollar8): (JSC::regExpConstructorDollar9): (JSC::regExpConstructorInput): (JSC::regExpConstructorMultiline): (JSC::regExpConstructorLastMatch): (JSC::regExpConstructorLastParen): (JSC::regExpConstructorLeftContext): (JSC::regExpConstructorRightContext): (JSC::setRegExpConstructorInput): (JSC::setRegExpConstructorMultiline): (JSC::RegExpConstructor::setInput): (JSC::RegExpConstructor::setMultiline): (JSC::RegExpConstructor::multiline):
  • kjs/RegExpConstructor.h:
  • kjs/RegExpObject.cpp: (JSC::regExpObjectGlobal): (JSC::regExpObjectIgnoreCase): (JSC::regExpObjectMultiline): (JSC::regExpObjectSource): (JSC::regExpObjectLastIndex): (JSC::setRegExpObjectLastIndex):
  • kjs/RegExpObject.h: (JSC::RegExpObject::setLastIndex): (JSC::RegExpObject::lastIndex): (JSC::RegExpObject::RegExpObjectData::RegExpObjectData):
  • kjs/StructureID.cpp: (JSC::StructureID::getEnumerablePropertyNames):
  • kjs/create_hash_table:
  • kjs/lexer.cpp: (JSC::Lexer::lex):
  • kjs/lookup.cpp: (JSC::HashTable::createTable): (JSC::HashTable::deleteTable): (JSC::setUpStaticFunctionSlot):
  • kjs/lookup.h: (JSC::HashEntry::initialize): (JSC::HashEntry::setKey): (JSC::HashEntry::key): (JSC::HashEntry::attributes): (JSC::HashEntry::function): (JSC::HashEntry::functionLength): (JSC::HashEntry::propertyGetter): (JSC::HashEntry::propertyPutter): (JSC::HashEntry::lexerValue): (JSC::HashEntry::): (JSC::HashTable::entry): (JSC::getStaticPropertySlot): (JSC::getStaticValueSlot): (JSC::lookupPut):

WebCore:

2008-09-26 Sam Weinig <[email protected]>

Reviewed by Darin Adler.

Patch for https://bugs.webkit.org/show_bug.cgi?id=21152
Speedup static property get/put

  • DerivedSources.make:
  • GNUmakefile.am:
  • WebCore.pro:
  • WebCore.vcproj/WebCore.vcproj:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/JSDOMBinding.cpp:
  • bindings/js/JSDOMBinding.h:
  • bindings/js/JSDOMWindowBase.cpp: (WebCore::getDOMConstructor): (WebCore::jsDOMWindowBaseCrypto): (WebCore::jsDOMWindowBaseEvent): (WebCore::jsDOMWindowBaseImage): (WebCore::jsDOMWindowBaseMessageChannel): (WebCore::jsDOMWindowBaseOption): (WebCore::jsDOMWindowBaseXMLHttpRequest): (WebCore::jsDOMWindowBaseAudio): (WebCore::jsDOMWindowBaseXSLTProcessor): (WebCore::jsDOMWindowBaseOnabort): (WebCore::jsDOMWindowBaseOnblur): (WebCore::jsDOMWindowBaseOnchange): (WebCore::jsDOMWindowBaseOnclick): (WebCore::jsDOMWindowBaseOndblclick): (WebCore::jsDOMWindowBaseOnerror): (WebCore::jsDOMWindowBaseOnfocus): (WebCore::jsDOMWindowBaseOnkeydown): (WebCore::jsDOMWindowBaseOnkeypress): (WebCore::jsDOMWindowBaseOnkeyup): (WebCore::jsDOMWindowBaseOnload): (WebCore::jsDOMWindowBaseOnmousedown): (WebCore::jsDOMWindowBaseOnmousemove): (WebCore::jsDOMWindowBaseOnmouseout): (WebCore::jsDOMWindowBaseOnmouseover): (WebCore::jsDOMWindowBaseOnmouseup): (WebCore::jsDOMWindowBaseOnMouseWheel): (WebCore::jsDOMWindowBaseOnreset): (WebCore::jsDOMWindowBaseOnresize): (WebCore::jsDOMWindowBaseOnscroll): (WebCore::jsDOMWindowBaseOnsearch): (WebCore::jsDOMWindowBaseOnselect): (WebCore::jsDOMWindowBaseOnsubmit): (WebCore::jsDOMWindowBaseOnbeforeunload): (WebCore::jsDOMWindowBaseOnunload): (WebCore::jsDOMWindowBaseOnWebKitAnimationStart): (WebCore::jsDOMWindowBaseOnWebKitAnimationIteration): (WebCore::jsDOMWindowBaseOnWebKitAnimationEnd): (WebCore::jsDOMWindowBaseOnWebKitTransitionEnd): (WebCore::JSDOMWindowBase::getOwnPropertySlot): (WebCore::JSDOMWindowBase::put): (WebCore::setJSDOMWindowBaseOnabort): (WebCore::setJSDOMWindowBaseOnblur): (WebCore::setJSDOMWindowBaseOnchange): (WebCore::setJSDOMWindowBaseOnclick): (WebCore::setJSDOMWindowBaseOndblclick): (WebCore::setJSDOMWindowBaseOnerror): (WebCore::setJSDOMWindowBaseOnfocus): (WebCore::setJSDOMWindowBaseOnkeydown): (WebCore::setJSDOMWindowBaseOnkeypress): (WebCore::setJSDOMWindowBaseOnkeyup): (WebCore::setJSDOMWindowBaseOnload): (WebCore::setJSDOMWindowBaseOnmousedown): (WebCore::setJSDOMWindowBaseOnmousemove): (WebCore::setJSDOMWindowBaseOnmouseout): (WebCore::setJSDOMWindowBaseOnmouseover): (WebCore::setJSDOMWindowBaseOnmouseup): (WebCore::setJSDOMWindowBaseOnMouseWheel): (WebCore::setJSDOMWindowBaseOnreset): (WebCore::setJSDOMWindowBaseOnresize): (WebCore::setJSDOMWindowBaseOnscroll): (WebCore::setJSDOMWindowBaseOnsearch): (WebCore::setJSDOMWindowBaseOnselect): (WebCore::setJSDOMWindowBaseOnsubmit): (WebCore::setJSDOMWindowBaseOnbeforeunload): (WebCore::setJSDOMWindowBaseOnunload): (WebCore::setJSDOMWindowBaseOnWebKitAnimationStart): (WebCore::setJSDOMWindowBaseOnWebKitAnimationIteration): (WebCore::setJSDOMWindowBaseOnWebKitAnimationEnd): (WebCore::setJSDOMWindowBaseOnWebKitTransitionEnd): (WebCore::setJSDOMWindowBaseEvent): (WebCore::setJSDOMWindowBaseAudio): (WebCore::setJSDOMWindowBaseImage): (WebCore::setJSDOMWindowBaseMessageChannel): (WebCore::setJSDOMWindowBaseOption): (WebCore::setJSDOMWindowBaseXMLHttpRequest): (WebCore::setJSDOMWindowBaseXSLTProcessor):
  • bindings/js/JSDOMWindowBase.h:
  • bindings/js/JSDOMWindowCustom.cpp: (WebCore::nonCachingStaticCloseFunctionGetter): (WebCore::nonCachingStaticBlurFunctionGetter): (WebCore::nonCachingStaticFocusFunctionGetter): (WebCore::nonCachingStaticPostMessageFunctionGetter):
  • bindings/js/JSDOMWindowCustom.h: (WebCore::JSDOMWindow::customGetOwnPropertySlot):
  • bindings/js/JSEventTargetBase.cpp:
  • bindings/js/JSEventTargetBase.h: (WebCore::JSEventTargetBasePrototype::getOwnPropertySlot): (WebCore::JSEventTargetBasePrototype::classInfo):
  • bindings/js/JSEventTargetNode.cpp: (WebCore::): (WebCore::JSEventTargetNode::getOwnPropertySlot): (WebCore::JSEventTargetNode::put):
  • bindings/js/JSEventTargetNode.h: (WebCore::JSEventTargetNode::classInfo): (WebCore::JSEventTargetNode::prototypeClassName):
  • bindings/js/JSEventTargetSVGElementInstance.cpp: (WebCore::): (WebCore::JSEventTargetSVGElementInstance::getOwnPropertySlot): (WebCore::JSEventTargetSVGElementInstance::put):
  • bindings/js/JSEventTargetSVGElementInstance.h: (WebCore::JSEventTargetSVGElementInstance::classInfo): (WebCore::JSEventTargetSVGElementInstance::prototypeClassName):
  • bindings/js/JSHTMLInputElementCustom.cpp: (WebCore::JSHTMLInputElement::customGetOwnPropertySlot):
  • bindings/js/JSHistoryCustom.cpp: (WebCore::nonCachingStaticBackFunctionGetter): (WebCore::nonCachingStaticForwardFunctionGetter): (WebCore::nonCachingStaticGoFunctionGetter): (WebCore::JSHistory::customGetOwnPropertySlot):
  • bindings/js/JSLocationCustom.cpp: (WebCore::nonCachingStaticReplaceFunctionGetter): (WebCore::nonCachingStaticReloadFunctionGetter): (WebCore::nonCachingStaticAssignFunctionGetter): (WebCore::JSLocation::customGetOwnPropertySlot): (WebCore::JSLocation::customPut):
  • bindings/scripts/CodeGeneratorJS.pm:
  • Property svn:eol-style set to native
File size: 5.5 KB
Line 
1/*
2 * Copyright (C) 1999-2000 Harri Porten ([email protected])
3 * Copyright (C) 2003, 2007, 2008 Apple Inc. All Rights Reserved.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
14 *
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 *
19 */
20
21#include "config.h"
22#include "RegExpObject.h"
23
24#include "JSArray.h"
25#include "JSGlobalObject.h"
26#include "JSString.h"
27#include "RegExpConstructor.h"
28#include "RegExpPrototype.h"
29
30namespace JSC {
31
32static JSValue* regExpObjectGlobal(ExecState*, const Identifier&, const PropertySlot&);
33static JSValue* regExpObjectIgnoreCase(ExecState*, const Identifier&, const PropertySlot&);
34static JSValue* regExpObjectMultiline(ExecState*, const Identifier&, const PropertySlot&);
35static JSValue* regExpObjectSource(ExecState*, const Identifier&, const PropertySlot&);
36static JSValue* regExpObjectLastIndex(ExecState*, const Identifier&, const PropertySlot&);
37static void setRegExpObjectLastIndex(ExecState*, JSObject*, JSValue*);
38
39} // namespace JSC
40
41#include "RegExpObject.lut.h"
42
43namespace JSC {
44
45ASSERT_CLASS_FITS_IN_CELL(RegExpObject);
46
47const ClassInfo RegExpObject::info = { "RegExp", 0, 0, ExecState::regExpTable };
48
49/* Source for RegExpObject.lut.h
50@begin regExpTable
51 global regExpObjectGlobal DontDelete|ReadOnly|DontEnum
52 ignoreCase regExpObjectIgnoreCase DontDelete|ReadOnly|DontEnum
53 multiline regExpObjectMultiline DontDelete|ReadOnly|DontEnum
54 source regExpObjectSource DontDelete|ReadOnly|DontEnum
55 lastIndex regExpObjectLastIndex DontDelete|DontEnum
56@end
57*/
58
59RegExpObject::RegExpObject(PassRefPtr<StructureID> structure, PassRefPtr<RegExp> regExp)
60 : JSObject(structure)
61 , d(new RegExpObjectData(regExp, 0))
62{
63}
64
65RegExpObject::~RegExpObject()
66{
67}
68
69bool RegExpObject::getOwnPropertySlot(ExecState* exec, const Identifier& propertyName, PropertySlot& slot)
70{
71 return getStaticValueSlot<RegExpObject, JSObject>(exec, ExecState::regExpTable(exec), this, propertyName, slot);
72}
73
74JSValue* regExpObjectGlobal(ExecState*, const Identifier&, const PropertySlot& slot)
75{
76 return jsBoolean(static_cast<RegExpObject*>(slot.slotBase())->regExp()->global());
77}
78
79JSValue* regExpObjectIgnoreCase(ExecState*, const Identifier&, const PropertySlot& slot)
80{
81 return jsBoolean(static_cast<RegExpObject*>(slot.slotBase())->regExp()->ignoreCase());
82}
83
84JSValue* regExpObjectMultiline(ExecState*, const Identifier&, const PropertySlot& slot)
85{
86 return jsBoolean(static_cast<RegExpObject*>(slot.slotBase())->regExp()->multiline());
87}
88
89JSValue* regExpObjectSource(ExecState* exec, const Identifier&, const PropertySlot& slot)
90{
91 return jsString(exec, static_cast<RegExpObject*>(slot.slotBase())->regExp()->pattern());
92}
93
94JSValue* regExpObjectLastIndex(ExecState* exec, const Identifier&, const PropertySlot& slot)
95{
96 return jsNumber(exec, static_cast<RegExpObject*>(slot.slotBase())->lastIndex());
97}
98
99void RegExpObject::put(ExecState* exec, const Identifier& propertyName, JSValue* value, PutPropertySlot& slot)
100{
101 lookupPut<RegExpObject, JSObject>(exec, propertyName, value, ExecState::regExpTable(exec), this, slot);
102}
103
104void setRegExpObjectLastIndex(ExecState* exec, JSObject* baseObject, JSValue* value)
105{
106 static_cast<RegExpObject*>(baseObject)->setLastIndex(value->toInteger(exec));
107}
108
109bool RegExpObject::match(ExecState* exec, const ArgList& args)
110{
111 RegExpConstructor* regExpObj = exec->lexicalGlobalObject()->regExpConstructor();
112
113 UString input;
114 if (!args.isEmpty())
115 input = args.at(exec, 0)->toString(exec);
116 else {
117 input = regExpObj->input();
118 if (input.isNull()) {
119 throwError(exec, GeneralError, "No input.");
120 return false;
121 }
122 }
123
124 bool global = get(exec, exec->propertyNames().global)->toBoolean(exec);
125 int lastIndex = 0;
126 if (global) {
127 if (d->lastIndex < 0 || d->lastIndex > input.size()) {
128 d->lastIndex = 0;
129 return false;
130 }
131 lastIndex = static_cast<int>(d->lastIndex);
132 }
133
134 int foundIndex;
135 int foundLength;
136 regExpObj->performMatch(d->regExp.get(), input, lastIndex, foundIndex, foundLength);
137
138 if (global) {
139 lastIndex = foundIndex < 0 ? 0 : foundIndex + foundLength;
140 d->lastIndex = lastIndex;
141 }
142
143 return foundIndex >= 0;
144}
145
146JSValue* RegExpObject::test(ExecState* exec, const ArgList& args)
147{
148 return jsBoolean(match(exec, args));
149}
150
151JSValue* RegExpObject::exec(ExecState* exec, const ArgList& args)
152{
153 if (match(exec, args))
154 return exec->lexicalGlobalObject()->regExpConstructor()->arrayOfMatches(exec);
155 return jsNull();
156}
157
158static JSValue* callRegExpObject(ExecState* exec, JSObject* function, JSValue*, const ArgList& args)
159{
160 return static_cast<RegExpObject*>(function)->exec(exec, args);
161}
162
163CallType RegExpObject::getCallData(CallData& callData)
164{
165 callData.native.function = callRegExpObject;
166 return CallTypeHost;
167}
168
169} // namespace JSC
Note: See TracBrowser for help on using the repository browser.