Lines Matching refs:linklet

1 (library (linklet)
2 (export linklet?
3 compile-linklet
4 expand/optimize-linklet ; for optimization test suite
5 recompile-linklet
6 eval-linklet
7 instantiate-linklet
11 linklet-import-variables
12 linklet-export-variables
13 linklet-fasled-code+arguments ; for tools like `raco decompile`
14 linklet-interpret-jitified? ; for `raco decompile`
15 linklet-interpret-jitified-extract ; for `raco decompile`
27 linklet-virtual-machine-bytes
28 write-linklet-bundle-hash
29 read-linklet-bundle-hash
53 linklet-performance-init! ; not exported to racket
54 linklet-performance-report! ; not exported to racket
56 install-linklet-primitive-tables! ; not exported to racket
125 (define linklet-compilation-mode
132 (define linklet-compilation-limit
133 (and (eq? linklet-compilation-mode 'mach)
142 (define platform-independent-zo-mode? (not (eq? linklet-compilation-mode 'mach)))
223 (include "linklet/check.ss")
224 (include "linklet/version.ss")
225 (include "linklet/write.ss")
226 (include "linklet/read.ss")
227 (include "linklet/annotation.ss")
228 (include "linklet/performance.ss")
306 (define (install-linklet-primitive-tables! . tables)
316 ;; Runs the result of `interpretable-jitified-linklet`
318 (interpret-linklet s))
320 (define (lambda->linklet-lambda s)
322 ;; the compiler from converting functions in the immediate linklet
324 ;; linklet, it's better to create all of the closures on instantiation
330 (compile* (lambda->linklet-lambda s) unsafe?)))
345 [else (compile*-to-bytevector (lambda->linklet-lambda s) quoteds unsafe?)]))
351 [else (cross-compile machine (lambda->linklet-lambda s) quoteds unsafe?)]))
435 ;; A linklet is implemented as a procedure that takes an argument
437 ;; the procedure runs the linklet body.
439 ;; A source linklet has a list of list of imports; those are all
440 ;; flattened into a sequence of arguments for the linklet procedure,
444 ;; exports of an imported linklet are constants).
446 ;; A linklet also has a table of information about its exports. That
448 ;; cross-linklet inlining and related optimizations.
450 (define-record-type linklet
457 name ; name of the linklet (for debugging purposes)
460 (nongenerative #{linklet Zuquy0g9bh5vmeespyap4g-3}))
462 (define (set-linklet-code linklet code preparation)
463 (make-linklet code
464 (linklet-literals linklet)
465 (linklet-format linklet)
467 (linklet-importss-abi linklet)
468 (linklet-exports-info linklet)
469 (linklet-name linklet)
470 (linklet-importss linklet)
471 (linklet-exports linklet)))
473 (define (set-linklet-literals linklet literals)
474 (make-linklet (linklet-code linklet)
476 (linklet-format linklet)
477 (linklet-preparation linklet)
478 (linklet-importss-abi linklet)
479 (linklet-exports-info linklet)
480 (linklet-name linklet)
481 (linklet-importss linklet)
482 (linklet-exports linklet)))
484 (define (set-linklet-preparation linklet preparation)
485 (make-linklet (linklet-code linklet)
486 (linklet-literals linklet)
487 (linklet-format linklet)
489 (linklet-importss-abi linklet)
490 (linklet-exports-info linklet)
491 (linklet-name linklet)
492 (linklet-importss linklet)
493 (linklet-exports linklet)))
495 (define (linklet-pack-exports-info! l)
496 (let ([info (linklet-exports-info l)])
499 (linklet-exports-info-set! l new-info)))))
501 (define (linklet-unpack-exports-info! l)
502 (let ([info (linklet-exports-info l)])
508 (linklet-exports-info-set! l new-info)))))
510 (define compile-linklet
512 [(c) (compile-linklet c #f #f #f '(serializable))]
513 [(c name) (compile-linklet c name #f #f '(serializable))]
514 [(c name import-keys) (compile-linklet c name import-keys #f '(serializable))]
515 … [(c name import-keys get-import) (compile-linklet c name import-keys get-import '(serializable))]
517 (do-compile-linklet 'compile-linklet c name import-keys get-import options #f)]))
519 (define expand/optimize-linklet ; for testing
521 [(c) (do-compile-linklet 'expand/optimize-linklet c #f #f #f '() #t)]
523 (do-compile-linklet 'expand/optimize-linklet c name import-keys get-import options #t)]))
525 (define do-compile-linklet
543 ;; For determinism: a fresh, non-weak cache per linklet
552 (or (eq? linklet-compilation-mode 'jit)
553 (and (eq? linklet-compilation-mode 'mach)
554 (linklet-bigger-than? c linklet-compilation-limit serializable?)
555 … (log-message root-logger 'info 'linklet "compiling only interior functions for large linklet" #f)
559 (and (eq? linklet-compilation-mode 'interp)
563 ;; Convert the linklet S-expression to a `lambda` S-expression:
565 (schemify-linklet (show "linklet" c)
576 ;; Callback to get a specific linklet for a
579 (lambda (key) (lookup-linklet-or-instance get-import key))
588 (jitify-schemified-linklet (case linklet-compilation-mode
592 (or serializable? (eq? linklet-compilation-mode 'jit))
594 (and serializable? (eq? linklet-compilation-mode 'jit))
596 (and (eq? linklet-compilation-mode 'mach)
597 linklet-compilation-limit)
599 (case linklet-compilation-mode
623 linklet-compilation-mode)
627 (interpretable-jitified-linklet impl-lam serializable?)
634 'compile-linklet
635 ;; Create the linklet:
649 (let ([lk (make-linklet code
659 ;; In general, `compile-linklet` is allowed to extend the set
660 ;; of linklet imports if `import-keys` is provided (e.g., for
661 ;; cross-linklet optimization where inlining needs a new
667 (define (lookup-linklet-or-instance get-import key)
668 ;; Use the provided callback to get an linklet for the
674 [(linklet? lnk/inst)
675 (linklet-unpack-exports-info! lnk/inst)
676 (values (linklet-exports-info lnk/inst)
687 (define recompile-linklet
689 [(lnk) (recompile-linklet lnk #f #f #f '(serializable))]
690 [(lnk name) (recompile-linklet lnk name #f #f '(serializable))]
691 [(lnk name import-keys) (recompile-linklet lnk name import-keys #f '(serializable))]
692 …[(lnk name import-keys get-import) (recompile-linklet lnk name import-keys get-import '(serializab…
694 (unless (linklet? lnk)
695 (raise-argument-error 'recompile-linklet "linklet?" lnk))
696 (check-compile-args 'recompile-linklet import-keys get-import options)
701 ;; Intended to speed up reuse of a linklet in exchange for not being
703 (define (eval-linklet linklet)
704 (case (linklet-preparation linklet)
706 (set-linklet-code linklet (linklet-code linklet) 'lazy)]
708 (set-linklet-code linklet
709 (eval-from-bytevector (linklet-code linklet)
710 (extract-literals (linklet-literals linklet))
711 (linklet-format linklet))
716 "eval-linklet: cannot use unsafe linklet loaded with non-original code inspector"
719 linklet]))
721 (define instantiate-linklet
723 [(linklet import-instances)
724 (instantiate-linklet linklet import-instances #f #f)]
725 [(linklet import-instances target-instance)
726 (instantiate-linklet linklet import-instances target-instance #f)]
727 [(linklet import-instances target-instance use-prompt?)
728 (unless (linklet? linklet)
729 (raise-argument-error 'instantiate-linklet "linklet?" linklet))
735 (raise-argument-error 'instantiate-linklet "(listof instance?)" import-instances))))
739 (raise-argument-error 'instantiate-linklet "(or/c instance? #f)" target-instance))
741 ;; result of the linklet body:
743 linklet-instantiate-key (instance-name target-instance)
748 (values (linklet-preparation linklet)
749 (linklet-code linklet)))])
752 (extract-literals (linklet-literals linklet))
753 (linklet-format linklet))])
755 (when (eq? 'lazy (linklet-preparation linklet))
756 (linklet-code-set! linklet code)
757 (linklet-preparation-set! linklet 'callable))))))
758 ;; Call the linklet:
762 ;; For per-form prompts with in a module linklet,
769 (if (eq? 'callable (linklet-preparation linklet))
770 (linklet-code linklet)
771 (eval-from-bytevector (linklet-code linklet)
772 (extract-literals (linklet-literals linklet))
773 (linklet-format linklet)))
777 (linklet-importss linklet)
778 (linklet-importss-abi linklet)
780 (linklet-exports linklet)))))))))]
783 (let ([i (make-instance (linklet-name linklet))])
784 (instantiate-linklet linklet import-instances i use-prompt?)
787 (define (linklet-import-variables linklet)
788 (unless (linklet? linklet)
789 (raise-argument-error 'linklet-import-variables "linklet?" linklet))
790 (linklet-importss linklet))
792 (define (linklet-export-variables linklet)
793 (unless (linklet? linklet)
794 (raise-argument-error 'linklet-export-variables "linklet?" linklet))
795 (map (lambda (e) (if (pair? e) (car e) e)) (linklet-exports linklet)))
797 (define (linklet-fasled-code+arguments linklet)
798 (unless (linklet? linklet)
799 (raise-argument-error 'linklet-fasled-code+arguments "linklet?" linklet))
800 (case (linklet-preparation linklet)
802 …(values (linklet-format linklet) (linklet-code linklet) (extract-literals (linklet-literals linkle…
805 (define (linklet-interpret-jitified? v)
808 (define (linklet-interpret-jitified-extract v)
810 (raise-argument-error 'linklet-interpret-jitified-extract "linklet-interpret-jitified?" v))
886 ;; Find variables or values needed from an instance for a linklet's
916 (raise-arguments-error 'instantiate-linklet
967 ;; Create the variables needed for a linklet's exports; assumes that
1034 ;; An instance represents the instantiation of a linklet
1214 (include "linklet/cross-compile.ss")
1285 (include "linklet/config.ss"))