@quenk/potoo 3.1.0-0 → 3.1.1-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/actor/index.d.ts +0 -9
- package/lib/actor/index.ts +0 -10
- package/lib/actor/resident/index.d.ts +4 -3
- package/lib/actor/resident/index.js +13 -6
- package/lib/actor/resident/index.js.map +1 -1
- package/lib/actor/resident/index.ts +19 -10
- package/lib/actor/system/vm/index.d.ts +2 -2
- package/lib/actor/system/vm/index.js +1 -1
- package/lib/actor/system/vm/index.js.map +1 -1
- package/lib/actor/system/vm/index.ts +4 -3
- package/lib/actor/system/vm/runtime/heap/ledger.d.ts +33 -2
- package/lib/actor/system/vm/runtime/heap/ledger.js +19 -8
- package/lib/actor/system/vm/runtime/heap/ledger.js.map +1 -1
- package/lib/actor/system/vm/runtime/heap/ledger.ts +59 -7
- package/lib/actor/system/vm/thread/index.d.ts +7 -7
- package/lib/actor/system/vm/thread/index.ts +7 -7
- package/lib/actor/system/vm/thread/shared/index.d.ts +6 -6
- package/lib/actor/system/vm/thread/shared/index.js +16 -13
- package/lib/actor/system/vm/thread/shared/index.js.map +1 -1
- package/lib/actor/system/vm/thread/shared/index.ts +25 -24
- package/lib/actor/system/vm/thread/shared/runner.d.ts +22 -17
- package/lib/actor/system/vm/thread/shared/runner.js +38 -33
- package/lib/actor/system/vm/thread/shared/runner.js.map +1 -1
- package/lib/actor/system/vm/thread/shared/runner.ts +37 -25
- package/package.json +1 -1
package/lib/actor/index.d.ts
CHANGED
|
@@ -1,16 +1,7 @@
|
|
|
1
|
-
import { Either } from '@quenk/noni/lib/data/either';
|
|
2
1
|
import { Future } from '@quenk/noni/lib/control/monad/future';
|
|
3
2
|
import { Context } from './system/vm/runtime/context';
|
|
4
3
|
import { Message } from './message';
|
|
5
4
|
import { Address } from './address';
|
|
6
|
-
/**
|
|
7
|
-
* Behaviour of an actor.
|
|
8
|
-
*
|
|
9
|
-
* Behaviours are procedures that return an
|
|
10
|
-
* Either type indicating whether a message
|
|
11
|
-
* was processed or rejected.
|
|
12
|
-
*/
|
|
13
|
-
export declare type Behaviour = (m: Message) => Either<Message, void>;
|
|
14
5
|
/**
|
|
15
6
|
* Eff is used in various places to represent the potentially sync or async
|
|
16
7
|
* side-effect of an actor operation.
|
package/lib/actor/index.ts
CHANGED
|
@@ -1,19 +1,9 @@
|
|
|
1
|
-
import { Either } from '@quenk/noni/lib/data/either';
|
|
2
1
|
import { Future } from '@quenk/noni/lib/control/monad/future';
|
|
3
2
|
|
|
4
3
|
import { Context } from './system/vm/runtime/context';
|
|
5
4
|
import { Message } from './message';
|
|
6
5
|
import { Address } from './address';
|
|
7
6
|
|
|
8
|
-
/**
|
|
9
|
-
* Behaviour of an actor.
|
|
10
|
-
*
|
|
11
|
-
* Behaviours are procedures that return an
|
|
12
|
-
* Either type indicating whether a message
|
|
13
|
-
* was processed or rejected.
|
|
14
|
-
*/
|
|
15
|
-
export type Behaviour = (m: Message) => Either<Message, void>;
|
|
16
|
-
|
|
17
7
|
/**
|
|
18
8
|
* Eff is used in various places to represent the potentially sync or async
|
|
19
9
|
* side-effect of an actor operation.
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Err } from '@quenk/noni/lib/control/error';
|
|
2
2
|
import { Context } from '../system/vm/runtime/context';
|
|
3
|
-
import { Foreign } from '../system/vm/type';
|
|
4
3
|
import { System } from '../system';
|
|
5
4
|
import { Address, AddressMap } from '../address';
|
|
6
5
|
import { Message } from '../message';
|
|
7
6
|
import { Templates, Spawnable } from '../template';
|
|
8
7
|
import { Actor, Eff } from '../';
|
|
9
8
|
import { Api } from './api';
|
|
9
|
+
import { Data } from '../system/vm/runtime/stack/frame';
|
|
10
10
|
/**
|
|
11
11
|
* Reference to an actor address.
|
|
12
12
|
*/
|
|
@@ -23,12 +23,13 @@ export declare abstract class AbstractResident implements Resident {
|
|
|
23
23
|
system: System;
|
|
24
24
|
constructor(system: System);
|
|
25
25
|
self: () => string;
|
|
26
|
+
get platform(): import("../system/vm").Platform;
|
|
26
27
|
abstract init(c: Context): Context;
|
|
27
28
|
notify(): void;
|
|
28
29
|
accept(_: Message): void;
|
|
29
30
|
spawn(t: Spawnable): Address;
|
|
30
31
|
spawnGroup(group: string | string[], tmpls: Templates): AddressMap;
|
|
31
|
-
tell<M>(ref: Address,
|
|
32
|
+
tell<M>(ref: Address, msg: M): AbstractResident;
|
|
32
33
|
raise(e: Err): AbstractResident;
|
|
33
34
|
kill(addr: Address): AbstractResident;
|
|
34
35
|
exit(): void;
|
|
@@ -38,7 +39,7 @@ export declare abstract class AbstractResident implements Resident {
|
|
|
38
39
|
/**
|
|
39
40
|
* exec calls a VM function by name on behalf of this actor.
|
|
40
41
|
*/
|
|
41
|
-
exec(fname: string, args:
|
|
42
|
+
exec(fname: string, args: Data[]): void;
|
|
42
43
|
}
|
|
43
44
|
/**
|
|
44
45
|
* ref produces a function for sending messages to an actor address.
|
|
@@ -11,8 +11,15 @@ var AbstractResident = /** @class */ (function () {
|
|
|
11
11
|
this.system = system;
|
|
12
12
|
this.self = getSelf(this);
|
|
13
13
|
}
|
|
14
|
+
Object.defineProperty(AbstractResident.prototype, "platform", {
|
|
15
|
+
get: function () {
|
|
16
|
+
return this.system.getPlatform();
|
|
17
|
+
},
|
|
18
|
+
enumerable: false,
|
|
19
|
+
configurable: true
|
|
20
|
+
});
|
|
14
21
|
AbstractResident.prototype.notify = function () {
|
|
15
|
-
this.
|
|
22
|
+
this.platform.exec(this, 'notify');
|
|
16
23
|
};
|
|
17
24
|
AbstractResident.prototype.accept = function (_) { };
|
|
18
25
|
AbstractResident.prototype.spawn = function (t) {
|
|
@@ -23,8 +30,9 @@ var AbstractResident = /** @class */ (function () {
|
|
|
23
30
|
return record_1.map(tmpls, function (t) { return _this.spawn(type_1.isObject(t) ?
|
|
24
31
|
record_1.merge(t, { group: group }) : { group: group, create: t }); });
|
|
25
32
|
};
|
|
26
|
-
AbstractResident.prototype.tell = function (ref,
|
|
27
|
-
this.
|
|
33
|
+
AbstractResident.prototype.tell = function (ref, msg) {
|
|
34
|
+
var heap = this.platform.heap;
|
|
35
|
+
this.exec('tell', [heap.string(ref), heap.object(msg)]);
|
|
28
36
|
return this;
|
|
29
37
|
};
|
|
30
38
|
AbstractResident.prototype.raise = function (e) {
|
|
@@ -33,7 +41,7 @@ var AbstractResident = /** @class */ (function () {
|
|
|
33
41
|
};
|
|
34
42
|
AbstractResident.prototype.kill = function (addr) {
|
|
35
43
|
var _this = this;
|
|
36
|
-
this.
|
|
44
|
+
this.platform.kill(this, addr).fork(function (e) { return _this.raise(e); });
|
|
37
45
|
return this;
|
|
38
46
|
};
|
|
39
47
|
AbstractResident.prototype.exit = function () {
|
|
@@ -49,8 +57,7 @@ var AbstractResident = /** @class */ (function () {
|
|
|
49
57
|
* exec calls a VM function by name on behalf of this actor.
|
|
50
58
|
*/
|
|
51
59
|
AbstractResident.prototype.exec = function (fname, args) {
|
|
52
|
-
|
|
53
|
-
vm.exec(this, fname, args);
|
|
60
|
+
this.platform.exec(this, fname, args);
|
|
54
61
|
};
|
|
55
62
|
return AbstractResident;
|
|
56
63
|
}());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;AACA,sDAAyD;AACzD,kDAAqD;AA4BrD;;GAEG;AACH;IAII,0BAAmB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;QAEjC,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAFgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ import { isObject } from '@quenk/noni/lib/data/type';
|
|
|
4
4
|
import { Err } from '@quenk/noni/lib/control/error';
|
|
5
5
|
|
|
6
6
|
import { Context } from '../system/vm/runtime/context';
|
|
7
|
-
import { Foreign } from '../system/vm/type';
|
|
8
7
|
import { System } from '../system';
|
|
9
8
|
import {
|
|
10
9
|
Address,
|
|
@@ -14,6 +13,7 @@ import { Message } from '../message';
|
|
|
14
13
|
import { Templates, Spawnable } from '../template';
|
|
15
14
|
import { Actor, Eff } from '../';
|
|
16
15
|
import { Api } from './api';
|
|
16
|
+
import { Data } from '../system/vm/runtime/stack/frame';
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Reference to an actor address.
|
|
@@ -39,11 +39,17 @@ export abstract class AbstractResident
|
|
|
39
39
|
|
|
40
40
|
self = getSelf(this);
|
|
41
41
|
|
|
42
|
+
get platform() {
|
|
43
|
+
|
|
44
|
+
return this.system.getPlatform();
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
42
48
|
abstract init(c: Context): Context;
|
|
43
49
|
|
|
44
50
|
notify() {
|
|
45
51
|
|
|
46
|
-
this.
|
|
52
|
+
this.platform.exec(this, 'notify');
|
|
47
53
|
|
|
48
54
|
}
|
|
49
55
|
|
|
@@ -62,30 +68,34 @@ export abstract class AbstractResident
|
|
|
62
68
|
|
|
63
69
|
}
|
|
64
70
|
|
|
65
|
-
tell<M>(ref: Address,
|
|
71
|
+
tell<M>(ref: Address, msg: M): AbstractResident {
|
|
72
|
+
|
|
73
|
+
let { heap } = this.platform;
|
|
74
|
+
|
|
75
|
+
this.exec('tell', [heap.string(ref), heap.object(msg)]);
|
|
66
76
|
|
|
67
|
-
this.exec('tell', [ref, m]);
|
|
68
77
|
return this;
|
|
69
78
|
|
|
70
79
|
}
|
|
71
80
|
|
|
72
81
|
raise(e: Err): AbstractResident {
|
|
73
82
|
|
|
74
|
-
this.system.getPlatform().raise(this, e
|
|
83
|
+
this.system.getPlatform().raise(this, e);
|
|
75
84
|
return this;
|
|
76
85
|
|
|
77
86
|
}
|
|
78
87
|
|
|
79
88
|
kill(addr: Address): AbstractResident {
|
|
80
89
|
|
|
81
|
-
this.
|
|
90
|
+
this.platform.kill(this, addr).fork(e => this.raise(e));
|
|
91
|
+
|
|
82
92
|
return this;
|
|
83
93
|
|
|
84
94
|
}
|
|
85
95
|
|
|
86
96
|
exit(): void {
|
|
87
97
|
|
|
88
|
-
|
|
98
|
+
this.kill(this.self());
|
|
89
99
|
|
|
90
100
|
}
|
|
91
101
|
|
|
@@ -104,10 +114,9 @@ export abstract class AbstractResident
|
|
|
104
114
|
/**
|
|
105
115
|
* exec calls a VM function by name on behalf of this actor.
|
|
106
116
|
*/
|
|
107
|
-
exec(fname: string, args:
|
|
117
|
+
exec(fname: string, args: Data[]) {
|
|
108
118
|
|
|
109
|
-
|
|
110
|
-
vm.exec(this, fname, args);
|
|
119
|
+
this.platform.exec(this, fname, args);
|
|
111
120
|
|
|
112
121
|
}
|
|
113
122
|
|
|
@@ -14,7 +14,7 @@ import { Thread, VMThread } from './thread';
|
|
|
14
14
|
import { State, Threads } from './state';
|
|
15
15
|
import { Script } from './script';
|
|
16
16
|
import { Context } from './runtime/context';
|
|
17
|
-
import { Frame } from './runtime/stack/frame';
|
|
17
|
+
import { Data, Frame } from './runtime/stack/frame';
|
|
18
18
|
import { Opcode } from './runtime/op';
|
|
19
19
|
import { Operand } from './runtime';
|
|
20
20
|
import { Conf } from './conf';
|
|
@@ -119,7 +119,7 @@ export interface Platform extends Actor {
|
|
|
119
119
|
* exec a function by name with the provided arguments using the actor
|
|
120
120
|
* instance's thread.
|
|
121
121
|
*/
|
|
122
|
-
exec(actor: Instance, funName: string, args?:
|
|
122
|
+
exec(actor: Instance, funName: string, args?: Data[]): void;
|
|
123
123
|
}
|
|
124
124
|
/**
|
|
125
125
|
* PVM (Potoo Virtual Machine) is a JavaScript implemented virtual machine that
|
|
@@ -406,7 +406,7 @@ var PVM = /** @class */ (function () {
|
|
|
406
406
|
* If you want to immediately deliver a message, use [[sendMessage]] instead.
|
|
407
407
|
*/
|
|
408
408
|
PVM.prototype.tell = function (ref, msg) {
|
|
409
|
-
this.exec(this, 'tell', [ref, msg]);
|
|
409
|
+
this.exec(this, 'tell', [this.heap.string(ref), this.heap.object(msg)]);
|
|
410
410
|
return this;
|
|
411
411
|
};
|
|
412
412
|
PVM.prototype.exec = function (actor, funName, args) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
@@ -60,7 +60,7 @@ import {
|
|
|
60
60
|
} from './state';
|
|
61
61
|
import { Script } from './script';
|
|
62
62
|
import { Context, newContext } from './runtime/context';
|
|
63
|
-
import { Frame } from './runtime/stack/frame';
|
|
63
|
+
import { Data, Frame } from './runtime/stack/frame';
|
|
64
64
|
import { Opcode, toLog } from './runtime/op';
|
|
65
65
|
import { Operand } from './runtime';
|
|
66
66
|
import { Conf, defaults } from './conf';
|
|
@@ -198,7 +198,7 @@ export interface Platform extends Actor {
|
|
|
198
198
|
* exec a function by name with the provided arguments using the actor
|
|
199
199
|
* instance's thread.
|
|
200
200
|
*/
|
|
201
|
-
exec(actor: Instance, funName: string, args?:
|
|
201
|
+
exec(actor: Instance, funName: string, args?: Data[]): void
|
|
202
202
|
|
|
203
203
|
}
|
|
204
204
|
|
|
@@ -721,7 +721,8 @@ export class PVM implements Platform {
|
|
|
721
721
|
*/
|
|
722
722
|
tell<M>(ref: Address, msg: M): PVM {
|
|
723
723
|
|
|
724
|
-
this.exec(this, 'tell', [ref, msg]);
|
|
724
|
+
this.exec(this, 'tell', [this.heap.string(ref), this.heap.object(msg)]);
|
|
725
|
+
|
|
725
726
|
return this;
|
|
726
727
|
|
|
727
728
|
}
|
|
@@ -34,6 +34,27 @@ export interface Owners extends Record<FrameName> {
|
|
|
34
34
|
* HeapLedger keeps track of objects created on the heap and their ownership.
|
|
35
35
|
*/
|
|
36
36
|
export interface HeapLedger {
|
|
37
|
+
/**
|
|
38
|
+
* string adds a string to the heap without specifying an owner.
|
|
39
|
+
*
|
|
40
|
+
* This string will remain on the heap until it is removed or assigned an
|
|
41
|
+
* owner.
|
|
42
|
+
*/
|
|
43
|
+
string(value: string): HeapAddress;
|
|
44
|
+
/**
|
|
45
|
+
* object adds a object to the heap without specifying an owner.
|
|
46
|
+
*
|
|
47
|
+
* This object will remain on the heap until it is removed or assigned an
|
|
48
|
+
* owner.
|
|
49
|
+
*/
|
|
50
|
+
object(value: Foreign): HeapAddress;
|
|
51
|
+
/**
|
|
52
|
+
* fun adds a fun to the heap without specifying an owner.
|
|
53
|
+
*
|
|
54
|
+
* This fun will remain on the heap until it is removed or assigned an
|
|
55
|
+
* owner.
|
|
56
|
+
*/
|
|
57
|
+
fun(value: FunInfo): HeapAddress;
|
|
37
58
|
/**
|
|
38
59
|
* addString to the heap on behalf of a frame.
|
|
39
60
|
*/
|
|
@@ -71,6 +92,12 @@ export interface HeapLedger {
|
|
|
71
92
|
* provied for regular numbers or a null pointer (0) for everything else.
|
|
72
93
|
*/
|
|
73
94
|
intern(frame: Frame, value: Type): HeapAddress;
|
|
95
|
+
/**
|
|
96
|
+
* move a HeapAddress from one owner to another.
|
|
97
|
+
*
|
|
98
|
+
* This method assumes the address is valid.
|
|
99
|
+
*/
|
|
100
|
+
move(ref: HeapAddress, newOwner: FrameName): HeapAddress;
|
|
74
101
|
/**
|
|
75
102
|
* frameExit is called whenever a Frame has finished execution and ready
|
|
76
103
|
* to return its value (if any) to its parent frame.
|
|
@@ -96,7 +123,10 @@ export declare class DefaultHeapLedger implements HeapLedger {
|
|
|
96
123
|
owners: Owners;
|
|
97
124
|
constructor(objects?: HeapMap, owners?: Owners);
|
|
98
125
|
counter: number;
|
|
99
|
-
_addItem(
|
|
126
|
+
_addItem(name: FrameName, value: Type, flag: number): number;
|
|
127
|
+
string(value: string): HeapAddress;
|
|
128
|
+
object(value: HeapObject): HeapAddress;
|
|
129
|
+
fun(value: FunInfo): HeapAddress;
|
|
100
130
|
addString(frame: Frame, value: string): HeapAddress;
|
|
101
131
|
addObject(frame: Frame, obj: HeapObject): HeapAddress;
|
|
102
132
|
addFun(frame: Frame, obj: FunInfo): HeapAddress;
|
|
@@ -105,7 +135,8 @@ export declare class DefaultHeapLedger implements HeapLedger {
|
|
|
105
135
|
getFrameRefs(frame: Frame): HeapAddress[];
|
|
106
136
|
getThreadRefs(thread: VMThread): HeapAddress[];
|
|
107
137
|
intern(frame: Frame, value: Type): HeapAddress;
|
|
108
|
-
move(ref: HeapAddress, newOwner: FrameName):
|
|
138
|
+
move(ref: HeapAddress, newOwner: FrameName): HeapAddress;
|
|
109
139
|
frameExit(frame: Frame): void;
|
|
110
140
|
threadExit(thread: VMThread): void;
|
|
111
141
|
}
|
|
142
|
+
export declare const isHeapAddress: (ref: number) => boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DefaultHeapLedger = void 0;
|
|
3
|
+
exports.isHeapAddress = exports.DefaultHeapLedger = void 0;
|
|
4
4
|
var maybe_1 = require("@quenk/noni/lib/data/maybe");
|
|
5
5
|
var record_1 = require("@quenk/noni/lib/data/record");
|
|
6
6
|
var type_1 = require("@quenk/noni/lib/data/type");
|
|
@@ -17,20 +17,30 @@ var DefaultHeapLedger = /** @class */ (function () {
|
|
|
17
17
|
this.owners = owners;
|
|
18
18
|
this.counter = 0;
|
|
19
19
|
}
|
|
20
|
-
DefaultHeapLedger.prototype._addItem = function (
|
|
20
|
+
DefaultHeapLedger.prototype._addItem = function (name, value, flag) {
|
|
21
21
|
var addr = (this.counter++) | flag;
|
|
22
22
|
this.objects[addr] = value;
|
|
23
|
-
|
|
23
|
+
if (name !== '')
|
|
24
|
+
this.owners[addr] = name;
|
|
24
25
|
return addr;
|
|
25
26
|
};
|
|
27
|
+
DefaultHeapLedger.prototype.string = function (value) {
|
|
28
|
+
return this._addItem('', value, frame_1.DATA_TYPE_HEAP_STRING);
|
|
29
|
+
};
|
|
30
|
+
DefaultHeapLedger.prototype.object = function (value) {
|
|
31
|
+
return this._addItem('', value, frame_1.DATA_TYPE_HEAP_OBJECT);
|
|
32
|
+
};
|
|
33
|
+
DefaultHeapLedger.prototype.fun = function (value) {
|
|
34
|
+
return this._addItem('', value, frame_1.DATA_TYPE_HEAP_FUN);
|
|
35
|
+
};
|
|
26
36
|
DefaultHeapLedger.prototype.addString = function (frame, value) {
|
|
27
|
-
return this._addItem(frame, value, frame_1.DATA_TYPE_HEAP_STRING);
|
|
37
|
+
return this._addItem(frame.name, value, frame_1.DATA_TYPE_HEAP_STRING);
|
|
28
38
|
};
|
|
29
39
|
DefaultHeapLedger.prototype.addObject = function (frame, obj) {
|
|
30
|
-
return this._addItem(frame, obj, frame_1.DATA_TYPE_HEAP_OBJECT);
|
|
40
|
+
return this._addItem(frame.name, obj, frame_1.DATA_TYPE_HEAP_OBJECT);
|
|
31
41
|
};
|
|
32
42
|
DefaultHeapLedger.prototype.addFun = function (frame, obj) {
|
|
33
|
-
return this._addItem(frame, obj, frame_1.DATA_TYPE_HEAP_FUN);
|
|
43
|
+
return this._addItem(frame.name, obj, frame_1.DATA_TYPE_HEAP_FUN);
|
|
34
44
|
};
|
|
35
45
|
DefaultHeapLedger.prototype.getString = function (ref) {
|
|
36
46
|
var value = this.objects[ref];
|
|
@@ -64,10 +74,11 @@ var DefaultHeapLedger = /** @class */ (function () {
|
|
|
64
74
|
};
|
|
65
75
|
DefaultHeapLedger.prototype.move = function (ref, newOwner) {
|
|
66
76
|
this.owners[ref] = newOwner;
|
|
77
|
+
return ref;
|
|
67
78
|
};
|
|
68
79
|
DefaultHeapLedger.prototype.frameExit = function (frame) {
|
|
69
80
|
var _this = this;
|
|
70
|
-
if (frame.parent.isJust() && isHeapAddress(frame.thread.rp))
|
|
81
|
+
if (frame.parent.isJust() && exports.isHeapAddress(frame.thread.rp))
|
|
71
82
|
this.move(frame.thread.rp, frame.parent.get().name);
|
|
72
83
|
this.getFrameRefs(frame).forEach(function (ref) {
|
|
73
84
|
if (ref !== frame.thread.rp) {
|
|
@@ -86,7 +97,7 @@ var DefaultHeapLedger = /** @class */ (function () {
|
|
|
86
97
|
return DefaultHeapLedger;
|
|
87
98
|
}());
|
|
88
99
|
exports.DefaultHeapLedger = DefaultHeapLedger;
|
|
89
|
-
|
|
100
|
+
exports.isHeapAddress = function (ref) {
|
|
90
101
|
var kind = ref & frame_1.DATA_MASK_TYPE;
|
|
91
102
|
return (kind === frame_1.DATA_TYPE_HEAP_STRING) || (kind === frame_1.DATA_TYPE_HEAP_OBJECT);
|
|
92
103
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["ledger.ts"],"names":[],"mappings":";;;AAAA,oDAAiE;AACjE,sDAA6E;AAC7E,kDAA+E;AAE/E,0CAA2E;AAC3E,wCAOwB;
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["ledger.ts"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,30 @@ export interface Owners extends Record<FrameName> { }
|
|
|
57
57
|
*/
|
|
58
58
|
export interface HeapLedger {
|
|
59
59
|
|
|
60
|
+
/**
|
|
61
|
+
* string adds a string to the heap without specifying an owner.
|
|
62
|
+
*
|
|
63
|
+
* This string will remain on the heap until it is removed or assigned an
|
|
64
|
+
* owner.
|
|
65
|
+
*/
|
|
66
|
+
string(value: string): HeapAddress
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* object adds a object to the heap without specifying an owner.
|
|
70
|
+
*
|
|
71
|
+
* This object will remain on the heap until it is removed or assigned an
|
|
72
|
+
* owner.
|
|
73
|
+
*/
|
|
74
|
+
object(value: Foreign): HeapAddress
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* fun adds a fun to the heap without specifying an owner.
|
|
78
|
+
*
|
|
79
|
+
* This fun will remain on the heap until it is removed or assigned an
|
|
80
|
+
* owner.
|
|
81
|
+
*/
|
|
82
|
+
fun(value: FunInfo): HeapAddress
|
|
83
|
+
|
|
60
84
|
/**
|
|
61
85
|
* addString to the heap on behalf of a frame.
|
|
62
86
|
*/
|
|
@@ -102,6 +126,13 @@ export interface HeapLedger {
|
|
|
102
126
|
*/
|
|
103
127
|
intern(frame: Frame, value: Type): HeapAddress
|
|
104
128
|
|
|
129
|
+
/**
|
|
130
|
+
* move a HeapAddress from one owner to another.
|
|
131
|
+
*
|
|
132
|
+
* This method assumes the address is valid.
|
|
133
|
+
*/
|
|
134
|
+
move(ref: HeapAddress, newOwner: FrameName): HeapAddress
|
|
135
|
+
|
|
105
136
|
/**
|
|
106
137
|
* frameExit is called whenever a Frame has finished execution and ready
|
|
107
138
|
* to return its value (if any) to its parent frame.
|
|
@@ -131,33 +162,52 @@ export class DefaultHeapLedger implements HeapLedger {
|
|
|
131
162
|
|
|
132
163
|
counter = 0;
|
|
133
164
|
|
|
134
|
-
_addItem(
|
|
165
|
+
_addItem(name: FrameName, value: Type, flag: number) {
|
|
135
166
|
|
|
136
167
|
let addr = (this.counter++) | flag;
|
|
137
168
|
|
|
138
169
|
this.objects[addr] = value;
|
|
139
170
|
|
|
140
|
-
|
|
171
|
+
if (name !== '')
|
|
172
|
+
this.owners[addr] = name;
|
|
141
173
|
|
|
142
174
|
return addr;
|
|
143
175
|
|
|
144
176
|
}
|
|
145
177
|
|
|
178
|
+
string(value: string): HeapAddress {
|
|
179
|
+
|
|
180
|
+
return this._addItem('', value, DATA_TYPE_HEAP_STRING);
|
|
181
|
+
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
object(value: HeapObject): HeapAddress {
|
|
185
|
+
|
|
186
|
+
return this._addItem('', value, DATA_TYPE_HEAP_OBJECT);
|
|
187
|
+
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
fun(value: FunInfo): HeapAddress {
|
|
191
|
+
|
|
192
|
+
return this._addItem('', value, DATA_TYPE_HEAP_FUN);
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
|
|
146
196
|
addString(frame: Frame, value: string): HeapAddress {
|
|
147
197
|
|
|
148
|
-
return this._addItem(frame, value, DATA_TYPE_HEAP_STRING);
|
|
198
|
+
return this._addItem(frame.name, value, DATA_TYPE_HEAP_STRING);
|
|
149
199
|
|
|
150
200
|
}
|
|
151
201
|
|
|
152
202
|
addObject(frame: Frame, obj: HeapObject): HeapAddress {
|
|
153
203
|
|
|
154
|
-
return this._addItem(frame, obj, DATA_TYPE_HEAP_OBJECT);
|
|
204
|
+
return this._addItem(frame.name, obj, DATA_TYPE_HEAP_OBJECT);
|
|
155
205
|
|
|
156
206
|
}
|
|
157
207
|
|
|
158
208
|
addFun(frame: Frame, obj: FunInfo): HeapAddress {
|
|
159
209
|
|
|
160
|
-
return this._addItem(frame, obj, DATA_TYPE_HEAP_FUN);
|
|
210
|
+
return this._addItem(frame.name, obj, DATA_TYPE_HEAP_FUN);
|
|
161
211
|
|
|
162
212
|
}
|
|
163
213
|
|
|
@@ -208,10 +258,12 @@ export class DefaultHeapLedger implements HeapLedger {
|
|
|
208
258
|
|
|
209
259
|
}
|
|
210
260
|
|
|
211
|
-
move(ref: HeapAddress, newOwner: FrameName) {
|
|
261
|
+
move(ref: HeapAddress, newOwner: FrameName): HeapAddress {
|
|
212
262
|
|
|
213
263
|
this.owners[ref] = newOwner;
|
|
214
264
|
|
|
265
|
+
return ref;
|
|
266
|
+
|
|
215
267
|
}
|
|
216
268
|
|
|
217
269
|
frameExit(frame: Frame) {
|
|
@@ -241,7 +293,7 @@ export class DefaultHeapLedger implements HeapLedger {
|
|
|
241
293
|
|
|
242
294
|
}
|
|
243
295
|
|
|
244
|
-
const isHeapAddress = (ref: number) => {
|
|
296
|
+
export const isHeapAddress = (ref: number) => {
|
|
245
297
|
|
|
246
298
|
let kind = ref & DATA_MASK_TYPE;
|
|
247
299
|
|
|
@@ -3,10 +3,10 @@ import { Future } from '@quenk/noni/lib/control/monad/future';
|
|
|
3
3
|
import { FunInfo } from '../script/info';
|
|
4
4
|
import { Data, Frame } from '../runtime/stack/frame';
|
|
5
5
|
import { Script } from '../script';
|
|
6
|
-
import {
|
|
6
|
+
import { PTValue } from '../type';
|
|
7
7
|
import { Context } from '../runtime/context';
|
|
8
8
|
import { Platform } from '../';
|
|
9
|
-
import {
|
|
9
|
+
import { Job } from './shared/runner';
|
|
10
10
|
export declare const THREAD_STATE_IDLE = 0;
|
|
11
11
|
export declare const THREAD_STATE_RUN = 1;
|
|
12
12
|
export declare const THREAD_STATE_WAIT = 2;
|
|
@@ -90,11 +90,11 @@ export interface VMThread extends Thread {
|
|
|
90
90
|
invokeVM(caller: Frame, func: FunInfo): void;
|
|
91
91
|
/**
|
|
92
92
|
* restore sets the thread's internal values using the provided
|
|
93
|
-
*
|
|
93
|
+
* Job. The thread's state will be updated to THREAD_STATE_RUN.
|
|
94
94
|
*/
|
|
95
|
-
restore(eframe:
|
|
95
|
+
restore(eframe: Job): void;
|
|
96
96
|
/**
|
|
97
|
-
*
|
|
97
|
+
* nextFrame instructs the thread to process the next stack frame
|
|
98
98
|
* in the thread's stack.
|
|
99
99
|
*
|
|
100
100
|
* This does not actually execute the frame but prepares the internal
|
|
@@ -103,11 +103,11 @@ export interface VMThread extends Thread {
|
|
|
103
103
|
*
|
|
104
104
|
* @param rp - The value to set the
|
|
105
105
|
*/
|
|
106
|
-
|
|
106
|
+
nextFrame(rp: Data): void;
|
|
107
107
|
/**
|
|
108
108
|
* exec a function by name on this thread.
|
|
109
109
|
*
|
|
110
110
|
* The function must be declared in the thread's Script.
|
|
111
111
|
*/
|
|
112
|
-
exec(name: string, args:
|
|
112
|
+
exec(name: string, args: Data[]): void;
|
|
113
113
|
}
|
|
@@ -5,10 +5,10 @@ import { Future } from '@quenk/noni/lib/control/monad/future';
|
|
|
5
5
|
import { FunInfo } from '../script/info';
|
|
6
6
|
import { Data, Frame } from '../runtime/stack/frame';
|
|
7
7
|
import { Script } from '../script';
|
|
8
|
-
import {
|
|
8
|
+
import { PTValue } from '../type';
|
|
9
9
|
import { Context } from '../runtime/context';
|
|
10
10
|
import { Platform } from '../';
|
|
11
|
-
import {
|
|
11
|
+
import { Job } from './shared/runner';
|
|
12
12
|
|
|
13
13
|
export const THREAD_STATE_IDLE = 0;
|
|
14
14
|
export const THREAD_STATE_RUN = 1;
|
|
@@ -110,12 +110,12 @@ export interface VMThread extends Thread {
|
|
|
110
110
|
|
|
111
111
|
/**
|
|
112
112
|
* restore sets the thread's internal values using the provided
|
|
113
|
-
*
|
|
113
|
+
* Job. The thread's state will be updated to THREAD_STATE_RUN.
|
|
114
114
|
*/
|
|
115
|
-
restore(eframe:
|
|
115
|
+
restore(eframe: Job): void
|
|
116
116
|
|
|
117
117
|
/**
|
|
118
|
-
*
|
|
118
|
+
* nextFrame instructs the thread to process the next stack frame
|
|
119
119
|
* in the thread's stack.
|
|
120
120
|
*
|
|
121
121
|
* This does not actually execute the frame but prepares the internal
|
|
@@ -124,12 +124,12 @@ export interface VMThread extends Thread {
|
|
|
124
124
|
*
|
|
125
125
|
* @param rp - The value to set the
|
|
126
126
|
*/
|
|
127
|
-
|
|
127
|
+
nextFrame(rp: Data): void
|
|
128
128
|
|
|
129
129
|
/**
|
|
130
130
|
* exec a function by name on this thread.
|
|
131
131
|
*
|
|
132
132
|
* The function must be declared in the thread's Script.
|
|
133
133
|
*/
|
|
134
|
-
exec(name: string, args:
|
|
134
|
+
exec(name: string, args: Data[]): void
|
|
135
135
|
}
|
|
@@ -4,16 +4,16 @@ import { Frame, Data, FrameName } from '../../runtime/stack/frame';
|
|
|
4
4
|
import { Context } from '../../runtime/context';
|
|
5
5
|
import { FunInfo, ForeignFunInfo } from '../../script/info';
|
|
6
6
|
import { Script } from '../../script';
|
|
7
|
-
import {
|
|
7
|
+
import { PTValue } from '../../type';
|
|
8
8
|
import { Platform } from '../../';
|
|
9
9
|
import { VMThread } from '../';
|
|
10
|
-
import {
|
|
10
|
+
import { Job, SharedThreadRunner } from './runner';
|
|
11
11
|
/**
|
|
12
12
|
* SharedThread is used by actors that run in a shared runtime i.e. the single
|
|
13
13
|
* threaded JS event loop.
|
|
14
14
|
*
|
|
15
15
|
* Actual code execution takes place in a SharedThreadRunner which queues up
|
|
16
|
-
*
|
|
16
|
+
* Job on behalf every SharedThread in the system.
|
|
17
17
|
*/
|
|
18
18
|
export declare class SharedThread implements VMThread {
|
|
19
19
|
vm: Platform;
|
|
@@ -35,7 +35,7 @@ export declare class SharedThread implements VMThread {
|
|
|
35
35
|
wait(task: Future<void>): void;
|
|
36
36
|
raise(e: Err): void;
|
|
37
37
|
die(): Future<void>;
|
|
38
|
-
restore(
|
|
39
|
-
|
|
40
|
-
exec(name: string, args?:
|
|
38
|
+
restore({ fun, args }: Job): void;
|
|
39
|
+
nextFrame(rp: Data): void;
|
|
40
|
+
exec(name: string, args?: Data[]): void;
|
|
41
41
|
}
|
|
@@ -41,6 +41,7 @@ var future_1 = require("@quenk/noni/lib/control/monad/future");
|
|
|
41
41
|
var array_1 = require("@quenk/noni/lib/data/array");
|
|
42
42
|
var maybe_1 = require("@quenk/noni/lib/data/maybe");
|
|
43
43
|
var frame_1 = require("../../runtime/stack/frame");
|
|
44
|
+
var ledger_1 = require("../../runtime/heap/ledger");
|
|
44
45
|
var type_1 = require("../../type");
|
|
45
46
|
var __1 = require("../");
|
|
46
47
|
var runner_1 = require("./runner");
|
|
@@ -49,7 +50,7 @@ var runner_1 = require("./runner");
|
|
|
49
50
|
* threaded JS event loop.
|
|
50
51
|
*
|
|
51
52
|
* Actual code execution takes place in a SharedThreadRunner which queues up
|
|
52
|
-
*
|
|
53
|
+
* Job on behalf every SharedThread in the system.
|
|
53
54
|
*/
|
|
54
55
|
var SharedThread = /** @class */ (function () {
|
|
55
56
|
function SharedThread(vm, script, runner, context) {
|
|
@@ -124,20 +125,27 @@ var SharedThread = /** @class */ (function () {
|
|
|
124
125
|
});
|
|
125
126
|
});
|
|
126
127
|
};
|
|
127
|
-
SharedThread.prototype.restore = function (
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
this.
|
|
128
|
+
SharedThread.prototype.restore = function (_a) {
|
|
129
|
+
var _this = this;
|
|
130
|
+
var fun = _a.fun, args = _a.args;
|
|
131
|
+
var frame = new frame_1.StackFrame(this.makeFrameName(fun.name), this.script, this, maybe_1.nothing(), fun.foreign ?
|
|
132
|
+
[op.LDN | this.script.info.indexOf(fun), op.CALL] :
|
|
133
|
+
fun.code.slice());
|
|
134
|
+
frame.data = args.map(function (arg) { return ledger_1.isHeapAddress(arg) ?
|
|
135
|
+
_this.vm.heap.move(arg, frame.name)
|
|
136
|
+
: arg; });
|
|
137
|
+
this.fstack = [frame];
|
|
138
|
+
this.fsp = 0;
|
|
139
|
+
this.rp = 0;
|
|
131
140
|
this.state = __1.THREAD_STATE_RUN;
|
|
132
141
|
};
|
|
133
|
-
SharedThread.prototype.
|
|
142
|
+
SharedThread.prototype.nextFrame = function (rp) {
|
|
134
143
|
this.vm.heap.frameExit(this.fstack.pop());
|
|
135
144
|
this.fsp--;
|
|
136
145
|
this.rp = rp;
|
|
137
146
|
this.state = __1.THREAD_STATE_IDLE;
|
|
138
147
|
};
|
|
139
148
|
SharedThread.prototype.exec = function (name, args) {
|
|
140
|
-
var _this = this;
|
|
141
149
|
if (args === void 0) { args = []; }
|
|
142
150
|
var script = this.script;
|
|
143
151
|
var fun = script.info.find(function (info) {
|
|
@@ -145,12 +153,7 @@ var SharedThread = /** @class */ (function () {
|
|
|
145
153
|
});
|
|
146
154
|
if (!fun)
|
|
147
155
|
return this.raise(new errors.UnknownFunErr(name));
|
|
148
|
-
|
|
149
|
-
[op.LDN | this.script.info.indexOf(fun), op.CALL] :
|
|
150
|
-
fun.code.slice());
|
|
151
|
-
frame.data = args.map(function (arg) { return _this.vm.heap.intern(frame, arg); });
|
|
152
|
-
this.runner.enqueue(new runner_1.ExecutionFrame(this, [frame]));
|
|
153
|
-
this.runner.run();
|
|
156
|
+
this.runner.postJob(new runner_1.Job(this, fun, args));
|
|
154
157
|
};
|
|
155
158
|
return SharedThread;
|
|
156
159
|
}());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,4CAA8C;AAC9C,qCAAuC;AAGvC,+DAA8E;AAC9E,oDAAyD;AACzD,oDAA2D;AAE3D,mDAA+E;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,10 +7,11 @@ import { empty, tail } from '@quenk/noni/lib/data/array';
|
|
|
7
7
|
import { just, nothing } from '@quenk/noni/lib/data/maybe';
|
|
8
8
|
|
|
9
9
|
import { Frame, StackFrame, Data, FrameName } from '../../runtime/stack/frame';
|
|
10
|
+
import { isHeapAddress } from '../../runtime/heap/ledger';
|
|
10
11
|
import { Context } from '../../runtime/context';
|
|
11
12
|
import { FunInfo, ForeignFunInfo } from '../../script/info';
|
|
12
13
|
import { Script } from '../../script';
|
|
13
|
-
import {
|
|
14
|
+
import { PTValue, TYPE_FUN } from '../../type';
|
|
14
15
|
import { Platform } from '../../';
|
|
15
16
|
import {
|
|
16
17
|
VMThread,
|
|
@@ -20,14 +21,14 @@ import {
|
|
|
20
21
|
THREAD_STATE_ERROR,
|
|
21
22
|
THREAD_STATE_INVALID
|
|
22
23
|
} from '../';
|
|
23
|
-
import {
|
|
24
|
+
import { Job, SharedThreadRunner } from './runner';
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
27
|
* SharedThread is used by actors that run in a shared runtime i.e. the single
|
|
27
28
|
* threaded JS event loop.
|
|
28
29
|
*
|
|
29
30
|
* Actual code execution takes place in a SharedThreadRunner which queues up
|
|
30
|
-
*
|
|
31
|
+
* Job on behalf every SharedThread in the system.
|
|
31
32
|
*/
|
|
32
33
|
export class SharedThread implements VMThread {
|
|
33
34
|
|
|
@@ -138,16 +139,30 @@ export class SharedThread implements VMThread {
|
|
|
138
139
|
|
|
139
140
|
}
|
|
140
141
|
|
|
141
|
-
restore(
|
|
142
|
+
restore({ fun, args }: Job) {
|
|
142
143
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
144
|
+
let frame = new StackFrame(
|
|
145
|
+
this.makeFrameName(fun.name),
|
|
146
|
+
this.script,
|
|
147
|
+
this,
|
|
148
|
+
nothing(),
|
|
149
|
+
fun.foreign ?
|
|
150
|
+
[op.LDN | this.script.info.indexOf(fun), op.CALL] :
|
|
151
|
+
fun.code.slice(),
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
frame.data = args.map(arg => isHeapAddress(arg) ?
|
|
155
|
+
this.vm.heap.move(arg, frame.name)
|
|
156
|
+
: arg);
|
|
157
|
+
|
|
158
|
+
this.fstack = [frame];
|
|
159
|
+
this.fsp = 0;
|
|
160
|
+
this.rp = 0;
|
|
146
161
|
this.state = THREAD_STATE_RUN;
|
|
147
162
|
|
|
148
163
|
}
|
|
149
164
|
|
|
150
|
-
|
|
165
|
+
nextFrame(rp: Data) {
|
|
151
166
|
|
|
152
167
|
this.vm.heap.frameExit(<Frame>this.fstack.pop());
|
|
153
168
|
this.fsp--;
|
|
@@ -156,7 +171,7 @@ export class SharedThread implements VMThread {
|
|
|
156
171
|
|
|
157
172
|
}
|
|
158
173
|
|
|
159
|
-
exec(name: string, args:
|
|
174
|
+
exec(name: string, args: Data[] = []) {
|
|
160
175
|
|
|
161
176
|
let { script } = this;
|
|
162
177
|
|
|
@@ -166,21 +181,7 @@ export class SharedThread implements VMThread {
|
|
|
166
181
|
if (!fun)
|
|
167
182
|
return this.raise(new errors.UnknownFunErr(name));
|
|
168
183
|
|
|
169
|
-
|
|
170
|
-
this.makeFrameName(fun.name),
|
|
171
|
-
script,
|
|
172
|
-
this,
|
|
173
|
-
nothing(),
|
|
174
|
-
fun.foreign ?
|
|
175
|
-
[op.LDN | this.script.info.indexOf(fun), op.CALL] :
|
|
176
|
-
fun.code.slice(),
|
|
177
|
-
);
|
|
178
|
-
|
|
179
|
-
frame.data = args.map(arg => this.vm.heap.intern(frame, arg));
|
|
180
|
-
|
|
181
|
-
this.runner.enqueue(new ExecutionFrame(this, [frame]));
|
|
182
|
-
|
|
183
|
-
this.runner.run();
|
|
184
|
+
this.runner.postJob(new Job(this, fun, args));
|
|
184
185
|
|
|
185
186
|
}
|
|
186
187
|
|
|
@@ -1,20 +1,16 @@
|
|
|
1
1
|
import { Platform } from '../../';
|
|
2
|
-
import {
|
|
2
|
+
import { Data } from '../../runtime/stack/frame';
|
|
3
|
+
import { FunInfo } from '../../script/info';
|
|
3
4
|
import { VMThread } from '../';
|
|
4
5
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* This is used to both trigger execution of an fstack as well as restore
|
|
8
|
-
* execution in the shared environment. When a VMThread needs to perform an
|
|
9
|
-
* async task for example, it's current state is saved an a new ExecutionFrame
|
|
10
|
-
* is pushed to the runner to continue where it left off.
|
|
6
|
+
* Job is a request by a thread to execute VM code on its behalf to
|
|
7
|
+
* the SharedThreadRunner
|
|
11
8
|
*/
|
|
12
|
-
export declare class
|
|
9
|
+
export declare class Job {
|
|
13
10
|
thread: VMThread;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
constructor(thread: VMThread, fstack?: StackFrame[], fsp?: number, rp?: number);
|
|
11
|
+
fun: FunInfo;
|
|
12
|
+
args: Data[];
|
|
13
|
+
constructor(thread: VMThread, fun: FunInfo, args?: Data[]);
|
|
18
14
|
}
|
|
19
15
|
/**
|
|
20
16
|
* SharedThreadRunner allows multiple Threads to execute their code sequentially
|
|
@@ -34,17 +30,26 @@ export declare class ExecutionFrame {
|
|
|
34
30
|
*/
|
|
35
31
|
export declare class SharedThreadRunner {
|
|
36
32
|
vm: Platform;
|
|
37
|
-
|
|
38
|
-
constructor(vm: Platform,
|
|
33
|
+
jobs: Job[];
|
|
34
|
+
constructor(vm: Platform, jobs?: Job[]);
|
|
39
35
|
_running: boolean;
|
|
40
36
|
/**
|
|
41
|
-
* enqueue
|
|
37
|
+
* enqueue a Job for future execution.
|
|
42
38
|
*/
|
|
43
|
-
enqueue(
|
|
39
|
+
enqueue(job: Job): this;
|
|
44
40
|
/**
|
|
45
|
-
* dequeue all
|
|
41
|
+
* dequeue all Jobs for the provide thread effectively ending its
|
|
46
42
|
* execution.
|
|
47
43
|
*/
|
|
48
44
|
dequeue(thread: VMThread): void;
|
|
45
|
+
/**
|
|
46
|
+
* postJob enqueues a Job for execution triggering the run() loop immediately
|
|
47
|
+
* if not already running.
|
|
48
|
+
*/
|
|
49
|
+
postJob(job: Job): void;
|
|
50
|
+
/**
|
|
51
|
+
* run the Job processing loop until there are no more Jobs to process in
|
|
52
|
+
* the queue.
|
|
53
|
+
*/
|
|
49
54
|
run(): void;
|
|
50
55
|
}
|
|
@@ -1,31 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SharedThreadRunner = exports.
|
|
3
|
+
exports.SharedThreadRunner = exports.Job = void 0;
|
|
4
4
|
var array_1 = require("@quenk/noni/lib/data/array");
|
|
5
5
|
var op_1 = require("../../runtime/op");
|
|
6
6
|
var runtime_1 = require("../../runtime");
|
|
7
7
|
var __1 = require("../");
|
|
8
8
|
/**
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* This is used to both trigger execution of an fstack as well as restore
|
|
12
|
-
* execution in the shared environment. When a VMThread needs to perform an
|
|
13
|
-
* async task for example, it's current state is saved an a new ExecutionFrame
|
|
14
|
-
* is pushed to the runner to continue where it left off.
|
|
9
|
+
* Job is a request by a thread to execute VM code on its behalf to
|
|
10
|
+
* the SharedThreadRunner
|
|
15
11
|
*/
|
|
16
|
-
var
|
|
17
|
-
function
|
|
18
|
-
if (
|
|
19
|
-
if (fsp === void 0) { fsp = 0; }
|
|
20
|
-
if (rp === void 0) { rp = 0; }
|
|
12
|
+
var Job = /** @class */ (function () {
|
|
13
|
+
function Job(thread, fun, args) {
|
|
14
|
+
if (args === void 0) { args = []; }
|
|
21
15
|
this.thread = thread;
|
|
22
|
-
this.
|
|
23
|
-
this.
|
|
24
|
-
this.rp = rp;
|
|
16
|
+
this.fun = fun;
|
|
17
|
+
this.args = args;
|
|
25
18
|
}
|
|
26
|
-
return
|
|
19
|
+
return Job;
|
|
27
20
|
}());
|
|
28
|
-
exports.
|
|
21
|
+
exports.Job = Job;
|
|
29
22
|
/**
|
|
30
23
|
* SharedThreadRunner allows multiple Threads to execute their code sequentially
|
|
31
24
|
* in a single JS event loop.
|
|
@@ -43,36 +36,48 @@ exports.ExecutionFrame = ExecutionFrame;
|
|
|
43
36
|
* of a shared event loop.
|
|
44
37
|
*/
|
|
45
38
|
var SharedThreadRunner = /** @class */ (function () {
|
|
46
|
-
function SharedThreadRunner(vm,
|
|
47
|
-
if (
|
|
39
|
+
function SharedThreadRunner(vm, jobs) {
|
|
40
|
+
if (jobs === void 0) { jobs = []; }
|
|
48
41
|
this.vm = vm;
|
|
49
|
-
this.
|
|
42
|
+
this.jobs = jobs;
|
|
50
43
|
this._running = false;
|
|
51
44
|
}
|
|
52
45
|
/**
|
|
53
|
-
* enqueue
|
|
46
|
+
* enqueue a Job for future execution.
|
|
54
47
|
*/
|
|
55
|
-
SharedThreadRunner.prototype.enqueue = function (
|
|
56
|
-
this.
|
|
48
|
+
SharedThreadRunner.prototype.enqueue = function (job) {
|
|
49
|
+
this.jobs.push(job);
|
|
57
50
|
return this;
|
|
58
51
|
};
|
|
59
52
|
/**
|
|
60
|
-
* dequeue all
|
|
53
|
+
* dequeue all Jobs for the provide thread effectively ending its
|
|
61
54
|
* execution.
|
|
62
55
|
*/
|
|
63
56
|
SharedThreadRunner.prototype.dequeue = function (thread) {
|
|
64
|
-
this.
|
|
57
|
+
this.jobs = this.jobs.filter(function (job) { return job.thread !== thread; });
|
|
58
|
+
};
|
|
59
|
+
/**
|
|
60
|
+
* postJob enqueues a Job for execution triggering the run() loop immediately
|
|
61
|
+
* if not already running.
|
|
62
|
+
*/
|
|
63
|
+
SharedThreadRunner.prototype.postJob = function (job) {
|
|
64
|
+
this.enqueue(job);
|
|
65
|
+
this.run();
|
|
65
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* run the Job processing loop until there are no more Jobs to process in
|
|
69
|
+
* the queue.
|
|
70
|
+
*/
|
|
66
71
|
SharedThreadRunner.prototype.run = function () {
|
|
67
72
|
if (this._running)
|
|
68
73
|
return;
|
|
69
74
|
this._running = true;
|
|
70
|
-
var
|
|
71
|
-
while (
|
|
72
|
-
return
|
|
75
|
+
var job;
|
|
76
|
+
while (job = this.jobs.find(function (job) {
|
|
77
|
+
return job.thread.state === __1.THREAD_STATE_IDLE;
|
|
73
78
|
})) {
|
|
74
|
-
var thread =
|
|
75
|
-
thread.restore(
|
|
79
|
+
var thread = job.thread;
|
|
80
|
+
thread.restore(job);
|
|
76
81
|
while (!array_1.empty(thread.fstack)) {
|
|
77
82
|
var sp = thread.fsp;
|
|
78
83
|
var frame = thread.fstack[sp];
|
|
@@ -100,12 +105,12 @@ var SharedThreadRunner = /** @class */ (function () {
|
|
|
100
105
|
// and handle other threads.
|
|
101
106
|
break;
|
|
102
107
|
if (sp === thread.fsp)
|
|
103
|
-
thread.
|
|
108
|
+
thread.nextFrame(frame.data.pop() || 0);
|
|
104
109
|
}
|
|
105
110
|
if (array_1.empty(thread.fstack))
|
|
106
111
|
// The thread's frame stack is empty, meaning all execution is
|
|
107
|
-
// complete. Remove the
|
|
108
|
-
this.
|
|
112
|
+
// complete. Remove the job from the queue.
|
|
113
|
+
this.jobs = array_1.remove(this.jobs, job);
|
|
109
114
|
}
|
|
110
115
|
this._running = false;
|
|
111
116
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["runner.ts"],"names":[],"mappings":";;;AAAA,oDAA2D;AAI3D,uCAA4C;AAC5C,yCAA0D;
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["runner.ts"],"names":[],"mappings":";;;AAAA,oDAA2D;AAI3D,uCAA4C;AAC5C,yCAA0D;AAE1D,yBAKa;AAEb;;;GAGG;AACH;IAEI,aACW,MAAgB,EAChB,GAAY,EACZ,IAAiB;QAAjB,qBAAA,EAAA,SAAiB;QAFjB,WAAM,GAAN,MAAM,CAAU;QAChB,QAAG,GAAH,GAAG,CAAS;QACZ,SAAI,GAAJ,IAAI,CAAa;IAAI,CAAC;IAErC,UAAC;AAAD,CAAC,AAPD,IAOC;AAPY,kBAAG;AAShB;;;;;;;;;;;;;;;GAeG;AACH;IAEI,4BACW,EAAY,EACZ,IAAgB;QAAhB,qBAAA,EAAA,SAAgB;QADhB,OAAE,GAAF,EAAE,CAAU;QACZ,SAAI,GAAJ,IAAI,CAAY;QAE3B,aAAQ,GAAG,KAAK,CAAC;IAFc,CAAC;IAIhC;;OAEG;IACH,oCAAO,GAAP,UAAQ,GAAQ;QAEZ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEpB,OAAO,IAAI,CAAC;IAEhB,CAAC;IAED;;;OAGG;IACH,oCAAO,GAAP,UAAQ,MAAgB;QAEpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAA,GAAG,IAAI,OAAA,GAAG,CAAC,MAAM,KAAK,MAAM,EAArB,CAAqB,CAAC,CAAC;IAE/D,CAAC;IAED;;;OAGG;IACH,oCAAO,GAAP,UAAQ,GAAQ;QAEZ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAElB,IAAI,CAAC,GAAG,EAAE,CAAC;IAEf,CAAC;IAED;;;OAGG;IACH,gCAAG,GAAH;QAEI,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAE1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QAErB,IAAI,GAAG,CAAC;QACR,OAAO,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAA,GAAG;YAC3B,OAAA,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,qBAAiB;QAAtC,CAAsC,CAAC,EAAE;YAEzC,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAExB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAEpB,OAAO,CAAC,aAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;gBAE1B,IAAI,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC;gBAEpB,IAAI,KAAK,GAAU,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAErC,IAAI,MAAM,CAAC,EAAE,IAAI,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAE/B,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE;oBACtB,CAAC,MAAM,CAAC,KAAK,KAAK,oBAAgB,CAAC,EAAE;oBAErC,4BAA4B;oBAC5B,IAAI,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;oBAC9B,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;oBACnC,IAAI,MAAM,GAAG,IAAI,GAAG,qBAAW,CAAC;oBAChC,IAAI,OAAO,GAAG,IAAI,GAAG,sBAAY,CAAC;oBAElC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;oBAE9C,0DAA0D;oBAC1D,aAAQ,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;oBAEzC,IAAI,GAAG,KAAK,KAAK,CAAC,WAAW,EAAE;wBAAE,KAAK,CAAC,OAAO,EAAE,CAAC;oBAEjD,sDAAsD;oBACtD,4BAA4B;oBAC5B,IAAI,EAAE,KAAK,MAAM,CAAC,GAAG;wBAAE,MAAM;iBAEhC;gBAED,IAAI,MAAM,CAAC,KAAK,KAAK,qBAAiB;oBAClC,2DAA2D;oBAC3D,4BAA4B;oBAC5B,MAAM;gBAEV,IAAI,EAAE,KAAK,MAAM,CAAC,GAAG;oBACjB,MAAM,CAAC,SAAS,CAAO,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;aAErD;YAED,IAAI,aAAK,CAAC,MAAM,CAAC,MAAM,CAAC;gBACpB,+DAA+D;gBAC/D,2CAA2C;gBAC3C,IAAI,CAAC,IAAI,GAAG,cAAM,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;SAE1C;QAED,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAE1B,CAAC;IAEL,yBAAC;AAAD,CAAC,AA/GD,IA+GC;AA/GY,gDAAkB"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { empty, remove } from '@quenk/noni/lib/data/array';
|
|
2
2
|
|
|
3
3
|
import { Platform } from '../../';
|
|
4
|
-
import { Frame,
|
|
4
|
+
import { Frame, Data } from '../../runtime/stack/frame';
|
|
5
5
|
import { handlers } from '../../runtime/op';
|
|
6
6
|
import { OPCODE_MASK, OPERAND_MASK } from '../../runtime';
|
|
7
|
+
import { FunInfo } from '../../script/info';
|
|
7
8
|
import {
|
|
8
9
|
THREAD_STATE_IDLE,
|
|
9
10
|
THREAD_STATE_RUN,
|
|
@@ -12,20 +13,15 @@ import {
|
|
|
12
13
|
} from '../';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
* This is used to both trigger execution of an fstack as well as restore
|
|
18
|
-
* execution in the shared environment. When a VMThread needs to perform an
|
|
19
|
-
* async task for example, it's current state is saved an a new ExecutionFrame
|
|
20
|
-
* is pushed to the runner to continue where it left off.
|
|
16
|
+
* Job is a request by a thread to execute VM code on its behalf to
|
|
17
|
+
* the SharedThreadRunner
|
|
21
18
|
*/
|
|
22
|
-
export class
|
|
19
|
+
export class Job {
|
|
23
20
|
|
|
24
21
|
constructor(
|
|
25
22
|
public thread: VMThread,
|
|
26
|
-
public
|
|
27
|
-
public
|
|
28
|
-
public rp = 0) { }
|
|
23
|
+
public fun: FunInfo,
|
|
24
|
+
public args: Data[] = []) { }
|
|
29
25
|
|
|
30
26
|
}
|
|
31
27
|
|
|
@@ -49,44 +45,60 @@ export class SharedThreadRunner {
|
|
|
49
45
|
|
|
50
46
|
constructor(
|
|
51
47
|
public vm: Platform,
|
|
52
|
-
public
|
|
48
|
+
public jobs: Job[] = []) { }
|
|
53
49
|
|
|
54
50
|
_running = false;
|
|
55
51
|
|
|
56
52
|
/**
|
|
57
|
-
* enqueue
|
|
53
|
+
* enqueue a Job for future execution.
|
|
58
54
|
*/
|
|
59
|
-
enqueue(
|
|
55
|
+
enqueue(job: Job) {
|
|
60
56
|
|
|
61
|
-
this.
|
|
57
|
+
this.jobs.push(job);
|
|
62
58
|
|
|
63
59
|
return this;
|
|
64
60
|
|
|
65
61
|
}
|
|
66
62
|
|
|
67
63
|
/**
|
|
68
|
-
* dequeue all
|
|
64
|
+
* dequeue all Jobs for the provide thread effectively ending its
|
|
69
65
|
* execution.
|
|
70
66
|
*/
|
|
71
67
|
dequeue(thread: VMThread) {
|
|
72
68
|
|
|
73
|
-
this.
|
|
69
|
+
this.jobs = this.jobs.filter(job => job.thread !== thread);
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* postJob enqueues a Job for execution triggering the run() loop immediately
|
|
75
|
+
* if not already running.
|
|
76
|
+
*/
|
|
77
|
+
postJob(job: Job) {
|
|
78
|
+
|
|
79
|
+
this.enqueue(job);
|
|
80
|
+
|
|
81
|
+
this.run();
|
|
74
82
|
|
|
75
83
|
}
|
|
76
84
|
|
|
85
|
+
/**
|
|
86
|
+
* run the Job processing loop until there are no more Jobs to process in
|
|
87
|
+
* the queue.
|
|
88
|
+
*/
|
|
77
89
|
run() {
|
|
78
90
|
|
|
79
91
|
if (this._running) return;
|
|
80
92
|
|
|
81
93
|
this._running = true;
|
|
82
94
|
|
|
83
|
-
let
|
|
84
|
-
while (
|
|
85
|
-
|
|
95
|
+
let job;
|
|
96
|
+
while (job = this.jobs.find(job =>
|
|
97
|
+
job.thread.state === THREAD_STATE_IDLE)) {
|
|
86
98
|
|
|
87
|
-
let thread =
|
|
99
|
+
let thread = job.thread;
|
|
88
100
|
|
|
89
|
-
thread.restore(
|
|
101
|
+
thread.restore(job);
|
|
90
102
|
|
|
91
103
|
while (!empty(thread.fstack)) {
|
|
92
104
|
|
|
@@ -125,14 +137,14 @@ export class SharedThreadRunner {
|
|
|
125
137
|
break;
|
|
126
138
|
|
|
127
139
|
if (sp === thread.fsp)
|
|
128
|
-
thread.
|
|
140
|
+
thread.nextFrame(<Data>frame.data.pop() || 0);
|
|
129
141
|
|
|
130
142
|
}
|
|
131
143
|
|
|
132
144
|
if (empty(thread.fstack))
|
|
133
145
|
// The thread's frame stack is empty, meaning all execution is
|
|
134
|
-
// complete. Remove the
|
|
135
|
-
this.
|
|
146
|
+
// complete. Remove the job from the queue.
|
|
147
|
+
this.jobs = remove(this.jobs, job);
|
|
136
148
|
|
|
137
149
|
}
|
|
138
150
|
|