]>
git.saurik.com Git - apple/javascriptcore.git/blob - runtime/RegExpObject.cpp
687844ed5213ced3a98be4d03f1fbb6ff3204cbc
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"
28 #include "RegExpConstructor.h"
29 #include "RegExpPrototype.h"
33 static JSValue
regExpObjectGlobal(ExecState
*, const Identifier
&, const PropertySlot
&);
34 static JSValue
regExpObjectIgnoreCase(ExecState
*, const Identifier
&, const PropertySlot
&);
35 static JSValue
regExpObjectMultiline(ExecState
*, const Identifier
&, const PropertySlot
&);
36 static JSValue
regExpObjectSource(ExecState
*, const Identifier
&, const PropertySlot
&);
37 static JSValue
regExpObjectLastIndex(ExecState
*, const Identifier
&, const PropertySlot
&);
38 static void setRegExpObjectLastIndex(ExecState
*, JSObject
*, JSValue
);
42 #include "RegExpObject.lut.h"
46 ASSERT_CLASS_FITS_IN_CELL(RegExpObject
);
48 const ClassInfo
RegExpObject::info
= { "RegExp", 0, 0, ExecState::regExpTable
};
50 /* Source for RegExpObject.lut.h
52 global regExpObjectGlobal DontDelete|ReadOnly|DontEnum
53 ignoreCase regExpObjectIgnoreCase DontDelete|ReadOnly|DontEnum
54 multiline regExpObjectMultiline DontDelete|ReadOnly|DontEnum
55 source regExpObjectSource DontDelete|ReadOnly|DontEnum
56 lastIndex regExpObjectLastIndex DontDelete|DontEnum
60 RegExpObject::RegExpObject(PassRefPtr
<Structure
> structure
, PassRefPtr
<RegExp
> regExp
)
62 , d(new RegExpObjectData(regExp
, 0))
66 RegExpObject::~RegExpObject()
70 bool RegExpObject::getOwnPropertySlot(ExecState
* exec
, const Identifier
& propertyName
, PropertySlot
& slot
)
72 return getStaticValueSlot
<RegExpObject
, JSObject
>(exec
, ExecState::regExpTable(exec
), this, propertyName
, slot
);
75 JSValue
regExpObjectGlobal(ExecState
*, const Identifier
&, const PropertySlot
& slot
)
77 return jsBoolean(asRegExpObject(slot
.slotBase())->regExp()->global());
80 JSValue
regExpObjectIgnoreCase(ExecState
*, const Identifier
&, const PropertySlot
& slot
)
82 return jsBoolean(asRegExpObject(slot
.slotBase())->regExp()->ignoreCase());
85 JSValue
regExpObjectMultiline(ExecState
*, const Identifier
&, const PropertySlot
& slot
)
87 return jsBoolean(asRegExpObject(slot
.slotBase())->regExp()->multiline());
90 JSValue
regExpObjectSource(ExecState
* exec
, const Identifier
&, const PropertySlot
& slot
)
92 return jsString(exec
, asRegExpObject(slot
.slotBase())->regExp()->pattern());
95 JSValue
regExpObjectLastIndex(ExecState
* exec
, const Identifier
&, const PropertySlot
& slot
)
97 return jsNumber(exec
, asRegExpObject(slot
.slotBase())->lastIndex());
100 void RegExpObject::put(ExecState
* exec
, const Identifier
& propertyName
, JSValue value
, PutPropertySlot
& slot
)
102 lookupPut
<RegExpObject
, JSObject
>(exec
, propertyName
, value
, ExecState::regExpTable(exec
), this, slot
);
105 void setRegExpObjectLastIndex(ExecState
* exec
, JSObject
* baseObject
, JSValue value
)
107 asRegExpObject(baseObject
)->setLastIndex(value
.toInteger(exec
));
110 JSValue
RegExpObject::test(ExecState
* exec
, const ArgList
& args
)
112 return jsBoolean(match(exec
, args
));
115 JSValue
RegExpObject::exec(ExecState
* exec
, const ArgList
& args
)
117 if (match(exec
, args
))
118 return exec
->lexicalGlobalObject()->regExpConstructor()->arrayOfMatches(exec
);
122 static JSValue JSC_HOST_CALL
callRegExpObject(ExecState
* exec
, JSObject
* function
, JSValue
, const ArgList
& args
)
124 return asRegExpObject(function
)->exec(exec
, args
);
127 CallType
RegExpObject::getCallData(CallData
& callData
)
129 callData
.native
.function
= callRegExpObject
;
133 // Shared implementation used by test and exec.
134 bool RegExpObject::match(ExecState
* exec
, const ArgList
& args
)
136 RegExpConstructor
* regExpConstructor
= exec
->lexicalGlobalObject()->regExpConstructor();
138 UString input
= args
.isEmpty() ? regExpConstructor
->input() : args
.at(0).toString(exec
);
139 if (input
.isNull()) {
140 throwError(exec
, GeneralError
, "No input to " + toString(exec
) + ".");
144 if (!regExp()->global()) {
147 regExpConstructor
->performMatch(d
->regExp
.get(), input
, 0, position
, length
);
148 return position
>= 0;
151 if (d
->lastIndex
< 0 || d
->lastIndex
> input
.size()) {
158 regExpConstructor
->performMatch(d
->regExp
.get(), input
, static_cast<int>(d
->lastIndex
), position
, length
);
164 d
->lastIndex
= position
+ length
;