diff --git a/dev-docs/CHANGELOG.md b/dev-docs/CHANGELOG.md index 8e2cfbf8ed..6a40a81850 100644 --- a/dev-docs/CHANGELOG.md +++ b/dev-docs/CHANGELOG.md @@ -12,6 +12,11 @@ The documentation changelog is kept separately: [CHANGELOG-DOCS](./CHANGELOG-DOC ### Code generation - Reordered arguments of the `__tact_store_address_opt` function to optimize gas consumption: PR [#3333](https://github.com/tact-lang/tact/pull/3333) +- Don't load contract state unless getter reads or writes it: PR [#3364](https://github.com/tact-lang/tact/pull/3364) + +### Release contributors + +- [Petr Makhnev](https://github.com/i582) ## [1.6.13] - 2025-05-29 diff --git a/src/benchmarks/jetton/size.json b/src/benchmarks/jetton/size.json index 4a13dcc734..47a6965e7d 100644 --- a/src/benchmarks/jetton/size.json +++ b/src/benchmarks/jetton/size.json @@ -189,6 +189,16 @@ "wallet cells": "15", "wallet bits": "7756" } + }, + { + "label": "1.6.13 without load contract state if it is not used", + "pr": "https://github.com/tact-lang/tact/pull/3364", + "size": { + "minter cells": "28", + "minter bits": "13865", + "wallet cells": "15", + "wallet bits": "7756" + } } ] } diff --git a/src/benchmarks/notcoin/size.json b/src/benchmarks/notcoin/size.json index edc87989c8..72fd3d505f 100644 --- a/src/benchmarks/notcoin/size.json +++ b/src/benchmarks/notcoin/size.json @@ -139,6 +139,16 @@ "wallet cells": "13", "wallet bits": "8004" } + }, + { + "label": "1.6.13 without load contract state if it is not used", + "pr": "https://github.com/tact-lang/tact/pull/3364", + "size": { + "minter cells": "29", + "minter bits": "15807", + "wallet cells": "13", + "wallet bits": "8004" + } } ] } diff --git a/src/cli/unboc/__snapshots__/e2e.spec.ts.snap b/src/cli/unboc/__snapshots__/e2e.spec.ts.snap index 60022f427a..f995f447da 100644 --- a/src/cli/unboc/__snapshots__/e2e.spec.ts.snap +++ b/src/cli/unboc/__snapshots__/e2e.spec.ts.snap @@ -41,19 +41,7 @@ PROGRAM{ 130 THROW }> ?fun_78250 PROC:<{ - PUSHROOT - CTOS - 1 LDI - DROP - <{ - NULL - }> PUSHCONT - <{ - NULL - }> PUSHCONT - IFELSE ?fun_ref_92183b49329bb4e4 INLINECALLDICT - NIP }> ?fun_ref_92183b49329bb4e4 PROCREF:<{ x{68656C6C6F20776F726C64} PUSHSLICE @@ -104,19 +92,7 @@ PROGRAM{ 130 THROW // 0xF2C4_ 105_ }> ?fun_78250 PROC:<{ - PUSHROOT // 0xED4 4 - CTOS // 0xD0 - 1 LDI // 0xD2 00 - DROP // 0x3 0 - <{ - NULL // 0x6D - }> PUSHCONT // 0x9 6D - <{ - NULL // 0x6D - }> PUSHCONT // 0x9 6D - IFELSE // 0xE2 ?fun_ref_92183b49329bb4e4 INLINECALLDICT // 0x - NIP // 0x3 1 }> ?fun_ref_92183b49329bb4e4 PROCREF:<{ x{68656C6C6F20776F726C64} PUSHSLICE // 0x8B 68656C6C6F20776F726C64 @@ -167,19 +143,7 @@ PROGRAM{ 130 THROW }> ?fun_78250 PROC:<{ - c4 PUSHCTR - CTOS - 1 LDI - s0 POP - <{ - NULL - }> PUSHCONT - <{ - NULL - }> PUSHCONT - IFELSE ?fun_ref_92183b49329bb4e4 INLINECALLDICT - s1 POP }> ?fun_ref_92183b49329bb4e4 PROCREF:<{ x{68656C6C6F20776F726C64} PUSHSLICE @@ -229,21 +193,9 @@ PROGRAM{ 130 THROW }> ?fun_78250 PROC:<{ - PUSHROOT - CTOS - 1 LDI - DROP - <{ - NULL - }> PUSHCONT - <{ - NULL - }> PUSHCONT - IFELSE <{ x{68656C6C6F20776F726C64} PUSHSLICE }>c CALLREF - NIP }> }END>c ", diff --git a/src/generator/writers/writeFunction.ts b/src/generator/writers/writeFunction.ts index dd65ecfc92..b4163a9a31 100644 --- a/src/generator/writers/writeFunction.ts +++ b/src/generator/writers/writeFunction.ts @@ -714,25 +714,38 @@ export function writeFunction(f: FunctionDescription, ctx: WriterContext) { ? [getType(ctx.ctx, f.self.name), f.self.optional] : [null, false]; + const isGetterWithoutStateUsage = + f.isGetter && + !f.effects.has("contractStorageRead") && + !f.effects.has("contractStorageWrite"); + // Write function header let returns: string = resolveFuncType(f.returns, ctx); const returnsOriginal = returns; let returnsStr: string | null; if (self && f.isMutating) { - if (f.returns.kind !== "void") { + if (isGetterWithoutStateUsage) { + returns = `((), ${returns})`; + } else if (f.returns.kind !== "void") { returns = `(${resolveFuncType(self, ctx)}, ${returns})`; } else { returns = `(${resolveFuncType(self, ctx)}, ())`; } - returnsStr = resolveFuncTypeUnpack(self, funcIdOf("self"), ctx); + returnsStr = isGetterWithoutStateUsage + ? "()" + : resolveFuncTypeUnpack(self, funcIdOf("self"), ctx); } // Resolve function descriptor const params: string[] = []; if (self) { - params.push( - resolveFuncType(self, ctx, isSelfOpt) + " " + funcIdOf("self"), - ); + if (isGetterWithoutStateUsage) { + params.push(`() ${funcIdOf("self")}`); + } else { + params.push( + resolveFuncType(self, ctx, isSelfOpt) + " " + funcIdOf("self"), + ); + } } f.params.forEach((a, index) => { @@ -816,7 +829,7 @@ export function writeFunction(f: FunctionDescription, ctx: WriterContext) { } ctx.body(() => { // Unpack self - if (self && !isSelfOpt) { + if (self && !isSelfOpt && !isGetterWithoutStateUsage) { ctx.append( `var (${resolveFuncTypeUnpack(self, funcIdOf("self"), ctx)}) = ${funcIdOf("self")};`, ); @@ -979,13 +992,22 @@ export function writeGetter(f: FunctionDescription, wCtx: WriterContext) { ); } - // Load contract state - wCtx.append(`var self = ${ops.contractLoad(self.name, wCtx)}();`); + const call = `${wCtx.used(ops.extension(self.name, f.name))}(${f.params.map((v) => funcIdOf(v.name)).join(", ")})`; - // Execute get method - wCtx.append( - `var res = self~${wCtx.used(ops.extension(self.name, f.name))}(${f.params.map((v) => funcIdOf(v.name)).join(", ")});`, - ); + if ( + f.isGetter && + !f.effects.has("contractStorageRead") && + !f.effects.has("contractStorageWrite") + ) { + wCtx.append(`var self = ();`); + wCtx.append(`var res = self~${call};`); + } else { + // Load contract state + wCtx.append(`var self = ${ops.contractLoad(self.name, wCtx)}();`); + + // Execute get method + wCtx.append(`var res = self~${call};`); + } // Pack if needed if (f.returns.kind === "ref") { diff --git a/src/pipeline/__snapshots__/packaging.spec.ts.snap b/src/pipeline/__snapshots__/packaging.spec.ts.snap index 687f282074..6b06a5486b 100644 --- a/src/pipeline/__snapshots__/packaging.spec.ts.snap +++ b/src/pipeline/__snapshots__/packaging.spec.ts.snap @@ -1,3 +1,3 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`should correctly generate .pkg file: Windows uses Unix-like paths 1`] = `"{"name":"Echo","code":"te6ccgECCwEAAfwAAij/AI6I9KQT9LzyyAvtUyDjA+1D2QECAgN44AMEA/Qw7aLt+wHQctch0gDSAPpAIRA0UGZvBPhhAvhi7UTQ0gAwkW2RbeICkVvgcCHXSSDCH+MAAcAAjrnCH460gCDXIds8+EJ/cFADgEIBUDMEyM+FgMoAz4RAzgH6AoBqz0D0AMkB+wAwyH8BygDJ7VTbMeCRMOLIAc8WyQcICQEjudPu1E0NIAMJFtkW3iAds8MYBQEjuDYu1E0NIAMJFtkW3iAds8MYBgAKqgmAILACUshvAAFvjG1vjIt0hlbGxvLCCNs8Ads8byIByZMhbrOWAW8iWczJ6DHQCgoAoDEh1wsfIIIQe6INwbqOP18DbwDIATCCEHuiDcEByx/J+EJ/cFADgEIBUDMEyM+FgMoAz4RAzgH6AoBqz0D0AMkB+wAwyH8BygDJ7VTbMeABAULIcAHLH28AAW+MbW+MAds8byIByZMhbrOWAW8iWczJ6DEKAFj4Qn9wUAOAQgFQMwTIz4WAygDPhEDOAfoCgGrPQPQAyQH7ADDIfwHKAMntVAC2INdKIddJlyDCACLCALGOSANvIoB/Is8xqwKhBasCUVW2CCDCAJogqgIV1xgDzkAU3llvAlNBocIAmcgBbwJQRKGqAo4SMTPCAJnUMNAg10oh10mScCDi4uhfAw==","abi":"{\\"name\\":\\"Echo\\",\\"types\\":[{\\"name\\":\\"DataSize\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"cells\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"bits\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"refs\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}]},{\\"name\\":\\"SignedBundle\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"signature\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"fixed-bytes\\",\\"optional\\":false,\\"format\\":64}},{\\"name\\":\\"signedData\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false,\\"format\\":\\"remainder\\"}}]},{\\"name\\":\\"StateInit\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"code\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":false}},{\\"name\\":\\"data\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":false}}]},{\\"name\\":\\"Context\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"bounceable\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}},{\\"name\\":\\"sender\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"raw\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false}}]},{\\"name\\":\\"SendParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"code\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"data\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"to\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}}]},{\\"name\\":\\"MessageParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"to\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}}]},{\\"name\\":\\"DeployParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}},{\\"name\\":\\"init\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"StateInit\\",\\"optional\\":false}}]},{\\"name\\":\\"StdAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"workchain\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":8}},{\\"name\\":\\"address\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"uint\\",\\"optional\\":false,\\"format\\":256}}]},{\\"name\\":\\"VarAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"workchain\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":32}},{\\"name\\":\\"address\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false}}]},{\\"name\\":\\"BasechainAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"hash\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":true,\\"format\\":257}}]},{\\"name\\":\\"EchoMessage\\",\\"header\\":2074217921,\\"fields\\":[]},{\\"name\\":\\"Echo$Data\\",\\"header\\":null,\\"fields\\":[]}],\\"receivers\\":[{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"typed\\",\\"type\\":\\"EchoMessage\\"}},{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"text\\"}},{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"any\\"}}],\\"getters\\":[{\\"name\\":\\"hello\\",\\"methodId\\":115554,\\"arguments\\":[{\\"name\\":\\"src\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"string\\",\\"optional\\":false}}],\\"returnType\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"string\\",\\"optional\\":false}},{\\"name\\":\\"hello2\\",\\"methodId\\":105790,\\"arguments\\":[{\\"name\\":\\"src\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}],\\"returnType\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}],\\"errors\\":{\\"2\\":{\\"message\\":\\"Stack underflow\\"},\\"3\\":{\\"message\\":\\"Stack overflow\\"},\\"4\\":{\\"message\\":\\"Integer overflow\\"},\\"5\\":{\\"message\\":\\"Integer out of expected range\\"},\\"6\\":{\\"message\\":\\"Invalid opcode\\"},\\"7\\":{\\"message\\":\\"Type check error\\"},\\"8\\":{\\"message\\":\\"Cell overflow\\"},\\"9\\":{\\"message\\":\\"Cell underflow\\"},\\"10\\":{\\"message\\":\\"Dictionary error\\"},\\"11\\":{\\"message\\":\\"'Unknown' error\\"},\\"12\\":{\\"message\\":\\"Fatal error\\"},\\"13\\":{\\"message\\":\\"Out of gas error\\"},\\"14\\":{\\"message\\":\\"Virtualization error\\"},\\"32\\":{\\"message\\":\\"Action list is invalid\\"},\\"33\\":{\\"message\\":\\"Action list is too long\\"},\\"34\\":{\\"message\\":\\"Action is invalid or not supported\\"},\\"35\\":{\\"message\\":\\"Invalid source address in outbound message\\"},\\"36\\":{\\"message\\":\\"Invalid destination address in outbound message\\"},\\"37\\":{\\"message\\":\\"Not enough Toncoin\\"},\\"38\\":{\\"message\\":\\"Not enough extra currencies\\"},\\"39\\":{\\"message\\":\\"Outbound message does not fit into a cell after rewriting\\"},\\"40\\":{\\"message\\":\\"Cannot process a message\\"},\\"41\\":{\\"message\\":\\"Library reference is null\\"},\\"42\\":{\\"message\\":\\"Library change action error\\"},\\"43\\":{\\"message\\":\\"Exceeded maximum number of cells in the library or the maximum depth of the Merkle tree\\"},\\"50\\":{\\"message\\":\\"Account state size exceeded limits\\"},\\"128\\":{\\"message\\":\\"Null reference exception\\"},\\"129\\":{\\"message\\":\\"Invalid serialization prefix\\"},\\"130\\":{\\"message\\":\\"Invalid incoming message\\"},\\"131\\":{\\"message\\":\\"Constraints error\\"},\\"132\\":{\\"message\\":\\"Access denied\\"},\\"133\\":{\\"message\\":\\"Contract stopped\\"},\\"134\\":{\\"message\\":\\"Invalid argument\\"},\\"135\\":{\\"message\\":\\"Code of a contract was not found\\"},\\"136\\":{\\"message\\":\\"Invalid standard address\\"},\\"138\\":{\\"message\\":\\"Not a basechain address\\"}},\\"interfaces\\":[\\"org.ton.introspection.v0\\",\\"org.ton.abi.ipfs.v0\\",\\"org.ton.deploy.lazy.v0\\"]}","init":{"kind":"direct","args":[],"prefix":{"bits":1,"value":0},"deployment":{"kind":"system-cell","system":null}},"sources":{"packaging.tact":"bWVzc2FnZSgweDdiYTIwZGMxKSBFY2hvTWVzc2FnZSB7fQoKY29udHJhY3QgRWNobyB7CiAgICByZWNlaXZlKG1zZzogRWNob01lc3NhZ2UpIHsKICAgICAgICBzZWxmLnJlcGx5KG1zZy50b0NlbGwoKSk7CiAgICB9CiAgICAKICAgIHJlY2VpdmUobXNnOiBTdHJpbmcpIHsKICAgICAgICBzZWxmLnJlcGx5KG1zZy5hc0NvbW1lbnQoKSk7CiAgICB9CiAgICAKICAgIHJlY2VpdmUobXNnOiBTbGljZSkgewogICAgICAgIHNlbGYucmVwbHkobXNnLmFzQ2VsbCgpKTsKICAgIH0KCiAgICBnZXQgZnVuIGhlbGxvKHNyYzogU3RyaW5nKTogU3RyaW5nIHsKICAgICAgICBsZXQgYnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IGJlZ2luU3RyaW5nKCk7CiAgICAgICAgYnVpbGRlci5hcHBlbmQoIkhlbGxvLCAiKTsKICAgICAgICBidWlsZGVyLmFwcGVuZChzcmMpOwogICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiAgICB9CgogICAgZ2V0IGZ1biBoZWxsbzIoc3JjOiBJbnQpOiBJbnQgewogICAgICAgIHJldHVybiBzcmMgPDwgMTAgJiAzMjsKICAgIH0KfQ=="},"compiler":{"name":"tact","version":"1.6.13","parameters":"{\\"entrypoint\\":\\"./packaging.tact\\",\\"options\\":{}}"}}"`; +exports[`should correctly generate .pkg file: Windows uses Unix-like paths 1`] = `"{"name":"Echo","code":"te6ccgECCwEAAeIAAij/AI6I9KQT9LzyyAvtUyDjA+1D2QECAgN44AMEA/Qw7aLt+wHQctch0gDSAPpAIRA0UGZvBPhhAvhi7UTQ0gAwkW2RbeICkVvgcCHXSSDCH+MAAcAAjrnCH460gCDXIds8+EJ/cFADgEIBUDMEyM+FgMoAz4RAzgH6AoBqz0D0AMkB+wAwyH8BygDJ7VTbMeCRMOLIAc8WyQcICQEJudPts8gFAQm4Ni2zyAYACqoJgCCwAlLIbwABb4xtb4yLdIZWxsbywgjbPAHbPG8iAcmTIW6zlgFvIlnMyegx0AoKAKAxIdcLHyCCEHuiDcG6jj9fA28AyAEwghB7og3BAcsfyfhCf3BQA4BCAVAzBMjPhYDKAM+EQM4B+gKAas9A9ADJAfsAMMh/AcoAye1U2zHgAQFCyHAByx9vAAFvjG1vjAHbPG8iAcmTIW6zlgFvIlnMyegxCgBY+EJ/cFADgEIBUDMEyM+FgMoAz4RAzgH6AoBqz0D0AMkB+wAwyH8BygDJ7VQAtiDXSiHXSZcgwgAiwgCxjkgDbyKAfyLPMasCoQWrAlFVtgggwgCaIKoCFdcYA85AFN5ZbwJTQaHCAJnIAW8CUEShqgKOEjEzwgCZ1DDQINdKIddJknAg4uLoXwM=","abi":"{\\"name\\":\\"Echo\\",\\"types\\":[{\\"name\\":\\"DataSize\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"cells\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"bits\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"refs\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}]},{\\"name\\":\\"SignedBundle\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"signature\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"fixed-bytes\\",\\"optional\\":false,\\"format\\":64}},{\\"name\\":\\"signedData\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false,\\"format\\":\\"remainder\\"}}]},{\\"name\\":\\"StateInit\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"code\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":false}},{\\"name\\":\\"data\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":false}}]},{\\"name\\":\\"Context\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"bounceable\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}},{\\"name\\":\\"sender\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"raw\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false}}]},{\\"name\\":\\"SendParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"code\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"data\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"to\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}}]},{\\"name\\":\\"MessageParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"to\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"address\\",\\"optional\\":false}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}}]},{\\"name\\":\\"DeployParameters\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"mode\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"body\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"cell\\",\\"optional\\":true}},{\\"name\\":\\"value\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}},{\\"name\\":\\"bounce\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"bool\\",\\"optional\\":false}},{\\"name\\":\\"init\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"StateInit\\",\\"optional\\":false}}]},{\\"name\\":\\"StdAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"workchain\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":8}},{\\"name\\":\\"address\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"uint\\",\\"optional\\":false,\\"format\\":256}}]},{\\"name\\":\\"VarAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"workchain\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":32}},{\\"name\\":\\"address\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"slice\\",\\"optional\\":false}}]},{\\"name\\":\\"BasechainAddress\\",\\"header\\":null,\\"fields\\":[{\\"name\\":\\"hash\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":true,\\"format\\":257}}]},{\\"name\\":\\"EchoMessage\\",\\"header\\":2074217921,\\"fields\\":[]},{\\"name\\":\\"Echo$Data\\",\\"header\\":null,\\"fields\\":[]}],\\"receivers\\":[{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"typed\\",\\"type\\":\\"EchoMessage\\"}},{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"text\\"}},{\\"receiver\\":\\"internal\\",\\"message\\":{\\"kind\\":\\"any\\"}}],\\"getters\\":[{\\"name\\":\\"hello\\",\\"methodId\\":115554,\\"arguments\\":[{\\"name\\":\\"src\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"string\\",\\"optional\\":false}}],\\"returnType\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"string\\",\\"optional\\":false}},{\\"name\\":\\"hello2\\",\\"methodId\\":105790,\\"arguments\\":[{\\"name\\":\\"src\\",\\"type\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}],\\"returnType\\":{\\"kind\\":\\"simple\\",\\"type\\":\\"int\\",\\"optional\\":false,\\"format\\":257}}],\\"errors\\":{\\"2\\":{\\"message\\":\\"Stack underflow\\"},\\"3\\":{\\"message\\":\\"Stack overflow\\"},\\"4\\":{\\"message\\":\\"Integer overflow\\"},\\"5\\":{\\"message\\":\\"Integer out of expected range\\"},\\"6\\":{\\"message\\":\\"Invalid opcode\\"},\\"7\\":{\\"message\\":\\"Type check error\\"},\\"8\\":{\\"message\\":\\"Cell overflow\\"},\\"9\\":{\\"message\\":\\"Cell underflow\\"},\\"10\\":{\\"message\\":\\"Dictionary error\\"},\\"11\\":{\\"message\\":\\"'Unknown' error\\"},\\"12\\":{\\"message\\":\\"Fatal error\\"},\\"13\\":{\\"message\\":\\"Out of gas error\\"},\\"14\\":{\\"message\\":\\"Virtualization error\\"},\\"32\\":{\\"message\\":\\"Action list is invalid\\"},\\"33\\":{\\"message\\":\\"Action list is too long\\"},\\"34\\":{\\"message\\":\\"Action is invalid or not supported\\"},\\"35\\":{\\"message\\":\\"Invalid source address in outbound message\\"},\\"36\\":{\\"message\\":\\"Invalid destination address in outbound message\\"},\\"37\\":{\\"message\\":\\"Not enough Toncoin\\"},\\"38\\":{\\"message\\":\\"Not enough extra currencies\\"},\\"39\\":{\\"message\\":\\"Outbound message does not fit into a cell after rewriting\\"},\\"40\\":{\\"message\\":\\"Cannot process a message\\"},\\"41\\":{\\"message\\":\\"Library reference is null\\"},\\"42\\":{\\"message\\":\\"Library change action error\\"},\\"43\\":{\\"message\\":\\"Exceeded maximum number of cells in the library or the maximum depth of the Merkle tree\\"},\\"50\\":{\\"message\\":\\"Account state size exceeded limits\\"},\\"128\\":{\\"message\\":\\"Null reference exception\\"},\\"129\\":{\\"message\\":\\"Invalid serialization prefix\\"},\\"130\\":{\\"message\\":\\"Invalid incoming message\\"},\\"131\\":{\\"message\\":\\"Constraints error\\"},\\"132\\":{\\"message\\":\\"Access denied\\"},\\"133\\":{\\"message\\":\\"Contract stopped\\"},\\"134\\":{\\"message\\":\\"Invalid argument\\"},\\"135\\":{\\"message\\":\\"Code of a contract was not found\\"},\\"136\\":{\\"message\\":\\"Invalid standard address\\"},\\"138\\":{\\"message\\":\\"Not a basechain address\\"}},\\"interfaces\\":[\\"org.ton.introspection.v0\\",\\"org.ton.abi.ipfs.v0\\",\\"org.ton.deploy.lazy.v0\\"]}","init":{"kind":"direct","args":[],"prefix":{"bits":1,"value":0},"deployment":{"kind":"system-cell","system":null}},"sources":{"packaging.tact":"bWVzc2FnZSgweDdiYTIwZGMxKSBFY2hvTWVzc2FnZSB7fQoKY29udHJhY3QgRWNobyB7CiAgICByZWNlaXZlKG1zZzogRWNob01lc3NhZ2UpIHsKICAgICAgICBzZWxmLnJlcGx5KG1zZy50b0NlbGwoKSk7CiAgICB9CiAgICAKICAgIHJlY2VpdmUobXNnOiBTdHJpbmcpIHsKICAgICAgICBzZWxmLnJlcGx5KG1zZy5hc0NvbW1lbnQoKSk7CiAgICB9CiAgICAKICAgIHJlY2VpdmUobXNnOiBTbGljZSkgewogICAgICAgIHNlbGYucmVwbHkobXNnLmFzQ2VsbCgpKTsKICAgIH0KCiAgICBnZXQgZnVuIGhlbGxvKHNyYzogU3RyaW5nKTogU3RyaW5nIHsKICAgICAgICBsZXQgYnVpbGRlcjogU3RyaW5nQnVpbGRlciA9IGJlZ2luU3RyaW5nKCk7CiAgICAgICAgYnVpbGRlci5hcHBlbmQoIkhlbGxvLCAiKTsKICAgICAgICBidWlsZGVyLmFwcGVuZChzcmMpOwogICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CiAgICB9CgogICAgZ2V0IGZ1biBoZWxsbzIoc3JjOiBJbnQpOiBJbnQgewogICAgICAgIHJldHVybiBzcmMgPDwgMTAgJiAzMjsKICAgIH0KfQ=="},"compiler":{"name":"tact","version":"1.6.13","parameters":"{\\"entrypoint\\":\\"./packaging.tact\\",\\"options\\":{}}"}}"`; diff --git a/src/pipeline/precompile.ts b/src/pipeline/precompile.ts index 6f83fcdd57..b87a90f9ae 100644 --- a/src/pipeline/precompile.ts +++ b/src/pipeline/precompile.ts @@ -14,7 +14,10 @@ import type * as Ast from "@/ast/ast"; import { getAstFactory } from "@/ast/ast-helpers"; import { getParser } from "@/grammar"; import { evalComptimeExpressions } from "@/types/evalComptimeExpressions"; -import { computeReceiversEffects } from "@/types/effects"; +import { + computeGettersEffects, + computeReceiversEffects, +} from "@/types/effects"; import { setAstFactoryToStore } from "@/pipeline/ast-factory-store"; export function precompile( @@ -80,6 +83,7 @@ export function precompile( // To use in code generation to decide if a receiver needs to call the contract storage function computeReceiversEffects(ctx); + computeGettersEffects(ctx); // Prepared context return ctx; diff --git a/src/storage/__snapshots__/resolveAllocation.spec.ts.snap b/src/storage/__snapshots__/resolveAllocation.spec.ts.snap index 9581c0f145..ca86a4aae1 100644 --- a/src/storage/__snapshots__/resolveAllocation.spec.ts.snap +++ b/src/storage/__snapshots__/resolveAllocation.spec.ts.snap @@ -2262,6 +2262,7 @@ exports[`resolveAllocation should write program 1`] = ` "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, diff --git a/src/test/codegen-check/__snapshots__/codegen.test.ts.snap b/src/test/codegen-check/__snapshots__/codegen.test.ts.snap index d7f423091a..21a902ddf5 100644 --- a/src/test/codegen-check/__snapshots__/codegen.test.ts.snap +++ b/src/test/codegen-check/__snapshots__/codegen.test.ts.snap @@ -60,37 +60,37 @@ slice $global_right() impure inline_ref; (int, int) $Int$_fun_inc(int $self) impure inline_ref; ;; $MainContract$_fun_testAugmentedAssignOperators -((int, int, slice, cell), int) $MainContract$_fun_testAugmentedAssignOperators((int, int, slice, cell) $self, int $intVal, int $intVal2, int $boolVal, int $boolVal2) impure inline_ref; +((), int) $MainContract$_fun_testAugmentedAssignOperators(() $self, int $intVal, int $intVal2, int $boolVal, int $boolVal2) impure inline_ref; ;; $A$_constructor_a_b_c_d_e_f_g ((int, int, int, int, int, int, int)) $A$_constructor_a_b_c_d_e_f_g(int $a, int $b, int $c, int $d, int $e, int $f, int $g) inline; ;; $MainContract$_fun_writeSerializationForA -((int, int, slice, cell), (int, int, int, int, int, int, int)) $MainContract$_fun_writeSerializationForA((int, int, slice, cell) $self) impure inline_ref; +((), (int, int, int, int, int, int, int)) $MainContract$_fun_writeSerializationForA(() $self) impure inline_ref; ;; $B$_constructor_a_b_c_d_e_f_g ((int, int, int, int, int, int, int)) $B$_constructor_a_b_c_d_e_f_g(int $a, int $b, int $c, int $d, int $e, int $f, int $g) inline; ;; $MainContract$_fun_writeSerializationForB -((int, int, slice, cell), (int, int, int, int, int, int, int)) $MainContract$_fun_writeSerializationForB((int, int, slice, cell) $self) impure inline_ref; +((), (int, int, int, int, int, int, int)) $MainContract$_fun_writeSerializationForB(() $self) impure inline_ref; ;; $C$_constructor_a_b_c_d_e_f_g_h ((cell, cell, slice, slice, int, int, int, slice)) $C$_constructor_a_b_c_d_e_f_g_h(cell $a, cell $b, slice $c, slice $d, int $e, int $f, int $g, slice $h) inline; ;; $MainContract$_fun_writeSerializationForC -((int, int, slice, cell), (cell, cell, slice, slice, int, int, int, slice)) $MainContract$_fun_writeSerializationForC((int, int, slice, cell) $self) impure inline_ref; +((), (cell, cell, slice, slice, int, int, int, slice)) $MainContract$_fun_writeSerializationForC(() $self) impure inline_ref; ;; $MainContract$_fun_testIfOptimizationPositive ((int, int, slice, cell), ()) $MainContract$_fun_testIfOptimizationPositive((int, int, slice, cell) $self, int $a, int $b) impure inline_ref; ;; $MainContract$_fun_testIfOptimizationComplexPositive -((int, int, slice, cell), ()) $MainContract$_fun_testIfOptimizationComplexPositive((int, int, slice, cell) $self, int $a) impure inline_ref; +((), ()) $MainContract$_fun_testIfOptimizationComplexPositive(() $self, int $a) impure inline_ref; ;; $MainContract$_fun_testIfOptimizationNegative ((int, int, slice, cell), ()) $MainContract$_fun_testIfOptimizationNegative((int, int, slice, cell) $self, int $a, int $b) impure inline_ref; ;; $MainContract$_fun_testDumpCall -((int, int, slice, cell), ()) $MainContract$_fun_testDumpCall((int, int, slice, cell) $self, int $a) impure inline_ref; +((), ()) $MainContract$_fun_testDumpCall(() $self, int $a) impure inline_ref; ;; $MainContract$_fun_testIfThrowOptimization ((int, int, slice, cell), ()) $MainContract$_fun_testIfThrowOptimization((int, int, slice, cell) $self, int $a) impure inline_ref; @@ -99,7 +99,7 @@ slice $global_right() impure inline_ref; ((int, int, slice, cell), ()) $MainContract$_fun_testIfThrowOptimizationNegative((int, int, slice, cell) $self, int $a) impure inline_ref; ;; $MainContract$_fun_testOrder -((int, int, slice, cell), int) $MainContract$_fun_testOrder((int, int, slice, cell) $self) impure inline_ref; +((), int) $MainContract$_fun_testOrder(() $self) impure inline_ref; ;; $MainContract$_fun_asCell ((int, int, slice, cell), cell) $MainContract$_fun_asCell((int, int, slice, cell) $self) impure inline_ref; @@ -271,8 +271,7 @@ slice $global_right() impure inline_ref { return ($self, $fresh$ret_0); } -((int, int, slice, cell), int) $MainContract$_fun_testAugmentedAssignOperators((int, int, slice, cell) $self, int $intVal, int $intVal2, int $boolVal, int $boolVal2) impure inline_ref { - var (($self'field, $self'value, $self'data, $self'mapping)) = $self; +((), int) $MainContract$_fun_testAugmentedAssignOperators(() $self, int $intVal, int $intVal2, int $boolVal, int $boolVal2) impure inline_ref { int $a = $intVal; $a = $a + $intVal2; $a = $a - $intVal2; @@ -280,25 +279,22 @@ slice $global_right() impure inline_ref { $b = ($b ? $boolVal2 : (false)); $b = ($b ? (true) : $boolVal2); var $fresh$ret_1 = ($a + ($b ? 10 : 20)); - return (($self'field, $self'value, $self'data, $self'mapping), $fresh$ret_1); + return ((), $fresh$ret_1); } -((int, int, slice, cell), (int, int, int, int, int, int, int)) $MainContract$_fun_writeSerializationForA((int, int, slice, cell) $self) impure inline_ref { - var (($self'field, $self'value, $self'data, $self'mapping)) = $self; +((), (int, int, int, int, int, int, int)) $MainContract$_fun_writeSerializationForA(() $self) impure inline_ref { var $fresh$ret_2 = $A$_constructor_a_b_c_d_e_f_g(1, 2, null(), false, true, 3, 4); - return (($self'field, $self'value, $self'data, $self'mapping), $fresh$ret_2); + return ((), $fresh$ret_2); } -((int, int, slice, cell), (int, int, int, int, int, int, int)) $MainContract$_fun_writeSerializationForB((int, int, slice, cell) $self) impure inline_ref { - var (($self'field, $self'value, $self'data, $self'mapping)) = $self; +((), (int, int, int, int, int, int, int)) $MainContract$_fun_writeSerializationForB(() $self) impure inline_ref { var $fresh$ret_3 = $B$_constructor_a_b_c_d_e_f_g(1, 2, null(), false, null(), 3, 4); - return (($self'field, $self'value, $self'data, $self'mapping), $fresh$ret_3); + return ((), $fresh$ret_3); } -((int, int, slice, cell), (cell, cell, slice, slice, int, int, int, slice)) $MainContract$_fun_writeSerializationForC((int, int, slice, cell) $self) impure inline_ref { - var (($self'field, $self'value, $self'data, $self'mapping)) = $self; +((), (cell, cell, slice, slice, int, int, int, slice)) $MainContract$_fun_writeSerializationForC(() $self) impure inline_ref { var $fresh$ret_4 = $C$_constructor_a_b_c_d_e_f_g_h($Builder$_fun_endCell(store_int($global_beginCell(), 0, 32)), null(), null(), null(), true, 1, 2, $global_myAddress()); - return (($self'field, $self'value, $self'data, $self'mapping), $fresh$ret_4); + return ((), $fresh$ret_4); } ((int, int, slice, cell), ()) $MainContract$_fun_testIfOptimizationPositive((int, int, slice, cell) $self, int $a, int $b) impure inline_ref { @@ -348,27 +344,26 @@ slice $global_right() impure inline_ref { return (($self'field, $self'value, $self'data, $self'mapping), ()); } -((int, int, slice, cell), ()) $MainContract$_fun_testIfOptimizationComplexPositive((int, int, slice, cell) $self, int $a) impure inline_ref { - var (($self'field, $self'value, $self'data, $self'mapping)) = $self; +((), ()) $MainContract$_fun_testIfOptimizationComplexPositive(() $self, int $a) impure inline_ref { ifnot ($a) { - return (($self'field, $self'value, $self'data, $self'mapping), ()); + return ((), ()); } elseif ($a) { - return (($self'field, $self'value, $self'data, $self'mapping), ()); + return ((), ()); } ifnot ($a) { ifnot ($a) { - return (($self'field, $self'value, $self'data, $self'mapping), ()); + return ((), ()); } elseif ($a) { - return (($self'field, $self'value, $self'data, $self'mapping), ()); + return ((), ()); } } elseif ($a) { ifnot ($a) { - return (($self'field, $self'value, $self'data, $self'mapping), ()); + return ((), ()); } elseifnot ($a) { - return (($self'field, $self'value, $self'data, $self'mapping), ()); + return ((), ()); } } - return (($self'field, $self'value, $self'data, $self'mapping), ()); + return ((), ()); } ((int, int, slice, cell), ()) $MainContract$_fun_testIfOptimizationNegative((int, int, slice, cell) $self, int $a, int $b) impure inline_ref { @@ -394,9 +389,8 @@ slice $global_right() impure inline_ref { return (($self'field, $self'value, $self'data, $self'mapping), ()); } -((int, int, slice, cell), ()) $MainContract$_fun_testDumpCall((int, int, slice, cell) $self, int $a) impure inline_ref { - var (($self'field, $self'value, $self'data, $self'mapping)) = $self; - return (($self'field, $self'value, $self'data, $self'mapping), ()); +((), ()) $MainContract$_fun_testDumpCall(() $self, int $a) impure inline_ref { + return ((), ()); } ((int, int, slice, cell), ()) $MainContract$_fun_testIfThrowOptimization((int, int, slice, cell) $self, int $a) impure inline_ref { @@ -441,10 +435,9 @@ slice $global_right() impure inline_ref { return (($self'field, $self'value, $self'data, $self'mapping), ()); } -((int, int, slice, cell), int) $MainContract$_fun_testOrder((int, int, slice, cell) $self) impure inline_ref { - var (($self'field, $self'value, $self'data, $self'mapping)) = $self; +((), int) $MainContract$_fun_testOrder(() $self) impure inline_ref { var $fresh$ret_5 = ( equal_slices_bits($global_left(), $global_right()) ); - return (($self'field, $self'value, $self'data, $self'mapping), $fresh$ret_5); + return ((), $fresh$ret_5); } ((int, int, slice, cell), cell) $MainContract$_fun_asCell((int, int, slice, cell) $self) impure inline_ref { @@ -468,25 +461,25 @@ _ %testAugmentedAssignOperators(int $intVal, int $intVal2, int $boolVal, int $bo int $intVal2 = $intVal2; int $boolVal = $boolVal; int $boolVal2 = $boolVal2; - var self = $MainContract$_contract_load(); + var self = (); var res = self~$MainContract$_fun_testAugmentedAssignOperators($intVal, $intVal2, $boolVal, $boolVal2); return res; } _ %writeSerializationForA() method_id(121635) { - var self = $MainContract$_contract_load(); + var self = (); var res = self~$MainContract$_fun_writeSerializationForA(); return $A$_to_external(res); } _ %writeSerializationForB() method_id(125760) { - var self = $MainContract$_contract_load(); + var self = (); var res = self~$MainContract$_fun_writeSerializationForB(); return $B$_to_external(res); } _ %writeSerializationForC() method_id(129889) { - var self = $MainContract$_contract_load(); + var self = (); var res = self~$MainContract$_fun_writeSerializationForC(); return $C$_to_external(res); } @@ -501,7 +494,7 @@ _ %testIfOptimizationPositive(int $a, int $b) method_id(72553) { _ %testIfOptimizationComplexPositive(int $a) method_id(67196) { int $a = $a; - var self = $MainContract$_contract_load(); + var self = (); var res = self~$MainContract$_fun_testIfOptimizationComplexPositive($a); return res; } @@ -516,7 +509,7 @@ _ %testIfOptimizationNegative(int $a, int $b) method_id(87434) { _ %testDumpCall(int $a) method_id(66927) { int $a = $a; - var self = $MainContract$_contract_load(); + var self = (); var res = self~$MainContract$_fun_testDumpCall($a); return res; } @@ -536,7 +529,7 @@ _ %testIfThrowOptimizationNegative(int $a) method_id(69407) { } _ %testOrder() method_id(121793) { - var self = $MainContract$_contract_load(); + var self = (); var res = self~$MainContract$_fun_testOrder(); return res; } diff --git a/src/test/e2e-emulated/debug/__snapshots__/dump.spec.ts.snap b/src/test/e2e-emulated/debug/__snapshots__/dump.spec.ts.snap index 3c74954e84..0f8a63e10c 100644 --- a/src/test/e2e-emulated/debug/__snapshots__/dump.spec.ts.snap +++ b/src/test/e2e-emulated/debug/__snapshots__/dump.spec.ts.snap @@ -21,7 +21,7 @@ exports[`dump should dump values correctly in a receiver 1`] = ` #DEBUG#: null #DEBUG#: File src/test/e2e-emulated/debug/dump.tact:8:5: #DEBUG#: dump(myAddress()) -#DEBUG#: EQBW6PMGWgu6Gmg_pFckrGpQxm2ImeVELrquQXN0FaneV9fj +#DEBUG#: EQBjxpkme_eJbq3iA1P8jsSg_kXovxILliGWM1d-QyR4xguF #DEBUG#: File src/test/e2e-emulated/debug/dump.tact:10:5: #DEBUG#: dump(address) #DEBUG#: EQCD39VS5jcptHL8vMjEXrzGaRcCVYto7HUn4bpAOg8xqB2N diff --git a/src/test/e2e-emulated/stdlib/__snapshots__/stdlib.spec.ts.snap b/src/test/e2e-emulated/stdlib/__snapshots__/stdlib.spec.ts.snap index ac22698da7..8801751a81 100644 --- a/src/test/e2e-emulated/stdlib/__snapshots__/stdlib.spec.ts.snap +++ b/src/test/e2e-emulated/stdlib/__snapshots__/stdlib.spec.ts.snap @@ -1,5 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`stdlib should execute stdlib methods correctly: Gas consumed in segGasLimit() 1`] = `3881`; +exports[`stdlib should execute stdlib methods correctly: Gas consumed in segGasLimit() 1`] = `3520`; -exports[`stdlib should execute stdlib methods correctly: tvm_2023_07Upgrade 1`] = `1439`; +exports[`stdlib should execute stdlib methods correctly: tvm_2023_07Upgrade 1`] = `1096`; diff --git a/src/test/e2e-emulated/stdlib/stdlib.spec.ts b/src/test/e2e-emulated/stdlib/stdlib.spec.ts index cd0b75ef55..c08f4d799d 100644 --- a/src/test/e2e-emulated/stdlib/stdlib.spec.ts +++ b/src/test/e2e-emulated/stdlib/stdlib.spec.ts @@ -251,8 +251,8 @@ describe("stdlib", () => { expect(Number(await contract.getSetGasLimit(5000n))).toMatchSnapshot( "Gas consumed in segGasLimit()", - ); // 5000 just to make sure it's enough, 3785 is how much it actually costs - await expect(contract.getSetGasLimit(3784n)).rejects.toThrow("-14"); // 3784 gas is not enough for sure + ); // 5000 just to make sure it's enough, 3520 is how much it actually costs + await expect(contract.getSetGasLimit(3510n)).rejects.toThrow("-14"); // 3510 gas is not enough for sure expect(await contract.getGetSeed()).toBe(0n); diff --git a/src/test/gas-consumption/__snapshots__/gas.spec.ts.snap b/src/test/gas-consumption/__snapshots__/gas.spec.ts.snap index 240d1f8e8d..9f0fa39e17 100644 --- a/src/test/gas-consumption/__snapshots__/gas.spec.ts.snap +++ b/src/test/gas-consumption/__snapshots__/gas.spec.ts.snap @@ -10,9 +10,9 @@ exports[`benchmarks benchmark BaseTrait: gas used for ReplyMessage 1`] = `3460`; exports[`benchmarks benchmark cashback: gas used cashback 1`] = `3337`; -exports[`benchmarks benchmark cells creation: gas used emptyCell 1`] = `750n`; +exports[`benchmarks benchmark cells creation: gas used emptyCell 1`] = `467n`; -exports[`benchmarks benchmark cells creation: gas used emptySlice 1`] = `754n`; +exports[`benchmarks benchmark cells creation: gas used emptySlice 1`] = `471n`; exports[`benchmarks benchmark codeOf vs initOf: gas used withCodeOf 1`] = `850n`; @@ -20,7 +20,7 @@ exports[`benchmarks benchmark codeOf vs initOf: gas used withInitOf 1`] = `1502n exports[`benchmarks benchmark codeOf vs myCode(): gas used codeOf for current contract 1`] = `858n`; -exports[`benchmarks benchmark codeOf vs myCode(): gas used myCode 1`] = `858n`; +exports[`benchmarks benchmark codeOf vs myCode(): gas used myCode 1`] = `575n`; exports[`benchmarks benchmark contractAddressExt: gas used contractAddressExt 1`] = `2516n`; @@ -32,7 +32,7 @@ exports[`benchmarks benchmark functions: code size 1`] = `170`; exports[`benchmarks benchmark functions: gas used 1`] = `1979`; -exports[`benchmarks benchmark log: gas used log 1`] = `1884n`; +exports[`benchmarks benchmark log: gas used log 1`] = `1583n`; exports[`benchmarks benchmark readFwdFee: code size 1`] = `116`; diff --git a/src/types/__snapshots__/effects.spec.ts.snap b/src/types/__snapshots__/effects.spec.ts.snap index 85a6f8f975..ffdae07301 100644 --- a/src/types/__snapshots__/effects.spec.ts.snap +++ b/src/types/__snapshots__/effects.spec.ts.snap @@ -97,6 +97,7 @@ exports[`effects should correctly compute effects: contractStorageAnalysis 1`] = { "comment": "rewrite in a contract method", "effects": Set { + "contractStorageRead", "contractStorageWrite", }, "kind": "internal-comment", @@ -104,6 +105,7 @@ exports[`effects should correctly compute effects: contractStorageAnalysis 1`] = { "comment": "transitively modifying contract method", "effects": Set { + "contractStorageRead", "contractStorageWrite", }, "kind": "internal-comment", @@ -111,8 +113,8 @@ exports[`effects should correctly compute effects: contractStorageAnalysis 1`] = { "comment": "read and modify in a contract method", "effects": Set { - "contractStorageWrite", "contractStorageRead", + "contractStorageWrite", }, "kind": "internal-comment", }, @@ -127,6 +129,7 @@ exports[`effects should correctly compute effects: contractStorageAnalysis 1`] = "comment": "asm function modifies contract storage via assigning to \`self\`: swapStorage", "effects": Set { "contractStorageWrite", + "contractStorageRead", }, "kind": "internal-comment", }, @@ -169,33 +172,38 @@ exports[`effects should correctly compute effects: contractStorageAnalysis 1`] = }, { "comment": "non-modifying recursive contract method", - "effects": Set {}, + "effects": Set { + "contractStorageRead", + }, "kind": "internal-comment", }, { "comment": "modifying recursive contract method", "effects": Set { - "contractStorageWrite", "contractStorageRead", + "contractStorageWrite", }, "kind": "internal-comment", }, { "comment": "modifying recursive external contract method", "effects": Set { - "contractStorageWrite", "contractStorageRead", + "contractStorageWrite", }, "kind": "internal-comment", }, { "comment": "non-modifying mutually recursive contract methods", - "effects": Set {}, + "effects": Set { + "contractStorageRead", + }, "kind": "internal-comment", }, { "comment": "modifying mutually recursive contract methods", "effects": Set { + "contractStorageRead", "contractStorageWrite", }, "kind": "internal-comment", @@ -203,13 +211,16 @@ exports[`effects should correctly compute effects: contractStorageAnalysis 1`] = { "comment": "modifying getter as a contract method", "effects": Set { + "contractStorageRead", "contractStorageWrite", }, "kind": "internal-comment", }, { "comment": "non-modifying getter as a contract method", - "effects": Set {}, + "effects": Set { + "contractStorageRead", + }, "kind": "internal-comment", }, { diff --git a/src/types/__snapshots__/resolveDescriptors.spec.ts.snap b/src/types/__snapshots__/resolveDescriptors.spec.ts.snap index 08cb131586..ce9b5a09c3 100644 --- a/src/types/__snapshots__/resolveDescriptors.spec.ts.snap +++ b/src/types/__snapshots__/resolveDescriptors.spec.ts.snap @@ -1652,6 +1652,7 @@ exports[`resolveDescriptors should resolve descriptors for asm-extends-fun 1`] = ], }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -1792,6 +1793,7 @@ exports[`resolveDescriptors should resolve descriptors for asm-fun-bounced-retur "ret": [], }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -1902,6 +1904,7 @@ exports[`resolveDescriptors should resolve descriptors for asm-fun-no-arg-shuffl ], }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -2050,6 +2053,7 @@ exports[`resolveDescriptors should resolve descriptors for asm-fun-no-ret-shuffl "ret": [], }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -2177,6 +2181,7 @@ exports[`resolveDescriptors should resolve descriptors for asm-fun-no-shuffle 2` "ret": [], }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -2287,6 +2292,7 @@ exports[`resolveDescriptors should resolve descriptors for asm-fun-shuffle-bounc ], }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -2575,6 +2581,7 @@ exports[`resolveDescriptors should resolve descriptors for asm-fun-shuffle-pair ], }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -6107,6 +6114,7 @@ exports[`resolveDescriptors should resolve descriptors for contract-getter-overr "text": "Int", }, }, + "effects": Set {}, "isAbstract": true, "isGetter": true, "isInline": false, @@ -6264,6 +6272,7 @@ exports[`resolveDescriptors should resolve descriptors for contract-getter-overr }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -6428,6 +6437,7 @@ exports[`resolveDescriptors should resolve descriptors for contract-getter-overr "text": "Int", }, }, + "effects": Set {}, "isAbstract": true, "isGetter": true, "isInline": false, @@ -6650,6 +6660,7 @@ exports[`resolveDescriptors should resolve descriptors for contract-getter-overr }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -6807,6 +6818,7 @@ exports[`resolveDescriptors should resolve descriptors for contract-getter-overr }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -6999,6 +7011,7 @@ exports[`resolveDescriptors should resolve descriptors for contract-getter-overr }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -7555,6 +7568,7 @@ exports[`resolveDescriptors should resolve descriptors for dump 1`] = ` "ret": [], }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -7659,6 +7673,7 @@ exports[`resolveDescriptors should resolve descriptors for dump 1`] = ` "ret": [], }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -8710,6 +8725,7 @@ exports[`resolveDescriptors should resolve descriptors for dump 1`] = ` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -8840,6 +8856,7 @@ exports[`resolveDescriptors should resolve descriptors for dump 2`] = ` "ret": [], }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -8873,6 +8890,7 @@ exports[`resolveDescriptors should resolve descriptors for dump 2`] = ` "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -8925,6 +8943,7 @@ exports[`resolveDescriptors should resolve descriptors for dump 2`] = ` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -9047,6 +9066,7 @@ exports[`resolveDescriptors should resolve descriptors for fun-extends-opt-self }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -9167,6 +9187,7 @@ exports[`resolveDescriptors should resolve descriptors for fun-extends-opt-self }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -9292,6 +9313,7 @@ exports[`resolveDescriptors should resolve descriptors for fun-extends-opt-self }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -9417,6 +9439,7 @@ exports[`resolveDescriptors should resolve descriptors for fun-extends-opt-self }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -9545,6 +9568,7 @@ exports[`resolveDescriptors should resolve descriptors for fun-extends-opt-self }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -9679,6 +9703,7 @@ exports[`resolveDescriptors should resolve descriptors for fun-extends-opt-self }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -10040,6 +10065,7 @@ exports[`resolveDescriptors should resolve descriptors for init-vars-analysis-un "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -10077,6 +10103,7 @@ exports[`resolveDescriptors should resolve descriptors for init-vars-analysis-un "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -10302,6 +10329,7 @@ exports[`resolveDescriptors should resolve descriptors for item-funs-with-errors }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -10350,6 +10378,7 @@ exports[`resolveDescriptors should resolve descriptors for item-funs-with-errors }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -10433,6 +10462,7 @@ exports[`resolveDescriptors should resolve descriptors for item-funs-with-errors }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -10948,6 +10978,7 @@ exports[`resolveDescriptors should resolve descriptors for item-funs-with-errors }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -11012,6 +11043,7 @@ exports[`resolveDescriptors should resolve descriptors for item-funs-with-errors }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -11256,6 +11288,7 @@ exports[`resolveDescriptors should resolve descriptors for item-method 1`] = ` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -11510,6 +11543,7 @@ native sample(a: Int): Int;, "text": "Int", }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -11620,6 +11654,7 @@ mutates extends native inc(self: Int): Int;, "text": "Int", }, }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -12405,6 +12440,7 @@ exports[`resolveDescriptors should resolve descriptors for map-value-as-coins 1` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -13527,6 +13563,7 @@ exports[`resolveDescriptors should resolve descriptors for map-value-as-varint 1 }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -13790,6 +13827,7 @@ exports[`resolveDescriptors should resolve descriptors for map-value-as-varint 1 }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -14920,6 +14958,7 @@ exports[`resolveDescriptors should resolve descriptors for map-value-as-varuint }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -15183,6 +15222,7 @@ exports[`resolveDescriptors should resolve descriptors for map-value-as-varuint }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -16166,6 +16206,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -16264,6 +16305,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -16393,6 +16435,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -16494,6 +16537,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -16623,6 +16667,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -16731,6 +16776,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -16870,6 +16916,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -16999,6 +17046,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -17133,6 +17181,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -17231,6 +17280,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -17360,6 +17410,7 @@ exports[`resolveDescriptors should resolve descriptors for multi-inheritance-wit }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -17637,6 +17688,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -17841,6 +17893,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -18040,6 +18093,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -18253,6 +18307,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -18528,6 +18583,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -18727,6 +18783,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -18931,6 +18988,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -19157,6 +19215,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs "text": "Int", }, }, + "effects": Set {}, "isAbstract": true, "isGetter": false, "isInline": false, @@ -19220,6 +19279,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -19392,6 +19452,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -19439,6 +19500,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs "text": "Int", }, }, + "effects": Set {}, "isAbstract": true, "isGetter": false, "isInline": false, @@ -19590,6 +19652,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs "text": "Int", }, }, + "effects": Set {}, "isAbstract": true, "isGetter": false, "isInline": false, @@ -19653,6 +19716,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -19850,6 +19914,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -19924,6 +19989,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -20169,6 +20235,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -20216,6 +20283,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs "text": "Int", }, }, + "effects": Set {}, "isAbstract": true, "isGetter": false, "isInline": false, @@ -20367,6 +20435,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs "text": "Int", }, }, + "effects": Set {}, "isAbstract": true, "isGetter": false, "isInline": false, @@ -20430,6 +20499,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -20586,6 +20656,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs "text": "Int", }, }, + "effects": Set {}, "isAbstract": true, "isGetter": false, "isInline": false, @@ -20649,6 +20720,7 @@ exports[`resolveDescriptors should resolve descriptors for nested-trait-with-abs }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -22669,6 +22741,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-abstract "params": [], "return": undefined, }, + "effects": Set {}, "isAbstract": true, "isGetter": false, "isInline": false, @@ -22775,6 +22848,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-abstract "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -22870,6 +22944,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-abstract "params": [], "return": undefined, }, + "effects": Set {}, "isAbstract": true, "isGetter": false, "isInline": false, @@ -30495,6 +30570,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -30601,6 +30677,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -30698,6 +30775,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -30807,6 +30885,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -30913,6 +30992,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -31010,6 +31090,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -31185,6 +31266,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -31298,6 +31380,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -31473,6 +31556,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -31582,6 +31666,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -31669,6 +31754,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -31756,6 +31842,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -31869,6 +31956,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -31904,6 +31992,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -31939,6 +32028,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -32048,6 +32138,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -32135,6 +32226,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -32222,6 +32314,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -32364,6 +32457,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -32471,6 +32565,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -32613,6 +32708,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -32722,6 +32818,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -32822,6 +32919,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -32931,6 +33029,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -33071,6 +33170,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -33153,6 +33253,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -33248,6 +33349,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -33333,6 +33435,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -33413,6 +33516,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -33508,6 +33612,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -33608,6 +33713,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -33718,6 +33824,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -33843,6 +33950,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -33923,6 +34031,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -34018,6 +34127,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -34118,6 +34228,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -34203,6 +34314,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -34298,6 +34410,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -34398,6 +34511,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -34578,6 +34692,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -34694,6 +34809,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -34796,6 +34912,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -34973,6 +35090,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -35098,6 +35216,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -35200,6 +35319,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -35374,6 +35494,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -35583,6 +35704,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -35677,6 +35799,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -35718,6 +35841,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -35815,6 +35939,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -35912,6 +36037,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -35953,6 +36079,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36050,6 +36177,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36165,6 +36293,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36200,6 +36329,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36235,6 +36365,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36327,6 +36458,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36368,6 +36500,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36465,6 +36598,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36567,6 +36701,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36661,6 +36796,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36702,6 +36838,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36799,6 +36936,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -36977,6 +37115,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37089,6 +37228,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37219,6 +37359,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37328,6 +37469,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37422,6 +37564,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37463,6 +37606,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37560,6 +37704,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37650,6 +37795,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37762,6 +37908,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37797,6 +37944,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37832,6 +37980,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37924,6 +38073,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -37965,6 +38115,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -38062,6 +38213,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -38164,6 +38316,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -38251,6 +38404,7 @@ exports[`resolveDescriptors should resolve descriptors for override-for-virtual- "return": undefined, "statements": [], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -38632,6 +38786,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, }, }, + "effects": Set {}, "isAbstract": true, "isGetter": true, "isInline": false, @@ -38700,6 +38855,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, }, }, + "effects": Set {}, "isAbstract": true, "isGetter": true, "isInline": false, @@ -38768,6 +38924,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, }, }, + "effects": Set {}, "isAbstract": true, "isGetter": true, "isInline": false, @@ -38841,6 +38998,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, }, }, + "effects": Set {}, "isAbstract": true, "isGetter": true, "isInline": false, @@ -39284,6 +39442,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -39373,6 +39532,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -39472,6 +39632,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -39566,6 +39727,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": true, "isInline": false, @@ -39935,6 +40097,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, }, }, + "effects": Set {}, "isAbstract": true, "isGetter": true, "isInline": false, @@ -40003,6 +40166,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, }, }, + "effects": Set {}, "isAbstract": true, "isGetter": true, "isInline": false, @@ -40071,6 +40235,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, }, }, + "effects": Set {}, "isAbstract": true, "isGetter": true, "isInline": false, @@ -40144,6 +40309,7 @@ exports[`resolveDescriptors should resolve descriptors for override-fun-map-valu }, }, }, + "effects": Set {}, "isAbstract": true, "isGetter": true, "isInline": false, @@ -40451,6 +40617,7 @@ exports[`resolveDescriptors should resolve descriptors for scope-loops 2`] = ` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -40551,6 +40718,7 @@ exports[`resolveDescriptors should resolve descriptors for scope-loops 2`] = ` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -40650,6 +40818,7 @@ exports[`resolveDescriptors should resolve descriptors for scope-loops 2`] = ` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -40750,6 +40919,7 @@ exports[`resolveDescriptors should resolve descriptors for scope-loops 2`] = ` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -42964,6 +43134,7 @@ exports[`resolveDescriptors should resolve descriptors for trait-foreach 1`] = ` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -43167,6 +43338,7 @@ exports[`resolveDescriptors should resolve descriptors for trait-foreach 1`] = ` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -43456,6 +43628,7 @@ exports[`resolveDescriptors should resolve descriptors for trait-foreach 1`] = ` }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -46573,6 +46746,7 @@ exports[`resolveDescriptors should resolve descriptors for wildcard-function-par }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -46917,6 +47091,7 @@ exports[`resolveDescriptors should resolve descriptors for wildcard-function-par }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -47239,6 +47414,7 @@ exports[`resolveDescriptors should resolve descriptors for wildcard-function-par }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, @@ -47524,6 +47700,7 @@ exports[`resolveDescriptors should resolve descriptors for wildcard-function-par }, ], }, + "effects": Set {}, "isAbstract": false, "isGetter": false, "isInline": false, diff --git a/src/types/effects.ts b/src/types/effects.ts index 7521109ce0..4fd2b4b6db 100644 --- a/src/types/effects.ts +++ b/src/types/effects.ts @@ -23,6 +23,24 @@ export function computeReceiversEffects(ctx: CompilerContext) { } } +export function computeGettersEffects(ctx: CompilerContext) { + for (const type of getAllTypes(ctx)) { + if (type.kind === "contract") { + for (const [, getter] of type.functions) { + if (!getter.isGetter) continue; + + if (getter.ast.kind === "function_def") { + getter.effects = statementListEffects( + getter.ast.statements, + new Set(), + ctx, + ); + } + } + } + } +} + function statementListEffects( statements: readonly Ast.Statement[], processedContractMethods: ReadonlySet, @@ -174,6 +192,18 @@ function expressionEffects( ): ReadonlySet { switch (expr.kind) { case "id": { + if (expr.text === "self") { + // Conservative approach: any method call like `10.foo()` will be considered as storage read + // since any use of `self` inside method will end up in this branch. + // We need this because one can write code like this: + // ``` + // get fun bar(): Foo { + // let a = self; + // return a; + // } + // ``` + return new Set(["contractStorageRead"]); + } return new Set(); } case "field_access": { @@ -213,8 +243,7 @@ function expressionEffects( case "address": case "cell": case "struct_value": - case "map_value": - case "code_of": { + case "map_value": { return new Set(); } case "op_binary": { @@ -255,7 +284,15 @@ function expressionEffects( ); return unionAll([conditionEffects, thenEffects, elseEffects]); } - case "init_of": + case "code_of": + case "init_of": { + // In case of recursive contracts, their code is put into a global variable (`tact_child_contract_codes`) + // which is initialized in `*$contract_load` function. If we assume that there are no effects here, + // then there may be a situation when there is no value in the global variable with contract codes. + // And because of this, `initOf` in the getter fails when it tries to parse the value of this global + // variable which is null. + return new Set(["contractStorageRead"]); + } case "static_call": { // global (static) functions cannot change contract storage because of the call-by-value semantics, so we don't analyze their bodies return mapUnionAll(expr.args, (arg) => diff --git a/src/types/resolveDescriptors.ts b/src/types/resolveDescriptors.ts index aeaef60d01..6ce0a27e58 100644 --- a/src/types/resolveDescriptors.ts +++ b/src/types/resolveDescriptors.ts @@ -1139,6 +1139,7 @@ export function resolveDescriptors(ctx: CompilerContext, Ast: FactoryAst) { return { name: idText(a.name), self: self, + effects: new Set(), origin, params, returns, diff --git a/src/types/types.ts b/src/types/types.ts index 477157aa64..94dfcb49f5 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -95,6 +95,7 @@ export type FunctionDescription = { isAbstract: boolean; isInline: boolean; self: TypeRef | null; + effects: ReadonlySet; returns: TypeRef; params: FunctionParameter[]; ast: