@harmoniclabs/pebble 0.1.0-dev5 → 0.1.0-dev6

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 (307) hide show
  1. package/dist/IR/IRHash.d.ts +3 -3
  2. package/dist/IR/IRHash.js +47 -52
  3. package/dist/IR/IRNodes/IRApp.d.ts +12 -8
  4. package/dist/IR/IRNodes/IRApp.js +34 -20
  5. package/dist/IR/IRNodes/IRCase.d.ts +11 -7
  6. package/dist/IR/IRNodes/IRCase.js +33 -32
  7. package/dist/IR/IRNodes/IRConst.d.ts +7 -5
  8. package/dist/IR/IRNodes/IRConst.js +23 -13
  9. package/dist/IR/IRNodes/IRConstr.d.ts +11 -7
  10. package/dist/IR/IRNodes/IRConstr.js +34 -37
  11. package/dist/IR/IRNodes/IRDelayed.d.ts +12 -9
  12. package/dist/IR/IRNodes/IRDelayed.js +22 -18
  13. package/dist/IR/IRNodes/IRError.d.ts +9 -6
  14. package/dist/IR/IRNodes/IRError.js +12 -5
  15. package/dist/IR/IRNodes/IRForced.d.ts +9 -6
  16. package/dist/IR/IRNodes/IRForced.js +22 -18
  17. package/dist/IR/IRNodes/IRFunc.d.ts +14 -10
  18. package/dist/IR/IRNodes/IRFunc.js +35 -38
  19. package/dist/IR/IRNodes/IRHoisted.d.ts +16 -9
  20. package/dist/IR/IRNodes/IRHoisted.js +36 -18
  21. package/dist/IR/IRNodes/IRLetted.d.ts +14 -34
  22. package/dist/IR/IRNodes/IRLetted.js +65 -297
  23. package/dist/IR/IRNodes/IRNative/IRNativeTag.d.ts +0 -2
  24. package/dist/IR/IRNodes/IRNative/IRNativeTag.js +0 -4
  25. package/dist/IR/IRNodes/IRNative/index.d.ts +9 -8
  26. package/dist/IR/IRNodes/IRNative/index.js +55 -18
  27. package/dist/IR/IRNodes/IRNative/isForcedNative.d.ts +2 -0
  28. package/dist/IR/IRNodes/IRNative/isForcedNative.js +1 -1
  29. package/dist/IR/IRNodes/IRRecursive.d.ts +18 -10
  30. package/dist/IR/IRNodes/IRRecursive.js +36 -44
  31. package/dist/IR/IRNodes/IRSelfCall.d.ts +10 -24
  32. package/dist/IR/IRNodes/IRSelfCall.js +25 -87
  33. package/dist/IR/IRNodes/IRVar.d.ts +11 -19
  34. package/dist/IR/IRNodes/IRVar.js +26 -54
  35. package/dist/IR/IRNodes/utils/dependsByDbns.d.ts +1 -1
  36. package/dist/IR/IRNodes/utils/dependsByDbns.js +5 -11
  37. package/dist/IR/IRNodes/utils/hashVarSym.d.ts +1 -0
  38. package/dist/IR/IRNodes/utils/hashVarSym.js +37 -0
  39. package/dist/IR/IRNodes/utils/makeArrayLikeProxy.d.ts +2 -1
  40. package/dist/IR/IRTerm.d.ts +7 -0
  41. package/dist/IR/toUPLC/_internal/_modifyChildFromTo.js +3 -0
  42. package/dist/IR/toUPLC/_internal/findAll.js +2 -73
  43. package/dist/IR/toUPLC/_internal/getDebruijnInTerm.js +7 -34
  44. package/dist/IR/toUPLC/_internal/iterTree.js +3 -17
  45. package/dist/IR/toUPLC/common_hoisted.d.ts +2 -0
  46. package/dist/IR/toUPLC/common_hoisted.js +4 -0
  47. package/dist/IR/toUPLC/compileIRToUPLC.d.ts +1 -1
  48. package/dist/IR/toUPLC/compileIRToUPLC.js +91 -14
  49. package/dist/IR/toUPLC/ctx/ToUplcCtx.d.ts +16 -0
  50. package/dist/IR/toUPLC/ctx/ToUplcCtx.js +75 -0
  51. package/dist/IR/toUPLC/subRoutines/_comptimeDropN.d.ts +8 -0
  52. package/dist/IR/toUPLC/subRoutines/_comptimeDropN.js +95 -0
  53. package/dist/IR/toUPLC/subRoutines/handleHoistedAndReturnRoot/index.js +7 -54
  54. package/dist/IR/toUPLC/subRoutines/handleLetted/groupByScope.d.ts +6 -13
  55. package/dist/IR/toUPLC/subRoutines/handleLetted/groupByScope.js +67 -71
  56. package/dist/IR/toUPLC/subRoutines/handleLetted/index.js +44 -170
  57. package/dist/IR/toUPLC/subRoutines/handleRecursiveTerms.js +7 -3
  58. package/dist/IR/toUPLC/subRoutines/hoistForcedNatives.js +3 -2
  59. package/dist/IR/toUPLC/subRoutines/inlineSingleUseAndReturnRoot/InlineSingleUseCtx.d.ts +22 -0
  60. package/dist/IR/toUPLC/subRoutines/inlineSingleUseAndReturnRoot/InlineSingleUseCtx.js +59 -0
  61. package/dist/IR/toUPLC/subRoutines/inlineSingleUseAndReturnRoot/inlineSingleUseAndReturnRoot.d.ts +0 -0
  62. package/dist/IR/toUPLC/subRoutines/inlineSingleUseAndReturnRoot/inlineSingleUseAndReturnRoot.js +217 -0
  63. package/dist/IR/toUPLC/subRoutines/markRecursiveHoistsAsForced.js +12 -49
  64. package/dist/IR/toUPLC/subRoutines/performUplcOptimizationsAndReturnRoot/expandFuncsAndReturnRoot.d.ts +1 -1
  65. package/dist/IR/toUPLC/subRoutines/performUplcOptimizationsAndReturnRoot/expandFuncsAndReturnRoot.js +11 -14
  66. package/dist/IR/toUPLC/subRoutines/performUplcOptimizationsAndReturnRoot/{index.d.ts → performUplcOptimizationsAndReturnRoot.d.ts} +0 -2
  67. package/dist/IR/toUPLC/subRoutines/performUplcOptimizationsAndReturnRoot/performUplcOptimizationsAndReturnRoot.js +151 -0
  68. package/dist/IR/toUPLC/subRoutines/removeUnusuedVarsAndReturnRoot/RemoveUnusedVarsCtx.d.ts +11 -0
  69. package/dist/IR/toUPLC/subRoutines/removeUnusuedVarsAndReturnRoot/RemoveUnusedVarsCtx.js +46 -0
  70. package/dist/IR/toUPLC/subRoutines/removeUnusuedVarsAndReturnRoot/removeUnusuedVarsAndReturnRoot.d.ts +2 -0
  71. package/dist/IR/toUPLC/subRoutines/removeUnusuedVarsAndReturnRoot/removeUnusuedVarsAndReturnRoot.js +80 -0
  72. package/dist/IR/toUPLC/subRoutines/replaceHoistedWithLetted.js +18 -11
  73. package/dist/IR/toUPLC/subRoutines/replaceNatives/nativeToIR.d.ts +43 -0
  74. package/dist/IR/toUPLC/subRoutines/replaceNatives/nativeToIR.js +255 -478
  75. package/dist/IR/toUPLC/subRoutines/rewriteNativesAppliedToConstantsAndReturnRoot.d.ts +2 -0
  76. package/dist/IR/toUPLC/subRoutines/rewriteNativesAppliedToConstantsAndReturnRoot.js +85 -0
  77. package/dist/IR/toUPLC/subRoutines/sanifyTree.js +1 -0
  78. package/dist/IR/toUPLC/utils/getApplicationTerms.d.ts +6 -0
  79. package/dist/IR/toUPLC/utils/getApplicationTerms.js +37 -0
  80. package/dist/IR/tree_utils/_ir_lazyChooseList.d.ts +2 -2
  81. package/dist/IR/tree_utils/_ir_lazyChooseList.js +4 -2
  82. package/dist/IR/tree_utils/_ir_lazyIfThenElse.d.ts +1 -1
  83. package/dist/IR/tree_utils/_ir_lazyIfThenElse.js +4 -2
  84. package/dist/IR/tree_utils/_ir_let.d.ts +2 -1
  85. package/dist/IR/tree_utils/_ir_let.js +6 -2
  86. package/dist/IR/utils/isClosedIRTerm.d.ts +1 -0
  87. package/dist/IR/utils/isClosedIRTerm.js +39 -25
  88. package/dist/IR/utils/positiveIntAsBytes.d.ts +1 -0
  89. package/dist/IR/utils/positiveIntAsBytes.js +4 -0
  90. package/dist/IR/utils/showIR.d.ts +10 -21
  91. package/dist/IR/utils/showIR.js +66 -64
  92. package/dist/ast/nodes/common/Identifier.d.ts +1 -0
  93. package/dist/ast/nodes/common/Identifier.js +3 -0
  94. package/dist/ast/nodes/expr/CaseExpr.d.ts +5 -5
  95. package/dist/ast/nodes/expr/ElemAccessExpr.d.ts +2 -2
  96. package/dist/ast/nodes/expr/ParentesizedExpr.d.ts +1 -1
  97. package/dist/ast/nodes/expr/PebbleExpr.d.ts +2 -1
  98. package/dist/ast/nodes/expr/PropAccessExpr.d.ts +3 -3
  99. package/dist/ast/nodes/expr/TernaryExpr.d.ts +3 -3
  100. package/dist/ast/nodes/expr/TypeConversionExpr.d.ts +2 -1
  101. package/dist/ast/nodes/expr/TypeConversionExpr.js +2 -0
  102. package/dist/ast/nodes/expr/binary/BinaryExpr.d.ts +42 -42
  103. package/dist/ast/nodes/expr/functions/CallExpr.d.ts +1 -1
  104. package/dist/ast/nodes/expr/functions/FuncExpr.d.ts +2 -1
  105. package/dist/ast/nodes/expr/functions/FuncExpr.js +6 -0
  106. package/dist/ast/nodes/expr/litteral/LitContextExpr.d.ts +6 -0
  107. package/dist/ast/nodes/expr/litteral/LitContextExpr.js +6 -0
  108. package/dist/ast/nodes/expr/litteral/LitFailExpr.d.ts +6 -0
  109. package/dist/ast/nodes/expr/litteral/LitFailExpr.js +6 -0
  110. package/dist/ast/nodes/expr/litteral/LitteralExpr.d.ts +3 -1
  111. package/dist/ast/nodes/expr/litteral/LitteralExpr.js +5 -1
  112. package/dist/ast/nodes/statements/AssertStmt.d.ts +2 -2
  113. package/dist/ast/nodes/statements/AssignmentStmt.d.ts +1 -1
  114. package/dist/ast/nodes/statements/BlockStmt.d.ts +1 -1
  115. package/dist/ast/nodes/statements/FailStmt.d.ts +1 -1
  116. package/dist/ast/nodes/statements/ForOfStmt.d.ts +4 -2
  117. package/dist/ast/nodes/statements/ForOfStmt.js +6 -0
  118. package/dist/ast/nodes/statements/ForStmt.d.ts +6 -4
  119. package/dist/ast/nodes/statements/ForStmt.js +6 -0
  120. package/dist/ast/nodes/statements/IfStmt.d.ts +8 -5
  121. package/dist/ast/nodes/statements/IfStmt.js +13 -0
  122. package/dist/ast/nodes/statements/MatchStmt.d.ts +13 -4
  123. package/dist/ast/nodes/statements/MatchStmt.js +22 -1
  124. package/dist/ast/nodes/statements/PebbleStmt.d.ts +2 -1
  125. package/dist/ast/nodes/statements/PebbleStmt.js +3 -1
  126. package/dist/ast/nodes/statements/ReturnStmt.d.ts +1 -1
  127. package/dist/ast/nodes/statements/WhileStmt.d.ts +4 -2
  128. package/dist/ast/nodes/statements/WhileStmt.js +6 -0
  129. package/dist/ast/nodes/statements/declarations/ContractDecl.d.ts +17 -0
  130. package/dist/ast/nodes/statements/declarations/ContractDecl.js +22 -0
  131. package/dist/ast/nodes/statements/declarations/VarDecl/ArrayLikeDeconstr.d.ts +1 -1
  132. package/dist/ast/nodes/statements/declarations/VarDecl/HasInit.d.ts +1 -1
  133. package/dist/ast/nodes/statements/declarations/VarDecl/NamedDeconstructVarDecl.d.ts +1 -1
  134. package/dist/ast/nodes/statements/declarations/VarDecl/SimpleVarDecl.d.ts +2 -1
  135. package/dist/ast/nodes/statements/declarations/VarDecl/SimpleVarDecl.js +6 -0
  136. package/dist/ast/nodes/statements/declarations/VarDecl/SingleDeconstructVarDecl.d.ts +1 -1
  137. package/dist/compiler/AstCompiler/AstCompiler.d.ts +6 -2
  138. package/dist/compiler/AstCompiler/AstCompiler.js +91 -24
  139. package/dist/compiler/AstCompiler/internal/_deriveContractBody/_deriveContractBody.d.ts +10 -0
  140. package/dist/compiler/AstCompiler/internal/_deriveContractBody/_deriveContractBody.js +777 -0
  141. package/dist/compiler/AstCompiler/internal/exprs/_compileBinaryExpr.js +1 -1
  142. package/dist/compiler/AstCompiler/internal/exprs/_compileExpr.js +1 -1
  143. package/dist/compiler/AstCompiler/internal/exprs/_compileLitteralExpr.js +8 -2
  144. package/dist/compiler/AstCompiler/internal/exprs/_compilePropAccessExpr.js +1 -1
  145. package/dist/compiler/AstCompiler/internal/exprs/_compileTypeConversionExpr.js +3 -1
  146. package/dist/compiler/AstCompiler/internal/exprs/_compileUnaryPrefixExpr.js +1 -1
  147. package/dist/compiler/AstCompiler/internal/statements/_compileAssignmentStmt.js +2 -2
  148. package/dist/compiler/AstCompiler/internal/statements/_compileMatchStmt.d.ts +2 -2
  149. package/dist/compiler/AstCompiler/internal/statements/_compileMatchStmt.js +48 -24
  150. package/dist/compiler/AstCompiler/internal/statements/_compileStatement.js +4 -1
  151. package/dist/compiler/AstCompiler/internal/statements/_compileVarStmt.js +2 -2
  152. package/dist/compiler/AstCompiler/internal/types/_compileDataEncodedConcreteType.js +1 -1
  153. package/dist/compiler/AstCompiler/internal/types/_compileSopEncodedConcreteType.js +4 -1
  154. package/dist/compiler/AstCompiler/scope/AstScope.js +4 -3
  155. package/dist/compiler/AstCompiler/utils/getPropAccessReturnType.js +6 -4
  156. package/dist/compiler/Compiler.js +3 -1
  157. package/dist/compiler/TirCompiler/compileTirProgram.js +3 -1
  158. package/dist/compiler/TirCompiler/expressify/ExpressifyCtx.d.ts +13 -3
  159. package/dist/compiler/TirCompiler/expressify/ExpressifyCtx.js +41 -37
  160. package/dist/compiler/TirCompiler/expressify/determineReassignedVariablesAndReturn.js +11 -2
  161. package/dist/compiler/TirCompiler/expressify/expressify.d.ts +2 -1
  162. package/dist/compiler/TirCompiler/expressify/expressify.js +82 -36
  163. package/dist/compiler/TirCompiler/expressify/expressifyForStmt.d.ts +2 -1
  164. package/dist/compiler/TirCompiler/expressify/expressifyForStmt.js +57 -8
  165. package/dist/compiler/TirCompiler/expressify/expressifyIfBranch.js +1 -1
  166. package/dist/compiler/TirCompiler/expressify/expressifyVarAssignmentStmt.js +1 -1
  167. package/dist/compiler/TirCompiler/expressify/expressifyVarDecl.js +1 -0
  168. package/dist/compiler/TirCompiler/expressify/expressifyVars.js +131 -9
  169. package/dist/compiler/TirCompiler/internal/_compileHoistedDeps.js +3 -1
  170. package/dist/compiler/io/IOutputStream.d.ts +1 -0
  171. package/dist/compiler/io/IOutputStream.js +18 -3
  172. package/dist/compiler/path/getAbsolutePath.js +4 -6
  173. package/dist/compiler/tir/expressions/ITirExpr.d.ts +2 -0
  174. package/dist/compiler/tir/expressions/TirAssertAndContinueExpr.d.ts +4 -2
  175. package/dist/compiler/tir/expressions/TirAssertAndContinueExpr.js +16 -2
  176. package/dist/compiler/tir/expressions/TirCallExpr.d.ts +3 -1
  177. package/dist/compiler/tir/expressions/TirCallExpr.js +16 -1
  178. package/dist/compiler/tir/expressions/TirCaseExpr.d.ts +6 -1
  179. package/dist/compiler/tir/expressions/TirCaseExpr.js +103 -60
  180. package/dist/compiler/tir/expressions/TirElemAccessExpr.d.ts +3 -1
  181. package/dist/compiler/tir/expressions/TirElemAccessExpr.js +9 -1
  182. package/dist/compiler/tir/expressions/TirFailExpr.d.ts +3 -1
  183. package/dist/compiler/tir/expressions/TirFailExpr.js +9 -1
  184. package/dist/compiler/tir/expressions/TirFromDataExpr.d.ts +3 -2
  185. package/dist/compiler/tir/expressions/TirFromDataExpr.js +85 -56
  186. package/dist/compiler/tir/expressions/TirFuncExpr.d.ts +4 -10
  187. package/dist/compiler/tir/expressions/TirFuncExpr.js +30 -13
  188. package/dist/compiler/tir/expressions/TirHoistedExpr.d.ts +3 -1
  189. package/dist/compiler/tir/expressions/TirHoistedExpr.js +8 -0
  190. package/dist/compiler/tir/expressions/TirInlineClosedIR.d.ts +4 -1
  191. package/dist/compiler/tir/expressions/TirInlineClosedIR.js +8 -0
  192. package/dist/compiler/tir/expressions/TirLettedExpr.d.ts +5 -2
  193. package/dist/compiler/tir/expressions/TirLettedExpr.js +19 -4
  194. package/dist/compiler/tir/expressions/TirNativeFunc.d.ts +8 -5
  195. package/dist/compiler/tir/expressions/TirNativeFunc.js +50 -22
  196. package/dist/compiler/tir/expressions/TirParentesizedExpr.d.ts +3 -1
  197. package/dist/compiler/tir/expressions/TirParentesizedExpr.js +6 -0
  198. package/dist/compiler/tir/expressions/TirPropAccessExpr.d.ts +3 -1
  199. package/dist/compiler/tir/expressions/TirPropAccessExpr.js +9 -0
  200. package/dist/compiler/tir/expressions/TirTernaryExpr.d.ts +3 -1
  201. package/dist/compiler/tir/expressions/TirTernaryExpr.js +16 -5
  202. package/dist/compiler/tir/expressions/TirToDataExpr.d.ts +3 -1
  203. package/dist/compiler/tir/expressions/TirToDataExpr.js +56 -25
  204. package/dist/compiler/tir/expressions/TirTraceIfFalseExpr.d.ts +3 -1
  205. package/dist/compiler/tir/expressions/TirTraceIfFalseExpr.js +21 -4
  206. package/dist/compiler/tir/expressions/TirTypeConversionExpr.d.ts +3 -1
  207. package/dist/compiler/tir/expressions/TirTypeConversionExpr.js +9 -1
  208. package/dist/compiler/tir/expressions/TirVariableAccessExpr.d.ts +7 -3
  209. package/dist/compiler/tir/expressions/TirVariableAccessExpr.js +17 -7
  210. package/dist/compiler/tir/expressions/ToIRTermCtx.d.ts +16 -20
  211. package/dist/compiler/tir/expressions/ToIRTermCtx.js +67 -50
  212. package/dist/compiler/tir/expressions/binary/TirBinaryExpr.d.ts +40 -0
  213. package/dist/compiler/tir/expressions/binary/TirBinaryExpr.js +174 -3
  214. package/dist/compiler/tir/expressions/litteral/TirLitArrExpr.d.ts +4 -2
  215. package/dist/compiler/tir/expressions/litteral/TirLitArrExpr.js +8 -2
  216. package/dist/compiler/tir/expressions/litteral/TirLitFailExpr.d.ts +17 -0
  217. package/dist/compiler/tir/expressions/litteral/TirLitFailExpr.js +21 -0
  218. package/dist/compiler/tir/expressions/litteral/TirLitFalseExpr.d.ts +4 -1
  219. package/dist/compiler/tir/expressions/litteral/TirLitFalseExpr.js +4 -0
  220. package/dist/compiler/tir/expressions/litteral/TirLitHexBytesExpr.d.ts +4 -1
  221. package/dist/compiler/tir/expressions/litteral/TirLitHexBytesExpr.js +5 -0
  222. package/dist/compiler/tir/expressions/litteral/TirLitIntExpr.d.ts +4 -1
  223. package/dist/compiler/tir/expressions/litteral/TirLitIntExpr.js +4 -0
  224. package/dist/compiler/tir/expressions/litteral/TirLitNamedObjExpr.d.ts +3 -1
  225. package/dist/compiler/tir/expressions/litteral/TirLitNamedObjExpr.js +5 -0
  226. package/dist/compiler/tir/expressions/litteral/TirLitObjExpr.d.ts +3 -1
  227. package/dist/compiler/tir/expressions/litteral/TirLitObjExpr.js +5 -0
  228. package/dist/compiler/tir/expressions/litteral/TirLitStrExpr.d.ts +4 -1
  229. package/dist/compiler/tir/expressions/litteral/TirLitStrExpr.js +4 -0
  230. package/dist/compiler/tir/expressions/litteral/TirLitThisExpr.d.ts +4 -1
  231. package/dist/compiler/tir/expressions/litteral/TirLitThisExpr.js +7 -3
  232. package/dist/compiler/tir/expressions/litteral/TirLitTrueExpr.d.ts +4 -1
  233. package/dist/compiler/tir/expressions/litteral/TirLitTrueExpr.js +4 -0
  234. package/dist/compiler/tir/expressions/litteral/TirLitUndefExpr.d.ts +4 -1
  235. package/dist/compiler/tir/expressions/litteral/TirLitUndefExpr.js +4 -0
  236. package/dist/compiler/tir/expressions/litteral/TirLitVoidExpr.d.ts +4 -1
  237. package/dist/compiler/tir/expressions/litteral/TirLitVoidExpr.js +4 -0
  238. package/dist/compiler/tir/expressions/litteral/TirLitteralExpr.d.ts +2 -1
  239. package/dist/compiler/tir/expressions/litteral/TirLitteralExpr.js +3 -1
  240. package/dist/compiler/tir/expressions/unary/TirUnaryExclamation.d.ts +4 -2
  241. package/dist/compiler/tir/expressions/unary/TirUnaryExclamation.js +8 -3
  242. package/dist/compiler/tir/expressions/unary/TirUnaryMinus.d.ts +4 -2
  243. package/dist/compiler/tir/expressions/unary/TirUnaryMinus.js +8 -2
  244. package/dist/compiler/tir/expressions/unary/TirUnaryPlus.d.ts +3 -1
  245. package/dist/compiler/tir/expressions/unary/TirUnaryPlus.js +6 -0
  246. package/dist/compiler/tir/expressions/unary/TirUnaryTilde.d.ts +4 -2
  247. package/dist/compiler/tir/expressions/unary/TirUnaryTilde.js +8 -2
  248. package/dist/compiler/tir/program/TypedProgram.d.ts +1 -0
  249. package/dist/compiler/tir/program/TypedProgram.js +9 -0
  250. package/dist/compiler/tir/program/stdScope/stdScope.js +126 -126
  251. package/dist/compiler/tir/statements/TirAssertStmt.d.ts +2 -0
  252. package/dist/compiler/tir/statements/TirAssertStmt.js +10 -0
  253. package/dist/compiler/tir/statements/TirAssignmentStmt.d.ts +2 -0
  254. package/dist/compiler/tir/statements/TirAssignmentStmt.js +8 -0
  255. package/dist/compiler/tir/statements/TirBlockStmt.d.ts +2 -0
  256. package/dist/compiler/tir/statements/TirBlockStmt.js +16 -0
  257. package/dist/compiler/tir/statements/TirBreakStmt.d.ts +2 -0
  258. package/dist/compiler/tir/statements/TirBreakStmt.js +8 -0
  259. package/dist/compiler/tir/statements/TirContinueStmt.d.ts +2 -0
  260. package/dist/compiler/tir/statements/TirContinueStmt.js +8 -0
  261. package/dist/compiler/tir/statements/TirFailStmt.d.ts +2 -0
  262. package/dist/compiler/tir/statements/TirFailStmt.js +8 -0
  263. package/dist/compiler/tir/statements/TirForOfStmt.d.ts +2 -0
  264. package/dist/compiler/tir/statements/TirForOfStmt.js +14 -0
  265. package/dist/compiler/tir/statements/TirForStmt.d.ts +2 -0
  266. package/dist/compiler/tir/statements/TirForStmt.js +21 -0
  267. package/dist/compiler/tir/statements/TirIfStmt.d.ts +3 -0
  268. package/dist/compiler/tir/statements/TirIfStmt.js +19 -0
  269. package/dist/compiler/tir/statements/TirMatchStmt.d.ts +2 -0
  270. package/dist/compiler/tir/statements/TirMatchStmt.js +30 -0
  271. package/dist/compiler/tir/statements/TirReturnStmt.d.ts +2 -0
  272. package/dist/compiler/tir/statements/TirReturnStmt.js +8 -0
  273. package/dist/compiler/tir/statements/TirStmt.d.ts +2 -0
  274. package/dist/compiler/tir/statements/TirVarDecl/TirArrayLikeDeconstr.d.ts +2 -0
  275. package/dist/compiler/tir/statements/TirVarDecl/TirArrayLikeDeconstr.js +30 -0
  276. package/dist/compiler/tir/statements/TirVarDecl/TirNamedDeconstructVarDecl.d.ts +3 -1
  277. package/dist/compiler/tir/statements/TirVarDecl/TirNamedDeconstructVarDecl.js +28 -0
  278. package/dist/compiler/tir/statements/TirVarDecl/TirSimpleVarDecl.d.ts +3 -0
  279. package/dist/compiler/tir/statements/TirVarDecl/TirSimpleVarDecl.js +13 -0
  280. package/dist/compiler/tir/statements/TirVarDecl/TirSingleDeconstructVarDecl.d.ts +3 -1
  281. package/dist/compiler/tir/statements/TirVarDecl/TirSingleDeconstructVarDecl.js +28 -0
  282. package/dist/compiler/tir/statements/TirWhileStmt.d.ts +2 -0
  283. package/dist/compiler/tir/statements/TirWhileStmt.js +14 -0
  284. package/dist/compiler/tir/types/utils/canAssignTo.js +1 -1
  285. package/dist/diagnostics/DiagnosticEmitter.js +1 -1
  286. package/dist/diagnostics/diagnosticMessages.generated.d.ts +10 -1
  287. package/dist/diagnostics/diagnosticMessages.generated.js +20 -2
  288. package/dist/parser/Parser.d.ts +8 -3
  289. package/dist/parser/Parser.js +162 -30
  290. package/dist/tokenizer/Token.d.ts +81 -72
  291. package/dist/tokenizer/Token.js +82 -72
  292. package/dist/tokenizer/utils/tokenFromKeyword.js +32 -10
  293. package/dist/tokenizer/utils/tokenIsAlsoIdentifier.js +10 -0
  294. package/dist/utils/BitUtils/index.js +1 -1
  295. package/dist/utils/UPLCFlatUtils/index.js +1 -1
  296. package/package.json +2 -1
  297. package/dist/IR/IRNodes/utils/isClosedAtDbn.d.ts +0 -2
  298. package/dist/IR/IRNodes/utils/isClosedAtDbn.js +0 -22
  299. package/dist/IR/toUPLC/_internal/_irToUplc.d.ts +0 -9
  300. package/dist/IR/toUPLC/_internal/_irToUplc.js +0 -156
  301. package/dist/IR/toUPLC/subRoutines/handleLetted/incrementUnboundDbns.d.ts +0 -9
  302. package/dist/IR/toUPLC/subRoutines/handleLetted/incrementUnboundDbns.js +0 -73
  303. package/dist/IR/toUPLC/subRoutines/inlineSingleUseApplications.d.ts +0 -1
  304. package/dist/IR/toUPLC/subRoutines/inlineSingleUseApplications.js +0 -12
  305. package/dist/IR/toUPLC/subRoutines/performUplcOptimizationsAndReturnRoot/index.js +0 -227
  306. package/dist/IR/tree_utils/_ir_apps.d.ts +0 -3
  307. package/dist/IR/tree_utils/_ir_apps.js +0 -8
@@ -4,23 +4,19 @@ import { getSortedLettedSet, getLettedTerms, IRLetted } from "../../../IRNodes/I
4
4
  import { IRVar } from "../../../IRNodes/IRVar.js";
5
5
  import { _modifyChildFromTo } from "../../_internal/_modifyChildFromTo.js";
6
6
  import { findAllNoHoisted } from "../../_internal/findAll.js";
7
- import { getDebruijnInTerm } from "../../_internal/getDebruijnInTerm.js";
8
- import { _getMinUnboundDbn } from "./groupByScope.js";
7
+ import { getMaxScope } from "./groupByScope.js";
9
8
  import { IRDelayed } from "../../../IRNodes/IRDelayed.js";
10
- import { IRForced } from "../../../IRNodes/IRForced.js";
11
9
  import { lowestCommonAncestor } from "../../_internal/lowestCommonAncestor.js";
12
10
  import { isIRTerm } from "../../../utils/isIRTerm.js";
13
11
  import { markRecursiveHoistsAsForced } from "../markRecursiveHoistsAsForced.js";
14
12
  import { IRConst } from "../../../IRNodes/IRConst.js";
15
- import { incrementUnboundDbns } from "./incrementUnboundDbns.js";
16
13
  import { equalIrHash, irHashToHex } from "../../../IRHash.js";
17
14
  import { sanifyTree } from "../sanifyTree.js";
18
- import { mapArrayLike } from "../../../IRNodes/utils/mapArrayLike.js";
19
- import { IRCase } from "../../../IRNodes/IRCase.js";
20
- import { IRConstr } from "../../../IRNodes/IRConstr.js";
21
15
  import { IRRecursive } from "../../../IRNodes/IRRecursive.js";
22
16
  import { IRSelfCall } from "../../../IRNodes/IRSelfCall.js";
23
17
  import { findHighestRecursiveParent } from "./findHighestRecursiveParent.js";
18
+ import { IRNative } from "../../../IRNodes/IRNative/index.js";
19
+ import { isForcedNativeTag } from "../../../IRNodes/IRNative/isForcedNative.js";
24
20
  export function handleLettedAndReturnRoot(term) {
25
21
  // console.log(" ------------------------------------------- handleLetted ------------------------------------------- ");
26
22
  // console.log( prettyIRText( term ))
@@ -28,52 +24,60 @@ export function handleLettedAndReturnRoot(term) {
28
24
  // pre-execuded terms (hence constants)
29
25
  if (term instanceof IRConst)
30
26
  return term;
27
+ sanifyTree(term);
31
28
  // TODO: should probably merge `markRecursiveHoistsAsForced` inside `getLettedTerms` to iter once
32
29
  markRecursiveHoistsAsForced(term);
33
30
  // in case there are no letted terms there is no work to do
34
31
  while (true) {
32
+ // console.log(` ------------------ letted loop ------------------ `);
35
33
  const allDirectLetted = getLettedTerms(term, { all: false, includeHoisted: false });
36
34
  if (allDirectLetted.length === 0)
37
35
  return term;
36
+ // // console.log("allDirectLetted", allDirectLetted.map( expandedJsonLettedSetEntry ) );
38
37
  const sortedLettedSet = getSortedLettedSet(allDirectLetted);
38
+ // console.log("sortedLettedSet", sortedLettedSet.map( expandedJsonLettedSetEntry ) );
39
+ // `sortedLettedSet` is sorted from least to most dependencies
40
+ // so we'll have "0 dependencies" letted terms at the start of the array
41
+ // and "n dependencies" letted terms at the end of the array
42
+ //
43
+ // we process the "most dependent" terms first
44
+ // so their values are inlined
45
+ // and later, its dependencies will be replaced with `IRVar`
46
+ // whereever these dependent are inlined
47
+ //
48
+ // hence why `pop` (and not `shift`)
39
49
  const { letted, nReferences } = sortedLettedSet.pop();
40
- /*
41
- const _lettedValue_ = letted.value;
42
- const shouldLog = (
43
- _lettedValue_ instanceof IRApp &&
44
- _lettedValue_.fn instanceof IRFunc &&
45
- _lettedValue_.fn.arity === 1 &&
46
- _lettedValue_.fn.body instanceof IRLetted &&
47
- equalIrHash( _lettedValue_.fn.body.hash, new Uint32Array( fromHex("71030a2d7560e563fe25fd782edd847f").buffer ) as IRHash ) &&
48
- _lettedValue_.arg instanceof IRLetted &&
49
- equalIrHash( _lettedValue_.arg.hash, new Uint32Array( fromHex("82dfb8a2f2703fe59fb25f8372e5e958").buffer ) as IRHash )
50
- );
51
- //*/
52
- // shouldLog && console.log("nReferences", nReferences);
50
+ // shouldLog && // console.log("nReferences", nReferences);
53
51
  // console.log(` ------------------ working with ${lettedToStr(letted)} ------------------ `);
54
52
  if (nReferences === 1) {
55
53
  // console.log("inlining letted (single reference) with value", prettyIRText( letted.value ) )
56
54
  _modifyChildFromTo(letted.parent, letted, letted.value);
57
55
  continue;
58
56
  }
59
- const maxScope = findLettedMaxScope(letted) ?? (() => {
60
- if (letted.meta.isClosed || letted.isClosedAtDbn(0)) {
61
- // value is closed (hoisted),
62
- // so the max scope is the entire script
63
- return term;
64
- }
65
- else
66
- throw new Error(`could not find a max scope for letted value with hash ${irHashToHex(letted.hash)}`);
67
- })();
57
+ // console.log("--------- not inilning ("+ nReferences +" references)");
58
+ const maxScope = getMaxScope(letted) ?? term;
59
+ // const maxScope = getMaxScope( letted ) ?? ((): IRTerm => {
60
+ // if( letted.meta.isClosed || isClosedTerm( letted.value ) )
61
+ // {
62
+ // // value is closed (hoisted),
63
+ // // so the max scope is the entire script
64
+ // return term;
65
+ // }
66
+ // else throw new Error(
67
+ // `could not find a max scope for letted value with hash ${irHashToHex(letted.hash)}`
68
+ // );
69
+ // })();
68
70
  const lettedTermCanBeHoisted = maxScope === term;
69
71
  const minScope = findHighestRecursiveParent(letted, maxScope);
70
72
  sanifyTree(maxScope);
71
73
  const lettedHash = letted.hash;
72
74
  const sameLettedRefs = findAllNoHoisted(maxScope, node => node instanceof IRLetted &&
73
75
  equalIrHash(node.hash, lettedHash));
76
+ // console.log("sameLettedRefs", sameLettedRefs.length );
74
77
  if (sameLettedRefs.length <= 0) {
75
- console.warn("how did you get here? 0 references found for letted term;\n\n" +
76
- "!!! PLEASE OPEN AN ISSUE ON GITHUB (https://github.com/HarmonicLabs/plu-ts/issues) !!!\n\n");
78
+ console.warn("how did you get here? 0 references found for letted term;\n" +
79
+ "the compiler can easly recover this edge case, but something funny is going on with this contract.\n\n" +
80
+ "!!! PLEASE OPEN AN ISSUE ON GITHUB (https://github.com/HarmonicLabs/plu-ts/issues) !!!\n");
77
81
  continue;
78
82
  }
79
83
  // just in case
@@ -83,8 +87,10 @@ export function handleLettedAndReturnRoot(term) {
83
87
  continue;
84
88
  }
85
89
  // always inline letted vars
86
- if (letted.value instanceof IRVar ||
87
- letted.value instanceof IRSelfCall) {
90
+ if (letted.value instanceof IRVar
91
+ || letted.value instanceof IRSelfCall
92
+ || (letted.value instanceof IRNative
93
+ && !isForcedNativeTag(letted.value.tag))) {
88
94
  // console.log("inlining letted (value is var) with value", prettyIRText( letted.value ) )
89
95
  for (const elem of sameLettedRefs) {
90
96
  // inline
@@ -126,25 +132,16 @@ export function handleLettedAndReturnRoot(term) {
126
132
  const parentNode = lca;
127
133
  const parentNodeDirectChild = (parentNode instanceof IRFunc ||
128
134
  parentNode instanceof IRRecursive) ? parentNode.body : parentNode.delayed;
129
- // add 1 to every var's DeBruijn that accesses stuff outside the parent node
130
- // not including the `parentNode` node
131
- // since the new function introdcued substituting the letted term
132
- // is added inside the `parentNode` node
133
- incrementUnboundDbns(parentNodeDirectChild,
134
- // `shouldNotModifyLetted` arg (given the hash returns `true` if it should NOT modify the term)
135
- // this callback is ONLY called on LETTED terms
136
- ({ hash }) => equalIrHash(hash, lettedHash));
137
135
  // now we replace
138
136
  const lettedValue = letted.value.clone();
139
- modifyValueToLetDbns(lettedValue, getDiffDbn(letted, parentNode));
140
- const newNode = new IRApp(new IRFunc(1, parentNodeDirectChild), lettedValue, { __src__: letted.meta.__src__ });
137
+ const newNode = new IRApp(new IRFunc([letted.name], parentNodeDirectChild), lettedValue, { __src__: letted.meta.__src__ });
141
138
  // replace child with new node
142
139
  if (parentNode instanceof IRFunc || parentNode instanceof IRRecursive)
143
140
  parentNode.body = newNode;
144
141
  else
145
142
  parentNode.delayed = newNode;
146
143
  for (const ref of sameLettedRefs) {
147
- _modifyChildFromTo(ref.parent, ref, new IRVar(getDebruijnInTerm(parentNodeDirectChild, ref)));
144
+ _modifyChildFromTo(ref.parent, ref, new IRVar(ref.name));
148
145
  }
149
146
  // const delayed = parentNode instanceof IRDelayed;
150
147
  // let finalMaxScope: IRFunc | IRDelayed = parentNode;
@@ -155,141 +152,18 @@ export function handleLettedAndReturnRoot(term) {
155
152
  // {
156
153
  // finalMaxScope = (finalMaxScope as any).parent as any
157
154
  // }
158
- // console.log("final max scope (delayed: " + delayed + ")" , prettyIRText( finalMaxScope ) )
159
- }
160
- }
161
- /**
162
- *
163
- * @param letted
164
- * @returns {IRFunc} the lowest `IRFunc` in the tree that defines all the variables needed for the
165
- */
166
- function findLettedMaxScope(letted) {
167
- let minUnboundDbn = _getMinUnboundDbn(letted.value);
168
- if (minUnboundDbn === undefined) {
169
- let tmp = letted;
170
- let maxScope = undefined;
171
- while (tmp.parent) {
172
- tmp = tmp.parent;
173
- if (tmp instanceof IRFunc || tmp instanceof IRDelayed)
174
- maxScope = tmp;
175
- }
176
- ;
177
- return maxScope;
178
- }
179
- let tmp = letted;
180
- let maxScope = undefined;
181
- while (minUnboundDbn >= 0) {
182
- if (!tmp.parent) {
183
- throw new Error(`could not find a max scope for letted value with hash ${irHashToHex(letted.hash)}; ` +
184
- `the max parent found leaves the term open (reached root)`);
185
- }
186
- tmp = tmp.parent;
187
- if (tmp instanceof IRRecursive) {
188
- minUnboundDbn -= tmp.arity;
189
- // maxScope = tmp; // recursive cannot be a max scope
190
- }
191
- else if (tmp instanceof IRFunc) {
192
- minUnboundDbn -= tmp.arity;
193
- maxScope = tmp;
194
- }
195
- }
196
- // just ts sillyness here
197
- if (!maxScope) {
198
- throw new Error(`could not find a max scope for letted value with hash ${irHashToHex(letted.hash)}; ` +
199
- `no IRFunc found`);
200
- }
201
- return maxScope;
202
- }
203
- function modifyValueToLetDbns(lettedValue, diffDbn) {
204
- if (diffDbn <= 0)
205
- return;
206
- // if there is any actual difference between the letted term
207
- // and the position where it will be finally placed
208
- // the value needs to be modified accoridingly
209
- const stack = [{ term: lettedValue, dbn: 0 }];
210
- while (stack.length > 0) {
211
- const { term: t, dbn } = stack.pop();
212
- if ((t instanceof IRVar ||
213
- t instanceof IRSelfCall) &&
214
- t.dbn > dbn) {
215
- t.dbn -= diffDbn;
216
- }
217
- if (t instanceof IRLetted) {
218
- t.dbn -= diffDbn;
219
- // reduce dbn in letted value too
220
- stack.push({ term: t.value, dbn });
221
- continue;
222
- }
223
- if (t instanceof IRApp) {
224
- stack.push({ term: t.arg, dbn }, { term: t.fn, dbn });
225
- continue;
226
- }
227
- if (t instanceof IRCase) {
228
- stack.push({ term: t.constrTerm, dbn }, ...mapArrayLike(t.continuations, continuation => ({ term: continuation, dbn })));
229
- continue;
230
- }
231
- if (t instanceof IRConstr) {
232
- stack.push(...mapArrayLike(t.fields, field => ({ term: field, dbn })));
233
- continue;
234
- }
235
- if (t instanceof IRDelayed) {
236
- stack.push({ term: t.delayed, dbn });
237
- continue;
238
- }
239
- if (t instanceof IRForced) {
240
- stack.push({ term: t.forced, dbn });
241
- continue;
242
- }
243
- if (t instanceof IRFunc) {
244
- stack.push({ term: t.body, dbn: dbn + t.arity });
245
- continue;
246
- }
247
- if (t instanceof IRRecursive) {
248
- stack.push({ term: t.body, dbn: dbn + t.arity });
249
- continue;
250
- }
251
- // no hoisted
252
- }
253
- }
254
- /**
255
- * @returns the difference in DeBruijn
256
- * between the maxScope and the letted term
257
- */
258
- function getDiffDbn(letted, parentNode) {
259
- // get the difference in DeBruijn
260
- // between the maxScope and the letted term
261
- let diffDbn = 0;
262
- //*
263
- let tmpNode = letted;
264
- while (tmpNode !== parentNode) {
265
- tmpNode = tmpNode.parent;
266
- if ( // is an intermediate `IRFunc`
267
- (tmpNode instanceof IRFunc ||
268
- tmpNode instanceof IRRecursive) &&
269
- tmpNode !== parentNode // avoid counting parent node arity if IRFunc
270
- ) {
271
- // increment differential in DeBruijn by n vars indroduced here
272
- diffDbn += tmpNode.arity;
273
- }
155
+ // // // console.log("final max scope (delayed: " + delayed + ")" , prettyIRText( finalMaxScope ) )
274
156
  }
275
- return diffDbn;
276
157
  }
277
158
  function handleLettedAsHoistedAndReturnRoot(letted, lca, sameLettedRefs, currentRoot) {
278
159
  const lettedHash = letted.hash;
279
160
  let parentNode = lca.parent;
280
161
  const parentNodeDirectChild = lca;
281
- // add 1 to every var's DeBruijn that accesses stuff outside the parent node
282
- // not including the `parentNode` node
283
- // since the new function introdcued substituting the letted term
284
- // is added inside the `parentNode` node
285
- incrementUnboundDbns(parentNodeDirectChild,
286
- // `shouldNotModifyLetted` arg (given the hash returns `true` if it should NOT modify the term)
287
- ({ hash }) => equalIrHash(hash, lettedHash));
288
162
  // now we replace
289
163
  const lettedValue = letted.value; //.clone();
290
164
  // no need to modify letted value dbns, since closed
291
165
  // modifyValueToLetDbns( lettedValue, getDiffDbn( letted, parentNode ) );
292
- const newNode = new IRApp(new IRFunc(1, parentNodeDirectChild), lettedValue, { __src__: letted.meta.__src__ });
166
+ const newNode = new IRApp(new IRFunc([letted.name], parentNodeDirectChild), lettedValue, { __src__: letted.meta.__src__ });
293
167
  // replace child with new node
294
168
  if (parentNode) {
295
169
  _modifyChildFromTo(parentNode, parentNodeDirectChild, newNode);
@@ -298,7 +172,7 @@ function handleLettedAsHoistedAndReturnRoot(letted, lca, sameLettedRefs, current
298
172
  currentRoot = newNode;
299
173
  }
300
174
  for (const ref of sameLettedRefs) {
301
- _modifyChildFromTo(ref.parent, ref, new IRVar(getDebruijnInTerm(parentNodeDirectChild, ref)));
175
+ _modifyChildFromTo(ref.parent, ref, new IRVar(ref.name));
302
176
  }
303
177
  return currentRoot;
304
178
  }
@@ -9,12 +9,14 @@ import { _modifyChildFromTo } from "../_internal/_modifyChildFromTo.js";
9
9
  export function handleRecursiveTerms(term) {
10
10
  if (term instanceof IRRecursive) {
11
11
  const bodyPtr = term.body;
12
- _modifyChildFromTo(term.parent, term, new IRApp(new IRHoisted(new IRFunc(1, new IRApp(new IRVar(0), new IRVar(0)))), new IRFunc(1, bodyPtr)));
12
+ const recBody = Symbol("recBody");
13
+ const self = term.name;
14
+ _modifyChildFromTo(term.parent, term, new IRApp(new IRHoisted(new IRFunc([recBody], new IRApp(new IRVar(recBody), new IRVar(recBody)))), new IRFunc([self], bodyPtr)));
13
15
  handleRecursiveTerms(bodyPtr);
14
16
  return;
15
17
  }
16
18
  if (term instanceof IRSelfCall) {
17
- _modifyChildFromTo(term.parent, term, new IRApp(new IRVar(term.dbn), new IRVar(term.dbn)));
19
+ _modifyChildFromTo(term.parent, term, new IRApp(new IRVar(term.name), new IRVar(term.name)));
18
20
  return;
19
21
  }
20
22
  getChildren(term).forEach(handleRecursiveTerms);
@@ -22,7 +24,9 @@ export function handleRecursiveTerms(term) {
22
24
  export function handleRootRecursiveTerm(term) {
23
25
  if (term instanceof IRRecursive) {
24
26
  const bodyPtr = term.body;
25
- const newRoot = new IRApp(new IRHoisted(new IRFunc(1, new IRApp(new IRVar(0), new IRVar(0)))), new IRFunc(1, bodyPtr));
27
+ const recBody = Symbol("recBody");
28
+ const self = term.name;
29
+ const newRoot = new IRApp(new IRHoisted(new IRFunc([recBody], new IRApp(new IRVar(recBody), new IRVar(recBody)))), new IRFunc([self], bodyPtr));
26
30
  handleRecursiveTerms(bodyPtr);
27
31
  return newRoot;
28
32
  }
@@ -38,10 +38,11 @@ export function hoistForcedNatives(term) {
38
38
  const nodes = toHoist[tag];
39
39
  if (nodes.length <= 0)
40
40
  continue; // also single use (might be inside loop)
41
+ const varSym = Symbol(tagStr);
41
42
  for (const node of nodes) {
42
- _modifyChildFromTo(node.parent, node, new IRVar(getDbnToRoot(node)));
43
+ _modifyChildFromTo(node.parent, node, new IRVar(varSym));
43
44
  }
44
- term = new IRApp(new IRFunc(1, term), new IRNative(tag));
45
+ term = new IRApp(new IRFunc([varSym], term), new IRNative(tag));
45
46
  }
46
47
  return term;
47
48
  }
@@ -0,0 +1,22 @@
1
+ export declare enum InlineSingleUseVarsFlags {
2
+ none = 0,
3
+ isRecursiveFunction = 1
4
+ }
5
+ interface InlineSingleUseCtxMeta {
6
+ readonly isRecursiveContext: boolean;
7
+ }
8
+ export declare class InlineSingleUseCtx {
9
+ readonly params: symbol[];
10
+ readonly parent: InlineSingleUseCtx | undefined;
11
+ readonly localVarsUses: Record<symbol, number>;
12
+ readonly localVarsFlags: Record<symbol, InlineSingleUseVarsFlags>;
13
+ readonly meta: InlineSingleUseCtxMeta;
14
+ constructor(params: symbol[], parent: InlineSingleUseCtx | undefined, meta: InlineSingleUseCtxMeta);
15
+ static root(params?: symbol[]): InlineSingleUseCtx;
16
+ newChild(params: symbol[], meta?: InlineSingleUseCtxMeta): InlineSingleUseCtx;
17
+ private keys;
18
+ private getIncrement;
19
+ incrementVarUse(sym: symbol): void;
20
+ getSingleUseVars(): symbol[];
21
+ }
22
+ export {};
@@ -0,0 +1,59 @@
1
+ export var InlineSingleUseVarsFlags;
2
+ (function (InlineSingleUseVarsFlags) {
3
+ InlineSingleUseVarsFlags[InlineSingleUseVarsFlags["none"] = 0] = "none";
4
+ InlineSingleUseVarsFlags[InlineSingleUseVarsFlags["isRecursiveFunction"] = 1] = "isRecursiveFunction";
5
+ })(InlineSingleUseVarsFlags || (InlineSingleUseVarsFlags = {}));
6
+ const defaultInlineMeta = Object.freeze({
7
+ isRecursiveContext: false
8
+ });
9
+ export class InlineSingleUseCtx {
10
+ params;
11
+ parent;
12
+ localVarsUses;
13
+ localVarsFlags;
14
+ meta;
15
+ constructor(params, parent, meta) {
16
+ this.params = params;
17
+ this.parent = parent;
18
+ params = params.slice();
19
+ this.localVarsUses = {};
20
+ this.localVarsFlags = {};
21
+ for (const p of params) {
22
+ this.localVarsUses[p] = 0;
23
+ this.localVarsFlags[p] = InlineSingleUseVarsFlags.none;
24
+ }
25
+ meta = {
26
+ ...meta,
27
+ isRecursiveContext: parent?.meta.isRecursiveContext ?? defaultInlineMeta.isRecursiveContext
28
+ };
29
+ this.meta = meta;
30
+ }
31
+ static root(params = []) {
32
+ return new InlineSingleUseCtx(params, undefined, defaultInlineMeta);
33
+ }
34
+ newChild(params, meta = defaultInlineMeta) {
35
+ return new InlineSingleUseCtx(params, this, meta);
36
+ }
37
+ keys() {
38
+ return Object.getOwnPropertySymbols(this.localVarsUses);
39
+ }
40
+ getIncrement() {
41
+ return this.meta.isRecursiveContext ? 10 : 1;
42
+ }
43
+ incrementVarUse(sym) {
44
+ if (typeof this.localVarsUses[sym] !== "number") {
45
+ if (this.parent)
46
+ this.parent.incrementVarUse(sym);
47
+ else {
48
+ console.error(sym);
49
+ throw new Error("trying to increment use of variable not in context");
50
+ }
51
+ }
52
+ else
53
+ this.localVarsUses[sym] += this.getIncrement();
54
+ }
55
+ getSingleUseVars() {
56
+ const keys = this.keys();
57
+ return keys.filter(k => this.localVarsUses[k] === 1);
58
+ }
59
+ }
@@ -0,0 +1,217 @@
1
+ /*
2
+ import { IRFunc, IRHoisted, IRLetted } from "../../../IRNodes/index.js";
3
+ import { IRSelfCall } from "../../../IRNodes/IRSelfCall.js";
4
+ import { IRVar } from "../../../IRNodes/IRVar.js";
5
+ import { IRTerm } from "../../../IRTerm.js";
6
+ import { _modifyChildFromTo } from "../../_internal/_modifyChildFromTo.js";
7
+ import { getApplicationTerms } from "../../utils/getApplicationTerms.js";
8
+ import { InlineSingleUseCtx } from "./InlineSingleUseCtx.js";
9
+
10
+ export interface InlineSingleResult {
11
+ term: IRTerm;
12
+ somethingWasInlined: boolean;
13
+ }
14
+
15
+ // DOES NOT WORK AS IS
16
+ // TODO: FIND BUG (use onlySpend contract)
17
+ export function inlineSingleUseAndReturnRoot( term: IRTerm ): InlineSingleResult
18
+ {
19
+ // we need to go bottom up
20
+ // ONLY REMOVE UNUSED VARS IF NOT UNIT
21
+ // (in which case we need to keep it for eventual side effects (asserts and traces))
22
+
23
+ return _inlineSingleUse( term, InlineSingleUseCtx.root( 0 ) );
24
+ }
25
+
26
+ // DOES NOT WORK AS IS
27
+ // TODO: FIND BUG (use onlySpend contract)
28
+ function _inlineSingleUse( term: IRTerm, ctx: InlineSingleUseCtx ): InlineSingleResult
29
+ {
30
+ let somethingWasInlined = false;
31
+
32
+ if( term instanceof IRVar ) {
33
+ // increment used
34
+ ctx.incrementVarUse( term.dbn );
35
+ return { term: term, somethingWasInlined: false };
36
+ }
37
+
38
+ const applicationTerms = getApplicationTerms( term );
39
+
40
+ if( !applicationTerms )
41
+ {
42
+ const childrens = term.children();
43
+ const nextCtx = term instanceof IRFunc
44
+ ? ctx.newChild( term.arity )
45
+ : ctx;
46
+ for( const c of childrens ) {
47
+ const inlineResult = _inlineSingleUse( c, nextCtx );
48
+ somethingWasInlined ||= inlineResult.somethingWasInlined;
49
+ }
50
+ return { term, somethingWasInlined };
51
+ }
52
+
53
+ const { func, args } = applicationTerms;
54
+
55
+ if(!( func instanceof IRFunc )) {
56
+ for( const child of term.children() ) {
57
+ // same as parent ctx
58
+ const inlineResult = _inlineSingleUse( child, ctx );
59
+ somethingWasInlined ||= inlineResult.somethingWasInlined;
60
+ }
61
+ return { term, somethingWasInlined };
62
+ }
63
+
64
+ const funcCtx = ctx.newChild( func.arity );
65
+ const inlineResult = _inlineSingleUse( func.body, funcCtx );
66
+ func.body = inlineResult.term;
67
+ somethingWasInlined ||= inlineResult.somethingWasInlined;
68
+
69
+ // if all variables are either not used at all, or used more than once, keep as is
70
+ if( !funcCtx.localVarsUseCount.some( nUses => nUses === 1 ) )
71
+ {
72
+ for( const funcArg of args ) {
73
+ // arguments passed have the same context of the function called
74
+ const inlineResult = _inlineSingleUse( funcArg, ctx );
75
+ somethingWasInlined ||= inlineResult.somethingWasInlined;
76
+ }
77
+ return { term, somethingWasInlined };
78
+ }
79
+
80
+ // if we get here, at least one variable is used exactly once
81
+ somethingWasInlined = true;
82
+
83
+ // removed dbns are relative indices (0-based) of the function parameters
84
+ const removedDbns: bigint[] = funcCtx.localVarsUseCount
85
+ .map( (varCount, idx) => varCount === 1 ? BigInt(idx) : undefined )
86
+ .filter( (v): v is bigint => typeof v === "bigint" );
87
+
88
+ // remove vars here
89
+ const inlinedTerms: { [dbn: number]: IRTerm } = {};
90
+ const remainingArgs: IRTerm[] = [];
91
+ args.forEach( ( arg, idx ) => {
92
+ const nUses = funcCtx.localVarsUseCount[ idx ];
93
+ if( nUses === 1 ) {
94
+ // map using relative parameter index
95
+ inlinedTerms[ idx ] = arg;
96
+ } else remainingArgs.push( arg );
97
+ } );
98
+
99
+ func.arity -= removedDbns.length;
100
+ const decrementedFuncBody = _decrementAndInline(
101
+ func.body,
102
+ removedDbns,
103
+ inlinedTerms,
104
+ 0
105
+ );
106
+ func.body = decrementedFuncBody;
107
+
108
+ for( const funcArg of remainingArgs ) {
109
+ // arguments passed have the same context of the function called
110
+ _inlineSingleUse( funcArg, ctx );
111
+ }
112
+
113
+ const someArgsWereUsed = remainingArgs.length > 0;
114
+ const newTerm = someArgsWereUsed
115
+ ? _ir_apps( func, ...(remainingArgs as [IRTerm, ...IRTerm[]]) )
116
+ : decrementedFuncBody;
117
+
118
+ const parent = term.parent;
119
+ if( parent ) _modifyChildFromTo( parent, term, newTerm );
120
+
121
+ return { term: newTerm, somethingWasInlined };
122
+ }
123
+
124
+ function _getDbnDecrement( termDbn: number, removedDbns: bigint[], paramOffset: number ): number
125
+ {
126
+ // termDbn is absolute inside current function. removedDbns are relative indices (0..arity-1)
127
+ // A variable corresponds to a parameter if termDbn - paramOffset is within removed list
128
+ const rel = termDbn - paramOffset;
129
+ if( rel < 0 ) return 0;
130
+ // number of removed parameters with index < rel
131
+ return removedDbns.filter( dbn => Number(dbn) < rel ).length;
132
+ }
133
+
134
+ function _decrementAndInline(
135
+ term: IRTerm,
136
+ removedDbns: bigint[],
137
+ inlineDbns: { [dbn: number]: IRTerm },
138
+ paramOffset: number // absolute dbn of parameter 0 for current function scope
139
+ ): IRTerm
140
+ {
141
+ if( removedDbns.length <= 0 ) return term;
142
+
143
+ if( term instanceof IRVar ) {
144
+ const relIdx = term.dbn - paramOffset;
145
+ if( relIdx >= 0 ) {
146
+ let inlineTerm = inlineDbns[ relIdx ];
147
+ if( inlineTerm ) {
148
+ // clone to avoid sharing and adjust dbns relative to current paramOffset
149
+ inlineTerm = inlineTerm.clone();
150
+ inlineTerm = _incrementTermDbns( inlineTerm, paramOffset );
151
+ if( term.parent ) _modifyChildFromTo( term.parent, term, inlineTerm );
152
+ return inlineTerm;
153
+ }
154
+ const decrement = _getDbnDecrement( term.dbn, removedDbns, paramOffset );
155
+ if( decrement > 0 ) term.dbn -= decrement;
156
+ }
157
+ return term;
158
+ }
159
+ if( term instanceof IRSelfCall ) {
160
+ const decrement = _getDbnDecrement( term.dbn, removedDbns, paramOffset );
161
+ if( decrement > 0 ) term.dbn -= decrement;
162
+ return term;
163
+ }
164
+ if( term instanceof IRLetted ) {
165
+ const decrement = _getDbnDecrement( term.dbn, removedDbns, paramOffset );
166
+ if( decrement > 0 ) term.dbn -= decrement;
167
+ for( const child of term.children() ) {
168
+ _decrementAndInline( child, removedDbns, inlineDbns, paramOffset );
169
+ }
170
+ return term;
171
+ }
172
+ if( term instanceof IRHoisted ) return term; // closed
173
+
174
+ if( term instanceof IRFunc ) {
175
+ // entering new function: its parameters start at current paramOffset
176
+ // increment paramOffset by its arity for body children
177
+ for( const child of term.children() ) {
178
+ _decrementAndInline( child, removedDbns, inlineDbns, paramOffset + term.arity );
179
+ }
180
+ return term;
181
+ }
182
+
183
+ for( const child of term.children() ) {
184
+ _decrementAndInline( child, removedDbns, inlineDbns, paramOffset );
185
+ }
186
+ return term;
187
+ }
188
+
189
+ function _incrementTermDbns( term: IRTerm, dbnDiff: number ): IRTerm
190
+ {
191
+ if( dbnDiff === 0 ) return term;
192
+
193
+ if( term instanceof IRVar ) {
194
+ term.dbn += dbnDiff;
195
+ // _modifyChildFromTo( term.parent, term, term );
196
+ return term;
197
+ }
198
+ if( term instanceof IRSelfCall ) {
199
+ term.dbn += dbnDiff;
200
+ // _modifyChildFromTo( term.parent, term, term );
201
+ return term;
202
+ }
203
+ if( term instanceof IRLetted ) {
204
+ term.dbn += dbnDiff;
205
+ for( const c of term.children() ) {
206
+ _incrementTermDbns( c, dbnDiff );
207
+ }
208
+ return term;
209
+ }
210
+ if( term instanceof IRHoisted ) return term; // hoisted terms are closed
211
+
212
+ for( const child of term.children() ) {
213
+ _incrementTermDbns( child, dbnDiff );
214
+ }
215
+ return term;
216
+ }
217
+ //*/