1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 07:14:47 -05:00

chore(ext/node): use array instead of Vec to avoid wrong capacity allocation (#25183)

This commit gets deno_node's customizer to use fixed-length array
instead of `Vec` to avoid wrong capacity allocation.

In the previous code we reserve a capacity of 14 for
`external_references`. However, after pushing all the necessary
`ExternalReference`s, it ends up with a length of 21, not 14. This means
another allocation happens even though we reserve some space.

To make sure that there will no longer be extra allocation, it should be
a good idea to use fixed-length array here.
This commit is contained in:
Yusuke Tanaka 2024-08-24 09:41:49 +09:00 committed by GitHub
parent 2ab4afc6b8
commit b0ea6e0dc7
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -633,115 +633,116 @@ deno_core::extension!(deno_node,
global_template_middleware = global_template_middleware, global_template_middleware = global_template_middleware,
global_object_middleware = global_object_middleware, global_object_middleware = global_object_middleware,
customizer = |ext: &mut deno_core::Extension| { customizer = |ext: &mut deno_core::Extension| {
let mut external_references = Vec::with_capacity(14); let external_references = [
vm::QUERY_MAP_FN.with(|query| {
ExternalReference {
named_query: *query,
}
}),
vm::GETTER_MAP_FN.with(|getter| {
ExternalReference {
named_getter: *getter,
}
}),
vm::SETTER_MAP_FN.with(|setter| {
ExternalReference {
named_setter: *setter,
}
}),
vm::DESCRIPTOR_MAP_FN.with(|descriptor| {
ExternalReference {
named_getter: *descriptor,
}
}),
vm::DELETER_MAP_FN.with(|deleter| {
ExternalReference {
named_deleter: *deleter,
}
}),
vm::ENUMERATOR_MAP_FN.with(|enumerator| {
ExternalReference {
enumerator: *enumerator,
}
}),
vm::DEFINER_MAP_FN.with(|definer| {
ExternalReference {
named_definer: *definer,
}
}),
vm::QUERY_MAP_FN.with(|query| { vm::INDEXED_QUERY_MAP_FN.with(|query| {
external_references.push(ExternalReference { ExternalReference {
named_query: *query, indexed_query: *query,
}); }
}); }),
vm::GETTER_MAP_FN.with(|getter| { vm::INDEXED_GETTER_MAP_FN.with(|getter| {
external_references.push(ExternalReference { ExternalReference {
named_getter: *getter, indexed_getter: *getter,
}); }
}); }),
vm::SETTER_MAP_FN.with(|setter| { vm::INDEXED_SETTER_MAP_FN.with(|setter| {
external_references.push(ExternalReference { ExternalReference {
named_setter: *setter, indexed_setter: *setter,
}); }
}); }),
vm::DESCRIPTOR_MAP_FN.with(|descriptor| { vm::INDEXED_DESCRIPTOR_MAP_FN.with(|descriptor| {
external_references.push(ExternalReference { ExternalReference {
named_getter: *descriptor, indexed_getter: *descriptor,
}); }
}); }),
vm::DELETER_MAP_FN.with(|deleter| { vm::INDEXED_DELETER_MAP_FN.with(|deleter| {
external_references.push(ExternalReference { ExternalReference {
named_deleter: *deleter, indexed_deleter: *deleter,
}); }
}); }),
vm::ENUMERATOR_MAP_FN.with(|enumerator| { vm::INDEXED_DEFINER_MAP_FN.with(|definer| {
external_references.push(ExternalReference { ExternalReference {
enumerator: *enumerator, indexed_definer: *definer,
}); }
}); }),
vm::DEFINER_MAP_FN.with(|definer| { vm::INDEXED_ENUMERATOR_MAP_FN.with(|enumerator| {
external_references.push(ExternalReference { ExternalReference {
named_definer: *definer, enumerator: *enumerator,
}); }
}); }),
vm::INDEXED_QUERY_MAP_FN.with(|query| { global::GETTER_MAP_FN.with(|getter| {
external_references.push(ExternalReference { ExternalReference {
indexed_query: *query, named_getter: *getter,
}); }
}); }),
vm::INDEXED_GETTER_MAP_FN.with(|getter| { global::SETTER_MAP_FN.with(|setter| {
external_references.push(ExternalReference { ExternalReference {
indexed_getter: *getter, named_setter: *setter,
}); }
}); }),
vm::INDEXED_SETTER_MAP_FN.with(|setter| { global::QUERY_MAP_FN.with(|query| {
external_references.push(ExternalReference { ExternalReference {
indexed_setter: *setter, named_query: *query,
}); }
}); }),
vm::INDEXED_DESCRIPTOR_MAP_FN.with(|descriptor| { global::DELETER_MAP_FN.with(|deleter| {
external_references.push(ExternalReference { ExternalReference {
indexed_getter: *descriptor, named_deleter: *deleter,
}); }
}); }),
vm::INDEXED_DELETER_MAP_FN.with(|deleter| { global::ENUMERATOR_MAP_FN.with(|enumerator| {
external_references.push(ExternalReference { ExternalReference {
indexed_deleter: *deleter, enumerator: *enumerator,
}); }
}); }),
vm::INDEXED_DEFINER_MAP_FN.with(|definer| { global::DEFINER_MAP_FN.with(|definer| {
external_references.push(ExternalReference { ExternalReference {
indexed_definer: *definer, named_definer: *definer,
}); }
}); }),
vm::INDEXED_ENUMERATOR_MAP_FN.with(|enumerator| { global::DESCRIPTOR_MAP_FN.with(|descriptor| {
external_references.push(ExternalReference { ExternalReference {
enumerator: *enumerator, named_getter: *descriptor,
}); }
}); }),
];
global::GETTER_MAP_FN.with(|getter| {
external_references.push(ExternalReference {
named_getter: *getter,
});
});
global::SETTER_MAP_FN.with(|setter| {
external_references.push(ExternalReference {
named_setter: *setter,
});
});
global::QUERY_MAP_FN.with(|query| {
external_references.push(ExternalReference {
named_query: *query,
});
});
global::DELETER_MAP_FN.with(|deleter| {
external_references.push(ExternalReference {
named_deleter: *deleter,
});
});
global::ENUMERATOR_MAP_FN.with(|enumerator| {
external_references.push(ExternalReference {
enumerator: *enumerator,
});
});
global::DEFINER_MAP_FN.with(|definer| {
external_references.push(ExternalReference {
named_definer: *definer,
});
});
global::DESCRIPTOR_MAP_FN.with(|descriptor| {
external_references.push(ExternalReference {
named_getter: *descriptor,
});
});
ext.external_references.to_mut().extend(external_references); ext.external_references.to_mut().extend(external_references);
}, },
); );