summaryrefslogtreecommitdiff
path: root/ext/url
diff options
context:
space:
mode:
authorDivy Srivastava <dj.srivastava23@gmail.com>2023-03-03 19:04:10 +0530
committerGitHub <noreply@github.com>2023-03-03 19:04:10 +0530
commit38555a6a0fe9a7235776afe0ebfb2a24dc518391 (patch)
treeef9506c500451e5f2ef4ae5b70eda85c7147a25e /ext/url
parent64503fabd81e38c58d44d23ae94f5b87a384b86e (diff)
feat(ops): reland fast zero copy string arguments (#17996)
Reland https://github.com/denoland/deno/pull/16777 The codegen is disabled in async ops and when fallback to slow call is possible (return type is a Result) to avoid hitting this V8 bug: https://github.com/denoland/deno/issues/17159
Diffstat (limited to 'ext/url')
-rw-r--r--ext/url/00_url.js6
-rw-r--r--ext/url/lib.rs19
2 files changed, 12 insertions, 13 deletions
diff --git a/ext/url/00_url.js b/ext/url/00_url.js
index da5849d43..3c3f2b1d0 100644
--- a/ext/url/00_url.js
+++ b/ext/url/00_url.js
@@ -46,7 +46,7 @@ function opUrlReparse(href, setter, value) {
href,
setter,
value,
- componentsBuf.buffer,
+ componentsBuf,
);
return getSerialization(status, href);
}
@@ -54,12 +54,12 @@ function opUrlReparse(href, setter, value) {
function opUrlParse(href, maybeBase) {
let status;
if (maybeBase === undefined) {
- status = ops.op_url_parse(href, componentsBuf.buffer);
+ status = ops.op_url_parse(href, componentsBuf);
} else {
status = ops.op_url_parse_with_base(
href,
maybeBase,
- componentsBuf.buffer,
+ componentsBuf,
);
}
return getSerialization(status, href, maybeBase);
diff --git a/ext/url/lib.rs b/ext/url/lib.rs
index 087ccbfe7..4f15cb924 100644
--- a/ext/url/lib.rs
+++ b/ext/url/lib.rs
@@ -38,11 +38,11 @@ pub fn init() -> Extension {
#[op]
pub fn op_url_parse_with_base(
state: &mut OpState,
- href: String,
- base_href: String,
- buf: &mut [u8],
+ href: &str,
+ base_href: &str,
+ buf: &mut [u32],
) -> u32 {
- let base_url = match Url::parse(&base_href) {
+ let base_url = match Url::parse(base_href) {
Ok(url) => url,
Err(_) => return ParseStatus::Err as u32,
};
@@ -64,8 +64,8 @@ pub fn op_url_get_serialization(state: &mut OpState) -> String {
}
/// Parse `href` without a `base_url`. Fills the out `buf` with URL components.
-#[op]
-pub fn op_url_parse(state: &mut OpState, href: String, buf: &mut [u8]) -> u32 {
+#[op(fast)]
+pub fn op_url_parse(state: &mut OpState, href: &str, buf: &mut [u32]) -> u32 {
parse_url(state, href, None, buf)
}
@@ -96,15 +96,14 @@ pub fn op_url_parse(state: &mut OpState, href: String, buf: &mut [u8]) -> u32 {
#[inline]
fn parse_url(
state: &mut OpState,
- href: String,
+ href: &str,
base_href: Option<&Url>,
- buf: &mut [u8],
+ buf: &mut [u32],
) -> u32 {
- match Url::options().base_url(base_href).parse(&href) {
+ match Url::options().base_url(base_href).parse(href) {
Ok(url) => {
let inner_url = quirks::internal_components(&url);
- let buf: &mut [u32] = as_u32_slice(buf);
buf[0] = inner_url.scheme_end;
buf[1] = inner_url.username_end;
buf[2] = inner_url.host_start;