Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package janet for openSUSE:Factory checked 
in at 2024-01-10 21:52:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/janet (Old)
 and      /work/SRC/openSUSE:Factory/.janet.new.21961 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "janet"

Wed Jan 10 21:52:31 2024 rev:6 rq:1137852 version:1.33.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/janet/janet.changes      2023-11-03 
22:21:57.208041192 +0100
+++ /work/SRC/openSUSE:Factory/.janet.new.21961/janet.changes   2024-01-10 
21:52:47.189251899 +0100
@@ -1,0 +2,12 @@
+Wed Jan 10 00:44:49 UTC 2024 - Soc Virnyl Estela 
<uncomfy+openbuildserv...@uncomfyhalomacro.pl>
+
+- Update to version 1.33.0:
+  * Add more + and * keywords to default-peg-grammar
+  * Use libc strlen in janet_buffer_push_cstring
+  * net/ev: Cleaned up unused NetStateConnect, fixed janet_async_end() ev 
refcount
+  * fix (doc next)
+  * Fix arity typo in peg
+  * Cosmetically tweak string/format docstring
+  * Add a new (sub) PEG special
+
+-------------------------------------------------------------------

Old:
----
  janet-1.32.1.tar.gz

New:
----
  janet-1.33.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ janet.spec ++++++
--- /var/tmp/diff_new_pack.kfn0kI/_old  2024-01-10 21:52:47.609267152 +0100
+++ /var/tmp/diff_new_pack.kfn0kI/_new  2024-01-10 21:52:47.609267152 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package janet
 #
-# Copyright (c) 2023 SUSE LLC
+# Copyright (c) 2024 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,8 +17,8 @@
 
 
 %global somajor 1
-%global sominor 32
-%global revision 1
+%global sominor 33
+%global revision 0
 %global libname libjanet%{somajor}_%{sominor}
 
 Name:           janet

++++++ janet-1.32.1.tar.gz -> janet-1.33.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/CHANGELOG.md 
new/janet-1.33.0/CHANGELOG.md
--- old/janet-1.32.1/CHANGELOG.md       2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/CHANGELOG.md       2024-01-07 20:30:08.000000000 +0100
@@ -1,6 +1,29 @@
 # Changelog
 All notable changes to this project will be documented in this file.
 
+## 1.33.0 - 2023-01-07
+- Add more + and * keywords to default-peg-grammar by @sogaiu.
+- Use libc strlen in janet_buffer_push_cstring by @williewillus.
+- Be a bit safer with reference counting.
+- Add support for atomic loads in Janet's atomic abstraction.
+- Fix poll event loop CPU usage issue.
+- Add ipv6, shared, and cryptorand options to meson.
+- Add more ipv6 feature detection.
+- Fix loop for forever loop.
+- Cleaned up unused NetStateConnect, fixed janet_async_end() ev refcount by 
@zevv.
+- Fix warnings w/ MSVC and format.
+- Fix marshal_one_env w/ JANET_MARSHAL_UNSAFE.
+- Fix `(default)`.
+- Fix cannot marshal fiber with c stackframe, in a dynamic way that is fairly 
conservative.
+- Fix typo for SIGALARM in os/proc-kill.
+- Prevent bytecode optimization from remove mk* instructions.
+- Fix arity typo in peg.c by @pepe.
+- Update Makefile for MinGW.
+- Fix canceling waiting fiber.
+- Add a new (sub) PEG special by @ianthehenry.
+- Fix if net/server's handler has incorrect arity.
+- Fix macex raising on ().
+
 ## 1.32.1 - 2023-10-15
 - Fix return value from C function `janet_dobytes` when called on Janet 
functions that yield to event loop.
 - Change C API for event loop interaction - get rid of JanetListener and 
instead use `janet_async_start` and `janet_async_end`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/Makefile new/janet-1.33.0/Makefile
--- old/janet-1.32.1/Makefile   2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/Makefile   2024-01-07 20:30:08.000000000 +0100
@@ -33,6 +33,7 @@
 JANET_TARGET=build/janet
 JANET_BOOT=build/janet_boot
 JANET_IMPORT_LIB=build/janet.lib
+JANET_LIBRARY_IMPORT_LIB=build/libjanet.lib
 JANET_LIBRARY=build/libjanet.so
 JANET_STATIC_LIBRARY=build/libjanet.a
 JANET_PATH?=$(LIBDIR)/janet
@@ -42,6 +43,7 @@
 JANET_BOOT_FLAGS:=. JANET_PATH '$(JANET_PATH)'
 JANET_TARGET_OBJECTS=build/janet.o build/shell.o
 JPM_TAG?=master
+HAS_SHARED?=1
 DEBUGGER=gdb
 SONAME_SETTER=-Wl,-soname,
 
@@ -51,6 +53,7 @@
 # Symbols are (optionally) removed later, keep -g as default!
 CFLAGS?=-O2 -g
 LDFLAGS?=-rdynamic
+LIBJANET_LDFLAGS?=$(LD_FLAGS)
 RUN:=$(RUN)
 
 COMMON_CFLAGS:=-std=c99 -Wall -Wextra -Isrc/include -Isrc/conf 
-fvisibility=hidden -fPIC
@@ -93,12 +96,17 @@
 ifeq ($(findstring MINGW,$(UNAME)), MINGW)
        CLIBS:=-lws2_32 -lpsapi -lwsock32
        LDFLAGS:=-Wl,--out-implib,$(JANET_IMPORT_LIB)
+       LIBJANET_LDFLAGS:=-Wl,--out-implib,$(JANET_LIBRARY_IMPORT_LIB)
        JANET_TARGET:=$(JANET_TARGET).exe
        JANET_BOOT:=$(JANET_BOOT).exe
 endif
 
+
 $(shell mkdir -p build/core build/c build/boot build/mainclient)
-all: $(JANET_TARGET) $(JANET_LIBRARY) $(JANET_STATIC_LIBRARY) build/janet.h
+all: $(JANET_TARGET) $(JANET_STATIC_LIBRARY) build/janet.h
+ifeq ($(HAS_SHARED), 1)
+all: $(JANET_LIBRARY)
+endif
 
 ######################
 ##### Name Files #####
@@ -196,9 +204,9 @@
 ########################
 
 ifeq ($(UNAME), Darwin)
-SONAME=libjanet.1.32.dylib
+SONAME=libjanet.1.33.dylib
 else
-SONAME=libjanet.so.1.32
+SONAME=libjanet.so.1.33
 endif
 
 build/c/shell.c: src/mainclient/shell.c
@@ -220,7 +228,7 @@
        $(HOSTCC) $(LDFLAGS) $(BUILD_CFLAGS) -o $@ $^ $(CLIBS)
 
 $(JANET_LIBRARY): $(JANET_TARGET_OBJECTS)
-       $(HOSTCC) $(LDFLAGS) $(BUILD_CFLAGS) $(SONAME_SETTER)$(SONAME) -shared 
-o $@ $^ $(CLIBS)
+       $(HOSTCC) $(LIBJANET_LDFLAGS) $(BUILD_CFLAGS) $(SONAME_SETTER)$(SONAME) 
-shared -o $@ $^ $(CLIBS)
 
 $(JANET_STATIC_LIBRARY): $(JANET_TARGET_OBJECTS)
        $(HOSTAR) rcs $@ $^
@@ -263,7 +271,7 @@
 
 build/janet-%.tar.gz: $(JANET_TARGET) \
        build/janet.h \
-       janet.1 LICENSE CONTRIBUTING.md $(JANET_LIBRARY) 
$(JANET_STATIC_LIBRARY) \
+       janet.1 LICENSE CONTRIBUTING.md $(JANET_STATIC_LIBRARY) \
        README.md build/c/janet.c build/c/shell.c
        mkdir -p build/$(JANET_DIST_DIR)/bin
        cp $(JANET_TARGET) build/$(JANET_DIST_DIR)/bin/
@@ -271,13 +279,17 @@
        mkdir -p build/$(JANET_DIST_DIR)/include
        cp build/janet.h build/$(JANET_DIST_DIR)/include/
        mkdir -p build/$(JANET_DIST_DIR)/lib/
-       cp $(JANET_LIBRARY) $(JANET_STATIC_LIBRARY) build/$(JANET_DIST_DIR)/lib/
+       cp $(JANET_STATIC_LIBRARY) build/$(JANET_DIST_DIR)/lib/
+       cp $(JANET_LIBRARY) build/$(JANET_DIST_DIR)/lib/ || true
        mkdir -p build/$(JANET_DIST_DIR)/man/man1/
        cp janet.1 build/$(JANET_DIST_DIR)/man/man1/janet.1
        mkdir -p build/$(JANET_DIST_DIR)/src/
        cp build/c/janet.c build/c/shell.c build/$(JANET_DIST_DIR)/src/
        cp CONTRIBUTING.md LICENSE README.md build/$(JANET_DIST_DIR)/
        cd build && tar -czvf ../$@ ./$(JANET_DIST_DIR)
+ifeq ($(HAS_SHARED), 1)
+build/janet-%.tar.gz: $(JANET_LIBRARY)
+endif
 
 #########################
 ##### Documentation #####
@@ -331,6 +343,7 @@
        mkdir -p '$(DESTDIR)$(JANET_PKG_CONFIG_PATH)'
        cp build/janet.pc '$(DESTDIR)$(JANET_PKG_CONFIG_PATH)/janet.pc'
        cp '$(JANET_IMPORT_LIB)' '$(DESTDIR)$(LIBDIR)' || echo 'no import lib 
to install (mingw only)'
+       cp '$(JANET_LIBRARY_IMPORT_LIB)' '$(DESTDIR)$(LIBDIR)' || echo 'no 
import lib to install (mingw only)'
        [ -z '$(DESTDIR)' ] && $(LDCONFIG) || echo "You can ignore this error 
for non-Linux systems or local installs"
 
 install-jpm-git: $(JANET_TARGET)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/meson.build new/janet-1.33.0/meson.build
--- old/janet-1.32.1/meson.build        2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/meson.build        2024-01-07 20:30:08.000000000 +0100
@@ -20,7 +20,7 @@
 
 project('janet', 'c',
   default_options : ['c_std=c99', 'build.c_std=c99', 'b_lundef=false', 
'default_library=both'],
-  version : '1.32.1')
+  version : '1.33.0')
 
 # Global settings
 janet_path = join_paths(get_option('prefix'), get_option('libdir'), 'janet')
@@ -61,6 +61,7 @@
 conf.set('JANET_NO_ASSEMBLER', not get_option('assembler'))
 conf.set('JANET_NO_PEG', not get_option('peg'))
 conf.set('JANET_NO_NET', not get_option('net'))
+conf.set('JANET_NO_IPV6', not get_option('ipv6'))
 conf.set('JANET_NO_EV', not get_option('ev') or get_option('single_threaded'))
 conf.set('JANET_REDUCED_OS', get_option('reduced_os'))
 conf.set('JANET_NO_INT_TYPES', not get_option('int_types'))
@@ -78,6 +79,7 @@
 conf.set('JANET_NO_INTERPRETER_INTERRUPT', not 
get_option('interpreter_interrupt'))
 conf.set('JANET_NO_FFI', not get_option('ffi'))
 conf.set('JANET_NO_FFI_JIT', not get_option('ffi_jit'))
+conf.set('JANET_NO_CRYPTORAND', not get_option('cryptorand'))
 if get_option('os_name') != ''
   conf.set('JANET_OS_NAME', get_option('os_name'))
 endif
@@ -182,32 +184,41 @@
   janet_dependencies += thread_dep
 endif
 
+# Allow building with no shared library
 if cc.has_argument('-fvisibility=hidden')
   lib_cflags = ['-fvisibility=hidden']
 else
   lib_cflags = []
 endif
-libjanet = library('janet', janetc,
-  include_directories : incdir,
-  dependencies : janet_dependencies,
-  version: meson.project_version(),
-  soversion: version_parts[0] + '.' + version_parts[1],
-  c_args : lib_cflags,
-  install : true)
-
+if get_option('shared')
+  libjanet = library('janet', janetc,
+    include_directories : incdir,
+    dependencies : janet_dependencies,
+    version: meson.project_version(),
+    soversion: version_parts[0] + '.' + version_parts[1],
+    c_args : lib_cflags,
+    install : true)
 # Extra c flags - adding -fvisibility=hidden matches the Makefile and
 # shaves off about 10k on linux x64, likely similar on other platforms.
-if cc.has_argument('-fvisibility=hidden')
-  extra_cflags = ['-fvisibility=hidden', '-DJANET_DLL_IMPORT']
+  if cc.has_argument('-fvisibility=hidden')
+    extra_cflags = ['-fvisibility=hidden', '-DJANET_DLL_IMPORT']
+  else
+    extra_cflags = ['-DJANET_DLL_IMPORT']
+  endif
+  janet_mainclient = executable('janet', mainclient_src,
+    include_directories : incdir,
+    dependencies : janet_dependencies,
+    link_with: [libjanet],
+    c_args : extra_cflags,
+    install : true)
 else
-  extra_cflags = ['-DJANET_DLL_IMPORT']
+  # No shared library
+  janet_mainclient = executable('janet', mainclient_src, janetc,
+    include_directories : incdir,
+    dependencies : janet_dependencies,
+    c_args : lib_cflags,
+    install : true)
 endif
-janet_mainclient = executable('janet', mainclient_src,
-  include_directories : incdir,
-  dependencies : janet_dependencies,
-  link_with: [libjanet],
-  c_args : extra_cflags,
-  install : true)
 
 if meson.is_cross_build()
   native_cc = meson.get_compiler('c', native: true)
@@ -271,14 +282,15 @@
 run_target('repl', command : [janet_nativeclient])
 
 # For use as meson subproject (wrap)
-janet_dep = declare_dependency(include_directories : incdir,
-  link_with : libjanet)
-
+if get_option('shared')
+  janet_dep = declare_dependency(include_directories : incdir,
+    link_with : libjanet)
 # pkgconfig
-pkg = import('pkgconfig')
-pkg.generate(libjanet,
-  subdirs: 'janet',
-  description: 'Library for the Janet programming language.')
+  pkg = import('pkgconfig')
+  pkg.generate(libjanet,
+    subdirs: 'janet',
+    description: 'Library for the Janet programming language.')
+endif
 
 # Installation
 install_man('janet.1')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/meson_options.txt 
new/janet-1.33.0/meson_options.txt
--- old/janet-1.32.1/meson_options.txt  2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/meson_options.txt  2024-01-07 20:30:08.000000000 +0100
@@ -11,6 +11,7 @@
 option('int_types', type : 'boolean', value : true)
 option('prf', type : 'boolean', value : false)
 option('net', type : 'boolean', value : true)
+option('ipv6', type : 'boolean', value : true)
 option('ev', type : 'boolean', value : true)
 option('processes', type : 'boolean', value : true)
 option('umask', type : 'boolean', value : true)
@@ -29,3 +30,5 @@
 
 option('arch_name', type : 'string', value: '')
 option('os_name', type : 'string', value: '')
+option('shared', type : 'boolean', value: true)
+option('cryptorand', type : 'boolean', value: true)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/boot/boot.janet 
new/janet-1.33.0/src/boot/boot.janet
--- old/janet-1.32.1/src/boot/boot.janet        2023-10-15 21:33:43.000000000 
+0200
+++ new/janet-1.33.0/src/boot/boot.janet        2024-01-07 20:30:08.000000000 
+0100
@@ -162,7 +162,7 @@
   ``Define a default value for an optional argument.
   Expands to `(def sym (if (= nil sym) val sym))`.``
   [sym val]
-  ~(def ,sym (if (= nil ,sym) ,val ,sym)))
+  ~(def ,sym (if (,= nil ,sym) ,val ,sym)))
 
 (defmacro comment
   "Ignores the body of the comment."
@@ -420,10 +420,14 @@
 
 (defn- range-template
   [binding object kind rest op comparison]
-  (let [[start stop step] (check-indexed object)]
-    (case kind
-      :range (for-template binding (if stop start 0) (or stop start) (or step 
1) comparison op [rest])
-      :down (for-template binding start (or stop 0) (or step 1) comparison op 
[rest]))))
+  (check-indexed object)
+  (def [a b c] object)
+  (def [start stop step]
+    (case (length object)
+      1 (case kind :range [0 a 1] :down [a 0 1])
+      2 [a b 1]
+      [a b c]))
+  (for-template binding start stop step comparison op [rest]))
 
 (defn- each-template
   [binding inx kind body]
@@ -2123,6 +2127,7 @@
      'upscope expandall})
 
   (defn dotup [t]
+    (if (= nil (next t)) (break ()))
     (def h (in t 0))
     (def s (in specs h))
     (def entry (or (dyn h) {}))
@@ -2333,26 +2338,36 @@
 (def default-peg-grammar
   `The default grammar used for pegs. This grammar defines several common 
patterns
   that should make it easier to write more complex patterns.`
-  ~@{:d (range "09")
-     :a (range "az" "AZ")
+  ~@{:a (range "az" "AZ")
+     :d (range "09")
+     :h (range "09" "af" "AF")
      :s (set " \t\r\n\0\f\v")
      :w (range "az" "AZ" "09")
-     :h (range "09" "af" "AF")
-     :S (if-not :s 1)
-     :W (if-not :w 1)
      :A (if-not :a 1)
      :D (if-not :d 1)
      :H (if-not :h 1)
-     :d+ (some :d)
+     :S (if-not :s 1)
+     :W (if-not :w 1)
      :a+ (some :a)
+     :d+ (some :d)
+     :h+ (some :h)
      :s+ (some :s)
      :w+ (some :w)
-     :h+ (some :h)
-     :d* (any :d)
+     :A+ (some :A)
+     :D+ (some :D)
+     :H+ (some :H)
+     :S+ (some :S)
+     :W+ (some :W)
      :a* (any :a)
-     :w* (any :w)
+     :d* (any :d)
+     :h* (any :h)
      :s* (any :s)
-     :h* (any :h)})
+     :w* (any :w)
+     :A* (any :A)
+     :D* (any :D)
+     :H* (any :H)
+     :S* (any :S)
+     :W* (any :W)})
 
 (setdyn *peg-grammar* default-peg-grammar)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/conf/janetconf.h 
new/janet-1.33.0/src/conf/janetconf.h
--- old/janet-1.32.1/src/conf/janetconf.h       2023-10-15 21:33:43.000000000 
+0200
+++ new/janet-1.33.0/src/conf/janetconf.h       2024-01-07 20:30:08.000000000 
+0100
@@ -4,10 +4,10 @@
 #define JANETCONF_H
 
 #define JANET_VERSION_MAJOR 1
-#define JANET_VERSION_MINOR 32
-#define JANET_VERSION_PATCH 1
+#define JANET_VERSION_MINOR 33
+#define JANET_VERSION_PATCH 0
 #define JANET_VERSION_EXTRA ""
-#define JANET_VERSION "1.32.1"
+#define JANET_VERSION "1.33.0"
 
 /* #define JANET_BUILD "local" */
 
@@ -52,6 +52,8 @@
 /* #define JANET_EV_NO_EPOLL */
 /* #define JANET_EV_NO_KQUEUE */
 /* #define JANET_NO_INTERPRETER_INTERRUPT */
+/* #define JANET_NO_IPV6 */
+/* #define JANET_NO_CRYPTORAND */
 
 /* Custom vm allocator support */
 /* #include <mimalloc.h> */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/buffer.c 
new/janet-1.33.0/src/core/buffer.c
--- old/janet-1.32.1/src/core/buffer.c  2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/buffer.c  2024-01-07 20:30:08.000000000 +0100
@@ -135,8 +135,7 @@
 
 /* Push a cstring to buffer */
 void janet_buffer_push_cstring(JanetBuffer *buffer, const char *cstring) {
-    int32_t len = 0;
-    while (cstring[len]) ++len;
+    int32_t len = (int32_t) strlen(cstring);
     janet_buffer_push_bytes(buffer, (const uint8_t *) cstring, len);
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/bytecode.c 
new/janet-1.33.0/src/core/bytecode.c
--- old/janet-1.32.1/src/core/bytecode.c        2023-10-15 21:33:43.000000000 
+0200
+++ new/janet-1.33.0/src/core/bytecode.c        2024-01-07 20:30:08.000000000 
+0100
@@ -226,6 +226,7 @@
                 case JOP_LOAD_TRUE:
                 case JOP_LOAD_FALSE:
                 case JOP_LOAD_SELF:
+                    break;
                 case JOP_MAKE_ARRAY:
                 case JOP_MAKE_BUFFER:
                 case JOP_MAKE_STRING:
@@ -233,6 +234,8 @@
                 case JOP_MAKE_TABLE:
                 case JOP_MAKE_TUPLE:
                 case JOP_MAKE_BRACKET_TUPLE:
+                    /* Reads from the stack, don't remove */
+                    janetc_regalloc_touch(&ra, DD);
                     break;
 
                 /* Read A */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/capi.c 
new/janet-1.33.0/src/core/capi.c
--- old/janet-1.32.1/src/core/capi.c    2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/capi.c    2024-01-07 20:30:08.000000000 +0100
@@ -505,7 +505,15 @@
 #ifdef JANET_WINDOWS
     return InterlockedDecrement(x);
 #else
-    return __atomic_add_fetch(x, -1, __ATOMIC_RELAXED);
+    return __atomic_add_fetch(x, -1, __ATOMIC_ACQ_REL);
+#endif
+}
+
+JanetAtomicInt janet_atomic_load(JanetAtomicInt volatile *x) {
+#ifdef JANET_WINDOWS
+    return InterlockedOr(x, 0);
+#else
+    return __atomic_load_n(x, __ATOMIC_ACQUIRE);
 #endif
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/corelib.c 
new/janet-1.33.0/src/core/corelib.c
--- old/janet-1.32.1/src/core/corelib.c 2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/corelib.c 2024-01-07 20:30:08.000000000 +0100
@@ -1144,7 +1144,7 @@
                     JDOC("(next ds &opt key)\n\n"
                          "Gets the next key in a data structure. Can be used 
to iterate through "
                          "the keys of a data structure in an unspecified 
order. Keys are guaranteed "
-                         "to be seen only once per iteration if they data 
structure is not mutated "
+                         "to be seen only once per iteration if the data 
structure is not mutated "
                          "during iteration. If key is nil, next returns the 
first key. If next "
                          "returns nil, there are no more keys to iterate 
through."));
     janet_quick_asm(env, JANET_FUN_PROP,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/ev.c 
new/janet-1.33.0/src/core/ev.c
--- old/janet-1.32.1/src/core/ev.c      2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/ev.c      2024-01-07 20:30:08.000000000 +0100
@@ -258,12 +258,12 @@
         fiber->ev_callback(fiber, JANET_ASYNC_EVENT_DEINIT);
         janet_gcunroot(janet_wrap_abstract(fiber->ev_stream));
         fiber->ev_callback = NULL;
-        if (fiber->ev_state) {
-            if (!(fiber->flags & JANET_FIBER_EV_FLAG_IN_FLIGHT)) {
+        if (!(fiber->flags & JANET_FIBER_EV_FLAG_IN_FLIGHT)) {
+            if (fiber->ev_state) {
                 janet_free(fiber->ev_state);
-                janet_ev_dec_refcount();
+                fiber->ev_state = NULL;
             }
-            fiber->ev_state = NULL;
+            janet_ev_dec_refcount();
         }
     }
 }
@@ -1284,7 +1284,7 @@
 int janet_loop_done(void) {
     return !((janet_vm.spawn.head != janet_vm.spawn.tail) ||
              janet_vm.tq_count ||
-             janet_vm.listener_count);
+             janet_atomic_load(&janet_vm.listener_count));
 }
 
 JanetFiber *janet_loop1(void) {
@@ -1346,7 +1346,7 @@
     }
 
     /* Poll for events */
-    if (janet_vm.tq_count || janet_vm.listener_count) {
+    if (janet_vm.tq_count || janet_atomic_load(&janet_vm.listener_count)) {
         JanetTimeout to;
         memset(&to, 0, sizeof(to));
         int has_timeout;
@@ -1365,7 +1365,7 @@
             break;
         }
         /* Run polling implementation only if pending timeouts or pending 
events */
-        if (janet_vm.tq_count || janet_vm.listener_count) {
+        if (janet_vm.tq_count || janet_atomic_load(&janet_vm.listener_count)) {
             janet_loop1_impl(has_timeout, to.when);
         }
     }
@@ -1818,8 +1818,8 @@
         JanetStream *stream = janet_vm.streams[i];
         janet_vm.fds[i + 1].events = 0;
         janet_vm.fds[i + 1].revents = 0;
-        if (stream->read_fiber) janet_vm.fds[i + 1].events |= POLLIN;
-        if (stream->write_fiber) janet_vm.fds[i + 1].events |= POLLOUT;
+        if (stream->read_fiber && stream->read_fiber->ev_callback) 
janet_vm.fds[i + 1].events |= POLLIN;
+        if (stream->write_fiber && stream->write_fiber->ev_callback) 
janet_vm.fds[i + 1].events |= POLLOUT;
     }
 
     /* Poll for events */
@@ -2031,33 +2031,35 @@
     if (return_value.fiber == NULL) {
         return;
     }
-    switch (return_value.tag) {
-        default:
-        case JANET_EV_TCTAG_NIL:
-            janet_schedule(return_value.fiber, janet_wrap_nil());
-            break;
-        case JANET_EV_TCTAG_INTEGER:
-            janet_schedule(return_value.fiber, 
janet_wrap_integer(return_value.argi));
-            break;
-        case JANET_EV_TCTAG_STRING:
-        case JANET_EV_TCTAG_STRINGF:
-            janet_schedule(return_value.fiber, janet_cstringv((const char *) 
return_value.argp));
-            if (return_value.tag == JANET_EV_TCTAG_STRINGF) 
janet_free(return_value.argp);
-            break;
-        case JANET_EV_TCTAG_KEYWORD:
-            janet_schedule(return_value.fiber, janet_ckeywordv((const char *) 
return_value.argp));
-            break;
-        case JANET_EV_TCTAG_ERR_STRING:
-        case JANET_EV_TCTAG_ERR_STRINGF:
-            janet_cancel(return_value.fiber, janet_cstringv((const char *) 
return_value.argp));
-            if (return_value.tag == JANET_EV_TCTAG_STRINGF) 
janet_free(return_value.argp);
-            break;
-        case JANET_EV_TCTAG_ERR_KEYWORD:
-            janet_cancel(return_value.fiber, janet_ckeywordv((const char *) 
return_value.argp));
-            break;
-        case JANET_EV_TCTAG_BOOLEAN:
-            janet_schedule(return_value.fiber, 
janet_wrap_boolean(return_value.argi));
-            break;
+    if (janet_fiber_can_resume(return_value.fiber)) {
+        switch (return_value.tag) {
+            default:
+            case JANET_EV_TCTAG_NIL:
+                janet_schedule(return_value.fiber, janet_wrap_nil());
+                break;
+            case JANET_EV_TCTAG_INTEGER:
+                janet_schedule(return_value.fiber, 
janet_wrap_integer(return_value.argi));
+                break;
+            case JANET_EV_TCTAG_STRING:
+            case JANET_EV_TCTAG_STRINGF:
+                janet_schedule(return_value.fiber, janet_cstringv((const char 
*) return_value.argp));
+                if (return_value.tag == JANET_EV_TCTAG_STRINGF) 
janet_free(return_value.argp);
+                break;
+            case JANET_EV_TCTAG_KEYWORD:
+                janet_schedule(return_value.fiber, janet_ckeywordv((const char 
*) return_value.argp));
+                break;
+            case JANET_EV_TCTAG_ERR_STRING:
+            case JANET_EV_TCTAG_ERR_STRINGF:
+                janet_cancel(return_value.fiber, janet_cstringv((const char *) 
return_value.argp));
+                if (return_value.tag == JANET_EV_TCTAG_STRINGF) 
janet_free(return_value.argp);
+                break;
+            case JANET_EV_TCTAG_ERR_KEYWORD:
+                janet_cancel(return_value.fiber, janet_ckeywordv((const char 
*) return_value.argp));
+                break;
+            case JANET_EV_TCTAG_BOOLEAN:
+                janet_schedule(return_value.fiber, 
janet_wrap_boolean(return_value.argi));
+                break;
+        }
     }
     janet_gcunroot(janet_wrap_fiber(return_value.fiber));
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/ffi.c 
new/janet-1.33.0/src/core/ffi.c
--- old/janet-1.32.1/src/core/ffi.c     2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/ffi.c     2024-01-07 20:30:08.000000000 +0100
@@ -999,13 +999,13 @@
     uint64_t x;
 } sysv64_sseint_return;
 typedef sysv64_int_return janet_sysv64_variant_1(uint64_t a, uint64_t b, 
uint64_t c, uint64_t d, uint64_t e, uint64_t f,
-    double r1, double r2, double r3, double r4, double r5, double r6, double 
r7, double r8);
+        double r1, double r2, double r3, double r4, double r5, double r6, 
double r7, double r8);
 typedef sysv64_sse_return janet_sysv64_variant_2(uint64_t a, uint64_t b, 
uint64_t c, uint64_t d, uint64_t e, uint64_t f,
-    double r1, double r2, double r3, double r4, double r5, double r6, double 
r7, double r8);
+        double r1, double r2, double r3, double r4, double r5, double r6, 
double r7, double r8);
 typedef sysv64_intsse_return janet_sysv64_variant_3(uint64_t a, uint64_t b, 
uint64_t c, uint64_t d, uint64_t e, uint64_t f,
-    double r1, double r2, double r3, double r4, double r5, double r6, double 
r7, double r8);
+        double r1, double r2, double r3, double r4, double r5, double r6, 
double r7, double r8);
 typedef sysv64_sseint_return janet_sysv64_variant_4(uint64_t a, uint64_t b, 
uint64_t c, uint64_t d, uint64_t e, uint64_t f,
-    double r1, double r2, double r3, double r4, double r5, double r6, double 
r7, double r8);
+        double r1, double r2, double r3, double r4, double r5, double r6, 
double r7, double r8);
 
 static Janet janet_ffi_sysv64(JanetFFISignature *signature, void 
*function_pointer, const Janet *argv) {
     union {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/marsh.c 
new/janet-1.33.0/src/core/marsh.c
--- old/janet-1.32.1/src/core/marsh.c   2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/marsh.c   2024-01-07 20:30:08.000000000 +0100
@@ -185,6 +185,19 @@
 /* Prevent stack overflows */
 #define MARSH_STACKCHECK if ((flags & 0xFFFF) > JANET_RECURSION_GUARD) 
janet_panic("stack overflow")
 
+/* Quick check if a fiber cannot be marshalled. This is will
+ * have no false positives, but may have false negatives. */
+static int fiber_cannot_be_marshalled(JanetFiber *fiber) {
+    if (janet_fiber_status(fiber) == JANET_STATUS_ALIVE) return 1;
+    int32_t i = fiber->frame;
+    while (i > 0) {
+        JanetStackFrame *frame = (JanetStackFrame *)(fiber->data + i - 
JANET_FRAME_SIZE);
+        if (!frame->func) return 1; /* has cfunction on stack */
+        i = frame->prevframe;
+    }
+    return 0;
+}
+
 /* Marshal a function env */
 static void marshal_one_env(MarshalState *st, JanetFuncEnv *env, int flags) {
     MARSH_STACKCHECK;
@@ -197,7 +210,9 @@
     }
     janet_env_valid(env);
     janet_v_push(st->seen_envs, env);
-    if (env->offset > 0 && (JANET_STATUS_ALIVE == 
janet_fiber_status(env->as.fiber))) {
+
+    /* Special case for early detachment */
+    if (env->offset > 0 && fiber_cannot_be_marshalled(env->as.fiber)) {
         pushint(st, 0);
         pushint(st, env->length);
         Janet *values = env->as.fiber->data + env->offset;
@@ -328,7 +343,7 @@
     while (i > 0) {
         JanetStackFrame *frame = (JanetStackFrame *)(fiber->data + i - 
JANET_FRAME_SIZE);
         if (frame->env) frame->flags |= JANET_STACKFRAME_HASENV;
-        if (!frame->func) janet_panic("cannot marshal fiber with c 
stackframe");
+        if (!frame->func) janet_panicf("cannot marshal fiber with c stackframe 
(%v)", janet_wrap_cfunction((JanetCFunction) frame->pc));
         pushint(st, frame->flags);
         pushint(st, frame->prevframe);
         int32_t pcdiff = (int32_t)(frame->pc - frame->func->def->bytecode);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/net.c 
new/janet-1.33.0/src/core/net.c
--- old/janet-1.32.1/src/core/net.c     2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/net.c     2024-01-07 20:30:08.000000000 +0100
@@ -79,12 +79,20 @@
 
 /* maximum number of bytes in a socket address host (post name resolution) */
 #ifdef JANET_WINDOWS
+#ifdef JANET_NO_IPV6
+#define SA_ADDRSTRLEN (INET_ADDRSTRLEN + 1)
+#else
 #define SA_ADDRSTRLEN (INET6_ADDRSTRLEN + 1)
+#endif
 typedef unsigned short in_port_t;
 #else
 #define JANET_SA_MAX(a, b) (((a) > (b))? (a) : (b))
+#ifdef JANET_NO_IPV6
+#define SA_ADDRSTRLEN JANET_SA_MAX(INET_ADDRSTRLEN + 1, (sizeof ((struct 
sockaddr_un *)0)->sun_path) + 1)
+#else
 #define SA_ADDRSTRLEN JANET_SA_MAX(INET6_ADDRSTRLEN + 1, (sizeof ((struct 
sockaddr_un *)0)->sun_path) + 1)
 #endif
+#endif
 
 static JanetStream *make_stream(JSock handle, uint32_t flags);
 
@@ -114,18 +122,13 @@
 
 /* State machine for async connect */
 
-typedef struct {
-    int did_connect;
-} NetStateConnect;
-
 void net_callback_connect(JanetFiber *fiber, JanetAsyncEvent event) {
     JanetStream *stream = fiber->ev_stream;
-    NetStateConnect *state = (NetStateConnect *)fiber->ev_state;
     switch (event) {
         default:
             break;
 #ifndef JANET_WINDOWS
-        /* Wait until we have an actually event before checking.
+        /* Wait until we have an actual event before checking.
          * Windows doesn't support async connect with this, just try 
immediately.*/
         case JANET_ASYNC_EVENT_INIT:
 #endif
@@ -147,7 +150,6 @@
 #endif
     if (r == 0) {
         if (res == 0) {
-            state->did_connect = 1;
             janet_schedule(fiber, janet_wrap_abstract(stream));
         } else {
             janet_cancel(fiber, janet_cstringv(strerror(res)));
@@ -160,10 +162,8 @@
     janet_async_end(fiber);
 }
 
-static void net_sched_connect(JanetStream *stream) {
-    NetStateConnect *state = janet_malloc(sizeof(NetStateConnect));
-    state->did_connect = 0;
-    janet_async_start(stream, JANET_ASYNC_LISTEN_WRITE, net_callback_connect, 
state);
+static JANET_NO_RETURN void net_sched_connect(JanetStream *stream) {
+    janet_async_start(stream, JANET_ASYNC_LISTEN_WRITE, net_callback_connect, 
NULL);
 }
 
 /* State machine for accepting connections. */
@@ -575,7 +575,6 @@
     }
 
     net_sched_connect(stream);
-    janet_await();
 }
 
 static const char *serverify_socket(JSock sfd) {
@@ -746,6 +745,7 @@
             Janet pair[2] = {janet_cstringv(buffer), 
janet_wrap_integer(ntohs(sai->sin_port))};
             return janet_wrap_tuple(janet_tuple_n(pair, 2));
         }
+#ifndef JANET_NO_IPV6
         case AF_INET6: {
             const struct sockaddr_in6 *sai6 = sa_any;
             if (!inet_ntop(AF_INET6, &(sai6->sin6_addr), buffer, 
sizeof(buffer))) {
@@ -754,6 +754,7 @@
             Janet pair[2] = {janet_cstringv(buffer), 
janet_wrap_integer(ntohs(sai6->sin6_port))};
             return janet_wrap_tuple(janet_tuple_n(pair, 2));
         }
+#endif
 #ifndef JANET_WINDOWS
         case AF_UNIX: {
             const struct sockaddr_un *sun = sa_any;
@@ -820,6 +821,7 @@
     JanetStream *stream = janet_getabstract(argv, 0, &janet_stream_type);
     janet_stream_flags(stream, JANET_STREAM_ACCEPTABLE | JANET_STREAM_SOCKET);
     JanetFunction *fun = janet_getfunction(argv, 1);
+    if (fun->def->min_arity < 1) janet_panic("handler function must take at 
least 1 argument");
     janet_sched_accept(stream, fun);
 }
 
@@ -956,8 +958,10 @@
     { "ip-multicast-ttl", IPPROTO_IP, IP_MULTICAST_TTL, JANET_NUMBER },
     { "ip-add-membership", IPPROTO_IP, IP_ADD_MEMBERSHIP, JANET_POINTER },
     { "ip-drop-membership", IPPROTO_IP, IP_DROP_MEMBERSHIP, JANET_POINTER },
+#ifndef JANET_NO_IPV6
     { "ipv6-join-group", IPPROTO_IPV6, IPV6_JOIN_GROUP, JANET_POINTER },
     { "ipv6-leave-group", IPPROTO_IPV6, IPV6_LEAVE_GROUP, JANET_POINTER },
+#endif
     { NULL, 0, 0, JANET_POINTER }
 };
 
@@ -994,7 +998,9 @@
     union {
         int v_int;
         struct ip_mreq v_mreq;
+#ifndef JANET_NO_IPV6
         struct ipv6_mreq v_mreq6;
+#endif
     } val;
 
     void *optval = (void *)&val;
@@ -1012,12 +1018,14 @@
         val.v_mreq.imr_interface.s_addr = htonl(INADDR_ANY);
         inet_pton(AF_INET, addr, &val.v_mreq.imr_multiaddr.s_addr);
         optlen = sizeof(val.v_mreq);
+#ifndef JANET_NO_IPV6
     } else if (st->optname == IPV6_JOIN_GROUP || st->optname == 
IPV6_LEAVE_GROUP) {
         const char *addr = janet_getcstring(argv, 2);
         memset(&val.v_mreq6, 0, sizeof val.v_mreq6);
         val.v_mreq6.ipv6mr_interface = 0;
         inet_pton(AF_INET6, addr, &val.v_mreq6.ipv6mr_multiaddr);
         optlen = sizeof(val.v_mreq6);
+#endif
     } else {
         janet_panicf("invalid socket option type");
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/os.c 
new/janet-1.33.0/src/core/os.c
--- old/janet-1.32.1/src/core/os.c      2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/os.c      2024-01-07 20:30:08.000000000 +0100
@@ -529,7 +529,9 @@
             JanetString s = janet_formatc("command failed with non-zero exit 
code %d", status);
             janet_cancel(args.fiber, janet_wrap_string(s));
         } else {
-            janet_schedule(args.fiber, janet_wrap_integer(status));
+            if (janet_fiber_can_resume(args.fiber)) {
+                janet_schedule(args.fiber, janet_wrap_integer(status));
+            }
         }
     }
 }
@@ -640,7 +642,7 @@
 #ifdef SIGTERM
     {"term", SIGTERM},
 #endif
-#ifdef SIGARLM
+#ifdef SIGALRM
     {"alrm", SIGALRM},
 #endif
 #ifdef SIGHUP
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/peg.c 
new/janet-1.33.0/src/core/peg.c
--- old/janet-1.32.1/src/core/peg.c     2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/peg.c     2024-01-07 20:30:08.000000000 +0100
@@ -39,6 +39,10 @@
 typedef struct {
     const uint8_t *text_start;
     const uint8_t *text_end;
+    /* text_end will be restricted in a (sub) rule, but
+       outer_text_end will always contain the real end of
+       input, which we need to generate a line mapping */
+    const uint8_t *outer_text_end;
     const uint32_t *bytecode;
     const Janet *constants;
     JanetArray *captures;
@@ -114,12 +118,12 @@
     /* Generate if not made yet */
     if (s->linemaplen < 0) {
         int32_t newline_count = 0;
-        for (const uint8_t *c = s->text_start; c < s->text_end; c++) {
+        for (const uint8_t *c = s->text_start; c < s->outer_text_end; c++) {
             if (*c == '\n') newline_count++;
         }
         int32_t *mem = janet_smalloc(sizeof(int32_t) * newline_count);
         size_t index = 0;
-        for (const uint8_t *c = s->text_start; c < s->text_end; c++) {
+        for (const uint8_t *c = s->text_start; c < s->outer_text_end; c++) {
             if (*c == '\n') mem[index++] = (int32_t)(c - s->text_start);
         }
         s->linemaplen = newline_count;
@@ -179,7 +183,7 @@
     const uint32_t *rule,
     const uint8_t *text) {
 tail:
-    switch (*rule & 0x1F) {
+    switch (*rule) {
         default:
             janet_panic("unexpected opcode");
             return NULL;
@@ -482,6 +486,30 @@
             return result;
         }
 
+        case RULE_SUB: {
+            const uint8_t *text_start = text;
+            const uint32_t *rule_window = s->bytecode + rule[1];
+            const uint32_t *rule_subpattern = s->bytecode + rule[2];
+            down1(s);
+            const uint8_t *window_end = peg_rule(s, rule_window, text);
+            up1(s);
+            if (!window_end) {
+                return NULL;
+            }
+            const uint8_t *saved_end = s->text_end;
+            s->text_end = window_end;
+            down1(s);
+            const uint8_t *next_text = peg_rule(s, rule_subpattern, 
text_start);
+            up1(s);
+            s->text_end = saved_end;
+
+            if (!next_text) {
+                return NULL;
+            }
+
+            return window_end;
+        }
+
         case RULE_REPLACE:
         case RULE_MATCHTIME: {
             uint32_t tag = rule[3];
@@ -1107,6 +1135,14 @@
     emit_3(r, RULE_MATCHTIME, subrule, cindex, tag);
 }
 
+static void spec_sub(Builder *b, int32_t argc, const Janet *argv) {
+    peg_fixarity(b, argc, 2);
+    Reserve r = reserve(b, 3);
+    uint32_t subrule1 = peg_compile1(b, argv[0]);
+    uint32_t subrule2 = peg_compile1(b, argv[1]);
+    emit_2(r, RULE_SUB, subrule1, subrule2);
+}
+
 #ifdef JANET_INT_TYPES
 #define JANET_MAX_READINT_WIDTH 8
 #else
@@ -1190,6 +1226,7 @@
     {"sequence", spec_sequence},
     {"set", spec_set},
     {"some", spec_some},
+    {"sub", spec_sub},
     {"thru", spec_thru},
     {"to", spec_to},
     {"uint", spec_uint_le},
@@ -1431,7 +1468,7 @@
         uint32_t instr = bytecode[i];
         uint32_t *rule = bytecode + i;
         op_flags[i] |= 0x02;
-        switch (instr & 0x1F) {
+        switch (instr) {
             case RULE_LITERAL:
                 i += 2 + ((rule[1] + 3) >> 2);
                 break;
@@ -1524,6 +1561,14 @@
                 op_flags[rule[1]] |= 0x01;
                 i += 4;
                 break;
+            case RULE_SUB:
+                /* [rule, rule] */
+                if (rule[1] >= blen) goto bad;
+                if (rule[2] >= blen) goto bad;
+                op_flags[rule[1]] |= 0x01;
+                op_flags[rule[2]] |= 0x01;
+                i += 3;
+                break;
             case RULE_ERROR:
             case RULE_DROP:
             case RULE_NOT:
@@ -1652,7 +1697,7 @@
 static PegCall peg_cfun_init(int32_t argc, Janet *argv, int get_replace) {
     PegCall ret;
     int32_t min = get_replace ? 3 : 2;
-    janet_arity(argc, get_replace, -1);
+    janet_arity(argc, min, -1);
     if (janet_checktype(argv[0], JANET_ABSTRACT) &&
             janet_abstract_type(janet_unwrap_abstract(argv[0])) == 
&janet_peg_type) {
         ret.peg = janet_unwrap_abstract(argv[0]);
@@ -1677,6 +1722,7 @@
     ret.s.mode = PEG_MODE_NORMAL;
     ret.s.text_start = ret.bytes.bytes;
     ret.s.text_end = ret.bytes.bytes + ret.bytes.len;
+    ret.s.outer_text_end = ret.s.text_end;
     ret.s.depth = JANET_RECURSION_GUARD;
     ret.s.captures = janet_array(0);
     ret.s.tagged_captures = janet_array(0);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/specials.c 
new/janet-1.33.0/src/core/specials.c
--- old/janet-1.32.1/src/core/specials.c        2023-10-15 21:33:43.000000000 
+0200
+++ new/janet-1.33.0/src/core/specials.c        2024-01-07 20:30:08.000000000 
+0100
@@ -531,17 +531,11 @@
 }
 
 /* Check if a form matches the pattern (= nil _) or (not= nil _) */
-static int janetc_check_nil_form(JanetFopts opts, Janet x, Janet *capture, 
uint32_t fun_tag) {
+static int janetc_check_nil_form(Janet x, Janet *capture, uint32_t fun_tag) {
     if (!janet_checktype(x, JANET_TUPLE)) return 0;
     JanetTuple tup = janet_unwrap_tuple(x);
     if (3 != janet_tuple_length(tup)) return 0;
     Janet op1 = tup[0];
-    if (janet_checktype(op1, JANET_SYMBOL)) {
-        Janet entry = janet_table_get(opts.compiler->env, op1);
-        if (janet_checktype(entry, JANET_TABLE)) {
-            op1 = janet_table_get(janet_unwrap_table(entry), 
janet_ckeywordv("value"));
-        }
-    }
     if (!janet_checktype(op1, JANET_FUNCTION)) return 0;
     JanetFunction *fun = janet_unwrap_function(op1);
     uint32_t tag = fun->def->flags & JANET_FUNCDEF_FLAG_TAG;
@@ -601,10 +595,9 @@
     janetc_scope(&condscope, c, 0, "if");
 
     Janet condform = argv[0];
-    if (janetc_check_nil_form(opts, condform, &condform, JANET_FUN_EQ)) {
+    if (janetc_check_nil_form(condform, &condform, JANET_FUN_EQ)) {
         ifnjmp = JOP_JUMP_IF_NOT_NIL;
-    }
-    if (janetc_check_nil_form(opts, condform, &condform, JANET_FUN_NEQ)) {
+    } else if (janetc_check_nil_form(condform, &condform, JANET_FUN_NEQ)) {
         ifnjmp = JOP_JUMP_IF_NIL;
     }
 
@@ -613,7 +606,11 @@
     /* Check constant condition. */
     /* TODO: Use type info for more short circuits */
     if (cond.flags & JANET_SLOT_CONSTANT) {
-        if (!janet_truthy(cond.constant)) {
+        int swap_condition = 0;
+        if (ifnjmp == JOP_JUMP_IF_NOT && !janet_truthy(cond.constant)) 
swap_condition = 1;
+        if (ifnjmp == JOP_JUMP_IF_NIL && janet_checktype(cond.constant, 
JANET_NIL)) swap_condition = 1;
+        if (ifnjmp == JOP_JUMP_IF_NOT_NIL && !janet_checktype(cond.constant, 
JANET_NIL)) swap_condition = 1;
+        if (swap_condition) {
             /* Swap the true and false bodies */
             Janet temp = falsebody;
             falsebody = truebody;
@@ -808,12 +805,12 @@
      * jmpnl or jmpnn instructions. This let's us implement `(each ...)`
      * more efficiently. */
     Janet condform = argv[0];
-    if (janetc_check_nil_form(opts, condform, &condform, JANET_FUN_EQ)) {
+    if (janetc_check_nil_form(condform, &condform, JANET_FUN_EQ)) {
         is_nil_form = 1;
         ifjmp = JOP_JUMP_IF_NIL;
         ifnjmp = JOP_JUMP_IF_NOT_NIL;
     }
-    if (janetc_check_nil_form(opts, condform, &condform, JANET_FUN_NEQ)) {
+    if (janetc_check_nil_form(condform, &condform, JANET_FUN_NEQ)) {
         is_notnil_form = 1;
         ifjmp = JOP_JUMP_IF_NOT_NIL;
         ifnjmp = JOP_JUMP_IF_NIL;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/string.c 
new/janet-1.33.0/src/core/string.c
--- old/janet-1.32.1/src/core/string.c  2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/string.c  2024-01-07 20:30:08.000000000 +0100
@@ -549,8 +549,8 @@
               "- `a`, `A`: floating point number, formatted as a hexadecimal 
number.\n"
               "- `s`: formatted as a string, precision indicates padding and 
maximum length.\n"
               "- `t`: emit the type of the given value.\n"
-              "- `v`: format with (describe x)"
-              "- `V`: format with (string x)"
+              "- `v`: format with (describe x)\n"
+              "- `V`: format with (string x)\n"
               "- `j`: format to jdn (Janet data notation).\n"
               "\n"
               "The following conversion specifiers are used for 
\"pretty-printing\", where the upper-case "
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/symcache.c 
new/janet-1.33.0/src/core/symcache.c
--- old/janet-1.32.1/src/core/symcache.c        2023-10-15 21:33:43.000000000 
+0200
+++ new/janet-1.33.0/src/core/symcache.c        2024-01-07 20:30:08.000000000 
+0100
@@ -234,6 +234,7 @@
     head->hash = hash;
     sym = (uint8_t *)(head->data);
     memcpy(sym, janet_vm.gensym_counter, sizeof(janet_vm.gensym_counter));
+    sym[head->length] = 0;
     janet_symcache_put((const uint8_t *)sym, bucket);
     return (const uint8_t *)sym;
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/core/util.c 
new/janet-1.33.0/src/core/util.c
--- old/janet-1.32.1/src/core/util.c    2023-10-15 21:33:43.000000000 +0200
+++ new/janet-1.33.0/src/core/util.c    2024-01-07 20:30:08.000000000 +0100
@@ -960,6 +960,7 @@
 #endif
 
 int janet_cryptorand(uint8_t *out, size_t n) {
+#ifndef JANET_NO_CRYPTORAND
 #ifdef JANET_WINDOWS
     for (size_t i = 0; i < n; i += sizeof(unsigned int)) {
         unsigned int v;
@@ -971,7 +972,10 @@
         }
     }
     return 0;
-#elif defined(JANET_LINUX) || defined(JANET_CYGWIN) || ( defined(JANET_APPLE) 
&& !defined(MAC_OS_X_VERSION_10_7) )
+#elif defined(JANET_BSD) || defined(MAC_OS_X_VERSION_10_7)
+    arc4random_buf(out, n);
+    return 0;
+#else
     /* We should be able to call getrandom on linux, but it doesn't seem
        to be uniformly supported on linux distros.
        On Mac, arc4random_buf wasn't available on until 10.7.
@@ -993,12 +997,10 @@
     }
     RETRY_EINTR(rc, close(randfd));
     return 0;
-#elif defined(JANET_BSD) || defined(MAC_OS_X_VERSION_10_7)
-    arc4random_buf(out, n);
-    return 0;
+#endif
 #else
-    (void) n;
     (void) out;
+    (void) n;
     return -1;
 #endif
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/src/include/janet.h 
new/janet-1.33.0/src/include/janet.h
--- old/janet-1.32.1/src/include/janet.h        2023-10-15 21:33:43.000000000 
+0200
+++ new/janet-1.33.0/src/include/janet.h        2024-01-07 20:30:08.000000000 
+0100
@@ -647,6 +647,7 @@
 #endif
 JANET_API JanetAtomicInt janet_atomic_inc(JanetAtomicInt volatile *x);
 JANET_API JanetAtomicInt janet_atomic_dec(JanetAtomicInt volatile *x);
+JANET_API JanetAtomicInt janet_atomic_load(JanetAtomicInt volatile *x);
 
 /* We provide three possible implementations of Janets. The preferred
  * nanboxing approach, for 32 or 64 bits, and the standard C version. Code in 
the rest of the
@@ -2139,7 +2140,8 @@
     RULE_LINE,         /* [tag] */
     RULE_COLUMN,       /* [tag] */
     RULE_UNREF,        /* [rule, tag] */
-    RULE_CAPTURE_NUM   /* [rule, tag] */
+    RULE_CAPTURE_NUM,  /* [rule, tag] */
+    RULE_SUB           /* [rule, rule] */
 } JanetPegOpcod;
 
 typedef struct {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/test/suite-boot.janet 
new/janet-1.33.0/test/suite-boot.janet
--- old/janet-1.32.1/test/suite-boot.janet      2023-10-15 21:33:43.000000000 
+0200
+++ new/janet-1.33.0/test/suite-boot.janet      2024-01-07 20:30:08.000000000 
+0100
@@ -241,6 +241,16 @@
   (assert (pos? (% x 4)) "generate in loop"))
 (assert (= gencount 75) "generate loop count")
 
+# more loop checks
+(assert (deep= (seq [i :range [0 10]] i) @[0 1 2 3 4 5 6 7 8 9]) "seq 1")
+(assert (deep= (seq [i :range [0 10 2]] i) @[0 2 4 6 8]) "seq 2")
+(assert (deep= (seq [i :range [10]] i) @[0 1 2 3 4 5 6 7 8 9]) "seq 3")
+(assert (deep= (seq [i :range-to [10]] i) @[0 1 2 3 4 5 6 7 8 9 10]) "seq 4")
+(def gen (generate [x :range-to [0 nil 2]] x))
+(assert (deep= (take 5 gen) @[0 2 4 6 8]) "generate nil limit")
+(def gen (generate [x :range [0 nil 2]] x))
+(assert (deep= (take 5 gen) @[0 2 4 6 8]) "generate nil limit 2")
+
 # Even and odd
 # ff163a5ae
 (assert (odd? 9) "odd? 1")
@@ -951,4 +961,15 @@
 # (pp (disasm case-2))
 # (pp (disasm case-3))
 
+# Regression #1330
+(defn regress-1330 [&]
+  (def a [1 2 3])
+  (def b [;a])
+  (identity a))
+(assert (= [1 2 3] (regress-1330)) "regression 1330")
+
+# Issue 1341
+(assert (= () '() (macex '())) "macex ()")
+(assert (= '[] (macex '[])) "macex []")
+
 (end-suite)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/test/suite-ev.janet 
new/janet-1.33.0/test/suite-ev.janet
--- old/janet-1.32.1/test/suite-ev.janet        2023-10-15 21:33:43.000000000 
+0200
+++ new/janet-1.33.0/test/suite-ev.janet        2024-01-07 20:30:08.000000000 
+0100
@@ -366,4 +366,10 @@
                (exec-slurp ;run janet "-e" "(print :hi)")))
           "exec-slurp 1"))
 
+# valgrind-able check for #1337
+(def superv (ev/chan 10))
+(def f (ev/go |(ev/sleep 1e9) nil superv))
+(ev/cancel f (gensym))
+(ev/take superv)
+
 (end-suite)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/test/suite-peg.janet 
new/janet-1.33.0/test/suite-peg.janet
--- old/janet-1.32.1/test/suite-peg.janet       2023-10-15 21:33:43.000000000 
+0200
+++ new/janet-1.33.0/test/suite-peg.janet       2024-01-07 20:30:08.000000000 
+0100
@@ -263,6 +263,8 @@
 (marshpeg '(if-not "abcdf" 123))
 (marshpeg ~(cmt "abcdf" ,identity))
 (marshpeg '(group "abc"))
+(marshpeg '(sub "abcdf" "abc"))
+(marshpeg '(* (sub 1 1)))
 
 # Peg swallowing errors
 # 159651117
@@ -660,5 +662,53 @@
   (peg/match '(if (not (* (constant 7) "a")) "hello") "hello")
   @[]) "peg if not")
 
+(defn test [name peg input expected]
+  (assert (deep= (peg/match peg input) expected) name))
+
+(test "sub: matches the same input twice"
+  ~(sub "abcd" "abc")
+  "abcdef"
+  @[])
+
+(test "sub: second pattern cannot match more than the first pattern"
+  ~(sub "abcd" "abcde")
+  "abcdef"
+  nil)
+
+(test "sub: fails if first pattern fails"
+  ~(sub "x" "abc")
+  "abcdef"
+  nil)
+
+(test "sub: fails if second pattern fails"
+  ~(sub "abc" "x")
+  "abcdef"
+  nil)
+
+(test "sub: keeps captures from both patterns"
+  ~(sub '"abcd" '"abc")
+  "abcdef"
+  @["abcd" "abc"])
+
+(test "sub: second pattern can reference captures from first"
+  ~(* (constant 5 :tag) (sub (capture "abc" :tag) (backref :tag)))
+  "abcdef"
+  @[5 "abc" "abc"])
+
+(test "sub: second pattern can't see past what the first pattern matches"
+  ~(sub "abc" (* "abc" -1))
+  "abcdef"
+  @[])
+
+(test "sub: positions inside second match are still relative to the entire 
input"
+  ~(* "one\ntw" (sub "o" (* ($) (line) (column))))
+  "one\ntwo\nthree\n"
+  @[6 2 3])
+
+(test "sub: advances to the end of the first pattern's match"
+  ~(* (sub "abc" "ab") "d")
+  "abcdef"
+  @[])
+
 (end-suite)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/janet-1.32.1/test/suite-specials.janet 
new/janet-1.33.0/test/suite-specials.janet
--- old/janet-1.32.1/test/suite-specials.janet  2023-10-15 21:33:43.000000000 
+0200
+++ new/janet-1.33.0/test/suite-specials.janet  2024-01-07 20:30:08.000000000 
+0100
@@ -198,5 +198,9 @@
 
 (assert (= (test) '(1 ())) "issue #919")
 
-(end-suite)
+# Regression #1327
+(def x "A")
+(def x (if (= nil x) "B" x))
+(assert (= x "A"))
 
+(end-suite)

Reply via email to