@mirascript/mirascript 0.1.21 → 0.1.23

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 (98) hide show
  1. package/bench/index.ts +45 -0
  2. package/dist/{chunk-RY7PYMXX.js → chunk-CHS52AEC.js} +35 -9
  3. package/dist/chunk-CHS52AEC.js.map +6 -0
  4. package/dist/{chunk-4T5YE7LC.js → chunk-K7JDJG3G.js} +26 -31
  5. package/dist/chunk-K7JDJG3G.js.map +6 -0
  6. package/dist/chunk-X6LYEGOK.js +69 -0
  7. package/dist/chunk-X6LYEGOK.js.map +6 -0
  8. package/dist/{chunk-XNGYORPT.js → chunk-XWQWKD67.js} +581 -531
  9. package/dist/chunk-XWQWKD67.js.map +6 -0
  10. package/dist/cli/index.js +4 -4
  11. package/dist/compiler/compile-fast.d.ts.map +1 -1
  12. package/dist/compiler/create-script.d.ts +6 -2
  13. package/dist/compiler/create-script.d.ts.map +1 -1
  14. package/dist/compiler/emit/constants.d.ts +1 -1
  15. package/dist/compiler/emit/constants.d.ts.map +1 -1
  16. package/dist/compiler/emit/index.d.ts.map +1 -1
  17. package/dist/compiler/worker.js +1 -1
  18. package/dist/helpers/analyze.d.ts +8 -0
  19. package/dist/helpers/analyze.d.ts.map +1 -0
  20. package/dist/index.js +3 -3
  21. package/dist/subtle.d.ts +3 -2
  22. package/dist/subtle.d.ts.map +1 -1
  23. package/dist/subtle.js +12 -7
  24. package/dist/vm/operations/call.d.ts +3 -0
  25. package/dist/vm/operations/call.d.ts.map +1 -0
  26. package/dist/vm/operations/common.d.ts +3 -0
  27. package/dist/vm/operations/common.d.ts.map +1 -0
  28. package/dist/vm/operations/compound.d.ts +12 -0
  29. package/dist/vm/operations/compound.d.ts.map +1 -0
  30. package/dist/vm/operations/convert.d.ts +6 -0
  31. package/dist/vm/operations/convert.d.ts.map +1 -0
  32. package/dist/vm/operations/cp.d.ts +2 -0
  33. package/dist/vm/operations/cp.d.ts.map +1 -0
  34. package/dist/vm/operations/helpers.d.ts +19 -0
  35. package/dist/vm/operations/helpers.d.ts.map +1 -0
  36. package/dist/vm/operations/index.d.ts +10 -0
  37. package/dist/vm/operations/index.d.ts.map +1 -0
  38. package/dist/vm/operations/operator.d.ts +24 -0
  39. package/dist/vm/operations/operator.d.ts.map +1 -0
  40. package/dist/vm/operations/slice.d.ts +4 -0
  41. package/dist/vm/operations/slice.d.ts.map +1 -0
  42. package/dist/vm/operations/type-check.d.ts +9 -0
  43. package/dist/vm/operations/type-check.d.ts.map +1 -0
  44. package/dist/vm/operations/utils.d.ts +11 -0
  45. package/dist/vm/operations/utils.d.ts.map +1 -0
  46. package/dist/vm/types/boundary.d.ts +2 -3
  47. package/dist/vm/types/boundary.d.ts.map +1 -1
  48. package/dist/vm/types/context.d.ts +2 -4
  49. package/dist/vm/types/context.d.ts.map +1 -1
  50. package/dist/vm/types/extern.d.ts +2 -2
  51. package/dist/vm/types/extern.d.ts.map +1 -1
  52. package/dist/vm/types/index.d.ts +1 -1
  53. package/dist/vm/types/index.d.ts.map +1 -1
  54. package/package.json +6 -4
  55. package/src/compiler/compile-fast.ts +32 -12
  56. package/src/compiler/create-script.ts +19 -5
  57. package/src/compiler/emit/constants.ts +1 -1
  58. package/src/compiler/emit/index.ts +18 -25
  59. package/src/compiler/emit/sourcemap.ts +8 -8
  60. package/src/helpers/analyze.ts +70 -0
  61. package/src/subtle.ts +3 -2
  62. package/src/vm/lib/global/math.ts +2 -2
  63. package/src/vm/lib/global/sequence/all-any.ts +2 -2
  64. package/src/vm/lib/global/sequence/find.ts +2 -2
  65. package/src/vm/lib/global/sequence/map-filter.ts +1 -1
  66. package/src/vm/lib/global/sequence/sort.ts +1 -1
  67. package/src/vm/lib/global/sequence/with.ts +2 -2
  68. package/src/vm/lib/global/sequence/zip.ts +1 -1
  69. package/src/vm/lib/helpers.ts +1 -1
  70. package/src/vm/lib/mod/matrix.ts +2 -2
  71. package/src/vm/operations/call.ts +18 -0
  72. package/src/vm/operations/common.ts +6 -0
  73. package/src/vm/operations/compound.ts +148 -0
  74. package/src/vm/operations/convert.ts +24 -0
  75. package/src/vm/operations/cp.ts +1 -0
  76. package/src/vm/{helpers.ts → operations/helpers.ts} +17 -18
  77. package/src/vm/operations/index.ts +9 -0
  78. package/src/vm/operations/operator.ts +131 -0
  79. package/src/vm/operations/slice.ts +41 -0
  80. package/src/vm/operations/type-check.ts +38 -0
  81. package/src/vm/operations/utils.ts +66 -0
  82. package/src/vm/types/boundary.ts +18 -13
  83. package/src/vm/types/context.ts +72 -38
  84. package/src/vm/types/extern.ts +5 -4
  85. package/src/vm/types/index.ts +1 -1
  86. package/dist/chunk-4T5YE7LC.js.map +0 -6
  87. package/dist/chunk-RNLB52WP.js +0 -1
  88. package/dist/chunk-RNLB52WP.js.map +0 -6
  89. package/dist/chunk-RY7PYMXX.js.map +0 -6
  90. package/dist/chunk-XNGYORPT.js.map +0 -6
  91. package/dist/vm/env.d.ts +0 -3
  92. package/dist/vm/env.d.ts.map +0 -1
  93. package/dist/vm/helpers.d.ts +0 -20
  94. package/dist/vm/helpers.d.ts.map +0 -1
  95. package/dist/vm/operations.d.ts +0 -49
  96. package/dist/vm/operations.d.ts.map +0 -1
  97. package/src/vm/env.ts +0 -16
  98. package/src/vm/operations.ts +0 -412
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/vm/types/context.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAK9D,uBAAuB;AACvB,MAAM,WAAW,SAAS;IACtB,YAAY;IACZ,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;IAC5B,0BAA0B;IAC1B,IAAI,IAAI,SAAS,MAAM,EAAE,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,oCAAoC;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AACD,uBAAuB;AACvB,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACtD,uBAAuB;AACvB,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACzD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAgB,CAAC;AAC3E,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAgB,CAAC;AAS/F,qCAAqC;AACrC,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,EAClD,QAAQ,UAAQ,EAChB,WAAW,GAAE,MAAM,GAAG,IAAI,GAAG,SAAqB,GACnD,IAAI,CAcN;AAED,aAAa;AACb,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,SAAS,CAsB/C,CAAC;AAsEH,uBAAuB;AACvB,wBAAgB,eAAe,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;AACvD,qBAAqB;AACrB,wBAAgB,eAAe,CAC3B,QAAQ,CAAC,EAAE,oBAAoB,GAAG,IAAI,EACtC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAC7C,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,GACzD,SAAS,CAAC;AACb,qBAAqB;AACrB,wBAAgB,eAAe,CAC3B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,EAC5C,UAAU,CAAC,EAAE,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,EAC5C,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,GACzD,SAAS,CAAC"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/vm/types/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAK9D,uBAAuB;AACvB,MAAM,WAAW,SAAS;IACtB,YAAY;IACZ,QAAQ,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;IAC5B,0BAA0B;IAC1B,IAAI,IAAI,SAAS,MAAM,EAAE,CAAC;IAC1B,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC1C;;;OAGG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,oCAAoC;IACpC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B;AACD,uBAAuB;AACvB,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AACpD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAgB,CAAC;AAC3E,eAAO,MAAM,8BAA8B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAgB,CAAC;AAS/F,qCAAqC;AACrC,wBAAgB,oBAAoB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,EAClD,QAAQ,UAAQ,EAChB,WAAW,GAAE,MAAM,GAAG,IAAI,GAAG,SAAqB,GACnD,IAAI,CAcN;AAED,aAAa;AACb,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,SAAS,CAsB/C,CAAC;AAqHH,uBAAuB;AACvB,wBAAgB,eAAe,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC;AACvD,qBAAqB;AACrB,wBAAgB,eAAe,CAC3B,QAAQ,CAAC,EAAE,eAAe,GAAG,IAAI,EACjC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAC7C,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,GACzD,SAAS,CAAC;AACb,qBAAqB;AACrB,wBAAgB,eAAe,CAC3B,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,GAAG,SAAS,EAC5C,UAAU,CAAC,EAAE,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,EAC5C,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC,GAAG,IAAI,GACzD,SAAS,CAAC"}
@@ -2,8 +2,8 @@ import type { TypeName, VmAny, VmConst, VmPrimitive, VmValue } from './index.js'
2
2
  import { VmWrapper } from './wrapper.js';
3
3
  /** 包装 Mirascript `extern` 类型的对象 */
4
4
  export declare class VmExtern<const T extends object = object> extends VmWrapper<T> {
5
- readonly thisArg: T extends (...args: readonly never[]) => unknown ? VmExtern | null : null;
6
- constructor(value: T, thisArg?: T extends (...args: readonly never[]) => unknown ? VmExtern | null : null);
5
+ readonly thisArg: ThisParameterType<T> | null;
6
+ constructor(value: T, thisArg?: ThisParameterType<T> | null);
7
7
  /** Check if the object has a property */
8
8
  protected access(key: string, read: boolean): boolean;
9
9
  /** 决定是否对属性进行包装 */
@@ -1 +1 @@
1
- {"version":3,"file":"extern.d.ts","sourceRoot":"","sources":["../../../src/vm/types/extern.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAUzC,mCAAmC;AACnC,qBAAa,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAGnE,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,SAAS,KAAK,EAAE,KAAK,OAAO,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAI;gBAD3F,KAAK,EAAE,CAAC,EACC,OAAO,GAAE,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,SAAS,KAAK,EAAE,KAAK,OAAO,GAAG,QAAQ,GAAG,IAAI,GAAG,IAAW;IAKtG,yCAAyC;IACzC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO;IAiBrD,kBAAkB;IAClB,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC;IAIxG,kBAAkB;IACT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAGlC,kBAAkB;IACT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK;IAKhC,mCAAmC;IACnC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO;IAMzC,wBAAwB;IACxB,IAAI,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,KAAK;IAerC,kBAAkB;IACT,IAAI,IAAI,MAAM,EAAE;IAOzB,kBAAkB;IACT,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAIpC,kBAAkB;IACT,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM;IAiB7C,kBAAkB;IAClB,IAAa,IAAI,IAAI,QAAQ,CAE5B;IACD,kBAAkB;IAClB,IAAa,GAAG,IAAI,MAAM,CAqCzB;CACJ"}
1
+ {"version":3,"file":"extern.d.ts","sourceRoot":"","sources":["../../../src/vm/types/extern.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAWzC,mCAAmC;AACnC,qBAAa,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAGnE,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAI;gBAD7C,KAAK,EAAE,CAAC,EACC,OAAO,GAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAW;IAKxD,yCAAyC;IACzC,SAAS,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO;IAiBrD,kBAAkB;IAClB,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,SAAS,GAAG,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC;IAIxG,kBAAkB;IACT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAGlC,kBAAkB;IACT,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK;IAKhC,mCAAmC;IACnC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO;IAMzC,wBAAwB;IACxB,IAAI,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,KAAK;IAerC,kBAAkB;IACT,IAAI,IAAI,MAAM,EAAE;IAOzB,kBAAkB;IACT,IAAI,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAIpC,kBAAkB;IACT,QAAQ,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM;IAiB7C,kBAAkB;IAClB,IAAa,IAAI,IAAI,QAAQ,CAE5B;IACD,kBAAkB;IAClB,IAAa,GAAG,IAAI,MAAM,CAqCzB;CACJ"}
@@ -51,7 +51,7 @@ export interface VmValueMap {
51
51
  }
52
52
  export { isVmAny, isVmArray, isVmArrayLikeRecord, isVmArrayLikeRecordByEntires, isVmArrayLikeRecordByKeys, isVmCallable, isVmConst, isVmContext, isVmExtern, isVmFunction, isVmImmutable, isVmModule, isVmPrimitive, isVmRecord, isVmScript, isVmValue, isVmWrapper, getVmFunctionInfo, } from '../../helpers/types.js';
53
53
  export { wrapToVmValue, unwrapFromVmValue } from './boundary.js';
54
- export { type VmContext, defineVmContextValue, createVmContext } from './context.js';
54
+ export { type VmContext, type VmContextRecord, defineVmContextValue, createVmContext } from './context.js';
55
55
  export { VmExtern } from './extern.js';
56
56
  export { VmFunction, type VmFunctionInfo, type VmFunctionLike, type VmFunctionOption } from './function.js';
57
57
  export { VmModule } from './module.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vm/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,WAAW;AACX,MAAM,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC;AAExC,6BAA6B;AAC7B,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC;AACxC,qBAAqB;AACrB,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3D;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AACzD;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG;IACnB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CAC/C,CAAC;AACF,2BAA2B;AAC3B,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AACvD,2BAA2B;AAC3B,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAC1D,0BAA0B;AAC1B,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;AAC7C,kCAAkC;AAClC,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,eAAe,CAAC;AAE9C,aAAa;AACb,MAAM,WAAW,UAAU;IACvB,SAAS;IACT,GAAG,EAAE,IAAI,CAAC;IACV,UAAU;IACV,MAAM,EAAE,MAAM,CAAC;IACf,SAAS;IACT,MAAM,EAAE,MAAM,CAAC;IACf,UAAU;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB;IACpB,MAAM,EAAE,QAAQ,CAAC;IACjB,oBAAoB;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,oBAAoB;IACpB,QAAQ,EAAE,UAAU,CAAC;IACrB,aAAa;IACb,MAAM,EAAE,QAAQ,CAAC;IACjB,oBAAoB;IACpB,MAAM,EAAE,QAAQ,CAAC;CACpB;AAED,OAAO,EACH,OAAO,EACP,SAAS,EACT,mBAAmB,EACnB,4BAA4B,EAC5B,yBAAyB,EACzB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,UAAU,EACV,aAAa,EACb,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,KAAK,SAAS,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/vm/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,WAAW;AACX,MAAM,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC;AAExC,6BAA6B;AAC7B,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC;AACxC,qBAAqB;AACrB,MAAM,MAAM,WAAW,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAC3D;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,GAAG,SAAS,CAAC,CAAC;AACzD;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG;IACnB,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CAC/C,CAAC;AACF,2BAA2B;AAC3B,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,QAAQ,GAAG,OAAO,CAAC;AACvD,2BAA2B;AAC3B,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAC1D,0BAA0B;AAC1B,MAAM,MAAM,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;AAC7C,kCAAkC;AAClC,MAAM,MAAM,KAAK,GAAG,OAAO,GAAG,eAAe,CAAC;AAE9C,aAAa;AACb,MAAM,WAAW,UAAU;IACvB,SAAS;IACT,GAAG,EAAE,IAAI,CAAC;IACV,UAAU;IACV,MAAM,EAAE,MAAM,CAAC;IACf,SAAS;IACT,MAAM,EAAE,MAAM,CAAC;IACf,UAAU;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,oBAAoB;IACpB,MAAM,EAAE,QAAQ,CAAC;IACjB,oBAAoB;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,oBAAoB;IACpB,QAAQ,EAAE,UAAU,CAAC;IACrB,aAAa;IACb,MAAM,EAAE,QAAQ,CAAC;IACjB,oBAAoB;IACpB,MAAM,EAAE,QAAQ,CAAC;CACpB;AAED,OAAO,EACH,OAAO,EACP,SAAS,EACT,mBAAmB,EACnB,4BAA4B,EAC5B,yBAAyB,EACzB,YAAY,EACZ,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,EACZ,aAAa,EACb,UAAU,EACV,aAAa,EACb,UAAU,EACV,UAAU,EACV,SAAS,EACT,WAAW,EACX,iBAAiB,GACpB,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,eAAe,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC3G,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5G,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mirascript/mirascript",
3
- "version": "0.1.21",
3
+ "version": "0.1.23",
4
4
  "author": "CloudPSS",
5
5
  "license": "MIT",
6
6
  "description": "An expression based scripting language.",
@@ -36,15 +36,16 @@
36
36
  "commander": "^14.0.2",
37
37
  "source-map-js": "^1.2.1",
38
38
  "supports-color": "^10.2.2",
39
- "@mirascript/bindings": "~0.1.21"
39
+ "@mirascript/bindings": "~0.1.23"
40
40
  },
41
41
  "devDependencies": {
42
- "@types/node": "^24.10.2",
42
+ "@types/node": "^25.0.1",
43
43
  "@types/sinon": "^21.0.0",
44
44
  "ava": "^6.4.1",
45
45
  "c8": "^10.1.3",
46
46
  "madge": "^8.0.0",
47
47
  "sinon": "^21.0.0",
48
+ "tinybench": "^6.0.0",
48
49
  "type-fest": "^5.3.1"
49
50
  },
50
51
  "scripts": {
@@ -54,6 +55,7 @@
54
55
  "mirascript": "node --enable-source-maps ./dist/cli/index.js",
55
56
  "deps": "madge --circular --warning ./src",
56
57
  "clean": "rimraf dist",
57
- "test": "c8 ava"
58
+ "test": "c8 ava",
59
+ "bench": "node ./bench/index.ts"
58
60
  }
59
61
  }
@@ -1,8 +1,8 @@
1
1
  import { wrapScript, type VmScript } from './create-script.js';
2
2
  import type { TranspileOptions } from './types.js';
3
- import { GlobalFallback } from '../vm/helpers.js';
3
+ import { $GlobalFallback } from '../vm/operations/index.js';
4
4
  import type { VmContext, VmValue } from '../vm/index.js';
5
- import { isFinite } from '../helpers/utils.js';
5
+ import { defineProperty, isFinite } from '../helpers/utils.js';
6
6
  import { keywords } from './keywords.js';
7
7
 
8
8
  const REG_NUMBER_FULL = /^(?:[+-])?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?$/;
@@ -28,16 +28,30 @@ function constantFiniteNumber(value: number): () => number {
28
28
  return () => 0;
29
29
  }
30
30
  }
31
- // eslint-disable-next-line @typescript-eslint/no-implied-eval, @typescript-eslint/no-unsafe-call
32
- return new Function(`return () => ${value};`)() as () => number;
31
+ const f = () => value;
32
+ defineProperty(f, 'toString', {
33
+ value: () => {
34
+ return `() => ${value};`;
35
+ },
36
+ writable: false,
37
+ enumerable: false,
38
+ configurable: false,
39
+ });
40
+ return f;
33
41
  }
34
42
  /** 构造返回常量的函数 */
35
43
  function constantString(value: string): () => string {
36
- const code = JSON.stringify(value);
37
- // eslint-disable-next-line @typescript-eslint/no-implied-eval, @typescript-eslint/no-unsafe-call
38
- return new Function(`return () => ${code};`)() as () => string;
44
+ const f = () => value;
45
+ defineProperty(f, 'toString', {
46
+ value: () => {
47
+ return `() => ${JSON.stringify(value)};`;
48
+ },
49
+ writable: false,
50
+ enumerable: false,
51
+ configurable: false,
52
+ });
53
+ return f;
39
54
  }
40
-
41
55
  /** 构造返回常量的函数 */
42
56
  function nan(): () => number {
43
57
  return () => 0 / 0;
@@ -69,10 +83,16 @@ function nil(): () => null {
69
83
 
70
84
  /** 构造返回全局变量的函数 */
71
85
  function globalVariable(id: string): (global: VmContext | undefined) => VmValue {
72
- const code = `return (global = GlobalFallback()) => global.get(\`${id}\`);`;
73
-
74
- // eslint-disable-next-line @typescript-eslint/no-implied-eval, @typescript-eslint/no-unsafe-call
75
- return new Function('GlobalFallback', code)(GlobalFallback) as (global: VmContext | undefined) => VmValue;
86
+ const f = (global = $GlobalFallback()): VmValue => global.get(id);
87
+ defineProperty(f, 'toString', {
88
+ value: () => {
89
+ return `(global = $GlobalFallback()) => global.get(${JSON.stringify(id)});`;
90
+ },
91
+ writable: false,
92
+ enumerable: false,
93
+ configurable: false,
94
+ });
95
+ return f;
76
96
  }
77
97
 
78
98
  let kw: Set<string> | undefined;
@@ -1,6 +1,6 @@
1
1
  import { kVmScript, VM_SCRIPT_NAME } from '../helpers/constants.js';
2
- import { defineProperty } from '../helpers/utils.js';
3
- import { keys, values } from '../vm/env.js';
2
+ import { defineProperty, entries } from '../helpers/utils.js';
3
+ import * as operations from '../vm/operations/index.js';
4
4
  import type { VmValue, VmContext } from '../vm/types/index.js';
5
5
  import type { InputMode, ScriptInput } from './types.js';
6
6
 
@@ -14,7 +14,9 @@ export type VmScript = VmScriptLike & {
14
14
  readonly source: string;
15
15
  };
16
16
 
17
- /** 生成 JS 函数 */
17
+ /**
18
+ * 将 JS 函数包装为 Mirascript 脚本
19
+ */
18
20
  export function wrapScript(source: ScriptInput, mode: InputMode, script: VmScriptLike): VmScript {
19
21
  /* c8 ignore next 3 */
20
22
  if (kVmScript in script) {
@@ -30,12 +32,24 @@ export function wrapScript(source: ScriptInput, mode: InputMode, script: VmScrip
30
32
  return script as VmScript;
31
33
  }
32
34
 
33
- /** 生成 JS 函数 */
35
+ const [keys, values] = (() => {
36
+ const keys: string[] = [];
37
+ const values: unknown[] = [];
38
+ for (const [key, value] of entries(operations)) {
39
+ keys.push(key);
40
+ values.push(value);
41
+ }
42
+ return [keys.join(','), values] as const;
43
+ })();
44
+
45
+ /**
46
+ * 从 MiraScript 编译结果源代码生成 Mirascript 脚本
47
+ */
34
48
  export function createScript(source: ScriptInput, mode: InputMode, code: string): VmScript {
35
49
  let script;
36
50
  try {
37
51
  // eslint-disable-next-line @typescript-eslint/no-implied-eval, @typescript-eslint/no-unsafe-call
38
- script = new Function(...keys, code)(...values) as VmScriptLike;
52
+ script = new Function(keys, `'use strict';\nreturn ${code}`)(...values) as VmScriptLike;
39
53
  /* c8 ignore next 3 */
40
54
  } catch (error) {
41
55
  throw new Error(`Failed to create script`, { cause: error });
@@ -1 +1 @@
1
- export const SCRIPT_PREFIX = `return ((global = GlobalFallback()) => { try { CpEnter();`;
1
+ export const SCRIPT_PREFIX = `((global = $GlobalFallback()) => { try { $CpEnter();`;
@@ -128,7 +128,7 @@ export class Emitter {
128
128
  continue;
129
129
  }
130
130
  this.codeOffset++;
131
- const body = this.ident(-1) + `} finally { CpExit(); } });`;
131
+ const body = this.ident(-1) + `} finally { $CpExit(); } });`;
132
132
  this.codeLines.push(body);
133
133
  this.closureCounter--;
134
134
  this.identCounter--;
@@ -204,8 +204,8 @@ export class Emitter {
204
204
  const opt = opcode === OpCode.FieldOpt;
205
205
  // Use computed property names to avoid prototype pollution
206
206
  code = opt
207
- ? `...ElementOpt(${field_name}, ${this.rv(value)}),`
208
- : `[${field_name}]: Element(${this.rv(value)}),`;
207
+ ? `...$ElOpt(${field_name}, ${this.rv(value)}),`
208
+ : `[${field_name}]: $El(${this.rv(value)}),`;
209
209
  break;
210
210
  }
211
211
  case OpCode.FieldOptDyn:
@@ -214,8 +214,8 @@ export class Emitter {
214
214
  const value = read();
215
215
  const opt = opcode === OpCode.FieldOptDyn;
216
216
  code = opt
217
- ? `...ElementOpt(${this.rv(field)}, ${this.rv(value)}),`
218
- : `[${this.rv(field)}]: Element(${this.rv(value)}),`;
217
+ ? `...$ElOpt(${this.rv(field)}, ${this.rv(value)}),`
218
+ : `[${this.rv(field)}]: $El(${this.rv(value)}),`;
219
219
  break;
220
220
  }
221
221
  case OpCode.FieldOptIndex:
@@ -223,9 +223,7 @@ export class Emitter {
223
223
  const field = this.readIndex(wide);
224
224
  const value = read();
225
225
  const opt = opcode === OpCode.FieldOptIndex;
226
- code = opt
227
- ? `...ElementOpt(${field}, ${this.rv(value)}),`
228
- : `[${field}]: Element(${this.rv(value)}),`;
226
+ code = opt ? `...$ElOpt(${field}, ${this.rv(value)}),` : `[${field}]: $El(${this.rv(value)}),`;
229
227
  break;
230
228
  }
231
229
  case OpCode.Spread: {
@@ -263,25 +261,25 @@ export class Emitter {
263
261
  switch (opcode) {
264
262
  case OpCode.Item: {
265
263
  const value = read();
266
- code = `Element(${this.rv(value)}),`;
264
+ code = `$El(${this.rv(value)}),`;
267
265
  break;
268
266
  }
269
267
  case OpCode.ItemRange: {
270
268
  const start = this.readIndex(wide);
271
269
  const end = this.readIndex(wide);
272
- code = `...ArrayRange(${start}, ${end}),`;
270
+ code = `...$ArrayRange(${start}, ${end}),`;
273
271
  break;
274
272
  }
275
273
  case OpCode.ItemRangeDyn: {
276
274
  const start = read();
277
275
  const end = read();
278
- code = `...ArrayRange(${this.rv(start)}, ${this.rv(end)}),`;
276
+ code = `...$ArrayRange(${this.rv(start)}, ${this.rv(end)}),`;
279
277
  break;
280
278
  }
281
279
  case OpCode.ItemRangeExclusiveDyn: {
282
280
  const start = read();
283
281
  const end = read();
284
- code = `...ArrayRangeExclusive(${this.rv(start)}, ${this.rv(end)}),`;
282
+ code = `...$ArrayRangeExclusive(${this.rv(start)}, ${this.rv(end)}),`;
285
283
  break;
286
284
  }
287
285
  case OpCode.Spread: {
@@ -329,7 +327,7 @@ export class Emitter {
329
327
  const wv = this.wv(i + 1, -1);
330
328
  if (varg && i === argn - 1) {
331
329
  // 最后一个参数为可变参数
332
- return `...vargs`;
330
+ return `...args`;
333
331
  }
334
332
  return `${wv} = null`;
335
333
  });
@@ -341,16 +339,13 @@ export class Emitter {
341
339
  if (script) {
342
340
  code = `${SCRIPT_PREFIX} var ${regs};`;
343
341
  } else {
344
- if (!this.options.sourceMap) {
345
- code = `${this.wv(reg)} = Function(null ,(${args.join(', ')}) => { try { CpEnter(); var ${regs};`;
346
- } else {
347
- const index = this.functions.length;
342
+ if (this.options.sourceMap) {
348
343
  this.functions.push(this.codeLines.length);
349
- code = `${this.wv(reg)} = Function(fnName_${index} ,(${args.join(', ')}) => { try { CpEnter(); var ${regs};`;
350
344
  }
345
+ code = `${this.wv(reg)} = $Fn(null, (${args.join(', ')}) => { try { $CpEnter(); var ${regs};`;
351
346
  }
352
347
  if (varg) {
353
- code += ` var ${this.wv(argn, -1)} = Vargs(vargs);`;
348
+ code += ` var ${this.wv(argn, -1)} = $VArgs(args);`;
354
349
  }
355
350
  break;
356
351
  }
@@ -546,7 +541,7 @@ export class Emitter {
546
541
  reg = read();
547
542
  const level = read();
548
543
  const up = read();
549
- code = `${this.wv(reg)} = Upvalue(${this.rv(up, level)});`;
544
+ code = `${this.wv(reg)} = $Upvalue(${this.rv(up, level)});`;
550
545
  break;
551
546
  }
552
547
  case OpCode.SetUpvalue: {
@@ -640,7 +635,7 @@ export class Emitter {
640
635
  const regs = createArray(nreg - 1, (i) => this.wv(i + 2, -1));
641
636
  regs.unshift('_');
642
637
  const ir = this.wv(1, -1);
643
- code = `for (let ${ir} of $Iterable(${this.rv(iterable)})) { ${ir} ??= null; Cp(); let ${regs.join(', ')};`;
638
+ code = `for (let ${ir} of $Iterable(${this.rv(iterable)})) { ${ir} ??= null; $Cp(); let ${regs.join(', ')};`;
644
639
  break;
645
640
  }
646
641
  case OpCode.LoopRange:
@@ -652,14 +647,14 @@ export class Emitter {
652
647
  const regs = createArray(nreg - 1, (i) => this.wv(i + 2, -1));
653
648
  regs.unshift('_');
654
649
  const i = this.wv(1, -1);
655
- code = `for (let start = $ToNumber(${this.rv(start)}), end = $ToNumber(${this.rv(end)}), ${i} = start; ${i} ${exclusive ? '<' : '<='} end; ${i} += 1) { Cp(); let ${regs.join(', ')};`;
650
+ code = `for (let start = $ToNumber(${this.rv(start)}), end = $ToNumber(${this.rv(end)}), ${i} = start; ${i} ${exclusive ? '<' : '<='} end; ${i} += 1) { $Cp(); let ${regs.join(', ')};`;
656
651
  break;
657
652
  }
658
653
  case OpCode.Loop: {
659
654
  const nreg = read();
660
655
  const regs = createArray(nreg, (i) => this.wv(i + 1, -1));
661
656
  regs.unshift('_');
662
- code = `while (true) { Cp(); let ${regs.join(', ')};`;
657
+ code = `while (true) { $Cp(); let ${regs.join(', ')};`;
663
658
  break;
664
659
  }
665
660
  case OpCode.Break: {
@@ -724,8 +719,6 @@ export class Emitter {
724
719
  addSourceMap(): void {
725
720
  if (this.options.sourceMap) {
726
721
  createSourceMap(this.source, this.sourcemaps, this.codeLines, this.functions, this.options);
727
- } else {
728
- this.codeLines.unshift(`'use strict';`);
729
722
  }
730
723
  }
731
724
  }
@@ -91,20 +91,20 @@ export function createSourceMap(
91
91
  source: fileName,
92
92
  });
93
93
  }
94
- let fnNames = `'use strict';`;
95
94
  if (typeof source === 'string') {
96
95
  const lines = source.split(/\r?\n/);
97
- for (let i = 0; i < functions.length; i++) {
98
- const index = functions[i]!;
99
- const mapping = sourcemaps[index];
100
- const line = mapping ? lines[mapping.startLineNumber - 1] : undefined;
101
- const fnName = mapping && line ? line.slice(mapping.startColumn - 1, mapping.endColumn - 1) : '';
102
- fnNames += `var fnName_${i} = ${fnName ? toJsLiteral(fnName) : 'null'};`;
96
+ for (const codeLineNo of functions) {
97
+ const mapping = sourcemaps[codeLineNo];
98
+ const sourceLine = mapping ? lines[mapping.startLineNumber - 1] : undefined;
99
+ const fnName =
100
+ mapping && sourceLine ? sourceLine.slice(mapping.startColumn - 1, mapping.endColumn - 1) : '';
101
+ if (!fnName) continue;
102
+ const codeLine = codeLines[codeLineNo]!;
103
+ codeLines[codeLineNo] = codeLine.replace(`= $Fn(null,`, `= $Fn(${toJsLiteral(fnName)},`);
103
104
  }
104
105
  }
105
106
  const sourceURL = hasSchema ? fileName : `${ORIGIN}${fileName}`;
106
107
  const dataUrl = toDataUrl(map.toString());
107
- codeLines.unshift(fnNames);
108
108
  codeLines.push(
109
109
  // Prevent source map from being recognized as of this file
110
110
  `${SOURCE_URL}=${sourceURL}.js`,
@@ -0,0 +1,70 @@
1
+ import { generateBytecodeSync } from '../compiler/generate-bytecode.js';
2
+ import { DiagnosticCode, parseDiagnostics } from '../compiler/diagnostic.js';
3
+ import { REG_IDENTIFIER } from './constants.js';
4
+ import type { InputMode } from '../compiler/types.js';
5
+
6
+ /** 一个访问链,第一个元素为全局变量名称 */
7
+ export type GlobalReferenceChain = readonly [globalVariableName: string, ...fields: ReadonlyArray<string | number>];
8
+
9
+ const REG_SPILT = /\s*!?\s*\.\s*/u;
10
+ const REG_CHAIN = new RegExp(
11
+ String.raw`^(${REG_IDENTIFIER.source})(?:${REG_SPILT.source}(?:\d+|${REG_IDENTIFIER.source}))*`,
12
+ 'u',
13
+ );
14
+
15
+ const { parseInt } = Number;
16
+ /**
17
+ * 分析表达式依赖的全局变量
18
+ */
19
+ export function analyzeGlobalReferences(expression: string, mode?: InputMode): GlobalReferenceChain[] {
20
+ if (expression.trim() === '') {
21
+ return [];
22
+ }
23
+ const [code, diagnostics] = generateBytecodeSync(expression, {
24
+ input_mode: mode || 'Script',
25
+ diagnostic_position_encoding: 'Utf16',
26
+ // 需要设为 true 以便在编译失败时返回空的 bytecode
27
+ diagnostic_error: true,
28
+ diagnostic_warning: false,
29
+ diagnostic_info: false,
30
+ diagnostic_hint: false,
31
+ diagnostic_reference: false,
32
+ diagnostic_tag: true,
33
+ diagnostic_sourcemap: false,
34
+ trivia: false,
35
+ });
36
+ if (code == null || diagnostics.length === 0) {
37
+ return [];
38
+ }
39
+ const parsedDiagnostics = parseDiagnostics(expression, diagnostics);
40
+ const globals = parsedDiagnostics.tags.filter((t) => t.code === DiagnosticCode.GlobalVariable);
41
+ if (globals.length === 0) {
42
+ return [];
43
+ }
44
+ const lines = expression.split(/\r?\n/);
45
+ const result = new Set<string>();
46
+ for (const global of globals) {
47
+ // 分析每个全局变量访问
48
+ const line = lines[global.range.startLineNumber - 1];
49
+ if (!line) continue;
50
+ const access = line.slice(global.range.startColumn - 1);
51
+ const chain = REG_CHAIN.exec(access);
52
+ if (chain == null) continue;
53
+ const globalName = chain[1];
54
+ if (globalName?.length !== global.range.endColumn - global.range.startColumn) continue;
55
+ const chainStr = chain[0].split(REG_SPILT).join('.');
56
+ result.add(chainStr);
57
+ }
58
+ const accessChains: GlobalReferenceChain[] = [];
59
+ for (const chainStr of result) {
60
+ const parts = chainStr.split('.').map((part) => {
61
+ if (/^\d/.test(part)) {
62
+ // 数字开头的部分一定是数字
63
+ return parseInt(part, 10);
64
+ }
65
+ return part;
66
+ });
67
+ accessChains.push(parts as unknown as GlobalReferenceChain);
68
+ }
69
+ return accessChains;
70
+ }
package/src/subtle.ts CHANGED
@@ -4,8 +4,7 @@ export { keywords } from './compiler/keywords.js';
4
4
  export * as constants from './helpers/constants.js';
5
5
  export * as convert from './helpers/convert/index.js';
6
6
  export { DefaultVmContext } from './vm/types/context.js';
7
- export * as operations from './vm/operations.js';
8
- export * as helpers from './vm/helpers.js';
7
+ export * as operations from './vm/operations/index.js';
9
8
  export {
10
9
  display as serializeForDisplay,
11
10
  serialize,
@@ -21,4 +20,6 @@ export {
21
20
  export { lib } from './vm/lib/index.js';
22
21
  export * from './compiler/diagnostic.js';
23
22
  export { emitScript } from './compiler/emit-script.js';
23
+ export { createScript, wrapScript } from './compiler/create-script.js';
24
24
  export { generateBytecode, generateBytecodeSync, type VmBytecodeResult } from './compiler/generate-bytecode.js';
25
+ export { type GlobalReferenceChain, analyzeGlobalReferences } from './helpers/analyze.js';
@@ -1,5 +1,5 @@
1
1
  import { expectNumber, VmLib } from '../helpers.js';
2
- const { atan2: _atan2, pow: _pow } = Math;
2
+ const { atan2: _atan2, pow: _pow, random: _random } = Math;
3
3
 
4
4
  export const atan2 = VmLib((x, y) => _atan2(expectNumber(0, x), expectNumber(1, y)), {
5
5
  summary: '返回从原点到点 (x, y) 的角度(弧度)',
@@ -13,7 +13,7 @@ export const pow = VmLib((x, y) => _pow(expectNumber(0, x), expectNumber(1, y)),
13
13
  paramsType: { x: 'number', y: 'number' },
14
14
  returnsType: 'number',
15
15
  });
16
- export const random = VmLib(Math.random, {
16
+ export const random = VmLib(() => _random(), {
17
17
  summary: '返回 [0, 1) 之间的伪随机数',
18
18
  params: {},
19
19
  paramsType: {},
@@ -1,7 +1,7 @@
1
1
  import { toBoolean } from '../../../../helpers/convert/to-boolean.js';
2
2
  import { entries } from '../../../../helpers/utils.js';
3
- import { Cp } from '../../../helpers.js';
4
- import { $Call } from '../../../operations.js';
3
+ import { Cp } from '../../../checkpoint.js';
4
+ import { $Call } from '../../../operations/index.js';
5
5
  import { isVmArray } from '../../../types/index.js';
6
6
  import { expectArrayOrRecord, expectCallable, VmLib } from '../../helpers.js';
7
7
 
@@ -1,7 +1,7 @@
1
1
  import { toBoolean } from '../../../../helpers/convert/to-boolean.js';
2
2
  import { entries } from '../../../../helpers/utils.js';
3
- import { Cp } from '../../../helpers.js';
4
- import { $Call, $Same } from '../../../operations.js';
3
+ import { Cp } from '../../../checkpoint.js';
4
+ import { $Call, $Same } from '../../../operations/index.js';
5
5
  import { type VmValue, isVmArray, isVmCallable } from '../../../types/index.js';
6
6
  import { VmLib, expectArrayOrRecord, required } from '../../helpers.js';
7
7
 
@@ -1,5 +1,5 @@
1
1
  import { toBoolean } from '../../../../helpers/convert/to-boolean.js';
2
- import { $Call } from '../../../operations.js';
2
+ import { $Call } from '../../../operations/index.js';
3
3
  import { isVmConst, type VmAny, type VmValue } from '../../../types/index.js';
4
4
  import { VmLib, expectCallable, expectConst, map as mapImpl } from '../../helpers.js';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { toNumber } from '../../../../helpers/convert/to-number.js';
2
- import { $Call } from '../../../operations.js';
2
+ import { $Call } from '../../../operations/index.js';
3
3
  import type { VmAny, VmConst, VmValue } from '../../../types/index.js';
4
4
  import { VmLib, expectArray, expectCallable } from '../../helpers.js';
5
5
 
@@ -2,7 +2,7 @@ import { VM_ARRAY_MAX_LENGTH } from '../../../../helpers/constants.js';
2
2
  import { toNumber, toString } from '../../../../helpers/convert/index.js';
3
3
  import { isVmArray, isVmRecord } from '../../../../helpers/types.js';
4
4
  import { isArray, isInteger, isNaN } from '../../../../helpers/utils.js';
5
- import { Element } from '../../../helpers.js';
5
+ import { $El } from '../../../operations/helpers.js';
6
6
  import type { VmArray, VmConst, VmValue } from '../../../types/index.js';
7
7
  import { VmLib, expectArrayOrRecord, expectConst, throwError } from '../../helpers.js';
8
8
 
@@ -69,7 +69,7 @@ const normalizeEntries = (data: VmConst, entries: Array<VmValue | undefined>): M
69
69
  }
70
70
  }
71
71
  const value = entries[i + 1]!;
72
- entryData.set(key, Element(value));
72
+ entryData.set(key, $El(value));
73
73
  }
74
74
  return entryData;
75
75
  };
@@ -1,5 +1,5 @@
1
1
  import { display } from '../../../../helpers/serialize.js';
2
- import { Cp } from '../../../helpers.js';
2
+ import { Cp } from '../../../checkpoint.js';
3
3
  import { isVmArray, type VmConst, type VmArray } from '../../../types/index.js';
4
4
  import { VmLib, throwError } from '../../helpers.js';
5
5
  import { entries } from './entries.js';
@@ -17,7 +17,7 @@ import type {
17
17
  VmFunctionLike,
18
18
  VmFunctionOption,
19
19
  } from '../types/index.js';
20
- import { Cp } from '../helpers.js';
20
+ import { Cp } from '../checkpoint.js';
21
21
 
22
22
  /** 抛出异常 */
23
23
  export function throwError(message: string, recovered: VmAny | (() => VmAny)): never {
@@ -1,7 +1,7 @@
1
1
  import { toNumber } from '../../../helpers/convert/to-number.js';
2
2
  import { isArray } from '../../../helpers/utils.js';
3
- import { Cp } from '../../helpers.js';
4
- import { $Add, $Call, $Div, $Mul, $Sub } from '../../operations.js';
3
+ import { Cp } from '../../checkpoint.js';
4
+ import { $Add, $Call, $Div, $Mul, $Sub } from '../../operations/index.js';
5
5
  import { isVmArray, isVmConst, type VmAny, type VmArray, type VmConst, type VmValue } from '../../types/index.js';
6
6
  import {
7
7
  VmLib,
@@ -0,0 +1,18 @@
1
+ import { VmError } from '../../helpers/error.js';
2
+ import { display } from '../../helpers/serialize.js';
3
+ import { isVmFunction, isVmExtern } from '../../helpers/types.js';
4
+ import type { VmAny, VmValue } from '../types/index.js';
5
+ import { $AssertInit } from './common.js';
6
+
7
+ export const $Call = (func: VmValue, args: readonly VmAny[]): VmValue => {
8
+ for (const a of args) {
9
+ $AssertInit(a);
10
+ }
11
+ if (isVmExtern(func)) {
12
+ return func.call(args as readonly VmValue[]) ?? null;
13
+ }
14
+ if (isVmFunction(func)) {
15
+ return func(...(args as readonly VmValue[])) ?? null;
16
+ }
17
+ throw new VmError(`Value is not callable: ${display(func)}`, null);
18
+ };
@@ -0,0 +1,6 @@
1
+ import { VmError } from '../../helpers/error.js';
2
+ import type { VmAny, VmValue } from '../types/index.js';
3
+
4
+ export const $AssertInit: (value: VmAny) => asserts value is VmValue = (value) => {
5
+ if (value === undefined) throw new VmError(`Uninitialized value`, null);
6
+ };