mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 15:43:01 +00:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/master' into crazy-brackets
This commit is contained in:
		| @@ -2,6 +2,8 @@ | ||||
| All notable changes to this project will be documented in this file. | ||||
|  | ||||
| ## 0.4.0 - ?? | ||||
| - Add partition function to core library. | ||||
| - Pre-compile core library into an image for faster startup. | ||||
| - Add methods to parser values that mirror the api. | ||||
| - Add janet\_getmethod to CAPI for easier use of method like syntax. | ||||
| - Add get/set to abstract types to allow them to behave more | ||||
|   | ||||
							
								
								
									
										37
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								Makefile
									
									
									
									
									
								
							| @@ -47,7 +47,7 @@ else | ||||
| 	CLIBS:=$(CLIBS) -lrt | ||||
| endif | ||||
|  | ||||
| $(shell mkdir -p build/core build/mainclient build/webclient) | ||||
| $(shell mkdir -p build/core build/mainclient build/webclient build/boot) | ||||
|  | ||||
| # Source headers | ||||
| JANET_HEADERS=$(sort $(wildcard src/include/janet/*.h)) | ||||
| @@ -60,14 +60,33 @@ JANET_WEBCLIENT_SOURCES=$(sort $(wildcard src/webclient/*.c)) | ||||
|  | ||||
| all: $(JANET_TARGET) $(JANET_LIBRARY) | ||||
|  | ||||
| ################################################################## | ||||
| ##### The bootstrap interpreter that compiles the core image ##### | ||||
| ################################################################## | ||||
|  | ||||
| JANET_BOOT_OBJECTS=$(patsubst src/%.c,build/%.boot.o,$(JANET_CORE_SOURCES) src/boot/boot.c) \ | ||||
| 	build/core.gen.o \ | ||||
| 	build/boot.gen.o | ||||
|  | ||||
| build/%.boot.o: src/%.c | ||||
| 	$(CC) $(CFLAGS) -DJANET_BOOTSTRAP -o $@ -c $< | ||||
|  | ||||
| build/janet_boot: $(JANET_BOOT_OBJECTS) | ||||
| 	$(CC) $(CFLAGS) -DJANET_BOOTSTRAP -o $@ $^ $(CLIBS) | ||||
|  | ||||
| # Now the reason we bootstrap in the first place | ||||
| build/core_image.c: build/janet_boot | ||||
| 	build/janet_boot | ||||
|  | ||||
| ########################################################## | ||||
| ##### The main interpreter program and shared object ##### | ||||
| ########################################################## | ||||
|  | ||||
| JANET_CORE_OBJECTS=$(patsubst src/%.c,build/%.o,$(JANET_CORE_SOURCES)) build/core.gen.o | ||||
| JANET_CORE_OBJECTS=$(patsubst src/%.c,build/%.o,$(JANET_CORE_SOURCES)) build/core_image.o | ||||
| JANET_MAINCLIENT_OBJECTS=$(patsubst src/%.c,build/%.o,$(JANET_MAINCLIENT_SOURCES)) build/init.gen.o | ||||
|  | ||||
| %.gen.o: %.gen.c | ||||
| # Compile the core image generated by the bootstrap build | ||||
| build/core_image.o: build/core_image.c $(JANET_HEADERS) $(JANET_LOCAL_HEADERS) | ||||
| 	$(CC) $(CFLAGS) -o $@ -c $< | ||||
|  | ||||
| build/%.o: src/%.c $(JANET_HEADERS) $(JANET_LOCAL_HEADERS) | ||||
| @@ -92,11 +111,14 @@ EMCFLAGS=-std=c99 -Wall -Wextra -Isrc/include -O2 \ | ||||
| JANET_EMTARGET=build/janet.js | ||||
| JANET_WEB_SOURCES=$(JANET_CORE_SOURCES) $(JANET_WEBCLIENT_SOURCES) | ||||
| JANET_EMOBJECTS=$(patsubst src/%.c,build/%.bc,$(JANET_WEB_SOURCES)) \ | ||||
| 				build/webinit.gen.bc build/core.gen.bc | ||||
| 				build/webinit.gen.bc build/core_image.bc | ||||
|  | ||||
| %.gen.bc: %.gen.c | ||||
| 	$(EMCC) $(EMCFLAGS) -o $@ -c $< | ||||
|  | ||||
| build/core_image.bc: build/core_image.c $(JANET_HEADERS) $(JANET_LOCAL_HEADERS) | ||||
| 	$(EMCC) $(EMCFLAGS) -o $@ -c $< | ||||
|  | ||||
| build/%.bc: src/%.c $(JANET_HEADERS) $(JANET_LOCAL_HEADERS) | ||||
| 	$(EMCC) $(EMCFLAGS) -o $@ -c $< | ||||
|  | ||||
| @@ -109,6 +131,9 @@ emscripten: $(JANET_EMTARGET) | ||||
| ##### Generated C files ##### | ||||
| ############################# | ||||
|  | ||||
| %.gen.o: %.gen.c | ||||
| 	$(CC) $(CFLAGS) -o $@ -c $< | ||||
|  | ||||
| build/xxd: tools/xxd.c | ||||
| 	$(CC) $< -o $@ | ||||
|  | ||||
| @@ -118,12 +143,14 @@ build/init.gen.c: src/mainclient/init.janet build/xxd | ||||
| 	build/xxd $< $@ janet_gen_init | ||||
| build/webinit.gen.c: src/webclient/webinit.janet build/xxd | ||||
| 	build/xxd $< $@ janet_gen_webinit | ||||
| build/boot.gen.c: src/boot/boot.janet build/xxd | ||||
| 	build/xxd $< $@ janet_gen_boot | ||||
|  | ||||
| ######################## | ||||
| ##### Amalgamation ##### | ||||
| ######################## | ||||
|  | ||||
| amalg: build/janet.c build/janet.h | ||||
| amalg: build/janet.c build/janet.h build/core_image.c | ||||
|  | ||||
| build/janet.c: $(JANET_LOCAL_HEADERS) $(JANET_CORE_SOURCES) tools/amalg.janet $(JANET_TARGET) | ||||
| 	$(JANET_TARGET) tools/amalg.janet > $@ | ||||
|   | ||||
| @@ -22,6 +22,7 @@ | ||||
| mkdir build | ||||
| mkdir build\core | ||||
| mkdir build\mainclient | ||||
| mkdir build\boot | ||||
|  | ||||
| @rem Build the xxd tool for generating sources | ||||
| @cl /nologo /c tools/xxd.c /Fobuild\xxd.obj | ||||
| @@ -34,12 +35,33 @@ mkdir build\mainclient | ||||
| @if errorlevel 1 goto :BUILDFAIL | ||||
| @build\xxd.exe src\mainclient\init.janet build\init.gen.c janet_gen_init | ||||
| @if errorlevel 1 goto :BUILDFAIL | ||||
| @build\xxd.exe src\boot\boot.janet build\boot.gen.c janet_gen_boot | ||||
| @if errorlevel 1 goto :BUILDFAIL | ||||
|  | ||||
| @rem Build the generated sources | ||||
| @%JANET_COMPILE% /Fobuild\core\core.gen.obj build\core.gen.c | ||||
| @%JANET_COMPILE% /Fobuild\boot\core.gen.obj build\core.gen.c | ||||
| @if errorlevel 1 goto :BUILDFAIL | ||||
| @%JANET_COMPILE% /Fobuild\mainclient\init.gen.obj build\init.gen.c | ||||
| @if errorlevel 1 goto :BUILDFAIL | ||||
| @%JANET_COMPILE% /Fobuild\boot\boot.gen.obj build\boot.gen.c | ||||
| @if errorlevel 1 goto :BUILDFAIL | ||||
|  | ||||
| @rem Build the bootstrap interpretter | ||||
| for %%f in (src\core\*.c) do ( | ||||
|     @%JANET_COMPILE% /DJANET_BOOTSTRAP /Fobuild\boot\%%~nf.obj %%f | ||||
|     @if errorlevel 1 goto :BUILDFAIL | ||||
| ) | ||||
| for %%f in (src\boot\*.c) do ( | ||||
|     @%JANET_COMPILE% /DJANET_BOOTSTRAP /Fobuild\boot\%%~nf.obj %%f | ||||
|     @if errorlevel 1 goto :BUILDFAIL | ||||
| ) | ||||
| %JANET_LINK% /out:build\janet_boot.exe build\boot\*.obj | ||||
| @if errorlevel 1 goto :BUILDFAIL | ||||
| build\janet_boot | ||||
|  | ||||
| @rem Build the core image | ||||
| @%JANET_COMPILE% /Fobuild\core_image.obj build\core_image.c | ||||
| @if errorlevel 1 goto :BUILDFAIL | ||||
|  | ||||
| @rem Build the sources | ||||
| for %%f in (src\core\*.c) do ( | ||||
| @@ -54,7 +76,7 @@ for %%f in (src\mainclient\*.c) do ( | ||||
| ) | ||||
|  | ||||
| @rem Link everything to main client | ||||
| %JANET_LINK% /out:janet.exe build\core\*.obj build\mainclient\*.obj | ||||
| %JANET_LINK% /out:janet.exe build\core\*.obj build\mainclient\*.obj build\core_image.obj | ||||
| @if errorlevel 1 goto :BUILDFAIL | ||||
|  | ||||
| echo === Successfully built janet.exe for Windows === | ||||
|   | ||||
							
								
								
									
										43
									
								
								src/boot/boot.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/boot/boot.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| /* | ||||
| * Copyright (c) 2019 Calvin Rose | ||||
| * | ||||
| * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||
| * of this software and associated documentation files (the "Software"), to | ||||
| * deal in the Software without restriction, including without limitation the | ||||
| * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||||
| * sell copies of the Software, and to permit persons to whom the Software is | ||||
| * furnished to do so, subject to the following conditions: | ||||
| * | ||||
| * The above copyright notice and this permission notice shall be included in | ||||
| * all copies or substantial portions of the Software. | ||||
| * | ||||
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||
| * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||||
| * IN THE SOFTWARE. | ||||
| */ | ||||
|  | ||||
| #include <janet/janet.h> | ||||
|  | ||||
| extern const unsigned char *janet_gen_boot; | ||||
| extern int32_t janet_gen_boot_size; | ||||
|  | ||||
| int main() { | ||||
|     int status; | ||||
|     JanetTable *env; | ||||
|  | ||||
|     /* Set up VM */ | ||||
|     janet_init(); | ||||
|     env = janet_core_env(); | ||||
|  | ||||
|     /* Run bootstrap script to generate core image */ | ||||
|     status = janet_dobytes(env, janet_gen_boot, janet_gen_boot_size, "boot.janet", NULL); | ||||
|  | ||||
|     /* Deinitialize vm */ | ||||
|     janet_deinit(); | ||||
|  | ||||
|     return status; | ||||
| } | ||||
							
								
								
									
										40
									
								
								src/boot/boot.janet
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								src/boot/boot.janet
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| # 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)) | ||||
| @@ -267,5 +267,5 @@ static const JanetReg array_cfuns[] = { | ||||
|  | ||||
| /* Load the array module */ | ||||
| void janet_lib_array(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, array_cfuns); | ||||
|     janet_core_cfuns(env, NULL, array_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -951,7 +951,7 @@ static const JanetReg asm_cfuns[] = { | ||||
|  | ||||
| /* Load the library */ | ||||
| void janet_lib_asm(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, asm_cfuns); | ||||
|     janet_core_cfuns(env, NULL, asm_cfuns); | ||||
| } | ||||
|  | ||||
| #endif | ||||
|   | ||||
| @@ -387,5 +387,5 @@ static const JanetReg buffer_cfuns[] = { | ||||
| }; | ||||
|  | ||||
| void janet_lib_buffer(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, buffer_cfuns); | ||||
|     janet_core_cfuns(env, NULL, buffer_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -749,5 +749,5 @@ static const JanetReg compile_cfuns[] = { | ||||
| }; | ||||
|  | ||||
| void janet_lib_compile(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, compile_cfuns); | ||||
|     janet_core_cfuns(env, NULL, compile_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -1067,6 +1067,20 @@ value, one key will be ignored." | ||||
|     (++ i)) | ||||
|   ret) | ||||
|  | ||||
| (defn partition | ||||
|   "Partition an indexed data structure into tuples | ||||
|   of size n. Returns a new array." | ||||
|   [n ind] | ||||
|   (var i 0) (var nextn n) | ||||
|   (def len (length ind)) | ||||
|   (def ret (array/new (math/ceil (/ len n)))) | ||||
|   (while (<= nextn len) | ||||
|     (array/push ret (tuple/slice ind i nextn)) | ||||
|     (set i nextn) | ||||
|     (+= nextn n)) | ||||
|   (if (not= i len) (array/push ret (tuple/slice ind i))) | ||||
|   ret) | ||||
|  | ||||
| ### | ||||
| ### | ||||
| ### Pattern Matching | ||||
|   | ||||
| @@ -28,8 +28,13 @@ | ||||
| #endif | ||||
|  | ||||
| /* Generated bytes */ | ||||
| #ifdef JANET_BOOTSTRAP | ||||
| extern const unsigned char *janet_gen_core; | ||||
| extern int32_t janet_gen_core_size; | ||||
| #else | ||||
| extern const unsigned char *janet_core_image; | ||||
| extern size_t janet_core_image_size; | ||||
| #endif | ||||
|  | ||||
| /* Use LoadLibrary on windows or dlopen on posix to load dynamic libaries | ||||
|  * with native code. */ | ||||
| @@ -371,7 +376,7 @@ static const JanetReg corelib_cfuns[] = { | ||||
|     {NULL, NULL, NULL} | ||||
| }; | ||||
|  | ||||
| #ifndef JANET_NO_BOOTSTRAP | ||||
| #ifdef JANET_BOOTSTRAP | ||||
|  | ||||
| /* Utility for inline assembly */ | ||||
| static void janet_quick_asm( | ||||
| @@ -595,12 +600,9 @@ static const uint32_t bnot_asm[] = { | ||||
|  | ||||
| JanetTable *janet_core_env(void) { | ||||
|     JanetTable *env = janet_table(0); | ||||
|     Janet ret = janet_wrap_table(env); | ||||
|     janet_core_cfuns(env, NULL, corelib_cfuns); | ||||
|  | ||||
|     /* Load main functions */ | ||||
|     janet_cfuns(env, NULL, corelib_cfuns); | ||||
|  | ||||
| #ifndef JANET_NO_BOOTSTRAP | ||||
| #ifdef JANET_BOOTSTRAP | ||||
|     janet_quick_asm(env, JANET_FUN_YIELD, "debug", 0, 1, debug_asm, sizeof(debug_asm), | ||||
|             JDOC("(debug)\n\n" | ||||
|                 "Throws a debug signal that can be caught by a parent fiber and used to inspect " | ||||
| @@ -731,11 +733,11 @@ JanetTable *janet_core_env(void) { | ||||
|             JDOC("The build identifier of the running janet program.")); | ||||
|  | ||||
|     /* Allow references to the environment */ | ||||
|     janet_def(env, "_env", ret, JDOC("The environment table for the current scope.")); | ||||
| #endif | ||||
|     janet_def(env, "_env", janet_wrap_table(env), JDOC("The environment table for the current scope.")); | ||||
|  | ||||
|     /* Set as gc root */ | ||||
|     janet_gcroot(janet_wrap_table(env)); | ||||
| #endif | ||||
|  | ||||
|     /* Load auxiliary envs */ | ||||
|     janet_lib_io(env); | ||||
| @@ -756,9 +758,26 @@ JanetTable *janet_core_env(void) { | ||||
|     janet_lib_asm(env); | ||||
| #endif | ||||
|  | ||||
| #ifndef JANET_NO_BOOTSTRAP | ||||
| #ifdef JANET_BOOTSTRAP | ||||
|     /* Run bootstrap source */ | ||||
|     janet_dobytes(env, janet_gen_core, janet_gen_core_size, "core.janet", NULL); | ||||
| #else | ||||
|  | ||||
|     /* Unmarshal from core image */ | ||||
|     Janet marsh_out; | ||||
|     int status = janet_unmarshal( | ||||
|             janet_core_image, | ||||
|             janet_core_image_size, | ||||
|             0, | ||||
|             &marsh_out, | ||||
|             env, | ||||
|             NULL); | ||||
|     if (status) { | ||||
|         printf("error unmarshaling core image\n"); | ||||
|         exit(1); | ||||
|     } | ||||
|     janet_gcroot(marsh_out); | ||||
|     env = janet_unwrap_table(marsh_out); | ||||
| #endif | ||||
|  | ||||
|     return env; | ||||
|   | ||||
| @@ -376,5 +376,5 @@ static const JanetReg debug_cfuns[] = { | ||||
|  | ||||
| /* Module entry point */ | ||||
| void janet_lib_debug(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, debug_cfuns); | ||||
|     janet_core_cfuns(env, NULL, debug_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -433,5 +433,5 @@ static const JanetReg fiber_cfuns[] = { | ||||
|  | ||||
| /* Module entry point */ | ||||
| void janet_lib_fiber(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, fiber_cfuns); | ||||
|     janet_core_cfuns(env, NULL, fiber_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -394,18 +394,18 @@ static const JanetReg io_cfuns[] = { | ||||
|  | ||||
| /* Module entry point */ | ||||
| void janet_lib_io(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, io_cfuns); | ||||
|     janet_core_cfuns(env, NULL, io_cfuns); | ||||
|  | ||||
|     /* stdout */ | ||||
|     janet_def(env, "stdout", | ||||
|     janet_core_def(env, "stdout", | ||||
|             makef(stdout, IO_APPEND | IO_NOT_CLOSEABLE | IO_SERIALIZABLE), | ||||
|             JDOC("The standard output file.")); | ||||
|     /* stderr */ | ||||
|     janet_def(env, "stderr", | ||||
|     janet_core_def(env, "stderr", | ||||
|             makef(stderr, IO_APPEND | IO_NOT_CLOSEABLE | IO_SERIALIZABLE), | ||||
|             JDOC("The standard error file.")); | ||||
|     /* stdin */ | ||||
|     janet_def(env, "stdin", | ||||
|     janet_core_def(env, "stdin", | ||||
|             makef(stdin, IO_READ | IO_NOT_CLOSEABLE | IO_SERIALIZABLE), | ||||
|             JDOC("The standard input file.")); | ||||
| } | ||||
|   | ||||
| @@ -124,15 +124,20 @@ JanetTable *janet_env_lookup(JanetTable *env) { | ||||
|  | ||||
| /* Marshal an integer onto the buffer */ | ||||
| static void pushint(MarshalState *st, int32_t x) { | ||||
|     if (x >= 0 && x < 200) { | ||||
|     if (x >= 0 && x < 128) { | ||||
|         janet_buffer_push_u8(st->buf, x); | ||||
|     } else if (x <= 8191 && x >= -8192) { | ||||
|         uint8_t intbuf[2]; | ||||
|         intbuf[0] = ((x >> 8) & 0x3F) | 0x80; | ||||
|         intbuf[1] = x & 0xFF; | ||||
|         janet_buffer_push_bytes(st->buf, intbuf, 2); | ||||
|     } else { | ||||
|         uint8_t intbuf[5]; | ||||
|         intbuf[0] = LB_INTEGER; | ||||
|         intbuf[1] = x & 0xFF; | ||||
|         intbuf[2] = (x >> 8) & 0xFF; | ||||
|         intbuf[3] = (x >> 16) & 0xFF; | ||||
|         intbuf[4] = (x >> 24) & 0xFF; | ||||
|         intbuf[1] = (x >> 24) & 0xFF; | ||||
|         intbuf[2] = (x >> 16) & 0xFF; | ||||
|         intbuf[3] = (x >> 8) & 0xFF; | ||||
|         intbuf[4] = x & 0xFF; | ||||
|         janet_buffer_push_bytes(st->buf, intbuf, 5); | ||||
|     } | ||||
| } | ||||
| @@ -234,10 +239,12 @@ static void marshal_one_def(MarshalState *st, JanetFuncDef *def, int flags) { | ||||
|  | ||||
|     /* marshal source maps if needed */ | ||||
|     if (def->flags & JANET_FUNCDEF_FLAG_HASSOURCEMAP) { | ||||
|         int32_t current = 0; | ||||
|         for (int32_t i = 0; i < def->bytecode_length; i++) { | ||||
|             JanetSourceMapping map = def->sourcemap[i]; | ||||
|             pushint(st, map.start); | ||||
|             pushint(st, map.end); | ||||
|             pushint(st, map.start - current); | ||||
|             pushint(st, map.end - map.start); | ||||
|             current = map.end; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -546,14 +553,19 @@ static int32_t readint(UnmarshalState *st, const uint8_t **atdata) { | ||||
|     const uint8_t *data = *atdata; | ||||
|     int32_t ret; | ||||
|     if (data >= st->end) longjmp(st->err, UMR_EOS); | ||||
|     if (*data < 200) { | ||||
|     if (*data < 128) { | ||||
|         ret = *data++; | ||||
|     } else if (*data < 192) { | ||||
|         if (data + 2 > st->end) longjmp(st->err, UMR_EOS); | ||||
|         ret = ((data[0] & 0x3F) << 8) + data[1]; | ||||
|         ret = ((ret << 18) >> 18); | ||||
|         data += 2; | ||||
|     } else if (*data == LB_INTEGER) { | ||||
|         if (data + 5 > st->end) longjmp(st->err, UMR_EOS); | ||||
|         ret = (data[1]) | | ||||
|             (data[2] << 8) | | ||||
|             (data[3] << 16) | | ||||
|             (data[4] << 24); | ||||
|         ret = (data[1] << 24) | | ||||
|             (data[2] << 16) | | ||||
|             (data[3] << 8) | | ||||
|             data[4]; | ||||
|         data += 5; | ||||
|     } else { | ||||
|         longjmp(st->err, UMR_EXPECTED_INTEGER); | ||||
| @@ -748,13 +760,16 @@ static const uint8_t *unmarshal_one_def( | ||||
|  | ||||
|         /* Unmarshal source maps if needed */ | ||||
|         if (def->flags & JANET_FUNCDEF_FLAG_HASSOURCEMAP) { | ||||
|             int32_t current = 0; | ||||
|             def->sourcemap = malloc(sizeof(JanetSourceMapping) * bytecode_length); | ||||
|             if (!def->sourcemap) { | ||||
|                 JANET_OUT_OF_MEMORY; | ||||
|             } | ||||
|             for (int32_t i = 0; i < bytecode_length; i++) { | ||||
|                 def->sourcemap[i].start = readint(st, &data); | ||||
|                 def->sourcemap[i].end = readint(st, &data); | ||||
|                 current += readint(st, &data); | ||||
|                 def->sourcemap[i].start = current; | ||||
|                 current += readint(st, &data); | ||||
|                 def->sourcemap[i].end = current; | ||||
|             } | ||||
|         } else { | ||||
|             def->sourcemap = NULL; | ||||
| @@ -905,8 +920,8 @@ static const uint8_t *unmarshal_one( | ||||
|     EXTRA(1); | ||||
|     lead = data[0]; | ||||
|     if (lead < 200) { | ||||
|         *out = janet_wrap_integer(lead); | ||||
|         return data + 1; | ||||
|         *out = janet_wrap_integer(readint(st, &data)); | ||||
|         return data; | ||||
|     } | ||||
|     switch (lead) { | ||||
|         case LB_NIL: | ||||
| @@ -1175,5 +1190,5 @@ static const JanetReg marsh_cfuns[] = { | ||||
|  | ||||
| /* Module entry point */ | ||||
| void janet_lib_marsh(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, marsh_cfuns); | ||||
|     janet_core_cfuns(env, NULL, marsh_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -181,8 +181,8 @@ static const JanetReg math_cfuns[] = { | ||||
|  | ||||
| /* Module entry point */ | ||||
| void janet_lib_math(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, math_cfuns); | ||||
| #ifndef JANET_NO_BOOTSTRAP | ||||
|     janet_core_cfuns(env, NULL, math_cfuns); | ||||
| #ifdef JANET_BOOTSTRAP | ||||
|     janet_def(env, "math/pi", janet_wrap_number(3.1415926535897931), | ||||
|             JDOC("The value pi.")); | ||||
|     janet_def(env, "math/e", janet_wrap_number(2.7182818284590451), | ||||
|   | ||||
| @@ -378,5 +378,5 @@ static const JanetReg os_cfuns[] = { | ||||
|  | ||||
| /* Module entry point */ | ||||
| void janet_lib_os(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, os_cfuns); | ||||
|     janet_core_cfuns(env, NULL, os_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -889,5 +889,5 @@ static const JanetReg parse_cfuns[] = { | ||||
|  | ||||
| /* Load the library */ | ||||
| void janet_lib_parse(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, parse_cfuns); | ||||
|     janet_core_cfuns(env, NULL, parse_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -1103,5 +1103,5 @@ static const JanetReg peg_cfuns[] = { | ||||
|  | ||||
| /* Load the peg module */ | ||||
| void janet_lib_peg(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, peg_cfuns); | ||||
|     janet_core_cfuns(env, NULL, peg_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -221,7 +221,6 @@ static JanetSlot janetc_varset(JanetFopts opts, int32_t argn, const Janet *argv) | ||||
|         return rvalue; | ||||
|     } else { | ||||
|         /* Error */ | ||||
|         janet_inspect(argv[0]); | ||||
|         janetc_cerror(opts.compiler, "expected symbol or tuple for l-value to set"); | ||||
|         return janetc_cslot(janet_wrap_nil()); | ||||
|     } | ||||
|   | ||||
| @@ -619,5 +619,5 @@ static const JanetReg string_cfuns[] = { | ||||
|  | ||||
| /* Module entry point */ | ||||
| void janet_lib_string(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, string_cfuns); | ||||
|     janet_core_cfuns(env, NULL, string_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -273,5 +273,5 @@ static const JanetReg table_cfuns[] = { | ||||
|  | ||||
| /* Load the table module */ | ||||
| void janet_lib_table(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, table_cfuns); | ||||
|     janet_core_cfuns(env, NULL, table_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -147,5 +147,5 @@ static const JanetReg tuple_cfuns[] = { | ||||
|  | ||||
| /* Load the tuple module */ | ||||
| void janet_lib_tuple(JanetTable *env) { | ||||
|     janet_cfuns(env, NULL, tuple_cfuns); | ||||
|     janet_core_cfuns(env, NULL, tuple_cfuns); | ||||
| } | ||||
|   | ||||
| @@ -284,6 +284,24 @@ void janet_cfuns(JanetTable *env, const char *regprefix, const JanetReg *cfuns) | ||||
|     } | ||||
| } | ||||
|  | ||||
| #ifndef JANET_BOOTSTRAP | ||||
| void janet_core_def(JanetTable *env, const char *name, Janet x, const void *p) { | ||||
|     (void) p; | ||||
|     janet_table_put(env, janet_csymbolv(name), x); | ||||
| } | ||||
|  | ||||
| void janet_core_cfuns(JanetTable *env, const char *regprefix, const JanetReg *cfuns) { | ||||
|     (void) regprefix; | ||||
|     while (cfuns->name) { | ||||
|         Janet name = janet_csymbolv(cfuns->name); | ||||
|         Janet fun = janet_wrap_cfunction(cfuns->cfun); | ||||
|         janet_core_def(env, cfuns->name, fun, cfuns->documentation); | ||||
|         janet_table_put(janet_vm_registry, fun, name); | ||||
|         cfuns++; | ||||
|     } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| /* Resolve a symbol in the environment */ | ||||
| JanetBindingType janet_resolve(JanetTable *env, const uint8_t *sym, Janet *out) { | ||||
|     Janet ref; | ||||
|   | ||||
| @@ -28,8 +28,9 @@ | ||||
| #endif | ||||
|  | ||||
| /* Omit docstrings in some builds */ | ||||
| #ifdef JANET_NO_BOOTSTRAP | ||||
| #ifndef JANET_BOOTSTRAP | ||||
| #define JDOC(x) NULL | ||||
| #define JANET_NO_BOOTSTRAP | ||||
| #else | ||||
| #define JDOC(x) x | ||||
| #endif | ||||
| @@ -52,6 +53,16 @@ const void *janet_strbinsearch( | ||||
|         size_t itemsize, | ||||
|         const uint8_t *key); | ||||
|  | ||||
| /* Inside the janet core, defining globals is different | ||||
|  * at bootstrap time and normal runtime */ | ||||
| #ifdef JANET_BOOTSTRAP | ||||
| #define janet_core_def janet_def | ||||
| #define janet_core_cfuns janet_cfuns | ||||
| #else | ||||
| void janet_core_def(JanetTable *env, const char *name, Janet x, const void *p); | ||||
| void janet_core_cfuns(JanetTable *env, const char *regprefix, const JanetReg *cfuns); | ||||
| #endif | ||||
|  | ||||
| /* Initialize builtin libraries */ | ||||
| void janet_lib_io(JanetTable *env); | ||||
| void janet_lib_math(JanetTable *env); | ||||
|   | ||||
| @@ -1117,7 +1117,6 @@ JANET_API Janet janet_getindex(Janet ds, int32_t index); | ||||
| JANET_API int32_t janet_length(Janet x); | ||||
| JANET_API void janet_put(Janet ds, Janet key, Janet value); | ||||
| JANET_API void janet_putindex(Janet ds, int32_t index, Janet value); | ||||
| JANET_API void janet_inspect(Janet x); | ||||
|  | ||||
| /* VM functions */ | ||||
| JANET_API int janet_init(void); | ||||
|   | ||||
| @@ -71,5 +71,6 @@ | ||||
| (each h headers (dofile h)) | ||||
| (each s sources (dofile s)) | ||||
|  | ||||
| # Relies on this file being built | ||||
| # Relies on these files being built | ||||
| (dofile "build/core.gen.c") | ||||
| (dofile "build/core_image.c") | ||||
|   | ||||
| @@ -1,21 +0,0 @@ | ||||
| # 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 register | ||||
| # table which will be generated on janet startup. | ||||
| (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 (table/getproto *env*) reverse-lookup))) | ||||
|  | ||||
| # Write image | ||||
| (file/write stdout image) | ||||
| (file/flush stdout) | ||||
		Reference in New Issue
	
	Block a user
	 J.-F. Cap
					J.-F. Cap