Skip to content

Commit 46bab7d

Browse files
committed
Remove dynamic allocation with numbers
1 parent 529144b commit 46bab7d

35 files changed

+391
-223
lines changed

crates/rune-modules/src/rand/macros.rs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,13 +256,25 @@ macro_rules! random_ranges {
256256
let range = value.borrow_ref::<RangeInclusive>()?;
257257
let start = $as(&range.start)?;
258258
let end = $as(&range.end)?;
259-
rand::Rng::random_range(&mut this.inner, start..=end)
259+
let range = start..=end;
260+
261+
if range.is_empty() {
262+
return Err(VmError::panic("cannot sample empty range"));
263+
}
264+
265+
rand::Rng::random_range(&mut this.inner, range)
260266
}
261267
Range::HASH => {
262268
let range = value.borrow_ref::<Range>()?;
263269
let start = $as(&range.start)?;
264270
let end = $as(&range.end)?;
265-
rand::Rng::random_range(&mut this.inner, start..end)
271+
let range = start..end;
272+
273+
if range.is_empty() {
274+
return Err(VmError::panic("cannot sample empty range"));
275+
}
276+
277+
rand::Rng::random_range(&mut this.inner, range)
266278
}
267279
_ => {
268280
return Err(VmError::panic("unsupported range"));

crates/rune/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ byte-code = ["alloc", "musli", "dep:musli", "musli/storage", "musli/std", "rune-
2929
capture-io = ["alloc", "parking_lot"]
3030
disable-io = ["alloc"]
3131
fmt = ["alloc", "anyhow"]
32-
std = ["alloc", "num/std", "serde/std", "rune-core/std", "rune-alloc/std", "musli?/std", "once_cell/std", "anyhow?/std", "syntree/std", "tokio?/io-std"]
32+
std = ["alloc", "serde/std", "rune-core/std", "rune-alloc/std", "musli?/std", "once_cell/std", "anyhow?/std", "syntree/std", "tokio?/io-std"]
3333
alloc = ["rune-alloc/alloc", "rune-core/alloc", "once_cell/alloc", "serde?/alloc"]
3434
musli = ["dep:musli-core", "rune-core/musli", "rune-alloc/musli"]
3535
serde = ["dep:serde", "rune-alloc/serde", "relative-path?/serde"]
@@ -44,7 +44,6 @@ syntree = { version = "0.18.0", default-features = false, features = ["alloc"] }
4444
futures-core = { version = "0.3.28", default-features = false }
4545
futures-util = { version = "0.3.28", default-features = false, features = ["alloc"] }
4646
itoa = "1.0.6"
47-
num = { version = "0.4.0", default-features = false, features = ["alloc"] }
4847
pin-project = "1.1.0"
4948
ryu = "1.0.13"
5049
serde = { version = "1.0.163", default-features = false, optional = true, features = ["derive", "rc"] }

crates/rune/src/ast/expr_object.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ impl Parse for ObjectKey {
114114
impl<'a> Resolve<'a> for ObjectKey {
115115
type Output = Cow<'a, str>;
116116

117-
fn resolve(&self, cx: ResolveContext<'a>) -> Result<Self::Output> {
117+
fn resolve(&self, cx: ResolveContext<'a, '_>) -> Result<Self::Output> {
118118
Ok(match self {
119119
Self::LitStr(lit_str) => lit_str.resolve(cx)?,
120120
Self::Path(path) => {

crates/rune/src/ast/ident.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ impl Peek for Ident {
7676
impl<'a> Resolve<'a> for Ident {
7777
type Output = &'a str;
7878

79-
fn resolve(&self, cx: ResolveContext<'a>) -> Result<&'a str> {
79+
fn resolve(&self, cx: ResolveContext<'a, '_>) -> Result<&'a str> {
8080
let span = self.span;
8181

8282
match self.source {

crates/rune/src/ast/label.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ impl Peek for Label {
7272
impl<'a> Resolve<'a> for Label {
7373
type Output = &'a str;
7474

75-
fn resolve(&self, cx: ResolveContext<'a>) -> Result<&'a str> {
75+
fn resolve(&self, cx: ResolveContext<'a, '_>) -> Result<&'a str> {
7676
let span = self.span;
7777

7878
match self.source {

crates/rune/src/ast/lit_byte.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl Parse for LitByte {
5454
impl<'a> Resolve<'a> for LitByte {
5555
type Output = u8;
5656

57-
fn resolve(&self, cx: ResolveContext<'a>) -> Result<u8> {
57+
fn resolve(&self, cx: ResolveContext<'a, '_>) -> Result<u8> {
5858
let source_id = match self.source {
5959
ast::CopySource::Inline(b) => return Ok(b),
6060
ast::CopySource::Text(source_id) => source_id,

crates/rune/src/ast/lit_byte_str.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ impl Parse for LitByteStr {
9090
impl<'a> Resolve<'a> for LitByteStr {
9191
type Output = Cow<'a, [u8]>;
9292

93-
fn resolve(&self, cx: ResolveContext<'a>) -> Result<Cow<'a, [u8]>> {
93+
fn resolve(&self, cx: ResolveContext<'a, '_>) -> Result<Cow<'a, [u8]>> {
9494
let span = self.span;
9595

9696
let text = match self.source {

crates/rune/src/ast/lit_char.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl Parse for LitChar {
5454
impl<'a> Resolve<'a> for LitChar {
5555
type Output = char;
5656

57-
fn resolve(&self, cx: ResolveContext<'a>) -> Result<char> {
57+
fn resolve(&self, cx: ResolveContext<'a, '_>) -> Result<char> {
5858
let source_id = match self.source {
5959
ast::CopySource::Inline(c) => return Ok(c),
6060
ast::CopySource::Text(source_id) => source_id,

crates/rune/src/ast/lit_number.rs

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::ast::prelude::*;
2+
use crate::compile::{num, WithSpan};
23

34
use ast::token::NumberSize;
4-
use num::Num;
55

66
#[test]
77
#[cfg(not(miri))]
@@ -59,11 +59,7 @@ impl Parse for LitNumber {
5959
impl<'a> Resolve<'a> for LitNumber {
6060
type Output = ast::Number;
6161

62-
fn resolve(&self, cx: ResolveContext<'a>) -> Result<ast::Number> {
63-
fn err_span<E>(span: Span) -> impl Fn(E) -> compile::Error {
64-
move |_| compile::Error::new(span, ErrorKind::BadNumberLiteral)
65-
}
66-
62+
fn resolve(&self, cx: ResolveContext<'a, '_>) -> Result<ast::Number> {
6763
let span = self.span;
6864

6965
let text = match self.source {
@@ -116,28 +112,27 @@ impl<'a> Resolve<'a> for LitNumber {
116112
(suffix, text.is_fractional),
117113
(Some(ast::NumberSuffix::Float(..)), _) | (None, true)
118114
) {
119-
let number: f64 = string
120-
.trim_matches(|c: char| c == '_')
121-
.parse()
122-
.map_err(err_span(span))?;
115+
let number: f64 = num::from_float(cx.scratch, string).with_span(span)?;
123116

124117
return Ok(ast::Number {
125118
value: ast::NumberValue::Float(number),
126119
suffix,
127120
});
128121
}
129122

130-
let radix = match text.base {
131-
ast::NumberBase::Binary => 2,
132-
ast::NumberBase::Octal => 8,
133-
ast::NumberBase::Hex => 16,
134-
ast::NumberBase::Decimal => 10,
123+
let parser = match text.base {
124+
ast::NumberBase::Binary => num::from_ascii_binary,
125+
ast::NumberBase::Octal => num::from_ascii_octal,
126+
ast::NumberBase::Hex => num::from_ascii_hex,
127+
ast::NumberBase::Decimal => num::from_ascii_decimal,
135128
};
136129

137-
let number = num::BigInt::from_str_radix(string, radix).map_err(err_span(span))?;
130+
let number = parser(string.as_bytes())
131+
.ok_or_else(|| ErrorKind::BadNumberLiteral)
132+
.with_span(span)?;
138133

139134
Ok(ast::Number {
140-
value: ast::NumberValue::Integer(number),
135+
value: ast::NumberValue::Integer(number as i128),
141136
suffix,
142137
})
143138
}

crates/rune/src/ast/lit_str.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,20 +27,20 @@ impl LitStr {
2727
/// Resolve a template string.
2828
pub(crate) fn resolve_template_string<'a>(
2929
&self,
30-
cx: ResolveContext<'a>,
30+
cx: ResolveContext<'a, '_>,
3131
) -> Result<Cow<'a, str>> {
3232
self.resolve_inner(cx, ast::unescape::WithTemplate(true))
3333
}
3434

3535
/// Resolve as a regular string.
36-
pub(crate) fn resolve_string<'a>(&self, cx: ResolveContext<'a>) -> Result<Cow<'a, str>> {
36+
pub(crate) fn resolve_string<'a>(&self, cx: ResolveContext<'a, '_>) -> Result<Cow<'a, str>> {
3737
self.resolve_inner(cx, ast::unescape::WithTemplate(false))
3838
}
3939

4040
/// Resolve the given string with the specified configuration.
4141
fn resolve_inner<'a>(
4242
&self,
43-
cx: ResolveContext<'a>,
43+
cx: ResolveContext<'a, '_>,
4444
with_template: ast::unescape::WithTemplate,
4545
) -> Result<Cow<'a, str>> {
4646
let span = self.span;
@@ -150,7 +150,7 @@ impl Parse for LitStr {
150150
impl<'a> Resolve<'a> for LitStr {
151151
type Output = Cow<'a, str>;
152152

153-
fn resolve(&self, cx: ResolveContext<'a>) -> Result<Cow<'a, str>> {
153+
fn resolve(&self, cx: ResolveContext<'a, '_>) -> Result<Cow<'a, str>> {
154154
self.resolve_string(cx)
155155
}
156156
}

0 commit comments

Comments
 (0)