Skip to content

Commit 1cf04d8

Browse files
authored
Merge pull request #352 from fox0/lazy
awk/calc: Remove lazy_static
2 parents 1dcd701 + 79b973f commit 1cf04d8

File tree

5 files changed

+209
-163
lines changed

5 files changed

+209
-163
lines changed

Cargo.lock

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

awk/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ clap.workspace = true
1212
libc.workspace = true
1313
pest = "2.7"
1414
pest_derive = "2.7"
15-
lazy_static = "1.4"
1615
lexical = { version = "6.1", features = ["format"] }
1716
rand = {version = "0.8", default-features = false, features = ["small_rng"] }
1817

awk/src/compiler.rs

Lines changed: 198 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -14,172 +14,224 @@ use crate::program::{
1414
SourceLocation, SpecialVar, VarId,
1515
};
1616
use crate::regex::Regex;
17+
1718
use pest::error::InputLocation;
18-
use pest::{
19-
iterators::{Pair, Pairs},
20-
pratt_parser::PrattParser,
21-
Parser,
22-
};
19+
use pest::iterators::{Pair, Pairs};
20+
use pest::pratt_parser::{Assoc, Op, PrattParser};
21+
use pest::Parser;
22+
use std::cell::{Cell, RefCell};
23+
use std::collections::HashMap;
2324
use std::ffi::CString;
25+
use std::hash::Hash;
2426
use std::rc::Rc;
2527
use std::str::Chars;
26-
use std::{
27-
cell::{Cell, RefCell},
28-
collections::HashMap,
29-
hash::Hash,
30-
};
28+
use std::sync::LazyLock;
3129

3230
struct BuiltinFunctionInfo {
3331
function: BuiltinFunction,
3432
min_args: u16,
3533
max_args: u16,
3634
}
3735

38-
lazy_static::lazy_static! {
39-
static ref BUILTIN_FUNCTIONS: HashMap<Rule, BuiltinFunctionInfo> = HashMap::from([
40-
(Rule::atan2, BuiltinFunctionInfo {
41-
function: BuiltinFunction::Atan2,
42-
min_args: 2,
43-
max_args: 2,
44-
}),
45-
(Rule::cos, BuiltinFunctionInfo {
46-
function: BuiltinFunction::Cos,
47-
min_args: 1,
48-
max_args: 1,
49-
}),
50-
(Rule::sin, BuiltinFunctionInfo {
51-
function: BuiltinFunction::Sin,
52-
min_args: 1,
53-
max_args: 1,
54-
}),
55-
(Rule::exp, BuiltinFunctionInfo {
56-
function: BuiltinFunction::Exp,
57-
min_args: 1,
58-
max_args: 1,
59-
}),
60-
(Rule::log, BuiltinFunctionInfo {
61-
function: BuiltinFunction::Log,
62-
min_args: 1,
63-
max_args: 1,
64-
}),
65-
(Rule::sqrt, BuiltinFunctionInfo {
66-
function: BuiltinFunction::Sqrt,
67-
min_args: 1,
68-
max_args: 1,
69-
}),
70-
(Rule::int, BuiltinFunctionInfo {
71-
function: BuiltinFunction::Int,
72-
min_args: 1,
73-
max_args: 1,
74-
}),
75-
(Rule::rand, BuiltinFunctionInfo {
76-
function: BuiltinFunction::Rand,
77-
min_args: 0,
78-
max_args: 0,
79-
}),
80-
(Rule::srand, BuiltinFunctionInfo {
81-
function: BuiltinFunction::Srand,
82-
min_args: 0,
83-
max_args: 1,
84-
}),
85-
86-
(Rule::gsub, BuiltinFunctionInfo {
87-
function: BuiltinFunction::Gsub,
88-
min_args: 2,
89-
max_args: 3,
90-
}),
91-
(Rule::index, BuiltinFunctionInfo {
92-
function: BuiltinFunction::Index,
93-
min_args: 2,
94-
max_args: 2,
95-
}),
96-
(Rule::length, BuiltinFunctionInfo {
97-
function: BuiltinFunction::Length,
98-
min_args: 0,
99-
max_args: 1,
100-
}),
101-
(Rule::match_fn, BuiltinFunctionInfo {
102-
function: BuiltinFunction::Match,
103-
min_args: 2,
104-
max_args: 2,
105-
}),
106-
(Rule::split, BuiltinFunctionInfo {
107-
function: BuiltinFunction::Split,
108-
min_args: 2,
109-
max_args: 3,
110-
}),
111-
(Rule::sprintf, BuiltinFunctionInfo {
112-
function: BuiltinFunction::Sprintf,
113-
min_args: 1,
114-
max_args: u16::MAX,
115-
}),
116-
(Rule::sub, BuiltinFunctionInfo {
117-
function: BuiltinFunction::Sub,
118-
min_args: 2,
119-
max_args: 3,
120-
}),
121-
(Rule::substr, BuiltinFunctionInfo {
122-
function: BuiltinFunction::Substr,
123-
min_args: 2,
124-
max_args: 3,
125-
}),
126-
(Rule::tolower, BuiltinFunctionInfo {
127-
function: BuiltinFunction::ToLower,
128-
min_args: 1,
129-
max_args: 1,
130-
}),
131-
(Rule::toupper, BuiltinFunctionInfo {
132-
function: BuiltinFunction::ToUpper,
133-
min_args: 1,
134-
max_args: 1,
135-
}),
136-
137-
(Rule::close, BuiltinFunctionInfo {
138-
function: BuiltinFunction::Close,
139-
min_args: 1,
140-
max_args: 1,
141-
}),
142-
(Rule::fflush, BuiltinFunctionInfo {
143-
function: BuiltinFunction::FFlush,
144-
min_args: 0,
145-
max_args: 1,
146-
}),
147-
(Rule::system, BuiltinFunctionInfo {
148-
function: BuiltinFunction::System,
149-
min_args: 1,
150-
max_args: 1,
151-
})
152-
]);
153-
}
154-
155-
lazy_static::lazy_static! {
156-
static ref PRATT_PARSER: PrattParser<Rule> = {
157-
use pest::pratt_parser::{Assoc, Op};
36+
static BUILTIN_FUNCTIONS: LazyLock<HashMap<Rule, BuiltinFunctionInfo>> = LazyLock::new(|| {
37+
HashMap::from([
38+
(
39+
Rule::atan2,
40+
BuiltinFunctionInfo {
41+
function: BuiltinFunction::Atan2,
42+
min_args: 2,
43+
max_args: 2,
44+
},
45+
),
46+
(
47+
Rule::cos,
48+
BuiltinFunctionInfo {
49+
function: BuiltinFunction::Cos,
50+
min_args: 1,
51+
max_args: 1,
52+
},
53+
),
54+
(
55+
Rule::sin,
56+
BuiltinFunctionInfo {
57+
function: BuiltinFunction::Sin,
58+
min_args: 1,
59+
max_args: 1,
60+
},
61+
),
62+
(
63+
Rule::exp,
64+
BuiltinFunctionInfo {
65+
function: BuiltinFunction::Exp,
66+
min_args: 1,
67+
max_args: 1,
68+
},
69+
),
70+
(
71+
Rule::log,
72+
BuiltinFunctionInfo {
73+
function: BuiltinFunction::Log,
74+
min_args: 1,
75+
max_args: 1,
76+
},
77+
),
78+
(
79+
Rule::sqrt,
80+
BuiltinFunctionInfo {
81+
function: BuiltinFunction::Sqrt,
82+
min_args: 1,
83+
max_args: 1,
84+
},
85+
),
86+
(
87+
Rule::int,
88+
BuiltinFunctionInfo {
89+
function: BuiltinFunction::Int,
90+
min_args: 1,
91+
max_args: 1,
92+
},
93+
),
94+
(
95+
Rule::rand,
96+
BuiltinFunctionInfo {
97+
function: BuiltinFunction::Rand,
98+
min_args: 0,
99+
max_args: 0,
100+
},
101+
),
102+
(
103+
Rule::srand,
104+
BuiltinFunctionInfo {
105+
function: BuiltinFunction::Srand,
106+
min_args: 0,
107+
max_args: 1,
108+
},
109+
),
110+
(
111+
Rule::gsub,
112+
BuiltinFunctionInfo {
113+
function: BuiltinFunction::Gsub,
114+
min_args: 2,
115+
max_args: 3,
116+
},
117+
),
118+
(
119+
Rule::index,
120+
BuiltinFunctionInfo {
121+
function: BuiltinFunction::Index,
122+
min_args: 2,
123+
max_args: 2,
124+
},
125+
),
126+
(
127+
Rule::length,
128+
BuiltinFunctionInfo {
129+
function: BuiltinFunction::Length,
130+
min_args: 0,
131+
max_args: 1,
132+
},
133+
),
134+
(
135+
Rule::match_fn,
136+
BuiltinFunctionInfo {
137+
function: BuiltinFunction::Match,
138+
min_args: 2,
139+
max_args: 2,
140+
},
141+
),
142+
(
143+
Rule::split,
144+
BuiltinFunctionInfo {
145+
function: BuiltinFunction::Split,
146+
min_args: 2,
147+
max_args: 3,
148+
},
149+
),
150+
(
151+
Rule::sprintf,
152+
BuiltinFunctionInfo {
153+
function: BuiltinFunction::Sprintf,
154+
min_args: 1,
155+
max_args: u16::MAX,
156+
},
157+
),
158+
(
159+
Rule::sub,
160+
BuiltinFunctionInfo {
161+
function: BuiltinFunction::Sub,
162+
min_args: 2,
163+
max_args: 3,
164+
},
165+
),
166+
(
167+
Rule::substr,
168+
BuiltinFunctionInfo {
169+
function: BuiltinFunction::Substr,
170+
min_args: 2,
171+
max_args: 3,
172+
},
173+
),
174+
(
175+
Rule::tolower,
176+
BuiltinFunctionInfo {
177+
function: BuiltinFunction::ToLower,
178+
min_args: 1,
179+
max_args: 1,
180+
},
181+
),
182+
(
183+
Rule::toupper,
184+
BuiltinFunctionInfo {
185+
function: BuiltinFunction::ToUpper,
186+
min_args: 1,
187+
max_args: 1,
188+
},
189+
),
190+
(
191+
Rule::close,
192+
BuiltinFunctionInfo {
193+
function: BuiltinFunction::Close,
194+
min_args: 1,
195+
max_args: 1,
196+
},
197+
),
198+
(
199+
Rule::fflush,
200+
BuiltinFunctionInfo {
201+
function: BuiltinFunction::FFlush,
202+
min_args: 0,
203+
max_args: 1,
204+
},
205+
),
206+
(
207+
Rule::system,
208+
BuiltinFunctionInfo {
209+
function: BuiltinFunction::System,
210+
min_args: 1,
211+
max_args: 1,
212+
},
213+
),
214+
])
215+
});
158216

159-
// Precedence is defined lowest to highest
160-
PrattParser::new()
217+
static PRATT_PARSER: LazyLock<PrattParser<Rule>> = LazyLock::new(|| {
218+
// Precedence is defined lowest to highest
219+
PrattParser::new()
161220
.op(Op::infix(Rule::or, Assoc::Left))
162221
.op(Op::infix(Rule::and, Assoc::Left))
163-
.op(Op::infix(Rule::in_op, Assoc::Left))
164-
.op(Op::infix(Rule::match_op, Assoc::Left)
165-
| Op::infix(Rule::not_match, Assoc::Left))
222+
.op(Op::infix(Rule::in_op, Assoc::Left))
223+
.op(Op::infix(Rule::match_op, Assoc::Left) | Op::infix(Rule::not_match, Assoc::Left))
166224
.op(Op::infix(Rule::comp_op, Assoc::Left))
167225
.op(Op::infix(Rule::concat, Assoc::Left))
168-
.op(Op::infix(Rule::add, Assoc::Left)
169-
| Op::infix(Rule::binary_sub, Assoc::Left))
226+
.op(Op::infix(Rule::add, Assoc::Left) | Op::infix(Rule::binary_sub, Assoc::Left))
170227
.op(Op::infix(Rule::mul, Assoc::Left)
171228
| Op::infix(Rule::div, Assoc::Left)
172229
| Op::infix(Rule::modulus, Assoc::Left))
173-
.op(Op::prefix(Rule::not)
174-
| Op::prefix(Rule::negate)
175-
| Op::prefix(Rule::unary_plus))
230+
.op(Op::prefix(Rule::not) | Op::prefix(Rule::negate) | Op::prefix(Rule::unary_plus))
176231
.op(Op::infix(Rule::pow, Assoc::Right))
177-
.op(Op::prefix(Rule::pre_inc)
178-
| Op::prefix(Rule::pre_dec))
179-
.op(Op::postfix(Rule::post_inc)
180-
| Op::postfix(Rule::post_dec))
181-
};
182-
}
232+
.op(Op::prefix(Rule::pre_inc) | Op::prefix(Rule::pre_dec))
233+
.op(Op::postfix(Rule::post_inc) | Op::postfix(Rule::post_dec))
234+
});
183235

184236
#[derive(pest_derive::Parser, Default)]
185237
#[grammar = "grammar.pest"]

0 commit comments

Comments
 (0)