Skip to content

Commit 32f5012

Browse files
authored
feat: remove dictpush from args (#19)
1 parent d6118b2 commit 32f5012

File tree

5 files changed

+46
-74
lines changed

5 files changed

+46
-74
lines changed

src/generator/gen-constructors.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,26 +101,23 @@ const generateOpcode = (name: string, instruction: $.Opcode): t.Statement[] => {
101101
}
102102

103103
const generateArgs = (args: $.args): CompiledArgs => {
104-
switch (args.$) {
105-
case "simpleArgs":
106-
return generateSimpleArgs(args)
107-
case "dictpush":
108-
return generateDictpush(args)
104+
if (args.length === 2 && args[0]?.$ === "dict") {
105+
return generateDictpush()
109106
}
110107

111-
throw new Error("Unexpected arg type")
108+
return generateSimpleArgs(args)
112109
}
113110

114-
const generateDictpush = (_args: $.dictpush): CompiledArgs => {
111+
const generateDictpush = (): CompiledArgs => {
115112
return [
116113
// TODO: rename parameters
117114
["arg0", t.tsNumberKeyword()],
118115
["arg1", t.tsTypeReference(t.tsQualifiedName(UTIL_QUALIFIER, t.identifier("Dict")))],
119116
]
120117
}
121118

122-
const generateSimpleArgs = (args: $.simpleArgs): CompiledArgs => {
123-
return args.children.map((arg, index) => [`arg${index}`, generateArg(arg)])
119+
const generateSimpleArgs = (args: $.args): CompiledArgs => {
120+
return args.map((arg, index) => [`arg${index}`, generateArg(arg)])
124121
}
125122

126123
const generateArg = (arg: $.arg): t.TSType => {
@@ -151,6 +148,8 @@ const generateArg = (arg: $.arg): t.TSType => {
151148
return t.tsTypeReference(t.tsQualifiedName(TON_CORE_QUALIFIER, t.identifier("Slice")))
152149
case "exoticCell":
153150
return t.tsTypeReference(t.tsQualifiedName(UTIL_QUALIFIER, t.identifier("ExoticCell")))
151+
case "dict":
152+
throw new Error("Must be handled in Args")
154153
}
155154

156155
throw new Error("Unexpected arg type")

src/generator/gen-converter.ts

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ function generateConvertorFunction(
143143
}
144144

145145
function generateBody(name: string, instruction: $.Opcode) {
146-
const len = argsLen(instruction.args)
146+
const len = instruction.args.length
147147

148148
const argsConst = t.variableDeclaration("const", [
149149
t.variableDeclarator(
@@ -198,17 +198,6 @@ function generateBody(name: string, instruction: $.Opcode) {
198198
return t.blockStatement([argsConst, lenCheck, ...argsStatements])
199199
}
200200

201-
const argsLen = (args: $.args): number => {
202-
switch (args.$) {
203-
case "simpleArgs":
204-
return args.children.length
205-
case "dictpush":
206-
return 2
207-
}
208-
209-
throw new Error("Unexpected arg type")
210-
}
211-
212201
function isIntegerArg(arg: $.arg) {
213202
return (
214203
arg.$ === "int" ||
@@ -283,7 +272,7 @@ function returnThreeArgInstr(name: string) {
283272
)
284273
}
285274

286-
const generateSimpleArgs = (name: string, args: $.arg[]): t.Statement[] => {
275+
const generateSimpleArgs = (name: string, args: $.args): t.Statement[] => {
287276
if (args.length === 0) {
288277
return [
289278
t.returnStatement(
@@ -401,14 +390,11 @@ const generateDictpush = (name: string): t.Statement[] => {
401390
}
402391

403392
const generateArgs = (name: string, args: $.args): t.Statement[] => {
404-
switch (args.$) {
405-
case "simpleArgs":
406-
return generateSimpleArgs(name, args.children)
407-
case "dictpush":
408-
return generateDictpush(name)
393+
if (args.length === 2 && args[0]?.$ === "dict") {
394+
return generateDictpush(name)
409395
}
410396

411-
throw new Error("Unexpected arg type")
397+
return generateSimpleArgs(name, args)
412398
}
413399

414400
const generateInstr = (name: string, instruction: $.Opcode): t.Statement[] => {

src/generator/gen-printer.ts

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ function generatePrintFunction(
6161
}
6262

6363
const args = opcode.args
64-
const countArgs = argsLen(args)
64+
const countArgs = args.length
6565

6666
const statements: t.Statement[] = []
6767

@@ -75,7 +75,7 @@ function generatePrintFunction(
7575
}),
7676
...fiftInstructions.flatMap(([name, opcode]) => {
7777
const args = opcode.args
78-
const countArgs = argsLen(args)
78+
const countArgs = args.length
7979

8080
const statements: t.Statement[] = []
8181

@@ -109,18 +109,7 @@ function generatePrintFunction(
109109
)
110110
}
111111

112-
const argsLen = (args: $.args): number => {
113-
switch (args.$) {
114-
case "simpleArgs":
115-
return args.children.length
116-
case "dictpush":
117-
return 2
118-
}
119-
120-
throw new Error("Unexpected arg type")
121-
}
122-
123-
const generateSimpleArgs = (args: $.arg[]): t.Statement[] => {
112+
const generateSimpleArgs = (args: $.args): t.Statement[] => {
124113
return args.flatMap((arg, index) => {
125114
const stmt = generateArg(`arg${index}`, arg)
126115
if (index !== args.length - 1) {
@@ -192,6 +181,8 @@ const generateArg = (name: string, arg: $.arg): t.Statement[] => {
192181
),
193182
),
194183
]
184+
case "dict":
185+
throw new Error("Must be handled in Args")
195186
}
196187

197188
throw new Error("Unexpected arg type")
@@ -214,14 +205,11 @@ const generateDictpush = (): t.Statement[] => {
214205
}
215206

216207
const generateArgs = (args: $.args): t.Statement[] => {
217-
switch (args.$) {
218-
case "simpleArgs":
219-
return generateSimpleArgs(args.children)
220-
case "dictpush":
221-
return generateDictpush()
208+
if (args.length === 2 && args[0]?.$ === "dict") {
209+
return generateDictpush()
222210
}
223211

224-
throw new Error("Unexpected arg type")
212+
return generateSimpleArgs(args)
225213
}
226214

227215
function writeAppend(val: string) {

src/generator/gen-types.ts

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -160,30 +160,24 @@ const generateOpcode = (name: string, instruction: $.Opcode): t.Statement[] => {
160160
}
161161

162162
const generateLoadArgs = (args: $.args): (t.Expression | t.SpreadElement)[] => {
163-
switch (args.$) {
164-
case "simpleArgs":
165-
return generateSimpleArgs(args).map(arg => wrapIntoLoad(arg))
166-
case "dictpush":
167-
return generateDictpush(args).map(arg => t.spreadElement(wrapIntoLoad(arg)))
163+
if (args.length === 2 && args[0]?.$ === "dict") {
164+
return generateDictpush().map(arg => t.spreadElement(wrapIntoLoad(arg)))
168165
}
169166

170-
throw new Error("Unexpected arg type")
167+
return generateArgs(args).map(arg => wrapIntoLoad(arg))
171168
}
172169

173170
const generateStoreArgs = (args: $.args): t.Statement[] => {
174-
switch (args.$) {
175-
case "simpleArgs":
176-
return generateSimpleArgs(args).map((arg, index) => wrapIntoStore(`arg${index}`, arg))
177-
case "dictpush":
178-
return [
179-
wrapIntoArrayStore(
180-
["arg0", "arg1"],
181-
t.memberExpression(UTIL_QUALIFIER, t.identifier("dictpush")),
182-
),
183-
]
171+
if (args.length === 2 && args[0]?.$ === "dict") {
172+
return [
173+
wrapIntoArrayStore(
174+
["arg0", "arg1"],
175+
t.memberExpression(UTIL_QUALIFIER, t.identifier("dictpush")),
176+
),
177+
]
184178
}
185179

186-
throw new Error("Unexpected arg type")
180+
return generateArgs(args).map((arg, index) => wrapIntoStore(`arg${index}`, arg))
187181
}
188182

189183
// codeSlice(uint(2), uint(7))
@@ -208,12 +202,11 @@ const generateSlice = (args: $.slice): t.Expression => {
208202
])
209203
}
210204

211-
const generateDictpush = (_args: $.dictpush): t.Expression[] => {
205+
const generateDictpush = (): t.Expression[] => {
212206
return [t.memberExpression(UTIL_QUALIFIER, t.identifier("dictpush"))]
213207
}
214208

215-
const generateSimpleArgs = (args: $.simpleArgs): t.Expression[] =>
216-
args.children.map(arg => generateArg(arg))
209+
const generateArgs = (args: $.args): t.Expression[] => args.map(arg => generateArg(arg))
217210

218211
function generateTypeDescription(name: string, arg: number) {
219212
return t.callExpression(t.memberExpression(UTIL_QUALIFIER, t.identifier(name)), [
@@ -263,6 +256,8 @@ const generateArg = (arg: $.arg): t.Expression => {
263256
return generateInlineCodeSlice(arg)
264257
case "slice":
265258
return generateSlice(arg)
259+
case "dict":
260+
throw new Error("Must be handled in Args")
266261
}
267262

268263
throw new Error("Unexpected arg type")

src/generator/instructions.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export type arg =
1414
| codeSlice
1515
| refCodeSlice
1616
| inlineCodeSlice
17+
| dict
1718
| exoticCell
1819
| debugstr
1920

@@ -64,10 +65,8 @@ export const minusOne: minusOne = {$: "minusOne"}
6465
export type setcpArg = {$: "setcpArg", range: range}
6566
export const setcpArg: setcpArg = {$: "setcpArg", range: range(-15n, 239n)}
6667

67-
export type args = simpleArgs | dictpush
68-
69-
export type simpleArgs = {$: "simpleArgs", children: arg[]}
70-
export const seq = (...args: arg[]): simpleArgs => ({$: "simpleArgs", children: args})
68+
export type args = arg[]
69+
export const seq = (...args: arg[]): args => args
7170

7271
export type codeSlice = {$: "codeSlice", refs: arg, bits: arg}
7372
export const codeSlice = (refs: arg, bits: arg): codeSlice => ({$: "codeSlice", refs, bits})
@@ -81,6 +80,9 @@ export const refCodeSlice: refCodeSlice = {$: "refCodeSlice"}
8180
export type slice = {$: "slice", refs: arg, bits: arg, pad: number}
8281
export const slice = (refs: arg, bits: arg, pad: number): slice => ({$: "slice", refs, bits, pad})
8382

83+
export type dict = {$: "dict"}
84+
export const dict: dict = {$: "dict"}
85+
8486
export type exoticCell = {$: "exoticCell"}
8587
export const exoticCell: exoticCell = {$: "exoticCell"}
8688

@@ -350,6 +352,7 @@ const uint3range = range(0n, BigInt(Math.pow(2, 3) - 1))
350352
const uint5range = range(0n, BigInt(Math.pow(2, 5) - 1))
351353
const uint6range = range(0n, BigInt(Math.pow(2, 6) - 1))
352354
const uint7range = range(0n, BigInt(Math.pow(2, 7) - 1))
355+
const uint10range = range(0n, BigInt(Math.pow(2, 10) - 1))
353356
const uint11range = range(0n, BigInt(Math.pow(2, 11) - 1))
354357
const uint14range = range(0n, BigInt(Math.pow(2, 14) - 1))
355358

@@ -364,6 +367,7 @@ const uint5 = uint(5, uint5range)
364367
const uint6 = uint(6, uint6range)
365368
const uint7 = uint(7, uint7range)
366369
const uint8 = uint(8, uint8range)
370+
const uint10 = uint(10, uint10range)
367371
const uint11 = uint(11, uint11range)
368372
const uint14 = uint(14, uint14range)
369373
const hash = uint(8, {min: 0n, max: 4n})
@@ -1145,8 +1149,8 @@ export const instructions: Record<string, Opcode> = {
11451149
IFNBITJMPREF: effects(cat("continuation_cond_loop", mkext((0xe3c >> 1) | 0b1, 11, 5, seq(uint5, refCodeSlice), `exec_if_bit_jmpref`)), ImplicitJumpRef(), CellLoad()),
11461150
// END SECTION
11471151

1148-
DICTPUSHCONST: cat("dictionary", mkfixedn(0x3d29, 14, 10, dictpush, `exec_push_const_dict`)),
1149-
PFXDICTSWITCH: cat("dictionary", mkfixedn(0xf4ac00 >> 10, 14, 10, dictpush, `exec_const_pfx_dict_switch`)),
1152+
DICTPUSHCONST: cat("dictionary", mkfixedn(0x3d29, 14, 10, seq(dict, uint10), `exec_push_const_dict`)),
1153+
PFXDICTSWITCH: cat("dictionary", mkfixedn(0xf4ac00 >> 10, 14, 10, seq(dict, uint10), `exec_const_pfx_dict_switch`)),
11501154

11511155
// SECTION: sdbegins
11521156
SDBEGINSX: cat("cell_deserialize", mksimple(0xd726, 16, `(_1) => exec_slice_begins_with(_1, false)`)),

0 commit comments

Comments
 (0)