@markw65/monkeyc-optimizer 1.1.33 → 1.1.34

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.
Files changed (80) hide show
  1. package/README.md +1 -932
  2. package/build/api.cjs +31 -31
  3. package/build/{chunk-7ANQTFGD.cjs → chunk-QBCVUVLD.cjs} +163 -46
  4. package/build/optimizer.cjs +17 -17
  5. package/build/sdk-util.cjs +14 -14
  6. package/build/src/api.d.ts +1 -1
  7. package/build/src/readprg.d.ts +0 -6
  8. package/build/src/src/api.d.ts +51 -0
  9. package/build/src/src/ast.d.ts +59 -0
  10. package/build/src/src/build.d.ts +7 -0
  11. package/build/src/src/cftinfo.d.ts +32 -0
  12. package/build/src/src/control-flow.d.ts +22 -0
  13. package/build/src/src/data-flow.d.ts +107 -0
  14. package/build/src/src/driver.d.ts +2 -0
  15. package/build/src/src/function-info.d.ts +14 -0
  16. package/build/src/src/inliner.d.ts +13 -0
  17. package/build/src/src/jungles.d.ts +66 -0
  18. package/build/src/src/launch.d.ts +5 -0
  19. package/build/src/src/logger.d.ts +6 -0
  20. package/build/src/src/manifest.d.ts +11 -0
  21. package/build/src/src/mc-rewrite.d.ts +13 -0
  22. package/build/src/src/negative-fixups.d.ts +1 -0
  23. package/build/src/src/optimizer-types.d.ts +249 -0
  24. package/build/src/src/optimizer.d.ts +100 -0
  25. package/build/src/src/pragma-checker.d.ts +3 -0
  26. package/build/src/src/pre.d.ts +2 -0
  27. package/build/src/src/projects.d.ts +26 -0
  28. package/build/src/src/readprg/array-init.d.ts +3 -0
  29. package/build/src/src/readprg/bytecode.d.ts +72 -0
  30. package/build/src/src/readprg/cflow.d.ts +17 -0
  31. package/build/src/src/readprg/data.d.ts +4 -0
  32. package/build/src/src/readprg/dce.d.ts +6 -0
  33. package/build/src/src/readprg/emit.d.ts +23 -0
  34. package/build/src/src/readprg/exceptions.d.ts +10 -0
  35. package/build/src/src/readprg/header.d.ts +15 -0
  36. package/build/src/src/readprg/interp.d.ts +21 -0
  37. package/build/src/src/readprg/linenum.d.ts +29 -0
  38. package/build/src/src/readprg/locals.d.ts +3 -0
  39. package/build/src/src/readprg/opcodes.d.ts +279 -0
  40. package/build/src/src/readprg/optimize.d.ts +3 -0
  41. package/build/src/src/readprg/pre.d.ts +2 -0
  42. package/build/src/src/readprg/sharing.d.ts +2 -0
  43. package/build/src/src/readprg/signer.d.ts +8 -0
  44. package/build/src/src/readprg/symbols.d.ts +19 -0
  45. package/build/src/src/readprg.d.ts +25 -0
  46. package/build/src/src/resources.d.ts +12 -0
  47. package/build/src/src/sdk-util.d.ts +28 -0
  48. package/build/src/src/type-flow/could-be.d.ts +5 -0
  49. package/build/src/src/type-flow/dead-store.d.ts +18 -0
  50. package/build/src/src/type-flow/interp-binary.d.ts +4 -0
  51. package/build/src/src/type-flow/interp-call.d.ts +16 -0
  52. package/build/src/src/type-flow/interp.d.ts +33 -0
  53. package/build/src/src/type-flow/intersection-type.d.ts +4 -0
  54. package/build/src/src/type-flow/minimize-locals.d.ts +4 -0
  55. package/build/src/src/type-flow/minimize-modules.d.ts +3 -0
  56. package/build/src/src/type-flow/optimize.d.ts +7 -0
  57. package/build/src/src/type-flow/sub-type.d.ts +2 -0
  58. package/build/src/src/type-flow/type-flow-util.d.ts +27 -0
  59. package/build/src/src/type-flow/types.d.ts +204 -0
  60. package/build/src/src/type-flow/union-type.d.ts +4 -0
  61. package/build/src/src/type-flow.d.ts +18 -0
  62. package/build/src/src/unused-exprs.d.ts +3 -0
  63. package/build/src/src/util.d.ts +33 -0
  64. package/build/src/src/variable-renamer.d.ts +4 -0
  65. package/build/src/src/visitor.d.ts +5 -0
  66. package/build/src/src/worker-pool.d.ts +4 -0
  67. package/build/src/src/worker-task.d.ts +88 -0
  68. package/build/src/src/worker-thread.d.ts +1 -0
  69. package/build/src/src/xml-util.d.ts +172 -0
  70. package/build/src/test/mocha/bytecode.spec.d.ts +1 -0
  71. package/build/src/test/mocha/coudbe.spec.d.ts +2 -0
  72. package/build/src/test/mocha/intersection.spec.d.ts +2 -0
  73. package/build/src/test/mocha/root.spec.d.ts +1 -0
  74. package/build/src/test/mocha/subtype.spec.d.ts +2 -0
  75. package/build/src/test/mocha/test-utils.d.ts +6 -0
  76. package/build/src/test/mocha/types.spec.d.ts +1 -0
  77. package/build/src/type-flow/interp.d.ts +3 -1
  78. package/build/src/type-flow/types.d.ts +1 -1
  79. package/build/worker-thread.cjs +3 -3
  80. package/package.json +1 -1
@@ -0,0 +1,26 @@
1
+ import { BuildConfig } from "./optimizer-types";
2
+ export type RemoteProject = string | {
3
+ root: string;
4
+ options?: BuildConfig;
5
+ rename?: {
6
+ from: string;
7
+ to: string;
8
+ }[];
9
+ build?: boolean;
10
+ comment?: string;
11
+ exclude?: string;
12
+ include?: string;
13
+ sourcePath?: string;
14
+ jungleContent?: string[];
15
+ garminOptLevel?: number;
16
+ test?: boolean | string[];
17
+ branch?: string;
18
+ };
19
+ export declare const githubProjects: RemoteProject[];
20
+ export declare function fetchGitProjects(projects: RemoteProject[], testOnly: boolean, skipRemote: boolean): Promise<(string | {
21
+ jungle: string;
22
+ build: boolean | null;
23
+ options: BuildConfig | null;
24
+ garminOptLevel: number | null;
25
+ products: string[] | null;
26
+ })[]>;
@@ -0,0 +1,3 @@
1
+ import { Block, Context, FuncEntry } from "./bytecode";
2
+ import { InterpState } from "./interp";
3
+ export declare function optimizeArrayInit(func: FuncEntry, block: Block, index: number, context: Context, interpState: InterpState | null): boolean;
@@ -0,0 +1,72 @@
1
+ /// <reference types="node" />
2
+ import * as crypto from "node:crypto";
3
+ import { BuildConfig } from "../optimizer-types";
4
+ import { xmlUtil } from "../sdk-util";
5
+ import { ExceptionEntry, ExceptionsMap } from "./exceptions";
6
+ import { Header } from "./header";
7
+ import { LineNumber } from "./linenum";
8
+ import { Bytecode, Opcodes } from "./opcodes";
9
+ import { SymbolTable } from "./symbols";
10
+ export declare const enum SectionKinds {
11
+ HEADER = -805253120,
12
+ TEXT = -1059145026,
13
+ DATA = -629491010,
14
+ SYMBOLS = 1461170197,
15
+ LINENUM = -1059161423,
16
+ EXCEPTIONS = 248410373,
17
+ SIGNATURE = -507453934,
18
+ STORE_SIG = 20833
19
+ }
20
+ export type SectionInfo = {
21
+ offset: number;
22
+ length: number;
23
+ view: DataView;
24
+ };
25
+ export type Logger = (module: string, level: number, message: string) => void;
26
+ export type Context = {
27
+ config: BuildConfig;
28
+ filepath: string;
29
+ sections: Record<number, SectionInfo>;
30
+ header: Header;
31
+ symbolTable: SymbolTable;
32
+ lineTable: Map<number, LineNumber>;
33
+ exceptionsMap: ExceptionsMap;
34
+ bytecodes: Bytecode[];
35
+ key?: crypto.KeyObject;
36
+ debugXml: xmlUtil.Document;
37
+ nextOffset: number;
38
+ nextLocalId: number;
39
+ };
40
+ export type Block = {
41
+ offset: number;
42
+ bytecodes: Bytecode[];
43
+ try?: ExceptionEntry[];
44
+ next?: number;
45
+ taken?: number;
46
+ exsucc?: number;
47
+ preds?: Set<number>;
48
+ };
49
+ export type FuncEntry = {
50
+ name?: string;
51
+ offset: number;
52
+ argc?: number;
53
+ blocks: Map<number, Block>;
54
+ };
55
+ export declare function offsetToString(offset: number): string;
56
+ export declare function fixSectionSize(section: SectionKinds, sections: Context["sections"], newSize: number): void;
57
+ export declare function optimizeBytecode(context: Context): void;
58
+ export declare function functionBanner(func: FuncEntry, context: Context | null, pass: string, extra?: (block: Block, footer: boolean) => string): () => string;
59
+ export declare function printFunction(func: FuncEntry, context: Context | null): void;
60
+ export declare function functionToString(func: FuncEntry, context: Context | null, extra?: (block: Block, footer: boolean) => string): string;
61
+ export declare function blockToString(block: Block, context: Context | null): string;
62
+ export declare function lineInfoToString(lineInfo: LineNumber, context: Context | null): string;
63
+ export declare function bytecodeToString(bytecode: Bytecode, symbolTable: SymbolTable | null | undefined): string;
64
+ export declare function findFunctions({ bytecodes, symbolTable, exceptionsMap, }: Context): Map<number, FuncEntry>;
65
+ export declare function makeArgless(bc: Bytecode, op: Opcodes): void;
66
+ export declare function equalBlocks(b1: Block, b2: Block): boolean;
67
+ export declare function removeBlock(func: FuncEntry, offset: number): void;
68
+ export declare function removePred(func: FuncEntry, target: number, pred: number): void;
69
+ export declare function addPred(func: FuncEntry, target: number, pred: number): void;
70
+ export declare function redirect(func: FuncEntry, block: Block, from: number, to: number | null | undefined): boolean;
71
+ export declare function splitBlock(func: FuncEntry, block: Block, offset: number): void;
72
+ export declare function countFallthroughPreds(func: FuncEntry, block: Block): number;
@@ -0,0 +1,17 @@
1
+ import { Block, FuncEntry } from "./bytecode";
2
+ import { Bytecode } from "./opcodes";
3
+ export declare function postOrderTraverse(func: FuncEntry, visitor: (block: Block) => void): void;
4
+ export declare function intersect<T>(a: Set<T>, b: Set<T>): Set<T>;
5
+ export type DomLike = Map<number, Set<number>>;
6
+ export declare function computePostDominators(func: FuncEntry): DomLike;
7
+ export declare function computeDominators(func: FuncEntry): DomLike;
8
+ export declare function postOrderPropagate<T>(func: FuncEntry, preBlock: (block: Block) => T, processBc: (block: Block, bc: Bytecode, state: T) => void, postBlock: (block: Block, state: T) => void, merge: (state: T, predBlock: Block, isExPred: boolean) => boolean): void;
9
+ export declare const enum RpoFlags {
10
+ Nothing = 0,
11
+ EnqueueTaken = 1,
12
+ EnqueueNext = 2,
13
+ SkipTaken = 4,
14
+ SkipNext = 8,
15
+ RestartBlock = 16
16
+ }
17
+ export declare function rpoPropagate<T>(func: FuncEntry, preBlock: (block: Block) => T, processBc: ((block: Block, bc: Bytecode, state: T) => RpoFlags | null | undefined | void) | null, postBlock: (block: Block, state: T) => void, merge: (from: Block, state: T, succBlock: Block, isExSucc: boolean) => boolean): void;
@@ -0,0 +1,4 @@
1
+ import { Context } from "./bytecode";
2
+ import { SymbolTable } from "./symbols";
3
+ export declare function parseData(view: DataView, symbols: SymbolTable): void;
4
+ export declare function fixupData(context: Context, offsetMap: Map<number, number>): void;
@@ -0,0 +1,6 @@
1
+ import { Context, FuncEntry } from "./bytecode";
2
+ export declare function localDCE(func: FuncEntry, context: Context): boolean;
3
+ export declare function computeLiveLocals(func: FuncEntry): {
4
+ liveInLocals: Map<number, Set<number>>;
5
+ liveOutLocals: Map<number, Set<number>>;
6
+ };
@@ -0,0 +1,23 @@
1
+ import { Context, FuncEntry } from "./bytecode";
2
+ import { ExceptionsMap } from "./exceptions";
3
+ import { LineNumber } from "./linenum";
4
+ type LocalXmlInfo = {
5
+ name: string;
6
+ startPc: number;
7
+ endPc: number;
8
+ isParam: boolean;
9
+ slot: number;
10
+ id: number;
11
+ };
12
+ export type LocalsMap = Map<number, {
13
+ startPc: number;
14
+ endPc: number;
15
+ }>;
16
+ export type UpdateInfo = {
17
+ offsetMap: Map<number, number>;
18
+ localRanges: LocalXmlInfo[];
19
+ lineMap: LineNumber[];
20
+ exceptionsMap: ExceptionsMap;
21
+ };
22
+ export declare function emitFunc(func: FuncEntry, view: DataView, start: number, updateInfo: UpdateInfo, context: Context): number;
23
+ export {};
@@ -0,0 +1,10 @@
1
+ import { Context } from "./bytecode";
2
+ import { UpdateInfo } from "./emit";
3
+ export type ExceptionEntry = {
4
+ tryStart: number;
5
+ tryEnd: number;
6
+ handler: number;
7
+ };
8
+ export type ExceptionsMap = Map<number, ExceptionEntry[]>;
9
+ export declare function parseExceptions(view: DataView): ExceptionsMap;
10
+ export declare function fixupExceptions(context: Context, updateInfo: UpdateInfo): void;
@@ -0,0 +1,15 @@
1
+ import { Context } from "./bytecode";
2
+ import { UpdateInfo } from "./emit";
3
+ export type SectionOffset = {
4
+ data: number;
5
+ code: number;
6
+ };
7
+ export type Header = {
8
+ ciqVersion: number;
9
+ backgroundOffsets: SectionOffset;
10
+ appLock: boolean;
11
+ glanceOffsets: SectionOffset;
12
+ flags: number;
13
+ };
14
+ export declare function parseHeader(view: DataView): Header;
15
+ export declare function fixupHeader(context: Context, updateInfo: UpdateInfo): void;
@@ -0,0 +1,21 @@
1
+ import { ExactOrUnion } from "../optimizer";
2
+ import { Context, FuncEntry } from "./bytecode";
3
+ import { Bytecode, Lputv } from "./opcodes";
4
+ interface InterpItemInfo {
5
+ type: ExactOrUnion;
6
+ equivs?: Set<number>;
7
+ }
8
+ export type InterpState = {
9
+ stack: InterpItemInfo[];
10
+ locals: InterpItemInfo[];
11
+ loopBlock?: true;
12
+ };
13
+ export declare function cloneState(state: InterpState | null | undefined): InterpState;
14
+ export declare function interpBytecode(bc: Bytecode, localState: InterpState, context: Context): void;
15
+ export declare function interpFunc(func: FuncEntry, context: Context): {
16
+ liveInState: Map<number, InterpState>;
17
+ equivSets: Map<Lputv, Set<number>>;
18
+ changes: number;
19
+ };
20
+ export declare function instForType(type: ExactOrUnion, offset: number): Bytecode | null;
21
+ export {};
@@ -0,0 +1,29 @@
1
+ import { xmlUtil } from "../sdk-util";
2
+ import { Context } from "./bytecode";
3
+ import { UpdateInfo } from "./emit";
4
+ interface BaseLineNumber {
5
+ pc: number;
6
+ file?: number | undefined;
7
+ fileStr?: string | undefined;
8
+ symbol?: number | undefined;
9
+ symbolStr?: string | undefined;
10
+ line: number;
11
+ }
12
+ interface LineNumberSym extends BaseLineNumber {
13
+ file: number;
14
+ symbol: number;
15
+ fileStr?: undefined;
16
+ symbolStr?: undefined;
17
+ }
18
+ interface LineNumberStr extends BaseLineNumber {
19
+ file?: undefined;
20
+ symbol?: undefined;
21
+ fileStr: string;
22
+ symbolStr: string;
23
+ parent?: string | undefined;
24
+ id: number;
25
+ }
26
+ export type LineNumber = LineNumberStr | LineNumberSym;
27
+ export declare function parseLineNum(view: DataView, debugXml: xmlUtil.Document): Map<number, LineNumber>;
28
+ export declare function fixupLineNum(context: Context, updateInfo: UpdateInfo): void;
29
+ export {};
@@ -0,0 +1,3 @@
1
+ import { Context, FuncEntry } from "./bytecode";
2
+ import { Lputv } from "./opcodes";
3
+ export declare function minimizeLocals(func: FuncEntry, equivSets: Map<Lputv, Set<number>>, context: Context): boolean;
@@ -0,0 +1,279 @@
1
+ import { LineNumber } from "./linenum";
2
+ export declare enum Opcodes {
3
+ nop = 0,
4
+ incsp = 1,
5
+ popv = 2,
6
+ addv = 3,
7
+ subv = 4,
8
+ mulv = 5,
9
+ divv = 6,
10
+ andv = 7,
11
+ orv = 8,
12
+ modv = 9,
13
+ shlv = 10,
14
+ shrv = 11,
15
+ xorv = 12,
16
+ getv = 13,
17
+ putv = 14,
18
+ invokem = 15,
19
+ agetv = 16,
20
+ aputv = 17,
21
+ lgetv = 18,
22
+ lputv = 19,
23
+ newa = 20,
24
+ newc = 21,
25
+ return = 22,
26
+ ret = 23,
27
+ news = 24,
28
+ goto = 25,
29
+ eq = 26,
30
+ lt = 27,
31
+ lte = 28,
32
+ gt = 29,
33
+ gte = 30,
34
+ ne = 31,
35
+ isnull = 32,
36
+ isa = 33,
37
+ canhazplz = 34,
38
+ jsr = 35,
39
+ ts = 36,
40
+ ipush = 37,
41
+ fpush = 38,
42
+ spush = 39,
43
+ bt = 40,
44
+ bf = 41,
45
+ frpush = 42,
46
+ bpush = 43,
47
+ npush = 44,
48
+ invv = 45,
49
+ dup = 46,
50
+ newd = 47,
51
+ getm = 48,
52
+ lpush = 49,
53
+ dpush = 50,
54
+ throw = 51,
55
+ cpush = 52,
56
+ argc = 53,
57
+ newba = 54
58
+ }
59
+ interface BaseOpcode {
60
+ op: Opcodes;
61
+ offset: number;
62
+ size: number;
63
+ lineNum?: LineNumber;
64
+ arg?: unknown;
65
+ }
66
+ export interface Incsp extends BaseOpcode {
67
+ op: Opcodes.incsp;
68
+ arg: number;
69
+ }
70
+ export interface Argless extends BaseOpcode {
71
+ arg?: never;
72
+ }
73
+ export interface ByteArg extends BaseOpcode {
74
+ arg: number;
75
+ }
76
+ export interface ShortArg extends BaseOpcode {
77
+ arg: number;
78
+ }
79
+ export interface WordArg extends BaseOpcode {
80
+ arg: number;
81
+ }
82
+ export interface FloatArg extends BaseOpcode {
83
+ arg: number;
84
+ }
85
+ export interface LongArg extends BaseOpcode {
86
+ arg: bigint;
87
+ }
88
+ export interface DoubleArg extends BaseOpcode {
89
+ arg: number;
90
+ }
91
+ export interface Nop extends Argless {
92
+ op: Opcodes.nop;
93
+ }
94
+ export interface Popv extends Argless {
95
+ op: Opcodes.popv;
96
+ }
97
+ export interface Addv extends Argless {
98
+ op: Opcodes.addv;
99
+ }
100
+ export interface Subv extends Argless {
101
+ op: Opcodes.subv;
102
+ }
103
+ export interface Mulv extends Argless {
104
+ op: Opcodes.mulv;
105
+ }
106
+ export interface Divv extends Argless {
107
+ op: Opcodes.divv;
108
+ }
109
+ export interface Andv extends Argless {
110
+ op: Opcodes.andv;
111
+ }
112
+ export interface Orv extends Argless {
113
+ op: Opcodes.orv;
114
+ }
115
+ export interface Modv extends Argless {
116
+ op: Opcodes.modv;
117
+ }
118
+ export interface Shlv extends ByteArg {
119
+ op: Opcodes.shlv;
120
+ }
121
+ export interface Shrv extends ByteArg {
122
+ op: Opcodes.shrv;
123
+ }
124
+ export interface Xorv extends Argless {
125
+ op: Opcodes.xorv;
126
+ }
127
+ export interface Getv extends Argless {
128
+ op: Opcodes.getv;
129
+ }
130
+ export interface Putv extends Argless {
131
+ op: Opcodes.putv;
132
+ }
133
+ export interface Invokem extends ByteArg {
134
+ op: Opcodes.invokem;
135
+ }
136
+ export interface Agetv extends Argless {
137
+ op: Opcodes.agetv;
138
+ }
139
+ export interface Aputv extends Argless {
140
+ op: Opcodes.aputv;
141
+ }
142
+ export type LocalRange = {
143
+ name: string;
144
+ id: number;
145
+ isParam?: true | undefined;
146
+ };
147
+ export interface LocalInst extends ByteArg {
148
+ range?: LocalRange;
149
+ }
150
+ export interface Lgetv extends LocalInst {
151
+ op: Opcodes.lgetv;
152
+ }
153
+ export interface Lputv extends LocalInst {
154
+ op: Opcodes.lputv;
155
+ }
156
+ export interface Newa extends Argless {
157
+ op: Opcodes.newa;
158
+ }
159
+ export interface Newc extends Argless {
160
+ op: Opcodes.newc;
161
+ }
162
+ export interface Return extends Argless {
163
+ op: Opcodes.return;
164
+ }
165
+ export interface Ret extends Argless {
166
+ op: Opcodes.ret;
167
+ }
168
+ export interface News extends WordArg {
169
+ op: Opcodes.news;
170
+ }
171
+ export interface Goto extends ShortArg {
172
+ op: Opcodes.goto;
173
+ }
174
+ export interface Bt extends ShortArg {
175
+ op: Opcodes.bt;
176
+ }
177
+ export interface Bf extends ShortArg {
178
+ op: Opcodes.bf;
179
+ }
180
+ export interface Jsr extends ShortArg {
181
+ op: Opcodes.jsr;
182
+ }
183
+ export interface Eq extends Argless {
184
+ op: Opcodes.eq;
185
+ }
186
+ export interface Lt extends Argless {
187
+ op: Opcodes.lt;
188
+ }
189
+ export interface Lte extends Argless {
190
+ op: Opcodes.lte;
191
+ }
192
+ export interface Gt extends Argless {
193
+ op: Opcodes.gt;
194
+ }
195
+ export interface Gte extends Argless {
196
+ op: Opcodes.gte;
197
+ }
198
+ export interface Ne extends Argless {
199
+ op: Opcodes.ne;
200
+ }
201
+ export interface Isnull extends Argless {
202
+ op: Opcodes.isnull;
203
+ }
204
+ export interface Isa extends Argless {
205
+ op: Opcodes.isa;
206
+ }
207
+ export interface Canhazplz extends Argless {
208
+ op: Opcodes.canhazplz;
209
+ }
210
+ export interface Ts extends Argless {
211
+ op: Opcodes.ts;
212
+ }
213
+ export interface Ipush extends WordArg {
214
+ op: Opcodes.ipush;
215
+ }
216
+ export interface Fpush extends FloatArg {
217
+ op: Opcodes.fpush;
218
+ }
219
+ export interface Spush extends WordArg {
220
+ op: Opcodes.spush;
221
+ }
222
+ export interface Frpush extends Argless {
223
+ op: Opcodes.frpush;
224
+ }
225
+ export interface Bpush extends ByteArg {
226
+ op: Opcodes.bpush;
227
+ }
228
+ export interface Npush extends Argless {
229
+ op: Opcodes.npush;
230
+ }
231
+ export interface Invv extends Argless {
232
+ op: Opcodes.invv;
233
+ }
234
+ export interface Dup extends ByteArg {
235
+ op: Opcodes.dup;
236
+ }
237
+ export interface Newd extends Argless {
238
+ op: Opcodes.newd;
239
+ }
240
+ export interface Getm extends Argless {
241
+ op: Opcodes.getm;
242
+ }
243
+ export interface Lpush extends LongArg {
244
+ op: Opcodes.lpush;
245
+ }
246
+ export interface Dpush extends DoubleArg {
247
+ op: Opcodes.dpush;
248
+ }
249
+ export interface Throw extends Argless {
250
+ op: Opcodes.throw;
251
+ }
252
+ export interface Cpush extends WordArg {
253
+ op: Opcodes.cpush;
254
+ }
255
+ export interface Newba extends Argless {
256
+ op: Opcodes.newba;
257
+ }
258
+ export interface Argc extends ByteArg {
259
+ op: Opcodes.argc;
260
+ }
261
+ export type Bytecode = Nop | Incsp | Popv | Addv | Subv | Mulv | Divv | Andv | Orv | Modv | Shlv | Shrv | Xorv | Getv | Putv | Invokem | Agetv | Aputv | Lgetv | Lputv | Newa | Newc | Return | Ret | News | Goto | Eq | Lt | Lte | Gt | Gte | Ne | Isnull | Isa | Canhazplz | Jsr | Ts | Ipush | Fpush | Spush | Bt | Bf | Frpush | Bpush | Npush | Invv | Dup | Newd | Getm | Lpush | Dpush | Throw | Cpush | Argc | Newba;
262
+ export declare function parseCode(view: DataView, lineTable: Map<number, LineNumber>): Bytecode[];
263
+ export declare function opcodeSize(op: Opcodes): 1 | 2 | 3 | 5 | 9;
264
+ export declare function emitBytecode(bytecode: Bytecode, view: DataView, offset: number, linktable: Map<number, number>): number;
265
+ export declare function getOpInfo(bytecode: Bytecode): {
266
+ pop: number;
267
+ push: number;
268
+ };
269
+ export declare const enum Effects {
270
+ None = 0,
271
+ Local = 1,
272
+ Global = 2,
273
+ ArrayLike = 4,
274
+ Call = 8
275
+ }
276
+ export declare function getOpEffects(bytecode: Bytecode): number;
277
+ export declare function isBoolOp(op: Opcodes): boolean;
278
+ export declare function isCondBranch(op: Opcodes): boolean;
279
+ export {};
@@ -0,0 +1,3 @@
1
+ import { Context, FuncEntry } from "./bytecode";
2
+ export declare function optimizeFunc(func: FuncEntry, context: Context): void;
3
+ export declare function cleanCfg(func: FuncEntry, context: Context): void;
@@ -0,0 +1,2 @@
1
+ import { Context, FuncEntry } from "./bytecode";
2
+ export declare function sizeBasedPRE(func: FuncEntry, context: Context): true | undefined;
@@ -0,0 +1,2 @@
1
+ import { Context, FuncEntry } from "./bytecode";
2
+ export declare function blockSharing(func: FuncEntry, context: Context): boolean;
@@ -0,0 +1,8 @@
1
+ /// <reference types="node" />
2
+ /// <reference types="node" />
3
+ import * as crypto from "node:crypto";
4
+ import { Context } from "./bytecode";
5
+ export declare function getPrgSignature(context: Context): Buffer | undefined;
6
+ export declare function getDevKey(file: string): Promise<crypto.KeyObject>;
7
+ export declare function signatureFromContext(context: Context): Buffer | null;
8
+ export declare function signView(key: crypto.KeyObject, view: DataView): Buffer;
@@ -0,0 +1,19 @@
1
+ /// <reference types="node" />
2
+ import { xmlUtil } from "../sdk-util";
3
+ export declare class SymbolTable {
4
+ symbolToLabelMap: Map<number, number>;
5
+ symbols: Map<number, {
6
+ str: string;
7
+ label: string;
8
+ }>;
9
+ methods: Map<number, {
10
+ name: string;
11
+ id: number | null;
12
+ argc: number | null;
13
+ }>;
14
+ decoder: import("util").TextDecoder;
15
+ parseSymbolTable(view: DataView): number;
16
+ parse(view: DataView): void;
17
+ parseXml(debugXml: xmlUtil.Document): void;
18
+ parseSymbol(view: DataView, offset: number, current: number): number;
19
+ }
@@ -0,0 +1,25 @@
1
+ /// <reference types="node" />
2
+ import * as crypto from "node:crypto";
3
+ import { BuildConfig } from "./optimizer-types";
4
+ import { SectionInfo } from "./readprg/bytecode";
5
+ export declare function readPrg(path: string): Promise<{
6
+ [k: string]: number;
7
+ }>;
8
+ export declare function readPrgFromFile(prg: string): Promise<{
9
+ view: DataView;
10
+ sections: Record<number, SectionInfo>;
11
+ }>;
12
+ export declare function readPrgWithOffsets(view: DataView): {
13
+ view: DataView;
14
+ sections: Record<number, SectionInfo>;
15
+ };
16
+ export declare function optimizeProgram(filepath: string, devKey?: string | undefined, output?: string, config?: BuildConfig): Promise<unknown>;
17
+ export declare function optimizePrgAndDebug(prgName: string, prgBuffer: ArrayBuffer, prgOffset: number, prgLength: number, xmlName: string, xmlBuffer: ArrayBuffer, xmlOffset: number, xmlLength: number, key: crypto.KeyObject, config: BuildConfig | undefined): Promise<{
18
+ sigBuffer: ArrayBufferLike | undefined;
19
+ sigOffset: number | undefined;
20
+ sigLength: number | undefined;
21
+ prgBuffer: ArrayBufferLike;
22
+ prgOffset: number;
23
+ prgLength: number;
24
+ debugXml: string;
25
+ }>;
@@ -0,0 +1,12 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { JungleResourceMap } from "./jungles";
3
+ import { ProgramState } from "./optimizer-types";
4
+ import { xmlUtil } from "./sdk-util";
5
+ type Visit = (e: xmlUtil.Element, module: string | null, parent: xmlUtil.Element | null) => void;
6
+ type Visitor = {
7
+ visit?: Visit;
8
+ error?: (node: xmlUtil.Element, parent: string | null) => void;
9
+ } & xmlUtil.Visitor;
10
+ export declare function visit_resources(elements: xmlUtil.Content[], parent: xmlUtil.Element | null, v: Visitor | Visit): void;
11
+ export declare function add_resources_to_ast(state: ProgramState | undefined, ast: mctree.Program, resources: Record<string, JungleResourceMap>, manifestXML?: xmlUtil.Document): void;
12
+ export {};
@@ -0,0 +1,28 @@
1
+ export { readPrg, optimizeProgram, readPrgWithOffsets } from "./readprg";
2
+ export { SectionKinds } from "./readprg/bytecode";
3
+ export * as xmlUtil from "./xml-util";
4
+ export declare const isWin: boolean;
5
+ export declare const appSupport: string;
6
+ export declare const connectiq: string;
7
+ export declare function getSdkPath(): Promise<string>;
8
+ export type DeviceInfo = {
9
+ [key: string]: {
10
+ appTypes: {
11
+ memoryLimit: number;
12
+ type: string;
13
+ }[];
14
+ deviceFamily: string;
15
+ displayName: string;
16
+ languages: Record<string, true>;
17
+ };
18
+ };
19
+ export declare function getDeviceInfo(): Promise<DeviceInfo>;
20
+ export declare function getLanguages(): Promise<{
21
+ id: string;
22
+ name: string;
23
+ }[]>;
24
+ export declare function getFunctionDocumentation(): Promise<{
25
+ name: string;
26
+ parent: string;
27
+ doc: string;
28
+ }[] | null>;
@@ -0,0 +1,5 @@
1
+ import { ExactOrUnion } from "./types";
2
+ export declare function couldBeHelper(a: ExactOrUnion, b: ExactOrUnion, shallow: boolean): boolean;
3
+ export declare function couldBe(a: ExactOrUnion, b: ExactOrUnion): boolean;
4
+ export declare function couldBeWeak(a: ExactOrUnion, b: ExactOrUnion): boolean;
5
+ export declare function couldBeShallow(a: ExactOrUnion, b: ExactOrUnion): boolean;
@@ -0,0 +1,18 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { NodeEquivMap } from "../type-flow";
3
+ import { FunctionStateNode, ProgramStateAnalysis } from "../optimizer-types";
4
+ import { TypeFlowBlock, TypeStateKey } from "./type-flow-util";
5
+ export type CopyPropStores = Map<mctree.Node, {
6
+ ref: mctree.Node;
7
+ ant: boolean;
8
+ }>;
9
+ export declare function findDeadStores(func: FunctionStateNode, graph: TypeFlowBlock, nodeEquivs: NodeEquivMap | null, findCopyPropCandidates: boolean, logThisRun: boolean): {
10
+ deadStores: Set<mctree.Node>;
11
+ locals: Set<TypeStateKey>;
12
+ localConflicts: Map<TypeStateKey, Set<TypeStateKey>> | null;
13
+ copyPropStores: CopyPropStores;
14
+ };
15
+ export declare function eliminateDeadStores(state: ProgramStateAnalysis, func: FunctionStateNode, graph: TypeFlowBlock, logThisRun: boolean): {
16
+ changes: boolean;
17
+ copyPropStores: CopyPropStores;
18
+ };
@@ -0,0 +1,4 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { ExactOrUnion } from "./types";
3
+ export declare function evaluateBinaryTypes(op: mctree.BinaryOperator | "instanceof", left: ExactOrUnion, right: ExactOrUnion): ExactOrUnion;
4
+ export declare function evaluateLogicalTypes(op: mctree.LogicalOperator, left: ExactOrUnion, right: ExactOrUnion): ExactOrUnion;