UNPKG

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