|
403 | 403 | (lambda (x) (eq? x v)) |
404 | 404 | vals)) |
405 | 405 | keynames)) |
406 | | - ;; 1-element list of function's line number node, or empty if none |
407 | | - (lno (if (and (pair? (cdr body)) |
408 | | - (pair? (cadr body)) (eq? (caadr body) 'line)) |
409 | | - (list (cadr body)) |
410 | | - '())) |
411 | | - ;; body statements, minus line number node |
412 | | - (stmts (if (null? lno) (cdr body) (cddr body))) |
| 406 | + ;; list of function's initial line number and meta nodes (empty if none) |
| 407 | + (prologue (extract-method-prologue body)) |
| 408 | + ;; body statements |
| 409 | + (stmts (cdr body)) |
413 | 410 | (positional-sparams |
414 | 411 | (filter (lambda (s) |
415 | 412 | (let ((name (if (symbol? s) s (cadr s)))) |
|
434 | 431 | ,(method-def-expr- |
435 | 432 | name positional-sparams (append pargl vararg) |
436 | 433 | `(block |
437 | | - ,@lno |
| 434 | + ,@prologue |
438 | 435 | ,@(if (not ordered-defaults) |
439 | 436 | '() |
440 | 437 | (append! (map (lambda (kwname) `(local ,kwname)) keynames) |
441 | 438 | (map make-assignment keynames vals))) |
442 | | - ;; call mangled(vals..., [rest_kw ,]pargs..., [vararg]...) |
| 439 | + ;; call mangled(vals..., [rest_kw,] pargs..., [vararg]...) |
443 | 440 | (return (call ,mangled |
444 | 441 | ,@(if ordered-defaults keynames vals) |
445 | 442 | ,@(if (null? restkw) '() (list empty-vector-any)) |
|
463 | 460 | (car not-optional)) |
464 | 461 | ,@(cdr not-optional) ,@vararg) |
465 | 462 | `(block |
466 | | - ,@lno |
467 | 463 | ,@stmts) isstaged rett) |
468 | 464 |
|
469 | 465 | ;; call with unsorted keyword args. this sorts and re-dispatches. |
|
550 | 546 | ,(if (or (not (symbol? name)) (is-call-name? name)) |
551 | 547 | '(null) name))))) |
552 | 548 |
|
| 549 | +;; prologue includes line number node and eventual meta nodes |
| 550 | +(define (extract-method-prologue body) |
| 551 | + (if (pair? body) |
| 552 | + (take-while (lambda (e) |
| 553 | + (and (pair? e) (or (eq? (car e) 'line) (eq? (car e) 'meta)))) |
| 554 | + (cdr body)) |
| 555 | + '())) |
| 556 | + |
553 | 557 | (define (optional-positional-defs name sparams req opt dfl body isstaged overall-argl rett) |
554 | | - ;; prologue includes line number node and eventual meta nodes |
555 | | - (let ((prologue (if (pair? body) |
556 | | - (take-while (lambda (e) |
557 | | - (and (pair? e) (or (eq? (car e) 'line) (eq? (car e) 'meta)))) |
558 | | - (cdr body)) |
559 | | - '()))) |
| 558 | + (let ((prologue (extract-method-prologue body))) |
560 | 559 | `(block |
561 | 560 | ,@(map (lambda (n) |
562 | 561 | (let* ((passed (append req (list-head opt n))) |
|
0 commit comments