@markw65/monkeyc-optimizer 1.1.32 → 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 (81) hide show
  1. package/README.md +1 -918
  2. package/build/api.cjs +31 -31
  3. package/build/{chunk-NUE3G2QE.cjs → chunk-QBCVUVLD.cjs} +180 -49
  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/projects.d.ts +1 -0
  8. package/build/src/readprg.d.ts +0 -6
  9. package/build/src/src/api.d.ts +51 -0
  10. package/build/src/src/ast.d.ts +59 -0
  11. package/build/src/src/build.d.ts +7 -0
  12. package/build/src/src/cftinfo.d.ts +32 -0
  13. package/build/src/src/control-flow.d.ts +22 -0
  14. package/build/src/src/data-flow.d.ts +107 -0
  15. package/build/src/src/driver.d.ts +2 -0
  16. package/build/src/src/function-info.d.ts +14 -0
  17. package/build/src/src/inliner.d.ts +13 -0
  18. package/build/src/src/jungles.d.ts +66 -0
  19. package/build/src/src/launch.d.ts +5 -0
  20. package/build/src/src/logger.d.ts +6 -0
  21. package/build/src/src/manifest.d.ts +11 -0
  22. package/build/src/src/mc-rewrite.d.ts +13 -0
  23. package/build/src/src/negative-fixups.d.ts +1 -0
  24. package/build/src/src/optimizer-types.d.ts +249 -0
  25. package/build/src/src/optimizer.d.ts +100 -0
  26. package/build/src/src/pragma-checker.d.ts +3 -0
  27. package/build/src/src/pre.d.ts +2 -0
  28. package/build/src/src/projects.d.ts +26 -0
  29. package/build/src/src/readprg/array-init.d.ts +3 -0
  30. package/build/src/src/readprg/bytecode.d.ts +72 -0
  31. package/build/src/src/readprg/cflow.d.ts +17 -0
  32. package/build/src/src/readprg/data.d.ts +4 -0
  33. package/build/src/src/readprg/dce.d.ts +6 -0
  34. package/build/src/src/readprg/emit.d.ts +23 -0
  35. package/build/src/src/readprg/exceptions.d.ts +10 -0
  36. package/build/src/src/readprg/header.d.ts +15 -0
  37. package/build/src/src/readprg/interp.d.ts +21 -0
  38. package/build/src/src/readprg/linenum.d.ts +29 -0
  39. package/build/src/src/readprg/locals.d.ts +3 -0
  40. package/build/src/src/readprg/opcodes.d.ts +279 -0
  41. package/build/src/src/readprg/optimize.d.ts +3 -0
  42. package/build/src/src/readprg/pre.d.ts +2 -0
  43. package/build/src/src/readprg/sharing.d.ts +2 -0
  44. package/build/src/src/readprg/signer.d.ts +8 -0
  45. package/build/src/src/readprg/symbols.d.ts +19 -0
  46. package/build/src/src/readprg.d.ts +25 -0
  47. package/build/src/src/resources.d.ts +12 -0
  48. package/build/src/src/sdk-util.d.ts +28 -0
  49. package/build/src/src/type-flow/could-be.d.ts +5 -0
  50. package/build/src/src/type-flow/dead-store.d.ts +18 -0
  51. package/build/src/src/type-flow/interp-binary.d.ts +4 -0
  52. package/build/src/src/type-flow/interp-call.d.ts +16 -0
  53. package/build/src/src/type-flow/interp.d.ts +33 -0
  54. package/build/src/src/type-flow/intersection-type.d.ts +4 -0
  55. package/build/src/src/type-flow/minimize-locals.d.ts +4 -0
  56. package/build/src/src/type-flow/minimize-modules.d.ts +3 -0
  57. package/build/src/src/type-flow/optimize.d.ts +7 -0
  58. package/build/src/src/type-flow/sub-type.d.ts +2 -0
  59. package/build/src/src/type-flow/type-flow-util.d.ts +27 -0
  60. package/build/src/src/type-flow/types.d.ts +204 -0
  61. package/build/src/src/type-flow/union-type.d.ts +4 -0
  62. package/build/src/src/type-flow.d.ts +18 -0
  63. package/build/src/src/unused-exprs.d.ts +3 -0
  64. package/build/src/src/util.d.ts +33 -0
  65. package/build/src/src/variable-renamer.d.ts +4 -0
  66. package/build/src/src/visitor.d.ts +5 -0
  67. package/build/src/src/worker-pool.d.ts +4 -0
  68. package/build/src/src/worker-task.d.ts +88 -0
  69. package/build/src/src/worker-thread.d.ts +1 -0
  70. package/build/src/src/xml-util.d.ts +172 -0
  71. package/build/src/test/mocha/bytecode.spec.d.ts +1 -0
  72. package/build/src/test/mocha/coudbe.spec.d.ts +2 -0
  73. package/build/src/test/mocha/intersection.spec.d.ts +2 -0
  74. package/build/src/test/mocha/root.spec.d.ts +1 -0
  75. package/build/src/test/mocha/subtype.spec.d.ts +2 -0
  76. package/build/src/test/mocha/test-utils.d.ts +6 -0
  77. package/build/src/test/mocha/types.spec.d.ts +1 -0
  78. package/build/src/type-flow/interp.d.ts +3 -1
  79. package/build/src/type-flow/types.d.ts +1 -1
  80. package/build/worker-thread.cjs +3 -3
  81. package/package.json +2 -2
@@ -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;
@@ -0,0 +1,16 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { FunctionStateNode, ProgramStateAnalysis } from "../optimizer-types";
3
+ import { InterpStackElem, InterpState } from "./interp";
4
+ import { ExactOrUnion } from "./types";
5
+ export declare function evaluateCall(istate: InterpState, node: mctree.CallExpression, callee: ExactOrUnion, args: ExactOrUnion[]): InterpStackElem;
6
+ export declare function checkCallArgs(istate: InterpState, node: mctree.CallExpression, callees: FunctionStateNode | FunctionStateNode[], args: ExactOrUnion[]): InterpStackElem;
7
+ type SysCallHelperResult = {
8
+ calleeObj?: ExactOrUnion;
9
+ returnType?: ExactOrUnion;
10
+ argTypes?: ExactOrUnion[];
11
+ effectFree?: true;
12
+ argEffects?: true;
13
+ };
14
+ type SysCallHelper = (state: ProgramStateAnalysis, func: FunctionStateNode, calleeObj: ExactOrUnion, getArgs: () => Array<ExactOrUnion>) => SysCallHelperResult;
15
+ export declare function sysCallInfo(state: ProgramStateAnalysis, func: FunctionStateNode): SysCallHelper | null;
16
+ export {};
@@ -0,0 +1,33 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { DiagnosticType, FunctionStateNode, ProgramStateAnalysis } from "../optimizer-types";
3
+ import { ExactOrUnion, ObjectType } from "./types";
4
+ export type TypeMap = Map<mctree.Node, ExactOrUnion>;
5
+ export type InterpStackElem = {
6
+ value: ExactOrUnion;
7
+ embeddedEffects: boolean;
8
+ node: mctree.Expression | mctree.TypeSpecList | mctree.InstanceOfCase;
9
+ };
10
+ export type InterpState = {
11
+ state: ProgramStateAnalysis;
12
+ stack: InterpStackElem[];
13
+ typeMap?: TypeMap;
14
+ localLvals?: Set<mctree.Node>;
15
+ func?: FunctionStateNode;
16
+ pre?: (node: mctree.Node) => mctree.Node | false | null | void;
17
+ post?: (node: mctree.Node) => mctree.Node | false | null | void;
18
+ typeChecker?: (a: ExactOrUnion, b: ExactOrUnion) => boolean;
19
+ checkTypes?: DiagnosticType;
20
+ };
21
+ export declare function popIstate(istate: InterpState, node: mctree.Node): InterpStackElem;
22
+ export declare function tryPop(istate: InterpState, node: InterpStackElem["node"]): InterpStackElem;
23
+ export declare function evaluateExpr(state: ProgramStateAnalysis, expr: mctree.Expression, typeMap?: TypeMap): InterpStackElem;
24
+ export declare function preEvaluate(istate: InterpState, node: mctree.Node): null | (keyof mctree.NodeAll)[];
25
+ export declare function evaluate(istate: InterpState, node: mctree.Expression): InterpStackElem;
26
+ export declare function evaluate(istate: InterpState, node: mctree.Node): InterpStackElem | undefined;
27
+ export declare function evaluateUnaryTypes(op: mctree.UnaryOperator, argument: ExactOrUnion): ExactOrUnion;
28
+ export declare function deEnumerate(t: ExactOrUnion): ExactOrUnion;
29
+ export declare function evaluateNode(istate: InterpState, node: mctree.Node): void;
30
+ export declare function roundToFloat(value: number): number;
31
+ export declare function mustBeIdentical(a: ExactOrUnion, b: ExactOrUnion): boolean;
32
+ export declare function isByteArray(object: ExactOrUnion): boolean | undefined;
33
+ export declare function isByteArrayData(objectData: NonNullable<ObjectType["value"]>): boolean | undefined;
@@ -0,0 +1,4 @@
1
+ import { ExactOrUnion } from "./types";
2
+ export declare function expandTypedef(t: ExactOrUnion): ExactOrUnion;
3
+ export declare function intersection(a: ExactOrUnion, b: ExactOrUnion): ExactOrUnion;
4
+ export declare function restrictByEquality(a: ExactOrUnion, b: ExactOrUnion): ExactOrUnion;
@@ -0,0 +1,4 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { FunctionStateNode, ProgramStateAnalysis } from "../optimizer-types";
3
+ export declare function minimizeLocals(state: ProgramStateAnalysis, func: FunctionStateNode): void;
4
+ export declare function variableCleanup(node: mctree.Node): false | mctree.BlockStatement | mctree.Statement[] | null;
@@ -0,0 +1,3 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { ProgramStateAnalysis } from "../optimizer-types";
3
+ export declare function minimizeModules(ast: mctree.Program, state: ProgramStateAnalysis): void;
@@ -0,0 +1,7 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { FunctionStateNode, ProgramStateAnalysis } from "../optimizer-types";
3
+ import { InterpState } from "./interp";
4
+ export declare function optimizeFunction(state: ProgramStateAnalysis, func: FunctionStateNode): void;
5
+ export declare function beforeEvaluate(istate: InterpState, node: mctree.Node): mctree.Node | null | false;
6
+ export declare function afterEvaluate(istate: InterpState, node: mctree.Node): mctree.Node | null | false;
7
+ export declare function tryDeEnumerate(istate: InterpState, node: mctree.Expression, elem: number): mctree.Expression | null;
@@ -0,0 +1,2 @@
1
+ import { ExactOrUnion } from "./types";
2
+ export declare function subtypeOf(a: ExactOrUnion, b: ExactOrUnion): boolean;
@@ -0,0 +1,27 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { DataFlowBlock as TypeFlowBlock, Event, EventDecl } from "../data-flow";
3
+ import { ProgramStateAnalysis, StateNode, VariableStateNode } from "../optimizer-types";
4
+ import { InterpState } from "./interp";
5
+ import { ExactOrUnion } from "./types";
6
+ export { TypeFlowBlock };
7
+ export declare function isTypeStateKey(decl: EventDecl): decl is TypeStateKey;
8
+ export declare function declIsLocal(decl: EventDecl): decl is VariableStateNode | VariableStateNode[] | mctree.TypedIdentifier;
9
+ export declare function declIsNonLocal(decl: EventDecl): decl is VariableStateNode | VariableStateNode[];
10
+ export declare function localDeclName(decl: EventDecl): string;
11
+ export type TypeStateKey = Exclude<EventDecl, {
12
+ type: "MemberDecl" | "Unknown";
13
+ }>;
14
+ export declare function tsKey(key: TypeStateKey): string;
15
+ export declare function sourceLocation(loc: mctree.SourceLocation | null | undefined): string;
16
+ export declare function printBlockHeader(block: TypeFlowBlock): void;
17
+ export declare function describeEvent(event: Event): string;
18
+ export declare function printBlockEvents(block: TypeFlowBlock, extra?: (event: Event) => string): void;
19
+ export declare function printBlockTrailer(block: TypeFlowBlock): void;
20
+ export declare function findObjectDeclsByProperty(state: ProgramStateAnalysis, object: ExactOrUnion, next: mctree.DottedMemberExpression): readonly [null, null] | [StateNode[], StateNode[]];
21
+ export declare function refineObjectTypeByDecls(istate: InterpState, object: ExactOrUnion, trueDecls: StateNode[]): ExactOrUnion;
22
+ export declare function findNextObjectType(istate: InterpState, trueDecls: StateNode[], next: mctree.DottedMemberExpression): import("./types").UnionType | import("./types").NumberType | import("./types").LongType | import("./types").FloatType | import("./types").DoubleType | import("./types").CharType | import("./types").StringType | import("./types").ArrayType | import("./types").DictionaryType | import("./types").MethodType | import("./types").ModuleType | import("./types").FunctionType | import("./types").ClassType | import("./types").ObjectType | import("./types").EnumType | import("./types").SymbolType | import("./types").TypedefType | null;
23
+ export declare function resolveDottedMember(istate: InterpState, object: ExactOrUnion, next: mctree.DottedMemberExpression): {
24
+ mayThrow: boolean;
25
+ object: ExactOrUnion;
26
+ property: import("./types").UnionType | import("./types").NumberType | import("./types").LongType | import("./types").FloatType | import("./types").DoubleType | import("./types").CharType | import("./types").StringType | import("./types").ArrayType | import("./types").DictionaryType | import("./types").MethodType | import("./types").ModuleType | import("./types").FunctionType | import("./types").ClassType | import("./types").ObjectType | import("./types").EnumType | import("./types").SymbolType | import("./types").TypedefType;
27
+ } | null;
@@ -0,0 +1,204 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { ClassStateNode, EnumStateNode, FunctionStateNode, ModuleStateNode, ProgramStateAnalysis, ProgramStateStack, StateNode, StateNodeDecl, TypedefStateNode } from "../optimizer-types";
3
+ export declare const enum TypeTag {
4
+ Never = 0,
5
+ Null = 1,
6
+ False = 2,
7
+ True = 4,
8
+ Boolean = 6,
9
+ Number = 8,
10
+ Long = 16,
11
+ Float = 32,
12
+ Double = 64,
13
+ Decimal = 96,
14
+ Numeric = 120,
15
+ Char = 128,
16
+ String = 256,
17
+ Array = 512,
18
+ Dictionary = 1024,
19
+ Method = 2048,
20
+ Module = 4096,
21
+ Function = 8192,
22
+ Class = 16384,
23
+ Object = 32768,
24
+ Enum = 65536,
25
+ Symbol = 131072,
26
+ Typedef = 262144,
27
+ Any = 524287
28
+ }
29
+ export declare function typeTagName(tag: TypeTag): "Never" | "Null" | "False" | "True" | "Boolean" | "Number" | "Long" | "Float" | "Double" | "Decimal" | "Numeric" | "Char" | "String" | "Array" | "Dictionary" | "Method" | "Module" | "Function" | "Class" | "Object" | "Enum" | "Symbol" | "Typedef" | "Any";
30
+ export declare const LastTypeTag = TypeTag.Typedef;
31
+ export declare const SingletonTypeTagsConst: number;
32
+ export declare const UnionDataTypeTagsConst: number;
33
+ export declare const ValueTypeTagsConst: number;
34
+ export declare const ObjectLikeTagsConst: number;
35
+ export declare const EnumTagsConst: number;
36
+ type ExactTypeTags = TypeTag.Null | TypeTag.False | TypeTag.True | TypeTag.Number | TypeTag.Long | TypeTag.Float | TypeTag.Double | TypeTag.Char | TypeTag.String | TypeTag.Array | TypeTag.Dictionary | TypeTag.Method | TypeTag.Module | TypeTag.Function | TypeTag.Class | TypeTag.Object | TypeTag.Enum | TypeTag.Symbol | TypeTag.Typedef;
37
+ export type EnumeratedTypeTags = ExactTypeTags | TypeTag.Never | TypeTag.Any;
38
+ export type UnionTypeTags = number;
39
+ interface AbstractValue {
40
+ type: UnionTypeTags;
41
+ value?: unknown;
42
+ }
43
+ export type ExactTypes = NullType | FalseType | TrueType | NumberType | LongType | FloatType | DoubleType | CharType | StringType | ArrayType | DictionaryType | MethodType | ModuleType | FunctionType | ClassType | ObjectType | EnumType | SymbolType | TypedefType;
44
+ type ExactPairHelper<T> = T extends ExactTypes ? {
45
+ type: T["type"];
46
+ avalue: T["value"];
47
+ bvalue: T["value"];
48
+ } : never;
49
+ export type ExactPairs = ExactPairHelper<ExactTypes>;
50
+ export type ValuePairs = ExactPairHelper<ValueTypes>;
51
+ type WithValue<T> = T extends ExactTypes ? T extends SingletonType ? T : {
52
+ type: T["type"];
53
+ value: NonNullable<T["value"]>;
54
+ } : never;
55
+ export type ExactData<T extends ExactTypeTags> = T extends SingletonType ? undefined : NonNullable<Extract<ExactTypes, {
56
+ type: T;
57
+ }>["value"]>;
58
+ export type ValueTypes = WithValue<ExactTypes>;
59
+ export type ExtendedTypes = ExactTypes | NeverType | AnyType;
60
+ export interface NeverType extends AbstractValue {
61
+ type: 0;
62
+ value?: undefined;
63
+ }
64
+ export interface NullType extends AbstractValue {
65
+ type: TypeTag.Null;
66
+ value?: undefined;
67
+ }
68
+ export interface FalseType extends AbstractValue {
69
+ type: TypeTag.False;
70
+ value?: undefined;
71
+ }
72
+ export interface TrueType extends AbstractValue {
73
+ type: TypeTag.True;
74
+ value?: undefined;
75
+ }
76
+ export interface NumberType extends AbstractValue {
77
+ type: TypeTag.Number;
78
+ value?: number | undefined;
79
+ }
80
+ export interface LongType extends AbstractValue {
81
+ type: TypeTag.Long;
82
+ value?: bigint | undefined;
83
+ }
84
+ export interface FloatType extends AbstractValue {
85
+ type: TypeTag.Float;
86
+ value?: number | undefined;
87
+ }
88
+ export interface DoubleType extends AbstractValue {
89
+ type: TypeTag.Double;
90
+ value?: number | undefined;
91
+ }
92
+ export interface CharType extends AbstractValue {
93
+ type: TypeTag.Char;
94
+ value?: string | undefined;
95
+ }
96
+ export interface StringType extends AbstractValue {
97
+ type: TypeTag.String;
98
+ value?: string | undefined;
99
+ }
100
+ export interface ArrayType extends AbstractValue {
101
+ type: TypeTag.Array;
102
+ value?: ExactOrUnion | undefined;
103
+ }
104
+ export interface DictionaryType extends AbstractValue {
105
+ type: TypeTag.Dictionary;
106
+ value?: {
107
+ key: ExactOrUnion;
108
+ value: ExactOrUnion;
109
+ } | undefined;
110
+ }
111
+ export interface MethodType extends AbstractValue {
112
+ type: TypeTag.Method;
113
+ value?: {
114
+ args: ExactOrUnion[];
115
+ result: ExactOrUnion;
116
+ } | undefined;
117
+ }
118
+ export interface ModuleType extends AbstractValue {
119
+ type: TypeTag.Module;
120
+ value?: ModuleStateNode | ModuleStateNode[] | undefined;
121
+ }
122
+ export interface FunctionType extends AbstractValue {
123
+ type: TypeTag.Function;
124
+ value?: FunctionStateNode | FunctionStateNode[] | undefined;
125
+ }
126
+ export interface ClassType extends AbstractValue {
127
+ type: TypeTag.Class;
128
+ value?: ClassStateNode | ClassStateNode[] | undefined;
129
+ }
130
+ export interface TypedefType extends AbstractValue {
131
+ type: TypeTag.Typedef;
132
+ value?: TypedefStateNode | TypedefStateNode[] | undefined;
133
+ }
134
+ export interface ObjectType extends AbstractValue {
135
+ type: TypeTag.Object;
136
+ value?: {
137
+ klass: ClassType;
138
+ obj?: Record<string, ExactOrUnion>;
139
+ } | undefined;
140
+ }
141
+ export interface EnumType extends AbstractValue {
142
+ type: TypeTag.Enum;
143
+ value?: {
144
+ enum: EnumStateNode;
145
+ value?: ExactOrUnion | undefined;
146
+ } | {
147
+ enum?: undefined;
148
+ value: ExactOrUnion;
149
+ } | undefined;
150
+ }
151
+ export interface SymbolType extends AbstractValue {
152
+ type: TypeTag.Symbol;
153
+ value?: string | undefined;
154
+ }
155
+ export interface AnyType extends AbstractValue {
156
+ type: TypeTag.Any;
157
+ value?: undefined;
158
+ }
159
+ export type SingletonType = NullType | FalseType | TrueType;
160
+ export type UnionData = {
161
+ mask: TypeTag;
162
+ [TypeTag.Array]?: NonNullable<ArrayType["value"]>;
163
+ [TypeTag.Dictionary]?: NonNullable<DictionaryType["value"]>;
164
+ [TypeTag.Method]?: NonNullable<MethodType["value"]>;
165
+ [TypeTag.Module]?: NonNullable<ModuleType["value"]>;
166
+ [TypeTag.Function]?: NonNullable<FunctionType["value"]>;
167
+ [TypeTag.Class]?: NonNullable<ClassType["value"]>;
168
+ [TypeTag.Object]?: NonNullable<ObjectType["value"]>;
169
+ [TypeTag.Enum]?: NonNullable<EnumType["value"]>;
170
+ };
171
+ export type UnionDataKey = Exclude<keyof UnionData, "mask">;
172
+ export interface UnionType extends AbstractValue {
173
+ value?: UnionData | undefined;
174
+ }
175
+ export type ExactOrUnion = UnionType | ExactTypes;
176
+ export type SingleValue = NonNullable<ValueTypes["value"]>;
177
+ type TagValue<TAG> = Extract<ValueTypes, {
178
+ type: TAG;
179
+ }>["value"];
180
+ export type EnumValueType = TagValue<TypeTag.Enum>;
181
+ export declare function isExact(v: AbstractValue): v is ExactTypes;
182
+ export declare function isUnion(v: AbstractValue): v is UnionType;
183
+ export declare function isSingleton(v: AbstractValue): v is SingletonType;
184
+ export declare function hasValue(v: AbstractValue): v is WithValue<ExactTypes>;
185
+ export declare function hasNoData(v: AbstractValue, t: TypeTag): boolean;
186
+ export declare function cloneType<T extends ExactOrUnion>(t: T): T;
187
+ export declare function typeFromTypeStateNode(state: ProgramStateAnalysis, sn: StateNodeDecl, classVsObj?: boolean): ExactOrUnion;
188
+ export declare function typeFromTypeStateNodes(state: ProgramStateAnalysis, sns: StateNodeDecl[], classVsObj?: boolean): ExactOrUnion;
189
+ export declare function typeFromSingleTypeSpec(state: ProgramStateAnalysis, type: mctree.TypeSpecPart | mctree.ObjectExpression, stack?: ProgramStateStack | undefined): ExactOrUnion;
190
+ export declare function typeFromTypespec(state: ProgramStateAnalysis, ts: mctree.TypeSpecList, stack?: ProgramStateStack | undefined): ExactOrUnion;
191
+ export declare function typeFromLiteral(literal: mctree.Literal): ExactTypes;
192
+ export declare function mcExprFromType(type: ValueTypes): mctree.Expression | null;
193
+ export declare function castType(type: ExactOrUnion, target: UnionTypeTags): ExactOrUnion;
194
+ export declare const TruthyTypes: number;
195
+ export declare function mustBeTrue(arg: ExactOrUnion): boolean;
196
+ export declare function mustBeFalse(arg: ExactOrUnion): boolean;
197
+ export declare function display(type: ExactOrUnion): string;
198
+ export declare function hasUnionData(tag: TypeTag): boolean;
199
+ export declare function getObjectValue(t: ExactOrUnion): ObjectType["value"] | null;
200
+ export declare function forEachUnionComponent(v: ExactOrUnion, bits: TypeTag, fn: (type: ExactTypes) => boolean | void): void;
201
+ export declare function getUnionComponent<T extends ExactTypeTags>(v: ExactOrUnion, tag: T): ExactData<T> | null;
202
+ export declare function setUnionComponent<T extends ExactTypeTags>(v: ExactOrUnion, tag: T, c: ExactData<T>): void;
203
+ export declare function getStateNodeDeclsFromType(state: ProgramStateAnalysis, object: ExactOrUnion): StateNode[];
204
+ export {};
@@ -0,0 +1,4 @@
1
+ import { ExactOrUnion, TypeTag } from "./types";
2
+ export declare function unionInto(to: ExactOrUnion, from: ExactOrUnion): boolean;
3
+ export declare function clearValuesUnder(v: ExactOrUnion, tag: TypeTag, clearTag?: boolean): void;
4
+ export declare function widenType(t: ExactOrUnion): null;
@@ -0,0 +1,18 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { Event, EventDecl } from "./data-flow";
3
+ import { FunctionStateNode, ProgramStateAnalysis } from "./optimizer-types";
4
+ import { InterpState } from "./type-flow/interp";
5
+ import { TypeStateKey } from "./type-flow/type-flow-util";
6
+ export declare const missingNullWorkaround = true;
7
+ export type NodeEquivMap = Map<mctree.Node, {
8
+ decl: EventDecl;
9
+ equiv: Array<EventDecl>;
10
+ }>;
11
+ export declare function buildTypeInfo(state: ProgramStateAnalysis, func: FunctionStateNode, optimizeEquivalencies: boolean): InterpState | undefined;
12
+ export declare function buildConflictGraph(state: ProgramStateAnalysis, func: FunctionStateNode): {
13
+ graph: import("./control-flow").Block<Event>;
14
+ localConflicts: Map<TypeStateKey, Set<TypeStateKey>> | null;
15
+ locals: Set<TypeStateKey>;
16
+ identifiers: Set<string>;
17
+ logThisRun: boolean;
18
+ } | undefined;
@@ -0,0 +1,3 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { ProgramStateOptimizer } from "./optimizer-types";
3
+ export declare function cleanupUnusedVars(state: ProgramStateOptimizer, node: mctree.BlockStatement | mctree.ForStatement): boolean;
@@ -0,0 +1,33 @@
1
+ import glob from "fast-glob";
2
+ export { logger, log, wouldLog, setBanner, bumpLogging } from "./logger";
3
+ export declare function globa(pattern: string, options?: glob.Options & {
4
+ mark?: boolean;
5
+ }): Promise<Array<string>>;
6
+ export declare function globSome(pattern: string, predicate: (path: string) => boolean, options?: glob.Options & {
7
+ mark?: boolean;
8
+ }): Promise<boolean>;
9
+ export declare function forEach<T>(val: T | T[] | null | undefined, fn: (v: T) => void): void;
10
+ export declare function map<T, U>(val: T | T[] | null | undefined, fn: (v: T) => U): U[];
11
+ export declare function every<T>(val: T | T[] | null | undefined, fn: (v: T) => boolean): boolean;
12
+ export declare function some<T>(val: T | T[] | null | undefined, fn: (v: T) => boolean): boolean;
13
+ export declare function reduce<T, U>(val: T | T[] | null | undefined, fn: (p: U, v: T) => U, init: U): U;
14
+ export declare function last_modified(inputs: string[]): Promise<number>;
15
+ export declare function first_modified(inputs: string[]): Promise<number>;
16
+ export declare function pushUnique<T, U extends T>(arr: T[], value: U): boolean;
17
+ export declare function sameArrays<T>(a1: T[], a2: T[], check: (a: T, b: T) => boolean): boolean;
18
+ export type LineHandler = (line: string) => void;
19
+ export declare function spawnByLine(command: string, args: string[], lineHandlers: LineHandler | LineHandler[], options?: {
20
+ [key: string]: unknown;
21
+ }): Promise<void>;
22
+ export declare function readByLine(file: string, lineHandler: LineHandler): Promise<unknown>;
23
+ export declare function promiseAll<T>(promiseFn: (i: number) => Promise<T> | null, parallelism: number): Promise<T[]>;
24
+ export declare function copyRecursiveAsNeeded(source: string, target: string, filter?: (src: string, tgt: string) => boolean): Promise<void>;
25
+ export declare function popcount(x: number): number;
26
+ export declare class GenericQueue<Block> {
27
+ private enqueued;
28
+ private queue;
29
+ constructor(sort: (a: Block, b: Block) => number);
30
+ enqueue(block: Block): void;
31
+ dequeue(): Block;
32
+ empty(): boolean;
33
+ }
@@ -0,0 +1,4 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { ProgramStateAnalysis } from "./optimizer-types";
3
+ export declare function renameIdentifier(ident: mctree.Identifier, newName: string): void;
4
+ export declare function renameVariable(state: ProgramStateAnalysis, locals: NonNullable<ProgramStateAnalysis["localsStack"]>[number], declName: string | null): string | null;
@@ -0,0 +1,5 @@
1
+ import { mctree } from "@markw65/prettier-plugin-monkeyc";
2
+ import { LookupDefinition, ProgramStateAnalysis } from "./optimizer-types";
3
+ import { TypeMap } from "./type-flow/interp";
4
+ export declare function visitorNode(node: mctree.Node): mctree.Node;
5
+ export declare function visitReferences(state: ProgramStateAnalysis, ast: mctree.Program, name: string | null, defn: LookupDefinition[] | null | false, callback: (node: mctree.Node, results: LookupDefinition[], error: boolean) => undefined | false, includeDefs?: boolean, filter?: ((node: mctree.Node) => boolean) | null, typeMap?: TypeMap | null, findSingleDefinition?: boolean): void;
@@ -0,0 +1,4 @@
1
+ import type { WorkerTask, WorkerTaskResult } from "./worker-task";
2
+ export declare function startPool(parallelism?: number): boolean;
3
+ export declare function stopPool(): void;
4
+ export declare function runTaskInPool<T extends WorkerTask>(task: T): Promise<WorkerTaskResult<T>>;
@@ -0,0 +1,88 @@
1
+ /// <reference types="node" />
2
+ import * as crypto from "node:crypto";
3
+ import { JungleQualifier } from "./jungles";
4
+ import { BuildConfig } from "./optimizer";
5
+ import { xmlUtil } from "./sdk-util";
6
+ interface BaseNode {
7
+ type: string;
8
+ data: unknown;
9
+ }
10
+ interface BuildOptimizedProject extends BaseNode {
11
+ type: "buildOptimizedProject";
12
+ data: {
13
+ product: string | null;
14
+ options: BuildConfig;
15
+ };
16
+ }
17
+ interface GenerateOneConfig extends BaseNode {
18
+ type: "generateOneConfig";
19
+ data: {
20
+ buildConfig: JungleQualifier;
21
+ manifestXML: xmlUtil.Document;
22
+ dependencyFiles: string[];
23
+ config: BuildConfig;
24
+ };
25
+ }
26
+ interface GenerateOptimizedProject extends BaseNode {
27
+ type: "generateOptimizedProject";
28
+ data: {
29
+ options: BuildConfig;
30
+ };
31
+ }
32
+ interface OptimizePrgAndDebug extends BaseNode {
33
+ type: "optimizePrgAndDebug";
34
+ data: {
35
+ prgName: string;
36
+ prgBuffer: ArrayBuffer;
37
+ prgOffset: number;
38
+ prgLength: number;
39
+ xmlName: string;
40
+ xmlBuffer: ArrayBuffer;
41
+ xmlOffset: number;
42
+ xmlLength: number;
43
+ key: crypto.KeyObject;
44
+ config: BuildConfig | undefined;
45
+ };
46
+ }
47
+ export type WorkerTask = BuildOptimizedProject | GenerateOptimizedProject | GenerateOneConfig | OptimizePrgAndDebug;
48
+ export declare const workerTaskHandlers: {
49
+ readonly buildOptimizedProject: (data: BuildOptimizedProject["data"]) => Promise<{
50
+ exe: string;
51
+ args: string[];
52
+ program: string;
53
+ product: string | null;
54
+ hasTests: boolean;
55
+ diagnostics: Record<string, import("./optimizer-types").Diagnostic[]> | undefined;
56
+ }>;
57
+ readonly generateOptimizedProject: (data: GenerateOptimizedProject["data"]) => Promise<{
58
+ jungleFiles: string | undefined;
59
+ xml: xmlUtil.Document;
60
+ program: string;
61
+ hasTests: boolean;
62
+ diagnostics?: undefined;
63
+ } | {
64
+ jungleFiles: string;
65
+ xml: xmlUtil.Document;
66
+ program: string;
67
+ hasTests: boolean;
68
+ diagnostics: Record<string, import("./optimizer-types").Diagnostic[]>;
69
+ }>;
70
+ readonly generateOneConfig: (data: GenerateOneConfig["data"]) => Promise<{
71
+ hasTests: boolean;
72
+ diagnostics: Record<string, import("./optimizer-types").Diagnostic[]> | undefined;
73
+ sdkVersion: number | undefined;
74
+ }>;
75
+ readonly optimizePrgAndDebug: (data: OptimizePrgAndDebug["data"]) => Promise<{
76
+ sigBuffer: ArrayBufferLike | undefined;
77
+ sigOffset: number | undefined;
78
+ sigLength: number | undefined;
79
+ prgBuffer: ArrayBufferLike;
80
+ prgOffset: number;
81
+ prgLength: number;
82
+ debugXml: string;
83
+ }>;
84
+ };
85
+ type RemovePromise<T> = T extends Promise<infer U> ? U : T;
86
+ export type WorkerTaskResult<T> = T extends WorkerTask ? RemovePromise<ReturnType<(typeof workerTaskHandlers)[T["type"]]>> : never;
87
+ export declare function performTask<T extends WorkerTask>(task: T): Promise<WorkerTaskResult<T>>;
88
+ export {};
@@ -0,0 +1 @@
1
+ export {};