The function call interface has been firmed up significantly.
00168 ; 00004 print(x + 1, y + 2, z)
02A5 AD 1721 [4] 00169 lda _print
02A8 0D 1722 [4] 00170 ora _print+1
02AB D0 0B (02B8) [2/3] 00171 bne L00002
00172
02AD A9 21 [2] 00173 lda #_print&$FF
02AF 85 3A [3] 00174 sta Var
02B1 A9 17 [2] 00175 lda #_print>>8
02B3 85 3B [3] 00176 sta Var+1
02B5 20 16C0 [6] 00177 jsr Undef
00178
02B8 00179 L00002
02B8 AE 172A [4] 00180 ldx _x
02BB 8A [2] 00181 txa
02BC 0D 172B [4] 00182 ora _x+1
02BF D0 0B (02CC) [2/3] 00183 bne L00003
00184
02C1 A9 2A [2] 00185 lda #_x&$FF
02C3 85 3A [3] 00186 sta Var
02C5 A9 17 [2] 00187 lda #_x>>8
02C7 85 3B [3] 00188 sta Var+1
02C9 20 16C0 [6] 00189 jsr Undef
00190
02CC 00191 L00003
02CC AD 172B [4] 00192 lda _x+1
02CF 86 14 [3] 00193 stx Ptr0
02D1 85 15 [3] 00194 sta Ptr0+1
02D3 A2 1B [2] 00195 ldx #I_00001&$FF
02D5 A9 17 [2] 00196 lda #I_00001>>8
02D7 86 16 [3] 00197 stx Ptr1
02D9 85 17 [3] 00198 sta Ptr1+1
02DB 20 0ADA [6] 00199 jsr int.__add__
02DE 48 [3] 00200 pha
02DF 8A [2] 00201 txa
02E0 48 [3] 00202 pha
02E1 AE 172F [4] 00203 ldx _y
02E4 8A [2] 00204 txa
02E5 0D 1730 [4] 00205 ora _y+1
02E8 D0 0B (02F5) [2/3] 00206 bne L00004
00207
02EA A9 2F [2] 00208 lda #_y&$FF
02EC 85 3A [3] 00209 sta Var
02EE A9 17 [2] 00210 lda #_y>>8
02F0 85 3B [3] 00211 sta Var+1
02F2 20 16C0 [6] 00212 jsr Undef
00213
02F5 00214 L00004
02F5 AD 1730 [4] 00215 lda _y+1
02F8 86 14 [3] 00216 stx Ptr0
02FA 85 15 [3] 00217 sta Ptr0+1
02FC A2 19 [2] 00218 ldx #I_00002&$FF
02FE A9 17 [2] 00219 lda #I_00002>>8
0300 86 16 [3] 00220 stx Ptr1
0302 85 17 [3] 00221 sta Ptr1+1
0304 20 0ADA [6] 00222 jsr int.__add__
0307 48 [3] 00223 pha
0308 8A [2] 00224 txa
0309 48 [3] 00225 pha
030A A9 08 [2] 00226 lda #8
030C 85 06 [3] 00227 sta Int0
030E A9 00 [2] 00228 lda #0
0310 85 07 [3] 00229 sta Int0+1
0312 20 0515 [6] 00230 jsr Alloc
0315 A5 14 [3] 00231 lda Ptr0
0317 85 32 [3] 00232 sta Pargs
0319 A5 15 [3] 00233 lda Ptr0+1
031B 85 33 [3] 00234 sta Pargs+1
031D A0 00 [2] 00235 ldy #0
031F A9 83 [2] 00236 lda #TYPE_TUPLE
0321 91 32 [6] 00237 sta (Pargs),Y
0323 A9 03 [2] 00238 lda #3
0325 C8 [2] 00239 iny
0326 91 32 [6] 00240 sta (Pargs),Y
0328 A9 02 [2] 00241 lda #2
032A 85 06 [3] 00242 sta Int0
032C A9 00 [2] 00243 lda #0
032E 85 07 [3] 00244 sta Int0+1
0330 20 0515 [6] 00245 jsr Alloc
0333 A5 14 [3] 00246 lda Ptr0
0335 85 34 [3] 00247 sta Kargs
0337 A5 15 [3] 00248 lda Ptr0+1
0339 85 35 [3] 00249 sta Kargs+1
033B A0 00 [2] 00250 ldy #0
033D A9 85 [2] 00251 lda #TYPE_DICT
033F 91 34 [6] 00252 sta (Kargs),Y
0341 A9 00 [2] 00253 lda #0
0343 C8 [2] 00254 iny
0344 91 34 [6] 00255 sta (Kargs),Y
0346 A9 01 [2] 00256 lda #1
0348 85 03 [3] 00257 sta Byt1
034A A0 07 [2] 00258 ldy #7
034C AE 1734 [4] 00259 ldx _z
034F 8A [2] 00260 txa
0350 0D 1735 [4] 00261 ora _z+1
0353 D0 0B (0360) [2/3] 00262 bne L00005
00263
0355 A9 34 [2] 00264 lda #_z&$FF
0357 85 3A [3] 00265 sta Var
0359 A9 17 [2] 00266 lda #_z>>8
035B 85 3B [3] 00267 sta Var+1
035D 20 16C0 [6] 00268 jsr Undef
00269
0360 00270 L00005
0360 AD 1735 [4] 00271 lda _z+1
0363 91 32 [6] 00272 sta (Pargs),Y
0365 8A [2] 00273 txa
0366 88 [2] 00274 dey
0367 91 32 [6] 00275 sta (Pargs),Y
0369 88 [2] 00276 dey
036A 68 [4] 00277 pla
036B AA [2] 00278 tax
036C 68 [4] 00279 pla
036D 91 32 [6] 00280 sta (Pargs),Y
036F 8A [2] 00281 txa
0370 88 [2] 00282 dey
0371 91 32 [6] 00283 sta (Pargs),Y
0373 88 [2] 00284 dey
0374 68 [4] 00285 pla
0375 AA [2] 00286 tax
0376 68 [4] 00287 pla
0377 91 32 [6] 00288 sta (Pargs),Y
0379 8A [2] 00289 txa
037A 88 [2] 00290 dey
037B 91 32 [6] 00291 sta (Pargs),Y
037D AE 1721 [4] 00292 ldx _print
0380 AD 1722 [4] 00293 lda _print+1
0383 20 0A7E [6] 00294 jsr Call
0386 A0 04 [2] 00295 ldy #4
0388 B1 32 [5/6] 00296 lda (Pargs),Y
038A AA [2] 00297 tax
038B C8 [2] 00298 iny
038C B1 32 [5/6] 00299 lda (Pargs),Y
038E 20 05BF [6] 00300 jsr Deref
0391 A0 02 [2] 00301 ldy #2
0393 B1 32 [5/6] 00302 lda (Pargs),Y
0395 AA [2] 00303 tax
0396 C8 [2] 00304 iny
0397 B1 32 [5/6] 00305 lda (Pargs),Y
0399 20 05BF [6] 00306 jsr Deref
039C A5 32 [3] 00307 lda Pargs
039E 85 14 [3] 00308 sta Ptr0
03A0 A5 33 [3] 00309 lda Pargs+1
03A2 85 15 [3] 00310 sta Ptr0+1
03A4 20 05E9 [6] 00311 jsr Free
03A7 A5 34 [3] 00312 lda Kargs
03A9 85 14 [3] 00313 sta Ptr0
03AB A5 35 [3] 00314 lda Kargs+1
03AD 85 15 [3] 00315 sta Ptr0+1
03AF 20 05E9 [6] 00316 jsr Free
Variables (including “print”) are nothing more than a reference to an object. Hence the checks everywhere for whether they are defined.
Some of the ABI has been tightened up to reduce the amount of inline code generated by the compiler. Further savings can be gained by factoring subroutines out of what is left.
Because of dynamic typing, the entire context of a function call must be captured. The most straightforward way of doing this is by creating a tuple of the positional arguments and a dictionary of the keyword arguments. It is up to the called function to determine what is legal and what is in error.
The calls to free Pargs and Kargs used to be in Call, but had to be broken out because these two objects keep track of objects resulting from argument expression evaluation (which need to be reclaimed.)