to_rust_cow_lossy

This commit is contained in:
Luca Casonato 2024-11-11 15:32:02 +01:00
parent ac7fadce6f
commit 8baec0f34f
No known key found for this signature in database
GPG Key ID: 01A83EB62563811F
2 changed files with 20 additions and 24 deletions

View File

@ -1228,22 +1228,6 @@ void v8__String__ValueView__DESTRUCT(v8::String::ValueView* self) {
self->~ValueView();
}
bool v8__String__ValueView__is_one_byte(const v8::String::ValueView& self) {
return self.is_one_byte();
}
const void* v8__String__ValueView__data(const v8::String::ValueView& self) {
if (self.is_one_byte()) {
return reinterpret_cast<const void*>(self.data8());
} else {
return reinterpret_cast<const void*>(self.data16());
}
}
int v8__String__ValueView__length(const v8::String::ValueView& self) {
return self.length();
}
const v8::Symbol* v8__Symbol__New(v8::Isolate* isolate,
const v8::String* description) {
return local_to_ptr(v8::Symbol::New(isolate, ptr_to_local(description)));

View File

@ -10,6 +10,7 @@ use crate::String;
use std::borrow::Cow;
use std::convert::TryInto;
use std::default::Default;
use std::ffi::c_int;
use std::ffi::c_void;
use std::hint::unreachable_unchecked;
use std::marker::PhantomData;
@ -124,9 +125,14 @@ extern "C" {
string: *const String,
);
fn v8__String__ValueView__DESTRUCT(this: *mut ValueView);
fn v8__String__ValueView__is_one_byte(this: *const ValueView) -> bool;
fn v8__String__ValueView__data(this: *const ValueView) -> *const c_void;
fn v8__String__ValueView__length(this: *const ValueView) -> int;
}
#[repr(C)]
struct ValueViewRaw {
flat_str: Local<'static, String>,
data: *const c_void,
length: c_int,
is_one_byte: bool,
}
#[derive(PartialEq, Debug)]
@ -1170,12 +1176,18 @@ impl<'s> ValueView<'s> {
#[inline(always)]
pub fn data(&self) -> ValueViewData<'_> {
unsafe {
let data = v8__String__ValueView__data(self);
let length = v8__String__ValueView__length(self) as usize;
if v8__String__ValueView__is_one_byte(self) {
ValueViewData::OneByte(std::slice::from_raw_parts(data as _, length))
let this = &*(self as *const _ as *const ValueViewRaw);
let length = this.length as usize;
if this.is_one_byte {
ValueViewData::OneByte(std::slice::from_raw_parts(
this.data as _,
length,
))
} else {
ValueViewData::TwoByte(std::slice::from_raw_parts(data as _, length))
ValueViewData::TwoByte(std::slice::from_raw_parts(
this.data as _,
length,
))
}
}
}