]>
git.saurik.com Git - apple/javascriptcore.git/blob - runtime/RegExpObject.cpp
2 * Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
3 * Copyright (C) 2003, 2007, 2008 Apple Inc. All Rights Reserved.
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.
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.
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
22 #include "RegExpObject.h"
26 #include "JSGlobalObject.h"
29 #include "RegExpConstructor.h"
30 #include "RegExpPrototype.h"
34 static JSValue
regExpObjectGlobal(ExecState
*, JSValue
, const Identifier
&);
35 static JSValue
regExpObjectIgnoreCase(ExecState
*, JSValue
, const Identifier
&);
36 static JSValue
regExpObjectMultiline(ExecState
*, JSValue
, const Identifier
&);
37 static JSValue
regExpObjectSource(ExecState
*, JSValue
, const Identifier
&);
38 static JSValue
regExpObjectLastIndex(ExecState
*, JSValue
, const Identifier
&);
39 static void setRegExpObjectLastIndex(ExecState
*, JSObject
*, JSValue
);
43 #include "RegExpObject.lut.h"
47 ASSERT_CLASS_FITS_IN_CELL(RegExpObject
);
49 const ClassInfo
RegExpObject::info
= { "RegExp", 0, 0, ExecState::regExpTable
};
51 /* Source for RegExpObject.lut.h
53 global regExpObjectGlobal DontDelete|ReadOnly|DontEnum
54 ignoreCase regExpObjectIgnoreCase DontDelete|ReadOnly|DontEnum
55 multiline regExpObjectMultiline DontDelete|ReadOnly|DontEnum
56 source regExpObjectSource DontDelete|ReadOnly|DontEnum
57 lastIndex regExpObjectLastIndex DontDelete|DontEnum
61 RegExpObject::RegExpObject(NonNullPassRefPtr
<Structure
> structure
, NonNullPassRefPtr
<RegExp
> regExp
)
63 , d(new RegExpObjectData(regExp
, 0))
67 RegExpObject::~RegExpObject()
71 bool RegExpObject::getOwnPropertySlot(ExecState
* exec
, const Identifier
& propertyName
, PropertySlot
& slot
)
73 return getStaticValueSlot
<RegExpObject
, JSObject
>(exec
, ExecState::regExpTable(exec
), this, propertyName
, slot
);
76 bool RegExpObject::getOwnPropertyDescriptor(ExecState
* exec
, const Identifier
& propertyName
, PropertyDescriptor
& descriptor
)
78 return getStaticValueDescriptor
<RegExpObject
, JSObject
>(exec
, ExecState::regExpTable(exec
), this, propertyName
, descriptor
);
81 JSValue
regExpObjectGlobal(ExecState
*, JSValue slotBase
, const Identifier
&)
83 return jsBoolean(asRegExpObject(slotBase
)->regExp()->global());
86 JSValue
regExpObjectIgnoreCase(ExecState
*, JSValue slotBase
, const Identifier
&)
88 return jsBoolean(asRegExpObject(slotBase
)->regExp()->ignoreCase());
91 JSValue
regExpObjectMultiline(ExecState
*, JSValue slotBase
, const Identifier
&)
93 return jsBoolean(asRegExpObject(slotBase
)->regExp()->multiline());
96 JSValue
regExpObjectSource(ExecState
* exec
, JSValue slotBase
, const Identifier
&)
98 return jsString(exec
, asRegExpObject(slotBase
)->regExp()->pattern());
101 JSValue
regExpObjectLastIndex(ExecState
* exec
, JSValue slotBase
, const Identifier
&)
103 return jsNumber(exec
, asRegExpObject(slotBase
)->lastIndex());
106 void RegExpObject::put(ExecState
* exec
, const Identifier
& propertyName
, JSValue value
, PutPropertySlot
& slot
)
108 lookupPut
<RegExpObject
, JSObject
>(exec
, propertyName
, value
, ExecState::regExpTable(exec
), this, slot
);
111 void setRegExpObjectLastIndex(ExecState
* exec
, JSObject
* baseObject
, JSValue value
)
113 asRegExpObject(baseObject
)->setLastIndex(value
.toInteger(exec
));
116 JSValue
RegExpObject::test(ExecState
* exec
, const ArgList
& args
)
118 return jsBoolean(match(exec
, args
));
121 JSValue
RegExpObject::exec(ExecState
* exec
, const ArgList
& args
)
123 if (match(exec
, args
))
124 return exec
->lexicalGlobalObject()->regExpConstructor()->arrayOfMatches(exec
);
128 static JSValue JSC_HOST_CALL
callRegExpObject(ExecState
* exec
, JSObject
* function
, JSValue
, const ArgList
& args
)
130 return asRegExpObject(function
)->exec(exec
, args
);
133 CallType
RegExpObject::getCallData(CallData
& callData
)
135 callData
.native
.function
= callRegExpObject
;
139 // Shared implementation used by test and exec.
140 bool RegExpObject::match(ExecState
* exec
, const ArgList
& args
)
142 RegExpConstructor
* regExpConstructor
= exec
->lexicalGlobalObject()->regExpConstructor();
144 UString input
= args
.isEmpty() ? regExpConstructor
->input() : args
.at(0).toString(exec
);
145 if (input
.isNull()) {
146 throwError(exec
, GeneralError
, makeString("No input to ", toString(exec
), "."));
150 if (!regExp()->global()) {
153 regExpConstructor
->performMatch(d
->regExp
.get(), input
, 0, position
, length
);
154 return position
>= 0;
157 if (d
->lastIndex
< 0 || d
->lastIndex
> input
.size()) {
164 regExpConstructor
->performMatch(d
->regExp
.get(), input
, static_cast<int>(d
->lastIndex
), position
, length
);
170 d
->lastIndex
= position
+ length
;