X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/9dae56ea45a0f5f8136a5c93d6f3a7f99399ca73..f9bf01c6616d5ddcf65b13b33cedf9e387ff7a63:/runtime/RegExpObject.cpp diff --git a/runtime/RegExpObject.cpp b/runtime/RegExpObject.cpp index f8e0522..42bfcef 100644 --- a/runtime/RegExpObject.cpp +++ b/runtime/RegExpObject.cpp @@ -21,6 +21,7 @@ #include "config.h" #include "RegExpObject.h" +#include "Error.h" #include "JSArray.h" #include "JSGlobalObject.h" #include "JSString.h" @@ -29,12 +30,12 @@ namespace JSC { -static JSValuePtr regExpObjectGlobal(ExecState*, const Identifier&, const PropertySlot&); -static JSValuePtr regExpObjectIgnoreCase(ExecState*, const Identifier&, const PropertySlot&); -static JSValuePtr regExpObjectMultiline(ExecState*, const Identifier&, const PropertySlot&); -static JSValuePtr regExpObjectSource(ExecState*, const Identifier&, const PropertySlot&); -static JSValuePtr regExpObjectLastIndex(ExecState*, const Identifier&, const PropertySlot&); -static void setRegExpObjectLastIndex(ExecState*, JSObject*, JSValuePtr); +static JSValue regExpObjectGlobal(ExecState*, const Identifier&, const PropertySlot&); +static JSValue regExpObjectIgnoreCase(ExecState*, const Identifier&, const PropertySlot&); +static JSValue regExpObjectMultiline(ExecState*, const Identifier&, const PropertySlot&); +static JSValue regExpObjectSource(ExecState*, const Identifier&, const PropertySlot&); +static JSValue regExpObjectLastIndex(ExecState*, const Identifier&, const PropertySlot&); +static void setRegExpObjectLastIndex(ExecState*, JSObject*, JSValue); } // namespace JSC @@ -56,7 +57,7 @@ const ClassInfo RegExpObject::info = { "RegExp", 0, 0, ExecState::regExpTable }; @end */ -RegExpObject::RegExpObject(PassRefPtr structure, PassRefPtr regExp) +RegExpObject::RegExpObject(NonNullPassRefPtr structure, NonNullPassRefPtr regExp) : JSObject(structure) , d(new RegExpObjectData(regExp, 0)) { @@ -71,54 +72,59 @@ bool RegExpObject::getOwnPropertySlot(ExecState* exec, const Identifier& propert return getStaticValueSlot(exec, ExecState::regExpTable(exec), this, propertyName, slot); } -JSValuePtr regExpObjectGlobal(ExecState*, const Identifier&, const PropertySlot& slot) +bool RegExpObject::getOwnPropertyDescriptor(ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) +{ + return getStaticValueDescriptor(exec, ExecState::regExpTable(exec), this, propertyName, descriptor); +} + +JSValue regExpObjectGlobal(ExecState*, const Identifier&, const PropertySlot& slot) { return jsBoolean(asRegExpObject(slot.slotBase())->regExp()->global()); } -JSValuePtr regExpObjectIgnoreCase(ExecState*, const Identifier&, const PropertySlot& slot) +JSValue regExpObjectIgnoreCase(ExecState*, const Identifier&, const PropertySlot& slot) { return jsBoolean(asRegExpObject(slot.slotBase())->regExp()->ignoreCase()); } -JSValuePtr regExpObjectMultiline(ExecState*, const Identifier&, const PropertySlot& slot) +JSValue regExpObjectMultiline(ExecState*, const Identifier&, const PropertySlot& slot) { return jsBoolean(asRegExpObject(slot.slotBase())->regExp()->multiline()); } -JSValuePtr regExpObjectSource(ExecState* exec, const Identifier&, const PropertySlot& slot) +JSValue regExpObjectSource(ExecState* exec, const Identifier&, const PropertySlot& slot) { return jsString(exec, asRegExpObject(slot.slotBase())->regExp()->pattern()); } -JSValuePtr regExpObjectLastIndex(ExecState* exec, const Identifier&, const PropertySlot& slot) +JSValue regExpObjectLastIndex(ExecState* exec, const Identifier&, const PropertySlot& slot) { return jsNumber(exec, asRegExpObject(slot.slotBase())->lastIndex()); } -void RegExpObject::put(ExecState* exec, const Identifier& propertyName, JSValuePtr value, PutPropertySlot& slot) +void RegExpObject::put(ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) { lookupPut(exec, propertyName, value, ExecState::regExpTable(exec), this, slot); } -void setRegExpObjectLastIndex(ExecState* exec, JSObject* baseObject, JSValuePtr value) +void setRegExpObjectLastIndex(ExecState* exec, JSObject* baseObject, JSValue value) { asRegExpObject(baseObject)->setLastIndex(value.toInteger(exec)); } -JSValuePtr RegExpObject::test(ExecState* exec, const ArgList& args) +JSValue RegExpObject::test(ExecState* exec, const ArgList& args) { return jsBoolean(match(exec, args)); } -JSValuePtr RegExpObject::exec(ExecState* exec, const ArgList& args) +JSValue RegExpObject::exec(ExecState* exec, const ArgList& args) { if (match(exec, args)) return exec->lexicalGlobalObject()->regExpConstructor()->arrayOfMatches(exec); return jsNull(); } -static JSValuePtr callRegExpObject(ExecState* exec, JSObject* function, JSValuePtr, const ArgList& args) +static JSValue JSC_HOST_CALL callRegExpObject(ExecState* exec, JSObject* function, JSValue, const ArgList& args) { return asRegExpObject(function)->exec(exec, args); } @@ -134,9 +140,9 @@ bool RegExpObject::match(ExecState* exec, const ArgList& args) { RegExpConstructor* regExpConstructor = exec->lexicalGlobalObject()->regExpConstructor(); - UString input = args.isEmpty() ? regExpConstructor->input() : args.at(exec, 0).toString(exec); + UString input = args.isEmpty() ? regExpConstructor->input() : args.at(0).toString(exec); if (input.isNull()) { - throwError(exec, GeneralError, "No input to " + toString(exec) + "."); + throwError(exec, GeneralError, makeString("No input to ", toString(exec), ".")); return false; } @@ -153,7 +159,7 @@ bool RegExpObject::match(ExecState* exec, const ArgList& args) } int position; - int length; + int length = 0; regExpConstructor->performMatch(d->regExp.get(), input, static_cast(d->lastIndex), position, length); if (position < 0) { d->lastIndex = 0;