mirror of
https://github.com/janet-lang/janet
synced 2024-06-24 06:03:17 +00:00
![Calvin Rose](/assets/img/avatar_default.png)
This should speed up start time and reduce malloc/free usage to about 15% of what is what previously for startup. The current cost is slightly larger binary as the representaion of the image is currently less compact than source code.
41 lines
1.9 KiB
Clojure
41 lines
1.9 KiB
Clojure
# Copyright (C) Calvin Rose 2019
|
|
|
|
# The bootstrap script is used to produce the source file for
|
|
# embedding the core image.
|
|
|
|
# Tool to dump a marshalled version of the janet core to stdout. The
|
|
# image should eventually allow janet to be started from a pre-compiled
|
|
# image rather than recompiled every time from the embedded source. More
|
|
# work will go into shrinking the image (it isn't currently that large but
|
|
# could be smaller), creating the mechanism to load the image, and modifying
|
|
# the build process to compile janet with a built image rather than
|
|
# embedded source.
|
|
|
|
# Get image. This image contains as much of the core library and documentation that
|
|
# can be written to an image (no cfunctions, no abstracts (stdout, stdin, stderr)),
|
|
# everything else goes. Cfunctions and abstracts will be referenced from a registry
|
|
# table which will be generated on janet startup.
|
|
(do
|
|
(def image (let [env-pairs (pairs (env-lookup *env*))
|
|
essential-pairs (filter (fn [[k v]] (or (cfunction? v) (abstract? v))) env-pairs)
|
|
lookup (table ;(mapcat identity essential-pairs))
|
|
reverse-lookup (invert lookup)]
|
|
(marshal *env* reverse-lookup)))
|
|
|
|
# Create C source file that contains images a uint8_t buffer. This
|
|
# can be compiled and linked statically into the main janet library
|
|
# and example client.
|
|
(def chunks (seq [b :in image] (string b)))
|
|
(def image-file (file/open "build/core_image.c" :w))
|
|
(file/write image-file
|
|
"#include <janet/janet.h>\n"
|
|
"static const unsigned char janet_core_image_bytes[] = {")
|
|
(loop [line :in (partition 16 chunks)]
|
|
(def str (string ;(interpose ", " line)))
|
|
(file/write image-file str ",\n"))
|
|
(file/write image-file
|
|
"0};\n\n"
|
|
"const unsigned char *janet_core_image = janet_core_image_bytes;\n"
|
|
"size_t janet_core_image_size = sizeof(janet_core_image_bytes);\n")
|
|
(file/close image-file))
|