Ierusalimschy, R., De Figueiredo, L. H., & Celes Filho, W. (2005). The Implementation of Lua 5.0. J. UCS, 11(7), 1159-1176.
Introduction
Main novelties:
- Register-based virtual machine
- Optimized tables
- Closures
- Coroutines
Values
Dynamically-typed language, basic types:
- nil
- boolean: true, false
- number: double (float/long)
- string: arrays of bytes
- table: associative arrays
- function
- userdata: pointers to user memory blocks: heavy, subject to garbage collection; light, freed by user
- thread: coroutines
typedef struct {
int tag; /* Identify the type */
Value v;
} TObject;
typedef union {
GCObject *gc; /* strings, functions, heavy userdata and threads */
void *p; /* light userdata */
lua_Number n; /* numbers */
int b; /* booleans */
} Value;
Tables
Hybrid: hash part and array part
Growth of array part:
- at least half the slots between
1
and
n are in use - at least on used slot between n/2+1 and n <script type="math/tex" id="MathJax-Element-50">n</script>
Hash part: uses a mix of chained scatter table with Brent’s variation
Functions and Closures
Implement closures: upvalue,
flat closures
Threads and Coroutines
create, resume, yield
interpreter cannot use its internal C stack to implement calls in the interpreted code
uses C stack to keep track of the stack of active coroutines at any given time
cactus structure