janet-lang / janet

A dynamic language and bytecode vm
https://janet-lang.org
MIT License
3.38k stars 217 forks source link

Use `size_t` for Janet types length and capacity and the API those types use #1438

Open GrayJack opened 2 months ago

GrayJack commented 2 months ago

Use size_t for Janet types length and capacity and the API those types use, as discussed on Zulip

pepe commented 2 months ago

On Alpine Linux I see these warnings:

export CFLAGS='-fPIC -O2 -flto'; make -j; make test
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/abstract.boot.o -c src/core/abstract.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/array.boot.o -c src/core/array.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/asm.boot.o -c src/core/asm.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/buffer.boot.o -c src/core/buffer.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/bytecode.boot.o -c src/core/bytecode.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/capi.boot.o -c src/core/capi.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/cfuns.boot.o -c src/core/cfuns.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/compile.boot.o -c src/core/compile.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/corelib.boot.o -c src/core/corelib.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/debug.boot.o -c src/core/debug.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/emit.boot.o -c src/core/emit.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/ev.boot.o -c src/core/ev.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/ffi.boot.o -c src/core/ffi.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/fiber.boot.o -c src/core/fiber.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/gc.boot.o -c src/core/gc.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/inttypes.boot.o -c src/core/inttypes.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/io.boot.o -c src/core/io.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/marsh.boot.o -c src/core/marsh.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/math.boot.o -c src/core/math.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/net.boot.o -c src/core/net.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/os.boot.o -c src/core/os.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/parse.boot.o -c src/core/parse.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/peg.boot.o -c src/core/peg.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/pp.boot.o -c src/core/pp.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/regalloc.boot.o -c src/core/regalloc.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/run.boot.o -c src/core/run.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/specials.boot.o -c src/core/specials.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/state.boot.o -c src/core/state.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/string.boot.o -c src/core/string.c
src/core/array.c: In function 'janet_array_setcount':
src/core/array.c:93:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
   93 |     if (count < 0)
      |               ^
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/strtod.boot.o -c src/core/strtod.c
src/core/buffer.c: In function 'janet_pointer_buffer_unsafe':
src/core/buffer.c:65:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
   65 |     if (count < 0) janet_panic("count < 0");
      |               ^
src/core/buffer.c: In function 'janet_buffer_setcount':
src/core/buffer.c:107:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  107 |     if (count < 0)
      |               ^
src/core/array.c: In function 'cfun_array_remove':
src/core/buffer.c: In function 'cfun_buffer_new_filled':
src/core/array.c:325:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  325 |         if (n < 0)
      |               ^
src/core/buffer.c:213:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  213 |     if (count < 0) count = 0;
      |               ^
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/struct.boot.o -c src/core/struct.c
src/core/buffer.c: In function 'cfun_buffer_push_at':
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/symcache.boot.o -c src/core/symcache.c
src/core/buffer.c:481:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  481 |     if (index < 0 || index > old_count) {
      |               ^
src/core/buffer.c: In function 'cfun_buffer_popn':
src/core/buffer.c:521:11: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  521 |     if (n < 0) janet_panic("n must be non-negative");
      |           ^
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/table.boot.o -c src/core/table.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/tuple.boot.o -c src/core/tuple.c
src/core/buffer.c: In function 'cfun_buffer_blit':
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/util.boot.o -c src/core/util.c
src/core/buffer.c:623:24: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  623 |         if (length_src < 0) length_src = 0;
      |                        ^
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/value.boot.o -c src/core/value.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/vector.boot.o -c src/core/vector.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/vm.boot.o -c src/core/vm.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/core/wrap.boot.o -c src/core/wrap.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/boot/array_test.boot.o -c src/boot/array_test.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/boot/boot.boot.o -c src/boot/boot.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/boot/buffer_test.boot.o -c src/boot/buffer_test.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/boot/number_test.boot.o -c src/boot/number_test.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/boot/system_test.boot.o -c src/boot/system_test.c
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/boot/table_test.boot.o -c src/boot/table_test.c
cc -fPIC -O2 -flto -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -c build/c/shell.c -o build/shell.o
src/core/value.c: In function 'janet_next_impl':
src/core/value.c:182:30: warning: comparison of unsigned expression in '>= 0' is always true [-Wtype-limits]
  182 |             if (i < len && i >= 0) {
      |                              ^~
src/core/parse.c: In function 'cfun_parse_consume':
src/core/parse.c:924:20: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  924 |         if (offset < 0 || offset > view.len)
      |                    ^
src/core/value.c: In function 'janet_get':
src/core/value.c:533:23: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  533 |             if (index < 0) return janet_wrap_nil();
      |                       ^
src/core/value.c:552:23: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  552 |             if (index < 0) return janet_wrap_nil();
      |                       ^
src/core/value.c: In function 'janet_getindex':
src/core/value.c:587:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  587 |     if (index < 0) janet_panic("expected non-negative index");
      |               ^
src/core/value.c: At top level:
src/core/value.c:442:16: warning: 'getter_checkint' defined but not used [-Wunused-function]
  442 | static int32_t getter_checkint(JanetType type, Janet key, int32_t max) {
      |                ^~~~~~~~~~~~~~~
src/core/string.c: In function 'trim_help_rightedge':
src/core/string.c:586:36: warning: comparison of unsigned expression in '>= 0' is always true [-Wtype-limits]
  586 |     for (size_t i = str.len - 1; i >= 0; i--)
      |                                    ^~
src/core/pp.c: In function 'janet_formatbv':
src/core/pp.c:899:37: warning: operand of '?:' changes signedness from 'int' to 'size_t' {aka 'long unsigned int'} due to unsignedness of other operand [-Wsign-compare]
  899 |                                   ? (int32_t) strlen(str)
      |                                     ^~~~~~~~~~~~~~~~~~~~~
build/c/shell.c: In function 'longest_common_prefix':
build/c/shell.c:630:37: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int32_t' {aka 'int'} [-Wsign-compare]
  630 |             for (bv.len = 0; bv.len < minlen; bv.len++) {
      |                                     ^
src/core/util.c: In function 'janet_sorted_keys':
src/core/util.c:864:34: warning: comparison of unsigned expression in '>= 0' is always true [-Wtype-limits]
  864 |         for (size_t j = i - 1; j >= 0; j--) {
      |                                  ^~
build/c/shell.c: In function 'doc_format':
build/c/shell.c:694:27: warning: comparison of integer expressions of different signedness: 'int32_t' {aka 'int'} and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
  694 |     for (int32_t i = 0; i < janet_string_length(doc); i++) {
      |                           ^
build/c/shell.c: In function 'kshowcomp':
build/c/shell.c:817:32: warning: comparison of integer expressions of different signedness: 'int' and 'size_t' {aka 'long unsigned int'} [-Wsign-compare]
  817 |     for (int i = prefix.len; i < lcp.len; i++) {
      |                                ^
build/c/shell.c:825:32: warning: comparison of integer expressions of different signedness: 'size_t' {aka 'long unsigned int'} and 'int32_t' {aka 'int'} [-Wsign-compare]
  825 |         if (gbl_matches[i].len > maxlen)
      |                                ^
cc -DJANET_BOOTSTRAP -DJANET_BUILD="\"1c5745f6\"" -O0 -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -g -o build/janet_boot build/core/abstract.boot.o build/core/array.boot.o build/core/asm.boot.o build/core/buffer.boot.o build/core/bytecode.boot.o build/core/capi.boot.o build/core/cfuns.boot.o build/core/compile.boot.o build/core/corelib.boot.o build/core/debug.boot.o build/core/emit.boot.o build/core/ev.boot.o build/core/ffi.boot.o build/core/fiber.boot.o build/core/gc.boot.o build/core/inttypes.boot.o build/core/io.boot.o build/core/marsh.boot.o build/core/math.boot.o build/core/net.boot.o build/core/os.boot.o build/core/parse.boot.o build/core/peg.boot.o build/core/pp.boot.o build/core/regalloc.boot.o build/core/run.boot.o build/core/specials.boot.o build/core/state.boot.o build/core/string.boot.o build/core/strtod.boot.o build/core/struct.boot.o build/core/symcache.boot.o build/core/table.boot.o build/core/tuple.boot.o build/core/util.boot.o build/core/value.boot.o build/core/vector.boot.o build/core/vm.boot.o build/core/wrap.boot.o build/boot/array_test.boot.o build/boot/boot.boot.o build/boot/buffer_test.boot.o build/boot/number_test.boot.o build/boot/system_test.boot.o build/boot/table_test.boot.o -lm -lpthread -lrt -ldl
build/janet_boot . JANET_PATH '/home/pp/.local/lib/janet' > build/c/janet.c
cksum build/c/janet.c
4183454676 2919342 build/c/janet.c
cc -fPIC -O2 -flto -std=c99 -Wall -Wextra -Isrc/include -Isrc/conf -fvisibility=hidden -fPIC -c build/c/janet.c -o build/janet.o
src/core/array.c: In function 'janet_array_setcount':
src/core/array.c:93:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
   93 |     if (count < 0)
      |               ^
src/core/array.c: In function 'cfun_array_remove':
src/core/array.c:325:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  325 |         if (n < 0)
      |               ^
src/core/buffer.c: In function 'janet_pointer_buffer_unsafe':
src/core/buffer.c:65:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
   65 |     if (count < 0) janet_panic("count < 0");
      |               ^
src/core/buffer.c: In function 'janet_buffer_setcount':
src/core/buffer.c:107:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  107 |     if (count < 0)
      |               ^
src/core/buffer.c: In function 'cfun_buffer_new_filled':
src/core/buffer.c:213:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  213 |     if (count < 0) count = 0;
      |               ^
src/core/buffer.c: In function 'cfun_buffer_push_at':
src/core/buffer.c:481:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  481 |     if (index < 0 || index > old_count) {
      |               ^
src/core/buffer.c: In function 'cfun_buffer_popn':
src/core/buffer.c:521:11: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  521 |     if (n < 0) janet_panic("n must be non-negative");
      |           ^
src/core/buffer.c: In function 'cfun_buffer_blit':
src/core/buffer.c:623:24: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  623 |         if (length_src < 0) length_src = 0;
      |                        ^
src/core/parse.c: In function 'cfun_parse_consume':
src/core/parse.c:924:20: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  924 |         if (offset < 0 || offset > view.len)
      |                    ^
src/core/pp.c: In function 'janet_formatbv':
src/core/pp.c:899:37: warning: operand of '?:' changes signedness from 'int' to 'size_t' {aka 'long unsigned int'} due to unsignedness of other operand [-Wsign-compare]
  899 |                                   ? (int32_t) strlen(str)
      |                                     ^~~~~~~~~~~~~~~~~~~~~
src/core/string.c: In function 'trim_help_rightedge':
src/core/string.c:586:36: warning: comparison of unsigned expression in '>= 0' is always true [-Wtype-limits]
  586 |     for (size_t i = str.len - 1; i >= 0; i--)
      |                                    ^~
src/core/util.c: In function 'janet_sorted_keys':
src/core/util.c:864:34: warning: comparison of unsigned expression in '>= 0' is always true [-Wtype-limits]
  864 |         for (size_t j = i - 1; j >= 0; j--) {
      |                                  ^~
src/core/value.c: In function 'janet_next_impl':
src/core/value.c:182:30: warning: comparison of unsigned expression in '>= 0' is always true [-Wtype-limits]
  182 |             if (i < len && i >= 0) {
      |                              ^~
src/core/value.c: In function 'janet_get':
src/core/value.c:533:23: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  533 |             if (index < 0) return janet_wrap_nil();
      |                       ^
src/core/value.c:552:23: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  552 |             if (index < 0) return janet_wrap_nil();
      |                       ^
src/core/value.c: In function 'janet_getindex':
src/core/value.c:587:15: warning: comparison of unsigned expression in '< 0' is always false [-Wtype-limits]
  587 |     if (index < 0) janet_panic("expected non-negative index");
      |               ^
src/core/value.c: At top level:
src/core/value.c:442:16: warning: 'getter_checkint' defined but not used [-Wunused-function]
  442 | static int32_t getter_checkint(JanetType type, Janet key, int32_t max) {
pepe commented 2 months ago

There aren't any of them at the master branch.

bakpakin commented 1 month ago

So this does seem to work locally by itself, but as evidenced by the extensive changes to janet.h, I probably won't merge this as is - at the very least it would need to be a compile time option. This broke every C extension and program I tried it with completely, spork, jaylib, sqlite, some of personal projects, etc. at a source code leve - literally 0 percent compatibility. Not unexpected. I'm not opposed to breaking the ABI minorly or even majorly on version changes, but incremental upgrades should be fairly easy at a source code level.

That said, if several other huge changes interface breaking come down the line that would also require a huge version bump (new GC / new C API, new compiler, rework of core data structures, etc.), this would be good to merge in. But as is, frankly not tenable. If useful to you though, I would recommend keeping synced with master.

One idea - I wonder if defining ssize_t as jsize_t (which could be, by default int32_t) would solve the problem while allowing for an easy backwards compatibility switch.

#ifdef JANET_USE_SIZE_T
typedef ssize_t jss_t;
typedef size_t js_t;
#else
typedef int32_t jss_t;
typedef uint32_t js_t;
#endif