From db722516a0ca04d7331a5ae8b3f929f8b65cc3f1 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Thu, 2 Jan 2025 16:19:37 +0100 Subject: [PATCH 1/9] feat: add bindings for RegExp --- src/lib.rs | 2 ++ src/regexp.rs | 73 +++++++++++++++++++++++++++++++++++++++++++++++ tests/test_api.rs | 33 +++++++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 src/regexp.rs diff --git a/src/lib.rs b/src/lib.rs index bf875f3c9c..f83a791433 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -63,6 +63,7 @@ mod property_descriptor; mod property_filter; mod property_handler_flags; mod proxy; +mod regexp; mod scope; mod script; mod script_or_module; @@ -138,6 +139,7 @@ pub use property_attribute::*; pub use property_descriptor::*; pub use property_filter::*; pub use property_handler_flags::*; +pub use regexp::RegExpCreationFlags; pub use scope::AllowJavascriptExecutionScope; pub use scope::CallbackScope; pub use scope::ContextScope; diff --git a/src/regexp.rs b/src/regexp.rs new file mode 100644 index 0000000000..9845d18b9e --- /dev/null +++ b/src/regexp.rs @@ -0,0 +1,73 @@ +use crate::support::int; +use crate::Context; +use crate::HandleScope; +use crate::Local; +use crate::Object; +use crate::RegExp; +use crate::String; + +bitflags! { + #[derive(Debug, Clone, Copy, PartialEq, Eq)] + #[repr(transparent)] + pub struct RegExpCreationFlags: int { + const GLOBAL = 1 << 0; + const IGNORE_CASE = 1 << 1; + const MULTILINE = 1 << 2; + const STICKY = 1 << 3; + const UNICODE = 1 << 4; + const DOT_ALL = 1 << 5; + const LINEAR = 1 << 6; + const HAS_INDICES = 1 << 7; + const UNICODE_SETS = 1 << 8; + } +} + +extern "C" { + fn v8__RegExp__New( + context: *const Context, + pattern: *const String, + flags: *const RegExpCreationFlags, + ) -> *const RegExp; + fn v8__RegExp__Exec( + this: *const RegExp, + context: *const Context, + subject: *const String, + ) -> *const Object; + fn v8__RegExp__GetSource(this: *const RegExp) -> *const String; +} + +impl RegExp { + #[inline(always)] + pub fn new<'s>( + scope: &mut HandleScope<'s>, + pattern: Local, + flags: RegExpCreationFlags, + ) -> Option> { + unsafe { + scope.cast_local(|sd| { + v8__RegExp__New(sd.get_current_context(), &*pattern, &*flags) + }) + } + } + + #[inline(always)] + pub fn exec<'s>( + &self, + scope: &mut HandleScope<'s>, + subject: Local, + ) -> Option> { + unsafe { + scope.cast_local(|sd| { + v8__RegExp__Exec(self, sd.get_current_context(), &*subject) + }) + } + } + + #[inline(always)] + pub fn get_source<'s>( + &self, + scope: &mut HandleScope<'s>, + ) -> Local<'s, String> { + unsafe { scope.cast_local(|_| v8__RegExp__GetSource(self)) }.unwrap() + } +} diff --git a/tests/test_api.rs b/tests/test_api.rs index 06f4d493db..20f6c22236 100644 --- a/tests/test_api.rs +++ b/tests/test_api.rs @@ -12006,3 +12006,36 @@ fn test_eternals() { assert!(eternal1.is_empty()); eternal1.clear(); } + +#[test] +fn test_regexp() { + let _setup_guard = setup::parallel_test(); + + let mut isolate = v8::Isolate::new(Default::default()); + let mut scope = v8::HandleScope::new(&mut isolate); + let context = v8::Context::new(&mut scope, Default::default()); + let scope = &mut v8::ContextScope::new(&mut scope, context); + + let pattern = v8::String::new(scope, "ab+c").unwrap(); + let regexp = + v8::RegExp::new(scope, pattern, v8::RegExpCreationFlags::empty()).unwrap(); + assert_eq!(regexp.get_source(scope).to_rust_string_lossy(scope), "ab+c"); + + let subject = v8::String::new(scope, "abbbc").unwrap(); + let result = regexp.exec(scope, subject).unwrap(); + + let full = result.get_index(scope, 0).unwrap(); + assert_eq!(full.to_rust_string_lossy(scope), "abbbc"); + + let index_key = v8::String::new(scope, "index").unwrap(); + let index = result.get(scope, index_key.into()).unwrap(); + assert_eq!(index.number_value(scope).unwrap(), 0.0); + + let input_key = v8::String::new(scope, "input").unwrap(); + let input = result.get(scope, input_key.into()).unwrap(); + assert_eq!(input.to_rust_string_lossy(scope), "abbbc"); + + let groups_key = v8::String::new(scope, "groups").unwrap(); + let groups = result.get(scope, groups_key.into()).unwrap(); + assert!(groups.is_undefined()); +} From 9ddf9898eeb14a51dc238b81d6cde59b9d32efec Mon Sep 17 00:00:00 2001 From: crowlkats Date: Thu, 2 Jan 2025 16:28:25 +0100 Subject: [PATCH 2/9] fix --- src/regexp.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/regexp.rs b/src/regexp.rs index 9845d18b9e..cd978d7080 100644 --- a/src/regexp.rs +++ b/src/regexp.rs @@ -26,7 +26,7 @@ extern "C" { fn v8__RegExp__New( context: *const Context, pattern: *const String, - flags: *const RegExpCreationFlags, + flags: RegExpCreationFlags, ) -> *const RegExp; fn v8__RegExp__Exec( this: *const RegExp, @@ -45,7 +45,7 @@ impl RegExp { ) -> Option> { unsafe { scope.cast_local(|sd| { - v8__RegExp__New(sd.get_current_context(), &*pattern, &*flags) + v8__RegExp__New(sd.get_current_context(), &*pattern, flags) }) } } From 1e0c12a92e479dff0c138bec3c861820a7933d86 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Thu, 2 Jan 2025 16:54:00 +0100 Subject: [PATCH 3/9] add too binding.cc --- src/binding.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/binding.cc b/src/binding.cc index cad27ec22c..825f98f201 100644 --- a/src/binding.cc +++ b/src/binding.cc @@ -2367,6 +2367,24 @@ bool v8__PropertyCallbackInfo__ShouldThrowOnError( return self.ShouldThrowOnError(); } +const v8::RegExp* v8__RegExp__new(const v8::Context& context, + const v8::String& pattern, + int options) { + return maybe_local_to_ptr(v8::RegExp::New( + ptr_to_local(&context), ptr_to_local(&pattern), options)); +} + +const v8::Object* v8__RegExp__Exec(const v8::RegExp& self, + const v8::Context& context, + const v8::String& subject) { + return maybe_local_to_ptr(self.Exec( + ptr_to_local(&context), ptr_to_local(&subject))); +} + +const v8::String* v8__RegExp__GetSource(const v8::RegExp& self) { + return local_to_ptr(self.get_source()); +} + void v8__ReturnValue__Value__Set(v8::ReturnValue* self, const v8::Value& value) { self->Set(ptr_to_local(&value)); From 163445056c52e3e8381c4fe639521c8d1b011b31 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Thu, 2 Jan 2025 17:10:11 +0100 Subject: [PATCH 4/9] fmt --- src/binding.cc | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/binding.cc b/src/binding.cc index 825f98f201..ef685dd6df 100644 --- a/src/binding.cc +++ b/src/binding.cc @@ -2368,17 +2368,16 @@ bool v8__PropertyCallbackInfo__ShouldThrowOnError( } const v8::RegExp* v8__RegExp__new(const v8::Context& context, - const v8::String& pattern, - int options) { - return maybe_local_to_ptr(v8::RegExp::New( - ptr_to_local(&context), ptr_to_local(&pattern), options)); + const v8::String& pattern, int options) { + return maybe_local_to_ptr( + v8::RegExp::New(ptr_to_local(&context), ptr_to_local(&pattern), options)); } const v8::Object* v8__RegExp__Exec(const v8::RegExp& self, const v8::Context& context, const v8::String& subject) { - return maybe_local_to_ptr(self.Exec( - ptr_to_local(&context), ptr_to_local(&subject))); + return maybe_local_to_ptr( + self.Exec(ptr_to_local(&context), ptr_to_local(&subject))); } const v8::String* v8__RegExp__GetSource(const v8::RegExp& self) { From 4e7f973f46cb22c2c65121e0e6d858cd04a04c7b Mon Sep 17 00:00:00 2001 From: crowlkats Date: Thu, 2 Jan 2025 17:33:10 +0100 Subject: [PATCH 5/9] some fixes --- src/binding.cc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/binding.cc b/src/binding.cc index ef685dd6df..1ba66fd022 100644 --- a/src/binding.cc +++ b/src/binding.cc @@ -2373,15 +2373,14 @@ const v8::RegExp* v8__RegExp__new(const v8::Context& context, v8::RegExp::New(ptr_to_local(&context), ptr_to_local(&pattern), options)); } -const v8::Object* v8__RegExp__Exec(const v8::RegExp& self, - const v8::Context& context, - const v8::String& subject) { +v8::Object* v8__RegExp__Exec(const v8::RegExp& self, const v8::Context& context, + const v8::String& subject) { return maybe_local_to_ptr( self.Exec(ptr_to_local(&context), ptr_to_local(&subject))); } const v8::String* v8__RegExp__GetSource(const v8::RegExp& self) { - return local_to_ptr(self.get_source()); + return local_to_ptr(self.GetSource()); } void v8__ReturnValue__Value__Set(v8::ReturnValue* self, From 0e250b35b1b7165f48f9d491e0c6b5920d91f569 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Thu, 2 Jan 2025 17:42:41 +0100 Subject: [PATCH 6/9] another fix --- src/binding.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/binding.cc b/src/binding.cc index 1ba66fd022..281cc2eda7 100644 --- a/src/binding.cc +++ b/src/binding.cc @@ -2373,8 +2373,8 @@ const v8::RegExp* v8__RegExp__new(const v8::Context& context, v8::RegExp::New(ptr_to_local(&context), ptr_to_local(&pattern), options)); } -v8::Object* v8__RegExp__Exec(const v8::RegExp& self, const v8::Context& context, - const v8::String& subject) { +const v8::Object* v8__RegExp__Exec(v8::RegExp& self, const v8::Context& context, + const v8::String& subject) { return maybe_local_to_ptr( self.Exec(ptr_to_local(&context), ptr_to_local(&subject))); } From 373b06eb5812e344573bd4c591e8452474e414d0 Mon Sep 17 00:00:00 2001 From: Leo Kettmeir Date: Thu, 2 Jan 2025 22:05:49 -0800 Subject: [PATCH 7/9] Update src/binding.cc Co-authored-by: Divy Srivastava --- src/binding.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/binding.cc b/src/binding.cc index 281cc2eda7..2346dcd70c 100644 --- a/src/binding.cc +++ b/src/binding.cc @@ -2368,7 +2368,7 @@ bool v8__PropertyCallbackInfo__ShouldThrowOnError( } const v8::RegExp* v8__RegExp__new(const v8::Context& context, - const v8::String& pattern, int options) { + const v8::String& pattern, v8::RegExp::Flags options) { return maybe_local_to_ptr( v8::RegExp::New(ptr_to_local(&context), ptr_to_local(&pattern), options)); } From 39ed219fca1c4c0043c573d1fed70410d53a0a04 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Fri, 3 Jan 2025 07:16:26 +0100 Subject: [PATCH 8/9] fmt --- src/binding.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/binding.cc b/src/binding.cc index 2346dcd70c..0204efb034 100644 --- a/src/binding.cc +++ b/src/binding.cc @@ -2368,9 +2368,10 @@ bool v8__PropertyCallbackInfo__ShouldThrowOnError( } const v8::RegExp* v8__RegExp__new(const v8::Context& context, - const v8::String& pattern, v8::RegExp::Flags options) { + const v8::String& pattern, + v8::RegExp::Flags flags) { return maybe_local_to_ptr( - v8::RegExp::New(ptr_to_local(&context), ptr_to_local(&pattern), options)); + v8::RegExp::New(ptr_to_local(&context), ptr_to_local(&pattern), flags)); } const v8::Object* v8__RegExp__Exec(v8::RegExp& self, const v8::Context& context, From dda19084974f400b003ddf6c91c72a677303c274 Mon Sep 17 00:00:00 2001 From: crowlkats Date: Fri, 3 Jan 2025 07:31:43 +0100 Subject: [PATCH 9/9] fix --- src/binding.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/binding.cc b/src/binding.cc index 0204efb034..15b7cced6c 100644 --- a/src/binding.cc +++ b/src/binding.cc @@ -2367,7 +2367,7 @@ bool v8__PropertyCallbackInfo__ShouldThrowOnError( return self.ShouldThrowOnError(); } -const v8::RegExp* v8__RegExp__new(const v8::Context& context, +const v8::RegExp* v8__RegExp__New(const v8::Context& context, const v8::String& pattern, v8::RegExp::Flags flags) { return maybe_local_to_ptr(