// ECMA 15.10.4 JSObject* constructRegExp(ExecState* exec, JSGlobalObject* globalObject, const ArgList& args, bool callAsConstructor) { JSValue arg0 = args.at(0); JSValue arg1 = args.at(1); if (arg0.inherits(&RegExpObject::s_info)) { if (!arg1.isUndefined()) return throwError(exec, createTypeError(exec, "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<RegExpObject*>(asObject(arg0))->regExp(); return RegExpObject::create(exec, globalObject, globalObject->regExpStructure(), regExp); } return asObject(arg0); } UString pattern = arg0.isUndefined() ? UString("") : arg0.toString(exec)->value(exec); if (exec->hadException()) return 0; RegExpFlags flags = NoFlags; if (!arg1.isUndefined()) { flags = regExpFlags(arg1.toString(exec)->value(exec)); if (exec->hadException()) return 0; if (flags == InvalidFlags) return throwError(exec, createSyntaxError(exec, "Invalid flags supplied to RegExp constructor.")); } RegExp* regExp = RegExp::create(exec->globalData(), pattern, flags); if (!regExp->isValid()) return throwError(exec, createSyntaxError(exec, regExp->errorMessage())); return RegExpObject::create(exec, exec->lexicalGlobalObject(), globalObject->regExpStructure(), regExp); }
// ECMA 15.10.4 JSObject* constructRegExp(ExecState* exec, JSGlobalObject* globalObject, const ArgList& args) { JSValue arg0 = args.at(0); JSValue arg1 = args.at(1); if (arg0.inherits(&RegExpObject::s_info)) { if (!arg1.isUndefined()) return throwError(exec, createTypeError(exec, "Cannot supply flags when constructing one RegExp from another.")); return asObject(arg0); } UString pattern = arg0.isUndefined() ? UString("") : arg0.toString(exec); if (exec->hadException()) return 0; RegExpFlags flags = NoFlags; if (!arg1.isUndefined()) { flags = regExpFlags(arg1.toString(exec)); if (exec->hadException()) return 0; if (flags == InvalidFlags) return throwError(exec, createSyntaxError(exec, "Invalid flags supplied to RegExp constructor.")); } RefPtr<RegExp> regExp = exec->globalData().regExpCache()->lookupOrCreate(pattern, flags); if (!regExp->isValid()) return throwError(exec, createSyntaxError(exec, regExp->errorMessage())); return new (exec) RegExpObject(exec->lexicalGlobalObject(), globalObject->regExpStructure(), regExp.release()); }
inline RegExpFlags toFlags(ExecState* exec, JSValue flags) { if (flags.isUndefined()) return NoFlags; JSString* flagsString = flags.toString(exec); if (!flagsString) { ASSERT(exec->hadException()); return InvalidFlags; } RegExpFlags result = regExpFlags(flagsString->value(exec)); if (exec->hadException()) return InvalidFlags; if (result == InvalidFlags) throwSyntaxError(exec, ASCIILiteral("Invalid flags supplied to RegExp constructor.")); return result; }
inline RegExpFlags toFlags(ExecState* exec, JSValue flags) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); if (flags.isUndefined()) return NoFlags; JSString* flagsString = flags.toStringOrNull(exec); ASSERT(!!scope.exception() == !flagsString); if (UNLIKELY(!flagsString)) return InvalidFlags; RegExpFlags result = regExpFlags(flagsString->value(exec)); RETURN_IF_EXCEPTION(scope, InvalidFlags); if (result == InvalidFlags) throwSyntaxError(exec, scope, ASCIILiteral("Invalid flags supplied to RegExp constructor.")); return result; }
EncodedJSValue JSC_HOST_CALL regExpProtoFuncCompile(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&RegExpObject::s_info)) return throwVMTypeError(exec); RegExp* regExp; JSValue arg0 = exec->argument(0); JSValue arg1 = exec->argument(1); if (arg0.isSymbolic() || arg1.isSymbolic()) { Statistics::statistics()->accumulate("Concolic::MissingInstrumentation::regExpProtoFuncCompile", 1); } if (arg0.inherits(&RegExpObject::s_info)) { if (!arg1.isUndefined()) return throwVMError(exec, createTypeError(exec, "Cannot supply flags when constructing one RegExp from another.")); regExp = asRegExpObject(arg0)->regExp(); } else { UString pattern = !exec->argumentCount() ? UString("") : arg0.toString(exec)->value(exec); if (exec->hadException()) return JSValue::encode(jsUndefined()); RegExpFlags flags = NoFlags; if (!arg1.isUndefined()) { flags = regExpFlags(arg1.toString(exec)->value(exec)); if (exec->hadException()) return JSValue::encode(jsUndefined()); if (flags == InvalidFlags) return throwVMError(exec, createSyntaxError(exec, "Invalid flags supplied to RegExp constructor.")); } regExp = RegExp::create(exec->globalData(), pattern, flags); } if (!regExp->isValid()) return throwVMError(exec, createSyntaxError(exec, regExp->errorMessage())); asRegExpObject(thisValue)->setRegExp(exec->globalData(), regExp); asRegExpObject(thisValue)->setLastIndex(exec, 0); return JSValue::encode(jsUndefined()); }
EncodedJSValue JSC_HOST_CALL regExpProtoFuncCompile(ExecState* exec) { JSValue thisValue = exec->thisValue(); if (!thisValue.inherits(RegExpObject::info())) return throwVMTypeError(exec); RegExp* regExp; JSValue arg0 = exec->argument(0); JSValue arg1 = exec->argument(1); if (arg0.inherits(RegExpObject::info())) { if (!arg1.isUndefined()) return throwVMError(exec, createTypeError(exec, ASCIILiteral("Cannot supply flags when constructing one RegExp from another."))); regExp = asRegExpObject(arg0)->regExp(); } else { String pattern = !exec->argumentCount() ? emptyString() : arg0.toString(exec)->value(exec); if (exec->hadException()) return JSValue::encode(jsUndefined()); RegExpFlags flags = NoFlags; if (!arg1.isUndefined()) { flags = regExpFlags(arg1.toString(exec)->value(exec)); if (exec->hadException()) return JSValue::encode(jsUndefined()); if (flags == InvalidFlags) return throwVMError(exec, createSyntaxError(exec, ASCIILiteral("Invalid flags supplied to RegExp constructor."))); } regExp = RegExp::create(exec->vm(), pattern, flags); } if (!regExp->isValid()) return throwVMError(exec, createSyntaxError(exec, regExp->errorMessage())); asRegExpObject(thisValue)->setRegExp(exec->vm(), regExp); asRegExpObject(thisValue)->setLastIndex(exec, 0); return JSValue::encode(jsUndefined()); }
// ECMA 15.10.4 JSObject* constructRegExp(ExecState* exec, JSGlobalObject* globalObject, const ArgList& args, JSValue newTarget) { JSValue arg0 = args.at(0); JSValue arg1 = args.at(1); if (arg0.inherits(RegExpObject::info())) { if (!arg1.isUndefined()) 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 (newTarget != jsUndefined()) { RegExp* regExp = static_cast<RegExpObject*>(asObject(arg0))->regExp(); return RegExpObject::create(exec->vm(), getRegExpStructure(exec, globalObject, newTarget), regExp); } return asObject(arg0); } String pattern = arg0.isUndefined() ? emptyString() : arg0.toString(exec)->value(exec); if (exec->hadException()) return 0; RegExpFlags flags = NoFlags; if (!arg1.isUndefined()) { flags = regExpFlags(arg1.toString(exec)->value(exec)); if (exec->hadException()) return 0; if (flags == InvalidFlags) return exec->vm().throwException(exec, createSyntaxError(exec, ASCIILiteral("Invalid flags supplied to RegExp constructor."))); } VM& vm = exec->vm(); RegExp* regExp = RegExp::create(vm, pattern, flags); if (!regExp->isValid()) return vm.throwException(exec, createSyntaxError(exec, regExp->errorMessage())); return RegExpObject::create(vm, getRegExpStructure(exec, globalObject, newTarget), regExp); }
EncodedJSValue JSC_HOST_CALL regExpProtoFuncCompile(ExecState* exec) { JSValue thisValue = exec->hostThisValue(); if (!thisValue.inherits(&RegExpObject::s_info)) return throwVMTypeError(exec); RefPtr<RegExp> regExp; JSValue arg0 = exec->argument(0); JSValue arg1 = exec->argument(1); if (arg0.inherits(&RegExpObject::s_info)) { if (!arg1.isUndefined()) return throwVMError(exec, createTypeError(exec, "Cannot supply flags when constructing one RegExp from another.")); regExp = asRegExpObject(arg0)->regExp(); } else { UString pattern = !exec->argumentCount() ? UString("") : arg0.toString(exec); if (exec->hadException()) return JSValue::encode(jsUndefined()); RegExpFlags flags = NoFlags; if (!arg1.isUndefined()) { flags = regExpFlags(arg1.toString(exec)); if (exec->hadException()) return JSValue::encode(jsUndefined()); if (flags == InvalidFlags) return throwVMError(exec, createSyntaxError(exec, "Invalid flags supplied to RegExp constructor.")); } regExp = exec->globalData().regExpCache()->lookupOrCreate(pattern, flags); } if (!regExp->isValid()) return throwVMError(exec, createSyntaxError(exec, regExp->errorMessage())); asRegExpObject(thisValue)->setRegExp(regExp.release()); asRegExpObject(thisValue)->setLastIndex(0); return JSValue::encode(jsUndefined()); }