-
Notifications
You must be signed in to change notification settings - Fork 168
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #154 from schungx/master
Limiting script resources
- Loading branch information
Showing
24 changed files
with
1,278 additions
and
345 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
Rhai Release Notes | ||
================== | ||
|
||
Version 0.14.1 | ||
============== | ||
|
||
The major features for this release is modules, script resource limits, and speed improvements | ||
(mainly due to avoiding allocations). | ||
|
||
New features | ||
------------ | ||
|
||
* Modules and _module resolvers_ allow loading external scripts under a module namespace. | ||
A module can contain constant variables, Rust functions and Rhai functions. | ||
* `export` variables and `private` functions. | ||
* _Indexers_ for Rust types. | ||
* Track script evaluation progress and terminate script run. | ||
* Set limit on maximum number of operations allowed per script run. | ||
* Set limit on maximum number of modules loaded per script run. | ||
* A new API, `Engine::compile_scripts_with_scope`, can compile a list of script segments without needing to | ||
first concatenate them together into one large string. | ||
* Stepped `range` function with a custom step. | ||
|
||
Speed improvements | ||
------------------ | ||
|
||
### `StaticVec` | ||
|
||
A script contains many lists - statements in a block, arguments to a function call etc. | ||
In a typical script, most of these lists tend to be short - e.g. the vast majority of function calls contain | ||
fewer than 4 arguments, while most statement blocks have fewer than 4-5 statements, with one or two being | ||
the most common. Before, dynamic `Vec`'s are used to hold these short lists for very brief periods of time, | ||
causing allocations churn. | ||
|
||
In this version, large amounts of allocations are avoided by converting to a `StaticVec` - | ||
a list type based on a static array for a small number of items (currently four) - | ||
wherever possible plus other tricks. Most real-life scripts should see material speed increases. | ||
|
||
### Pre-computed variable lookups | ||
|
||
Almost all variable lookups, as well as lookups in loaded modules, are now pre-computed. | ||
A variable's name is almost never used to search for the variable in the current scope. | ||
|
||
_Getters_ and _setter_ function names are also pre-computed and cached, so no string allocations are | ||
performed during a property get/set call. | ||
|
||
### Pre-computed function call hashes | ||
|
||
Lookup of all function calls, including Rust and Rhai ones, are now through pre-computed hashes. | ||
The function name is no longer used to search for a function, making function call dispatches | ||
much faster. | ||
|
||
### Large Boxes for expressions and statements | ||
|
||
The expression (`Expr`) and statement (`Stmt`) types are modified so that all of the variants contain only | ||
one single `Box` to a large allocated structure containing _all_ the fields. This makes the `Expr` and | ||
`Stmt` types very small (only one single pointer) and improves evaluation speed due to cache efficiency. | ||
|
||
Error handling | ||
-------------- | ||
|
||
Previously, when an error occurs inside a function call, the error position reported is the function | ||
call site. This makes it difficult to diagnose the actual location of the error within the function. | ||
|
||
A new error variant `EvalAltResult::ErrorInFunctionCall` is added in this version. | ||
It wraps the internal error returned by the called function, including the error position within the function. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.