aboutsummaryrefslogtreecommitdiff
path: root/src/lfunc.js
diff options
context:
space:
mode:
authordaurnimator <quae@daurnimator.com>2017-05-05 17:08:04 +1000
committerdaurnimator <quae@daurnimator.com>2017-05-05 17:18:21 +1000
commit0e5585bd7078d6727382c0de51161fe377c1d81d (patch)
tree05b77887eb62922ac40645a6126e3001c0f6b9f8 /src/lfunc.js
parentb54eee30383e4eaae74551afc9d1c59126269305 (diff)
downloadfengari-0e5585bd7078d6727382c0de51161fe377c1d81d.tar.gz
fengari-0e5585bd7078d6727382c0de51161fe377c1d81d.tar.bz2
fengari-0e5585bd7078d6727382c0de51161fe377c1d81d.zip
Simplify UpVal structure
No longer follows C api as closely (it is the way it is because C has unions) Instead, have a flat object. Also remove the 'setval' method, as it wasn't used from all call-sites and couldn't be extended to them (setval's body only worked with source TValue on a stack)
Diffstat (limited to 'src/lfunc.js')
-rw-r--r--src/lfunc.js43
1 files changed, 15 insertions, 28 deletions
diff --git a/src/lfunc.js b/src/lfunc.js
index 0b78bd3..cf2cfe0 100644
--- a/src/lfunc.js
+++ b/src/lfunc.js
@@ -28,29 +28,16 @@ class Proto {
class UpVal {
- constructor(L) {
- this.L = L; // Keep track of the thread it comes from
- this.v = null; /* if open: stack index. if closed: null (find value in this.u.value) */
+ constructor() {
+ this.L = null; /* Keep track of the thread it comes from */
+ this.v = null; /* if open: stack index. if closed: null (find it in this.value) */
+ this.open_next = null; /* linked list (when open) */
this.refcount = 0;
- this.u = {
- open: { /* (when open) */
- next: null, /* linked list */
- touched: false /* mark to avoid cycles with dead threads */
- },
- value: null /* the value (when closed) */
- };
+ this.value = null; /* the TValue (when closed) */
}
val() {
- return this.v !== null ? this.L.stack[this.v] : this.u.value;
- }
-
- setval(L, ra) {
- if (this.v !== null) {
- this.L.stack[this.v] = L.stack[ra];
- } else {
- this.u.value.setfrom(L.stack[ra]);
- }
+ return this.v !== null ? this.L.stack[this.v] : this.value;
}
isopen() {
@@ -67,22 +54,22 @@ const luaF_newLclosure = function(L, n) {
const findupval = function(L, level) {
let pp = L.openupval;
-
+
while(pp !== null && pp.v >= level) {
let p = pp;
if (p.v === level)
return p;
- pp = p.u.open.next;
+ pp = p.open_next;
}
- let uv = new UpVal(L);
- uv.u.open.next = pp;
- uv.u.open.touched = true;
+ let uv = new UpVal();
+ uv.open_next = pp;
L.openupval = uv;
+ uv.L = L;
uv.v = level;
return uv;
@@ -92,11 +79,12 @@ const luaF_close = function(L, level) {
while (L.openupval !== null && L.openupval.v >= level) {
let uv = L.openupval;
assert(uv.isopen());
- L.openupval = uv.u.open.next; /* remove from 'open' list */
+ L.openupval = uv.open_next; /* remove from 'open' list */
if (uv.refcount > 0) {
let from = uv.L.stack[uv.v];
- uv.u.value = new lobject.TValue(from.type, from.value);
+ uv.L = null;
uv.v = null;
+ uv.value = new lobject.TValue(from.type, from.value);
}
}
};
@@ -108,8 +96,7 @@ const luaF_initupvals = function(L, cl) {
for (let i = 0; i < cl.nupvalues; i++) {
let uv = new UpVal(L);
uv.refcount = 1;
- uv.u.value = new lobject.TValue(CT.LUA_TNIL, null);
- uv.v = null;
+ uv.value = new lobject.TValue(CT.LUA_TNIL, null);
cl.upvals[i] = uv;
}
};