Skip to content

Commit 6fbd4fc

Browse files
committed
Always use Engine's strings interner.
1 parent 54d1484 commit 6fbd4fc

File tree

10 files changed

+203
-266
lines changed

10 files changed

+203
-266
lines changed

src/api/compile.rs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//! Module that defines the public compilation API of [`Engine`].
22
3-
use crate::func::native::locked_write;
43
use crate::parser::{ParseResult, ParseState};
54
use crate::{Engine, OptimizationLevel, Scope, AST};
65
#[cfg(feature = "no_std")]
@@ -219,19 +218,13 @@ impl Engine {
219218
) -> ParseResult<AST> {
220219
let (stream, tc) = self.lex(scripts.as_ref());
221220

222-
let guard = &mut self
223-
.interned_strings
224-
.as_ref()
225-
.and_then(|interner| locked_write(interner));
226-
let interned_strings = guard.as_deref_mut();
227-
228221
let input = &mut stream.peekable();
229222
let lib = &mut <_>::default();
230-
let state = &mut ParseState::new(scope, interned_strings, input, tc, lib);
223+
let state = ParseState::new(scope, input, tc.clone(), lib);
231224
let mut _ast = self.parse(state, optimization_level)?;
232225
#[cfg(feature = "metadata")]
233226
{
234-
let global_comments = &state.tokenizer_control.borrow().global_comments;
227+
let global_comments = &tc.borrow().global_comments;
235228
_ast.doc = global_comments.into();
236229
}
237230
Ok(_ast)
@@ -299,15 +292,9 @@ impl Engine {
299292
let scripts = [script];
300293
let (stream, t) = self.lex(&scripts);
301294

302-
let guard = &mut self
303-
.interned_strings
304-
.as_ref()
305-
.and_then(|interner| locked_write(interner));
306-
let interned_strings = guard.as_deref_mut();
307-
308295
let input = &mut stream.peekable();
309296
let lib = &mut <_>::default();
310-
let state = &mut ParseState::new(Some(scope), interned_strings, input, t, lib);
297+
let state = ParseState::new(Some(scope), input, t, lib);
311298

312299
self.parse_global_expr(state, |_| {}, self.optimization_level)
313300
}

src/api/eval.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Module that defines the public evaluation API of [`Engine`].
22
33
use crate::eval::{Caches, GlobalRuntimeState};
4-
use crate::func::native::locked_write;
54
use crate::parser::ParseState;
65
use crate::types::dynamic::Variant;
76
use crate::{Dynamic, Engine, Position, RhaiResult, RhaiResultOf, Scope, AST, ERR};
@@ -114,17 +113,11 @@ impl Engine {
114113
) -> RhaiResultOf<T> {
115114
let scripts = [script];
116115
let ast = {
117-
let guard = &mut self
118-
.interned_strings
119-
.as_ref()
120-
.and_then(|interner| locked_write(interner));
121-
let interned_strings = guard.as_deref_mut();
122-
123116
let (stream, tc) = self.lex(&scripts);
124117

125118
let input = &mut stream.peekable();
126119
let lib = &mut <_>::default();
127-
let state = &mut ParseState::new(Some(scope), interned_strings, input, tc, lib);
120+
let state = ParseState::new(Some(scope), input, tc, lib);
128121

129122
// No need to optimize a lone expression
130123
self.parse_global_expr(

src/api/formatting.rs

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
//! Module that provide formatting services to the [`Engine`].
2-
use crate::func::locked_write;
32
use crate::packages::iter_basic::{BitRange, CharsStream, StepRange};
43
use crate::parser::{ParseResult, ParseState};
54
use crate::{
@@ -265,26 +264,19 @@ impl Engine {
265264
tc.borrow_mut().compressed = Some(String::new());
266265
stream.state.last_token = Some(SmartString::new_const());
267266

268-
let guard = &mut self
269-
.interned_strings
270-
.as_ref()
271-
.and_then(|interner| locked_write(interner));
272-
let interned_strings = guard.as_deref_mut();
273-
274267
let input = &mut stream.peekable();
275268
let lib = &mut <_>::default();
276-
let mut state = ParseState::new(None, interned_strings, input, tc, lib);
269+
let state = ParseState::new(None, input, tc.clone(), lib);
277270

278271
let mut _ast = self.parse(
279-
&mut state,
272+
state,
280273
#[cfg(not(feature = "no_optimize"))]
281274
crate::OptimizationLevel::None,
282275
#[cfg(feature = "no_optimize")]
283276
(),
284277
)?;
285278

286-
let tc = state.tokenizer_control.borrow();
287-
288-
Ok(tc.compressed.as_ref().unwrap().into())
279+
let guard = tc.borrow();
280+
Ok(guard.compressed.as_ref().unwrap().into())
289281
}
290282
}

src/api/json.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Module that defines JSON manipulation functions for [`Engine`].
22
#![cfg(not(feature = "no_object"))]
33

4-
use crate::func::native::locked_write;
54
use crate::parser::{ParseSettingFlags, ParseState};
65
use crate::tokenizer::Token;
76
use crate::types::dynamic::Union;
@@ -117,15 +116,9 @@ impl Engine {
117116
);
118117

119118
let ast = {
120-
let guard = &mut self
121-
.interned_strings
122-
.as_ref()
123-
.and_then(|interner| locked_write(interner));
124-
let interned_strings = guard.as_deref_mut();
125-
126119
let input = &mut stream.peekable();
127120
let lib = &mut <_>::default();
128-
let state = &mut ParseState::new(None, interned_strings, input, tokenizer_control, lib);
121+
let state = ParseState::new(None, input, tokenizer_control, lib);
129122

130123
self.parse_global_expr(
131124
state,

src/api/run.rs

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Module that defines the public evaluation API of [`Engine`].
22
33
use crate::eval::Caches;
4-
use crate::func::native::locked_write;
54
use crate::parser::ParseState;
65
use crate::{Engine, RhaiResultOf, Scope, AST};
76
#[cfg(feature = "no_std")]
@@ -60,15 +59,9 @@ impl Engine {
6059
let ast = {
6160
let (stream, tc) = self.lex(&scripts);
6261

63-
let guard = &mut self
64-
.interned_strings
65-
.as_ref()
66-
.and_then(|interner| locked_write(interner));
67-
let interned_strings = guard.as_deref_mut();
68-
6962
let input = &mut stream.peekable();
7063
let lib = &mut <_>::default();
71-
let state = &mut ParseState::new(Some(scope), interned_strings, input, tc, lib);
64+
let state = ParseState::new(Some(scope), input, tc, lib);
7265

7366
self.parse(state, self.optimization_level)?
7467
};

src/ast/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ pub use stmt::{
2424
SwitchCasesCollection,
2525
};
2626

27-
/// _(internals)_ Placeholder for a script-defined function.
27+
/// _(internals)_ Empty placeholder for a script-defined function.
2828
/// Exported under the `internals` feature only.
2929
#[cfg(feature = "no_function")]
30-
pub type ScriptFuncDef = ();
30+
pub struct ScriptFuncDef;

src/engine.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,41 @@ impl Engine {
333333
None => string.into(),
334334
}
335335
}
336+
/// Get an interned property getter, creating one if it is not yet interned.
337+
#[cfg(not(feature = "no_object"))]
338+
#[inline]
339+
#[must_use]
340+
pub(crate) fn get_interned_getter(
341+
&self,
342+
text: impl AsRef<str> + Into<ImmutableString>,
343+
) -> ImmutableString {
344+
match self.interned_strings {
345+
Some(ref interner) => locked_write(interner).unwrap().get_with_mapper(
346+
b'g',
347+
|s| make_getter(s.as_ref()).into(),
348+
text,
349+
),
350+
None => make_getter(text.as_ref()).into(),
351+
}
352+
}
353+
354+
/// Get an interned property setter, creating one if it is not yet interned.
355+
#[cfg(not(feature = "no_object"))]
356+
#[inline]
357+
#[must_use]
358+
pub(crate) fn get_interned_setter(
359+
&self,
360+
text: impl AsRef<str> + Into<ImmutableString>,
361+
) -> ImmutableString {
362+
match self.interned_strings {
363+
Some(ref interner) => locked_write(interner).unwrap().get_with_mapper(
364+
b's',
365+
|s| make_setter(s.as_ref()).into(),
366+
text,
367+
),
368+
None => make_setter(text.as_ref()).into(),
369+
}
370+
}
336371

337372
/// Get an empty [`ImmutableString`] which refers to a shared instance.
338373
#[inline(always)]

src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,9 @@ pub use module::resolvers as module_resolvers;
323323
#[cfg(not(feature = "no_optimize"))]
324324
pub use optimizer::OptimizationLevel;
325325

326-
/// Placeholder for the optimization level.
326+
/// Empty placeholder for the optimization level.
327327
#[cfg(feature = "no_optimize")]
328-
type OptimizationLevel = ();
328+
struct OptimizationLevel;
329329

330330
// Expose internal data structures.
331331

0 commit comments

Comments
 (0)