1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-07-04 16:50:25 +02:00
Commit graph

22041 commits

Author SHA1 Message Date
Andy Wingo
04fdc33a54 Replace after-gc-hook with {add,remove}-after-gc-callback!
* libguile/gc.c:
(scm_gc_event_listener_restarting_mutators):
(after_gc_async_thunk):
(scm_init_gc): Instead of using a hook for after-gc callbacks, just use
a list of thunks.  Will allow us to move hooks to Scheme.
(add-after-gc-callback!, remove-after-gc-callback!): New functions.
* libguile/gc.h (scm_after_gc_hook): Remove.
* libguile/scmsigs.c (signal_delivery_thread): Update comment.
* module/statprof.scm (gcprof):
* test-suite/tests/gc.test ("gc"): Update to use new functions.
2025-06-16 11:36:07 +02:00
Andy Wingo
f436e550ea Pipes use finalizers instead of guardians
* module/ice-9/popen.scm (reap-pipe, open-pipe*): Instead of pumping a
guardian in the after-gc-hook, attach a finalizer.  This will pump pipes
in a thread instead of needing to do it ourselves.
2025-06-16 11:36:07 +02:00
Andy Wingo
2554e69f78 VM "hooks" actually are just lists
* libguile/vm.c (vm_hook_compute_enabled):
(invoke_hook):
(scm_i_vm_prepare_stack):
(VM_ADD_HOOK):
(VM_REMOVE_HOOK): Since we don't actually expose the hook objects, we
can just use lists; it's clearer and will let us move hook objects to
Scheme.
2025-06-16 11:36:07 +02:00
Andy Wingo
0d1171afe9 Fix creation of VM frames
Fix bug introduced in aa73d31de.

* libguile/frames.c (scm_c_make_frame): GC-malloc the scm_vm_frame, not
the scm_frame.
2025-06-16 11:33:45 +02:00
Andy Wingo
2c186f835b Allocate a static tc16 to directory streams
* libguile/filesys.c: Use a static tc16.
* libguile/eq.c:
* libguile/filesys.h:
* libguile/finalizers.c:
* libguile/finalizers.h:
* libguile/goops.c:
* libguile/print.c:
* libguile/scm.h:
* module/oop/goops.scm: Adapt for the new tc16.
2025-06-13 16:39:39 +02:00
Andy Wingo
df113d1589 Make scm_tc16_dir, SCM_DIRP etc private
* libguile/filesys.h:
* libguile/filesys.c (SCM_DIR_FLAG_OPEN):
(SCM_DIR_OPEN_P):
(SCM_DIRP):
(SCM_VALIDATE_DIR): Move here, from the header.  I don't think people
use them.
2025-06-13 15:09:22 +02:00
Andy Wingo
c1150bec2c Remove trailing whitespace
* libguile/continuations.c (pin_conservative_roots):
2025-06-13 13:31:37 +02:00
Andy Wingo
4e5a132f4f Capturing continuations pins conservative roots
* libguile/continuations.c (pin_conservative_roots): New helper.
(capture_auxiliary_stack):
(scm_i_make_continuation): Pin aux stack, jmpbuf, and stack items.
2025-06-13 13:30:36 +02:00
Andy Wingo
12da6739b1 Give continuations (contregs) their own static tc16
* libguile/continuations-internal.h: New file, for internal definitions.
* libguile/continuations.h: Move out internal definitions.
* libguile/Makefile.am: Add new file.
* libguile/continuations.c: Adapt to put the tag in the beginning of the
continuation (contregs) structure.
* libguile/eq.c:
* libguile/goops.c:
* libguile/init.c:
* libguile/print.c:
* libguile/scm.h:
* libguile/stacks.c:
* libguile/vm.c:
* module/oop/goops.scm: Adapt to contregs tc16 change.
2025-06-13 13:13:02 +02:00
Andy Wingo
f47fe6e752 Convert mutexes, condition vars to statically-allocated tc16
* libguile/scm.h: Add statically allocated tc16s for condvars and
mutexes.
* libguile/threads.c: Adapt to declare tag inline to struct scm_cond and
struct scm_mutex.
* libguile/threads.h: Expose printing procedures internally.
* module/oop/goops.scm:
* libguile/goops.c: Fix to statically allocate condition variable and
mutex classes.
* libguile/eq.c:
* libguile/print.c: Adapt.
2025-06-13 11:48:19 +02:00
Andy Wingo
7a1406891f Move char-set-cursor implementation to Scheme
Also deprecate the C interface.

* libguile/deprecated.h:
* libguile/deprecated.c (scm_char_set_cursor):
(scm_char_set_ref):
(scm_char_set_cursor_next):
(scm_end_of_char_set_p): Deprecate.
* libguile/srfi-14.c (charset-mutable?, char-set-ranges)
(charset-set-ranges!): New accessors, exposed internally to srfi-14.scm.
* libguile/srfi-14.c (scm_boot_srfi_14): Remove scm_tc16_charset_cursor.
* module/srfi/srfi-14.scm (<char-set-cursor>): Implement as a record.
2025-06-13 11:13:54 +02:00
Andy Wingo
4516119dd1 Deprecate srfi-14 in default environment
* libguile/srfi-14.c:
* module/srfi/srfi-14.scm: Arrange to define bindings here instead of in
the default environment.
* libguile/init.c:
* libguile/srfi-14.h: Fix so that srfi-14 can register an extension to
be loaded later.
* libguile/unidata_to_charset.awk: Rename private cs_letter_plus_digit
to cs_letter_and_digit.
* module/ice-9/deprecated.scm: Add deprecation trampolines for srfi-14.
* module/ice-9/sandbox.scm:
* module/language/elisp/lexer.scm:
* module/language/scheme/decompile-tree-il.scm:
* module/rnrs/unicode.scm:
* module/sxml/simple.scm:
* module/system/base/syntax.scm:
* module/system/repl/server.scm:
* module/texinfo/serialize.scm:
* module/texinfo/string-utils.scm:
* module/web/http.scm:
* module/web/uri.scm:
* test-suite/tests/strings.test:
* test-suite/tests/tree-il.test: Adapt for srfi-14 being in a module.
2025-06-13 09:03:20 +02:00
Andy Wingo
7d899fa7c7 Refactor (ice-9 deprecated) to be more concise
* module/ice-9/deprecated.scm (define-deprecated-trampoline):
(define-deprecated-trampolines): New helpers.  Use them to define all
the trampolines.
2025-06-12 21:54:07 +02:00
Andy Wingo
c794c086d5 Change charsets to use bytevector to store char ranges
This doesn't fundamentally change how charsets are represented, but it
will eventually allow us to migrate more functionality to scheme, as the
charsets have a Scheme-legible representation.  Also, and this is really
the point, give charsets their own type code, so that they can be
traced precisely.

* libguile/eq.c:
* libguile/evalext.c:
* libguile/goops.c:
* libguile/print.c:
* module/oop/goops.scm: Adjust to new tc16.
* libguile/srfi-14.h: Make private things private.
* libguile/srfi-14.c: Change to use bytevectors for the ranges.  No
functional change.
2025-06-12 16:49:27 +02:00
Andy Wingo
ec92d6a96e Fix bug whereby taking GC bytevectors was allocating inline storage
* libguile/bytevectors.c (make_bytevector_from_buffer): Whoops, don't
allocate inline storage for this kind of bytevector.
2025-06-12 11:51:14 +02:00
Andy Wingo
5c5b867455 Turn boot closures into subrs
* libguile/eval.c: Instead of applicable smobs, boot closures are subrs.
This gives better JIT and no shuffling in the VM.
(is_boot_closure):
(boot_closure_code):
(boot_closure_env):
(boot_closure_body):
(boot_closure_num_required_args):
(boot_closure_is_fixed):
(boot_closure_has_rest_args):
(boot_closure_is_rest): Inline functions instead of macros.
(eval): Create boot closures as programs, not smobs.
(prepare_boot_closure_env_for_apply):
(prepare_boot_closure_env_for_eval): Adapt to lower-casing of boot
closure inline functions.
(apply_boot_closure): Rename from boot_closure_apply.
(boot_closure_print): Remove.
(scm_init_eval): Update.
2025-06-11 21:59:58 +02:00
Andy Wingo
690845fa1e Convert tc16_catch_handler to be subrs
* libguile/throw.c (call_catch_handler): Rework to expect closure to be
program.
(scm_i_make_catch_handler): Rework to make closures.
(scm_init_throw): Rework to allocate trampoline code.
2025-06-11 16:12:35 +02:00
Andy Wingo
7ddcb48224 Convert tc16_thunk, tc16_exception_handler to be subrs
* libguile/exceptions.c (call_thunk):
(call_exception_handler): Rework to expect closure to be program.
(scm_c_make_thunk):
(scm_c_make_exception_handler): Rework to make closures.
(scm_init_exceptions): Rework to allocate trampoline code.
2025-06-11 16:02:30 +02:00
Andy Wingo
6389acf192 New internal functions to alloc subr closures
* libguile/gsubr.c (scm_allocate_subr_code):
(scm_make_subr_from_code): New functions.
(create_subr): Refactor in terms of new functions.
(scm_c_make_gsubr):
(scm_c_define_gsubr):
(scm_c_make_gsubr_with_generic):
(scm_c_define_gsubr_with_generic): Adapt.
2025-06-11 15:39:58 +02:00
Andy Wingo
710fa4c6f0 Add machinery to pass thread and/or closure when invoking subr
* libguile/gsubr.c: Arrange to store flags alongside array of subrs.
One flag indicates the thread should also be passed as the first
argument; another says that the closure should be passed.  Should remove
the need for arg shuffling in get_callee_vcode eventually.
(record_subr_name): Make the names be a vector; will integrate better
with precise tracing.
(create_subr): Add flags arg.  Adapt callers.
(scm_apply_subr): Allow for passing thread or closure.
* libguile/gsubr-internal.h: Add new interfaces to see whether to pass
closure or thread.  Pass thread to scm_apply_subr.
* libguile/jit.c (compile_subr_call): Allow for passing thread or
closure.
* libguile/vm-engine.c (subr_call): Pass thread.
2025-06-11 13:05:15 +02:00
Andy Wingo
c03071b380 Move subr internals off to internal header file
* libguile/gsubr-internal.h: New file.
* libguile/Makefile.am: Add to build.
* libguile/gsubr.h: Remove internal-only definitions.
* libguile/foreign.c:
* libguile/goops.c:
* libguile/gsubr.c:
* libguile/jit.c:
* libguile/programs.c:
* libguile/vm.c: Include new header.
2025-06-11 12:40:45 +02:00
Andy Wingo
d6e59a1d3e Convert bitvectors to use inline-only word-size units
* libguile/bitvectors.h: Unit of bitvectors is scm_t_bits, not uint32_t.
* libguile/bitvectors.c: Adapt implementation.
(make_bitvector): Malloc pointerless instead, with inline bits.
* libguile/posix.c (scm_setaffinity):
* libguile/bytevectors.c (uniform-array->bytevector): Adapt to unit size
change.
* module/system/vm/assembler.scm (intern-constant, link-data): Adapt to
bitvector representation change.
2025-06-03 16:54:19 +02:00
Andy Wingo
9ff7c0651c Give arrays a proper type in C land
As long as we have a tc7 for arrays, we should be able to access it with
a struct type instead of casting each word.

* libguile/arrays-internal.h: New file.
* libguile/arrays.h (scm_array_p): Take just one argument.
(SCM_I_ARRAYP):
(SCM_I_ARRAY_NDIM):
(SCM_I_ARRAY_V):
(SCM_I_ARRAY_BASE):
(SCM_I_ARRAY_DIMS):
(SCM_I_ARRAY_SET_V):
(SCM_I_ARRAY_SET_BASE): Remove.
(scm_i_raw_array, scm_i_make_array, scm_i_shap2ra, scm_init_arrays):
Remove internally-linked decls.
* libguile/init.c:
* libguile/print.c:
* libguile/array-handle.c: Use interfaces from new file.
* module/system/vm/assembler.scm: Update, as we now shift the dimension
count by only 16.  Requires a rebuild!
2025-06-03 14:55:09 +02:00
Andy Wingo
12e8772403 Move array-map / array-cell functions to Scheme module
* libguile/array-map.c:
* libguile/array-map.h: Remove.

* module/ice-9/deprecated.scm:
* libguile/deprecated.h:
* libguile/deprecated.c: Add deprecation shims.

* module/ice-9/arrays.scm: Move all array-map functionality here.

* libguile/Makefile.am:
* libguile/init.c:
* libguile.h: Remove array-map.h use.

* libguile/arrays.c (scm_i_array_equal_p, scm_i_array_copy): New
helpers.
(scm_array_cell_ref, scm_array_cell_set_x): Move to Scheme.
* libguile/arrays.h:
* libguile/eq.c (scm_equal_p):
* libguile/sort.c (scm_sort): Use new arrays.c helpers.
* module/ice-9/pretty-print.scm:
* module/oop/goops/save.scm: Import (ice-9 arrays).
2025-06-03 14:34:26 +02:00
Andy Wingo
0134abce74 Move private bytevectors API to a separate header
Also give bytevectors a private type (a struct).

* libguile/bytevectors.h (SCM_BYTEVECTOR_HEADER_SIZE): Remove.
(SCM_BYTEVECTOR_LENGTH):
(SCM_BYTEVECTOR_CONTENTS): Proxy to the C accessors.
(SCM_BYTEVECTOR_PARENT): Remove from public API.
(SCM_BYTEVECTOR_P, SCM_VALIDATE_BYTEVECTOR): Make public.
(scm_c_bytevector_contents): New function.
* libguile/bytevectors-internal.h: New file.
* libguile/Makefile.am (noinst_HEADERS): Add new file.

* libguile/bytevectors.c:
* libguile/array-handle.c:
* libguile/arrays.c:
* libguile/foreign.c:
* libguile/goops.c:
* libguile/init.c:
* libguile/loader.c:
* libguile/print.c:
* libguile/r6rs-ports.c:
* libguile/srfi-4.c:
* libguile/strings.c: Adapt to use bytevectors-internal.h as needed, and
sometimes to use the internal bytevector type.
2025-06-02 09:51:47 +02:00
Andy Wingo
51bc69dd1c Fix bytevector mutators to correctly check for mutability
Previously, bytevectors that were serialized into binaries were actually
mutable by compiled bytevector-u8-set! et al.

* libguile/bytevectors.h (SCM_F_BYTEVECTOR_IMMUTABLE): Renumber to 0x80,
as for immutable vectors.
(SCM_BYTEVECTOR_CONTIGUOUS_P): Just use SCM_CELL_TYPE.
(SCM_BYTEVECTOR_FLAGS): Remove unused accessor.
* module/language/tree-il/compile-cps.scm (bytevector-set-converter):
Emit mutable-bytevector? instead of bytevector?.
* module/system/vm/assembler.scm (link-data): Update immutable flag.
* module/language/cps/compile-bytecode.scm:
* module/language/cps/effects-analysis.scm:
* module/language/cps/type-fold.scm:
* module/language/cps/types.scm:
* module/system/base/types/internal.scm: Update for immutable-bytevector
predicates.
2025-05-30 16:48:26 +02:00
Andy Wingo
043a5b62bb Rework treatment of bytevector flags
Before, they were always shifted by 7.  Now the flags are just above
0x7f and just the element type is shifted, but by 16.

* libguile/bytevectors.h (SCM_BYTEVECTOR_FLAGS): Rework to not shift.
(SCM_SET_BYTEVECTOR_FLAGS): Remove.
(SCM_MUTABLE_BYTEVECTOR_P): Don't shift the immutable flag.
(SCM_BYTEVECTOR_ELEMENT_TYPE): Shift right by 16.
* libguile/bytevectors.c (SCM_BYTEVECTOR_SET_FLAG): Remove unused
helper.
(make_bytevector_tag): New helper.
(make_bytevector): Use new helper.
(make_bytevector_from_buffer): Add flags and parent args, and use new
helper.
(scm_c_take_gc_bytevector):
(scm_c_take_typed_bytevector):
(scm_bytevector_slice): Update callers.
* module/system/vm/assembler.scm (link-data): Don't shift the flag by 7;
instead shift the element type by 16.
2025-05-30 14:19:30 +02:00
Andy Wingo
464ec999de Make programs.h private
This header file turns out to only have internal details.  Users that
need introspection can use Scheme.

* libguile/programs.h (SCM_PROGRAM_P, SCM_PROGRAM_CODE)
(SCM_PROGRAM_FREE_VARIABLES, SCM_PROGRAM_FREE_VARIABLE_REF)
(SCM_PROGRAM_FREE_VARIABLE_SET, SCM_PROGRAM_NUM_FREE_VARIABLES)
(SCM_VALIDATE_PROGRAM, SCM_F_PROGRAM_IS_BOOT, SCM_F_PROGRAM_IS_PRIMITIVE)
(SCM_F_PROGRAM_IS_PRIMITIVE_GENERIC, SCM_F_PROGRAM_IS_CONTINUATION)
(SCM_F_PROGRAM_IS_PARTIAL_CONTINUATION, SCM_F_PROGRAM_IS_FOREIGN)
(SCM_PROGRAM_IS_BOOT, SCM_PROGRAM_IS_PRIMITIVE)
(SCM_PROGRAM_IS_PRIMITIVE_GENERIC, SCM_PROGRAM_IS_CONTINUATION)
(SCM_PROGRAM_IS_PARTIAL_CONTINUATION, SCM_PROGRAM_IS_FOREIGN): Remove
these macros, as we are making this whole API private.
(struct scm_program, scm_is_program, scm_to_program, scm_from_program)
(scm_program_flags, scm_program_is_boot, scm_program_is_primitive)
(scm_program_is_primitive_generic, scm_program_is_continuation)
(scm_program_is_partial_continuation, scm_program_is_foreign)
(scm_program_code, scm_program_free_variable_count)
(scm_program_free_variable_ref, scm_program_free_variable_set_x)
(scm_i_make_program): New inline functions.
* libguile/Makefile.am (noinst_HEADERS): Add programs.h; no longer
installed.  It was never directly included from libguile.h.
* libguile/continuations.c:
* libguile/continuations.h:
* libguile/control.c:
* libguile/foreign.c:
* libguile/frames.c:
* libguile/frames.h:
* libguile/goops.c:
* libguile/gsubr.c:
* libguile/gsubr.h:
* libguile/intrinsics.h:
* libguile/procprop.c:
* libguile/procs.c:
* libguile/programs.c:
* libguile/stacks.c:
* libguile/vm-engine.c:
* libguile/vm.c:
* libguile/vm.h: Adapt all users.
2025-05-30 12:52:54 +02:00
Andy Wingo
93e5a2454a Tighten up exported ABI / API of "programs"
* libguile/programs.h (scm_program_p, scm_program_code)
(scm_primitive_code_p, scm_primitive_code_name, scm_primitive_call_ip):
Don't expose these internal functions to C
ABI.
(scm_program_num_free_variables, scm_program_free_variable_ref,
scm_program_free_variable_set_x): Don't expose these previously-public
functions to C ABI.
(scm_is_program): New internal inline function.
* libguile/stacks.c (narrow_stack): Use new scm_is_program helper.
* libguile/programs.c: Adapt implementation to use SCM_DEFINE_STATIC.
2025-05-30 10:25:00 +02:00
Andy Wingo
224fb82a39 Give reified value objects a proper data type
* libguile/values.h (struct scm_values): New build-time definition.
(scm_to_values):
(scm_from_values):
(scm_values_count):
(scm_values_ref): New helpers.
* libguile/vm.c:
* libguile/values.c:
* libguile/print.c:
* libguile/numbers.c:
* libguile/eval.c: Adapt all callers.
2025-05-30 09:57:08 +02:00
Andy Wingo
aa73d31ded Inline "struct scm_frame" into tagged frame objects
This avoids an indirection and will make the tracer's job easier.

* libguile/frames.h (struct scm_vm_frame): New data type.
(scm_is_vm_frame):
(scm_vm_frame):
(scm_vm_frame_kind):
(scm_vm_frame_fp):
(scm_vm_frame_sp):
(scm_vm_frame_ip):
(scm_frame_init_from_vm_frame): New helpers.

* libguile/frames.c:
* libguile/stacks.c:
* libguile/stacks.h:
* libguile/vm.c: Update all users of SCM_VM_FRAME_* macros to use new
helpers.
2025-05-29 21:53:36 +02:00
Andy Wingo
75842cf215 Simplify struct scm_bignum
* libguile/integers.c (struct scm_bignum): Now that SCM_I_BIG_MPZ is
gone with other deprecated code, we can simplify the bignum
representation.  Adapt all users.
2025-05-28 11:22:29 +02:00
Andy Wingo
0a0ecc518b Arrange to pin objects captured by a delimited continuation
* libguile/vm.h (struct scm_vm_cont): Include the tag word, and put
flags there.  Rename stack bottom to stack slice and make a flexible
array.
(scm_is_vm_cont):
(scm_to_vm_cont):
(scm_from_vm_cont):
(scm_vm_cont_is_partial):
(scm_vm_cont_is_rewindable): New build-time helpers.

* libguile/continuations.c (scm_i_make_continuation):
(scm_i_continuation_to_frame):
(copy_stack_and_call):
* libguile/continuations.h (scm_t_contregs):
* libguile/frames.c (frame_stack_top):
* libguile/stacks.c (scm_make_stack): Adapt to take struct scm_vm_cont*
instead of SCM for continuations.

* libguile/vm.c (capture_stack): Adapt to scm_vm_cont change.  Use new
gc_resolve_conservative_ref API to pin conservative refs from the
captured stack.
(scm_i_vm_cont_to_frame):
(scm_i_capture_current_stack):
(reinstate_continuation_x):
(capture_continuation):
(compose_continuation):
(capture_delimited_continuation):
(abort_to_prompt): Adapt to type changes.
2025-05-27 16:02:01 +02:00
Andy Wingo
177643d416 Merge remote-tracking branch 'whippet/main' into wip-whippet 2025-05-27 15:50:57 +02:00
Andy Wingo
c49a372da7 Add gc_resolve_conservative_ref API 2025-05-27 15:50:28 +02:00
Andy Wingo
1abd5a310e Merge remote-tracking branch 'whippet/main' into wip-whippet 2025-05-26 12:22:22 +02:00
Andy Wingo
d0337bf4fe Further fix inlining
I want to get the "possibly_interior" case to fold at compile-time.
2025-05-26 12:18:31 +02:00
Andy Wingo
a4c0f1e231 Merge remote-tracking branch 'whippet/main' into wip-whippet 2025-05-26 11:58:48 +02:00
Andy Wingo
f5e10eb7c9 mmc: Speed up conservative ref resolution 2025-05-26 11:58:29 +02:00
Andy Wingo
94f6c8ce6a mmc: Fix inlining of trace_conservative_edges for pinned roots 2025-05-26 11:56:34 +02:00
Andy Wingo
e84dccb710 Merge remote-tracking branch 'whippet/main' into wip-whippet 2025-05-26 10:34:54 +02:00
Andy Wingo
cc9eb16e92 Add heuristic to grow mmc heap if no progress in last mutator cycle 2025-05-26 10:34:03 +02:00
Andy Wingo
b3d874c804 Add JIT support for bump-pointer allocation fast paths
* libguile/jit.c (emit_update_alloc_table):
(emit_allocate_bytes_fast_bump_pointer): Add implementation.
(compile_allocate_words_immediate_with_kind):
(compile_allocate_words_immediate_slow_with_kind): New helpers.
(compile_allocate_words_immediate):
(compile_allocate_words_immediate_slow):
(compile_allocate_pointerless_words_immediate):
(compile_allocate_pointerless_words_immediate_slow): Use new helpers.
2025-05-24 21:45:25 +02:00
Andy Wingo
3147d313f9 Add Guile's CFLAGS to WHIPPET_IMPL_CFLAGS
* libguile/Makefile.am (WHIPPET_IMPL_CFLAGS): Add GCC_CFLAGS, to ensure
the same compilation options (notably -fwrapv), to prevent mismatches at
LTO-time.
2025-05-23 09:44:50 +02:00
Andy Wingo
5d94b78095 Merge remote-tracking branch 'whippet/main' into wip-whippet 2025-05-23 09:44:31 +02:00
Andy Wingo
285ca65472 Fix missing static annotation on root_worklist_alloc 2025-05-23 09:44:20 +02:00
Andy Wingo
8c4866cd5c Merge remote-tracking branch 'whippet/main' into wip-whippet 2025-05-23 09:39:59 +02:00
Andy Wingo
f12399ef7d mmc: Only add headroom to unfragmentable heaps if no progress 2025-05-23 09:38:36 +02:00
Andy Wingo
140a412ecd Fix crash in gc_visit_ephemeron_key on objects in extern space 2025-05-23 09:38:02 +02:00
Andy Wingo
6841c9509a Merge remote-tracking branch 'whippet/main' into wip-whippet 2025-05-22 16:24:47 +02:00