1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 02:37:35 +00:00

LibJS: Convert the RegExpInitialize AO to ThrowCompletionOr

This commit is contained in:
Idan Horowitz 2021-10-23 03:49:29 +03:00 committed by Andreas Kling
parent 35faf50941
commit d9f5e2d461
3 changed files with 11 additions and 15 deletions

View file

@ -140,7 +140,7 @@ void RegExpObject::initialize(GlobalObject& global_object)
} }
// 22.2.3.2.2 RegExpInitialize ( obj, pattern, flags ), https://tc39.es/ecma262/#sec-regexpinitialize // 22.2.3.2.2 RegExpInitialize ( obj, pattern, flags ), https://tc39.es/ecma262/#sec-regexpinitialize
RegExpObject* RegExpObject::regexp_initialize(GlobalObject& global_object, Value pattern, Value flags) ThrowCompletionOr<RegExpObject*> RegExpObject::regexp_initialize(GlobalObject& global_object, Value pattern, Value flags)
{ {
auto& vm = global_object.vm(); auto& vm = global_object.vm();
@ -148,7 +148,7 @@ RegExpObject* RegExpObject::regexp_initialize(GlobalObject& global_object, Value
if (flags.is_undefined()) { if (flags.is_undefined()) {
f = String::empty(); f = String::empty();
} else { } else {
f = TRY_OR_DISCARD(flags.to_string(global_object)); f = TRY(flags.to_string(global_object));
} }
String original_pattern; String original_pattern;
@ -158,28 +158,24 @@ RegExpObject* RegExpObject::regexp_initialize(GlobalObject& global_object, Value
original_pattern = String::empty(); original_pattern = String::empty();
parsed_pattern = String::empty(); parsed_pattern = String::empty();
} else { } else {
original_pattern = TRY_OR_DISCARD(pattern.to_string(global_object)); original_pattern = TRY(pattern.to_string(global_object));
bool unicode = f.find('u').has_value(); bool unicode = f.find('u').has_value();
parsed_pattern = parse_regex_pattern(original_pattern, unicode); parsed_pattern = parse_regex_pattern(original_pattern, unicode);
} }
auto parsed_flags_or_error = regex_flags_from_string(f); auto parsed_flags_or_error = regex_flags_from_string(f);
if (parsed_flags_or_error.is_error()) { if (parsed_flags_or_error.is_error())
vm.throw_exception(global_object, SyntaxError::create(global_object, parsed_flags_or_error.release_error())); return vm.throw_completion<SyntaxError>(global_object, parsed_flags_or_error.release_error());
return {};
}
Regex<ECMA262> regex(move(parsed_pattern), parsed_flags_or_error.release_value()); Regex<ECMA262> regex(move(parsed_pattern), parsed_flags_or_error.release_value());
if (regex.parser_result.error != regex::Error::NoError) { if (regex.parser_result.error != regex::Error::NoError)
vm.throw_exception<SyntaxError>(global_object, ErrorType::RegExpCompileError, regex.error_string()); return vm.throw_completion<SyntaxError>(global_object, ErrorType::RegExpCompileError, regex.error_string());
return {};
}
m_pattern = move(original_pattern); m_pattern = move(original_pattern);
m_flags = move(f); m_flags = move(f);
m_regex = move(regex); m_regex = move(regex);
TRY_OR_DISCARD(set(vm.names.lastIndex, Value(0), Object::ShouldThrowExceptions::Yes)); TRY(set(vm.names.lastIndex, Value(0), Object::ShouldThrowExceptions::Yes));
return this; return this;
} }
@ -197,7 +193,7 @@ String RegExpObject::escape_regexp_pattern() const
RegExpObject* regexp_create(GlobalObject& global_object, Value pattern, Value flags) RegExpObject* regexp_create(GlobalObject& global_object, Value pattern, Value flags)
{ {
auto* regexp_object = RegExpObject::create(global_object); auto* regexp_object = RegExpObject::create(global_object);
return regexp_object->regexp_initialize(global_object, pattern, flags); return TRY_OR_DISCARD(regexp_object->regexp_initialize(global_object, pattern, flags));
} }
} }

View file

@ -33,7 +33,7 @@ public:
RegExpObject(Object& prototype); RegExpObject(Object& prototype);
RegExpObject(Regex<ECMA262> regex, String pattern, String flags, Object& prototype); RegExpObject(Regex<ECMA262> regex, String pattern, String flags, Object& prototype);
RegExpObject* regexp_initialize(GlobalObject&, Value pattern, Value flags); ThrowCompletionOr<RegExpObject*> regexp_initialize(GlobalObject&, Value pattern, Value flags);
String escape_regexp_pattern() const; String escape_regexp_pattern() const;
virtual void initialize(GlobalObject&) override; virtual void initialize(GlobalObject&) override;

View file

@ -682,7 +682,7 @@ JS_DEFINE_OLD_NATIVE_FUNCTION(RegExpPrototype::compile)
flags_value = flags; flags_value = flags;
} }
return regexp_object->regexp_initialize(global_object, pattern_value, flags_value); return TRY_OR_DISCARD(regexp_object->regexp_initialize(global_object, pattern_value, flags_value));
} }
} }