X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..ed1e77d3adeb83d26fd1dfb16dd84cabdcefd250:/runtime/RegExpConstructor.cpp diff --git a/runtime/RegExpConstructor.cpp b/runtime/RegExpConstructor.cpp index 747ed05..ee1d8b3 100644 --- a/runtime/RegExpConstructor.cpp +++ b/runtime/RegExpConstructor.cpp @@ -23,31 +23,30 @@ #include "RegExpConstructor.h" #include "Error.h" +#include "JSCInlines.h" #include "RegExpMatchesArray.h" #include "RegExpPrototype.h" -#include - namespace JSC { -static JSValue regExpConstructorInput(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorMultiline(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorLastMatch(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorLastParen(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorLeftContext(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorRightContext(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorDollar1(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorDollar2(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorDollar3(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorDollar4(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorDollar5(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorDollar6(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorDollar7(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorDollar8(ExecState*, JSValue, const Identifier&); -static JSValue regExpConstructorDollar9(ExecState*, JSValue, const Identifier&); - -static void setRegExpConstructorInput(ExecState*, JSObject*, JSValue); -static void setRegExpConstructorMultiline(ExecState*, JSObject*, JSValue); +static EncodedJSValue regExpConstructorInput(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorMultiline(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorLastMatch(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorLastParen(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorLeftContext(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorRightContext(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorDollar1(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorDollar2(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorDollar3(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorDollar4(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorDollar5(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorDollar6(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorDollar7(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorDollar8(ExecState*, JSObject*, EncodedJSValue, PropertyName); +static EncodedJSValue regExpConstructorDollar9(ExecState*, JSObject*, EncodedJSValue, PropertyName); + +static void setRegExpConstructorInput(ExecState*, JSObject*, EncodedJSValue, EncodedJSValue); +static void setRegExpConstructorMultiline(ExecState*, JSObject*, EncodedJSValue, EncodedJSValue); } // namespace JSC @@ -55,9 +54,7 @@ static void setRegExpConstructorMultiline(ExecState*, JSObject*, JSValue); namespace JSC { -ASSERT_CLASS_FITS_IN_CELL(RegExpConstructor); - -const ClassInfo RegExpConstructor::s_info = { "Function", &InternalFunction::s_info, 0, ExecState::regExpConstructorTable, CREATE_METHOD_TABLE(RegExpConstructor) }; +const ClassInfo RegExpConstructor::s_info = { "Function", &InternalFunction::s_info, ®ExpConstructorTable, CREATE_METHOD_TABLE(RegExpConstructor) }; /* Source for RegExpConstructor.lut.h @begin regExpConstructorTable @@ -85,44 +82,41 @@ const ClassInfo RegExpConstructor::s_info = { "Function", &InternalFunction::s_i @end */ -RegExpConstructor::RegExpConstructor(JSGlobalObject* globalObject, Structure* structure, RegExpPrototype* regExpPrototype) - : InternalFunction(globalObject, structure) - , m_cachedResult(globalObject->globalData(), this, regExpPrototype->regExp()) +RegExpConstructor::RegExpConstructor(VM& vm, Structure* structure, RegExpPrototype* regExpPrototype) + : InternalFunction(vm, structure) + , m_cachedResult(vm, this, regExpPrototype->regExp()) , m_multiline(false) { } -void RegExpConstructor::finishCreation(ExecState* exec, RegExpPrototype* regExpPrototype) +void RegExpConstructor::finishCreation(VM& vm, RegExpPrototype* regExpPrototype) { - Base::finishCreation(exec->globalData(), Identifier(exec, "RegExp")); - ASSERT(inherits(&s_info)); + Base::finishCreation(vm, regExpPrototype->classInfo()->className); + ASSERT(inherits(info())); // ECMA 15.10.5.1 RegExp.prototype - putDirectWithoutTransition(exec->globalData(), exec->propertyNames().prototype, regExpPrototype, DontEnum | DontDelete | ReadOnly); + putDirectWithoutTransition(vm, vm.propertyNames->prototype, regExpPrototype, DontEnum | DontDelete | ReadOnly); // no. of arguments for constructor - putDirectWithoutTransition(exec->globalData(), exec->propertyNames().length, jsNumber(2), ReadOnly | DontDelete | DontEnum); + putDirectWithoutTransition(vm, vm.propertyNames->length, jsNumber(2), ReadOnly | DontDelete | DontEnum); } void RegExpConstructor::destroy(JSCell* cell) { - jsCast(cell)->RegExpConstructor::~RegExpConstructor(); + static_cast(cell)->RegExpConstructor::~RegExpConstructor(); } void RegExpConstructor::visitChildren(JSCell* cell, SlotVisitor& visitor) { RegExpConstructor* thisObject = jsCast(cell); - ASSERT_GC_OBJECT_INHERITS(thisObject, &s_info); - COMPILE_ASSERT(StructureFlags & OverridesVisitChildren, OverridesVisitChildrenWithoutSettingFlag); - ASSERT(thisObject->structure()->typeInfo().overridesVisitChildren()); - + ASSERT_GC_OBJECT_INHERITS(thisObject, info()); Base::visitChildren(thisObject, visitor); thisObject->m_cachedResult.visitChildren(visitor); } JSValue RegExpConstructor::getBackref(ExecState* exec, unsigned i) { - RegExpMatchesArray* array = m_cachedResult.lastResult(exec, this); + JSArray* array = m_cachedResult.lastResult(exec, this); if (i < array->length()) { JSValue result = JSValue(array).get(exec, i); @@ -135,7 +129,7 @@ JSValue RegExpConstructor::getBackref(ExecState* exec, unsigned i) JSValue RegExpConstructor::getLastParen(ExecState* exec) { - RegExpMatchesArray* array = m_cachedResult.lastResult(exec, this); + JSArray* array = m_cachedResult.lastResult(exec, this); unsigned length = array->length(); if (length > 1) { JSValue result = JSValue(array).get(exec, length - 1); @@ -148,112 +142,104 @@ JSValue RegExpConstructor::getLastParen(ExecState* exec) JSValue RegExpConstructor::getLeftContext(ExecState* exec) { - return m_cachedResult.lastResult(exec, this)->leftContext(exec); + return m_cachedResult.leftContext(exec, this); } JSValue RegExpConstructor::getRightContext(ExecState* exec) { - return m_cachedResult.lastResult(exec, this)->rightContext(exec); + return m_cachedResult.rightContext(exec, this); } -bool RegExpConstructor::getOwnPropertySlot(JSCell* cell, ExecState* exec, const Identifier& propertyName, PropertySlot& slot) -{ - return getStaticValueSlot(exec, ExecState::regExpConstructorTable(exec), jsCast(cell), propertyName, slot); -} - -bool RegExpConstructor::getOwnPropertyDescriptor(JSObject* object, ExecState* exec, const Identifier& propertyName, PropertyDescriptor& descriptor) +bool RegExpConstructor::getOwnPropertySlot(JSObject* object, ExecState* exec, PropertyName propertyName, PropertySlot& slot) { - return getStaticValueDescriptor(exec, ExecState::regExpConstructorTable(exec), jsCast(object), propertyName, descriptor); + return getStaticValueSlot(exec, regExpConstructorTable, jsCast(object), propertyName, slot); } - -JSValue regExpConstructorDollar1(ExecState* exec, JSValue slotBase, const Identifier&) -{ - return asRegExpConstructor(slotBase)->getBackref(exec, 1); -} - -JSValue regExpConstructorDollar2(ExecState* exec, JSValue slotBase, const Identifier&) + +EncodedJSValue regExpConstructorDollar1(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getBackref(exec, 2); + return JSValue::encode(asRegExpConstructor(slotBase)->getBackref(exec, 1)); } -JSValue regExpConstructorDollar3(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorDollar2(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getBackref(exec, 3); + return JSValue::encode(asRegExpConstructor(slotBase)->getBackref(exec, 2)); } -JSValue regExpConstructorDollar4(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorDollar3(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getBackref(exec, 4); + return JSValue::encode(asRegExpConstructor(slotBase)->getBackref(exec, 3)); } -JSValue regExpConstructorDollar5(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorDollar4(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getBackref(exec, 5); + return JSValue::encode(asRegExpConstructor(slotBase)->getBackref(exec, 4)); } -JSValue regExpConstructorDollar6(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorDollar5(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getBackref(exec, 6); + return JSValue::encode(asRegExpConstructor(slotBase)->getBackref(exec, 5)); } -JSValue regExpConstructorDollar7(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorDollar6(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getBackref(exec, 7); + return JSValue::encode(asRegExpConstructor(slotBase)->getBackref(exec, 6)); } -JSValue regExpConstructorDollar8(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorDollar7(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getBackref(exec, 8); + return JSValue::encode(asRegExpConstructor(slotBase)->getBackref(exec, 7)); } -JSValue regExpConstructorDollar9(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorDollar8(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getBackref(exec, 9); + return JSValue::encode(asRegExpConstructor(slotBase)->getBackref(exec, 8)); } -JSValue regExpConstructorInput(ExecState*, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorDollar9(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->input(); + return JSValue::encode(asRegExpConstructor(slotBase)->getBackref(exec, 9)); } -JSValue regExpConstructorMultiline(ExecState*, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorInput(ExecState*, JSObject* slotBase, EncodedJSValue, PropertyName) { - return jsBoolean(asRegExpConstructor(slotBase)->multiline()); + return JSValue::encode(asRegExpConstructor(slotBase)->input()); } -JSValue regExpConstructorLastMatch(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorMultiline(ExecState*, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getBackref(exec, 0); + return JSValue::encode(jsBoolean(asRegExpConstructor(slotBase)->multiline())); } -JSValue regExpConstructorLastParen(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorLastMatch(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getLastParen(exec); + return JSValue::encode(asRegExpConstructor(slotBase)->getBackref(exec, 0)); } -JSValue regExpConstructorLeftContext(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorLastParen(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getLeftContext(exec); + return JSValue::encode(asRegExpConstructor(slotBase)->getLastParen(exec)); } -JSValue regExpConstructorRightContext(ExecState* exec, JSValue slotBase, const Identifier&) +EncodedJSValue regExpConstructorLeftContext(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - return asRegExpConstructor(slotBase)->getRightContext(exec); + return JSValue::encode(asRegExpConstructor(slotBase)->getLeftContext(exec)); } -void RegExpConstructor::put(JSCell* cell, ExecState* exec, const Identifier& propertyName, JSValue value, PutPropertySlot& slot) +EncodedJSValue regExpConstructorRightContext(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName) { - lookupPut(exec, propertyName, value, ExecState::regExpConstructorTable(exec), jsCast(cell), slot); + return JSValue::encode(asRegExpConstructor(slotBase)->getRightContext(exec)); } -void setRegExpConstructorInput(ExecState* exec, JSObject* baseObject, JSValue value) +void setRegExpConstructorInput(ExecState* exec, JSObject* baseObject, EncodedJSValue, EncodedJSValue value) { - asRegExpConstructor(baseObject)->setInput(exec, value.toString(exec)); + if (auto constructor = jsDynamicCast(baseObject)) + constructor->setInput(exec, JSValue::decode(value).toString(exec)); } -void setRegExpConstructorMultiline(ExecState* exec, JSObject* baseObject, JSValue value) +void setRegExpConstructorMultiline(ExecState* exec, JSObject* baseObject, EncodedJSValue, EncodedJSValue value) { - asRegExpConstructor(baseObject)->setMultiline(value.toBoolean(exec)); + if (auto constructor = jsDynamicCast(baseObject)) + constructor->setMultiline(JSValue::decode(value).toBoolean(exec)); } // ECMA 15.10.4 @@ -262,18 +248,18 @@ JSObject* constructRegExp(ExecState* exec, JSGlobalObject* globalObject, const A JSValue arg0 = args.at(0); JSValue arg1 = args.at(1); - if (arg0.inherits(&RegExpObject::s_info)) { + if (arg0.inherits(RegExpObject::info())) { if (!arg1.isUndefined()) - return throwError(exec, createTypeError(exec, "Cannot supply flags when constructing one RegExp from another.")); + return exec->vm().throwException(exec, createTypeError(exec, ASCIILiteral("Cannot supply flags when constructing one RegExp from another."))); // If called as a function, this just returns the first argument (see 15.10.3.1). if (callAsConstructor) { RegExp* regExp = static_cast(asObject(arg0))->regExp(); - return RegExpObject::create(exec, globalObject, globalObject->regExpStructure(), regExp); + return RegExpObject::create(exec->vm(), globalObject->regExpStructure(), regExp); } return asObject(arg0); } - UString pattern = arg0.isUndefined() ? UString("") : arg0.toString(exec)->value(exec); + String pattern = arg0.isUndefined() ? emptyString() : arg0.toString(exec)->value(exec); if (exec->hadException()) return 0; @@ -283,13 +269,14 @@ JSObject* constructRegExp(ExecState* exec, JSGlobalObject* globalObject, const A if (exec->hadException()) return 0; if (flags == InvalidFlags) - return throwError(exec, createSyntaxError(exec, "Invalid flags supplied to RegExp constructor.")); + return exec->vm().throwException(exec, createSyntaxError(exec, ASCIILiteral("Invalid flags supplied to RegExp constructor."))); } - RegExp* regExp = RegExp::create(exec->globalData(), pattern, flags); + VM& vm = exec->vm(); + RegExp* regExp = RegExp::create(vm, pattern, flags); if (!regExp->isValid()) - return throwError(exec, createSyntaxError(exec, regExp->errorMessage())); - return RegExpObject::create(exec, exec->lexicalGlobalObject(), globalObject->regExpStructure(), regExp); + return vm.throwException(exec, createSyntaxError(exec, regExp->errorMessage())); + return RegExpObject::create(vm, globalObject->regExpStructure(), regExp); } static EncodedJSValue JSC_HOST_CALL constructWithRegExpConstructor(ExecState* exec)