UNPKG

4.25 kBTypeScriptView Raw
1import type { Encoder } from './compile/index.js';
2import type { ComponentDefinition, ComponentDefinitionState } from './components.js';
3import type { HelperDefinitionState } from './runtime.js';
4import type { ModifierDefinitionState } from './runtime/modifier.js';
5import type { CompileTimeResolver, ResolvedComponentDefinition } from './serialize.js';
6import type { ContainingMetadata, STDLib, Template } from './template.js';
7import type { SomeVmOp, VmMachineOp, VmOp } from './vm-opcodes.js';
8
9export type CreateRuntimeOp = (heap: CompileTimeHeap) => RuntimeOp;
10
11export interface RuntimeOp {
12 offset: number;
13 type: SomeVmOp;
14 op1: number;
15 op2: number;
16 op3: number;
17 size: number;
18 isMachine: 0 | 1;
19}
20
21export interface SerializedHeap {
22 buffer: ArrayBuffer;
23 table: number[];
24 handle: number;
25}
26
27export interface OpcodeHeap {
28 getbyaddr(address: number): number;
29}
30
31export interface CompileTimeHeap extends OpcodeHeap {
32 pushRaw(value: number): void;
33 pushOp(name: VmOp, op1?: number, op2?: number, op3?: number): void;
34 pushMachine(name: VmMachineOp, op1?: number, op2?: number, op3?: number): void;
35 malloc(): number;
36 finishMalloc(handle: number, scopeSize: number): void;
37 capture(offset?: number): SerializedHeap;
38 offset: number;
39
40 // for debugging
41 getaddr(handle: number): number;
42 sizeof(handle: number): number;
43 getbyaddr(address: number): number;
44 setbyaddr(address: number, value: number): void;
45}
46
47export interface RuntimeHeap extends OpcodeHeap {
48 getaddr(handle: number): number;
49 sizeof(handle: number): number;
50}
51
52export interface CompileTimeCompilationContext {
53 // The offsets to stdlib functions
54 readonly stdlib: STDLib;
55
56 readonly createOp: CreateRuntimeOp;
57
58 // Interned constants
59 readonly constants: CompileTimeConstants & ResolutionTimeConstants;
60
61 // The mechanism of resolving names to values at compile-time
62 readonly resolver: CompileTimeResolver;
63
64 // The heap that the program is serializing into
65 readonly heap: CompileTimeHeap;
66}
67
68/**
69 * Options for compiling a specific template. This carries
70 * along the static information associated with the entire
71 * template when compiling blocks nested inside of it.
72 */
73export interface TemplateCompilationContext {
74 readonly program: CompileTimeCompilationContext;
75 readonly encoder: Encoder;
76 readonly meta: ContainingMetadata;
77}
78
79export type EMPTY_ARRAY = Array<ReadonlyArray<never>>;
80
81export type ConstantPool = unknown[];
82
83/**
84 * Constants are interned values that are referenced as numbers in the program.
85 * The constant pool is a part of the program, and is always transmitted
86 * together with the program.
87 */
88export interface CompileTimeConstants {
89 value(value: unknown): number;
90 array(values: unknown[] | readonly unknown[]): number;
91 toPool(): ConstantPool;
92}
93
94/**
95 * Resolution happens when components are first loaded, either via the resolver
96 * or via looking them up in template scope.
97 */
98export interface ResolutionTimeConstants {
99 // TODO: The default template is unique per-program. This should likely belong
100 // in StdLib, but it's not really possible to thread it through that way
101 // currently.
102 defaultTemplate: Template;
103
104 helper(
105 definitionState: HelperDefinitionState,
106 resolvedName: string | null,
107 isOptional: true
108 ): number | null;
109 helper(definitionState: HelperDefinitionState, resolvedName?: string | null): number;
110
111 modifier(
112 definitionState: ModifierDefinitionState,
113 resolvedName: string | null,
114 isOptional: true
115 ): number | null;
116 modifier(definitionState: ModifierDefinitionState, resolvedName?: string | null): number;
117
118 component(
119 definitionState: ComponentDefinitionState,
120 owner: object,
121 isOptional?: false
122 ): ComponentDefinition;
123 component(
124 definitionState: ComponentDefinitionState,
125 owner: object,
126 isOptional?: boolean
127 ): ComponentDefinition | null;
128
129 resolvedComponent(
130 definitionState: ResolvedComponentDefinition,
131 resolvedName: string
132 ): ComponentDefinition;
133}
134
135export interface RuntimeConstants {
136 getValue<T>(handle: number): T;
137 getArray<T>(handle: number): T[];
138}
139
140export interface CompileTimeArtifacts {
141 heap: CompileTimeHeap;
142 constants: CompileTimeConstants & ResolutionTimeConstants;
143}