|
1358 | 1358 |
|
1359 | 1359 | ;; lower function call containing keyword arguments
|
1360 | 1360 | (define (lower-kw-call f kw pa)
|
1361 |
| - (if (any (lambda (x) (and (pair? x) (eq? (car x) 'parameters))) |
1362 |
| - kw) |
1363 |
| - (error "more than one semicolon in argument list")) |
1364 |
| - (receive |
1365 |
| - (keys restkeys) (separate kwarg? kw) |
1366 |
| - (let ((keyargs (apply append |
1367 |
| - (map (lambda (a) |
1368 |
| - (if (not (symbol? (cadr a))) |
1369 |
| - (error (string "keyword argument is not a symbol: \"" |
1370 |
| - (deparse (cadr a)) "\""))) |
1371 |
| - (if (vararg? (caddr a)) |
1372 |
| - (error "splicing with \"...\" cannot be used for a keyword argument value")) |
1373 |
| - `((quote ,(cadr a)) ,(caddr a))) |
1374 |
| - keys)))) |
1375 |
| - (if (null? restkeys) |
1376 |
| - `(call (call (core kwfunc) ,f) (call (top vector_any) ,@keyargs) ,f ,@pa) |
1377 |
| - (let ((container (make-ssavalue))) |
1378 |
| - `(block |
1379 |
| - (= ,container (call (top vector_any) ,@keyargs)) |
1380 |
| - ,@(map (lambda (rk) |
1381 |
| - (let* ((k (make-ssavalue)) |
1382 |
| - (v (make-ssavalue)) |
1383 |
| - (push-expr `(ccall 'jl_array_ptr_1d_push2 Void |
1384 |
| - (tuple Any Any Any) |
1385 |
| - ,container |
1386 |
| - (|::| ,k (core Symbol)) |
1387 |
| - ,v))) |
1388 |
| - (if (vararg? rk) |
1389 |
| - `(for (= (tuple ,k ,v) ,(cadr rk)) |
1390 |
| - ,push-expr) |
1391 |
| - `(block (= (tuple ,k ,v) ,rk) |
1392 |
| - ,push-expr)))) |
1393 |
| - restkeys) |
1394 |
| - ,(if (not (null? keys)) |
1395 |
| - `(call (call (core kwfunc) ,f) ,container ,f ,@pa) |
1396 |
| - (let* ((expr_stmts (remove-argument-side-effects `(call ,f ,@pa))) |
1397 |
| - (pa (cddr (car expr_stmts))) |
1398 |
| - (stmts (cdr expr_stmts))) |
1399 |
| - `(block |
1400 |
| - ,@stmts |
1401 |
| - (if (call (top isempty) ,container) |
1402 |
| - (call ,f ,@pa) |
1403 |
| - (call (call (core kwfunc) ,f) ,container ,f ,@pa))))))))))) |
| 1361 | + (let ((container (make-ssavalue))) |
| 1362 | + (let loop ((kw kw) |
| 1363 | + (initial-kw '()) ;; keyword args before any splats |
| 1364 | + (stmts '()) |
| 1365 | + (has-kw #f)) ;; whether there are definitely >0 kwargs |
| 1366 | + (if (null? kw) |
| 1367 | + (if (null? stmts) |
| 1368 | + `(call (call (core kwfunc) ,f) (call (top vector_any) ,@(reverse initial-kw)) ,f ,@pa) |
| 1369 | + `(block |
| 1370 | + (= ,container (call (top vector_any) ,@(reverse initial-kw))) |
| 1371 | + ,@(reverse stmts) |
| 1372 | + ,(if has-kw |
| 1373 | + `(call (call (core kwfunc) ,f) ,container ,f ,@pa) |
| 1374 | + (let* ((expr_stmts (remove-argument-side-effects `(call ,f ,@pa))) |
| 1375 | + (pa (cddr (car expr_stmts))) |
| 1376 | + (stmts (cdr expr_stmts))) |
| 1377 | + `(block |
| 1378 | + ,@stmts |
| 1379 | + (if (call (top isempty) ,container) |
| 1380 | + (call ,f ,@pa) |
| 1381 | + (call (call (core kwfunc) ,f) ,container ,f ,@pa))))))) |
| 1382 | + (let ((arg (car kw))) |
| 1383 | + (cond ((and (pair? arg) (eq? (car arg) 'parameters)) |
| 1384 | + (error "more than one semicolon in argument list")) |
| 1385 | + ((kwarg? arg) |
| 1386 | + (if (not (symbol? (cadr arg))) |
| 1387 | + (error (string "keyword argument is not a symbol: \"" |
| 1388 | + (deparse (cadr arg)) "\""))) |
| 1389 | + (if (vararg? (caddr arg)) |
| 1390 | + (error "splicing with \"...\" cannot be used for a keyword argument value")) |
| 1391 | + (if (null? stmts) |
| 1392 | + (loop (cdr kw) (list* (caddr arg) `(quote ,(cadr arg)) initial-kw) stmts #t) |
| 1393 | + (loop (cdr kw) initial-kw |
| 1394 | + (cons `(ccall 'jl_array_ptr_1d_push2 Void (tuple Any Any Any) |
| 1395 | + ,container |
| 1396 | + (|::| (quote ,(cadr arg)) (core Symbol)) |
| 1397 | + ,(caddr arg)) |
| 1398 | + stmts) |
| 1399 | + #t))) |
| 1400 | + (else |
| 1401 | + (loop (cdr kw) initial-kw |
| 1402 | + (cons (let* ((k (make-ssavalue)) |
| 1403 | + (v (make-ssavalue)) |
| 1404 | + (push-expr `(ccall 'jl_array_ptr_1d_push2 Void (tuple Any Any Any) |
| 1405 | + ,container |
| 1406 | + (|::| ,k (core Symbol)) |
| 1407 | + ,v))) |
| 1408 | + (if (vararg? arg) |
| 1409 | + `(for (= (tuple ,k ,v) ,(cadr arg)) |
| 1410 | + ,push-expr) |
| 1411 | + `(block (= (tuple ,k ,v) ,arg) |
| 1412 | + ,push-expr))) |
| 1413 | + stmts) |
| 1414 | + (or has-kw (not (vararg? arg))))))))))) |
1404 | 1415 |
|
1405 | 1416 | ;; convert e.g. A'*B to Ac_mul_B(A,B)
|
1406 | 1417 | (define (expand-transposed-op e ops)
|
|
0 commit comments