From 515d5559a7c719378632b7f6c3d20efd328fa133 Mon Sep 17 00:00:00 2001 From: Syed Daanish Date: Wed, 28 Jan 2026 22:12:37 +0000 Subject: [PATCH] Allow ruby versions 3.2 and 3.4 for installation --- .clangd | 2 +- .gitattributes | 2 +- .gitignore | 1 + Makefile | 49 +- include/pch.h | 2 +- installer.sh | 48 +- libs/libruby/libruby.so | Bin 0 -> 3836456 bytes libs/libruby/ruby.h | 40 + libs/libruby/ruby/assert.h | 234 +++ libs/libruby/ruby/atomic.h | 890 +++++++++ libs/libruby/ruby/backward.h | 25 + libs/libruby/ruby/backward/2/assume.h | 56 + libs/libruby/ruby/backward/2/attributes.h | 165 ++ libs/libruby/ruby/backward/2/bool.h | 36 + .../ruby/backward/2/gcc_version_since.h | 37 + libs/libruby/ruby/backward/2/inttypes.h | 131 ++ libs/libruby/ruby/backward/2/limits.h | 99 + libs/libruby/ruby/backward/2/long_long.h | 73 + libs/libruby/ruby/backward/2/r_cast.h | 32 + libs/libruby/ruby/backward/2/rmodule.h | 36 + libs/libruby/ruby/backward/2/stdalign.h | 30 + libs/libruby/ruby/backward/2/stdarg.h | 69 + libs/libruby/ruby/backward/cxxanyargs.hpp | 700 +++++++ libs/libruby/ruby/config.h | 505 +++++ libs/libruby/ruby/debug.h | 667 +++++++ libs/libruby/ruby/defines.h | 116 ++ libs/libruby/ruby/digest.h | 72 + libs/libruby/ruby/encoding.h | 31 + libs/libruby/ruby/fiber/scheduler.h | 374 ++++ libs/libruby/ruby/intern.h | 64 + libs/libruby/ruby/internal/abi.h | 58 + libs/libruby/ruby/internal/anyargs.h | 376 ++++ libs/libruby/ruby/internal/arithmetic.h | 39 + libs/libruby/ruby/internal/arithmetic/char.h | 81 + .../libruby/ruby/internal/arithmetic/double.h | 72 + .../libruby/ruby/internal/arithmetic/fixnum.h | 60 + libs/libruby/ruby/internal/arithmetic/gid_t.h | 41 + libs/libruby/ruby/internal/arithmetic/int.h | 264 +++ .../ruby/internal/arithmetic/intptr_t.h | 74 + libs/libruby/ruby/internal/arithmetic/long.h | 356 ++++ .../ruby/internal/arithmetic/long_long.h | 135 ++ .../libruby/ruby/internal/arithmetic/mode_t.h | 41 + libs/libruby/ruby/internal/arithmetic/off_t.h | 62 + libs/libruby/ruby/internal/arithmetic/pid_t.h | 41 + libs/libruby/ruby/internal/arithmetic/short.h | 113 ++ .../libruby/ruby/internal/arithmetic/size_t.h | 66 + .../ruby/internal/arithmetic/st_data_t.h | 75 + libs/libruby/ruby/internal/arithmetic/uid_t.h | 41 + libs/libruby/ruby/internal/assume.h | 87 + libs/libruby/ruby/internal/attr/alloc_size.h | 32 + libs/libruby/ruby/internal/attr/artificial.h | 46 + libs/libruby/ruby/internal/attr/cold.h | 37 + libs/libruby/ruby/internal/attr/const.h | 46 + libs/libruby/ruby/internal/attr/constexpr.h | 84 + libs/libruby/ruby/internal/attr/deprecated.h | 75 + libs/libruby/ruby/internal/attr/diagnose_if.h | 42 + .../ruby/internal/attr/enum_extensibility.h | 32 + libs/libruby/ruby/internal/attr/error.h | 32 + libs/libruby/ruby/internal/attr/flag_enum.h | 33 + libs/libruby/ruby/internal/attr/forceinline.h | 40 + libs/libruby/ruby/internal/attr/format.h | 38 + .../libruby/ruby/internal/attr/maybe_unused.h | 38 + libs/libruby/ruby/internal/attr/noalias.h | 69 + libs/libruby/ruby/internal/attr/nodiscard.h | 45 + libs/libruby/ruby/internal/attr/noexcept.h | 91 + libs/libruby/ruby/internal/attr/noinline.h | 35 + libs/libruby/ruby/internal/attr/nonnull.h | 34 + libs/libruby/ruby/internal/attr/noreturn.h | 48 + libs/libruby/ruby/internal/attr/pure.h | 43 + libs/libruby/ruby/internal/attr/restrict.h | 44 + .../ruby/internal/attr/returns_nonnull.h | 37 + libs/libruby/ruby/internal/attr/warning.h | 32 + libs/libruby/ruby/internal/attr/weakref.h | 32 + libs/libruby/ruby/internal/cast.h | 50 + libs/libruby/ruby/internal/compiler_is.h | 45 + .../libruby/ruby/internal/compiler_is/apple.h | 40 + .../libruby/ruby/internal/compiler_is/clang.h | 37 + libs/libruby/ruby/internal/compiler_is/gcc.h | 45 + .../libruby/ruby/internal/compiler_is/intel.h | 40 + libs/libruby/ruby/internal/compiler_is/msvc.h | 56 + .../ruby/internal/compiler_is/sunpro.h | 54 + libs/libruby/ruby/internal/compiler_since.h | 61 + libs/libruby/ruby/internal/config.h | 155 ++ libs/libruby/ruby/internal/constant_p.h | 38 + libs/libruby/ruby/internal/core.h | 35 + libs/libruby/ruby/internal/core/rarray.h | 585 ++++++ libs/libruby/ruby/internal/core/rbasic.h | 158 ++ libs/libruby/ruby/internal/core/rbignum.h | 80 + libs/libruby/ruby/internal/core/rclass.h | 93 + libs/libruby/ruby/internal/core/rdata.h | 386 ++++ libs/libruby/ruby/internal/core/rfile.h | 51 + libs/libruby/ruby/internal/core/rhash.h | 144 ++ libs/libruby/ruby/internal/core/rmatch.h | 146 ++ libs/libruby/ruby/internal/core/robject.h | 176 ++ libs/libruby/ruby/internal/core/rregexp.h | 168 ++ libs/libruby/ruby/internal/core/rstring.h | 578 ++++++ libs/libruby/ruby/internal/core/rstruct.h | 121 ++ libs/libruby/ruby/internal/core/rtypeddata.h | 604 ++++++ libs/libruby/ruby/internal/ctype.h | 545 +++++ libs/libruby/ruby/internal/dllexport.h | 112 ++ libs/libruby/ruby/internal/dosish.h | 89 + .../ruby/internal/encoding/coderange.h | 202 ++ libs/libruby/ruby/internal/encoding/ctype.h | 258 +++ .../libruby/ruby/internal/encoding/encoding.h | 1060 ++++++++++ .../libruby/ruby/internal/encoding/pathname.h | 184 ++ libs/libruby/ruby/internal/encoding/re.h | 46 + libs/libruby/ruby/internal/encoding/sprintf.h | 78 + libs/libruby/ruby/internal/encoding/string.h | 346 ++++ libs/libruby/ruby/internal/encoding/symbol.h | 100 + .../ruby/internal/encoding/transcode.h | 562 ++++++ libs/libruby/ruby/internal/error.h | 582 ++++++ libs/libruby/ruby/internal/eval.h | 400 ++++ libs/libruby/ruby/internal/event.h | 154 ++ libs/libruby/ruby/internal/fl_type.h | 948 +++++++++ libs/libruby/ruby/internal/gc.h | 57 + libs/libruby/ruby/internal/glob.h | 113 ++ libs/libruby/ruby/internal/globals.h | 209 ++ libs/libruby/ruby/internal/has/attribute.h | 163 ++ libs/libruby/ruby/internal/has/builtin.h | 117 ++ libs/libruby/ruby/internal/has/c_attribute.h | 38 + .../libruby/ruby/internal/has/cpp_attribute.h | 86 + .../ruby/internal/has/declspec_attribute.h | 47 + libs/libruby/ruby/internal/has/extension.h | 33 + libs/libruby/ruby/internal/has/feature.h | 31 + libs/libruby/ruby/internal/has/warning.h | 31 + libs/libruby/ruby/internal/intern/array.h | 657 ++++++ libs/libruby/ruby/internal/intern/bignum.h | 846 ++++++++ libs/libruby/ruby/internal/intern/class.h | 394 ++++ libs/libruby/ruby/internal/intern/compar.h | 62 + libs/libruby/ruby/internal/intern/complex.h | 253 +++ libs/libruby/ruby/internal/intern/cont.h | 282 +++ libs/libruby/ruby/internal/intern/dir.h | 42 + libs/libruby/ruby/internal/intern/enum.h | 73 + .../libruby/ruby/internal/intern/enumerator.h | 259 +++ libs/libruby/ruby/internal/intern/error.h | 287 +++ libs/libruby/ruby/internal/intern/eval.h | 222 +++ libs/libruby/ruby/internal/intern/file.h | 213 ++ libs/libruby/ruby/internal/intern/gc.h | 392 ++++ libs/libruby/ruby/internal/intern/hash.h | 320 +++ libs/libruby/ruby/internal/intern/io.h | 661 +++++++ libs/libruby/ruby/internal/intern/load.h | 218 ++ libs/libruby/ruby/internal/intern/marshal.h | 112 ++ libs/libruby/ruby/internal/intern/numeric.h | 208 ++ libs/libruby/ruby/internal/intern/object.h | 501 +++++ libs/libruby/ruby/internal/intern/parse.h | 194 ++ libs/libruby/ruby/internal/intern/proc.h | 353 ++++ libs/libruby/ruby/internal/intern/process.h | 273 +++ libs/libruby/ruby/internal/intern/random.h | 116 ++ libs/libruby/ruby/internal/intern/range.h | 89 + libs/libruby/ruby/internal/intern/rational.h | 172 ++ libs/libruby/ruby/internal/intern/re.h | 249 +++ libs/libruby/ruby/internal/intern/ruby.h | 77 + libs/libruby/ruby/internal/intern/select.h | 86 + .../ruby/internal/intern/select/largesize.h | 214 ++ .../ruby/internal/intern/select/posix.h | 144 ++ libs/libruby/ruby/internal/intern/signal.h | 152 ++ libs/libruby/ruby/internal/intern/sprintf.h | 159 ++ libs/libruby/ruby/internal/intern/string.h | 1757 +++++++++++++++++ libs/libruby/ruby/internal/intern/struct.h | 203 ++ libs/libruby/ruby/internal/intern/thread.h | 492 +++++ libs/libruby/ruby/internal/intern/time.h | 161 ++ libs/libruby/ruby/internal/intern/variable.h | 628 ++++++ libs/libruby/ruby/internal/intern/vm.h | 431 ++++ libs/libruby/ruby/internal/interpreter.h | 304 +++ libs/libruby/ruby/internal/iterator.h | 513 +++++ libs/libruby/ruby/internal/memory.h | 666 +++++++ libs/libruby/ruby/internal/method.h | 205 ++ libs/libruby/ruby/internal/module.h | 177 ++ libs/libruby/ruby/internal/newobj.h | 195 ++ libs/libruby/ruby/internal/rgengc.h | 443 +++++ libs/libruby/ruby/internal/scan_args.h | 534 +++++ libs/libruby/ruby/internal/special_consts.h | 362 ++++ libs/libruby/ruby/internal/static_assert.h | 77 + libs/libruby/ruby/internal/stdalign.h | 135 ++ libs/libruby/ruby/internal/stdbool.h | 51 + libs/libruby/ruby/internal/symbol.h | 332 ++++ libs/libruby/ruby/internal/value.h | 133 ++ libs/libruby/ruby/internal/value_type.h | 449 +++++ libs/libruby/ruby/internal/variable.h | 337 ++++ libs/libruby/ruby/internal/warning_push.h | 124 ++ libs/libruby/ruby/internal/xmalloc.h | 392 ++++ libs/libruby/ruby/io.h | 1022 ++++++++++ libs/libruby/ruby/io/buffer.h | 96 + libs/libruby/ruby/memory_view.h | 325 +++ libs/libruby/ruby/missing.h | 342 ++++ libs/libruby/ruby/onigmo.h | 952 +++++++++ libs/libruby/ruby/oniguruma.h | 8 + libs/libruby/ruby/ractor.h | 264 +++ libs/libruby/ruby/random.h | 359 ++++ libs/libruby/ruby/re.h | 147 ++ libs/libruby/ruby/regex.h | 43 + libs/libruby/ruby/ruby.h | 321 +++ libs/libruby/ruby/st.h | 199 ++ libs/libruby/ruby/subst.h | 26 + libs/libruby/ruby/thread.h | 235 +++ libs/libruby/ruby/thread_native.h | 205 ++ libs/libruby/ruby/util.h | 228 +++ libs/libruby/ruby/version.h | 159 ++ libs/libruby/ruby/vm.h | 54 + src/scripting/process.cc | 2 - 200 files changed, 40636 insertions(+), 22 deletions(-) create mode 100644 libs/libruby/libruby.so create mode 100644 libs/libruby/ruby.h create mode 100644 libs/libruby/ruby/assert.h create mode 100644 libs/libruby/ruby/atomic.h create mode 100644 libs/libruby/ruby/backward.h create mode 100644 libs/libruby/ruby/backward/2/assume.h create mode 100644 libs/libruby/ruby/backward/2/attributes.h create mode 100644 libs/libruby/ruby/backward/2/bool.h create mode 100644 libs/libruby/ruby/backward/2/gcc_version_since.h create mode 100644 libs/libruby/ruby/backward/2/inttypes.h create mode 100644 libs/libruby/ruby/backward/2/limits.h create mode 100644 libs/libruby/ruby/backward/2/long_long.h create mode 100644 libs/libruby/ruby/backward/2/r_cast.h create mode 100644 libs/libruby/ruby/backward/2/rmodule.h create mode 100644 libs/libruby/ruby/backward/2/stdalign.h create mode 100644 libs/libruby/ruby/backward/2/stdarg.h create mode 100644 libs/libruby/ruby/backward/cxxanyargs.hpp create mode 100644 libs/libruby/ruby/config.h create mode 100644 libs/libruby/ruby/debug.h create mode 100644 libs/libruby/ruby/defines.h create mode 100644 libs/libruby/ruby/digest.h create mode 100644 libs/libruby/ruby/encoding.h create mode 100644 libs/libruby/ruby/fiber/scheduler.h create mode 100644 libs/libruby/ruby/intern.h create mode 100644 libs/libruby/ruby/internal/abi.h create mode 100644 libs/libruby/ruby/internal/anyargs.h create mode 100644 libs/libruby/ruby/internal/arithmetic.h create mode 100644 libs/libruby/ruby/internal/arithmetic/char.h create mode 100644 libs/libruby/ruby/internal/arithmetic/double.h create mode 100644 libs/libruby/ruby/internal/arithmetic/fixnum.h create mode 100644 libs/libruby/ruby/internal/arithmetic/gid_t.h create mode 100644 libs/libruby/ruby/internal/arithmetic/int.h create mode 100644 libs/libruby/ruby/internal/arithmetic/intptr_t.h create mode 100644 libs/libruby/ruby/internal/arithmetic/long.h create mode 100644 libs/libruby/ruby/internal/arithmetic/long_long.h create mode 100644 libs/libruby/ruby/internal/arithmetic/mode_t.h create mode 100644 libs/libruby/ruby/internal/arithmetic/off_t.h create mode 100644 libs/libruby/ruby/internal/arithmetic/pid_t.h create mode 100644 libs/libruby/ruby/internal/arithmetic/short.h create mode 100644 libs/libruby/ruby/internal/arithmetic/size_t.h create mode 100644 libs/libruby/ruby/internal/arithmetic/st_data_t.h create mode 100644 libs/libruby/ruby/internal/arithmetic/uid_t.h create mode 100644 libs/libruby/ruby/internal/assume.h create mode 100644 libs/libruby/ruby/internal/attr/alloc_size.h create mode 100644 libs/libruby/ruby/internal/attr/artificial.h create mode 100644 libs/libruby/ruby/internal/attr/cold.h create mode 100644 libs/libruby/ruby/internal/attr/const.h create mode 100644 libs/libruby/ruby/internal/attr/constexpr.h create mode 100644 libs/libruby/ruby/internal/attr/deprecated.h create mode 100644 libs/libruby/ruby/internal/attr/diagnose_if.h create mode 100644 libs/libruby/ruby/internal/attr/enum_extensibility.h create mode 100644 libs/libruby/ruby/internal/attr/error.h create mode 100644 libs/libruby/ruby/internal/attr/flag_enum.h create mode 100644 libs/libruby/ruby/internal/attr/forceinline.h create mode 100644 libs/libruby/ruby/internal/attr/format.h create mode 100644 libs/libruby/ruby/internal/attr/maybe_unused.h create mode 100644 libs/libruby/ruby/internal/attr/noalias.h create mode 100644 libs/libruby/ruby/internal/attr/nodiscard.h create mode 100644 libs/libruby/ruby/internal/attr/noexcept.h create mode 100644 libs/libruby/ruby/internal/attr/noinline.h create mode 100644 libs/libruby/ruby/internal/attr/nonnull.h create mode 100644 libs/libruby/ruby/internal/attr/noreturn.h create mode 100644 libs/libruby/ruby/internal/attr/pure.h create mode 100644 libs/libruby/ruby/internal/attr/restrict.h create mode 100644 libs/libruby/ruby/internal/attr/returns_nonnull.h create mode 100644 libs/libruby/ruby/internal/attr/warning.h create mode 100644 libs/libruby/ruby/internal/attr/weakref.h create mode 100644 libs/libruby/ruby/internal/cast.h create mode 100644 libs/libruby/ruby/internal/compiler_is.h create mode 100644 libs/libruby/ruby/internal/compiler_is/apple.h create mode 100644 libs/libruby/ruby/internal/compiler_is/clang.h create mode 100644 libs/libruby/ruby/internal/compiler_is/gcc.h create mode 100644 libs/libruby/ruby/internal/compiler_is/intel.h create mode 100644 libs/libruby/ruby/internal/compiler_is/msvc.h create mode 100644 libs/libruby/ruby/internal/compiler_is/sunpro.h create mode 100644 libs/libruby/ruby/internal/compiler_since.h create mode 100644 libs/libruby/ruby/internal/config.h create mode 100644 libs/libruby/ruby/internal/constant_p.h create mode 100644 libs/libruby/ruby/internal/core.h create mode 100644 libs/libruby/ruby/internal/core/rarray.h create mode 100644 libs/libruby/ruby/internal/core/rbasic.h create mode 100644 libs/libruby/ruby/internal/core/rbignum.h create mode 100644 libs/libruby/ruby/internal/core/rclass.h create mode 100644 libs/libruby/ruby/internal/core/rdata.h create mode 100644 libs/libruby/ruby/internal/core/rfile.h create mode 100644 libs/libruby/ruby/internal/core/rhash.h create mode 100644 libs/libruby/ruby/internal/core/rmatch.h create mode 100644 libs/libruby/ruby/internal/core/robject.h create mode 100644 libs/libruby/ruby/internal/core/rregexp.h create mode 100644 libs/libruby/ruby/internal/core/rstring.h create mode 100644 libs/libruby/ruby/internal/core/rstruct.h create mode 100644 libs/libruby/ruby/internal/core/rtypeddata.h create mode 100644 libs/libruby/ruby/internal/ctype.h create mode 100644 libs/libruby/ruby/internal/dllexport.h create mode 100644 libs/libruby/ruby/internal/dosish.h create mode 100644 libs/libruby/ruby/internal/encoding/coderange.h create mode 100644 libs/libruby/ruby/internal/encoding/ctype.h create mode 100644 libs/libruby/ruby/internal/encoding/encoding.h create mode 100644 libs/libruby/ruby/internal/encoding/pathname.h create mode 100644 libs/libruby/ruby/internal/encoding/re.h create mode 100644 libs/libruby/ruby/internal/encoding/sprintf.h create mode 100644 libs/libruby/ruby/internal/encoding/string.h create mode 100644 libs/libruby/ruby/internal/encoding/symbol.h create mode 100644 libs/libruby/ruby/internal/encoding/transcode.h create mode 100644 libs/libruby/ruby/internal/error.h create mode 100644 libs/libruby/ruby/internal/eval.h create mode 100644 libs/libruby/ruby/internal/event.h create mode 100644 libs/libruby/ruby/internal/fl_type.h create mode 100644 libs/libruby/ruby/internal/gc.h create mode 100644 libs/libruby/ruby/internal/glob.h create mode 100644 libs/libruby/ruby/internal/globals.h create mode 100644 libs/libruby/ruby/internal/has/attribute.h create mode 100644 libs/libruby/ruby/internal/has/builtin.h create mode 100644 libs/libruby/ruby/internal/has/c_attribute.h create mode 100644 libs/libruby/ruby/internal/has/cpp_attribute.h create mode 100644 libs/libruby/ruby/internal/has/declspec_attribute.h create mode 100644 libs/libruby/ruby/internal/has/extension.h create mode 100644 libs/libruby/ruby/internal/has/feature.h create mode 100644 libs/libruby/ruby/internal/has/warning.h create mode 100644 libs/libruby/ruby/internal/intern/array.h create mode 100644 libs/libruby/ruby/internal/intern/bignum.h create mode 100644 libs/libruby/ruby/internal/intern/class.h create mode 100644 libs/libruby/ruby/internal/intern/compar.h create mode 100644 libs/libruby/ruby/internal/intern/complex.h create mode 100644 libs/libruby/ruby/internal/intern/cont.h create mode 100644 libs/libruby/ruby/internal/intern/dir.h create mode 100644 libs/libruby/ruby/internal/intern/enum.h create mode 100644 libs/libruby/ruby/internal/intern/enumerator.h create mode 100644 libs/libruby/ruby/internal/intern/error.h create mode 100644 libs/libruby/ruby/internal/intern/eval.h create mode 100644 libs/libruby/ruby/internal/intern/file.h create mode 100644 libs/libruby/ruby/internal/intern/gc.h create mode 100644 libs/libruby/ruby/internal/intern/hash.h create mode 100644 libs/libruby/ruby/internal/intern/io.h create mode 100644 libs/libruby/ruby/internal/intern/load.h create mode 100644 libs/libruby/ruby/internal/intern/marshal.h create mode 100644 libs/libruby/ruby/internal/intern/numeric.h create mode 100644 libs/libruby/ruby/internal/intern/object.h create mode 100644 libs/libruby/ruby/internal/intern/parse.h create mode 100644 libs/libruby/ruby/internal/intern/proc.h create mode 100644 libs/libruby/ruby/internal/intern/process.h create mode 100644 libs/libruby/ruby/internal/intern/random.h create mode 100644 libs/libruby/ruby/internal/intern/range.h create mode 100644 libs/libruby/ruby/internal/intern/rational.h create mode 100644 libs/libruby/ruby/internal/intern/re.h create mode 100644 libs/libruby/ruby/internal/intern/ruby.h create mode 100644 libs/libruby/ruby/internal/intern/select.h create mode 100644 libs/libruby/ruby/internal/intern/select/largesize.h create mode 100644 libs/libruby/ruby/internal/intern/select/posix.h create mode 100644 libs/libruby/ruby/internal/intern/signal.h create mode 100644 libs/libruby/ruby/internal/intern/sprintf.h create mode 100644 libs/libruby/ruby/internal/intern/string.h create mode 100644 libs/libruby/ruby/internal/intern/struct.h create mode 100644 libs/libruby/ruby/internal/intern/thread.h create mode 100644 libs/libruby/ruby/internal/intern/time.h create mode 100644 libs/libruby/ruby/internal/intern/variable.h create mode 100644 libs/libruby/ruby/internal/intern/vm.h create mode 100644 libs/libruby/ruby/internal/interpreter.h create mode 100644 libs/libruby/ruby/internal/iterator.h create mode 100644 libs/libruby/ruby/internal/memory.h create mode 100644 libs/libruby/ruby/internal/method.h create mode 100644 libs/libruby/ruby/internal/module.h create mode 100644 libs/libruby/ruby/internal/newobj.h create mode 100644 libs/libruby/ruby/internal/rgengc.h create mode 100644 libs/libruby/ruby/internal/scan_args.h create mode 100644 libs/libruby/ruby/internal/special_consts.h create mode 100644 libs/libruby/ruby/internal/static_assert.h create mode 100644 libs/libruby/ruby/internal/stdalign.h create mode 100644 libs/libruby/ruby/internal/stdbool.h create mode 100644 libs/libruby/ruby/internal/symbol.h create mode 100644 libs/libruby/ruby/internal/value.h create mode 100644 libs/libruby/ruby/internal/value_type.h create mode 100644 libs/libruby/ruby/internal/variable.h create mode 100644 libs/libruby/ruby/internal/warning_push.h create mode 100644 libs/libruby/ruby/internal/xmalloc.h create mode 100644 libs/libruby/ruby/io.h create mode 100644 libs/libruby/ruby/io/buffer.h create mode 100644 libs/libruby/ruby/memory_view.h create mode 100644 libs/libruby/ruby/missing.h create mode 100644 libs/libruby/ruby/onigmo.h create mode 100644 libs/libruby/ruby/oniguruma.h create mode 100644 libs/libruby/ruby/ractor.h create mode 100644 libs/libruby/ruby/random.h create mode 100644 libs/libruby/ruby/re.h create mode 100644 libs/libruby/ruby/regex.h create mode 100644 libs/libruby/ruby/ruby.h create mode 100644 libs/libruby/ruby/st.h create mode 100644 libs/libruby/ruby/subst.h create mode 100644 libs/libruby/ruby/thread.h create mode 100644 libs/libruby/ruby/thread_native.h create mode 100644 libs/libruby/ruby/util.h create mode 100644 libs/libruby/ruby/version.h create mode 100644 libs/libruby/ruby/vm.h diff --git a/.clangd b/.clangd index bc78fbd..2796071 100644 --- a/.clangd +++ b/.clangd @@ -1,5 +1,5 @@ CompileFlags: - Add: [-I/home/syed/main/crib/include, -I/home/syed/main/crib/libs, -I/usr/include/ruby-3.4.0, -I/usr/include/ruby-3.4.0/x86_64-linux, c++20] + Add: [-I/home/syed/main/crib/include, -I/home/syed/main/crib/libs, -I/home/syed/main/crib/libs/libruby, c++20] Remove: [] Compiler: clang++ diff --git a/.gitattributes b/.gitattributes index fbc82cd..cdef9c1 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -/libs/unicode_width/** linguist-vendored +/libs/** linguist-vendored diff --git a/.gitignore b/.gitignore index 9a8ad3e..c4f99f4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ *.a *.o *.so +!libs/libruby/libruby.so *.yml .vscode diff --git a/Makefile b/Makefile index ab96538..bb704ee 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,8 @@ OBJ_DIR := build INCLUDE_DIR := include TARGET_DEBUG := $(BIN_DIR)/crib-dbg -TARGET_RELEASE := $(BIN_DIR)/crib +TARGET_RELEASE_32 := $(BIN_DIR)/crib-ruby3.2 +TARGET_RELEASE_34 := $(BIN_DIR)/crib-ruby3.4 PCH_DEBUG := $(OBJ_DIR)/debug/pch.h.gch PCH_RELEASE := $(OBJ_DIR)/release/pch.h.gch @@ -12,13 +13,23 @@ PCH_RELEASE := $(OBJ_DIR)/release/pch.h.gch CCACHE := ccache CXX := $(CCACHE) clang++ +RUBY32_INC := -I./libs/libruby +RUBY32_LIB := libs/libruby/libruby.so +RUBY32_PATCH := patchelf --replace-needed libruby-3.2.so.3.2 libruby.so + +RUBY34_INC := \ + -I/usr/include/ruby-3.4.0 \ + -I/usr/include/ruby-3.4.0/x86_64-linux + +RUBY34_LIB := -lruby + CFLAGS_DEBUG :=\ -std=c++23 -Wall -Wextra -Wno-c23-extensions \ -O0 -fno-inline -gsplit-dwarf\ -g -fno-omit-frame-pointer\ -Wno-unused-command-line-argument \ - -I./include -I./libs \ - -I/usr/include/ruby-3.4.0 -I/usr/include/ruby-3.4.0/x86_64-linux + -I./include -I./libs -I./libs/libruby + CFLAGS_RELEASE :=\ -std=c++23 -O3 -march=native \ -fno-rtti -fstrict-aliasing \ @@ -29,8 +40,20 @@ CFLAGS_RELEASE :=\ -fno-unwind-tables -fno-asynchronous-unwind-tables\ -Wno-unused-command-line-argument \ -Wno-c23-extensions \ - -I./include -I./libs \ - -I/usr/include/ruby-3.4.0 -I/usr/include/ruby-3.4.0/x86_64-linux + -I./include -I./libs -I./libs/libruby + +CFLAGS_RELEASE_32 := $(CFLAGS_RELEASE) $(RUBY32_INC) +CFLAGS_RELEASE_34 := $(CFLAGS_RELEASE) $(RUBY34_INC) + +LIBS_32 := \ + libs/libgrapheme/libgrapheme.a \ + $(RUBY32_LIB) \ + -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic -lmagic + +LIBS_34 := \ + libs/libgrapheme/libgrapheme.a \ + $(RUBY34_LIB) \ + -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic -lmagic PCH_CFLAGS_DEBUG := $(CFLAGS_DEBUG) -x c++-header PCH_CFLAGS_RELEASE := $(CFLAGS_RELEASE) -x c++-header @@ -40,10 +63,6 @@ UNICODE_SRC := $(wildcard libs/unicode_width/*.c) UNICODE_OBJ_DEBUG := $(patsubst libs/unicode_width/%.c,$(OBJ_DIR)/debug/unicode_width/%.o,$(UNICODE_SRC)) UNICODE_OBJ_RELEASE := $(patsubst libs/unicode_width/%.c,$(OBJ_DIR)/release/unicode_width/%.o,$(UNICODE_SRC)) -LIBS := \ - libs/libgrapheme/libgrapheme.a \ - -Wl,-Bstatic -lpcre2-8 -Wl,-Bdynamic -lmagic -lruby - SRC := $(wildcard $(SRC_DIR)/**/*.cc) $(wildcard $(SRC_DIR)/*.cc) OBJ_DEBUG := $(patsubst $(SRC_DIR)/%.cc,$(OBJ_DIR)/debug/%.o,$(SRC)) OBJ_RELEASE := $(patsubst $(SRC_DIR)/%.cc,$(OBJ_DIR)/release/%.o,$(SRC)) @@ -57,7 +76,7 @@ all: debug test: $(TARGET_DEBUG) -release: $(TARGET_RELEASE) +release: $(TARGET_RELEASE_32) $(TARGET_RELEASE_34) $(PCH_DEBUG): $(INCLUDE_DIR)/pch.h mkdir -p $(dir $@) @@ -70,10 +89,16 @@ $(PCH_RELEASE): $(INCLUDE_DIR)/pch.h $(TARGET_DEBUG): $(PCH_DEBUG) $(OBJ_DEBUG) $(UNICODE_OBJ_DEBUG) mkdir -p $(BIN_DIR) $(CXX) $(CFLAGS_DEBUG) -o $@ $(OBJ_DEBUG) $(UNICODE_OBJ_DEBUG) $(LIBS) + patchelf --replace-needed libruby-3.2.so.3.2 libruby.so $@ -$(TARGET_RELEASE): $(PCH_RELEASE) $(OBJ_RELEASE) $(UNICODE_OBJ_RELEASE) +$(TARGET_RELEASE_32): $(PCH_RELEASE) $(OBJ_RELEASE) $(UNICODE_OBJ_RELEASE) mkdir -p $(BIN_DIR) - $(CXX) $(CFLAGS_RELEASE) -o $@ $(OBJ_RELEASE) $(UNICODE_OBJ_RELEASE) $(LIBS) + $(CXX) $(CFLAGS_RELEASE_32) -o $@ $(OBJ_RELEASE) $(UNICODE_OBJ_RELEASE) $(LIBS_32) + $(RUBY32_PATCH) $@ + +$(TARGET_RELEASE_34): $(PCH_RELEASE) $(OBJ_RELEASE) $(UNICODE_OBJ_RELEASE) + mkdir -p $(BIN_DIR) + $(CXX) $(CFLAGS_RELEASE_34) -o $@ $(OBJ_RELEASE) $(UNICODE_OBJ_RELEASE) $(LIBS_34) $(OBJ_DIR)/debug/%.o: $(SRC_DIR)/%.cc $(PCH_DEBUG) mkdir -p $(dir $@) diff --git a/include/pch.h b/include/pch.h index c681a70..4804b13 100644 --- a/include/pch.h +++ b/include/pch.h @@ -6,7 +6,7 @@ #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wunused-parameter" -#include +#include "ruby/ruby.h" #pragma clang diagnostic pop #include #include diff --git a/installer.sh b/installer.sh index 8c443df..68546a3 100644 --- a/installer.sh +++ b/installer.sh @@ -2,7 +2,41 @@ set -e BINARY_NAME="crib" -GITHUB_URL="https://github.com/SyedM-dev/crib/releases/download/v0.0.1-alpha/crib-linux-x86_64" +VERSION="v0.0.1-alpha" + +if [ -z "$RUBY_VERSION" ]; then + if ldconfig -p | grep -q libruby.so.3.4; then + HAVE_34=1 + fi + if ldconfig -p | grep -q libruby-3.2.so; then + HAVE_32=1 + fi + + if [ "$HAVE_34" = "1" ] && [ "$HAVE_32" = "1" ]; then + echo "Multiple Ruby versions detected." + echo "Select Ruby ABI:" + echo " 1) Ruby 3.4" + echo " 2) Ruby 3.2" + read -r choice + case "$choice" in + 1) RUBY_VERSION="3.4" ;; + 2) RUBY_VERSION="3.2" ;; + *) + echo "Invalid choice" + exit 1 + ;; + esac + elif [ "$HAVE_34" = "1" ]; then + RUBY_VERSION="3.4" + elif [ "$HAVE_32" = "1" ]; then + RUBY_VERSION="3.2" + else + echo "No compatible Ruby library found (need Ruby 3.2 or 3.4)." + exit 1 + fi +fi + +GITHUB_URL="https://github.com/SyedM-dev/crib/releases/download/$VERSION/crib-linux-x86_64-ruby$RUBY_VERSION" missing=() command -v ruby >/dev/null 2>&1 || missing+=("ruby") @@ -17,7 +51,9 @@ if [ ${#missing[@]} -ne 0 ]; then exit 1 fi -echo "Install locally ~/.local/bin or globally /usr/bin? [l/g]" +echo "Installing Crib (Ruby $RUBY_VERSION)" + +echo "Install locally (~/.local/bin) or globally (/usr/bin)? [l/g]" read -r choice case "$choice" in l | L) INSTALL_DIR="$HOME/.local/bin" ;; @@ -34,6 +70,8 @@ echo "Downloading binary..." curl -L "$GITHUB_URL" -o "$INSTALL_DIR/$BINARY_NAME" chmod +x "$INSTALL_DIR/$BINARY_NAME" -echo "$BINARY_NAME installed to $INSTALL_DIR" -echo "You can run it with: $BINARY_NAME" -echo "Remember to add $INSTALL_DIR to PATH if not already." +echo +echo "✔ Crib installed to $INSTALL_DIR" +echo "Run with: $BINARY_NAME" +echo "Ruby ABI: $RUBY_VERSION" +echo "Add $INSTALL_DIR to PATH if needed." diff --git a/libs/libruby/libruby.so b/libs/libruby/libruby.so new file mode 100644 index 0000000000000000000000000000000000000000..1340240454a686fac78bae823c9fa8d15d6df3a9 GIT binary patch literal 3836456 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

8*feq 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

k)!-u@eQ_?D!S7OD3`@4*`KWcJv+; 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%0DRSk`{Q(biVi+O5X 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

0>+2-<&em_6~s%3 zSamt$B};A!uW2t2jS-InN?EDy`m&SMk&H{bZf~rJU6G%gK3r8q`P62}<7A1(YDBn| z)4q{wQ^))(o@mB(edFb{Z_Sh#bV7MLR%aJ*?IT!3cR7Bw{m4*;*idxxh6$OiWM)ZdHK-)isyY(>b5U99l$G)R^d$$>0dSik!?dA^e2{B=41MgnL8ryO#-@Y&M7CaX^q5 z4a%A{+#r3KhV?rGobK)8X5u)sP;cv+MKPwW)YG9bS;)zo4HffJ5=#A=>{pF-J z&p=mv&sesyLk?re>A7^Df6Z=|=Uzc*1@X|vHT(K1GilcpioD{NlNNm{37Pv7168dS_``|nJRClg%Ur&Jgw((IaS|&Ixc6C{aEPE{*gNW zo-4cU{|MiG@eKHOR0AIr=Ymh{N^l;PVujjIu^D_@e889J;DXO356Js#0;Ct5WcYY< z?sa^Fai*R5j4W{R@Ae2-u_^FkoVq)YhuM)T2U6bOV{bhpmOn`OftCC@6-65-@G{^m z*$>(0t#Ee+AbaALipVBkpY^`jd0F1rsrbYG<}Lc%Z=JHu$4zCw4)AocKWm3Xu`F6? z-LW6l%EjA3F4&ibb|Z_){c}8>Tk|!|n$cdCVrb=o-pB?AXo;-tI5hvvi)cibUE5N0 z*|ou>%c)rhm&I4tAM@v1kW1Vb`eqwLnOzZiKe32DDr+ zsv)+8zfXg@_I+6bLC_%}d44Z^B} z_onEJjVn2W{mA$q#ftC4E}|}7Cp*RRug1m6I9-7k1(`=q>S(4ipC&dmwdn^l)+`)G=vruc`B zzjSr3Eia(DPRqR7|0fU>8uFoCR>=5rQHUp7yjlLE&IgMSjH z1!V&(+%izX|o&$!{7nx&F@lQfm3~ihfawq!M&s`-)zo1g_8qEMy@~(7# zYCd_*K`%RrVTOF?=x;;2c$f1l?wj8P-$cz?7D({he?^3>}JIuQ&yDsku|YaJ|Mm60Lg zo^kbqcFkR`CC=yJGA!y~r_^|4e~@iqyVQbv#+fKzlghp;ecc% zd{6X56-8SDKCRJ0PgL~V#A2AIiy!G`pmANI!YbRXHX%H60VV5AN>9L|u!CkrF4oT- z$Y>HGb!dF5xA!zOCO$SSsZ7MX-|c6JjXcv7-@-)3yQL5|Phl^0<+W`XtiC9=zjzDj zi(*z-TjqJ&>Xik;>w_3fmdm>y#FM79(Dgz#P~;?yF4^-i=b|xe?a7nu@nh|O9{ zDkA*Dd}t~B4dzz{j9eU%0z`6=Q&TL6P2?N(2?CZsdZk=ekP<~Y_5fw7dZI;Lsp%vrZv}5EhGzI9EriX8X~vR>-Rz0!;PR_VMEM>wXvfj?JlhJ#HR>v6R}_6b z<$U6I%mufaw9A+Pur2bcB=g2>TmVeWW(2m}O#WOux=c0Ah&(*zGWhD`>F`zYU~|ev z)bQAT{k0unlfTazf249|MXX0#@Kf!VQ+?GeHK@iCTnKP80dlraT-R)49(W)oH9!#5TBW)Sw$LK-ZAA*`mM69>}x_YUbG``SM=GP_>wVIM7~O_<*#dh z^q-t7xSCDKh0-khzKGt76K4zCOZoHIE*WeTn$-s9i6|OWujhk1?P@CvDN?S~DE42? zLslqZV_KG~Q^9qxbLU2lYfEz4*Y9!KF{(5R)ejN};hhauc!$hSw3k2Y7kxU$cK)^M z!uZ@Y8bm>6=+Y`Uifgh-@9wFUVWOB_7g;X+AroU*H#X5aD?6@Z^MX zvna-X4450F)uGc2qpG8L+i*P4k?LQe*pfTg_WBA*{FCFkZcxLM$2U+gr*W^_yy ztNc7LQ&eYoHc_-;*9hvFfS6Db0U5*m@<>5<%LD+#_)AgP|r-3ho4MwGhey zw+VSFn0%Z68UF$988RDq%|^|^SSA3Q**dYUnv0R^RC1JF!?1BIO!6EzmnDx1Fw9u6 zo_S(Hs!22rf2e1pntGIQe0?!xrCM{P<{Pd<4pCxEa0Kk*_}`xSE<(vys$F9Ppc(uK zd?Ep3=#3U1by$B-V%I$fHhEvc5xwNzY?`0@cxu5IE&aliH;cw8f-f=m4b*99Cm7Kx zpr51KU!X^{N~XWH9?@J?IgtWlSvH*73cmwF{n0U~NWL>4-stcgVbD{3k@tcfSa!m` zH?}dXI#N-q{tCvK#adaS^Qq0Nooow3aI9uY6OD_2b=nbD`15JHEab`3zVLoc@N(LJ zbOKN~5Il|pa|#0UF);^DI1mxYSM)3UDTE0VCO%Zr9`u#yk$z?t7C^M>x_hL}r8=sa zkrOy~5OOTns==oOR20u2+npy5zEkf^hF|4rVyOmb4oO=z9~Y5A>!z@9@ACKg!CUl} z6}khi?~Co%WpRH>>XUY590{dXJ^d3zW;TEIz+-}5Gq$O-Q)63xEn@>czM^*~?pu9B zBZ0`O*;k2jsHvzTUeV`!b}u!G>b_Vd%DRfUzvyQx^f`Oo$}IGcpO}JdEtPRKQ1?Rj zG^vZ-B*jXzWC0u)#-O!J4`z3Apcy~nkrh5fb}bzPO14!nR1sHE5!~eRF7kyeTPg>7 zRqyH-e3uVItJpB)6|}X_$=D-xNLU-RxmUJv?(79MktI4NzLP%P`QBCCPl6L%OPUkdwUV{%pD6I8IJ1nP;fZ`0n35Rl;98(J!SLR)m- zSA`zYJ4d}Y^fh|9Ung`AHePtL6%(SFgqMocaoxXs`9Z7xHKc zpEX0MCiMST5&9vdw{H-kzcQXU+_YD;dqVe$*wtBj_E`;y&61uzFE~?P>z?nY9}!el z#w!p_A;^k8idk>X6LjbpJm5QZ{q>&Fn3Owv)G~_<1IMP@`6GsUhu{ zIVM`Db>a03SxnGL@(#UzpkIwq7m01T0d%l0#->14Q{qEdOAoRh!mz-*GuG5rHT)~RvC<3TL)_O#WOgegk1UJi zS~FKy!)<)Y4#;y+^iH|y$JO#bafH=!dC-QaLx_+(B`)}yzCtK{3S_sE_SJ^F05~e%=u(8OkJ2dc`^o-v!qb8R9pug* zEy3DfXNC9GXvWDwXfm?Yh9CU-ir$-$;%BfSi7q}?7KF3@Dl|XSF~#A_43E>ORWq6& zdJlmKA2|pm7yG4*ByfOuRW+)^^qPV(8`{v!dg|qdS^HuG4{)aFG@Dfh_%Sgj@%0WZ z=NSLH10L)wr>ZQ7VG2N0#HO?YfjFXlBrbvcds0>uSTQ)m!AM#C1@m zFIJY%B?=)(eL^K1G4dX0ZWLJ%coSif*kZ*mRzb{f1)$W+4E4?-K{r2-MBVhArWFVX ztL7%Ph!zq#%FWOdygS3rN8yO_Rg1$MpG9l-#%Jcz;bBh{(oLm!2%clwad!6;0l0VT4 znRv{iz5%kkF?1P4aKUN=)>)Zgo#Fy3y}zW}GvmjCoH>3mDZ9o`FPYKME+T#c~AS1=SUH#F_>pCg|R!<4zeJ-|?{?a-tJm+4HUj|7!1d z#6w;zOGpR7&ORd>w64#9-R-A3nkt{fqbyV+WpU*xj;` z@Zm4iXII0ePkzM^Db2?W)`3V2~Fp zz6AHK6`az4{DA!oRsn@y!I|9N24kI3`Y-ywwU`E~MOXuqUke1*p_;9h@oYFcVR=_#xx|>>| zT5Sv*99a&7_TJda!vc^S&5`x;2;%l{AsXizO?vIie5LrK?IX;?e%dFxxfWLy4Cf>n z!qu=MI>i&HD6{4dfOD2s@0n_af77g?PW>A(fQ3{d8^w1J)wj|-W2;KzI#X01o7!1Xx!n|lUf$TgQDO=xV^dYI-15=(efsrFM1|X z&>I4EzSuA%sERqLkc=RO>TD$IE`_4?>H^S#SDWDHP_T3K4XvPst*R5$$X_gz>ozc% zko7G376}e%N!+DW-d&wN!=nR#)k?1m!KR2&&%MejiB{G69Q%_mdaA*a3|!=z|t8st6oJ7oULJ=`Iua)$o=2R*bF_2>GYc&$2T7V{P= zpDl`znRGqd8y&b*&}sZBqZ*AODQ{Ohn0Fyl0T4s#Ju;6>?nmb^xtlLza*Y>AHGLYp zGxYi^@#TOsgI?$ILIw0HqMeIcpjX7(eie}^o+E6K_9hkpYxXt4nb~0* z2-?FO0oT>=6LwE~W>rt-F|u5Hj^9jiW;ThlFU(~va;z|yH`N2{WnO;_jFnX(6C7Tn z*HMP0|3Kjn+!$%9=-@Q5yI-(NCZn*zH|iln9&#+}^Ja=!1jiSAk$h6m2c0>*V$y<6 z#M1-hHhM(sVHj$lgdx(>dYu{+x+l!+*x1K@-hiO7#E_qVz)?52tT>PtiO7D z{Z)wNR*feFk=xUZH1yq8cn-Co8E3ApWoAkvD}~S9&qSRPkR`ZX9nCR;zojH?{Ys_^ zNls2Rf*o182j3>xS)Mo@emHKHzJUWL`SlJs$%!P{_;7H&pGa!Zhnp|2(iTmzj;VK} zrm@}n2qJPG5#&cexUXEwx;fKO@~x8age1thNnM~cF^3tA6W=UWyzzQDIcYP5emH79 z--fz#RqgbhFr_0t7{)tR(Za*{Loa{5t-F4$)fd@EZJM$ZjxiL4h(5*mW5wBz%Yb`s zJWZayLLuH-{qn$0QU)6ppi}G&it$R7B}$3AD4-h=9ic9umb6so#@BV7ivUnv)Vxl# zr8-Bxrt5T-I!8CJbAC&89_OS6Y}>A*PQ(4pU^~2}I?tPazL7f1n%CJ%QZpP}h|oem zv!%}M&Fd^|sm?96y3RzYb7Av3Gg_*%!Sr*c)H$+wopV~Mb2}$RU^`0c{5-oE4i0Il z&W#+HsMAL3EN)&WNm5fB^xgQh)G5AqCv|Rh>WCY%p@UbQI;kWIPa00)s^*2IzV5(X zI9qqnHz+QDeVjUJLOai?lS*O)FF=*_v+q-^ncwbfHu%F@s8ifiI#}ftHsGVSJMT%_ z_=#i!fDQt6^*m3l~}8O>}Hh)kW5b(OQm1`VIv>~{3)zm)w5ZpWAu_PK29nvX;$fBq#vb7&P2p5B-2w{ zsdQ_zN;~FI>E&jXz9E@PUreM@WwT0Sm~l0=StY-rwCAN#Ub9NKOC?{kO4pl8)1^}K z-lm9nO)7P1R_Sq5>A^?Io$plIrTskpvBF~7;ykRrB*$3}4R&Vn8)tA(ixpn;FRI=| z0e`ILv(@nD=wQP*(J;rlzO;xR%d42`EQ-oTe8MxW;K`wvnA{F%&fsC>!)kU z>YthAF&b#$+jfZZm>(K_n=OycFJ4>V)YOPF>f^fW!$_sdb{_ROwc(7LC>bEUnBc9xC8{3*Jt63H6rv}p(k zK;{ccmS)y?96kopyGV^AGqW~{@Ww0alGPzI>&wkL>nEATZFd<&*rWZxWPK-DAKO_r zbe~9c9&rUUS+bUw zOeE`Bot1t1>3S_oEm_FpK(@-V@`x{pP`xqx(%wE)wQ}#@g z=3r(7VlKt20YVM5v+VWsR8VJKAz25REV!Rj@jd~jRc2!o4S{cy8k-^-PTJlipS6>O z1rNd3lq<8@%RK!(DmYC_6wl|kRv=S!r4*eqQKqx_5lP4F#v(18C+TBN`Yn=vYp^A4z}8q_1?P=Sq6aq(86I^YWyf z10+3Y(*I%7b^E_vNqUt@pXw_At)!Qm^l_$r&V#YS4Nk7A+6Q(FuxJ=T!n)DNN zdbMuXb8*H7)o%G&}4bOX6eQKrDpVY zp``4!#bS*W?(o{*WliO%yCzCT&zlD8X4YOsO*zcBR=$%Yvc1`wSsD92s@q(34vqDj zp$XTa^Cf11^e7>#v(Cys*6xRZ>n~2uD17q_-A-94g*V=!v*dnL*SA7C{We*Y@43>K zg?0K3l0M&+{=m&T{R&Bc#FgI3ls{S0Z*iqxHdU8D-4B1d%9Xysl&?CQ^5?nIKQ{|? z%fXZ%>PkP`w6k8)k94KKW#D=Ha@sk-m42KV*8)jzs7a6aU{n4%N&nhOH%#abKvHix zY2aq6Y2#KY`;setqe;JGIIuk6O8>fAkF|~|RyVuS8%%n)a>`%kq|2?ySl64#Qs+5o zBpiL8kXqq=vdIi}r5}eOeKGl_en8AT1>Em4K57g-L zZ6*B-SNbUto&LMv;RILujgxiyuae%&mHwgGTpml3zK<(?Uo%&4N%<|IG#+j?^t4dY zKXIkMZqnyS`eIl5;|8C1N&3^S^j#*sTGDTKrJrr!yjIe$bEUs-(l3$pi(Kh{HRVwVV3Z-agBMUVn7P2uk{+_j&na{9%fgP3(t% zO^)}21bgRO{^*%`{>Z9v1#z4vCLAQuNqJ9zpWVE%vvB-bHi1w?kyXomkyT0YQv?po zd0QHWwQCntemo|=^;$~~w3ZBOWxcS>7g>V`Zx%89S5AC84W0GsCsfMw-1<%3Jf#!t5|z z>R=ma|MSeVa-8u(CGKP(S4whHxXw%-YhI%?iQqf?p6TlKHkVFI1%7rV$kibpIuz& z9)GlYHls?Jyqntdz}Nm6w5`+qP-WE+xY!zpu2rjUcmRZTpq7iw6{Fi zq3G)|yYBX-fZ7EU+5<*n4s(m`aWkE?*OuB~uZHHKxm!6Q}Xt!ij2 zh~v+pN!h&BEP;Zwt9Rty5}~4qHr*21Vgz6QNNgm3@X0>X>QggX2HGcfjs8| zW%U_5$Le$CT&qtoZuObsep*1Ab?G-&PV|DO#5`W7t=`C`z-VHSm5VKh;a47(n|GL~JtV4E>$`A+8XwG<&Q+VpQ-_@=*Qx`Zy)hH9B~~nPa?}^U6O<>~ z_sipv(1Ze=Gg!kIIpI{WAFpjdn#XDHcxs8)D2Y1k}lebF}gJop?uw;~$I=N3%E)C+ywWzFGs z6c*#z5^ARe)>%IL^k@(K?Y4;1$h&PgLx@pYUZEDBZ3&cdxYN>y5<)F6`96FW|3Kf; zEmmo0<1{fyK`q?t-a=UZx$5uZBy2!Zqg#6{RV~1TJ6G6^>Uod&8EdbW4Mhh^@2gVR z=!54rcLnBt&)B*8K8LwDvr&D)Lwxp#1xYDm@-lVk4;}R@JJoc=nSJcs#0|1IcD;vr zCFO4`^yjQ`Zr;gttz3V!zZ=m6fCt_+xzY-D@*lqI2#P1mGc6<8`*;R<9VyJ$8m6=F zE?I?KZoxB*oPNKN6Xm&_j3;AwFEI7mvASHqX$B9w#HZ$<46U#FJPU^a`(1f`1A3?g z1}{4~Yx%6igTL%(Rv&=%1IQBL4DSWt+BKj%uOLH5TxnI_J37)Hsf}lwU{xoQ;0yiH z$ot2!!pqLliI_+8NY)om*6Y&ulcDw_4Z@(@VbdswK5`!cj`vJRXHyqjSR9F|@LNio z`-z{CmD=x0W0kwf{mS%A#f9W1|DDR$^U)mslicvnq>6^LIlsjw>5 z$zXE-GyY%i=Yqc-RW$tnG+0pEZ*#$abgJokl3nm$K!$pUGz0%#Q#Ag+_?w3R6-jr) z|2AzK{NGQO8-Bt6!y_Cd-9&Cv_$kmHfHfJVsQ&C!&(#0|dP`FYCjyELsO#-_!;|{h z>0Bi$h;yPZ{GxAnPoguawmey>8!oLZO|P#9D3a<)MQ!}dFsM+Ul8~C;eN&*vNp|6< zhz#{F(hPn+oUHLP7_Ux%y+_jB_<4@D4SsGQt0{h_oax|a6uB+nCvj|3{2Z6+c{G5~ z<)NvBX@FwzgFB^aZ>Oj5vyiqDzucO}4>*f7YyU$En2~u*`%6;^XFBa)#jP6kjGdlp zf0VR;cV_#2nzcV6)!ZBg5B!&;5)MhVe;4ihnzsM@F|>cYtNrHl`#MEZ^V^Q1f{wyE zoBwQ&xaRk0G0F%RRP`jg=Jx_J)H|dZEWCb`p5J3Q*HQKrNq5ih?9}xt}+31&-u$9WQ%hZ!KRq z$0~X6W%x99Z2f$L-tZn8A~GsLQcm5%00Yq^_Y)co;z_~jG4i`VI!BHss!~9}0#-!p z(Mj!?MfF$dK;LF}#{)3qiDtiXly0wTFYRTU_O_guZm-jyws(bTZ~witH*cAS@A;wW z_LgnlJAARi6_4wIs>xC@TEfwYAY-;H(ZP=LEAn4eV&5eQ6dCdngz(joZbFF8lJg}e z{R!UaED_I97zD<7WBbW7Eg-B~WOXgh_xZpZ>#{2J4e>F4wnoxzC_ae5jse1= zNxepXtRXA-qxW^4Ll7qf>8a>H)&#pI23|vO4Lm6uygC#KC8`mzmZ7>B657x<^h0X` zC0zftcWJye0bTw;UD3*%3uJ!ewVq%$XNO?Nl7^M~XG5@;)>!~-+fe->#INfW{MMX! zS!!i6h<)sIb8T&Dy)`y7Ixy8iWsMj41N@*Up4a>VnSFqW@N=*P*Fm75m4bMPjvr)o+uqu%6s zXgyAS_}boITNVafFHA_HUmT#xV-URK*aaCOJyQJUh9m9$ru5v>$UDMH)zYxdMz{Gi zGgEU(C=Y)ZJl-(KB55A|Z5J&d+)buQ_tVrUqI?q9dMb$q|Nht!FLc$-P~}u?weniu zMpZ=t`<4U@yK8|MaebL-10=05Gwqh^VAY3argfEa`)8(gleC?obRVKCY)7I1_YLXk z@gLEA{N(FxWSiF>KMAh!KLZdn_XE=dV(%u?9zRVv<0mma{w}HUpPL##1zh8wNQUxd zrVWs^!pyWiK^cE$+UZhm|ID;*lD6~abRT;BB{}hIvwE+9WA=q)x*@Ndhg=ZMV!acSyZfnQ7-py)Dx-+CN{?KF>`1R_rq?Nt0pd zTTiABz1FG{|02hA97O*V&2D#y>@8h;(HeWws!j~g(Nk4{7FTh1Ji!KA`6@@+j4fU~ zU%y|BQYTVZ5SL3J#D+fE6Fh>QTMpkQWV=;!r#5qrb%$?3{^eReSD?i4`$L*Qt-#H| zI2R9l>@9U!J(%P;= z*KoTn&|PkrWxeK+odu6qn*U2aw@6onzX)87s)D=K1Q^@!n!apCgb(f(MsswPq$TC8 z`2=H&XHoiwhO!H@@`698r#`|4xZR@_kTn7N#KC?)_~#uj7@c|C=US z;GcxuZU5XyFpS%N24-JT+`1#d4+#liz3>@#@RR$SdNr$q%SjbbD{A6Xk5Y#Lf`-)r zBO(n%dT9(LrlE_I{YCx$VP>)L*>n#P49ZzBxmnZJ3Y83D} zm<-RS31E9vYDUl*NzGjodbpIS>T+s=>_^daQ8MT*d1+=JrKV(%l4sM=!)Q zYQ-NlWKo8?Bo#lC(-^y|MCFKP59kG|2+M#-XUlV?(Qv+qEEUmz<%_(6!Y^Bbv23(J(vOtxSxp-SiIv*R_uz&tZW^1fcTBu8$Vh+iPHK|^I22tkVs6>QFM&9>Z|w9R>z8_vHsKo#1HY&Z&y7?8Vw$kp{BEH7RnkX z){`5Nj(jKlLL8xgUDA#4ex3mL8Or0d6Fd$1aJ827###NAS`WsFNP_nKYBY#hfxiO> zOML75xq?8}x3gw?($&wUWO@?ULyg>Dew#8*c6f|gD^|~btSs(yd;>jZosmJwU(AJ) z2TNUzKQM9C`f*nObrXa1G?s^{x2^`DZ*JVj3hN%M{sdLJYFbPPdpv z@Ia4#0&L|1y45QbICCnPjIJZE)$4SDI8vxl(*HuLnEuT`_h~xN@cpLIavBv7KW*0N z%h$LX-A5Xgn4z;E|BeEP?%N>1SCK}5p{-9}XkawpH6cO2m4cI|<|{gEL~UChJ`|;| zj^i60Hl75;=Xeltf7nRpqnwXHlDa>FF{Fxc4~_JZ8!XG(2Di$QfN1OchQ2|%-q|b2 zJAr3&;t<1-6byc9=a9CbWqy(DRxinf?}OrsydYNGxkbdJ>*pysy|t*ZPpWOCUo{& z&&8|HY}W>(n>RFl1Y9A@ZGE!$Tg`b!yJdH!W7&X@{{Cnl!meDIY|l#1Ysjh&5F&8+ z0J)z!(2)Itb4^Vf;8h=qdcu;bpH(EMC!j{B*1Bm=Fz*n@2 zu)~%#fcK|qL3TI$J zP9jAD?5obq7SBP5wNVI$WNxWa!YRngwIl1NQ&{RYVUbxc#p`sOf0-zLiv3Zy71fWp zVjstzGH;HQix71xdK!xa`_)bv14{>Lj$S*`TXan>4}M5mOy41nRIXL$J!cNc!n6+7 z#Z5CY^A<~lhNJc)fe%X*Rex-BPVy`*_bgRbsGj?P%dMEK5aO4~xFoU-w*tK}{Y-+_ z4&2WrJ&pRsm+Vi;$RZhlI$AcMh;BB8jeFPWL5zUg+1R*O4_`C55p4NRs-V^z88ImZ zo(Bt^RWnYIZ9^=#0C~SlgT;j8C1jIJ(W`95+#NSalVQ5f@m7sQnc^%jRA9~*DD`5x zY_v2tI=i0i=-lu4x2{@#%YS+S3)*ki9|r9=fc8nbfk{Q51kdAUX!v;n+q~JZP|qOZ zHd8F9_0D)$(89g+x$+hIJ>Lq8aH|em1)f5Kh*@rF#CPk zQBwLKToCx89htPKH<$NzuJ1^()xpp7D=%bHUmLug{Oce(QYPgkYaRH7pXfEMLys9_ z-j3V*iZc2m#NCVl(yVIr5L45zysday)OzmxAw}4^@@%0H-lgR&F&!JlT6Zfvi7DlVrvxrgt-paNE;XcGCS=$;RqQmo z7%WPCSx>P-5^Q_9yBuE1DNlu1*JYJBOc7e@#*aFB65^X-&Sj2XkM2*(D1Qpqh*gCY zK8$qr5j>Ik0r%TPbP)Mk%<$W-S3i|wnCyHmH!rs=5&6I$En8U<`sQSx$Pit5wHpU4 z-}W^~7Ndi`8cyxlDp2YTg-Y5WO&GB}&BMi2E41NJ-%^!Labj4REf12J8Rhthz5Jp8zU4fB+u&vVbIX`FhE zKYAoPS+GcE^iDzJ=6`pfVGbheRmYDz@cdJ~6&~=WY&Tz1M#P##`}HnZpB3y4sE+#(!kgliGjeY7$2SZb4&R_8XLw|I{?{ zL=6sWI1tXfBPG}cN36Ej!{2Mh3z|3@z~ZF=?`)|d$B>`B*3of}h}peWPmg@Og^qk_ za=uN+_lnyQOjt-e`L;Uzc|)&4pUyo|bFLdFSC}~&%l&!xm?VrzCJBFJ#NlLz$Oo_t z@6vCfzl|q*V{i20WkLXKi>}A_kt%J7X9W+%Y3RNVoU=mkfWROkkcBp61v?-xZ>v6| z9bRhiJ-0K*s3yl(d;Jm%V1;Ot0=|Rss^~%>gCO*H+rg&8EWh={wuznLIl&jD)a|Dq z>`DGp__OZkbm=E6S+9=#w;(!$9!;o5S+mW#Bo8_UPLP;CR#?Y94*kyS4yUt-8kT2S zH9MKQ>fiUX!XvaKk^SQSa+>7)GAMcAEFJGd;$cE$)mA^^Dm9Ryx*o(b(ryu>B7G_S zrs_=Cazv~)_>${46SkngVo^=L0#l*(9$`@+dvadNuBHS0N8rJQi+Tu|R+37_m%Q!?}1~G zekEP+ci9P{8ja5chDP3(LU^N-Fa@RPDLGo|3&}@l(g;srvflqhMZr||W;ZQyj-V6t zV|~GT&OAz;vY|D#D;2v|J!f-I9%Ol~=u@Q0vZ!|?YB-Ek(UK9a$8~~7>2uh0I)mY$ z&fLL9co44BSpE}pF6}5jq}627vNt#Rk;o$+$1bGLqf&*noU)hs32u;-&=>PMp{t$ZGmXY%VYd(aZ9%6yvfBGx% zjouPESAU-qI3VFG;(_uRNW!^I70y8adW(Bxs*| zk#X1scsS@eiPOeH4L&YauH3dCQ3C@{NRSFWZ`x2|NL}-Xmd3*{B%YKV-4!CsakEKq zp8YjTf|>V6YqfQFMj?Pjme=ywguFk&%JzNm2M!)^k+q-&`N|5v%@2}bF-!S{;00%S zm0z4J?4zmu4r7W1vnG6@hAdy&XPijG@D6dx#%&xONsbkkIF-KWqDfq)fn`8lU#t5U z8$Um-hmMY2L$CQ(_zUSjx?etTHnYecHS~c}W0@6-OIECWk}r1eXk-wXo8Z;n>{TR- zv2`m0UX*R-%nBbvhkD&+94!7yDhwUTtv)5-nSCije2G0f5d3$vvu0@BHPdqB?6!iX zgdB?uKcS-5$P8#WtzA|imfna;tykA(>Snyr@X8$N4{6G}`C?7@3@r%FuUG#X-qy2t zUx6I%%K|@2UHA%?;#lDeC&~H~iKa-#qC@lF@t{a8)s*JGp(*xAs#vE~vGKZ?;YT8d ztQw%*X|Ky*r@_CP@rw+j=_~Qg30*w17}xY~gdRinZN2SRSv45`IZbX-AN?qlY1O>U zw*#WrsFKa_nvsX_>`!X-tFN{?kZ`9?mKpb(KyOYyhg zBPah-9pV2M$hck2hrzaG(IpQt$!utW;Vc??TPyq1*7Oo9T$pO?IvTV2JWJ}Ulu+Fz zfavYnA zp2f&tvRRClJ|o%pQcKOU^J^vFGWn;O{3&mde~q0#Q}Pcm`6rnCO35E#=Z|-_Ke?@- zGP|$j53uvSlFx}<`p-7?vn4;r&hIVx5_yXJYkO$;zFJNGw&M-_?fxI?-UK{~D(fFk z2n|8N3PKcQF=$j!QBa~}07)d#YUox}P+XWn5!7){(uyJ)=x(4aTjP$3f{qLB=qLt6 zNLZ4fsB9u`5Ky4npde_%qU8Ji&aJAh4sqW3Ki~WRp6BzKA${xKbMAibx#ygFjwgTJ z0LlM=`K#@G3wRv(g(^SB{CReM4fE~(zo7ERGr!EvpXnLp3YuVH>`)&8X_|3v1O+4*ysZ!etJRsNsV$iLmrpTTyT zIoGtpN;7=lAPdhqP6dX11YV)uGV^GaXn`n4W@f5NfbzbB73rMcxqGz;z3xaTw8#h8 zp)}^b<(*W74+6Q~$>y0kKEUG2i#QCz@Mb=T%JLhk<$%cs?x>wcZV1lCGjFle7#%G_ zo|Q;D11WI5hP(n}--#)CKuw%CAin|3z%ISZ+VIv+*6z2ZoZ*zqvdi^qQmzKVV$ zF_fX_X8`+9KpBlGu7eCpqQs9a2KuOSz zd~;eJuS90%R^-l24V{gjU+`xO>UT01@n_3W7Jk0QpXs5@xmoJ5G%!AdPd2?UbKXTl z8bJZBiZoZn<_zrqA#$|H8kKlP64#NC5A6PgB!;NOL?l9&NXKwAYLS_o9J9~<6{j;k zMnEg0JB?)?dNO~?4ywBq4Q2l(AXi+ZfxpbmWzqWTbS-)TE2^(fjQi0n zXFJJ?pohQ#R9WD3JLi8)PCI^%9FKYOJr8wRjHFC~hP@Bal$FbYM6=7Gz88>Y)6p~p z)U^AC=DD+7Ljbz3=6INWZe;Qc9Algh=l)Nw3FG=f3da@yD<`7_mZfD$ABgiy540=E zfm(>+gnU>02~#w9*f3ExCK(@4* zC@No16}=u_ku6}=_|LJBtI;AI*;=e^uR)wPEy%Cp83UzDaiyr>^)7|Gt%3hMz#@d$n6I8bsCh>T!V^O$6*ax&##9!s8BU%Q-vCv zg1cn#sS|0o;(P=!C@#eY#U{!)b>N;!X-!nY8moWT|i=WXs{gc>}Q3YV?6qxI49}kv}N>!j6U$JrBh$ zv)Y~ymKswYe+vX_LYZ~2&`!5g>6eb~iV@77gFOZl0+n;>4BlkTO`1D$la zz45f3= z)S_8f1PP&L72mo272VQwZe0&iw9n zevT)9m&$*X`G59O_-S?Nz;9Oh_b~r^JO6j!aq_=V`PVZ4V>|y#=8IF;*x)59e;D(h zv-3Y-zH$^X_yd)HCi5rT`A;xkRz_^_t1ACk=8v)SL&!&;j>I?WG_=Spj75IwAMLd0 z+xSJ%-t^C~Pyz!_d>tze_i~T}Bwm)paiEGw%#p--D)Fo&wy9!IN@AkQc|;P=s>Fkm zSgaD$CDBIJGgT6&AtBfPXcfx9@aaZi#QLBCz%dEsM|#OgxKKe}U|V+;*2|f=2G2;; znfT*_JQMR&Ptt%CEMM)%*kKY3tQC+d;X*I0ENG{nrIy;SExC6^FI&p3MU|hDkwXw2 zVuuxZNqCr-T@+n`!UZ(%UD4Nt>moTeTtLBvT)2)&aEn&V_<@Lg@=+t>^~SrQ2l;d89L3#A>W*>K<5aMri#dpG<0p=R*aqJ8n6HobmBmH%y_ z>Q5V+4|T@@{oxG9f0YdMUzJ~Fm+y2~`GOS#L=LU!vo&0mf5|T24duCi3Qh*Wfp@On zq@}z;bZx+n74|jP5aCG#wI+{SUi@Z2+j#dbkp7Rf@&0jGKMPjq@j;35%T)Q(?D8#< zgIZr!bYcaYA(bzh(VV?~LIDJ=<)=7gU=Ryd{M!1Z5Lt@JEnXF@iMECVTcrm108JO2 z2lWY*t#+ks^=OYEXo5)eBG0gortgVggA$tUvNh~0A)9We zo2g1>o?bE$uvaM99&R7@P51Kuo2-rCm2t?yF6&$^`YbDqT@5}3rkV-Og}R>Qr5J^) ztbI?UrkImgiJEbf^$eiv);jkE>sw?Z2d12Lok548@`m$QT4P#wkR=Z{`bu8DD0VaX z#Lb0tmj8=Yj{6>Yb%qZ8!g>Y>)N5!=JU&~wvr|**KD752Tb1BH;_b^h%f35z%kbPL zKD`D&?UN~8#J=(y`x0+Zj*^$m25bsk{XxG*|G;_TPsH-)ikpO@%?aUX^ZrB@`_1wZ zI3j}POxK@?o_nD93~Y*H^fgw{Y_}|EUYr#$)=YrI4>$+usZXhdt{B(Z&x@chV92He zMQadZSUeWU`xm3S?jwv>zeWj{I2yYzzdk=5m(n19268uOQ)yv`Bd0^Ywj^J98Cgd! zBY4D9rG-yMW}@8%+J~R}8@7mgQGB7SfiaKx8re%TW5 zK}KCZ7F`n=b%rCOt`6;rS8}WLtCtbf&9f;+)*|l`PePzBHMZ5wMH@tZylz)`M`}Dq zKzF>AZV9_&FLw9rTQF@+#Q)IG_%?IJk}Xq@!v+8aSX9X0YnAm2UWi#8U!@ejTKNcXJO=A9o1zsU zDO{Rtev-IVm~?z1t=|1;KoGR4}mgMh5HGOlJXJs z6k#h)kl+?DC1|jY;)*jiE2%{+XA>TVSoZ-=F3?h9H&+MFB|K19GJ8ctN`VSrJaDw#<9wf+R7{d+YA=ozz?Lt>Ru+=tdR#N^Xx%$9oge2_HbDyDHrD#)Pk?RdV zB(@bEbSW1@AG61v_{&XY;zEgszT_3 zd=t_@BMqB0kRk-&S$`_+tD7ec%d~J0WG31V((tK=G{F8PnKa0xi7}8v8a8nnV;4-+ zV-Fur8Y)2=US^9_6RQ2}5KJ34`xfrH)pW`w>WUd5PUu$^SDjV6~9A8 z-zD0ld&%P`&OCn9WFE_!pT7;DgnI6;oIi+ON!Ne%%%9XP*1U`-rshw+$^0?YfIWZ1 zWd7D@Q}h3F{wlRFjRF$w#{8}PPxDvLkrxKQnZFdEBb!J}mq3>qPUKpGU|DZI@sF)qebM=JQ%iLv!=V zNwnv42z~}~F`v}0H@_b-pIwldX#f8-pLLv!r1|`sU;fj4@-2gRKEW@0D*WsDEJeBa z)dW6lK4mi33sJ>nIt29;>$&;_LDg(Kn@!e^<1m#guQF=vslFR7}KhBnUOxlml z(bfNQKPo=!KhslM*C*yLK~E3ckD#ZA??-Xy238C7^sxQ7&Y$q<<~LkcYqzjkYCqDr z^6>rm7xeTM&Q~%$g~Z-7g{nSxH#+pRMhoLspdO|;`^PyCoy`c7N*;-F)nb@O|2qf>v(Y+Y6_3<9Jc=M4w&z`) zr|&!G=^Kgl-~4&{fNp+B7Tb2&mspQ_?jGT@kCyYa<?HAci>tIL06LIjk_Ljc8 z6={n1{`=T~qCjukj9DumnF56W%;^@bIEHy2*ss1d%4f`8qC zr#3Hf9=ZKj@H=0%`yW4uQJ4DH@KdaNkpsV#8E*X!e42uP$%U6UYOMbS1>e(we=!N( z8MkFe$+(rc@ROYSZ&dIbyEy%C7Cx-t2f6SA9r%6%jai>mdDq+=WNnXH~zU z;LAHZ{ZE3oZI`UDg1_2@ALzhetl)2T;Ezv&7rPLye+8fI!XJcULi*oD!Jp*7Z)Jwt ze`oyC6#UMY-Tpi9Tlgu~{rU>K{VyiLJL9)3L;C-|3qQ$$e@(&9KE~;Pv+!XBf3FKa z(1E{0!C&UUAD;y8tiPcOzQBb)h`W{aKUcxGci^`&!|lHVpQhm3x$qx3@Tm&E>S(9` zN$_s}HR=EQmz?pN%f7y}J|KI-Q_TPbz^HZ$* zRSx{MN$^hl!wPS~DzA@Ef_Lg4s^B9o{6Sa^NdNCv@M}9c{b$DE z{a5e-7ycs$K3{#(qOai#I--LRB;eioZ!i7tQ> z2soi$pt!efw&hLA+_du)iZJo^Si=u^ZLnIa4>i`IQpu^Xepf%r>k4eS#Bg)bwuxvP zz24l)1pMbPp+({13{m_RZMy*@FCUcI&hk_!l#bIP-`m-xv<`xS`g}e2pf=Tq>#Jys zDGMKf>k_Q-MFU)Ao$^4c;InHhc~k&edI4GkfN$Ath<%2FaGDe$D=biSKI&Gpra_=8 zY^bF+l+*5r?m$iSK*6zas`ZqD#7k`GsH?0QfRxTfPauftd-w%eq#*=g>|PA(b;wy< zlgxu{Wgc%PeL?BZ_u>@7xLIB8G%ssR zx3$xMv(pFXsPez5@=e!2Jt1|*{CO>|F+RSVzmqMXn`OM1;Z2b?ow`{qG8+HtvF9p) zK488_o_s+TmMrYr5q@tGk|}VSB;nv5Wl3`(Ew7O=d} z0!O_D5x2E>KGDam)Ke?<+?t}}>iW6+8!w;eI6EBqk~Kn3UQ-OaKRi)b8~PC$2)oX2 zMLYFyb-F*bK9E}-nx!s2YW9cp2QF&E%t3XG@(9|o)t`Gvn`)p2Jtn$Ks8@Cn!umbRE%|3w2vQ!;D}44o&8>7j4` zYAM=_FiI{E<0wla%0T4Sut}*Y`J%SqcNoQ|qh_l=zA_O<5qZjk=iMXbACqDYpP2OG zRrD3EZJWGqVnYXijfRE?cYoe7AQ4T47M%kl1jqFFR>-xjZmqd|s;&O%FtFg51-wC5B|k%rTuM~|DB!x8}K;ov-5wQh5SW!{(9!y1~7L1 z*UX<~=fBTSdM-GAoO_73BBp33(#|2sSXH{fyd+o|^VWBwvLe?9YU zoBIw5z6^go<;R~z{?&GV3G;iZ_Vw)}HtTDcKgiA> z$^4U5{s5J~fcf3*{Qk^utMXq}_+McDA8B^~nQza}V=CWZ{&#l%Z@{y-vx1MR{5zPx z$j)ES{2nU5R-WYfu3-KwJO6!YhcAe4cwvzr-Ub^c+C5VVAB9~djig6BL(8QH$fphL zK3o!?sl@q`*sT)zl6Y1n21(*v+zJ76jwJ3@i8Cefrb_gY#156{C5iLEDFEgKNqnqw zdPt&F<#dt6M=H@t67?#fN#bM-ClDMVi2{}INn(^rq)6gMl{ok`J9m#t)Jx(4mH1T> z&#S~vNxY{LJ0wx15?dwljY@nkiCM?VSnK;nJY-@%>rY#hy${Qte=D$z`F936A^aVI!^myIOxP$T@b=>pU9lTh>BYM9Ug`PEF4m8vVT+_qF35Z@$N~j&j|-AvgXDRq_}^ZTX$s^b7vwD) zWTrh;W9_Np(-ThBZu>8NR=KUvy(rI8C|kNHU$jxy+9>DRC~vn>4FD>lPVu&Klow?! zcpxnK1y495{FIF{MNr+FJ%I2vHr_HD?`UrmgI;`P3f~UPvT#SW& z`L|U0x83r+r95Nr*{iLmxA=Xk_;k1UF;X0Z>YWtL3o=}RT?GnkUzO|9MaWU zf%J1h_9B=4-slCX^MY)^lPYH_;wav zr3!zKEIBfkTKA~JYgOSB?7|aSc(y8Bo+undVVIhBaPPw;mnkR<8G*;{EukN`+CCz7 zj*maW3YW(FK?+8CO}Md~%Vapv&xks~@I7(5L6wI$z_#=O=Nu^dQOb^j<>e?##^bin zGRvg?Y`gxhcKued`rgg{j=*-(F6%1w{f{!$-X3my3wW4C?87W#A7&BzFhe6iCgN14 zqUr*ST}Opyxs3(jU06I8uFKCH&AuczKp*843kvTWbMhopVW z?Q#R{a@G&(`y%^0WvhbsQ}un8{ry}IUUgVu9SOybWUIp}VjotKY#vteady37h37gO z&nyp~T8=AvrB0|wwmP9A+3JMC`eysP+IR*kJlQs$mppjXu~figDPkW>k!*D=MY4G; z#Wz4zVeOB}2>kSr8maeyfwPLk2ONjp6?F)~NvRw{=pvzK0$S!j{t)rJtMI&T<3W6T zUqPN{?T}+#;1b$|!HP%(}`> zl-e*PvGE=@3`uCbgPkCWjJHIBCqn=Iut<#Mv^)r;1obFU|2JRc_A-G0d zSJzJVN!pD#APjM=Wc|!G!M>CpULE=Z1Mk)HUF@hCF9|VerpEfu*E+PQ+@3bU zD5}t7MGjG8sVbJyI-FM;-tP-lmFgMkZoIEpRi6~RTus>xPi2+zU{vJ1+Whl6825Av z*B)w9GvmAtc09NV;QZl+N?Ve$O#C|;`^&LyQr6Y#GhyLeN?SQ}JAzNjepa8-Sc-k5 zJz1g3ha1~#)9a84i-YBhyQdh930ng_<{R)$SGsvo@JN60$FWK2KboY=o1`E6GP!*2 z_T==9>yz;pH-R^rq^CAX@A@hk-_R!csVkH5pTd0fqj)v`a(?0CrE_YDkFHOk&%Ypx z`t3a`M&2czxzM&jBG|Z9)`Q3w`Eu5cJSGo&hj``l8!2pugU#byE1esm#xknleMX!9 z^xbe-5zBo1V_0^$9%vH!1MZz(*B_PQPhBqcG2IzwN+1=heH3F5IR3}a1qlSVkYU^E z@D2M!nAuW#3K3*FemMV+OoRk-c-IT?WkY=Y_vjK?& zUFWF}52+79GXyK<`Vv?pH(2)&y^03*#e*V<##y`Cx)g$+K-&1#G-J-ABBKTGie_Q2 zVC=f(>G9v}a~1Ef$09c>Mv~!4ol#Ki>)?+y7|UKBUuBnLk5@0rfJ>3k0CWamSp<6v z+0v^{>{VVTfua4Rv%XQVl(ow{d~;HU)pa5qQl&1B7fT^-$})`dltw;K*CJ!E(Kv)! zgnUH6ylDX3W^0l2nSk*8p+jz8e=y~f^!54{s;}`LD5vNQtSX`RfT4F=e6n7tI#Md- zYacrw{izs$P;O|7B}cE?k7zGPE4m)vbTu9;`BRNYB)&+>=3zo@{BPic^~!@S1po6$ zDEx(N_QQlkMLTe!v7-A07~_Fkx_J|(5M^${H+JnYG!c~DKdvwf1g0fssbw#J>iYO_ zfx&yvUG2g+v=TIxOgowH+nMdk(j@aGq%Cc1lJ0=# z2I+zLfa;uzGr?q_&J^#P0&xU&3Rm}J&|F#x!ll$b=-u@TlQy)oog5^BzNo$h+(c z+n?OtMf*Hy(q}$V5kCoMV3|M%ypJ46%vUuF(nr3g;Q%`R1@V2R7ar-nCiM+zk{-|` zo!cb+>|RfMfbZ@m>2H``8GjV3-1d(x@0}4_5sz$|#G;U+BvcdLZa;|_5s2NgnxcYI zG9$4NOa^|k(kIK)n&JFT$5)I$@r$)b9OQevQiX<6aV^IM4-031rD1d&|CKM4{`jYE zq}4smebhm=?ci@DY)lncuTO75RMT&-PTDg{-{vz_WG_d5uR zwa7^%n=$wupwEdI{MQ?WbK(zST5$gQu2~3f3O=`#k1kO-X5k%<_bM?bh>KPS9>`zYF^iLdRbI@H@O`rB2ZPtVHg8=eP75g<#fvEr8x%U5Lsc zIyG)Z!RZu3;{6<}P$v;}t8q9;n`ZD|l7XY$*S84v!Luy_12)A@IXT81Iz)>0{tJICL5q13I@p z<)c30-1^wd5T}H`{rcvIFU)RXor2-a4^PPcljS|kMT7$;^if~n#P61xuzH<$9|3a$ zECxPYA2ezqm4IW-3Yh!*;qQdrGU-YF7Z|}7?9QXBvZ7PP6(=HjuIB3uJnvu#=QXNa zoW`;>e0;*9#f(GYJls{|WEJB+LTx!*N#1~;LBkS5dC<)(B)$!}X5Yz+Fx+x$@QtW% z3=d7`Bgteu!vBGJZdg5ctQOgT9{#`VU1aw>@Yd47Nno_lN9D&2-DDprt4X-j2WJj1 zwnKFD!B#fZnj*vvh_tFj&-rMh=p5?-+!XDO-jAQ2j+Qgh4SmP^&c$4+j&{4~u#P63 z8*0DW&d{9jx%8CW*?s&L;O6gysxX$5-k^KVU%ml|DOupkTheEyxYt|?DAYPUHs~Z&+q&jhh{FQC zw_8I{tv-`15p9ZP9$9nw58x`nsAv4d*Lx1w7q3wZUkNxg*ylptAdoB{UyYyonu9io zRDtfI#w*cLYi&oTvK#@4aJ$1V1Hv$Tg%9?V8S>ZigpGdtyiaDhb=B)unB2>Yh=mT7 zfW^H|Co|qx7weVPJwpcZNDcv;GZjzcjf$FzYOEPuSvcvj^Cm(bI2N-mggSZ_XVUe_ zSf{(S;ig|;Y{8}rZy5qtD~~Op&ap4(sNDcW^K1DfyB075t@6sU zb^gihgiEP^T|6J5`2zOt3}^)hJfBK&|H7wlJfDPK*}M006UpTy znrp{9Q}6F>hm7{&p$E(pC%o6^FiW?oAK<(W56T8UOqp1GYLS;Q`}vGj*oLNT(P=WB zgU^`{N@M(rhHY!#4P3yGeid>kSgnTPK1>{1Ic(v^!Hs-tu)I~j+S@P~glB{>CATml_ z?a!?$y3B9p^|gUQYfzV{aC1Ki{oB&>|G-su@XGg{(caNcMq8eaJNFZ~5E3al{8w8a z{sMj`hy{fBbLQYj0LQ3voTm^V)dM$kh&5JsW+@6GpH1%seiz^`-~uF#rKgMf3;6zr zq&SGz^iz+-56Hic(Ux4`d1+sPerVx6gmYItxRWYzpNbGF^788!A4YjTC&S;M9^3Qf zJZ$CU*d74CuxKbE;K+2DBU|U`>wW^MGe&_md%QKzX^@B+!PzLa?k9Yn%g;6;Xf202 zKCiR5Utpr_Cyz5~4lg8N1B?yf?P*4+T=nK+;HoZM#M#HaQj4T=rH1!)*CIdSSHF5J zR%A}4INPs38KJr zC{T~M^d&ik@S!L*|FT0S=Enax5u)Yxkk5+(Yw31MBE_`CVv`CPvEIfG*#4YFHCsF^rOWM2mUGQJA%pGl| zRT%I1RImUnuu2tp4h5XHuk_Y^GwNo;<5OhSHCWFofSWx4SzdsF4nUn;&#=3m-ih6@ zNP!p32+p-eD-^wf!k(2^6b8?F_^m+ITcFJk&W)c4Xe$-0qaFV&ahdBSTsh3Kb9ZZz z=@=p1z@;;G!)hF@x3jw+Ij6j$D-iYd0!a>K)a47m5;X5jr|9pj{Q6eMmHf&fS%83@ zuufIOA?)k@^Bned44P$wggz_O=8s9wuV2=pq&KczIKp8ekD7IuvCPD=sIIcM0k$*W zU`Yy73biGn7Jf6BRiM4I8y2p?arOSx&jY!?YT;GrLcxqN6|iY8?6;C8Gr@9PQwsa7 zRqaQ25f2N?NOqpYK*>*CO12$-1QN`$~|aG{Km>Q91eE4E*oCl#)_aSeq)^5^-J$g1g!}xKpaJ!l(h`od_Nla$;|{ z33$d+-3NW`iQde4{vG}SM_(lzJykKHhpF7s8mbrwncnLQ(E;KkQ5};3p^Ef3KK%ur zUZt2i)&E4dJ12Dq{dnn3=|?R>E+iVR++VaKufGV+7UZ5{cEo|Dg2i<$*;cwe9bWv+ z@-iIm9Nkc@)#4_yTwZC8FZ+H7bCNsV##Mw_9fo7SOMi`q_(%{mNB${yL>2PT*lYdt zjBRmkM|Ik4?d!@QBPEC>3b!FDM#=blKpN59Kc^+JdmecNWCYE4j(PbF8DQIUOv3X| z=j2x3fbC922h7}gfVy&^ujiJ+`@M0Hk}nPgUCvmqjTLcNC-oT%-13quv0sJy&o5`9LKZ3~(XfD{7Mh zt~v2tf=)BkMu_PXb)ULB<)(x>+T5I;TN(NVS}%1Ew%dWX=RzTL}GB^_5ShEBB>|zZkXNx9a9}DPcS%aJ^US=2LSCf^y)@()1}m(cdrP zt!s}WUM|N-@e_pS{$M+-S5-SUf(S}GAl`XE@Y(g7j}qq?y?2e^B<`kor9HU~MXl|4 zH&{ZCpnH1nLwc9G zV3uy6b>aazz7rm`n(jAhS6V|Un~@Sq2clApAeJ^F}l9t`th7ci4VdFRh!AO(u4rJHE0$yfKEv#S9T3Yx*>3ocGHw>H#+ zh!(sU_$zlJ#*n}A$215rhMNUFmBjQ?j6(4%l&0kj`WFTR&s$8~8+!!QUSId=>EYVh*c}(O8QC*W%BuLK9s#o!{e z0461Kcx+Km;T6ntK=^PS<^9{nKD_7SJ;@ghk3HT~U4vSnOil4g5XjTS1n0B*kSWJU zqje7yqj3g#QuVZ1ts5=sesK1iF89AJ;Be_w3i5EIjo>2dy4o)6ImgosE{Y%F!0SD6 zu{#IEJ7|n9ThN-lPO_HGH^iw<6FI9UHFHwCEfKl z8~jE;J$y3GBxRvekV1uBDFzj+2L_#-;jzKkgDp7d3gzd;ZO~P~0k1#&!|Z@@oWJMe zEjaSv`sd;`3i3PJQ0v{1rqJH{VeaY1}eA*J#Z5h z+>IW%x1V?3t3t|$OC;X^DYya;Twev((*u{bfh}cyt!=nZS4%tpm>}Jec3S*x`o315 zLTqPyx1D?wB>Hs)_r3>ij)Hr{1NXz%PJOUC7PzYv+|3@i(fn;})IMBi%QW2iwm z-Blj&cce0kgb+&%q(R#EysG(n2g>OI+lgLiVTO^4Q<3M=BQxT3vZm-vuwtq+!iZ^+ zLX<=`K;txC3zKfSO<{Z~&j4uQj>z?vFIq3r2;BP}^PE8~S{`2vj`MJOR?WqRv+?qD z#>T@_+tD8QGZ`-`3o(VE{LDv?;fj(I$Y1i}od=~wMd&x(xFa1#YI=BS2Gl8`RoLms zzoS>(Pl{f8c?PwAlY&7(Zo6rAvfLJG>mXi%`W-#b0$b0611oodh(&Mn9(y}@=0Obi zsBRo^#G)7K=DQS&2Fyp4STw>uid^(8J=P9#(KzIyp9IW{vI0g87k2KlqI{hv3<@nP zI#-WfEaFhOI>mm(eS*eQEl=zPBw7?I7#?$8<0%`z@p;{|>_2#jPbrrRt$>FinC>N{ zi(~|#=|JeuWyNz7-N5$ZcCvfoRd0l*A}WOWEXCN9q4&8tXwK8IPx{sO!@YWsWqd+o zEpew>($Q89g^t&!Ow4G+`o6F8k`xSsRot-wrJ;taLRl+kJy=e;ep#pBryy4HP#lo! zt!dxjz+?nEo|o&br#AAige~h-e6qR>KK#Dh{duqxF2O)Kd?~#V-A?6JENA6i zyz6bVuEBi@%clh|Wxh_cggJ{Ipca94nnU}Eou-^O^yykH77UG{R_YwVd7+f~Jwm_G z%m!aeF(*y$%UH88!NHnsIalmK;p-AFno&LM)o@rM3Z2V0J8{k#J{E7tjSDjBzDV3Z zdA5K71HSvy6OGBISyUnkiKva!<>!=<4}?KILR+mfRMi=EUwQVI9S64u1ml{@Pp_Nn z<~#c(QU8$tzP=^c?Yx$5Oz`gxzWhr^}qM9=l~->)NNbAIlamiLW=p#%8MmcwE#kH-W`8`p6Ye6E|C5*m<^X-_4sJTlGetZYl*Ru{908}?4A93;6Ymv*wXT3;EaC0CN znQ&Ga%j}7@2=eg&{#YmegTgA9SANG*#?TDK`g-Qui2>nk+acDwQWSOs-LeDbsW3(? zITgz{JzoU(iSv0NU7Rq(Dpk1m1#`C*??_sFiSc&#lSIS88pD9>way157=+N-0rRZ< zk3p+(SS+I)JJhKzN7lPIw&1tiUy4o$n6PZ!VPz<&k{_-r2gOdY3$D=%?wMoRkkS0N)sKojdKf)(P!V#_UJv^s2)>2Cu`r z;IpT^=ZQA|;tX5|wl-8)X)`X)z!5(Lf|en?RIt8yHQMfh*XCcID2_1Up5l&t>z3y5 zf0Euje%X0;v?EzgSvZdmKGuX~L934eRyj)LDmaIXiWd0>Q%O;xvba+rCC?9ti1AEy z?nbJ)K+Hl2k&-O57t6Zwg!smM(C22>;@-?LCa<>sjKfydD9FyT=z7Pkh9OW9?Gk=O zuD+1*aFtyj$Pzw(W9j%NIu+QLYf&n0#bWI?{_qNb;mRJLN>{bO84|x3KT&^v>2=u| z4RtHr{SuqJ%DQVc*oDq0AouH4)&*;kJ{4)}=l)IZ&oY*m`;7)(+&=eQ+!!M?yi*Ur zlFuvShW(#47YZNf9KJFN-wfE|&H)L&sp%a=-I8$;!A&_3yZRiMnA{p|0V0p9_sI{uIYfwce*$TD71%#Z8|tq9Po z{p51%j$vZA7wsb1g>#@ihVaC%oxed$RQ6!bz^+jb+i2zV5;Y3KkM2n7iTxBqnY-~m z^-EiCe+nZ%my9=qZz3ppU$z(C|8L@N-WEzHzm9;sdYh4b^GYYbky3IOGsybWs3Yfg z7q^IEK;sfBC;3prXcW%0rd&drKB~h0M#rSj5ATqo z&A$}XJvcM`N!ASff<006c_0EcKr&88sXV7>>Ep`vVONjO^~+&2HIj9|pE@h+ z|KQO!=0X>9g%+hE)5d%(A^V)!?E0mCQ;gq~)ImjnFecYbD1%X3NqfKR!KOz^4;&}G z^fh%M9Pv$`bQW+$)Y9OQ_YW8uc`w%LehlxexDjwA>}spy(L}>)y=UZ**bZS>H^J~E zNR1_wlupp*!9j|9=?v@;#D?{L^Jv^Xj(`HrD#b9+fWRElYeG1$WvXA@`~1e`=>cP6 zFNvZAn&E+hR9bP_siD^j%>W+R3t~v1st|8^xpg`)BF6G^XdO#lE;It!E$g2598X+F zZkN=~S0m@~S|2d)%+k$=%T7X>(7lYoBBMr+pb^wk}69i3)}O4xdyUD9`BQ3WWWk$3A`#gKTyB z1V_p>at4*6Dem|0KJAiHH_iIJPkkf8#BVx_Yfnu9lU8b8$C{u6)f#d=9K=J92Cm;?;9C1KCRdGOI zkqmi4RZ(w8o={bEq%QJ=14V1WRzaVR9n)HDB1_tl&(e)A>i&(ti2PBst9iS~s^Sfa z2Ff03URp5E!=t|h33UL@!pyVdMcAu~KZg97r>(QMdz2iJcwepvQM?d^W&CB=+VL$8 zQhJYvC&q3Oeg8*_MS2CQ1&Y-sa)?Kj-|UoalQdC7udB^BK7H*_V>fttd4rQM?y+7N z+JTRqhJPt<3U|g2yc9D`eh(PgtFbsd_rAya;xkUxlB-cRi@(D^K{_~N4!m0FhRQWe z$r$+90OS|rgpeP)`51AFDTQv75dbHVAr&^Mt!&9$6m#nsRNe z7QF^P!~46I;1cQUjxB`Mp5TV9q3|;fmDMxLX#>2qz}OV6z*~-cki_ad^b=O6R!HV% z{ve!;*+6Bl_wbSdV9irpImco2Q{>%3qZ#~z*9}{8ge#ceJi9p!5OfbGC?Uk3XvO(Xg*9?9kE-uELR1q7O48SzHFFp{D3%q89PfuEd6qKZ1RZ_k@z;`TPtN zm5KYuu-M}Yk9j6gL3MN)Xo9~@L#dwLB4GS2P8opb1S(6YXRwk*MNKlU?2|B5;3_$S z;5-pJ1N_hx-M~4(Q?{XUbsn0mE5%eBL*YD75hVn3w$eg6xbuEy_phO^za09)x?7 zyfp}cb)v0?J&VhSn+PeD z#>Om6!5Wax34(A5#t`%6ba0LD zBJ9DGomps^m+^v90gA)(f>0bHUL_~YrLCl(T*X_d&_#vZ_Izc-XGD(L7IDy%Q~+NP z!<6N$#U5zLHp;N$z!%C(iRvgVNs*mmwW>k@6tG;_5)Fk01d4nf^1xym>BDH;dTMJ1 zi1OgM0mc!>VnM8|CkSix7$kCnVY(@}bXsT|l7-@Tqc~b^-FTNzL`5T1f2)t@t4~suOZMg}^{neFd8lN3G z633jrKf>x?-o+e(R6(74i6KnTdYAup<&20Cv{6Kj4cl+G&F>%vsTIlNo}H@Fg9F(k z2x`sAwf=Aodio9S4B)c2`~d%)53%u#)LV#Ef?a}XGL55@%&^KD(wRoDeBLNyI3SRnT&JvMChLacz4 zk}g8G%sT+wZZ(uOk%H59K#rmI2lWaY3%?8^}Fal1UT+dRY$F z^#!V;52Qcg!isbZc{%P=>;u~cLt8C+6(%3_s8=~SE@z{Nzgc5cg>`P7nzO*)IA^^2 zPpCtf)u{>U>KvFmF zgu^99)G92;H8z+wexf$xIgAc;zTfWgYo~m-N9!=AW{;Lph<~o|JsN>^ns$b7>6P76 zv@qZ4?a{T%NiNan%^Np0PA_C0&D4mraJyrI2qxp3B{W78Y<=4-c2zMbWE z`BOpFNA!iuk`-EqJO)<3wNf{Z@f)KAt_45r!Co1F5^!v?z8a#cLbQKGXJ~T<_;WWG zwF%~ap@k2!XE;vR!Q=;n7@CGGPzAp>v^tPmqfNbuTP}CA7TzX(E~H&_3oY7Gb|U;r z;DH0W=v#!1jgGJMr=qgcE42rfp@0^ptRA9KZN@WdU@AB;RUD3D0XW0=?<+7IQ}00b z9_?!1%SdrpcI(>0Lql}aHyqm9P@I~3N4!-xbugsn;F)-&?0cW zg8Rvm5nv&g1!GUKer^8HbblV0>gXg{R4$H_yI z{Bk+b;lY z$uKuE&MKoCU=`N$7-(+xddL)&NY5Noq4(Z|r-v*Uo?HV~cn34d*N9Y6;LZmes;dB{ zz*uRK)*yG7SUjH@>$w;B8-5fv8HP95qqdMti#`q12-8cUN<*mJs5CHs^Oe}_As&_a z+B?fGjCIO_I9H22$2l=}BYNRuJQ2Ua)L#R&S)sWmny%ueuBCNC?PTU+!)Fn75Y z9**Xc?aHk#`j)SX!q>1Xy{o{y%*Fg0!S@0BJJ8aH%wTk<93i1lBoJ%4f?tQn`lk+$ z-J1%TcVUI~U1yxhs(I*exfy&Ptj%0LNeQM&YyIYvV|l)Zt1#DH{D$v+VG*vWtj!1*lQP=umKPQ^ zy3sk9yPjs)LwgCIVpRI8TV}JtAc1~}*3*Nj-vx8GLXTh!?KQ!;v}K%rab#9yYB1k= z4Cj7oiuLNTYTA!N<2a4+qZCOkz{K0yI0%At*gkrfBww$EM-icAovZ z@kkzacmQuEuwCs?8de`P4Z|@1VjdPSy{isWQpx|c4&h#`(~v(%QDmv4k=BtmpLr`3 z0uW}3j8n-mQCw1HxG#ZehiJ&p{P50HoMVRIx9$YCsKn ze{Yh0{^8{M&pbOhJ)}wb6TNBs{=3aSR&cw8yihE`tX~)LApVJBU#?5U&%m^S(5HhP zmFuj?19E>YzRI~^Qr!*kby)m592D}I*4j{}4zCvpQH{;N!6OdpLWq)s(A?q`9xY*v z15n0=5A?X}Gyk|wPXvMA!!53?f4C=;quJ!zoh)6StW0C zG0MDR5dMbpSdjpRh9MWl1LHPga!w8AZr8%pr|D)}-N36Ns~uv#g!i@8B7;F4wdrfn zyzstOaNdle4)23`$lryVB;s?>dt6(Rmuviu>)BUXe_3g5IMM?Vtb9CoI z4$E1j&sd_L4Q&UPdWeF>Gh3C?A_s9|pzWrfZqMPJZ(xZ-nu{Ke1{PBUSlE^HsH!s`AjtN$J*IA!lQaKvSFF zShJGQmMOGx#`079sB%}9wRr+&!kwgIlri;A?5MrkqkM*f*1{8L=5@%8=b|HOA7ZUS zx`Vm;97mL1-s_rMZ@ul--YLV4mS@BnNzYjiK#%ncoLF#KywOq&g5N1A2*-3O^!G&G zesKvTaIyB|uZ5EmvLuki7p&xw+*q7-2`ayJZP%0$SUQJ3!^R9R&x((hDhe>}Sg$~o zvEWjm#KPsO4Vc4VB~vjnp6?lVO!n@1+!UDYV*%~-TUKQ}?BX*vlWJIv8IH#i#aNHu~Ft(;E7}G)Lz?h(SeGr}{Dy*riGEzog8Q%mkItYfQHbZ#F{WvN} zEf6`3^A_{%DS|(kf1rueF`HvB6tB$1$|(ReCObXAV>fM-p5;i`xLDcCpcCx^>;a89zZAU{%euRNYtljTC@Z|+-=5?*S zj=$mcJD#&|$B{rNEI5q37;u^+(yebA$TQ;H>JN|!`PHp^r^I{nr`q=>hR}X*?9-xL z_j>G#&h^W)xDu|wO8B-U$K4xWtHpc{MkIctEc6kuc*4W|3annc6pF+raxupSzZ=5H zarIR_NFEta=s&>MXYo~>=*+`caiY_forw*e>SR3SWDG|g*3-8i4Pa~rlFC@-v?*W+ zjHQ^L%U*#)0Ql^T{)T-R?}N<^Z=31d4TF$_nY-feC<--pJSUNt>7OroS5Cz~!oiJ& zu@soIFuOSVam9dJ034szW3%aeN}VgQ%<-RN&PE9NuJ2cY$;AbX9kT9SnURuzMgEoX z4e;uOJ}fR_mxJ@LNN_X8a;CSSYLnf^N4Pct6jl;E2fctsD|?6d^f%q}z~<);EXEB7 z-K0e|Om=E{d>im=wF3q_)M$By9Pk=o`TorU-w2ebD=RG+#$XZo(r)E7WDC~ar!OCC z`{Mxw1c{c$gzXREVI_Og{~z@{}70M%piFA5JnjX$Z-BH^-;jRid-jF zU31a=(7Xxnd7FopR$5`+EI`oL6lG~hHUczxOhqD?RJORJa$sm+66Cls`<==pTz@3xC50=myNuZ6*L@0i~ z^3oe?6ZcoX)6V;+dZ*pj#~B4|o`_H*J+TCk=v=oTQQnbXwYv$GP-mui{)A~(wDGYRCZz_&}y~DCpf9`iBr}@p2@8Q1{E~$3X&TR+OzUOC9!&}k~EHaB(rRWdJhSsC4 zr2k6a=xS_}ZDK_zV2^`?Qs%?FW>2k(Gn~rYGj-iaD1RBPZ+be zQtvkoua9A$|99&9@A^l3uK%6-lKY1nCHXwWRk!zvG7!+_U!ay_`}jVb8qWH0Ee8J2 z#`Ply-d=zAXJFbaTA)jplJ^q~cMczaTCg#s>Nbl9C84C<#MkWj>98t5;X!WU2q;(L zy_jP-ur5(kr$nsE-tzo{`;E&?b|uWFO&WP*(Yu;c#RAr^vUVm0Zu` z(zBU$D1_3xU#nytKI)7YS)c#eUO376jtJtnVrW_a;p^F*?<*!Kx@bS=I0_B7?FG&I zGvdnxfnyIKTG#bBl=gbY%O&5(x*Y~h!6 z->0J|M0OColxM!}gK8VTI&D$=$LqTFzn|x4*#G~Z*{6PG`|V7!Pc6_s{M_HL1(q~0 zt*ngmb*>>Af`$ePz22miO?5R6w9R}@rv0nB_-UEe$8hfDsU4IK!`1kM;I2Vq#4Ocw zzyY-oZW@?Y{?t})6ZuN^$tqdjrY|;*#~Iz8*e)6T1IsCs*QVZ2h9y^CEERctD>{ zcP;S+&Ff&WQXLfwR*bVq#QrH4VBdjfcq@U)Vy)kpHV2v9OrQHY<5t~2o2sB_Zxr;K zAB!A1=KIVpkLQ0Hq^#iSwqTE0gHEP-lW!q%m0cZhS`7nn1v6jnMIlqn_qKu*uLHuK zE_THBpf7xy0XENXyV;!Rx7}>shDGM_uSu^tw$V4%z{hG0JfU+1+483(zrih+22DLH zV63D%j{Y^DVDFWG%|u%KYaUSkH91sx5cs3A>XU(@-VDt@__Pd^b>`)Vz`go@x07iX zLIxG{{fZ=AhqK#x7!Wj0^dT6gw&LEBRttoTw*OYn*|U8;^#58<3AB3I?P3ojvb zi3wdPbQI{pRrmqzIbIAc$)it9o}cQ~I(%ZDi_8QUg}q+oZ>ar?y$&%BOE=x`T6jNp zKli*A-GyJ+_l2_WwFq5B(8Qx`FQ?TRCz>zB*Wn-OhXVWzJRVC((^S z`r@28>npLUOl$~idp0hR%1rZ(Tz4(W^ehHetQ+fJqYgD%_XTJ#J2}f*0jR{#tLPGH z_#-Boc$HeQw}E)sta?0*Du732T!swm4t$aDVX7~D+`zs(vj=^lJGExXUTt$^FHYyW z>b!H$Py6B#-r3iCm)!`y?vB69Id8ue$*(^j_qgakGI^Krop=@Ak{EwN^`M&~o46h; zX=X3BY&x^f84hJrS48)`BPn3fdNJbZ-Iy=G|yTJPAg!jB3{eM&|peq z++}I+Cz6$oS1Yno)9`!JJ!?%TwrzCh`0W@K>lqN81j~?6t)SVWUD=CU?*QFA(%Wqq z+Ed(Zd?GfpwxM!C71b%*VZS_`1S^yUfn8TEG7GiUub>?;xVP9S>^jQIKS9~pd4J>^ z>%#kvx$8!dqfM~OKm?v?dg|_T8*82YKG;p0u5mzOIg8MO0vJSk8iC>8WsQ~!?M9=;bt@C& zg|oO_cndaPdu{qeF0xo=Ty^9DIPR5>lyVv=u7R*COON%hww|K&gX#~s|KA?Z2bjz6 zHq+m)cP088N({qN^;vqOMgPExCDo7Yt_F@GEIs8uH~y$SPf8fN8$h03o}v* z2Hu`gga;A#W-E8^^&l=yI)4HbbgJ__^M1wyKhGH4ipo{JO`v|JWfg`DYt~cz9~ZZB z&#UAiW^CQV%RhWedZK)BR=^ymcEv+s10qdqJITr=8Az=cdpi!OV>RkvJytV_>5`8c4vG)8Jg$;+%MxTWM~RfQl@NCak2KRxLB{LmJ3YuSPqf| z$*Ka3ZvJ})2$b5zU>kcPmpck&-923eT4CismDtl-#3ZQN*Ve7T*K}W>^<>AC_ypd0 z72U0jXBl5ueTGAM0OJt6q+fa|qk(DBvC=drB3LAg$ru(DL(yQLBT^Hzsnn5MyN5AG z7>uV&`ogSpu2BJ{ejt`z&3icBP&QenFT&*4AFhT+h#jFVcsrGmRnp!GW){5^_-L0J zS&q9bW+pw~yeuQPj23NLcpknP@;m-AeoFi6SLDI1JyP{6Af=rF5dbK^2E!MqVeZGv zd+ZkAyDzJm{nAAmLNoE-LbcKmxUQCJ)1bD{qWSp!8Y*s~Mb4JbNo#H#*?l426pwg_ z(b_GUDWKojcQau0MLvkj>P@*F5saoVc{FK#% z()R;p`~`eSoNx6j#%hrZh_rHld(~ZNomPQjgFfBYvkd)hXfp7<;~e-Z^cVEOu5b)% zfmXH@;~N=)L_8Cxp6o}P{tT3M^c7qkc-FV$(fhq6)03f_x2tWC$Xc4n8r=lyRX1zi zT=cR@u93(k=h7tiCO7x?iA}ObxLNZm4hK9lky~TuYLOe+)v@4CA&$;&O65}k!S8Y? zz+!-9`#WVh1V>5(gy~to!&BBn3>M*getpaA3@x&sS5YdIw8$^`DRvaw@WXQxxP@0D z@5u#mix#OR_x#wN-xH10BJ=Pq{;F{0hd2BJX^bKfT4W0A^&$vn^8@5+7s;6+%!U>j2I8g|{6f$?tKw0Rl(U6yD*6!rmIXix zfiWw7H)tOROp6wv@mxK#x1$s1AR*irsc|~W*!PM*UF4mK{H)HnJ;d=%q4*Azizu!p ziZ6sr!aL4|tx$-hUKRS%E_4nH)kvYxTz2K`P1s1YP)<}hpDy8xcz862CQj@HsTTqJ z+|a;hveo$MZ`chTlY14x6JHTBUJTC5V?6B08yy}UPal`dFzTCsVX_kyXr+B? zFQyZfL3X?j5!7gr6m!aH zZZEi_1kDe4b)h!bh^o6xs2oeodIg8CU=12lBJ?l3*?ZHvErvIHGu8QEgl6*2l08D* zSvuA6&H}&k9{tdUbedn@(7Ep61breNT#sg2L(MK&+M$_oM)I;&?D}2NZINH)HfWJu zXucXazwwpxma%#TMtC!1)r%aF2K9ne^CkF;Gzio#zv9R^<}h|k_vfH zx0(jR3DqCo2Ua<6UyJ9}%~IpYpr+9)F$Q(dL9zVlfT>QUWi#&u0#Vg#Pu?rW%33xvmrPL-Eo5pi{nAvh)074CIi4Jp^(OD2~ zEY;qr(Z{XSQ@_@8KSg*-kv)u>0lji*!1(wEG)#Qr!@T&du}I*Zue4jPONdJ#zyC65?1b)#Z?iB!epmz|vX#HGuC1}mU-?5? z_=h1_qGgzY_D{>U*29H!Xh#q*o|}k9;Ep{{H==SKeijr$o|u`E1^<+|#^MY-m5qUD zZJ2p)k30xiHy58e%zVE`Ej}Z)sn`dch$o=UzbgYlMDj`xrIz5?6CpdGh&bvkIghs+ zKpksO+os~acqx3W{f_&aB6xaxf{j2!vmcd)vSk*DR$@IC&VXTGAomuW=#=*cOc~UG zsfIILof;e{@-;2YO^%r9WfH2zk+UIyNoXP3IyY7PBmC!KWP1-A%KG!t!8g2ty4iTU zE8oCw94(JOj?ao8gA_7cSf1*RmlocPyg1t|=f3n5BvuALmXjtOmNB=EA!%0QA76^{ z@K%E;3N$u*l(P`~`whX^E0iIU|AGFa!TNF*N3B?=IAzK*p1;;odKSO1>?!64`a1qrUPMg_MLl}bb;fkbD@L{VI*it-jkTv~ZyMyUz}CR3O` zj^a*TDi#-fwH51zAds*Ha0}oHQIA%6;;0hvlkTT)RoUz|BQ;JPVqhh z0EX<@Nj&mxJ6qC!WIUG7&&bP+YA!AmBF@Rhq1LC8gl1dPck`$O=gmWwPU`!cKk~iIotf5QQOjE9ykF*wf8@FQj{o*w?>qic?kWG%_k7D&m{l#jfY8dkc%BKy%X%qPT3HWI(kF ztE<&2n@3p;sc^C|8|i|KsOn{$Ib2P$iKf3ms$U5cso!9wrNWow79K<4a4K4Y*}#VC z)N>`;4cRCu*mE2bx^7azXsU#!tk8BgivOR<(~7ZxTMg&5``d8dQrY6e^(%<^=vLOq7AH59}yZcV7HF%%r! zh|H8AVn-l`7X4^z&Zu+U?L_edE)Z$~P$Lc~`#uyL^o}-tJWiKYwQHk?YPvEj44;Te zEPv4kmr6w^>$#2d;Z^zBKRg8h7(5 zzz(JHfaILDBph!kiB7PN;dJkI`*E+tu^)VqAM13V2XnnXv61AL;hWBW-&ucX;z+`f z3A0VOsq|hS$=j}|hEw&PB_}~Wv64%l&qt=R!baKzHlGHEGnF;l!u{_n>Bm=aYDYGp z&{|*NRAtE+xjyW=CnWRfRBg#nQ^m$#k{(-XXroaG#s;~z88|>8>mtqs4A27WvQGK|=FTd~Zqg4ZQ`Qs(wAJl8V4m?bV-Kn7;zf(3GlqBD4MiF(igiH8+^J z5ril3*F_~=(@T*~2`h?Os)%!@EHppd5u7yDdWiay{#4MR98Sq4j{0H~+_yAzp@d1#9K~U2f)NH3G;OAe;~0S9WA3WVeDEt|{iF$j z*Myu>5O|8+3g(X!7y8P2ITSZ0gWkkF(?kEhZhfa|P>D6H7;R?vXvjKRBM!5*Gn8lv zty?5mGK$L;1}BCfG-(<`>WGoU4KN`QxqOT(!vN=Ay+3^A>yLhqJ{HyDJ1 z=7|tbQri%pHu4fOer1ekVuKsCB}7U;m@k-<6RE2YjgNYHlcDBS<7Mp>qUJo2=+^ROr z1gSLrONLP8z^~F$m6UqK5?3TYsgfDNk7Uj%3?{k(lhRc+TWhEXovsL0z7^lRr~cD+ zomN*&C!sR=T?K8-Wa6^Rf60KL=I!D+9V&xW-;J&a9uzGp62%r%i3p?XOC{SWTa|pN zL{?Y`q9=&#&*isB(k%W)Qh&&+#x0rB%)3Lr4m9VHl6guf`)4pdf`R@z)$J!C1!T1@ z(i{7giyATHxvyjng%seTVNf4s2fGd`W z+`Zx3|H@F+tXQi$IJW#z1I3*e9x$rAxt$zwr=^8Fi zzjYyC2&d!>VfESG5C$=X`%Kg6f%KF7uzp)tHjD|)EGplJPK_uSRZt>MZUtCoVGHXw zwPWd7+D?rIWh#^3YH5u>^!TcRs@h$_$~9O!fD^S}a>Bv@vLi+xyJt^)WrxufxV0`! zZx;g!L|Q#OE@7D1QfOo5h!8}RrXNo4{=}CUINOOIu;*YO&fUORAI@(L$eE;tb7Ce$ z#Rq1%zlHbskbiy_8~Dzl4Zj<+oX^pag`qZt-~63^^IAp=!%Bqo4J*6byG400alG~q z*eYy?ULPf-6uu$7CBkmQV5Z7GTz-Nv*hbQj%HPVujF!9B#8_>v;48ey#JBvI+#X+< zXW(qGr6X-<7CKbKR*gZ!#Bi`b;joI=v2E=_^WND#?6W5yURG>OG;~w#fTdcVxvDzd z$Ngxpbz`Xr16>e*yP{$`U1{Sr(kO0V?GCI?RhA&&;*zeeKu}%Q^-sS?=KR)BOghYi z?tzNFi&KpYh!+jh{5e_3$5Qi)gk)<%seicq2sKO<`>cPV_}1o7d`mM)>%F8%>YjNJ zliuG?sh420KHYvt=vnF_Rcn~46jQHZ>KqE`UvKtTQ;d5#wPx!?k{^h9n5v6} z{_%5y$2_Q8bs$kh>kgFS6&8`!zuwi)^)3U<@a?6zCOep;hbbPUYlo?8MK*0`4H5fGcpv<|dQ?L5Ml{(-`r;4TAZ z2Ic*w4~ zujS+KZuIzgnfmr~mmH4t`nPnfeX1>4Q4=ZY+D+;Q^u?>jFViVDnfPcH)Fhf~VYZC(sHs@C9>o$$dZkeDE=Vq^ zbK5m;>(n?WFSV)qM-Mn?ZK|0?V+*{u^P4GV=tv|;ZJCa zSwRsCMq;6F7BQIUOLlrGXdX_EZB8q`ifG86q;INJv)v819Ux zH2$lSFL@=O@JkBy`nm6^|Nk}0HS9AAi24H%@298PVSDI?9+$t1*3UW;aFAl{`=Yh$*M=r4EM+MIYbKM#s$l-B16Pv3m zE>tXgaPWe4;=Qd8jZj`(XNK256HKJFLG+UUfd3O^c>o!Tb^r6rY)XI8AQVR-! zyjSn`lA$~w-&oR5jyt(tc@AIPwMU4EDmS(*Go`Jux6_=ZH0%54;0oLeZM5_rbp`_O z0NSHRhuqIr`>1ZHb+;ar(Ka^2JMIPncUaf-@4Z?Jy;^_E)G{07lS8Pb7e}}D9lZ%z z`!2ny__7oCS%{@VXmIY?_%@2BL6}g?8!|z3a&$KQ_b}f(_pSp4kG^iHDSI1b-P=jh{<{y9 zfj7zja=#;_siM;&)%P7+@Ol*-e~_uW%qERfQaN?0bHF^mP91fgwFSD}%N89-9Tj-c z6j1XiliT+JTd0Q$9qJXDN}7sX&tDs(CDnIyPPy;88thu-=Ury=j-d^?0d&`rPya(~ z@;74`;A019a=gPk`KK!xbD31%Q*D9IRA3SX@L_x;Nr71BP(yxKegRyKI{(v-IiToZ zYkhnVBOYUW`d&+!8t|eT>T7#Cke)Ux+4G>4>idx`^ppw}sy9WnGw@XxljwpWEw+W` z(DEJUN+{v$Z@iH5w;h6p|G|xJ$w2pg&)N)`%YJkxeFcxY44C8*V`-C6%a#B{+xEo6`$#JUW z+pvQP1Q~0$YN^}lO$-wJ{qFA{Y3%GZHvGmHVe3I4w$E=mi9u)pCQK9uG2G)7C57%D zPS?`9*Scu9;yS)47l`l3L!VVdH4y(S&rF4j z&VXWO5lKF&I@2E=!+#^mm(?JuEED+S7TW2o&rat6_F;{8rN%|UFW+Eh*|lv=U$C;s z1uR|?;w^c>X@6x9xVS2JX}RmbfWRvY~+Ms?`XnnJ9R5$k1w!d2^C={1F% ziSU+OL*27u!%YM-uKjLC-x!CxqFcVc5xl4xztJ=vo9!+=6_DVEa=~S2`KPK^;wuKk z;Q7?-KlgN$yPKXLJ;QzDo82u38C*(-yG@49DP!+ZFA zbKdAXS@ovd;o6=7r|Qk7MecvWhh*0vgI^bkWdf5~r3|=cY6~{A1>x!83j`4i%K6o|bTkMbTbNAZOe6My38JRyG zcN7>U-YLNAe|ET8dt2OD82cQfVsY%k<5~||JK~?c#fJdU>%KFJaeMJ5_5GOO{+b)YLEz7> z{{qt~BW|_w4D}R-n%%tN-Stqs7A@{(l<|JZ>$zcc=>{0|C-MTx^);VQ4%q_1%Jur( z7~Wl{@_eFf^5U_Y^+Y@aRceJWZfdcL&#k{@ zUN89T^{)G>)^EN$vLU-(HUgUKiqmL?NAz{0zi8;~S=qsl{_ zM>BOgcy&I*62`E)n~3rK0H=Rww;80Z_9VAMs*TQ6>#1r^euB-BT`0lvVcIdsq>sJ4 zrBdpbnQCjeXe(pq^(Z6{mbz(AJD@HUi8#f^$R(s}d@BFbJE)x8SnWJlVsu9v5`CD7 zC25I%{G`l?Z)L>!vND*dIKxmXQLH}=iE{p^v@YOQ`SfMwxXESGIrJJ$ZbTbql$44( zxSP;Q^^S&`A%%zn7mhS7Rn1c~74d)Z3jOj>+xTz1#-)kGf$=hCRyr3_`47LRq3C$X zdtARBRfWpwPYzeTWI`>vyH7CZT<-0mzvk>LH235w%Y-Xg$!mJrIT`*glDYx@dDO^i zXX04z;ODq0G>tDT&>zV&G+-Xkq@)>KOx$gQ15z&Dh?We31=LTr^D-As-hvbSo$h{r zm3h%u(Vp-Nil>ozdE3hgS6#M~5Uq}9Wor6}r0nBx85-2@!4x2D1YwAgH5QdljU}91 zW?~s5Z){U>j!w~V*-zL3Qc<(;hi}_RE~`%BMI7uN2lxmF7+uIfvjoqKPp5!+8NAYr zZ*MH!^q?V&>;n!Se2g#^11=;5B_A^gWV8w>a3>=dM(&ue z2i5~ehw)DwZaAk|B^1spcw?Q!i;=Q#qdi3D5IKgD5{nqgD#@`gbrhx!IOuB~kZ2#a z7-gVfZv!#+u%+T&ZZaQ;$~sE!JTQ{{zB=zme4_#%^iJO&9iPwvlpjjdWBWvsV;SZp ztjrS%eHZ1y_C7S>cD@q5X~4g3I~<>a(fAqPjo?Z*At#~! zDiTsT33HVo7vltMQ(MxPe}pukKf*xY=f+4lyx1dci3VCw$$QlPd^Klr$er>h&B)*r z%8$Qj6}KSypwfjBkWTNv1Z_di=La^HN9DDu)cdkPGM|RJNLkYPRT_ zQ11_*C@-8H+f1Co*!eP_3YE1Ve@-MdTM`yC4tG?g0az(izaVy^`|jHUWEAJDgN;6S z>^NV%vMKh>qJWMYU?o@emz#yMp~=ckYCkMLy-vnGEw3lcGt~S2?V-F|3i!{f8esZA z0UrC+@=s3wN5VG?2X+9yzU;jKo3=?M;=4=NzDA$q822f90YDP64I1pNfAn9W-5Y4H zbeC6-XJ7ceeafjn8OmMDLXA)x$?O-nk_4JAFk+ug8?O_|(k zLOk%e3=dsKC#4$BXBoyZOAnDT)iCZrdN%dE`IhcV$IR@3i=Dre=2H)9F$4p%9jsY{ zRi&RJIk-`!M>P>udS}5b6=fQQ?hx9=ZL$*dFXGJZ1$a59qlXA?4Ar<0aO3nys-nd& z&}$8~gSF371Em0wVL{p@O%Zhd3ytrEczIDCky_n>i+37f z#376i5)qaQ=>;IU-=ys+T()f7Tz9siv&O}~J=Xh)2+E*h*Z52_^u^xcPcIgo zKiln}dFBvaVBBKI*I}7xqo=yJ@SBMj(U>M)1f0#hpD2-jhue#;HT5RS6nkY3_tqu1 zT);2KI_ik?IOy~evsr7+nD^1wMMa{`O%P-IUFRMG>m=b@$T?U~F8FwfHy<3F_LHU^ zZ!Qc@+dwA96!@6L{I(;r&5GnrI5iWENjv}nJd>^5$3^PPv%cd9>KA-*JHF$rM_W2d zu8>K|w3psz9a7z+J&l$ARBPO>^ZvHNUCV2NiFyEGaNt&8E6wzNLt9wqT`Sr}gHtxwFfh1u3?)g!t|k2*yNzdPKIdKfHNs&CQ=#3>l? zYfQ6!m>NAynPX1_uQpw7x-NFFRf~|r$4+hLblm73f13UKj=r&?EC*h-|6t&B)W`jv zGc^5#nMQeAyWf8p48N_9re??2*=u_+ZB;W*v0TT)V0csg@gT8BInx}%pvZRDU1G=d zus0^vPoF}s-Z{ZAxA(9Xy>+aohB=a9COT6@Na9|oVg6*WpiCw z4s@?S^1wh^T&AV-lbj)UwFh8)bsa}5N_r_Cq^7`emk0n z`Wn+loq6rkZ#?OqLuWILo$xKfKs&}@q8-WRXt(o`y}VfVVU+QPhL6zCbi>0tM4VA2 z@iZ}v(35tc89w*lk1H)%fnUxdqVER+f1y@!SOh`c>cN#HX!Z3VsyBcnK{ayWk_1_j zojv&fH~lslq^l7OWz(r(-nF-p2EK5PU9jQ6%udR8hara}J-q`o(0*fG#}2}tQ!J;x zeLotVg45&=4^oprodypFo*xbGq`u-Zpn0^ZWBL`pyS<0ycQ^e55+$difnqjfKev$g zjkNs5dHoe0EaxLx`iXOrA84s&3rffb8(UI$A|8*8b7q6GH|a}8s2c6K!j6IT2z>~f zYY|VS&-b#<-PkUW9^`#I)VW6>-Pe{Ya<5Riqd}oI?o|99-O4 zAuZs@r0pRm0wmo)K(duJqYCzht*Ufo@cC`n$|>}%#KfD!$+cl*#Di0j?t%EH1Ea?x z9qwF_sv3v_OhqufyuP_3^0&MtAsbN)eampC4)0cv`l>RyW=N{?gn<#~S<_v;+cCWR zJ*$KrOmt%VRo}37{duYT4$)Js5c1Ap3@h&9wfNa0enD}t@On3rdTD8~`J6ZdIy=i) z3Vz+Bdl=V0LQ5}G{c4$W%I!7Ldeg>KLGJyI%AqT zr#kr&g7E6334k43yt?T(9^KNWIM?(kFT@1lMlwx&7?w@`a*4&Q0>3i7RhIM$H&hAR zIYO!ms*^XC^s0!LcgYiet!u&?vMzho3R%8g_KfzFK0{Y{WIWgQWUo(%fMI2_-8Vm{fd_s&niz4XLPMi^rPc9AwYhToO zN0oO8zB;T!-jdN3?S~c$9YT523dBRi7mEZ2qJx}ig`#6bTIZ5;y7tl&-Rxev?|HFZ z6rIo~5Is}}GGVS$eNRRX;)d?)2`|qH^fqPUtt^6Pm>H$H8hhsg-vxQ;Pcq*;3J@)A z7lxwTY87CnYLg1a&*i078qhm&m{xT@855)5X#9-|mj2l80z1C=9X4dOvM4CD4 zrRdt+7+5Yey0lv76hxBa?PA$=7joup;k1a|4`@R;z6ON2U}8uPLvkk0Oov3zDQBi+ z3tN9)O>brSac@yy=K0)o=oN3%v0wW*ws_NBw#|Y(KUETx^v(PS#S2tj#Khm^Z09eW zs`e9N1YRsiyjLd~Ul)}W^Yw6{{ko#04_~v3?bp>M<$OKc$9~;dGL)|u%k5XRWF%h; zhT5;&OUCjQA8Eg8OKN}=3C>uXa7T%>!%4We#wOfXGRr1BJi{hDQZm;j%${Wvo+zm! zAw3nq`TSWfe=7+)^y#uz;$OLvQbdDw;#BaF4K25^Ixyp~T6x_-(F*6Tnfx*F1}GRw z{cbL1odqkZX6Io)ItN>fhN>s%JJ3+|2>F4gi#$A%!YgKG($QX_|DUu)B|K!TXHh>32Q;Y*)#9SU+ zBzL3BI{k6~!&2@(Fm$70uZKoe*Hs1=U*0ZK_Dv{tE*4;wOK7%ZWva`8m3gZ{$)d`# z4~gW!0&|TH-gO}e;BzT-7`qFHr}X4re;0fn7rL-_p);C_d#L5#;FidQb(#TBUG&!& zsLauxX2@rUod>t`JAC4U+V)}Ru4d(=y4@41-;C$Lp`7xoL)U$4%xRHpafJa288LES$QuPdN2z5vBC}-vm23s1M4$BL$Xl z!!&_V|A<&8X`oD5Ylo;MXR0~~m9-nsXxd2ym`AREa!U4zIDAkr2ts#+Y^>A@?wwkD9L}3cp2GgH zenO5b6(I55%4F3e;nYhd(;1Ia&qE@2X#qI$p;YR$5kko`L#biJTihcf$T!r+_u$WY z{q*Z?)j`*VaZ^rJcZCF~qhnOFUU zGw}%_VmNu^l$JmNl;F+@Vi`nrztE3V{)r;g1{c1j(F(^b5_+X9`ePOWHbhTlq(hj+ zH+9DJZ<+*MVW0SSub6U|)Vl-aj4AWpj1H+(SMINCI@j=jS#%24{t;$`7DL$<|2SU! z$prW;R2sWZb7?L;lBC@B+Fa(OXwc@+pl;z^s*C<)^&GdinhO?I&ynWj%|}_S$>D%V$iy7^QyPvjGu@KsY#fCx6YxVqiwin8hs(KF;qyh9{;(t6`p9C<{jY~8qZ zA?KpT=HTK%?ShN<4?bTHQ`CM?aX2|m(ued`=8sgPPuPhW-1y#LBchHF()UpE>`=oB z1}|DaL-@kq8iO}NBO@IV27w@0pze{n=#pSpQ$Ugu5Lhz_`2v#z|84~)mAphrrg|qF zus2O_(l&rQ2m2dc?7_a^XizoGWbVgl5jSaU{P6FGQ2uV@4NLn2vkCQ+ zTrs+`tUh?>6qShAE*%3s$>Yb42{1>zMzDEyVGcABD$QZa2AqR5QQBz=`C((CUrE)` z74hpjP;cUN7)+@?;(0>jmH^>k`CxdQr(^S$)Zo67FJaom>F$W1f|#qEQ?F+F9PY{d01l^C%1H7?XV|TZ+ERlVce~`cGc_VdvZ;V|-`c z8A$mI5eWFsIrnSlmVQ_b9KcZ|hQ zAuk>E#+}_esMNl1eE4SKJRpG};DFs3>o$iv-DiB5r*EL@jGsZG^h&zZg4BVj%zU~A z5jAcy&g*D!8L1S!aqnf}`XAd@T(_+E6?ZL3O~`j=uvl=y)1~$i?LgfG+uGnJ;bbP( zq{n*guJ668B^T|dDWYyDHT3xGBs^nWk-lK zwS$a}Bljqcd-!q4g`Q9)$LQCDoJm6?sY(4pWs`;nYoB4-_)|^Kr+`}xHG_)%>Iu<5 zXwHDsN1JFXc>=Jd{aKw)ux-@*_9-`6=Z;N`8)dMeFz>IfC<|5I)-_pBfMuHLOEb zV(p|~hGCT=&ZL5fbEJH2g!2^F0D0(n1&Hp^C0J1yYN%kVfjnj3#kRT^>h&H(`?da} zY0%2)Pu2lZxW6+7k`c|MhI4Lfn2ZPkur&Ihir z-ae9H{^>Y@Ss6}s=!)_*o}N}zJF((we1P+gN%+KZ5o{qqMQr%%$6;77l%Sid$Gxcu zM8v5L25YnDx#s5&F@6Uq!-Zd>ctY4Ts?{(9FyD#9A5Ov>yiau|E^xDS97|r^g<(9XJd) zlo7{jBmMtSfW@3QiX3nU6Y_A9o(`(ytgh%!M!#n17VXJa$~C$9zCMSiW7Fy>k>k#N zVx741L?J+Di*b*wHxz4H9!%>mIN);M`bX#_Y9qe}Rm<}2iQIdZIlLpOiSr_$936Xv*BO4(^CyKP zsZB_z`f+0#i~g?hB-Ma?YJ2slUE#b>@RT*KEIn6SApS#_*e@`~EDl5u<4;il?P_+_ z)i3lAy$aSgQAl*exYr8CZ&w|M>xCCHsx$hHgj?gtjDB=%KnF^4SaI07f4UYjz7pvx zI->cz-ZJvoBHlN$^592J83hwU9K1qtWATcx$9U<26PH{#o{%V*{j*~nd!UA{VYhMo z*#AlG%HY%>NGY)JB+<#7KKc21g5@=Z8!aq*kgA3L)j64kcDKzdlx0^#Vg_yKAMOF> zOv^KIt2MrjZfGW=d2u%TX(y0y>8*RrT_LfH4WNW`KIm+GZEn%GoRLN&tankU0nF6A zB@cc^zXZX06>4aI1m8Yj{yh-VrVHVY92X%-ZhA`3+U`pOc-_}kMM9pT2|79Fj6a{fYZs5}MXSMrQl@^`{}~Z5UJx5UJaczQ{D=(I4~V z^N&N7lTj=WIRoA28?+DmySrb}Ujik5tsiVkDQc#>(uC#DJzwNJ6*`1X*$$6~Z0we^ zkeUBs@8O6~e#|-s4kfXc>weB?g9ixk9szppwf6`TgNx?u7ai!~DW3&%Ocap1SZ9yH zf;e)X6~;Fo#jZP2N&9ULQiPADQ9D(bvIl zst%p7OSl{2F{nSKLQc1O#iQLUGV?LME#g}M;oc)-vPEQ|w>Rrz%+Lg^%oIaK` zbMK;`k@S;z-Sjh_?aKDYp#0AEs+H=pz3CuR&L}#`d{pmp^sQ+$X&PH{rtzVjMq$$$ z@WZSZ{-d+y@sx-+gM$nph8C*@n^J63hG$b`A02XL%wdyc6U%I(F2&izN?UhAHswNF ztj-n-CeG9VbQ3ByBiY~FAiu{M;?d??aG#;V>8^Zd)(`9v3fQ2jhBO8f+YRe!NE&&p z!$uN#nptnti$P7LbN*!3hVX6{KY4Smp%bm8ed?J_B|Ks$NWxvCbj#>KEjaHXS|>_&Iw z4?#oqb)PifXJ`oh5tf>Z?Bm~x-S3}smkpOKAJ@eTbXptae!>HJ)9D5;-0_rViWOzc zgK?R5RwmtWs@t-V(++U3z8pWsTFB{N5nrC?dv1<30N_IRkQWMZv?e};F>-6hMXNdg z42+_O(L#?bY%s*g>~+p2?eiflO z89)Hfzc@>Xdx=pxBa`20cK0y5v|>kFx}aseY6N(>mWN!h8wH2D=!L9Yx15zL@K%n$ zoPJ^?9@FU&oV|uH)HEGVT~vY~`;L;4nr-|{5MhRT^aaCfaKYhkoLfvkIsi;3I)N~+ zVZ+dL5@6DVxa{57w)D|zHRC#EMEc9^`P!>G`z#V)sPQm{ zOv05mfy2@(G0i4G27-yTyb~G{u}VKOv$Mim~NMCAeh+6qoO%czSIvVTjeA3ZK@Qc-!UIU*$-=@cWX6abNr$h zKbZr6Xn|pK#78;>nS;sD5i{*}>1Bp&l#}0IL^tTm|M>Rlsk^-?NW_aVh2u}vD?!rb zC1;7HzyH)`d^g*+?6U=ucCs>oI2dWB+lcZ9ERR%^g0(~+^+@A&mq8k@J_DLSoR|!r zLIL`eGHpu;zvzJ@QxU>0b`C#*I4l_=$h1Molv2y(3_HcY)h9W6i@d7;>{*6 zIfT=9uvR=Ur$Y>x#>yOicW9rQPyzQ9Nvzk!zA>TGd#eTOH#t(aC-zsQJP+?UDNs!u zW^_Oth#SXDBsEo%W!xx52V~j{r{?MD!|i}R8?~;XR@j-*PaG%4m|hLfQpX%sOJZ+Y zX;FDFv6KOZQzLp+r=FA`4F^WCOa1w!hVcZ8(E1y1T<$+MLa^}X{6!n-+G~2CZ)-xc zG&7seqVE{G62EOI;~C#C`h}rG*kah`-OFef#vilurfj9yJ54kFEs+7M2U7e@*NG8b za}(TPy?KG$(oDMC8|hyt^{C7>rqt^J2-u5V@*M0WKd4M@qo{K9kDp^`LjR24o*zS{a2eL6D+94mZhr;Y;0>Z@uLe2y@tA4@6f6$_@^sprM zDHgygiW!;L%xCysS4&*GP=WkB*1f4bhks#dxk*G%t|p{TarS`;;X5N}aqpOFADMpC z((!88CsejRw%S9)P}!rxs@Ri8V01T=F>`fqaU@4Gvx2Ap=gTJt+^b2FsO|HwPcovm zcasQ}9g7@9o^x*NBLN5^waLX)Ip;q#e>^Xk0`9B#AUt)9syxwvW&td}YT1h5)H2Y? zE2$o)dOeKG?SbmU>0yI=-q-3patD*FT{>4Zj^0d4yIq4hdlNTn*3Lpr7im1Ba3f!G{xg(B zjI?kW7U}3#6dRL8ygg~a&fq>FyZ}YYHU$$MDFo3CPpMx?zmc+(mf!mM_iVkuH6Qyd zh&Q@_z6+b{&u_)Y@>LtUv$>BL^X*AA3kMM#s^M@K%-+X z*XY8LYgFKZU1txq$wmP#*!9_wrtphn&7TD|=1+Wv`Qywof9{=Y{ybb~{>*OVPx^aK zRj7*gN_7$+=l2Kr1vem@;c9}JRhNy&qo2eRM20O6rv}#%mO#$Zs#CW$L->Rc*{4@9 z``z&F#_D7KSV-gEL#&k8*M--)@^_o)qx2g#tS9<~a0sWEha0_G8&d(J;Be|Ma_R=7 ziL9sz^Otg{|59K7*7(fSb7aKfk*+avOk576q90cUU*&@SvPFLO7&7&RqKodFk7ZpI zd!3LD>JJ0W;>;8MqbiPdcZfSh%|y{GlcHe?L}8yPF@!Lf_)3J^F`&Y?nSqmI;FKN= z_rX;jR0)LVZXS>J06t^Ey)Y;e3OgXzPX9CF$E3p637WCg;J> zUG|X%X6DDWDDf!cOdm|$Q19*Bk>9_JU-iv;hJr~d-=_V^|4c9*_YW`P4#Se_^nJ`C zi~dl@W_{Z&0Q#o`d`CEMQ{Bg(N0X_(Z!VQQ|9PX?QhTceLQZ~>OZ(WJoFg;Aemqv5 zJMkxfzu3yZvX$>rUd$ZklCLn z4v=C^?o%rPr2p>nXFf9guK#{)+}dL5|1V;y-;B8H$SI!%0>uI3x}Z-u`JMtqMaNZe zqIXEtO}Z>oUuS$F&dCr_2Ez4QI_MGHu~E+skr%_R?lw@)mZFHs9%}=K?XUcNcQyIa zMyud3=`i_u6D7T3M8%adTx6d*XS#DJ(Nt^C(M%-2KH*UpF_yKHeqnVyn~@})srQ|> z^RL(Z8-!-qJM#B(d4vpjVRx6>`O8_zZXJ(;8MhsG=L)+T<~=N{^NXHto$>rjajX4n ze8TkI^4pWzx&U_XL2cOg2E~g~{-ImFT~cG;@8%gZy(=EE*!B>Q=3E5oLVA3UH0fE;?oZ3L;}`;Uq=2G;DJq?Bx{CE~bytaLSN4EHy^4Uol|j=347T-~QB%7a05Am*5-wz#uLP{DaG8Ui6^&CayEhc|CWHF5NX{ zMc^OSb;UJHEJ97p^cwq<*?)@yxSv;VgDD}|;5&a20odve%ar78iL~^kIw%Z&!H-Pn z$$XnXXTH#i3@J5s27-_qgL0Yn{rxKJgUaW3+aj!jBWgxRaqN-!vmx<$HN+chwxw0+ zd!gVcHEzNNFVC_#Jl@#j62n5BPRa!8XDL8#LIS@vruTN;HRv1z0mnM0)`>)&0 z^35>T%KkRm=zdji)-Y|?aC?sCoQHR%yBK+ewIZLzF>c$9)~KIZrp@IBj(nrV;hqe+ zHY&|@VXC^0?O~(m&)mJCqwsl2P*AidPBh7= zGW0Wte*EX+4E?}7s}232_fDVCyU5iY?kjiNebDt`Hu|m1CDWdJSO<$w_GXC7;``1V>@@=136udpT>-n$n@XjmN8iSXV%I6 z=!mRa$c~I7*Da(3Z`KcF?H81dI4{b#G)8#k+@3hpEI)8>k-1Cp@}YZ?lMTn93q?-Y zgNRc?D48EiqF7>WVOBc*+^?pHZg0|^!rYeoWbYZ=EUc1lZYY_yF&N?+N~E_N$!iWH zONgT)4D+%;Lka|IZ(`KeW91qA%6P0iRwX3E%JEokJl_sGkxgp?bE!!kSIE@}K+N-ZNR--G8MrUS#5QpO#Z zXu`c4O-Pp$9rHr&J7Hew`O{<~dq4Chk~qV|Tc-P*d;X!QI~_|(jywr;>-C77DWOGH zyGrAMSN{4VEA{#07GJ>%5k)^YxD4f~Csii<-fcrR=puqgW-q?Pl{xVx7Tn8#>Etxr zWu>pm%-4)(V-Loo2(8)n)caVk_mP?2+o|`vIfK(zP#P`#V&Ndj=7l?H6HDR)2#d}N z3K>5hZbwd@9DXMgzXbcSt3ytQV|!`2QF2A|ibv$=39ZXX!)PBLudkmO84n z2iA%6SuspvM~CE&Bz5mdGd!HW7W;y}#@IJa&j??V@4LOY8HM8m1JN~253pDl{L{y} zzZ?9;$7*Kpp8Q{S@8**u6?zlp;epoM_97u>DlUmPPe;9&hoT#L=R-JkNk1uavI6zo zI}|gzKx9kzZO;c#q%1Zw_JQ3upOc)~H}E+7?3;mR-#mcQG+N200;e48y!{vd17@22 zlK&s;edN3!bTEkUiV$HMUl^QDDhNc+xG$(V^>IWt%* zSrGnkZ zPJ_Qrbx8m}{&vWVq)xBl4%vQ4>Y~0Q(JPgM;Mcu8>DE`LBFm9(RE#tywlQ+fs~6c@ z8Lr=i_sed{kQ2hjEb`t+u7SNufpYNoM6S58eh{{4?KQ&D$xsJGc-n86Zm5Ua5BbSv zHItN9f~)TVnrv{|NBS*oxTMWTnwm4+s#@Ni3s`ejVHs#Y&;30s0Zz_Kf5&Rr`*`ww zz4>5mcU{>5|)&5D|5T2p{Lzrv3cdtQCWg1hGx&Kzr%JlSrq4^r12N%<0?HHQy zsz2}>TisteRZU+-HMh&nej!`CnjS%vYp4KJ)t8y7Aeugf3W9snGuiXVzkj_`aY+PM zU3z;pE*XD>b?5nYDf<_Si?w%hSDTZ>z2G1dn+HYqS+OxD&d*-&s`HKe1*;mW|ExGn zxNe3}oxHXn)M;rrc~m%FRg?#I9zq5l&@c4A1$2 z2WOxL_X)HSmHk@=6y*%P*{s_X>QuS6JRCnq>vB$ZUA}PxOy>WxE<5kkx&)K5C1GuT zv&LJSo3zNYAJ44KZnxw8D$(~0Q{wDEbhy^$2(8U?v|-P+7I)JDt=47AwRT-f*V%PB z`uDBZ<%0RS>oV#<*5!}>y7UE>T9*gi4dYrJVcGj%SpH$Hm}nhXU%(6=Y-9$6h{2Wy zQB?jsI>rWQ(V-wNHf*{Gnn31m4@gBMIR=e{k=z=G7wb}P&=!qw5UBU%Q*&6Wfj*(Bb=cgoLvq50K=E zuI6wSs3I7iWac1=k`KpVEuLwCYq-ex^=UPojQj%ql3b72;!(Uce(~+h#70G&0q@dJ zc8$XhMvHchPxA)Lz(bHl@0m{E4ktUBa`tt?!K-m3IjUH1h#5SvPPl~En#))gS92M8 zL#y?eV&*V`$>hwz-~;jwlvpp>kEho5X(BNp-Ei`66=6&D9bd+sTCWxotBzy&iXO3penZFuG!QRpBh2 zupc%^`eErRF(Xi8cbgQ#ro53?EaVk*3e1@Y@lI~Y#da36Sm+a9!t?p&;!vj#L-L!N zr5uL8$+467&4*M#q8qJd7)5;p^o@@HlM z@>?NqN{KHhQH_Rp@_R!v%m^wNLB!z-vaKrlRqjyQQ0_>lZMl@&A6qR=(iQ7h1NLeC z#*XsVZvxa3SSU6+@9jnD9KV1(X4oafKg8EUj(+w8f#9X3%)t$1U$+5~)b*TFwD^>! zAs-=!vV8De_~KfgmxhhboCnOtbfMF@oDRbEUldn&!diM{K_uDB+yc`3=aiSLssB*F zZI)*l`#yaI86Mtgo-@G&&2##1ThBA)&$G65`7vJk;cd#FN&f~erDh;Cf}>Wc_A=_X zU8VjaKu)jp#inh`Kd1WctNiH_S)cx1agZSIvezfZ#+@l~7;U&}!jyGj0+7YZ~omXH1 z1?FF%5!*6N<4l>8ROWfF%!4We>iK0FY?&gJalA6)+q5&=mIb-=7VjS z*Hq>MugqeV$wNZojpv*HG(X*~?{r7{bXEx`2OR5Ts&e%nFDcdcull|S@Rt%pse9+U z6|tc210;&i2ISxOFj;^z)%^&Y+jkySKFvx0f&ebmx=u~4%1QUiFBQ~Y$VtD3=W5Ci zd!uK-{c}!wYK}<{uA}@E(wWF>AR%SDpUR^oRf6hbw5^irz7P-Bnry1?-T>+6sY+_V zPx}4cPrFb*OYZIS&MpVeNqGFD&fLYy9UfVq*bDty+mZXkGtW99{kO(NG?ccCNcYE)5mII#O?!?ZhN8M zq=xia>$KVy1CfbpW~Irp&Aj=rY33%f-MKmGSKIWFN}rjN{w5}ebP*C()#Rj~Zqt9S z^f4wqGn@xMrj3hQr>$=$t(-I#?wL9ZdlvhX_RZ)B`+p(I>m*WX$=q z8N-wld3wJiH)HahCS$E?jL*$@3MnT|y{U}Lax>n#!_@e@GAg_be--bxd5nYKTRNs3^6aqtnOLung#*aH>yCqRV=Lt9#UH(zYIa_bP4;SpUjO$bI-?ppx}%pkvy2EhTuI|=By3AQil(k=;_E8+>eg8Iss=&J;}NkPD&Rxz$nUhbgQggVvRaaEde#ro@(P@VkNjtMTxjOyuL8Wpb>?#GU|ZlTmQ>$A7F zbUvd?-vE>D-#^4e=+5}LHlMFM;_FLIUaZ8{`ck9*$rkeUrCvGCLg`3aY@;vr>=7A# zsi6!;{iVZiI_o_SJWkX>X zfB#ONX5@)KgO8sr`v1bmm$-}ZbXoqh_}Jq(A0MmDD0Qy{AI(s6kW#K;(qG)Nk9-?_ zr{y0CW2k5G#mPU5VS4Zs>bz_B^L9Pj?*82Do0V|5ZTItAZWlAoU?NU8KeM0TJJg5g zY@UyE_p>g)o;(tLt|!6%oblL&%}_!l-q%K)Q}750-@hw*VmMV*VDP1h0D-&=8^gHw z#~mChD~f&X$3L+;y^++-c_zLPeztJm{f)ujNV3nblZS7|T|;z@5HaIQY=jhNKV1Oo zT1g?h)Jk!ezsIg=&{Gmn8qNc>D)Fpt^eN>_@CkCvzA=|!L}1VnGvpBnSoR=emHuHk zRb60pei9pE2Q@)t$>g<{I7OkdrQ^nj`gbKBNZI=Fr%2bkH(IwS33uB`O?)7HGaz=e zF0uutp=ds>-JajdeUH#pZ0xT2SKn3-ELWPOI|KIc6^nI_HP&4{ID z;)2tthlrmiR;+39Vs+_$cb4RXKJ7L7aSba#>Z` z5I)w8!R0Us&6<4Mv=T+3~ZHZnMmWt?-LN8O! zWZUBncYEdZXkM{;2sgAZq3acuWyLt&FrmWlwQ{uZluyAtuDzSORd+&rztiQFsB2vz zDvwVdizIiBe5gLpIpl(?I(iz6dOGVW4r!E zMa$3vW4JZ~!c)0~mkjE8>tOY9lV@72NRBJW4OZyWJF^U)UnI3}`s!F(M@#m8>+H8{ zSq+XPSOFG*P?dqa%zKG*F3&aPg*MURYZ}cEc3TY)`Pur2XhJ>f;+wh||3zN?oW$&j zVcVP6frfI&mu#l{S~c&tA95}QL<}Q2v|wI|is$r?5Hr5FL-4-3ygH*F&-d>A0yQ{T z=L9{Up?81aNvKoV1qJgB+h&27(|()&+KvaDZH{lkc;pLqB_j3acCqe=Xq(-;k{#LM z6PwZ7m{b=kZE(;2s&ioeYpa9t(4w6ax23P1*ZCCgpj{X?R^VGgrHy8MtZ&Hd14IQ{ z_H{CH=Wr`*8O9_Jj+FhjFm|%!TnEt=`wEM-5%56qx^_!v_|(a;Sd~5=Ky_xn%oJ07 z?CQRZX081 z!_R-o<{$VkJ@I<4M?*9DH2LEGMLf{7VK+1Kz}@O~#=b=|_6*+BVXxdrZI^{kPHbFk zE_}(@dSZh$xeaj_nWK^Xr$ zGb>%3+gG#cYm?s>z8_+n+>L*xuU7GMJFH?`xeXWX(_W4*OX&J9D|Rmzg2wuU>%W5P zeSv4JZ`|zxt|bJ*t}BF(LM2#L?66H~1Iz%SRg}*eE6n4>k8X9Id-h3UCb2Rn9_Ywj=5~~wv}vz&L(|(iSELL+WYoi8G|s5N+Ygfs zCJy9)4cC7yLwz8++x<(69wvb(!s*RSJnW1JU?^nDKE$`6HvdF1s9W95?^4#O4gjp} zq!SROTl`ZCGs$~(NH6AZwecjqqN%r~|M)f30gRCfk9dMm*tw{Xd)6h*Wh=*@AlMyS zQFHqd#VyJ8v2|PqR3d&>VM%O-skbz*Y~{Fr>KyOAH&nkD8ndIRxAr9?V6cVm;oj&f z866i#V>Z9Sy(A0DAtu9su=uK7Etdm7-&V-9WAJ5cp%M1d5Aa;|v+y)xOGy0@-#y>j zHb}cnQFTv-l60I472rN7t?_F}Z?&5)2WK;JcCr8YTu?pfD{Ybdw`kO_*iFsFI4ifh zUw>T`Xfkm&Oxi(8`;fFOKF-tDZF<0sUSRb&EWNSD1HBk+<WbPSWY+cd{f*5AnF?*Sm$xNeIE@agV45A5K?2**Ey0$?$WwJ3#SpAr_PBu@>U z%M90NDc_~6RWFaY_~U=qo!n%`UrdJ@fbN~9)7V{h3a`L#5oehBuXIl{3tP3a=_ym+ z7I?^g^ZZuVg$%z(PTl# zx%VGpq|&tF{?}hS2AW><`41`lxYuqoa4Bdtia8c;PJaD!-bh*T9Hq0EiD&GSGs_N+ zp5ZQ7w+E86BHh*SP{NyK?pEO5w8WjkDhj_#ThfT1Ti<8A^RK|&!&9Ni)~NQ3>AyMW zECL(;Nk_U@zbF^*>}>ZrH3zip^FgY5)1nlxWra7n^=JL}J>>2f|0I125a*B=|2>(* zeXuv~XWLmmpv`%kncrci+(tczjQm{Z*$9qa?ZsNgl{ufqFZfkL&bR{iqN%WA1{}D7 zYIEdUP_(K~P{w`rv(9u6%(P;ehZx*mMuEbtH=+z3y|EIl0#4Z4Tz|6Xlk}Z*0sRrJ zN6b0a=|U&t&}XOk1NFM#3YzIc{x6JrLHGZueRmY?j0im=76;B3_7D(3hkW{Ix;9py z&Z+e7o}TFz_;f;{D06FT#gh5sXMcPEh#9oFARFu*ebi<>RmI%-hU0<*GI$a$6$(`~ zLtQ!;%Yc~Wg6fCtY%%R2!_10kkj|{X7Pa6VXYG&U2s2(rWJhD}3w{4N{$!pK(u2S z2xm4dvTz)*&E;9~yP~c+^ECnh81o|yW4;6LwDL8JGIxuW;CkD_JzUS)+2b+;FV%0$ zEYsY89l=ScpmFKgq4*4e;2|BwHESJ%y{j7C1MbqE$DK}<*ko@xam8Xcq5F59^4)Zp zJ?`&EbC0pO&VJ+;EwRPuLSsxRr(R~h+*@mRn2*l7TX!f4I~Ny+?9Ca;vC;^z6zm!* z)K8)-1-lL{)=xq!1-lOKqo2f83U(b?uAc-|3U(bcR6mKR6zn>7q<#`kDcE(wSb3PD z`M?y;lkI^}C*tNFEVeE*1^2z%wP_1sjRUyeG+EkwS%LiDkM{39tZB$OB!sjt*y1+@ znEb@;CQ*$j@fqfp7d=a*TQHs6&-Yx^^!SWLHRQRYPs1??XiFz=wq2HL=4PPB4I_`bbKG z-##;=CRmS2&@{O%|H5q?4MRSqbASw^UFa9h#ixtS1T3{RowyI3YUgq+SJlvz)wG#s zU>h*71=_9q%N_qwjGtOf?_|d>dX>3*`t)F*`{=KDl(*;o#Z{%N(Cg4ETW(-o7?r+{ z-*j?oHVVe!M{0hGgnDlRQC^e!nypSaQt7*cG zRC&OCW1Z-A!<@X>Mbz03`5HV$8uYN< zajKLWumrLsa{P(A@^xG$W2f4Se0Rt>txjOOKdn+iD|!Hv8B!p>{<<>Zu{ybtUZF#<~-Zz{`Q5A#>D*xCYxPPb1BF&n!!X*YA_$4 z+0>@;m;#B;9vH zi2U=H{(_a}o|pKma`DKS_)owAzgk^~#L$d+#7e++IfrCr@^_8y=J|MBJfAWiAIDX= zY!FriX9~)Ogd?YU6z3t=sbyzSfwf2T=y&>ZQ!`-hCutegSo~zYHG7Y89;KOEc-i$# zKlg`@90lbxIIOVg8TZl3R;y*tJA+7R`IWZc$lLq!kvZQv*5g}nsd>>z@w2ebL-a$C z^qlM$1QY#8IyO)YD0Z*+gmI>RYkIL?a!LKRp79?h6EH&$@Ok{dMH2C&SB6Fr-Qv@p zp-#x{_fv_g*8AG&d-RR?y*lX`r~&NgOMN?LLh&)3-gj5LQzu{l|BC=rsM$ zm&YL-nEUk2=U3cO^!)GTLt^%J>~o|+I9Q{@_c^e*&e;P?@SC)sIqA$1XHPqG(j7A$ zo_o1__~2FxV9w7)IvGKg^FQTSzPu~Pau&b+@p|KdrNh8&XaU&R#T?KB&H2px^1<2( z;yiOId-ToF5q4QitdkWrk{)t;nBSq~8tb3*u&7(JrJUH6M83(9x10VwH4LMK?q4KZ zarRuP+_i(ddL#*{;3mC#H@JWKPB*3H5XLUE?4^YetV|X~^%F^`c8)jCd_eqz%#J>uL=0Z=WD5hZ1HUXUY|gC91#BRVAD}y(F7-JYg@r3r-CX zXWAFL?tVp@+QlxF(J?mr#@*3F51_Ve4oc$)jqbC}JU!I9GTRSu} zbTr#~6WdyRi@jLcex1G-jA1`t@uc0)pOEnV=m$}b}-D6iSu#Uk1NH zrV=$4!~$xRh|xq7nMk52L|GAKWd-agGlF6um}F%fM`BsUy4X=x!H(EM4TxgI0@g&N z+;J3CSb`Mu`TGxy&2)^krk=jvYA?AOz%l?^m|%|f_=Yjg#h z0>BEGlzJ|Tq@J$Yo*|E+bl&oWAm>r8Duab?pvnJ%N|p{kUIAUMar>>J&N%MUN5zkD5dpa{cj}i3?2o4~p`;1^ zO~$vEbp7c<8R~-hYP zFl$Av=+PuSrz4Bsx>v<9#9k)OXslSFYEm}>PxsU;y)hoOxIs?fovLD zlu8yC2aP;EiAd;5gV}l>eI5PohRnsa#u zBY1(dY&cPJafY5Li{#{(`|5Z@hfgHvVnb=Kra*LTi`m#lVHNsg+D_ZcPMla#bdu(& z)xgg1T8$Wif1M5ezTzp_NMe@5A^d^nA?y&t%T(&(_vk0JUnp4ieaO3Df6d9jWn#U$ zH*X6p2SGPp-mWtT!OmLs!SIFJCjO0C&iXw!+`-SHud+{C?SU1SYrgg&q0EaAPzdp! z&2XH}nCXeL`I!>V=I@jwF1)|G2Pab&4d!%>ALi1d#QAtGufO^WKDWp7Avi!VLlX%= z2`6bWy-%hfyg*s$lIHXrJ)F1XaNd>3D$eF2X?Aj7J)7rsKMLOwt-QZlu(^AGy?DW2 z6PEcZ@0*Gn02`)Dub~$>p!rYe0nOon=9-nfv%~?-;eh7G?^1lQ=`%f`+6TR>t`T?g z#QEscR)Q1lGh~8A9^zPI*V2f(*x&fCIW@1fJ?=lA$B^lA9!uyNnPWIC+4T;A?HaWc$dYQ+HfNUdLDvm^G>x#@~wMg zrgIPUNO;xGxh-?$K;99I&4FAim*uGw^gw2o_WFTN0?~0TreIf=pl?C-pZi6RzJxg* zo|tqkgK|GS_}gFe4_TR>Q)+H1&WXq?j_H1msrwAiG4*~kc}$vAUr(y|Q$4Bm|47-8 z8c}et6+$N?84pou$%1a8%4hnq;g~hn($>a?%9&NMD;|6X8f$Hj<)zT^qY=!ylJq~= z1<=`+v~LW9?{>!BrzE@-zY-$FxAh2qS-Gwt_!$!XQJQPvExFi%Xn7NRhAK?;aYzSE zW^wO*eDQxVzB1+UCzZGCyVd+0JkV#%DXH{H@vSFE%5F4#z(ygwavJ}*-vuG756gIs zf+V)Jls!qu4-woMUMLs#Mku$W1hNl>$(6jZkMz3OTt((bRT~S?nB}{acb1AK+!M+` z<7R-g=(U4tz7vhXv)V|#rr)NK#-KKu8T)M&zCZ}gx(~$|>SedD;ZRt>XZP6!1TRa0 zB=YYoYn=*3oO|KBvc<`KTYBJKK2d0yOJAO~*N7Ayf5bUAxyc`|1gAe}Ca?=GeoLjT zRwH%v3p-k>CUg?g8a#?Q&H-PPL`riop#KOxJ;3L>M7-ZCk%v<*N%nm^gx-AQJS-DB ziF<{jrE3sF&S0YV%?-!s&7{I=36lr|+oL%AwttQ1;!xl* zkE5A~ox+M1^@az}pUxCKUQXP(bF#pjxBbnEWFD{pv-SpYAL>E0O&L3?VNaAmw>1x_^Q#069ru_yQ6<6eLh zQGQeKDg}x|DCbiW<0t$AK|21V^}Z(ej_T=lP>Es26yM zbRuje{ab!9o}~2nF+q4Ua39FY4n&IDpwkM?vF;{S3(?n;gk$V@v0-Tcq325algqkd zkhYKiD@kt><5irDq#K9?SEHji9l%=H#=PIo+76G}Ak44rXoc-)Z(#tk;~%HoY95@I zIqse`GbtY_+oR@6dv8tqhb_O{c7d>J;5-k#35^1VH36r@qz%Ki@^cdjSzK?q*yW3b zi>}m-k^Ea9uYfQ-AT%VQ@8**H%dGlP@yCQ|DWFp$uOq}RqPaN-ZpF^W<%J#N1SaGo z4&XB{w89NLS==V;i8PvKXsd&E&lkAbySISOV$<@v13HB4FED@ImH?fbtA!brdw2p1 z=JvV@z%v9bCYeOula*GwX`#=g`0$4w5+xcIGhAodfC;&3?>_;!l-*38kHwFrBR4rt$a|3N`{Jkol%ZFjRE&EB@6XnasvQ_f-vVwU z?JdGnah*BH4qeB#E*{9xJGa@R&0%OESDb0yVvtqdM)E49+_er~(6h3+IsW(*a01V^ z=3T($Ic8|TMn--VaDODl103DMoIXq!tgip zI&)dui?eWk>M0&$rK%EjUFFXCHyCNF$T z!mqNnqq9ot({pn4RyGtaDWWIGJb*&VU)>-T(_O>f{H83TL`uS4)DtUj_zY_SaPf(E zZydZvhPs63wm9p``Ey%B?~&zbI+@youLFCazw(*jVoso9u9~qm8JT!{fs+L|<(vvz z8qhS$?*Uo<1B>fO;FX>o&`JEn1&CL=^ix%1HIgnZIn59F<=PWmQyTrtQnUwh+O@>` z3sZdkv3oi{2e)NL_I4D1-MN+RgsZ7U(B|G*2MB%$GS9tg2ztKYJyy@R^I*JP8a((F ze?9#mcKan+*rOFb99>J~)Y8cKEEMss3!TtvY)9%|Cw_&38}Pp4=H<47F`55!C;aft zTW4hX#KlolVMD^j@8+=hIrg55@?3aM)@x>*L#|zzPTsTrHh3gh6HR4$AZ;5kbPy*W z>BIY-=o3TBr8R9r-+)gcW2h;D9fkO&1q&P-ES6YbOXY`^W#OQt`%cfnFYcEVzqn}r zJ(q49t1rEZCG@(pC*vqyQ(l?ulX~tEwHDp|9;Gq^|79 z-Bt$IAuHpWyUBrM{@1{$>--@v@ZT;zv-n7TUPL8yG*`Sda#F%^QshASA%^3d@SyA@ z9+bf`Md4q-OakC+-#Pv_ZaXPk&!jE6Xe60X+0w#FRCCp8M~#$IIF_YUEG=v)&y@Ro zR1vRiZEF*}k&Y4{R`o+e`WgcYk|UX79q%0>f~usY1i|r@vh)ymd`mEZWu)I-$t@T< zNb`t)5c`mFcVDZ1r`HK0L7-AB@SRo3T!ERhdAVUJ&BXCCP@kTq$RyJ7tR+QK9p<$W z_1RE-QYY^30A-!87vL2M8hCzU-ntvndXJV;Hl@FcH80EpmS$d3prj>vD`UY1o;oc7yhnhHP@aeZp zVm|rOeX%d*l}j$+yvh(%gnT;+e*RMKj%%11^nR0ah?f=j7 zn|M{~{CH08zn|aTXZ$zw>$->eDQdV-4XqCW#^!J2YOs+lZ@G~zygvchNYeH|U-a~! z1jMgK{?&4K z581=fucnzj`W5n*o)^BH=yaWP@6Nf8tMs0G0zPDmmuhJAf*3h5M89dKey&Fyd)oQE z?Pdog7Q{#g0{4WK3fQROZ{;sR)tML=4q^7HudkOjL)a>`QY-z{BD@F|uK>Hux4ZU1 zX&A5DTQdcV6;Hi3Jv(}~b&~TVz%+H@euz&YBI%R`aIHRJ?Ql(O*WmDTshe0y|Lo%i zGj_FQ?etZ7IVFL`k~##SK^N~3|=h}p%)FkhG60`IFZLCK@_bQkKT&m1f<=kbv` z-6ZuZky}~(Zz5Oz+7C@;YQ&b;UM(y{xY?SshC=4&0^l=Y31_qt8wK?1i|b?&=+Oiy z#e3r&{xE*#z8ma&qUGd1zAYc}52S*=diWfH{{sSVvo`q$Vp$E%nj;>bCE*VXr>vFr z`D4=)!-KZk$&1_eB215Uf`Snh-6 z;ieabue@Kh_u=BHhm^|5o0tf=umZG|!JE-qx;pcz79 znGRbud~QpF=nYr1Jg6-X-}47m3{&naYa2rP-7AM8B;SnPnAJ|AK5fOUmW0cFF%iT( z@>~+%@*E!!ZGAH;n5*Djf6aKxEbe`oGV{)$JzT)Sw6Pbkgug8Rp)M2l{`v2a>&qQH zwZeM`opvG=vjKSvgX!mn(@%^P-%qaOI+X^(rERR^j9`|8hT2~&z+krek7=)OXmO7iIPg-MGU0C z5P@TB{YBw5l7m|=CD+yR+lcdh2^pSKI5pTgyO3AZCDx03yx<6du|O1;M0rN1!M(|# z&0;Q3Oq_RhAH*SP&S!Az=V*z~oFoz9V3{6VLE--enq!i|%fuQidP<|lTzXRiH~mV+ zP`tquH?8AuyT5`1>R+)q;A3fF1poyFl7xU0HjVOsQ9RS!&I3QPMA?X$Xzs*=vYl*C ztUW_J&1TTHY^K?ZnM#%0euiw}%our9cyFu+I*0_mXstg&!FrTXy29o~vNIvHF^jsU zXjvTmjVUwyt2pfVYqqiZ*c$ycljYo@H^`M{^UDryD2p5kz${Hh)V3mzOYA<(qZ9cD zo>)LftF(BULFD9dca_t|KtP+~@Y?tRDz88ndF9q$T|_B#@g${- z=VTR%u1#lFGJgZFhHVp~*z+4Xkuo8Q^-2^;{7eCa0F6ZZvbK}5&<7zV?=734ZciSF zw)-Fql*144K!|*<9#bNZvpL*PQ6E`nsdk>->0D;7sf;dclK)PWb3V%|)d(M^dpLWJ zXAeDmo5Nmwulp)2#*&ygLF@XxbXEANS+{uabgg?lK?HI4Wca*-&n4RcjwYtp3SR1R z4vnfSJXLq!(46>6c(5h<41l_Y@OM92S~PP88^KHIpw03+*}Fh^MRMn2t51*%qJt?3 zTsphGcfen{H;Mc2$^%YBc&JO?l_o%g;R&}`=NuyB>t1Op=sH=&y>!2K)VL}$WqB!_ zQM@iDLvAa{;1~Ii@{DCHG~;i8x9d z^sXI#e>~FPi;lj-j06Jca4y)c&Ro>h)te{g>)NAt*Xg6mb#?kPnL%mf4473?c9>tr ziAsMlv%3nLc%2%hSW)n7)kk44GnX+1stZMhccp0OC&4TURZC)TY&@x4pxs}`Ecek4 z-IVvi+I8`I_7}aszj_r0M(>EByG0kr&_Ynjr~V=8{)av4{?X;A`>*ICALaMJXHA|= z`@pd%p4_q%sI51vP~^)% zvu{Qjy1>KETm3=o!K=k-Tj%5Mud6QzgvWPPw?p-sKfoi-SIhK$rvFBgQMp3C!#`Qw z2PXqFI&p0~kY8P}voLR$wckfLfna8IP}{2QZN?uc;TZ+83(QxtMh({oF~bWG`d5D6 z-PgR5H*QK7@H>)mVo% zBFBCuYTc?o(t`uv`b1&^NT+aDci(&b$-Fk1V`gCcvYt!9L9&~%jD2)PJaZ?rHtiIv zdBfQ`_sX^JQ>RXXh3}-(6;9mdpMok-XSzX?!wDAOWNx_wRdqDC1M3xrFp?1%=dN^P zJLaC8yyw1(l9Oi}3D{6a>r7L1f@}&qgdmpC$HZiPYjrN0LDS|C#Z?K7Op!-_YP}6b zr;u5-#=C#V&~b7Kd)mLk@J_bS+%r}+OUH?6>q67EBfDe`I0k$q%LYso%b~(boCmCB z+W0=YPka|7ygVeInc!~U^j+C^YY{MX?u7?hzi<1qKR-QNlz<0O0EzoVR%!Hz8*WLp zh@vPNRVaqaP=Op$CdV`HX#UT9_Z&(0?P;mWe4{WNDY0U`1bNwoh``Um;YaY`H)Q6E zcHVghCrC&P`8R6g&zdJXI`M%b>z4}^LqfUrcqL+?qs(v5JH%_am-Kt21GU#Ey@;>e z4d3h0Uy{^cJni-t@X*1e{sI~}Kak2oi2lOMLTIqKtf`Wn;0%&_4Aj@?G0Ihs@qp!} zYh<^^7Vm+VzKPpliJZ!3yXh~gZc3rIru}lEtn*`+@g4hV299y{7qNj9nYWh+F`OS0 zlBw`54C4IQ3Hr0Z>MNd`Dg5F5Sa%9Nupsn42@k4|Rr;3VXay{o=eQQ2CnT2!L*79= zPYxHGFAw}?=~fU9|MY2CIr=Ut4IiEg4?JarSKZnF8|T&I#?&ILYp`#r_)qf1C%mgch&-U|80`tGPeAnE)@1BW|AM|>S_gcIJAIhf0~ zcT&=Dl>}_2=ltJ~{XE+;PD%XvzK;9sOI#uwi5Ra|dBMBBa*ZYg7p4IIHqjRIqGU98 z%o}nA%YU(sf)!0>Rj#r@2LS5ZlD;0@mr3@o9@j&hh`9OCHQ$`uc2|peeSc8_d+5oY zMzcwaLdP;}6LD+&FZbKmb!Y=?dLhaNI4v2_#$$<DGt@bqf1P80oUuhLf{=<}8ME z&eQ3*eQbaFNbv(Gz*<4)a&MDvMe->>mdtyAMqoae<2!1Qw9r~ia?GQ z1R|UdC&vD1LZ?VcR{Rc^uiRj|@@0IPxnMtsp6L9o&047a4#z5f5W1FW&m%;k!^cmM zY20v>$NrFeL9WEV++^+IYyZgbk$Hyw_3HIM5Po4X_8WiAtH84oMJ11YTg-wP4s8@> z2sUWtzZGekd5dJNjj9>Sz3wL#Ih|{Y-yrs@mLO5IZP7u5K0Or$inuQme58*>Zr@H7+(3l%bjEVc2tdc1? zIW3cE<<7{F;H(|MEG(6A(sMM4eDc1US(LLU`l1}y>BFn_I_-EK4qlnt9q{ZPn04uw z%a5DhqxWRLt2shW8u&5S2!wGwBOgIDXl1|a`KsFQRzLn<*zeppRm360Q-@^~coA`r zL}jq_2GExw2=-Xdu|FZq5>Qw2o&4ANqV@a}yt&$!R^aC2-d8UiTKkd%*QGUelaCfS z1*8DY(4_($?F1ae4$Nm>ewGPHUV_}UFEb;*&d8m+bH8#+PSlt$bHNSvDtx(vtMG_J zZ_LD=La!Q4)wiBiB+t)Xk5}F>qhFyd8zL@A9xhk-k5qfwcZdH^>y=@zWmqo^n}Lrd zSyF-DVZSj}+X~Mq#C$)ByJN>*Jvsa zMa+*Jj&x~b_j?3mqNap4g_`7#O8z(>)u3vDg>%7%BMIiG&$bI}+9nfeD|f7)d;Jke zaeu?{V=tvqrVT;2hcF`eGw}o4@EZ zilN0`W`TaL$C}9NA{9_L1%kc0zG>~&NHa|Rk27k|mqnQ&3lj${I03>v;tuE| zo^-#v-rr}XuJ`!|{}0z2P=d()g!TA;wcZ4O(B7`Nm4DBb_*hx~V4#2^{K47x?am*x zyrBHS+z0+|^9ScZ)y$MFa_k9WZO_kz&&2!(UZy8Dz`WAj4#g+z2l)?#$GG=3`p8f1 zqd-VCbw|EP-Jz**>YTa1C4QD?>Nnft`g1wxFk_4L8&{(cF1Iv!KN!=)v&S z6u;Me(6Ys&50&+>A0w9Vt25#O|`eJoHl+pW`E2;4`xrEbP}DWk@`OHB%AW+R5H+_z~D8$>YsBeqzEF)VA)==7)=oiEh**hL^LLAPG;ZpEtvY z3U>8ZKf`I60vSp~@I|KcGyExnfV?Xw+enPduSl;}IX@-4<$Y^tF8Qny4OP}Vpk3UQTjW?LdA1AMgD@U|PLXmB2 zdza#Q_@iY{rSc26O!M*!yxbA(y#7<|d=o9D-_dA<;*aaR=wV*QExX7?xm zVx>N}m>kim*uD9kUUYA2lY8^IT&ze(df}kleISz_C)Ii%+#?KbK;t1>8_j+0a~8ek zCp)=2S0oorKF=P=O|ssO5qG^`KAF1S@ZBlv-C$O8uVp;v-IP00mX1k!kdInx$*K_ur?t0p_TF+b2R_n>!<9fjLgAGmDorNMy?O%ew z`*<99>&_@cMZg!lCb-oUGa=sowBTbrU^IJI1MEi_I6;2SgbN&-0} zox{WALZ24M+ZGZ(W{*`-?Ib6aMn-m3OhBTs0zs=QGR>~LWHZD#EXpna8fLF53-T*( zvLZ(8&N=8%6ZSbUtAo#T6Ie>4dz7Rck|XzAk@-_U+P=J)8@lgc-}ndrExi)^i$x;e z@1tH!^l#3g^TZkcM|u^zSdnEV*CUB<68Ti%jF4DQFlYUZVA{wyyG0ryUe89!lx3qn zi^zz$4XCbjeUnUzP1<0t0XIu_^K^);=zD~Puuo~&dGRm>e2FM3{(24iCCFP!qs0CG z6MBjk%>q|f|9BjS0CX};-WPw=<>%mCB;guR=dZaCqor6Ct4rh$H*XMe z9C`dU>W@Dq)0ge@Ir?f{PYS&e$d$XnK4&tAABIX0>kVDy9kj`J%BB)r$_6bo_cXc? z;~4)5%82cY*z8e%Dm{u_{DBa^N+z8=Pm(Qv?mDg5F!>whK{TMbDEy;>xcdqfl6z8K zP3*ttbtG#U7nqp;{07rgX2=zA?4Qb?h)F4uyY3*-v92;d|HbN9L+gb}D>Lzz zJ%{UozfW|0XQQ~DhXuknWfr17cV^K?XK}gWRk?=D;uVA*odvJ4d1v9QHq_^aQRx4NkZIVHOn4Xn54Ft27+b+yjk<@CwPeZ(I~N ziujndlR2hFvrvE_(l+kA6JtBNUT#J-WAt+Po7WvYo%>~X>`rShwi|Kn+6*7gnX;Pd z69s(aKJAMI@gxR^ZmAsQ`gVarx_U3oQf&2VzrkBMlF@4ri_mm68+2PT0u*@iZB#!@ zvCRtf#xGkKNs}yGmB=&l1l8gd)$XS)uq%sA+IVlCk&$nS45nmq0)7sfXQc7wR(VFw z&_>Ee52leQ_k>C`nVJ?&D{Kn~R&Iq1wC;k61zeojN+x?WhA#dKL`2mK~muI~- zSu{$?FLJ}(nqQ>ruUq&y<-Y5iW3>XlAmY`f%3kosx685=0A()SC%)E-hQ=ovN~>=< zC_$QM!9(DE>VE6e`<0&i6+4Q7Jio21JlJH(`0^CpLPuyl(G^-B5Y3>D^i7+@NQF9* z=ObBLmt=?jUfO?bRt4m>ARFC9t-A>cJM6IdO8U{-%mrVH17+=YDO{LYnzuRhe(J)YtOQUHrJJ%F zMVw>G`a7mJiQSE4VBY$<6+IPa!jSX+6tKQcV^bvL1R`hJGYN@0NxcuY4bt;E^W*Qf zK`K1Etj?$A+$Xz$Xx7N}2rn`3(AtR$RXCLWeoIpuM?24MiyI@>A7AW?apL*owZ{}* zR64S`u$-4&k2xB94y6Ax(E4WcAYco!wxYS>42ymQq9Q(i7rK|l*@^%J0nEOCB zq8|}%&OG~Fa%aDVU?iSsN!2Gv9Q;p5doeoNK2su?5th(ep00N-PmwO7b2#78IpD&Q zw_sehSnS|v&uPcWh!;kE@oLdKnj>TakusFaUXJKk;fQ#fN|R-|_=0#h^cC@!-1S(E zL42C|HNGVgPb7*>abMlje3jqWeZFB_H`RHh)LDT}`6hSD_i+#@Q@-ijJxy6t`?^zB z__OvN7$=Ko6d7Y*yVn%{m-CH*2^|g2jk22>&dR+2eR%eFYas8Fak#zZ{)n@aZnFSb zadL|nd?Ve!o2G2BGv8lyi*>$e9a8pJ^h4)nvA_5H_}}esUaR>^ZtO_r*2R^f3mu;v zLiY1Mxk)CQ|0k2}yvNBp@L(tF!b5=h;cqj`-CwKEir;0vk9p=R@x{%~rBPk0ddix| zig&dnY-z-5H<}%|LxGNCxyUlVtb zw@bWV&NL_NWXr?&Sk!|BL*KAoo*yB?kaj2AcH)GTbUAPm3na0xN8fJwOJ1k}8`%Yz zCa@P%M#eSI+{2%!7_zy%D228bURo61q+)Gs`yXEVDI)MTE*l@kKV_YY-*IrQa~SwN z`T#U>MSYT$TD8Rz4u%JSzot_Dh@4>pP$~g6bAAyvda~1<8mAzk%__AFh-$NfhXtxC z8hrlh+vHn|43_OB{WW4tU2P8jO1|{sfLqw0?1b)s_cK)gB@f`p@ILeP*~V*RznLn3dp&Es$7AAj{{%oToQ+VA{V&Y+WwOs)n!zRLCQ+q{$V zIDzj7)%HjNX^xobI_7Avyv!@BQ$(AP&FY- z;wvK)GW%{d@BQvi`jC){0)J?BBk;b41Sq3sB0HtY;VqMyNd4JajOk19uZZNnwZF(p z_*V?HB0|aP3|~xmS&^sA#G`Ztnlv#G$#}FF{yCak{)(&8SpF5-x+KJ>(7&DC9QrqE zte5_Q*JEgVwf_Wvl89LVg7GrUY(=FQx?4bmrhcK*`MZK?Y%MrFD|9Bn*;P`}6rc~f zFx4leLO{>5s|kJDd*7oPH(y+Tpv0NTdoY*@9P@xcaD%Ns@-rerFm)6Vx4APXc#J^0 z&E+Vnli>}T$WZ})=a=n#@u|u6t9wQ)$m-0Y>%92Ou1{Sq)GfaC`W)rQ31**V8p1-3 zKy^tG1%u;{c^vC$?SCo`ndYb+ep${(4%o~DW5gGkC)TEnPxh^vmPw}yaP!g&x&cWy zT@_CY?W5{x}LQR5BQ!}W0fXl&m zRol}-xUc;Zi1YGL1yJOAebcg>^I&4l;D%R@(WAEBrD%nc#EaxDI_)$2wF%6O8 zzrK?>i{(h9e<8Q|Ft0n!0lDzLi4SRqG z<-^Q=l|Y%=>j&;?w( zM3Su7{gCn087f9z7{{L)_}lJ2!2tZhFosCIM;^Y(OaF&_aDR6Hw%_$<_pg?9Gby=$ zAq$Ih} z_~1rB7QPQ2rIWlNgArg!s7LG}W|)9qL0rhM{^}}9Q}bG&G}fdR;oqZ7Y=$a<>XNm?T7FbE`GXj z>taIq!UdY&Wyg>JUr0-FZ@4xQ!7_KZmM%UxzT;s z$sPg+b67ZTprpU>*DRJICh=G;_?Fv-#?VQ1?yr`7Lo6DV9IYconcO{cNI3l0#iCPb zF*WZiWgp5-p+`8DO(bAzV^(ZH#7Nh^g^Mxo@!P)o=dZbhO)l#{D$5@gx+$;!IXM?A z`N?k^|NX0SYBMFHgp9Pw%tDZePxtIE-(5jh4!nRn<|xGxEPc5ufEPLhlV!z@(w0TC zpy73q;-{IbXic*y7MA|;X+mxm#y?H;FUs+*NU<{erjL=D{;iNNaKpJy$co9MZmtw{ zc~_*UOTI$Amf)XV`UqW0iQKXN)xSWh3~MvyGxTD(d*`rpJX7G1iecAU`xCc(nWC$7 z`8B04YM)izaI1LY?pqKz67xxw-)uZFE0=g!vEPaPSV(kN*^NFgvMb6Wh!R^;(BY3T zESI2kjSvP!e{ZW@Q~c$3clk5^(DClz zCO8y1Qw+nhUp%ejul^e_E?ku4bJAEIc||c=zS_*%CJ;n!BPvwbNRfH`H4n<=NXR|4 zt^1X{((<{;v+NzBsHCuw+)ZE&A$(|i{MARw@5sQc@JjL=9-a*^xP|tpCdgx<^eK&J z59iBkLk=}kqp5I76)3FQ$SQ1iStLT_dpfQ9F)i3p#9a~*jYO&^zH5z;E8ZzIcg+5G zOYCHhOXRWK@MMljR0|y0M+igQU)Vr-=VxCBtj7y3S5+8h+H>V&o8?gUIhtGI`9A9T zUJ}@fo07kJ5ilORlmBBpbVk8q|Y2F%t z&G-DM6%8n>^~Ilc@D%w^o&Iig`ulw;{Y|B@@vr(*csEa>Yf{uQTmV*Lm{CzD>bp5jxka zqE75v-#;*?!A9rxx92dw9#21VI8@61%DBD{W!xpP5CgdDRer{tlAh&D=`(>J1Ye23 zmX3M=1ecN1kHd~!Ok6=$uzhUO)A$SM{fxDptoin}z11V{>rhKQ2iNc48_k+>J_-E= z6TRa_2%A_xE>$gWb_gvk>N7GfgiaJgktC%hzl#9fZQrxEUb~;QV`*EmW!7b3LW*RZ zajI%vPI$uAx|A>5DW_w;eI19AXzs=tVic3y1$Uh&>+6SF|3sQ3^^Ypg?ymgbJzwE9 z-6S7iqmY|y_8G)28i;i3;=rt(ms*QH6B*V6p8}eq*hrxY;6q{lZH@%&n~mmDLi*)9 zboGdu9!_PApu}$_W5rwQ5LquiU3rQJqPZ6}$}W+5JA7r6c?-rOby|lD!gF`gfv2!U zIy}yICQN&z?t4Gw@_FnbqMJDH3%ZKtuR2sP0P#L1MV*$A;rApjbKdx$?MDZKBBJ^C zIeqkA-?|S+T(1@|R(&n4ucUSCmkoZ`|HIxtm;ww!?e4|HDFIHcb`+Oi&W!)zx8krY zr8b{uh)-9bM#d|~>VYstniuio6HgjIu61&B(Tur*D(Au3jD1daxpCf-4vI%JZp0OO zCwgw}(fah%o42>1!w_SLU61LH@Exxcu zUs7NAE_|#ne%ZiC(Z+4aIjpNReBDyHBru5Pb=;f^flT0t_{uW0vK?(Bt=)hIO=?;v zf&JK)FXf$`Hblxyy5juEZ5w|PRw|S)ejWQQISD}OpB4&B-=V?M?|GV3)J0rhF14wsxKgDL#KM{)1Xbs@vx%^*hvK#WZ?{PirgtcMDu@e2Xz&9^$ z53%3|@qKSJCw~RWlROJfzkkxtV{SiWmC<`@;-; zP7sm8963{U8d_2g);mP7UNm>Wqb`2TUF7gxsneJ=GIbhvW3INB#dN%b4I0nxx%i_o zDcy*$a<=L61>8idaQH3!x*W-X3ksrAi{0NSn`d~{-WxpX%pwM2G6Vfih-oOH%d?W$& z!F?o2dZQ7w3VV^|n$zIlDkrq@g&NGiyLR%$mwEX)mw;GBVk;^FT{a7D6Kr3+nrw8z z>p-#sLhG$=F{?`Z zkI1TMC*T(Unt9;|vzpPGY!lB3hxV1zb&0q6X?Y5ZoS@h4dyMKle8fw=QUMIA=sd9^ zateU`E)6in$-_VLthC58&Wk^rOs@|(IH0XMi_+3wMks&HAbEL3eBX%bSu6ajpoiL!DVs<=)_5twA(*?m_-F zCjzt8C0V|hJYeh6DS2mRGQDV`AaewpqU{s-!R!Cs$E#4|?93OWPmujPj}s9`ub*)? zI%NZot9)&G+^S$YCs1FY7Lb@c50VsNTr^6m;b?~Y4qf8DdH%3+~}kq z^wP}*-J34=OP~0EP3OPDr;DCvjwG+m=7FsxPv`JwUz2`K*81sCSFgA_$FMKUUXk-4caH2M{1 z{J}bYqY4nqoP74@%a|);ONR-XPV&c!Gyg|;dG_$#;bpIN3NLZ`WW)ZC;ic{ONqE^H z-Wlwn{{jB{zX2~@_I2SUDDH!Q0xzGSGW&l9FF$SkFX3g@@fKd5y6As~m-~>yQ{bh| zCBVyZOa2qQ#7UCS3SI{3+#Go6?Tml8j-LuIJ!MSZKlsaT@Itaq^`GA|*xb2I4oj4z z=~zb`(Kv*tWA`crm$~@V3=4 zCC$Z(b9wfZ7g%0mXW)tHqPVUsa)P{>Hy&>oid`bVyvnslihBrG- zNJ9av>cTYecw)WmMAsB+lymMSQ9Ik1P=r?c1@U_fe-XP8;;;Nq->tEKY;owXp08^h zhUw-_tUd5{>u-{SEM6TyJxL!cimYsrzPdCzBDr9ahrrLQ4PJzIwJHwN%+U-6B4Trt zm3v1C)?P}P>Qec*jDP&7XvO2Cau6%F%(}}j^go6(98ySf*+3cDm z@*)S{D?dg4!>cRf=bpCih>=p)ABf#SaEcj~O+rfXkp2TXm(7fJUi1sajpMYHzVb!c zFU(V5{7Cj^kyGU~Uq{$4Rj=kz)$Ka{3U!Y2VQzc*qKz%a%Qf10)T`Qj^yQTQc&#?q z^8K&U@{6Q=rKkMBdM*F<2+HSq%8w_;pJD5y{7Fyw%^+UNhxelVPFv2X=kb%$sI-3C z&R<6z6V%q17gBzyZS5{OI#H|clBz;mC7T4>M^BwUW<$&|?zpN~>pbv%$_`BJJMbbGdx8CsKi!&BFXN+Gsr`L} zT7ZuZld4*$%9-u2&uf)mszSC(mw$^0R?%Faln+n+WW`La`fWH>XQfsxd{?XD!>Brn zDkfexilRt==`{Dk)9kGGbq8YJ6xWth46pnSoAm3|$%9`kpGI@5S*!WdQ@)Fal!s-M z`JVC`TRuk0pLfgc5a&wSKT^w%l0A$b;h)E_x7sQf(69MiM>trPczJ5o42k08yQ zY0y=vOT)iW)-Ip2Q^$=+%~ zrgPc?9rgFq`Q&p?`BiUf`Okc2-le=W+WEbH++?nZT%uBZHKLu@vSH?*TD#v2ARt-0 zg4!kPsGXv<8Sm4NJLKJLKq+$XD9>osPvV|2>>zl&X9Puj?6O-_|_Y8Sk&RVT>07pGQzK~H?uQL0`@ z?Qo*K89k(Gnyu1XKKMQTX8>IX}Tkf1$=cyLVFPC-PmRc3HxBq;p`m0mr zZ2#>LaXPFL+I3E9mA)?)&8?KLdZ$+X^pSpbu6&i1T6L(c+MLHN{P&d>3Y@Y2jt2!} zrT6BmuTraeSW=cF>pDM`tcfG}f zK$w7x`@R?$YvmtUqPvduooZ%1-nQ7*q#rB&2+5b1+wvyLDGZB+ z>{RzS}+;rH<0^Rw&rS~L$%2~#Qr)i7*e6sXN ze!FA~!BGpKHs(5QkU>o%W#I}iegLh zr}oCd)E#K+9@IMV*^A~D$Txo|X3n2%ztIgIB<EjY<0BrrXO{8rX0kl_u0BmZr!INv@UcJb>nT_w(p!}?G0zl6dUERhS|DrsB;f% zX-um(O1G!m>UXIYxO1@dV`2(C)K)#2T6K>FphXyXOp9Xb{7QG++2ge1BYX1o54P@a zZr$d~wC=Sb)YaR%fLpisWUb5VLES7{cdT3Ywum+`cv3gb)@4!WuI18OwEF1_sUB;q zfBiNI?(O?hKGc?f=_wDC>aMS-WEFX~dY-K&f3U@b{ba<0ZQbK;-HVpb%9B;3*}B`^ zx+g>v70n$cb?X#)=Z~V!z3nIdU8@7q?Gjr(fNI%wi^X!s>iTWfv8h$-`tVh)RH=>B zei6yvi&k(68`uPM6SeRdF0lak%{PcR!=yNRaC|Te20$bED=AITjC}W_^=_B1%11}a zNRj;K_*?JEvzDg+A-lYft&6yI-EG~JZq#j5jGcc2b?yN@Ql-m&zB|<)+v-7{>US(& z2}|`HTisWxEg*Kzx77FvW^eAX)g9b{UmmVKKOl7>TetOVCjStb9XW^5$I6OTssH8( z*|er_L-Y6 z+Y5NAr}p&Is2C7zZZWqn=dX7^K7jc?f~KwNEQ0nQ=OqsF{O1|S*WG9`dj%ESzavq| z=OS*-IfVXZJ-;vT^%VWRd_Uv<>(@4-uVTo9og{jB((v`}oX_Z+G#T(u-+#hb-&2-}m>KvL~q+GoAhx z9>loUU&LR_y7BGPe`Q%G)UxQW(pc8NyKZeUzEOX)m^k|~JXXGUH*0@L?AH(HGT3Pu4sdwD+UVvRrNsuHI=sJgUTrz#Qlh0PX4{QLy<&N z^5qZ6M!V9LBzeA+boq`wPu@+%EWrQJRkdm&`!!b>3WoQ!w1^%a5Aq+gc%|!1Tj)D8 zAVYifCpg|`jXy(eu;Jh5id7}>>6+#Roomv3p~1S`<^}tZ{3mqIlr>FKi;X(at?mf> zcU`vFo3vSAN=q6m3m$TFc7UE_8uPTfs_%CMru^Q9I>(WX5VRKA1g+MFT4C)8_*P~6 z-zd0n>uN@+YU)$)kQo=A-_6JQp*x`ES^OBz z#LxT0|aH{=H2F6*Z+x=ALU~ySDssntuWli5;`9gU8+_>z5b{scsoTVp9ze-`1HWY@%;jA z$M=yCq=R0;0622+=|po+IvbnigyTo~uV2mcYXkd@@{e8EG|GQN!zlkBpN#TvU%J_! z^#Sj-4eV!@ytt*M-q)V#h%!1*Unl5znVbiKN&RHM&?>8%TE}-n}Pd>QYf;^_8(ZHthrU(t3CQ%~LOJA^*kn*7MbR zHh^`dJ-J&8_x;P_aJ_g=t&jjDH_MV}$nht-9ydF4XddUahWr!0IW#^pmq6`iC}4*Zg!ZeQ8Q67pSr9sj(R_FLFZ{>Gbt z^_d}eaYYb+qS1gLNn&)*wk}Ew4k-C#XK8pOHe|0sV|+rX9SEP5SyI19;6J`f;9p)C zmniU-^w3Fx@Wjmc_quOl7^%BEgMD2jh5_&ZcB9$y77JmW7zkYYVg~Lb*)ybvZRtpq zp|?xrX}jX47+hzI`Syi9=*uO@Dmp$>ZPKxcClD%?yb}sv`WCC>EF4}zglsli{!CN5 zsS87$on1L$P)jhYG;c&^XrE+C=l62}Z*%DjDdC-Z9_ssw&5q#a3E8n9k7K}ueM1e> zp7*3=eBRK29&G24C;tr@6W8}(@wbqnR=8Sd$p-L8;UN9H*Y8#Hht7|+-5i)jveIlW zc~>nDkIm-k7D2K)emO|>wL5zI-V?ehH>Vj!MEdS2eMbiI;aT>>`m?grY2!bjji#t^ z?q>=^}c<+k56eolkT|=i6S)9TX(yKQGbsSc*OKk5OSRrOeL%_K?nh`Pn-E zA}ROI|0Gsx=iiH}#Qd25F6Mt+VvzRKww^x@-sD7+uvd#|>mRk4*2O=O^Re?u9ul{~ z-=B6+v4uAXrGVLp-4S$3{V#t~5Bx*b-2P+T9^npq_m_Hz;HgmXKe`J*Z;!n}1}>U7 z@Y?G8hZrX1dyDflQa4(Tky@;$Oc>8H&4&f%QsZq;0j*2(I*7_Dn*U%25q}l{DpySr zE~MD#+bwQHxp#ijzjDLs3f8sRj`VU?%T))0^MAjji*xi}Vq^uRO*dlC?b$!po{dRjo237VP)2-DaW{2v zf2O&|j?~j+G7~$Tc$W_2(Yo+_+ue7)WKxahlo!O3pMUB&xdr5xkZrl_^(`%NeQ(NL zAN}KhURfG_W-PdPuq23DBpyK@u;M8{t!DPE{FnmK8ucoqO#^@T<11;u8pojp{BOCx zm*xob_ljlw&^wg2w@XeG{| zf#~aFC~}-AYh-eaCXM3<$#Y5V10%N+7qN@A)XPr<1>tHa}`< zy|C}3r&|*G0SBrY>wfvJ%v%ZC6>`ffY9W?W&0t?g2CkT4&b5EcF@^SzI@6Coa2B=p zx{3Bsb1=`FMxIYhby5lhrYw?;v&Sp(SJyPtZ@8wwE<*nk{zpL8!b4gG^!uY`^fXWX zs+*M)dMUON9{{uPsVz2MM&tfD(^tOl>`TIjBHQTXY_3M88Lcy&*vDLE|0po!_K!iP zRQ`YiRXWCdSBn1xd)xTWu=uTqw+M4N!F$+C0hsUK#K_z1+reD@HJvyc{ImSk&m$@n zs#E%#{8bV;JxBbZZJt0LY%7jd;EVpQ94W0RU#R<~aKkppxyJi~r%EGw#uD~&%R9m~ zyep7pcFmQ{$jzp>g|cwbx0Queo6>GNv1DXpSv2@fW(nTX+sS-RPtsgDoYx6ZOc z*PP8Dww?(}G28O+V@Md``uK&4&%o6OjP34Ij|D2DkL`4GY1{kX5}MNznkmS-e5%t& zX{2mMX{2~M@tL^8g(^+J_Ba$bX|}q$zf5{A+a~`C0%_a)Q}@z!6rG8D;dv_7U(-d) zuT0IcRw>^(W62oq;EePgghJ;2Kmy+;=2Sdg+R2P$qO^U*wvCOJJxK6FiS}hP`qm{^ z;e0d6`R1hLz5$<_;>Y246Y~mHvR&sn?b{~X+kKW<$b6W`F;1ICZiV;{dZKwl-2+kY z;$!DMyp=?HX7p?5Om3gSTFDRFMupU=1+FN%{eBfvm)r8!t_MY`h`NSyS3a@cxMkr* z4o@>C5Pn_JP`JD@5RMA$wYn{3;@;WJaTG_6E()6?L^=r<-}T;Uau(d)ArMJ*p_P09 z#6Xlr$EKC^YK#=$CBpk*QV5IfpC)0CgjM*f<$W}Yj^W8QE!qlx6Y5b>`&MrXP|6$M z^ervKALiFG0(!qj^UwWu@Bpz!7Nr-5kIgBjqp+mBN8%~0YWX8Hwv1=Ot3{JgSb4^A z{+jRfuSsb>f6b@-Y5h(jx;{>zvN&vn&ku;P!@KYPnrrD45;SHvc}rw89lP*-Hi^&P zwfpu}-#RA2ZMp9{xTLK&?`)B&)L^V?>AN)^Nx-A}?$hkkHfXO{Qt1aa9Mo|7_#UOZ z^)FFhQnd+@qR|}fw5gTVO!-K*J~o&37QZ%|sr&ALMEj>smwNoAL~v|Zl()@a-Jan= z1fzFu=UOa@rSa2&(;|Wd22m_RU%mF_(DQI3c^XYFTQ89;r)w4Xq`vqrdS|15j%8Ao zSWj{TSk&liyTfx7PQkjo34ewVxI%JN$~@h6(cGJ8gkGE5(Le)yqpqQec?}#P?NkFK zYPn#3cze~F^r~%b?Yoiaa(>P3PB5~+=3XX(e2hW?-1lW$06&^>#c%w_qbEcEZWUAFu*`R*So)E+ySiUx zG-H@&0(~fVMi#sq&FEnpZgLxT&X*R^jQP^uPLXv=|Bj}sHyjT; zG7stJV~Uu_v_#XlZPTg0c=~s`?nC<*wY|S)7^k23=63tdw5N?v*^WScm0T+MSD3e`$Y0u26n;vs5wT6?9?@Hc ztETc3RNz&;h&~`(w$!|zjZP&}wlqGCVeEM3>kDPDdh--6&a~6@Bz!p|xmy-t(Rl84 zx$OA2c9n-AvivpoFvive={(J6la%IRuvkD#!A`fjjZdaAZ3giLstRow%&7VxJ=_s2 z<;u&IE3(2J<4Ep~{yWmPx#4-DYkeVXMHz3{6YyW<5`~X=dw}xCZTWJXl*XngWbdy0D*P$yRmRjxU!{@b z&RQtvz0q{Px(gBh?pug%687|O_n{VDg2cF(i@2H`G5E&9mldNno9`an(h>pXr3bt8 zU0JoQJeV~s+|VlD@5Djo!DlD>Q`P`7dGWH|-X5 z@Wt0Tbiz%QjV&iYI{qtC|o`V ze>OIzD17B>ylfQA2}H(aUe(^T@eO11R+$TYHMQQ7cdaVg-NmxsQr$!=z%)(3Oo1SS) zKiQVIWU}AkXk2^|i0DY1m}GTG`@_6_Kc<2NR!p>Z@d=L2X4@qa=331Emc*`?4NpRN zZMl=Kcb(`o;OyG?z)^o>2Q$pQhagNwGkVWG);F(*E~#Rh*b%cYGe+SvYk(#Ed1KSdks-2a3<(4tHN=s=kV z#^yhi<*RM2k5zoR>WT!uwD(VA1K8k5&+zK1rgRhnp^U8y(?W%4Y7Qn%(`4*t2UmWa zRTw@vv}oF<=`ncaX)(pK=E;#)K?w9UIGnh(|Hc0Aqx!tl1Y#8xJF z5wsh9Y%DAxoG)6MN|-jUC_?xH+U7!G=Wy(=k0)RIt9h$X>aEkqe>0yq8QSu!_}eCM)9C`sx+JQtoPTvD??3LBui3cDDWPruaR-(pEJRdst;R| z@q1?2U0Yk?ZzSlsa0Ex+tab@aGh|cWBrl+8PbKI)CfpnF=2>;{5Lt2XqvUGi_XXzQD+O66W$S1G#^} zluJvaIZ%~@hY}>|;uF%fX+GXydm*s(=F$g5G14gME9M{4(N~tYA@q$XT7nlz1PMNs z=Cq3l$A{B$2$E+NK013D8rPi$9wn|eYk+J_J>^M}8VT5Aj)$FY(M z{Va(b5`T?#yq(T`<1aY+qe#YU^8^XFZ+g)GQB3@)_2OkvNlWKFIfSzw*&2ROE$z7< zWJTQIq`fsGW*rF4ZgS4r!n@vI333>WFPIbLg9<^?&yuqEwwytIm+8Kn&D#*&7S`0= zQf@M9U8>$oXnGECcm{q@g>W(_^SEqy2s{o9jpAw-uWMiCrN@=fKOx-@62>8a9<-c@ zXyIrx`+mKW){ujs}k_4 z>-FXu6q+u1M!J?pt{* zz^6+yvbBfn{nfK*CGx~C{+6=vn}`S?jhixy!?QJ_mr;1cL-cqROYL;dpP*5}6-!IP zcg&=}F$v}mX2kjt@=I1Lr z`3mdPbEu^D{Tb36uDbI)p`>ytc3z!qAQ0~m=)%jL_k;?!4(NySI&&nA=3#1~o+n)@)Kl^ZWn^!1<%Kga?Wi2N)!bKP<;Y>3cVV1o zSBXO3Xeyl2VoDSCCb?sx;ij+disBD5#gh`3Rd^K9kh}L)+&&6?rY$Yv->AH!-|B~l zntkO%un~!KS7?Lyw-$d|d_mr#*Y|)gFWH>LmwR(6vix{=#g~^# zd%>3uvJ|@3=UEi;lI<Wz}>!eUuR zez>U6=6?Nm0>KXQ@(?0HEc(n!5W$?1NEzt2oI&b91mri)F?)YYB`Qbe;;*@riJOdn zb^tPm7Aie%-j0iEDOF@v{E;_aDLV(#EdZ#!4H2k=OxdF5D zk@c4a$6zBx5%pI$Ke1e2(;sCj$@_T?w8Wer-h!26XBwQKIEGyxZWF)WxpzFn08u@| z97~g`e(lMf5b8_DI!=6CrqzK)`kPINpZEij6lE|VJg#eGVkgrhDw@efz|MrXId*35 z5Pl{kQ9p_hsGnOrH85){}28rHQkiKD(`_r?Z~O zVD8npY+25+Y_hW)lE-?NWAE3WtOwVXY5}qodC55+q{-1ow}N-n*8XbYKO^I_L@zDO zGOx;UlxLdXKe1QAU$cqQLJ~=mamruaO$k&f*~AHWM@Y8j%7h#}3Xm_nipwI>b#p8* z|93~G{vho)D^LGg#cnAi3^2uaY-vH$V9jM#Ul5-t@a)1t4h?pL1EGRMz?coV?gIz? zy>RgAq{PN49C+_l=sLi{72N;FeOxN?yyM!8P_IkP-?kd^;0pCTGH3RFnTzX6^ffng ze@yW2;!$@!6O6xVn)%_tHAo~czj@BFzF;wbtmhB)v<#lguLdbTk3VM1AGv}4`HxGz zT$^AQLE?&oJDaH!GQ?3%;o0?bG=sIUb}rkE?`gtbH5b0Z`#S;OdRxu6AKSAH9xfLP zfXudNj-3PqPciSV+8<)9IW|M6OU{Nj5;pl+?mzfsIMLOytKaeZFM>}%LG7e6=BvW7 z_v`T%xmXkoei^=S7|2}eXZ-GYkJWSE0K6>a{QMlS3K$G|*3WnZZyYR|1$o^pbhCQ+ z?DtzIsOtvdd`=vO?jxFe)VtlRno20f#$1wHMMBy7V$f}(3xX|~s<=6t+mo0h8iDMe zJI6Yw@Jpds{A+H*3}BrKo~IKw+uo-@)ee}mXW3N#>g2B$le$RO=U497*T$&_A{m?3 zDZ!2nS1zHFCNhwzz2pGBJ}~X~%xgy>!+@}~u82W2Wsw6X^s;P??WGI7c*g%BwJ2^C zt8KAXO|ac?$nB4FS@Ec(?au3rfp`u*~!?zf~hXWt|= zaeFp2(cU!q1OE8P>mK49C5{Nv*h}rWgsIge-s6?e9px1=o9_8vxnuapxa0qL-0>7l zWo9o_lRdbjt@I0b^I4nX4cb=!H~whvd-y-#kD-P=_+x3b1Aip#VO~e%sBS&b zw-(RGrPmy%Ql|d=>|GYpm?7Vb8bno42usX1Du&^{(gXd69e1AovG3k@@AN?bC98Tj ze7YsJvU8%Uw|PS9NAiURo@1GxsP}}>Uf5c7mHo4|YO?r|>u1&v#%RjEJ9;ren61`3 zWc?Wy3ZV0kgKNkjCrgRvneKYk)=Vq$l+bYYP? zN(~uSMkdePeL(U=(E+@r9CxZ_{XZdcr~|r{yO4+G(1FVSsael3(k!|<%_4BulEAZ7 zrLpzjcU{$_5cd3F;jV0mvzVI0r|)U+5}S^B5aCtuph<l(t!#QcTktfCkHFr= z{w=(^XF;xtOpgt{3w)DtcVU2c-yApO1rx8hTY-zBpR2Br&g@Wfr+P-;4<^sEyHOcz zuDkroYbX4+?Al;Or|6Wrcgs@St)*GkJG#{*@qk0 zP?~vL@n^Ite+5rqu<(5#VxFK0ZsO#Wv&&mE_skB)rcErsqK9AaeBZMh!fMstK7IOc zgLON@6`Sh!wv}ObCaTVMieM148lwj|R&*3k~8&3W-v}3tw zQRFZ#^(c&-B!trzp{Ypxue`uJ@35M@yXdp$857JZmn+9iDOTJ&@_xu&bM(tKBAO(A zBq?=|i4?sh&^T9+PV9|Au$|i>&|8+8ZnH`-S6>c^NmUiv66$3{V;m8#Fw>6@rK=w|d=OcJ|WDI^j*NicRXOC@dxBxg&ZZKx`xbH5NxYlbgC=GV`4$%h+sa^)m zcyXG2!Mz2e?TayMGLPo5Z$F+elxX)VMGK8_*b^QzzdCuzRr$nYrP%o{Ov$CFea;9j z`~Zi|-tUXKxSDSVNymt8-epaw%xQtGtGSGp@_K*xrEJo=i8|1DD6VP<4_ClJJI5?Q zN$C&0c}3FuxaM#YeZIA(MT94mn%*1#9Z_f1RL}V5Ml0Xr#jxU3ZQ}Y1Ly7SdYZ8}S z6-o@B>_neC16ZkBZ*Jgg{YTrJ=+l?rJKpJm{^Q*|{&C-(@4nLm{pYzX^rt9wwsIpk zoLC@uR*F1-RbmGr0Omie-(Thk;u6?0$bPf==sf@>dwk=5`d-z~T;;PUu?o9zTApa( zw8i{`4)D)gIIYBMhyJyI3%LS~3c!Q`%&$&RdnVdqp6G`|fgr#&2u{{7#N})Y38sR! zLpi?F8VIF~KEd$p#K+VtYpsz*zaX=~(X%|@!!&oV{2}<$Q*GZ3`bwL-@*QgtkDtin zaOzr^UZ;XGoFsAF)&z$#tjwb9cHYj)_&xMJ^_`pg)|2FCaa*k=?63atFf?a!Yu|XA zTf6RjvPDz<>Gxlo{*N91s?v0?99;@yX6&G+r-q#R5%l_O%BH8k<^#^e@p@3D2j}sj z`8HySsN?^R|Kuf*C|fe|nRyoyX_+8~ot(6ii+AVTBoCXi=7a)-%byU=Q_*(qvHe>X z%GzU!Z@@N25%{CopTwH2)q$suIg6HwrPUSduldSKCRuuA)?O<^TGv41@vJ(k63!bh|A8f!?5 zR#e6|7e-D7CBMBwv*hUGeo}z@x7RbLrCR^n2u{5S9+-AyvZ!q}u%`~{H04U=H&+Qp0>T1p z2bRwJ>lfWjcEL3o{;}eI2PH@MzMHLQ?1*^ecaJph-eUIQ7gbjIPhC1A@7cN@SJh2)`I!d-QVjR%WdP&wnY zVb!C57k#gC#Hp@HN-;F0l8qn)@%-)_o#|lqH?WG&7c! zXkKfq6eA9v!>7bL+MA2{F7vV(e>JFy|9q@vinidYt*< zx7KWpwOTQxo6Pf^-0H;oaB>0$f!Q3*Oqz3uL$ zOQr&Xk6M{~Y|rtvlb-~opGSJ?&~+X}-Fz*TO8&-uTeP{CLT=E_@o`ZKQQ%f{}fY&O5`c6VJAM_vH!@r#& zva#WFE+NUMu>O7<%6h>(&;VnTCl*BTGflow96K;B{q0Iy?8Ads=9^v2jsTjCdhFt{ ztTEob&-Pbm`-A@`ZtqQyJ(L_DMe z=N{7~!hFJieKD17b{`}^&xQ`fhYs&kfVEjWxUTq?%KN=4ty+z0XKq>`Hu8G%w|$CX zsgW1bSMybtKPxW8JVt>{q*`uQjTBWUwq=?SMn=#o51!%&lo0+7;zP6{BKszD8x*<{ zji7gM$5Lxu*$>6G(1rma-HI5FTRQug_V({FkE)gT=)dikH7Gj#Ifb4v659PbMt!1n zd8Iu3{j&IG(6h3@*o%*XbycO-TMOqb@(M&yUm~$eK?V)%Ko&o8_5X+F>jZEf1&g)O zQso|!2k36b#^?Bnv8*`OzE>c=PCpXw$2Q_du4yLdgx{uSoQ*<2f<^S-e-m-P!MZln z{%`FMD$)wG3<&vvJC7~2ZgeV1ybAj}PZUje^(3PB{}k5wo5j@0sA)0N9^4mpC(_sh zC2H)9Hj&y0oH?KWT!_}!%&rgh^=LRy`qPZI&x?1@n{MM-?5lb9d^_E=q#ID78s=61 zq$$9QkgR_)GcSj%=E?bl**$h?)}QFZ-`8mO422f-mRN8d4gf9m6t|d#p7mq_H+)!L zB=K8q9@J(~lu1bZ@>UOO%gsz1RpHR>DE8U~9{?(#_8V2#ON?7d@RYSa{c_$O{)MPC zcmZY*fJwAE@{xX(I5+Ux%D&n_O(bqzEDU|YuN_=21ul6&c}m5G|`HXI7glDx{^q}5^3T?5H!S)aQPMEIhO?SyN;2dr{QeG zHtgFP1ku67*FKrPFRt~Ws9T6glh9^_!ww>j91Jb+$jZ3%=-+J52T|jn_DAuI^eJO! zX1|IFudd!&jikztcXm-~B(_MXB#eDEBMyHb4iDCq+p1$?zkc3hQ(Iv9~0S_V!%qPq5cN zH1?OvT(H-#c$|5NcIG~-h%e8~2qn+NgHv>}+n|4(axnWhh9`rNj)rlAf};y|ymPg<6 z3{_5^{^y1s9J18@LyHe8SlFGjlm63Y>k@>{3E%wpW!d)!Y|VdfodkIBJjX@k1OdT7 zZgjNFE_{PI!R;hpaNB2Gdg!8E?dd5f`-1by{A=a5<9V8se|(+W$0yAPgh^BG(9&!B z+t#Pbjem$8U-GQ&uq$Lb%fHjz8RtjN6Z~2xTPbj0*s**f2I@^MWm6=Qd+^wE zy+!F~8OzFl%kAmyz71 zejf9}Ufjt!yLv}I5dRC3KanE3h;Hd{Bb#d1mce{ zKQ|9pXANiYQ3)4p{&(ASuCL-;?=ZK42v}e{M@nSL4K()WqgpQZB`LrEmo{*p7Yf{; z&H4!3uf?T%>R~5qfX2Ic#E%2)4{Lus^{`&{$No}@Pd)6LTh(k|_hX&?vB7=w3O^PJ zt98pv2NPabwdS^Ji(|QS$3_n=aPUmaW?9;8FrG~<`C>o&1om&{}6 zG_%ewg8#^4i0v{pq~rxu@*3z0SK$y?Xx7gmEIf zlt7}gBI+)4(NO`yk!|eE0pue)_=-rG8s!hPrk69hMT%2NPoWq0-d+}AjlYZJXH8$E zId;)s=kgbLaOyJfAfeK;Bb9k;$=A*2;6D2LqI`ax)d$u}WTey;#2w`eIk5{y%lO+j zP>g7-6{>d;Fz6J9?xO!HCB}KypUu4)7bkoU`}dRwlydD{jiW0AcR{P$%w^tq#|nKG zN+9&u!Y@H3@qwN-$!H1WERblRd-2>kwDP&&iL{ady=ygIE!_Aw?9(x%z%&0;1IDW- zI4$}ZUDsV$U9mCpE)HccVPZ>l*Y(!YGlEvEnnajuwMkQ#!mFPn@i`kWW=|q?)g0;d z_Y=RrK;s3#JlE$Azt0_*3WNox^V)Oc^-;g$={FBr!ow`RkUr67Y9;!z8%GH`^Cb9r z%EbV7LAmW+t!NW(zhRglGmRELWcHYMmronFn&z1rwr&F9qy zz4|?`tc$AMwCa_*TdJw0hL`Ae_A)$BopsR)m%2enku0JOEH0d|6%@RBDO9x?6-?C3 z$z0|83A6Vy)?a~iBR=Qby{!-{L88*>wE@kg(Q~@d(ou?`X2NS=D zgrnbc^t+q=O_3cZJ{`hbbpf8c20l8AaH10K2Az644y1;#SKh%vK$_1a4x3QLih9B%tr4N(OuHUrP4ide2Ce5$ z-nzcuoTFd2Q{uZaSBstfMV;hbL#=hm<-uBU5+GJIiL3RndQYvADzO7ApC3xRsYKsIZByoaPwvU$c_6ihqbbPfZbn006^jygNDKx_ z8T4r%O4ETDP!dKAAli@3udG->6@#s+G9{!IQatLe9gWeca_KXV+kMr#PQ-y>*LAf1 z(7Iq`tZNtVO6;S#0tKBP;cUhhLZ6(~+kR)DD8YgI-x@wg9wQX0!(rkeS zP@RN9yRumL)G1u3dV|C;l3X%3L+2~EuVD6d*L`E_uQdLeKRDU>J2sq0*{zDsVOP#$ zk$4Tals|t? zb#`BbeFI=rlA{U$=9?MM3IM}ODwYPqYicXLiySZV)!jCCn(PC%xrNt!^Gn;j#x(~@ zbF{(i8hh-{gPw)CwKI@%_A?!8?kJQ5my@87tsn24CGUrC0T!0H#gByb@$%N(%R=`O z`Vl|Ey}Xi_koa^dKfUwfN+gYg(ncGSH4w~blO&T7=->*iCnQh#@e9&F=Yiyrn#4Em z6L%Jpw(L-PplvSws50?kIB7RP-s_~@n{;3MaRWP$_g*BgUK( zmXBQsr}U>;w5>C)q#IiKa-kaR4wL~b_dcn1jWihu}Qbr?;HVrw*)&H<3w<3-=VwdR3{u*|kbk zPmv~*Pw`-PGoOqFT0hI0Jz2E3zC8HIg_d>-EGZn=<)2}V_f71e!)SfUd&C@U6cz~F zDLH&pE`D3@Q^V6ZEUxPTinaHM6tNAij*wZD_`cnKmh*?&^DFzBG9bdKNekp*6~-$3 zphMOa61w?{@|CO+JXv6F|62*_^n@414!`0uo?om7j;*p%!90}u$9aE3qRkB_m~(!K zy*N2Y;^tW1BYqBtfK(^GXO;h>oxJN3X*bY23PmGkZ~sW=EKhogo+`sabz*A=vjXk8 zzQK)Y1+h)$a)zV_fPX)G`d9kNJZmmtc#l5kR;;yRs73A#iWm2NQdkv`q+fqnAo2@4~F8*`ZT;U~g2V%*oSvs#NS&W6!jc{b7C z0JO^3r-jjwiB!q-A?fyO;Bm2XLF(4vfxb~4-a{vtwbshVRDH-EM-a`;URdZ%!e#^= zWuD35n=Z#C%xT#ps&Q#Y)2T=CS{b<|^A_~jx;(uZ1sX49yE3nsW6rX?Q1y~Vk+Lcm_5s!y ze21jVJ4@zh;3qjq{*gYI))a;zGqr}-oKT{&Bnp@f5ARn{T`}P`3S%JajYuB42`gR{ zCR+5s4K~>}dNf(ur4K77*V+FB+p+5iB2E-dbxk6ei>Md3o@a<9jrUtgwCLQt?{D6& zo2FeUJ$-+O`+h+F_s99)U*NtEAIbmzG5`C$-S^Y;zW-vYo4>4EcKz=A^Yg#I#Q%PUmGFvA@xDLe;@Jx| zZ%*;w>4y7P?c7VfZ$Hu8Pw>CJ#eKW&dJp!F?pyN^-;dSz>prsIuX0Ty_WO+b)Y=;~ z5c$u0e6JW8zCT>wKj6M^%K!ce_kEF^c=!F#{O>RG#*ZHe z?3x9ot~D!#Ulz4yJqm|_P*uLj>Iy98SH7e_<1N*Jn)SrV5DX>k3Q)O!JD7?T6q<=LLZLC*5@vzMM`!}%=3}}2l0Qx2bVxy*U|Rjc1V??kaV;G3Qs>du zIaj#@2Tx1h)4$@>y5Cv;+dB|njVUlK4?6g2ZL~H3SyM5OT7v7m`W5Rmopt6mghV$aKA)aoh@Qg?x&}4{d0Ya(xtj=-`}Jh(?>q#sBEUfR8cWQn;cR5UGyhM-U4$mDgHqd_P7Y44^mvU>Ndk>W}Y97t(!LkGYty zGLIwt`|WPetj2O~-uO^oyJh|6W4Em5ciLsePo`(LS8nqvt@N25&n!TdKmOH}XYJo| z+0q%_r#17uk|@Dc&yD|P8G+zier=RJPzQWaVc#6#Htzu>i-VEVOxGdS1&g4X7zNC{ zN!;;wO(HT~sa+Hn!BXj$YZ3aJYUW4`74h*TX`2y#9Ikr692v!&@Y`{dgHBE#b9*6Nd?mB}tLYYs?DB=+T=tZyis z`eUDh7QWAm1PoVv7~KN*KQEvAuSB0gvSXn5yhXHMY)X{b(lX#|?f0VqCNG;G`J63r^H1W&X znUZn)W{9r63CtQnCk-#@Em*eLRfS2~VRb@>@)m=komBEJ^^FOnKXqHSnyJty<~v`b z2#;E(O%D|kH*XumT{(DIWw3Br&4=?Mgt@$%!7&4{?R?!UyA&`%|e(P?(ZPiQH4|BnX&A= zpA#2pfr!mF&uP&3%R>sEd0#r&=wzfw3}JkZlRc7MtculREQa6 z&gE`*?SnFmL&@t$!H*grge-p4wRMJllzv>uj$q*FKfbK}<(mL}Gfg)cb55z~vo`_W5;W}`gkFZM)z`lTO`%1J@ zE3c_$B2gP=E zk5+44Q=hR|`LwT>GTCNL#>%g321?JpP+1IQ&2s7#ZC}3k(>zcH;_`ngq+U5%==Xt+KZKvv6UZgULACH!xWux|pP{vdr ziQ!j*moM?~;@MPU;$QO&eR`+&1BS7u_bvWNjrtOH0#JJdYNZ=%rCc^2Qb%=)ZlBxS^t7`1>4aN-#ui`6j*; zXlfJR*^d45R^F;7Qp_ElWDlDyKMXXT&qIBZ*75h+1G&j#Ys+`&qlbBH;quro9bDe9 z4=h~Xoy+`Ax&pY!_??pvsi7dARPuSLN-Z}kOd=hy-MjrYQ>y;kn)<`pWF0^k4X_@6 zF^BQBLZg7<^PkacOJt*Ui<`ytl#K_HYUJMtfg~dp)fBv|^*QJNo$v8Crk_LQN}#07 z^*L2No5~?`%_7kSGqLnC3jJhzDHt-XBEwwL!0zyMrNJpvtCoRgT;FH zHv0NNFg9f(EM$0?CAd7rMK)RSfNVD6^BYNAS2p5i5EI9)pJo_52svq!G7W<>IIVj@ z6euN>mwNb;m9LbGqEc-B4HMXcW1EB3$-l`)mApqjvJR3}|CU5_er3gb#H&b5O3so$ z3Ud>3Bs5&)ukIcNtW>3{_b;ee;x!XVtRs)J?mrlM=P7HLf9GV*!N>JN1FcQtL8_vr z^b0(}AJI*9#S@xAApQzJI3aKZtG&8jc+e@(*u@TahlWeup_vAgNlhnI_;s-E>u}xJ za5diJaHp}=XQl@C3a2`gRcwcY9n3=-ofAs+?o=zkDM?oe)Tq9%P%RUhgJpfR=-{@QrRPfe zdV8Lp^Bo*u$Y~v;po{F_^-Z9;+qcFWEDBpaRwsA-dl3I&}S5K9&3yYbiwo zD+@Fptd;1J4{qg=_yO)`X*-vdl^a)7C2-Tv zIomuIOcNU^x5DnGCHZ+6^yoV7(CC``eHXvA;AG7sxPjqtVu}t0>h1D3nZN&ytWvyp z$uY}EI>^d_0A-Bl+k+kw~E5g8iY`i+vh^rlOW?UUr~yAdf9Q4%Pj`h23wD3=P#a_7O2v zokhnjKM10Pt0V#O56xtTQ=cv+JgH1J_7R1xtZ1}f2O3}QOl+&_jS445TB}YTVR@Lh zVwq7w4BQtwnU)3Cy=ce8rWNYshIN5!ZAB#o+bRRo+>~HCJ$qey2nf1d+~(rSz-spb z9<}DPiv!cvsKYa~*cr7+4sE@NAh`f1cLdz=z5S>t*(NYd^Bk z8|@Pw<{)C<&bvW*=#3Uedh4QhGb!kaLZ9U1W=&mnHi|)!kFZw7DSssV;TUy zAa|*(Sq|3)QyIlqJSkj9X7>=CBEvNW)_UsbTOXYq(vxNql){3Weh+5qBv#kfMf!we zQ+gMUOidk#FtVCS=%~MUmrMC3)00~q7Ium4oF2IOpZu^u7WO~9J7D2l-A5O?_I&c{ z4nXE9Q{~LcBB%AiaoONE?&F*-&Od+VgqLjQe0mm7Lv?pLMDma;#HL$>DqI~*4K5K< zB|f0veg$U0vwY^kYK1vxo(vm6MZgjxh=0zC&6_W}v-~f9gzC6ag3pa1 zNIC%=Go?~iR`5QMdKrj@$oZ%a)rI?n8MT{3tA9|3MQG(M_ob_TWV!taztu<`P@?UP z|B4cU#+yYh64!S`i}ckz)t&_6J?*}&v%798?{s_eogkGOM;VD4&v_n7j#Cv0m<6*B zEbL@=>n)n4>6(>K?Gv_Z;?iiUgxJ$~6#Eil^GBHvsBBV6^`21xfxWM3;jC~QRB47> z!+L!3l$Ml4Mcishm?Lc=X!d``JJp}^N;^AXn-p-`eq%=jtE_4k>J;fyEe!qUGj}W< z{En%=@({_D%XA=l&#WUl2X&1UL9EJtZ}cKy_l zGkL-NT5v!g8kcC=nr#MY^$KHGAFSIN>NK^Ft|NXO;dXUxv-#xP{0*&bwiH5lG4CR` z?EAN@uXcS1DYIMO3SkD?-twADfoH z3n{xrj>$Zirs-@k$6*=(SK>dhhs-vJta~0N$2Qc2L!D}> zgB3_z!@mZSfp`~MCBDw=h0(8_0AOxzWC92|w|l|kZ{CG&e$;Su^Vzxu z1l7EJHBHTU*Deshm@YGK`*fH4XYOVhn?!70e9qR|NH5WkE&XLSZ#9pRGw-eEhxS(l z2Aj96OH|Pz!^zVzOyC$=sTIxzTeNACm}h>iA6~T)8J1vPR2}FdeiC0Q$S4j$zmEHh zT~DC#LB0qi=JWsNoqjT3oa~t|paJH=udMCjCtgipRJWF3qOuqnzHf6MKFLFgoIOn4 zmoiu;;o&Qj!-wGPT+;^3Mq)n6(y-4>|CpV{wC*?xLWRp^uOta~o%z=ip7ZZTcKjP& z*ZR={u*I3Q9#4)g@#C#8R+rJg*c<>qjgLG> zYs&GBWI6a}@drB#GfpuQF=~a8tL=D->YhT9ReSVwb`KlSY)z-wPVI(I&6_`!C3|!k z^s@SnLkg;sWvc)4yQ6)pMO5$0+JZ{tXNP&)L3%$)Y1> zTVj0TTRt(KdGwFPhlmDyeuiRmDw9cCy9cZGQsU|A-C4G)@7nzwnku?t9$IhuIlkHR z{J5H}cvP{D+T`$e%=(2A^4Y8E#KIX()L>rkQ#Ai5{K}H7mcGCyv05y2vu?{@dlf{opd} zsM+_~{rr*jl;o}F5w=6?kdaRRe)F&YvK~3=%>n-}>-jkonqT<;dp&Cp-(x-9esn#u z0`^rkvwTi#@TQ#lQVy@)WP!q~_aT-jTx)Fjzz~W0qq08#UeWVKXCV?MTk<3jw{8ff zL_zbF5|xFgEs*(kFg1L0@NokB+9P{gbN4Y=7}l6}3XN(UF|#|Kg19_BThU`}>)L~X zhnHNlc3~mB-TbSqGv{4posTkK9)|ZiRlms!sZBMTOb_bHAjHu{tKD~#p+)9H)A>XR z9C`Ug*5-^QG=KdH`Xrx!<`^;M`|vP{e=e~sbDN`sKNd_Hna<`ZZq!`-0$AzAPVVB!iAnE;Acvm= z1%Hba>`!3`r)jOWMit-v^>*aG*2j_iu41=cDkqy*V6L4=&ioa}WQY~|pG#Qgu=W+7&m4Og z`*>U5e1Dm(acagjs&I+RZxsYyhmHDN>>~DkwsrbUKPYmEV7rc3YC;k+u2#GC8%ft5 z`kO;MD}Ei8{7zMYv}iO=UNL*kB_*cgRXji%L1=FPDSwbU*;Z< zU+JA;-I-Z#|I8s4$GJbMxtIK4xH(%0uurVey&vP!sTbPvz4clDm%Gozd=Dq|mvg(I zN$+3mfT3FBJHfzRT-U~qW z^d@Y$5@j2kibVlyny}0vvgmoU&D(g$_J)>qTo>0sHay-oaP%86;@pW_v(@JQ(NH}! zaA$JiF9Oe255i8ofY6vbTN>kTc$=Z6o+%NY9LqwYE4t=wbZ$@N_(6hv;>k$>&VW-9MV{+{r`w|-1m^xfZ^L%+Xr23+P#%I8{P;8;?BzkrFG`PG^4{)1eHCSi9 zrWB$qC^t#*1dYcv;|F>b)TO4&uBGVP);ee3)|PJ$H2#MD@btzVW+151L2tZT@VC)C zf2O<2(H;KxGMu<(| zGuZ?tG@FqJBY%oO-7Q?u%>wbktlhKsK9v@0U79|HM{e2i*ANUUw-3_|PO@rQ)M;jB zx=kq1*rGWC?DXGx=j)3}3na-9C1%}=vJKtTz(n<5C~4>H-d#IER-v1;2>qve*t+Rp zB*d2#184pdk^oxVJ!aV)Zu}e5EL=H>AW$|wA6JgB&|1cs@oTWT3#f*Yf5q%0`=?Kb z0E+*LD@@#=b2$0d+PZ0@$ix#i&6F29ocK0WHx2!DS~d5)g#sgA1F$OFsY1ztkwiEx z;Y69P2T6*rmqjI5zLNt|h#MswAniro_A3zZ(Jj`6QUeZ@qssi@74h3K)CHojx2r6v zWCeccAik!Z!1f0c5szA1zT4aw74iNu5PzFjOdv8CD~M$)L+xJeFs09+?VijJ7ul9;D3tVB%Y}@Iy zC0qjj16^sQtqqq!KS3s_E!-SRo!tkd**x^Gx>7KxxjjyE+g zd)h2y8{X!`1*X;FgdWqJJ$mxKhRWZK)i0peJkKu1E_?U_jkATytUkM592Uel*USsd z>dE}Ll>{ig9BBNHK$fT_9w|BxE0I>On8EU`JZSci;l)RK6oe|UE4|akmr7lW^xSR< zBnRY03uf52Qg_*?@kdc1&-#`B16Tyz_#gF|UvE@*IQo1m#U!}&Q}d{?+i@8IkwQo= zaiZf8Y@0gzY?{x&3g}MNcWpG)3hwm4&R8ZXj0oTus)3ZPuhn3z*v&r55Q|* z0`YpGxf<%+AW0;mAiG0pg;3l`hiAxkZL@hiKKr{cm20pT~f&O z7RQ=udYrbz(nvRFbn67@EKN_pVwX7N`KY5(IvWzk?eBkZgRWM)E%#^J z+0zmqFO2XkK!TU8Qme7|CzDk8!DVp?yZd-FqWhUE>M1sE*^CazqkQeh+n;qmw*@?q z(TastOHHR6cD4T#;>YaQ=?;Pw=IZTujfokR@vo-IJd{v%S<=L7o2dlu!s;v;5qDPi z);#6$bjRfwk2)DRohoC)4lPW#BBNFZo_%yOz_SXma$RZ~IpYnyVHw(m5nmwAjA>3! z;*n#o+%Pv0T&$g~0_3?wwm%4N6_XmcnaQ3fablt}P7P8gyo-HOw5Z<7jW4wLa^qL~ z`tdgS_5{CUXlRNbksAX(a;c;mAH1Bx^bLBQeps)Uq(9VKF?>%X3B>nt$a(xt>{XTY z7`^pay(iVAzhFPLu7~MGR2bLiq(#Z|_M^Su9PKk-V#KSbn&G=o54GV*H|GNM&^x+b0eb zhWrstZ0vTHk{Ys~9-OELV`yPE9!eS9xeq~?VcymhezYh%WNGD%&hfGzzwKd>yB{HF zju#RTO04rY#Zy)Q#=HzXi}<$>#7hHBa{*;d@?u@z9hiA0KP)G$dsocV)?9^&&NgrK zvaFLTlr7qD8%li&jgxZ)M!0EWNpH5s#8}K zmVXT>DpQAct}f3Ye!>{8qj9i~R9d!rw&}YR8c-LV9pbJPuhK(Al^z_&eOsGZH>Mfa z%oX3kVcuNt`0v;9n{c1cBo+CEsfeKr3v2wqol9i45@SKU-IJ*d3pXx_bcg(+aLqcI ziTH62LxOcnz2O6mXY-<#8wwB$I$O3niU)Y}7T80R95V;Q?TO~&R~7289G!jvykves zG(=>R57zjt!Vh3xig`Iboge7uO5FI$A;8fw%MVZ*h)5dn2OWnfXR>B?x+lO5C)ymW z7K0t0gcbP-*kpb;i}RK2lpjYBOmuQ2<4)Un*oEmO_`l5fdDh>Uc{ykAsZMMVAa_@n zryVTo{_Xrvb?fjy0Y}T2hlN2n7Z%l#BM%FwUuX8UDInwDiX$)qqR3=m8vCk{tH3K8 z1`p_o>&C8MD={_Te)?xD%YNx#8pX&oK>=>EF2*@AJZJox|C=oX!x z66=VNLA={R4WC0zH@S$A>`BnB8+|B|c&ahb^TR6AvXY^)aK%N%k%NPYvr5o?N^^P- z#-j!hx1hTG3%Nu(omHB519;`0jdT0s+gH#k-(endDKpbS`TC@+g8Tm+{{8HjHE^Sq zYL<+yqK1&M1lF=3GkWd*R%M8kf>JqCAo<&5Q(9fuw9E%brj&Mw;PS`M=74A(vS={K z9`lf1o5CtcBK-ncKE|6xZxT2bcyH9BG1;TRGs|TRV5ky~!p24*c$sSy8I+ZfCV3y5i0JF5ZS8WL(^Y1nLXYb1z zhxfB+&SX1}rerQW>AuN_%8|?_8!!I9oUdmv75~Wj`m2Oe$#+Z5 zw)X*Ahm%FnvVXFU-Je5c@g$3nz~7c#h#E8T(HzOy{U`Of&YX>Djl*oL_5GLDuz#o& z?*p@jeT*}gz=QmK)4fOIe+uKY0n1DzTD84u|B~nste3*4Pws{3C_=`~1NHDi%g4IY zhgpr06t$0LA08@mX^pYnL|&4a)Vq!)Fl!`D{TNKVUF7S~U9c{xh$%0AHL;SUqB-G; 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

f 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%0AJXI4OKnj*Ihx@=ouK`WWoY4# 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 z zuIHtoFPNI`AgF{i-Fl?MekOh3ENhYM-A0A+ z@QK_#g+v2W#inpi>W-arG$M!~TrSGX#YJ9d({&BU=0U4ggqhT^*Li&lCKahqLy zRmN~=#KA0*elye*ZI3#$%WCbLTBG6FrOD&5^qR0=&{HB5Gu*2Y!Ab@8z6j_h7VZeY|sFv$x>HNjhw^xn?)&D>^cg^Px^CtO~`15VZ zMI=4Ga)_0EQ@KSpL<#EYw!fr~BELa?Lk3!VXF8uuqEv4&nA|nxC2Fg*U`2*?U`4li zuNr7HQlcPNGmKRyB2^SpQkzMtHuMe6o?FJ+lg7Hc4u~g7jRnZR6hN-|+)!^RffZ)( z2MBQp0CmSQ13*h?n$hi!{TjNI=}*tH7XO$IdD2FUSdYNs`eV;cC*KrRIDLQ@5(7RIZ-&<2h|+6*)w6# zlp797xlt}b;>{vz)g*i!H{ZHes&(d+)rRMk;=9gS=4X4`&NhYMIn(lEZ>!fP49`>)Nq?n$KrFq|fG2e^@^gVrmN_R^|d4gu&Mbai*waK-yW#dh71F>?5k@@5yp6m8(7X zc)v=8{VLU0-?nRz?RsUKS1kjmSc)=`GiEDw516oTEjD(5Uo`2fslv)!t69*)0Y7tl zb~ZJbiFR_Tj6Ry?oRtsp6|YB^dC5!@?e_Yp^%>as*!8HDwgOgSfWoa_i4m*Zi^A?e1lKMp{@=%(9t3 zccRJA>*B-8{#MKphQ6tr8{!@&px65h1Kf5pfRjFe%odQVJPOf(`x^7*V|(@%HaSjZ z$^%l|ub*&EU)CKR5G>YAjE}gzUPyJKkBq@0b5DaI2A(P;a9*ye!b|+ZvkdCaKtQf76U&4}Ai!0K^vo=fG{RCW#ZIk8Rge#C;Tq=!#5jZX%)^ z70k^0n4&V!iAItY^mNav`7*QmZBv0fX<8X|B3@ru8P2M1UX~k}83@F3<57^x`Y>s? z?pS7$eB8CA4sxHWPuSC;k88>j;Rk1`hU`-`m0oGk)yha!hdP=`5fY*Ju&ha8rusLG z)pX%8LpltmirD!?(Yu*!J@hNT#;vUMbbHo0_6JQ1KCT=!Ue{%KIdK!JJXppW=Fe%v zjD0FN>SHvv4e2SJGt=Rd0gz5z6`2^C?_P|eTpp_1-X9DYnV%q|VIBX|^uUbEeU2WO zL2dVerBWJ{Of%%0FeA+m^G;Kv-?zVjmifNz1NriUCa>zjyAzqc>1J_crw~);PlJM* z22Yzo_hK^RGFKZ=0w$}PME5e9NH``;H%Z_!HBf+q$GH4;D)LiV$Fm~oi^~TYqM0xL z5pF_zidz}kHj!$a{7c?9R;}Av)6TOdV@_f6n-opMO!C*+8@*)=Bx?nU`V<d)Uo{E{ zr=v(o|cxS@c%kg!jUvs5DXScC9jtJDNQ*WAgY<;fgt?X2h zG@fYmvvpGq@_)z$o9y?)9}8YJy8^DbHsl({csQF|ZSMM^ov(^sw@ep?vKGd@7Bsx1 z&Y3l`&bhgQfkv=aCSD(Ng;WO{nR}IcP+xa4*7kZ~EcBvnCG2k(M{Mcs^w~ro6|&Ps zD(_>Xa?5tWj68jk4&d1_^d^oXxyH|%su-#?E703O=>n5S0|3TmH|nIy@I$(TCswqB7u6f?i*A1v1n*mwGmbXa5}1IRDoL7z2?h zSoh;?!?>A6z0$4k@SMX5{^oM zH|ku@Gqp*@I%#D~Xd1ap%dsL=ul21wInph9T2GGHe|Q9e%tp*h-}e9Ba+D!yW?p-> z{mCn8n{(3MNs@Mb5$@8d8EekW3wZRF`5Em3;>;L;*z)CIyzLYM@|^gOgI>q$ZvkVs zyAcq?pO3-Bf{7zhfhq}fI5iMNbR6YGGwV0mt>EE+Slf;Pb-Ax|^_zaDFjloX9(ulW zxPQJ)zl-0ycOlp0j~Jh3+ug;0RV^fUdcPvt^xK()>vO$RcrEJOe5?$24S6@{M^l3- zJBfQ@-##Y5ErSt>X|r)=73)|!(8@xXfc4F#_*J(Sb)a9szT8mc1mI%~*^7 zlc}A6FA#DJAx9vtdW^IQ1?0spCrHEdi!vST7oytH2Z8+8aV@9Pf+uNM9$)EiZSJds zYOUIx>G>;oF!PN^t&FUE4Q*?mucJ|?E;CgHQ?jCzpKx}UpW&(k5h{| z{HB$8ns@{CE>^rfZH1d){{aEEaYO%0g3SYKiX$t5hvem*XU@XE)jMZQEpD0MV`^>a zb@wM6`hB#VO@V+qbB^L8PrP6B2&Wg679>BHn^M$rzF*j#*Kv>yCukv6=y&|nHQa{*LlGI8uFK6Tj^{2P ziQPm4|60dL`?7n%7D)tgY?bQt2Gc?y7eW}BolJEMq+I*dPcb-Pz}qy8(X>qSVW)NY zODz0|I$r{H#sXH$<$hA`l8`%Se|}D0C6upfc6aPrLj3@93|(lsf-1ao{mx_v3zKG* zw2UUe)_aU@N-#DGN)uu&ev?qkC=x}UhSMD%53WD7c8OL|wm6hFA8Wu}t#(RH^^4{J z8GAiaiRaP>kqE74nVUzM3|WNZ$lmJ~cP0x3NLeliR*U!fU4VZ5gP`cw<22mmy}(z$ z@m7)0at3|(CKKwHSfa!)DDm_|6D8$psZ!$MhbC@O;un>;`%vUtro_{gxb@J)rAi#B z#N~wY_|`Ip7=icC&*#BAguys9#kI~2V|j&wIhfkq%tDD^@%%IQ^nk90w(y1C=+qL} z^K;wsoErCMsDp`HqXIMvdze0UnNe!zm2GOrYcPGN&Tq$OLtR>q47xIsuJi-gE1GgP z-gwUJRlU~J$1j@o)G{n6-1!{yaVFXQd6ayj?~-mNt=5U&AMhk_Bi@x}Z8uVb$lfUJ z*Qe7VA^&iYHMT-2TFde9BxL#TL1=4HByOo8N@JQwn?7p(4ap%jD)PTx;<#K>7V;Aw zBSBWx?d|Ec1Kmk4v@ik*W&$5VfvEGhn-Wf`*&TZATXcI3=`-`FL3DB&8J6g~X zTKzh5xN1lxKkcGOHo%@)=$;9+^_z=QEn7fti6TJtY1Fe=l^R*^es-5U<;Mszd+yLh) zzcpa_=!d3L8f4R(Y_m3x0qS?FM{B#`aTj?sA}zNH!l24``C&4BdeL%KQ0>6(YOgfa z-cq89zG$#Z6IVkl8*+IdyY2v}-Msm)u_I;R)O4K5bz@~ItKZnizTf1-j5zH#l8tRi z-L>d$JUt)Xo9v_HkU>CuJ1kOp?mI>9t-Y@+%!v18eAcSp?{HEr1e2`E1 zxyc{p(qeY8cP$^y;^Ww4hXPFAEQ5_D7@yu5vL4ukic9)ng;m#<0Y@$X1zXMuK(T+b zsgL=*m?|QU4~mmm7=HU>O)EaRf3~~rll;7eph<}{^$Yg<3wJhB;lj5JH<4*(53*lK zzZFXFKcQhTzFexUyVq7{cz1!#G@QnuthpWBT07SLZg=w=sXX8O1Km^lII(?@tOdmb z5avvf&v>mB9j(ocAC57Hc>O+1vlqH=KG{Q2;(|Sz^2I4i7$|dFkBe&%+@?uPNW8}$RN+8;PLQl+RF5J_`&xzW%Xl0 zzk>vgL99GqA^VU;L<-B!W;xI;dwuuhcJ9vC-$owuo;6DVcb-rbb5-^|pR{C-W@ibG zDJ2A-;QxZ|YJTNc!<>GP(oyGPwsmecMhGwPm88=Rtd5oGB%&n}4D;LFZAU4@uIB4$ zGHhIV6}wZm_-jjq1N07QhRylwXmaJ&W z4G-GhyMd|vJbX%&;{?|hDGpu>M(Mu&YeX_pnXzo8hGtJxVQtARX9tBJr!ey@^G12f z^Zo6?Seiazh`A}DmWzYTC4Bopd!0}||1I6I&l2j>XI-g)>=T7-Blr{SpDl@?!f~c` z;nEL!Rd`Bwg}3#u(8_LLx?1We@4ZWi^=nKn{0@@Pr)9jtDdTC%_>{?bvC&63t5X3D2Z z>%DK#@nAh+(mOxB?)9|fBb4e_TLHzhgpG#cokBvtA>%Q}P(017>37v?Z^)sLxrA&j zCus2BCe*KvF-kmMiI*Olc(f8Llz8@`i3gd#mJ^j&PNKix1nBB6#iSi8!JG^7XWNX4 z6PT`Iw7tf72KeERF+xJW{@p9Af~xN|RNXs8Wbkt|s*Uka>r5+;fb~?Hc|*~?k)q`o zVyw(}slrR}haPRG6J{!NSmk9$X~5W>y0nIzJlph&@+37#zb;7sRgnHE*tcpXAKFqc z{Y}r7e>s~sn&Q>WczX>_jsVL(HtOs;d$X^G2TLTrWRQH!-QAX9XMCSbEo1qkvAoq` zFo1P2o-XzohLv5++>1-`L`VCiwUkpHD{5r$zQv!%jdu9~qzkzzg$OWs6oCvQcEjFs zx0VZQ{|yNCCn@F2Jk)1<>KN}raTRcKoVA+>rq@Q*t0|^eURp8z`k#!qoE!B0bU)Vx zOi>S)b)I{qAH9UBdt95c_cglJa$ZpAqjobPLrG`}2XQ<7IK9PrTpAbNC`vpo^!83A z^$@eTAnQ_P#5RKxz;tbAfD^G^FlqEqlNcX2tw6TZrfEnW ziU?2R%8ZEOI=nea^&u;p0iEadtjF%DyxmM^WN);v5zd*zJ}6ksS`XIwzp=k}Em(@i zg^<5Trh*1dMTZ~p56s&(cU$L#b@av(^ z9w>XKm}0fyavr69ILH8m$t;m|=I82~DK$_9d%xT7SFZEN0YA|%z7D*rIMgPg5AN&_ zm=v4=abFTG0kdvp>M%gZtzQCrY*NCIRYCWce-JUWvfm}QBFWk4=QPQ8|Itsriey%G zljc9YrjV6i?7wDVDf>$(*Gw8;T4dIuB>)+9AQN?;)+m0cRlBoHx#@?gy)tP06XJqo z70)M+2pX3vy%Y`fGcK!vV0Vp6VL#fm8_ufNCRzbr)|hUFXB0Qwi5qp3)AR#WHwCSu zObIBXw}4cCy@*)hn7Wk+h(Q2tG!8_QBtdb%3~wT6T||z$`Y6(|C<0u0vi&}@Ny?&s z@cVecG*S{8>MYw&Zk_?ngn}rvE_r!GK3QmLEA-?ZeZzjXiq7OOf!}`Gdh#6;W?$!>!39g75a4*@~tTjYgM6i^j1g z^3nCZ4BEA~fv;UylZb`e1;O_*^0?6-)rSz((OWpXCQt1#JK-$rpi1=Y^G}6j7&2}> zg3t{2$A=kYJ_#nPhaL!BO07G;iCBOkV1ncDE%%s9gTM}9KfERnn$R#4PU&cj}%j_QX-4kVskJ&-XFnFsfxOx{8c=%IlLji8#H>Tui3VUPoG&=80Hk zrS>-jZ|qDX86!ycsD5%;gJgDgivJ~$l4j5-OQnQAb?xcrXxf%_Wb8h@)2YUz3==G>(XegDg^{85BnKmkWqqL!C4{0|x9ENn%(O_-6vvR*m zAj~R*m@ksvpB%Sjq<>D1FxaGk!8Yk`Xa7JtebBfi2FiY)84DITT6a>nyBBsS zACp_+@3HtJBsSt?D#d4L$$ZI-*z7IrYss_1n--u#aIZ;^r=P66pL|qoX2i<+`diCp z(yE#mO=ZnkUP=B(#Cfc8x2oKmL^j?i#EtCxG@@h2g1R6=->rOONawN29b}F>PgZJQ z&THfOyS94~d>h%0V)e zBx_Y62Ci0zYC~<_X$X@7JWRKhnQhxU(!>>{+X}s@1cBLfnl*F;j+G`oT@XN|eENXf z9NJ-y7D*`rqtg#g=bPV$ulIjVI^Ra~h{tcgs$5Dp2>5o82s~!MOW?`M4wAgbDcD^< z@LX`Ta3H%ybDUmzKdG$7yERij!V7gWM-Y7|a(Mgbd$6R9fUEg`|19fk?X#>-!Z0G_l3krew-V^?NLKE5h8W$)Lz@SO7hj{?en-7; z5f0!TM0HbEY$2LA0BCNxBcBiecD0J#zH8?Z1?^d_3i?*CHmm&!6fui3SV|y%g(@Cq zmcKPDr=EKMg6vVdmPEjXYX|WD$oZ&y>+5pouOVxUJi&-}Gvc*}jCiT)%7Z@ppM3cv z_CC*?!$t0(Yu?kGy8LLtGW#AA;teFdA4T=hFyItsuzpj(iQr)hxsrE)#9VU$ zle6&kE?uQ$>-`woBt~>I^8`DeT~q4CNdeo-y}OY?b?=a`vljBRtW7Ga7Z#AYa#59X z_Y74_D?ML6ykum#7 zJ=yl2Wc2-N^L|2H&pclblwl`&=Gi+E5E;CCm85R$2}*PmIPc4hnr*8j6g{RZvheLj zfE`KiY9tCxn#|`}7Asf`1>X4#$k6j{wt+oBt-6C5wC3alI#lZ{5jLTms3hs$ERv;b zR_L;AL};bD{942QtaYkrWw(a?^&$UrWih=bRV0&GtynbTMbg{TkMf~^QjA~pCyw#G zsTIdSA>dCH?H_<#>nXzqtB7HOH!%(zTzPxQ!$>O3+`;}ZrOsqLB5DH1A(ZeZ@Dg%~ z!Q?uqfPrC#!@wbtJNz$ql@@f4Fz03N_(L&Y0VMMj?O^?^t=3*`x3_&-wDt8^{ocsQ zmn|z!ZfksUpbj<#sSQ4a4d1giVIxW&(WZLR{G{R%^Na!9# zb>8DAm36*hUZ{7vdOlHHkUAX1@t?vy0;ET;V9VqZX&UdW4SBUKG@ST>Z8(+nIhcYqvI;*Li;=!zR%P?_Wc$bwaqf7o8v{xHrBD}fjnlha}zB;k-$uoSQY&JP2uFaV5P-O4Z zjaK$dN}8QUVnd@qw)kX)eE39G3Mo5(#Ud%TmX|g@d8DZd{YX$noI~jfR#(B=jEN6% zp5!_I7M}AjC<_^d-DiU-j=6i?U~fxle(oK5e5a8~9U0_#%Lp|xr- zYTSm)GH#a}vH#6m&n!|kwE7S7#02$l9+lv3VfnN+4!uYD06d$Mvk8Wbx9(p3;?!*P z?96aKwKd!^QzD_|!YC#Q_43ZtgXn#mc6l}TDwI$tWMx-_|K4`~)H=Db09BmNqS+*C z(UudTwLFsFUTazTdadP{pW16JduLLC$fdvR+-D^bom#qgZENcAeHaI66{@{xF0c|j zes@wOPP{Vx=?T{2kLj@W!27%qC$;gd3+$<--X93sOVo8^UFGcK8DHo5I>$!CyBbdJ zL9p^}+%og#Pq*?3Pvh9S0GX0AKNC+=kM&gZ8F-rd12~!*A^dDOsxNLnS_5j`+-Yj2Yh_P$`vdJZjS2t#xtMQdog3Pc(XGfim>S71W<1p# zLle6A9?510il+VDH@NdgH@{`-=f%fq5`1D5$yiKtPo+E}Oyl{%3;(j0{ki`3EAr(V zdY8x68V?4NMee8f)3Wo|CRJx5{^>_7WqSRHSN(|lyCa@45w}(Q$t(Tj*6!qlfSvEz zS9nzv@K<@e66y~g*=Z~p><1SVtdPJiImDS<5-aj$cZ>ZVtxFyrbAHsU-c_xa=aTd) z^{gN{C|0CHAm8d(ukVKHf@Ddo{)#cY1G*G?uqo!OGMx*prOnh2cm&oPLc#pe8!J{n z812wP_NQ{mlbA}=KlRrsdhZRrcux*Bv5mA?Fs;4lc_P(16XSkVF3Az|srR*z^ypWKee~B;VPh@k9hn} z_rKF-(F{GP`>qO~&Bw3cacBd}#%@HL_N~OO3A1XZql) z*Df;VziZCJL#Vr|l!^oZ_o!y@4uFn`IV1k_bzZgE)47u?YA`{>8}f!im9=7ce0a(T zFtXm`u2GikD@lyBnSOO4S92yzQmk`A%sy^BA@{VOtNK?`ueTSC;#>bz=jhgTW_{K= zRw6gKaP+!bdwplQ-%hS@sNIf%gw4Am;W3SKD(r*d&2!#C`8&LB?%}z@A(3%o8m)U; zt>pn;{5yEk(?1Lw(M4pU31x?QTvi*Spu>F49!J@4@aIAWA?LEcTlGWDo zEm$uw!$k9W^rl|##Zdkp2_ph*aHl!e*rS%CfqZrf`z7+{y`cRAt6(RDiBs)8bfa7k z%^PqaJk6Csj}2XyjKm&?Yq!gFCBXHf%$k93fUCS04Y2gNfXIxMhJC+_h4i=~^S*?o z)!c~h+|gIF6Zl3~?5&oOg5R<*d*nNMKlU(P%lEg=$vtGI<2FejujlOm4to(hcF0Kz zOBA<0`?2VQNz7^2V0!$U7*wuAt!F)^aW|x88utTYj*Zx?F~!Ntv(T8$ScT1okuVbY7Soyzrtz*`>#bhLQSx8QBtC!QwOc zMVTtSz65)&sX->l)ay}zCn?2ktQB4+K>O{ebFL1w*$$%6W<-4WFJyC1@D<1GfVu3j zcgL#sa~=Mudt`~;Xki?k!?qwA!BWBFTIq%@?_Q5+4L)kG$N5XFz76)Z9h((jM^Z+o z;ynDNUihQ8b)7kN2o|~PR)~@LBdHM{i9f|y>s^8o046P8+dTUd%0|-94lt%euHwVY3o*PIl#yNoX~6CdQ$|7B z=XnFGUa6P7>84Ny*l|=E?U(OY_IWr1%IZ{X3y!>nfG<`$IHt?1rlE_i`(he7ITD~y7-u>ze!tkxoatbXIyiaTpy~p}Ak}exKrTyUon~ zNlKAbgVpZ0O|)L=@`jD*h%-z;(3Qq0#*#kB^~-Pqx}uW3hq&_{Q1H7L{6mZLWg;Yu z&U{~o7Cmja5p))yTTRxS>KMlfavu>gfZ%JN!gfou!J>^*KZO~MF_rAaTYy7#X6yog`)SoEOnHtTnr z((5?LNe2@V%CRgZLw!oIse=um*JUE;n?Q!8QsMnlizD5jw?LN|Oq0e9zFEPK7>1oI ztjx&*h&}DmE_f=GS5V!>46*xr7#~gd7f6K!6)Rjy1*@3m0{1-@yupS+pD?soVYPV( zi6vtQ*q@pW%yHU&8{VHLm3x0D5B4%s@Ho7c>T*wnk_7AZ21aUJfnXm&IEl>uA)?rS zeZAi75+te#HWUBy1ZmcD+#mUco4%x+*%6GC;R8s#%lK2b(ft&`R?tMTn&?aS|4CDM z6rfLivEbxKO#7x$aaz3baOPQ%I zB88FgWbSf*?tc~Yg=L{;|Eq*A(D@F&yqkK^TQI{L8?Ry_BXu{y+g^W{x>5;yBa&ZT zOwe9$n72IZ7CE{02h{x@-7yQp%IK7yKG0w-ewlzkrH6p_Mt`U%-w1FrF)&@v{eXdn z{t-}SGw%Gah;s=H=qk;=(OT|2k#pkknv-jPQJfqDWz(C#4nOn413G3TPmkEo*!v@G zAHz!4)xW}R#pIJ~e_Whuht9v$`LrpM+~nOup?LbcBMXvO#nTO3MrRii2mAlhoZ3Fz)!Xn{e3Ij1ThWl%p(5cAu4amIkoBdq?_Rt`+ZIz#+ruvcjTEtoia4#EGegelRcKdj|1VZAz0QoS2LSX{^YJgH#0Sr4~?=i zb7?0KE$G~8U-X6cnj2Mpd%96S{Nrq@v%UT?h_CAxU8LC(4jk#$b3~-hUWZy*x_Tyd zSvd#ajA55$o9G0h8I2@iFWb!z9gxkv9Ry>!C9+UtE{e?Wu2!omt0>ogxqD2zSXj=I z9U9Xzc?7UG*_%%(+Qh4Zokdf4+`6`$lZn0ilyW9}NQYf><3r`i66C!Ps%>jn{cP+O zO8yQc#iU@LssYXXWfJ3=tEm$BVhqm4=*>vt=(I~gy?(#MQ4 z-o5b0`RUH=BHmZ|V392TBVWzIQb15Y7LaIdp9)D!o+xFIVq#{+tec@w<~luYN7;mL zY~yM)YWD0i_X`9oA0i(}Yh~nb%>8Zd?JiIL2TlJ2nTz*D`lj>2-kLD`%WZs(%U(k{ zxLjak_-AO+YwjmM6iqNl&AQXl%uFM*cQuPmp+$4cckP0B(x%cE#vM-SWUs)0K!|Q~M=I09;_QS@v=dj-` z1%4838*6aG{;Wf&B;5bd(1-n1yQ4CHXg+@@Tvp~njbqrKw*{HY%;#TS|MS60^Z5W^ zHD$+`&)*?MG-Yf3vgQ8g%FFz+BmK_@zwVbE>wi9+^vlNl&s2s+r~Bdg_tL%V{qQ$_ zWet1aRzE!LF*F&Q2t$ilernQK17Y^HywGfXh(r$1UCBWlE$o`>o$Lw{oFz~4x9@7| z!HQ(5yHxnyZp^+?ZGK8L+wZN+13e>eHO>;v58iwr+4*TkN;_TUgL!=NBiOd zc-gnzXKyFXHiEyrdT+5osGYhn$So6J=Kf{=+bot3F3gRoP$v7&BD>tDK)#lU>VOeW z)+a?=KQ5&w;;|OLNI*V(hnUlt6#0$3T(c?)1KH7!UGsHo*zbJM90Z?rvWYo{vd7La z9SdRn{CaO8@s1%iX2bb2Mbobj7=rr|qv}*(-_uC1tgL)x+Pl*`piH(;nI0jgCRZ}t zdk416f1`|a;ZHvmMjPExvr^VIjOUG`Gy@Be^bT|8egV2Q)VT;3O0aoLTJ4%q#*$iq z)#AA?fb*rSw*+`{X(~z*0N#+;r>RO$Y^ykDOtj0+?Rgv;Cl(Dz-khi(<;*Q{E-i!9MRT(X@n16ckKOW_9{V9aZ{Ys)`|Nu@PawNE z?bs+2*4YES?}E{0UhYu8y60sFUn|H`;MD^sZJtH$sWyDPuE2R^r0Fn`!-$jvyBCzr zF*uNy{pTDlX8b5bOik{o|84e;tgvUrV3G_W8mKSGZ-IBfOuwnZyc~bIZ$<7~5BlY` zCRb>uFy&>C$;^-Ucu)DhC40K?fT<$6*lX&^`X4z@T( zRm0!!{OG>x)cYr_YoEo|d1rS8J4lm!6?5sd?6m>UK)&x375?LR;DurPI7)ca5-9n| z8QODG9S%x+WZRhw$qx5Dt}xk6hIT83Hyf#+F3@2D^0D5J=x#rGdE|;ZyFGB;Tc`U2 zY{stYV4A1e&q%|i4Mr>VG^~b z@s;i$-sEu5?t8#Su+i7pslVTnjRPA3hYvXVcDVA}XDZm#xzhLM(%vIH3FP10ige?% z;6*n^>;ODmkmc{kiu7$R$a)zk*M63lpPK<9dfwAD9J_AEV6iv+DmKq+tKN|0F|k#* zW%j10niExTgtu82Z?j(}#@>X<_TJt3cl8aWlH1D+ZmXhR@^X_eXT%V82f2vY~fJ&cR7*5*NqV3hM6A zS*AlDn+|cS)6<|hFrQygsW;;7TGa)eFUudncGJ~QUA;s!{p{=wV>7={Ik}_4lHPi` z*f=ubR9_!UzsDban6FqE*Jw^GwGbZu&6)h z@XnJWR5RyzTq(^xIz~pI?Mq(#p>mjet(T7-8tKL#bA$1`Ilk@T0-=J6YjfXWZ}i9W zo_n|Gh~Ta!=HhQK9{zj(sq*gw4g3QOn&B7bj*r{_GJSlG%M4Q=;;FZc=I#0UIuqeH z=E$J+?jBQ58G%&x^FRb8!1(sYFHq}Wk;|aRLV8W6KOc?b3Q}J{gvTX92-}glsiB7Q z&d>MYxG_7uI;7M}$!&MV>v5u}LB1nXCb7_K?r*e>X`r2dVm_JoJm)R{2Ho)T+xPu9 z{{LxTZHvwI+g|RE$FyJdMu6%w%zVk`MIL_)>KL@~^LO{}3T$LuaHDKwL0)q=tr7Yg zSD+)2F7>~d>KvWtPwg3NAYUtt?j*~#77yrM&w)0h*sG;o{3KPz!yA+6GR@;*_6hln zDpYHy)?iUd`ICP^$f<)&nenBJ+h}YU2P;~O$1Q~K%F{1gapk70YCL$%EmdjvtE0D! zKV}}n;iC7K9RbY?k(zcZ?1=9_7aC^P2kD!8(p#0@`C700MB}_Y!R_(oiTZu^Mx-k& znL7L;B`_+$blpUQx7312b~moll4z zTeY1(F+1AYwY77(yZ(EqD|EllGV_gZ4^)z}>v9*aidah^jBh4*ztMQ$n0ce9?l+Ge z!9^1;JeK2wwjzR^&`9Ihsi~r9=9SdBhNc^0=C8Nh#9sjZD=9XoS1~tVY;I};#ggmd zxoS-Gcg$_2*6L7t$M*44<=wI9IJzEbpLnc#j73tPo$S3|G#=dUxBOL{2~3RDLtu7e zpYqeZ9hUG1$uV3!aHY|nJlQFBW*3Inr{1CFH~vh`_8dgr1H8#S`@NI~{BvDVo5_I> z6LOrQO~M)Rea1l9#bzj%787%qKPvStZeNO-_YrrPn295a8c*Ka{Jf+1tTpU9z3&0H zS^qk;boIJl#{~>j96vyf7Ys!pdr1D6Gl+IBeCc?+A@E<}fToZEdn`RD)H`#2J($E^ z_2WZ-&?wW+8&chLzMq6E$)c?#5C~NspsdTsPC=PYt&!p=8NVucnO%}|I zr>?e^uhwtAzcKq@VCdlkv;z_9cHZA>y86;cT3(dJN-?8}TsgNen$&&-{Q(j$BDjL}|*nr%#=zr(K`Fz1HJ>#kPz!YnLk0*g_K;KN~{7JuM z_(JX>LIuaPo^lV&?H7N*pWZ0t<7*+Sk^G>^yc5iEVqbefK^OjQ?fs|l%W2ggF#g$l z7tZ6O+0V^%8)egKYrA{<+ zXV$64YaWkJbLRXSAW4VbT zdqdlMI8}%Qdpj zU&7CA8ojsk_kHKf^#6_z{r=-s9K1k@+Vp?LXY@aA@5lAyW){sYEW`A{l6h56++Ru= zJc-Rcej2-!hSxP^Ob)Ozp39G<{zUI z)1sIGl;Gd+*5>49JRe@1s|>N$x0;m&A9{A@%shU}T7{1J5iBVskI<>ee<@sxU_7=o z9(uYi{C4s}Sjo9x>`p|oQem%VXBk|zDcK?psLx($;Gxt*QZx_b?&fgCX^43BEKjo@ z%y{(1)ITWbl(<*yLEtu#QOI4jWkfKHIN^M8(bnVH&bltl6~d!OJ30~72kVzTpYg3> ze3Q-ieC*!mejQy$jZY>sJHXB4wQ+n4MvTI|&aSA`qD_Nm-iC%jjODTsJRw;wPfW{e ziwYR_uNg>rpJDs>U~(OjR;_WD_aArn`Z04B9EQz=O^xM_``TAaxeR$gVn;J#dwz#| zJ~%C(9>crGhkK$DnDgYh)~bORs7mcZA*LgiyJ$ev-p_=|Gr(_rrs;VH1(g1sHvL+0 zB5StSSo+ULej3cFhQ7d|&RO>w}9v4w4pU2S4|Rn@)*^a;(OMFKT6ooaL(+k z>+Wx4-qFnYDAT zOoY4UUWO2br-5BZ>V4C#(^SfiJ{v?%W!CDRjfd*Eyw6qtBEA2ZTkgtDUd8XcAF0CX z;)3L&eB136op%K56e|q1_WM;Zg7Su40iZ_qu_=p3xqo!eSKMa5IKZs2sGf0-#vNoL z{FG&cd5Q2#b8j=;|F+IE*$?)vtw;`8xZVuat7s~=aeLPqYW!%&-nETZbaM<RQ? zu!^D6`5n;rTx`K;dBNGK6MJ?)4B3WBe>qKBU> zDR_$CmlVhE`@!#TgZL+c->S>~^my?5*C75|!T0LmdtvasA^845@cnA={ciBPKlmN8 z(r^ElLA&|#1A_RY^65c6j|aaygWto0^dVRH{Tm(pPJZbyGoHagdN_!`GWb0#h(A8~ z{bKN&Pd_X8o)r9kD=23NzkdvVHwVA(2fz7xB0;%JgWsuV`V&D=LwM|mY89w@zgmYHH`5t!J{)0pAl9?o$7Z%o{YdC=6 zR-l3yE~?A<;evE5Kc23?uwR;+I%tCU?^}+j&0Re-lK%KiYta=n#Ns-$)?OlYNNe$X z)KbgdnHwRbYSHZoKK;I+wB^roKcWgR%#E+WgXdqX2C&(inA~lJNY#}~=cL?-%m~U# z8jROs_JIy^=g95cr$)5Vc5kwfFX;JDFOjcy*nQY=vTsSAN`7Z1mX!_XOU|@XTq85C6!$3zWtt{gCXbl67{?` zVOQ8w7y8g`oQ)`WEz(km-qLP=*Vt&GaV|AA;oTxU|4y@-tV{d}o(KzP=Gwa&YSK;L zeW=-O28OX*R{a#@$Sf#~Zf*0*0o5aaEdjzy%7{wjPPwQ|U-ymV%e{K!fC2!Ekj{Y8 z$rQ9|1r@U^6jLe)O$QjI> zKVP}=<-vr#dYUFoJ@GDNT*$LOMqvm@0KCU#dofYf8OyEIu)sIr1rpJOb@3h^oZuV; zwiZMG?y2?MS~00SV^)@k^^2#OAXn;0NFNZba?q67zzwRc{Cnwx6*&sR5&+1YM{w1z2`<;-AAFPBo<7|7oJyK z@^F&{zuNetA&U$%8x_zul+Avc$6Bi|%8fZw`sJKHe@;{Iy`Yz6)&%QNM03Q$D@u55 z)E+Y9qnGKm$1}{g+;Mb~Vr7YX*N8peV(f`fr@Qq=?l{BqSEQEZyL?9-v$sOHIg8t~ zz`q#n46e(4J2d_p-(=MIGn2Pk%f$+|=$;Ew!c#ju$5_iRP#h*3g1F>2^KqhJLB6S~ zPAG>Ro2HsBZv)7KYQZA88?aYn!=#xEC4-wvKw92Ca+2HyaO0tN?^onlJMfyI{D7eR zB4Py}qJ3zLZj}ySZp1JCQc~c~tkeRX@ZG0O-0DgoB1T?)gJymo=X9@_isnoQg(!{5Zc@ecnKsT zp5F0keDl8&A(wYP+{F|pPoA?mo~y&K&inH>2QN3T#%HHQ@{)cu0;htyu)E+5`MkaT z@6MFcm=i0O|J!Y``qg;stB&QyRL7k{cKyr^n5V)?in!iP3WZnBia0#+|tdGSHhsNKI1<3>1#N;2M>eS9a0 z%znO2%9JZPTB+#!G=37g+WHaNmh17I9XhCQ4Z-?h+YJ1bE;SYB>yp2(P4Q4`FLp#; zznU0n%wBRU-Q$i1icw<3*c?dEWf{s(6I`{GmNH{3msPezZa%u>+*|rg2_~adHWzII z9UrxqB~4BK)`n#%6|nbnqJ&iI^*Y~m66&L<_JOlfnK>Vh^+O~;(^>dr^b3BVL>#%N z&V&*#sH@dO2(Co8#X>K2+rc;M#mJyKl4n@U&#E3fD%lBP=p&UM$1bd)_BxxfflXIm z!)8?09oOn3*pr>QrkFj{U@~&(iC>rh?flsd=k-0uH)pVO9U`_XVln?>Olvj>g}2R( zb92L8M3kv|oZ121gaPI(TC{2=&qbHRf!!KvJTPKjP2+(h=G`2xFKJ4I+RpFVY1UV| zwaEO2x6Q!|`kIk_4!ydsX&u=4de8oq`_4Pnjh|jL?<;AqyzxMMUISY?H7-ts4p1Zh zJGjkNCp!P^K9i=A`5?vUbFyuY)yG1y zTy1fYcNIz0pDwJ#V9uaWuzt9^@v2G5%MYAbC|44X)vxmlNp5ZEIq}vbv7#Vhh*x3~ zs%f`%fG0hve0}NG!ru0cV)YZt!V|GWH&>kuZ@1Dfl9}b>t>@RkXRx=br@V73?O)K{ z{(~mP$WdAcdGgZ{v}4Ah#x)jif$B2-%*PKh@w2+)XVr!oL00}o<4y?%k>*#|S*zB4 zMT50BT%0S}h(2fB*82r6%&RuW>xV?0cwr)hFYxu|oj8_xB2vADKpY;mpNUp&MQfME zyC)Vp5DUE@w@WIc;q~*empKS#rgdO9K6%nd%)=MoM+c<6PCsJSD&{8LIvDB%4z7zk zbr7tQ_npxwx(w-_s5++%qJBxS_hYKb53k4!Pd=Wg;6!8Bh?zc7lXi+XyH|Tgyfuxp ze%+HCW}qubRi^LI8bWM>2gn5H-5IbAOKY9FC%L70R8u2&Pyw9t>nXpO#^QiHznHl4 zX8Bym%`8G3U#TMU1OQ?Mon3jIq&X9IV&JRS3JPll-QFAD>3;Y6d4ZQ6lX~!IVCOr! zzuw>Z2K-xo-F!1xH*fpvW)bY4)=l^Q6KeoT7f|VQq1BWA@7B}Bz1CCMXRgpy{h!v; zg*0REcaV1h!Jyy&&+8|@KICu1tPiQZXcFXS*VI42+fJ|tE`z;|J>UJ-%QBPVua`pa z*FE`sWXsJSSjV1|8xOv%mk~7~+yN&HriVAqFGV3z55mjq?C9>OJ#BxizFoUh99}2D z{2^5bSepslc;cYkpKK=HY*@QJJ$_de37aBMm#bK!s)Lx_SaDd*lNEN9{oZhL^~?wS zg5N5S_$ZU8S_ei9h}(54qbGp-y`5kqi#x-{0Auu7`3LpM|Ht0>&A4T?kCD#CBHwxj z9OwUywazhU=BB>g-Qj!(IwI}S{Y)r3pt^=+V7GTIReom6MSWU6muzM|eo2Au^(YO_ zeE+Fb6&`M)G*1#g*FB`eK&?HkXN^AgDm4UaREu*Oi!*AT9SAozaPIZ#oxeWWx%-M! zCA4(TNjN8&Q^pg&`>p>k;S5exacJ8UYx}qms{gFfGy5nPrg4!^9*fY~Vem*u2U2ZXgYQApU<37`VRM|12Yk#OX)gK3O)JL%0MF%V zb~C5kxxFN(xYyHC$ zbHau--d9_-rM7B4Y%jA5h@?srq22Ki*NyG?FN?Kx4UD&aGBCjn%&7E^!O1d4 zYPh?tJK)DF3Q<#N55>cuG+YWY^}UQhobtX=govcy8oX~aPjGe)-uhM~cX0^ipsjDo zhr!^juczM$4f&v=OzIAOi&sNeUPl>-6L)C4JN;s#UYmY>aPo(deJ_|UP`|3!!SyeF z*}7w5Md8VZRKt1}zt8(f!|ucEGtjfV;lQR&HcvKscZm4)P`@62RjO$p<*$4sAHcNu z4&SlG4}dAx47i8(FK3aEbxo~E?;o1HN)LK#V6GNv)rH@jTYwn0m*{SfVf4Px^6?3clN2}8Yl_Y2dokqQ>vVFtlKn1SEvX%68uJ!F z8e=^Tx$nG)Y{@8dn|n!}YNZ1vSC|bivBdr5e6Qa#GqA(`etGr4E#KjN{*ZazMWjjT zOaHLV5J*|1RKt;}So^8HQiq2`J<0+0ve~A(+zzIokIcoHJk~z~;XXMQ2>G1JGwrNP zPS_oybfUsS5*P7y_FZBlxx#C?EyD%bK)t_SEV)+P;T&wlU(iEdy$ag7i5vnE__W1N zDcDVA(BAaU-Lde8SV~yMg0qGUgn)K*%k zw2oEx+q1iAp6nFd!PW#VHv&FcZecFwH^oB!L06_P*eLEay}09OY=Zach5?yxg@C$izzAUC#+HKffg#At$` zn&T)R-Zb}gfop^{tboc)Y4nN|KYUiRBKfk0RRi`-b9R%%05W&>Gt(q3TPbt^tfjQ3 zf9-mkry>yZ**j2IIb#mewDxM<^#Q_YGZhFMfOTU6+Kpfn7zj==r)({ziYkRd`>C`G z;I#Qd^mnvYO|E8>Mw(rhn#+lxiC0NJP&;RGRT-8&O-NnK$-EKU+&*T;Q z&yW|&LS{9akuDS#zj6i+G`1SP!qo8}_#S;<6BtYhgHM?MkFrw2DZXO8ggR^U6n~gj!|7J=n}0GnAc1LOVu6q;wuwPNp*WmEF5j}yTJpxXydH7bu%NK zf^zeXZKm5nWk`Vs#c~rqy-}iU1I;+{5=dfuo(xXoY2LIZ2Q94J9F|k6**roTGhNf< z(-&u@p)IGH^*6yMD`$LB=0QYNj&deZ^x91nOMZz{h_N}CV(u+%-qT57|$(W zA_DedwF=lP4ZipV7-*5ZY!iiYXMcKw^m3jC8k5X^kRQAcU~;05d+jHAKu@kQfG+L} zX!BDxwG%0MTl0g44XM42+VcXqMiKabgtW<@+SCWuKMEe)@baV?**E)mvuJ7B9R+!1*vVu0 zE13Jh{+ zwG%QKQroe0__y$PDy+TVibowS{iJ&@S7^d;*Bx z;B4%iF7^nNe_2t}qVkIWRVGaaoM5wxVS z`Q72qmjIDqXGny%20Md|4q3h5@AOlU-Wzr&LQv!y#twzBYusR8AP5*{7!W`R&;IC} zB82w|n!s(actf8SFx*D=H9$2WGImlSvs7ed>T#J8Op;(&Lr zH~(w_m!LHx7BbV{|7@mG$w8;^#X6RM!a_$+%#1S1-+g!vU#~yb{p>@}~DyG;6 zL~m$^PZzX>fTLSu;TdL+VIv0Irl+uR0DJBZNf3alI=pDI^r^8*4(4j+Or!B!vNGmw zW8ZM!_-;{wHj0^=8W2?sS9_55 zydjKry&mYu}673kkEc~x&hnhne;%}IJNJoBOo#JxUC?b-uQ;qJd zb?U;?-t-Ui9Hzg6=E>Lgaq2<=dP{w}U^pd1uncJm2tmT;6k$&(hg6O9F536mHD2e} z$i8t%jd^~_M(FA+d4FMUVG5#7mMKRmNbE10VSv~X(>M+)$GdBXaAi`J3W8cL9RB)Z{+c|1? zf2)G4!&|NFX{^59as#g&12^g|dP7i=D6-gg>yE?F5({dTj~mm)H=z1GT|_w8x0iIU zmR3Yyo-@R}M>gTre^whW>qP5=qr2xZXZrL*daoC7R`z4lyg9#dhte1v){+guNF{o_ z4AbZ_lxzmhZ|wZeA!E9$r@ihmtsMD(8`JD({4tH5K+gIa9wcc}O*c3zrWPWQVJpBR4<^Z1kBI1$B03%wAS5 zY;qnJQgxPt*IbLx*ExxJ?rLqpjfwEbbFYnP2h#?2`R4_T`Hg5xMaB-oiWW}%eAXmh zKLf3#8KudVK*rnIriy1U2?!!S4lVdYBJ@f;ynXI(`(V~hn85~A>II7rPGZ8JuQd!1 zSAiep_olw=r8ud&@IlnjS-yrh@kdc-zfdRfveELxFH3-jozo4!ucdT{Y>;uo!dqU0 z!JGL+J#r?EbD0^Ft}46Z60;b22z90Fi&aiQq+l8iq0^V5Z2RoI|j(E zJXXMwIOt71Hv%CSy+9P#ibl4G3Rw6i7#^N>aeAHKSeN_8s6_qTGVU5BBN7PeFm1}6 zSvgS<*+B5{jb=Va)`sWe0sI^?8OivkuG6Z~BaE!y&2x}*jX2~?lChZzZnSlk}Pt(vC|kggRcz_Hl7gLhK>(KbEtBvsOD8UGBm zzC&{5`scdkGjiSW2_1r$sq?L1*z33MXnm)Mvti`q!XH}M$f@1k1ydk=KL48U`A^R6 z-E(zV95v^Iv%hwYL8udZ7^2=}EPc(1{YLOI>UjM}aL0H4r@m$GHM^f#jeYtS$cny+ z!|WcY_UhY&wO4odEjT>I>yN@8d!f3BdsmFTQqaupb7sZ&g7jHIKRIM~uj{~ume3N# z*E;*%U}*;nz4Pi>dHJnb4?pnN!)O*J1iks+F9#^Odm%O_L}WK1Sxq?KXiS9O2nd9g zRvey>r%M|7dbt2yEdS0Z&>MP!KMI64Ab4h&9#+hG?GLOJ~hF_J32m>1C|E)Ur z_QsIpz0coI!rZ?1EOn~t)TvWdr%s{pN#%U@qF-2=Ei9zM5!Jw~%l^5lwM=h~Hys(v zjyCGSxWWoWNU_>XA3O@|HfxqVN!&#(HKC-8FelII*aXY{F+wrAJFP%%jq#XoMONByo zAuYwT5F(bHNHEAXm@o6o9M@+W zm2C0_v207L^PIRZ)z`|Fpq zoWnAVN003MQs!$DTcWKPnvTHhf*&R-NGpcqF27YcS!{u==y);27L&Voz}42mQKVz3 zUB;(IKE*n#mhp!(Bw|d=p7MtaFgE6mV17Gu!`72MnKe(qT0cxJ3Zri3kVSbh9dLTJ7!pHF!^{uMyPUf*fWN5Ar_dux0GsTW(niuxmVX|bZ$woo zRffbuFqv~oK1^nJe-Xt0*L&`jtkW{IRa%l|TFeTMqDhssQ?2AxGXgl-W8?1ljohg9 ziUi2-H}o*tXPA)XnA`itJw4Xf8AU5i&qsC?>cV6HqT)?jwg{R*d1%-g(OT-3qw|m$ zd_4?-3;5b&oDV!>kTuqfK=FQt@Jt&TRtdtcfCCB*^4GBnV7W$G}Lc z_)S!4(lgH#Oj2VA4lgrFU2uBwNDZ)i7Sl$|-$okvdrRlL6S~i@D=+DvNJ&>BSV};;9}(0O0v|3= zwa`lmNDngk|9=1}vjHWk1f&Cekk}QdH`_R{#o2$yaKx8UBGux_$z!xi=U!QgIqWz= z|2!mXcJ4c2t{;n73%5_%KM3n06sH&WVoW+AVm+|E(Yj-qaUz4T3u5DTb~kV2ycSoOla%$1s1qA<6?ehh zd`pgdq-2oAMB9@g=+eoQiVdu$cRB`?XpC+>IJH!SaiihyQT~uwjDQXt_J&_*r$7A zyvG1PlJ^*!P=!8=nt`Xb8Q-7V`2e&Q_TLO@%W7f;K{^SAi(2G{;qdFPP@?q##3qQ$OSIr4cl5t2_@ZQEjflcH~txkPx z#(~1MDnW3P32RDZ2feNsl2ENeyb?iM=VS*RCAYZg5SHr@{z&hgl@g8;bJ+W{-vJR=RM8PKcpb-sV22;a@#*H?srwkJhcCqP~aHmbKc$y7`3Pw*!iZ?^v% zg%QP^0cgnpy}00(Cu1bh^s*pwmL8qC%{gn4{@63l77E}cf+<1TTSxQ+_8bZiu(X0U?hD-HFM`pvTgHMVn+y< zntX^;&1YV;yd|#)!Qkzb55oEVYF|Q;g~OsE21iv5lb)y1i{8@OO~6wk+cGa{@5J>O zwckW63J3^8m4bnd{2`&D_j8!WdSH>YaN88*09FrT9WC9g4AESem~(ld}2oyX07{a!(ZubC(8tbm8Ld7k^;3j&Jy?Pwt} zR80hE1Zr6H^h1%TF!wmjYcKRlI#sX9QBo14+!1DiYMt6QLMmYC?3Gh%u*Xn~|fN)brvC*OPa|Qo9kZ%T-k^ z6|Te3Caecuwb~BDV#9DJ(2Fx3w7r-Yt_8G-G%><;8^X1Z5w2~>lM;zp|GE#TgEc|| zZZ51cjFpf1*k8?h<1p*3P1LW`V7GrVQG$@WLa-Z*PTa>`N(y0b&a;h@ZKwwN;!oCK zm_+4jE`SgMQGBCrChcjsc1nX`@^K#px1!H=$PRTX7JC$P`v&p#_R5*lR*F**+t$jK zZJ~2&T5`Ih3QcpZ%-M_;fg+s~fjs;yYt|R6R>Ox|x9sL`ETv!icmsWu6r{z%p0>>= z%eK7`e1oQayt-(mcj9ksT(gAWC{kq0jF|A`0wCdvU|vfP4Cqvjix@9y;(WZM@8Tt0 zmD`8)CT6didA&cL@5p#2=f`usYo)J)3y^w*qGnHdDk3{!9f8>{*S^ucDVYDnYc>XY zKsfc|UNx0oc8x00EG+z26e04sL}B}^w>^vfXy`A(F(5EbD@|RUT@{tLj63oRVKt@F+ykbuy++hMS91=W5 zDCRN@HkjliOkfV>O$z3@t@AvIuli~<#-YM#P75MNXNxK*SL89a?+EF|Y#v$-+-sg-$vsoC$-*)`rtRF=3jjss0f zIwP;fS3Z#bd`Noey|?LI3d!0y`(@qRXzzLpPE0}If{#MyBZI!TG^TfPk&pC^3EZ2F zB?eo&F|^-)Hw_ijC)+?5NeL()Hz$^DnH$SapY22E?q04a5FkVvu2bogoa2p^HWZ(< zjDA!IZr#~?FLY8g%CuJ+O><*HuORyEa!4g)^T`!v7vl3l+&M2GSJD~P6PeaM?_=m= zth$)+3`y$OL7)r4&dPu^qXO(0%Dm6yQ_8ectr#CM`fI$JB?{qF@h?eqIX!b9jTBN6 z{XjR#&k2LX>vtzPe|5Q%ibGfd5YYe#L!!6B@yi+7waCH z@do#b!zI-^(}C!7K~DO5scFB39bnjY_iKX*M}Of}^5KxOz`F;}c_4rM`-sx_u#@2# z<;u#)omsIaU7B$MllRuT?T5TdW`BGhw+X3Jn?+vGl*4hatL1eGb&~c*e-a5y?o((M zk`ms^^c5WFguxJDlnn1U;$kF`Qnr6}?$E$Lu&mO0;=JyL7;e53iDF3DE7;}{c0OaH z?{AKo9VS?!Mt_oUXxF&CON&`Pfzte8S*nX?56QHbod5&PU4iPw{L z3$?y;(j(X!Dbs)z$BVZOq zvm@E2JCYxw(U8dkl~}xzE$WpVwKistLXIs%EpM6QedP@X-X82rNZ=Pce&THZ{O?-S z{Z8*|Y&G{-{)50ue^guX(gKM6C2ebtJIOLu>GLs-?Jfbn{`t zX$kVugBD|fOK$f?g8)U$@~h##ge{ScW8HJJwS-J=Vmt8vwsCv?fde^)(Iv6Df*Jq# z4=j3nrz$=@v9tTh;(&~24-ptA&hdUpY4TNBsk8Ch6G`H|#WGjmoM;*6L?r6z1Ll$U z`oTArnd$j<)KL9Jv_>(^|COiZ2)#_Uigv!js@{_yO0}R-;e(fdEpL#j z8t-wW`plm}yD0VY5S3Nr!dk&Rm({9<{cfysVyidfujS2NC(X`fKi=w{jR-9nYA+z8 z`fX36RY(d%a$ebMb7IC2>>9`SeS9;H>EKH-yv(3!*fiM2#w_by~(G%%1TWYX(;}TIF0%(+(Qe*&JCyf2C43bd7L$b z0x?Y8`Pz%ERIR)#whNA2Cd!D4x4d2B8@wwibY%I9{q==TpY6A#%rL&e8d(^|Q@Fy+ zFs2?_7=l>jWfW~EQ@EsyXV4n_37K!PA8SOR#a^tD0b;skvtEXnT=@q6YMNAc!Xdh* z1nvZZp(Mza@XF*qOLB00l5Uf{t$qUL)SmCJ;kAX&_y;s!cd$o~Oxw-=n>H=aHDkU-_KKgpeI>=K2rrRkN84bu>V z12CNt&BS_SqM3R%Hca9sUk@00Etv$7tSEbuV&*PHG?`Oix9Js)4Gql;N+#{K29j#o zIsFgFOf9M=uT#ueKP6FUqu4YR?-E9%E#5}Cd~@%XG*>6w6YR&X*8SL9c&n4yL{IxM zLh&DAH(A(^eJ=NV#4tFTotv%Z*%)EZ>7UaIy04fUNa#t{VD76E1u$OULHaxl7;&=j z-TnYm4lw6yFz|Ug|FnsO?G9U=JDg3QjzrUySWisrZfv-oebj~0HW!+2SF6{(ar-bp+8ozi;$c$eV;vq{3ku+4iEDJWXhh;09_vmMLZ z!vxQQ<8VV1pw@w8(wB19jHKnVI!5Y0$gGCHeT_VOO8;SE?fNvF_AtsvB!0>>%%vTr48vV$MMC|og+hp;7blj#7*zgZzw#Hm zo~H+~wuw!R4VMrSVHUqvD zZW~6P2zHCgl}hcv%3`c=Yc|=du*9Wbv@)Uv_j?gD+@;z=(ZDVM%94?eu6p1ixuTB+RI=3uKdL>%3oy4Uo@A$Xexhk ze))@V`HP{vD6;!1q0Gs^=c^IvE5cZP*;^y8)mEkM0Kus&B4?^gK)jS@Bi}0M^N)cR z9ZWRyhyA){2*{p!@JVvWj?@5Vv%ild4Djbf&xb>qL%8(v+x!xePI|Ts^_P{uIIsN0 znfk)SU|~>!0g0M0fwCV=gRis0vGeO;UQsCqlw)i+i)cX+cSp~WpLy+mAx{aPAqH@>4WOdS)5^ETG7K+qNSP<*TjjqjkjM&r9< zp}<-+L%u1Eb2#1@f4pM_Gj?Y}HmO%>*&uF9EEIb^Gn78Pyxn!EK-$WGp#mWF3jkj} z;6DNQ`*$0C?tHCY1n^86*1cjc)UopEeFYz5+4SIwZT#h$jvn#^EyWQu^TQgO?-M^r4Yxm^T^h7FhC@dMOzc~Kl@{|4_QGnZKk z15M()Y*T#^wV6 z=W!L-_HzRnxcm8nKr6ga*^6_eIGgoQdEO;YT9LURO3F(Rr=#s4%ca#s{VEo5KbrFu z#w+MdW;)KX`^zus%DVlgf>w$N)n793(JBN}1cJpPQpRf#tPg>4?)oc+cY2|Pm~Sfg zjj`^x@*^-2g6OqpYy{H0IS1G7BBB*ufZWhq^BfVPfSrtlBY8tlNx;GkPGk3kNqp-9 zG6SgNkNedB1h_j}<5f)bg>U~w!;!Kk>LC$YWo0TiNLqVu_dCKaJvHxMoo{e!K-T-% z)9MqZ`{zr4Hz@s?>^gde70&$3@S}2?@}uEQpDmRiedZLlM3Gow_;Gul zAAeBbCc}@)h##P#6gtXu*o&>qw=_sFU`h4tdG&?b<-GVinlO8;6S0FTNq(zFtsY5o zy_8l0b{;6Du{r-x)tDYjpPO%cl@f5e&Qx#HdO`F!Lge?gUsH`Ca%ud zzImv|DO4u3hN&uFy=K)4i>+)wm<_DP9CphJ0o(sbdT?Ku`T{}qBdb0m$a05Ki_wa- zy~?^)-vO3N4&Uk5wASnYB<=am`uf+s-zgG;zTK^}_-ansdQ(*^2tLV{ccpwaV2v%e zP+sz=z*)3vp34j0Ms7R>ChBf7HgXd@GGk90`D1TOBgW6*aQm$Mnm{NL@eG7sg?7fQ zQ9H>{OAbTlIf)ufkf72&C~o%_OS$tG5s}XcN@Xq4Jcxt@neqQ|01s1nK5c5os-${??}|YDlvrTX8Ys!kXXr^_8rK( zn0-2nC~+{0iGv}`j=I))T$^+N+d={$YYD8}B!QI&Qg}t&u12d0hn8Bm-Xv}rFrBUa zrz{X`z79=hs}71)u8XD4Vkh?_dX9GrT{&UVOaA1Rmf$zXT3qsCUHOX@Y05=|W@j475)wz|XaHyT@FACU@0q--s3=-ToZm&%K5jP0Nv-6B=WbyyZA_NAe0 z46A~^?af=#E(}qjQ`G#?RA#S@({k8)@5-0?k-fT?fBZ(0uAp|EA}tkz^bxD?o*n*E zAm5|IPc^==sKW(P*@R{xo3949oH{goqwL}}QXtAMQV$oVhb{Cso*LMZut_^E+Q?Aq z`Mm6}%zku{JNG_mQN@nGDw{p0HG8uzPqN`u&74rn|8T>(Kk`U7oDb4MlwGhMT~2@N z?*fB@qFZAi^I`FWPzuo}y%i|cAOdJU*G2ySu>GACK=UXq$l<;O=i_~;;#~mp98DET z=Dh3GnEFs}Y(LJJc_dMrhvc6lQKv0PLYb!!LS`9+Xyi}sYs9ls+DbR$4B{Dwee+i& z-jzIZQtc!mroGmWdR-lJrq#uoI2vRRXVOg@;y=HU2Z#WFu_;7+X1aK zLI!GrFp&|8KcB*8Em?I>F&U*yfVgIaCwLPYL(0Ksax& zAY7wb`u~BG7J^rW^Zv-!QKA&!lSmoKYzn89WK#vTJ@R!k0(DnXwQ{MGXVp1^x6m@;Z zzwP=)+Lxd@wTNX;dGH87s@ANv#+;z8Km3CfGX6nsLy&`Yk53ck%ARs9m5hI|AOa`( z!n9i!jJ#}X^pSr#Bq>4uYkv?76bZW}yW|sQEPjWBp?)you7hNaMKFT?%D^>p~ zLf4%%m~ZKjkEJ_3QX^5DxLqWSNSh-=acNU+53`3Tfi2zxY;Pd2^RUg>dt;ZBH}>Vj zWv%DRU#u&Cv4R(Hq%rDePdV^#Z8L{dXa4WGY~V%e7EXIi+s8E;ZOTMAu<;@Crkwd-TgTkIW zaW9wl)Fk$i>f6TtAX$06Lzt62*8&*n%Kd7-@&YPLN?@biCFe@_QpEesUb{vInwhTAB~qohejN3$=RpMZFU{9~q=)(qy2ss1 z|B8eorM^15A5^VKkf18J_oPa>p6a^ZuY*CKrkxthc_067Z_v6=N)7GiOurj%?OS^* z9gM9l-_1(aNx=<oqpFK#; z^XHMG$}Ab@KOm44v2~ai#RZ0y{XSZL7su=T8p}hz>;1MDy8gX4}107Rzd2l|Iy)L+g&{+>SOTvit(ez;a< zP*Yc;@?#Ux@J|+$G4zK!sC$hZ;Lm*CQ8uo-u>iF0;-=e!|0d-=_O_O<%`KEDLFyIy zqNkA~vvf}H`^$j6C;0Lhv7`f!pbVuDXPHee30?hc_uc?)Qbk5s4}1PqMq;!U?@5Y2 zEoo()$FE>8!&XRovybM1hNq!{VIyzUI>66fO>nB_@Tii^tyX%aFH-Uy&8J!s-_MP?)_7EqYUWH z{3p%%aV;$r6nxw=5s~Hnf-j04d#%(jnw|U7Zh?rCAmVjZ&1aSr*>a!MA$>M3FO$#S z%FIPnd5`lC=hy`w{>1T~6VS8Vh^NM=#y;=_nSAG#qxnvnM9$rkV6F1LB`_JrBW9wP zcRg*$$FDEq3-(~t9OZ9vp}Eh=RS z1m56YKAG;J<67~0HdOApsKpvwIPYt~zYT zX0&^`;iZN_dFxBjYNb1O%TS|p<2I-*WUB$m2DP1vT5lf3++#nXt?Vd>DYQNF!u^%D zK|1+>wwyo6bKv@4OY3X~3O^&VIR@*}&H}R~>xoqwaugBX9;&7tp>P#GyWQMc1%SocA z;eH7KlItgaLN$m_KZ5^=iv9^KV(5S; zx)Kb?c;ne$&6S~qc29;j92T@c%^hOs#HGvbfu;@UH2FocueT2GUD5n5D5f08*gp$9 zZLQRnaG9$CPj9E_=0&Qjj^I22IP|%dPRfIGLoDiyXwasqZmvZ#nU*+lGus`)22UCm z_wOLTf{YA?p^j?;xX)i>hN1!bp2EEewwqHx(YV>}VLt~VyuyrPwxIX4FN^Fk zu3x54U)ak=IJJWz5kLqh!DPbuodV&s&?9F@gJbw`p9xtm6Hm#^->vk$ z+Q#@;yz(VxgfpUs>Dio=X#w)A)LI#(&(vJcHW?amYopvE*h)p1YJ7}3p%Jwbi_9rk zB+G&yF+Q=MCqnN{ekW;v!8S=Ip_G@vUi*(iVBbm;<}~CLeXUuCqRUEz+ZBlU&JQe9 z_NrMV-8!qA$)yTR?y0!*>|i4&?-{IuQtzmeleMGqPTn*a?j~qaj<(qZ;V#A@QyC-O zS!fx@^j5@E&kml;Sg^FdY-M`Ms6v0WQagErlwN=aDg44VCB~nKFWc?A8ujHv4g3)X z(c7jsFtwqtesVO&41S;a$?VB}c`L1OgrAtPrB>T+l~IJIBATF&=uI)Z2Ut0*a0NX%YG3Xyb7*S0+O4l&{OG zC`W(==A^xwOAsI2M+A(nbLQr~mZ8be*2y6jsN#F9t;`YPf0(&c*sAE}CXu6Rlite2 zc2_e(ZvQ5!qrEMG zIq2LKt6UTdacS|W7v-?4Q0HQX5Zl4=L@o-?UbCRE&O$Ds6Mk)>f}9uR!WV_pzjs?q z9@(o{!iJL<-dwH*jkx!hWIojl(%k$zSM?o2l%+Q~hO zh(Vu3-)86PlL&^$^%r>)`Tz;R`vQHYu|7eg+49A{QsUl78B3apx!kE) zSf3>qUQTXy(!z3iE!QlBTZdOwaP6Y-5jR1FNo(57wV)fg!vMFlyW=V$Ey&Mt$!HK);1uL~bs!$?(CDG&KSd!VzbS3Oh5ZQ7~yR69@Suk}?CaQZ|aE~d=YPwT& z2|v(Y4mgAxlHff!k85S#RO=9ef;&(`pXqg1Mm)!WukELT=T8vsN#|CdRqyoW%S2do z`rLT-r$)XYSIEPQOhL5l7q5SX!6vPdpXEi1mH9o*=)ukV<$-7kdt=;wCoYqo>sl9c zwdny&Ph45y?v|58zNR0BXA*JmC=+o@G70Z!Br6sek-jKUIJ^d#LHD?J4Fmv zz7h{{=jy0WVwG=kV8BYtVFGpQ^Cr>ITo-SB+e#|P*L zgN`k+Y#4NqR`xWSv7QKXb?X!9Dl>l&BcDuu*gHbL`1)tk7eB!oB7CcJO8nRLU5RWn zyo;JfrrLxxY8wNu37-+IwbHfVLn-tW0vsuU&N z{FSr4J4Hz5;SmCLyMO;4;53o-XwaeFQ2<={uFhN%jW#C`>!RMU<)F$gMJH-3vMXjq zK6B59z6Ql|8uSy&w zj_RXH`w(x7SdAnB(|dtAHCx-41i_Q9l*9%kinGU|Jl!=-(9zaRO*FKj{D@`NH!pzT zf(*Z=fK}+fi#rMwTK7!gkQ6+q!QKrN2mfrrHh8tH6@F`a`8Ja?v))RNr-;F;$`go) z_HpGLce_x>Z{}OtD?<%-V7uHm`CK|$Z-42Gg+=aDv$=EbN|r9Ov3FEbCPck`0sfyL z1x3ERiQ%0E){_Z`AQ%4oiOfwop8pKr;@NLka#u8Ww8JQFyq*L151IA;L)60AQ8{o$ zc--_kIZO0}%J;P9Oln3Nj&J!m#$89GP@N+eqRLi__{DdHHCtW}wlJXOpGY!(impR9 z-d27FSdz(`$FdnZN~Jp-u@CA5Ib6ShL`94afX!m5Gf)8f%99~f+_^E9r%*&);$YXk zN9va_inkitxOZ;Y%p7Rcgm>dGm~i8BUGc7>ON<`l$WPJY#yX>}PSMWjHu>ugyixj} z?sjueGK1|Z?0fpG;JUgc?rGY1s}z7+F$!vaKE^?NOu)hRK zr>{K~*qbj3t-a~sVI96MO*?u0jEsW(muSKlKchOn=zW5Twz|hbd1h+!MQQ;PhOd#= zHU8@n^13E$4;q~NL!#-k_@d3!+TniZb!=o}jTFYE_BZ6^aQ`J2bapf!Cv`k*<2s3| z-P;j<+Pa(J$y_V1{7!J|6yD@MoFn*Gr0b~0#+u&Ate+NRbYTo*_A8;IZaz_tdvdJk z^>`B(eAlj(pEV?%THE7z;c|C5T$ky%zB9L>eG{@T=Z z{un{IeCy-hvWX^~8$pu%n#M0KcjLck=I<^0E9LX@-rgX;y$dKK^e+Z3;0MAXny)qe z#ihUN2p9Rnm1)CtJ~v7xpei!<-F#-e=|u^1AfR_-HP^WcnPU#=_!hm}JHH;ro!UxV zFo@P#z^)~)gYe^`mMsx`Y?a|jU0;{@>zvM)KC6#Cs)9GHyYkyUb1}b%b?_!XU&G@O zAi}C@;1n<=v&zg5MRCGG-6wL`0Tspb86zgq+hahjRUe&aD5N`IK~uukXcP8MM#nH6#) z3iCyH+C}Weof+&vnAKv-akpPABsV6}&7_u3WV0e8MT-8qO+FznjAKU$eD_8n_w)sZ z+_w4EZhqaUzl!cMZs7>iQq?Ez;%kiEJJyLkM)0eo2A?~^7sm58V-Wxe`knb&U3mjrpa7NX1I;Q-)PkztUFSmt=Jcy=}F9 zpI|ceoLwYwgEahO8tljYs#e=jmTF0XpPqr>!fGV+zTnUU|JaV z60=6LdH?I=AJTdSUjjRm=s$r#*bURTn;>9;3k+9? zXfPJ}^vyI{V2Lg8e83W(S_#Z~5y<>df#g=(Ba{o!aYH-;C2 z5~9xp{d7CV{SEPM-@S;XhwKQ--#$wtmyK5I3p9oQn12cX(&;|@17PWC#|N;VXkgdr z0_+d_?=yX1`B-NMfQUAy#6jR3ME_FMy=A=!M12nAV*cBYO1`O-%zrzt@J)NFv(o1x zy68d#1~Sb`pCP~fZoYxC>v!XQmG_KWu4KDfZ2f;RvM7-~^OM&s1cMMNFUB#uvANtW zg6a$ZYkh#*7kU2@-S7!DFGB*^ybwYBu@b(%3 z)Esb%RW4_z&E$H4Iqo%3Hm|>=bYos&&HhNYSgPn_zV&3=6!0NTtW#;Xd+!Be{6R1y zStW+^3PAD%n?ZZ?xeR8SFjrnKS}Ad5%F>g0hYwCt*Oz~A-Zz#ViLJ_apDME<|BX@s z+`=(E5-~f0FaCn`zg}kA9>P}OeE`^Ion&7pEGu zNNDje1JCQfx({c>+Ka5SZGQnWZ!p!BUh~Oj*3JlJd1H#OxJ^pb?_$R`83jxAEg8i$ z^&<3!9W~V>cE=Z|SP2x~`ZZX`tu{x+rY?fC63d>~9h0MUP-<(ep1l6cFdHq#Ud#r^ z=y0L8tkhzWW=5uZ<9Igw1CRT2*}K0W?l6l@UV|XgF=F%ja7O??Mzm4DwS8%;m7YWe z?^k>(=({?zPZa@SmXjYbQWsTs46<>EAWT+rRdP1H2lXxrEARB7f>83BMl1bifx;{| z03ck4fu&5PIdM_J`VxX31+3eh9K6=05fId3=6h;Q zR#-{u!iH~Ji)hPM=3*I}0O<+Kt3qI|Rcv{f*8O4S9!F#wGH`sI7sz6N-Et>Kb1qB4d4$D+=GAfhqC(LRon(R?RwohSV0up%qG%V^Pk`XyFi9SfC>)@lU1 zNmuL-&|Pz`Vnqu$rhuQS*bF*0H`fL~1p7n$2xG$ENkRjAx!Xwy+={~fyk!5lJv=Tt z>?1KCy)-svuff7G1f${dh#g&uYo|T%ha_=mvc^uH;Y7J@Dg}O2I3e(_M*rj>4i!tZeyjX3>;m zDY%?-4Zf|vc|Sa>GB4MiL!;^};!53_U^Ta&=s_GKiCdA+Wpj!T%eQoeFT>Vl%`|!a8ff_&Odg9cm4@Y$y*`HCh9H(8$A2##jTc9mB(Qms+z7WG=)Se!8_a*eohTDsM@)(Cbg^b=Bk); zUR}&NDzs?)oD={Bb+am}1qZHek?2CnW$J$>kY!Fn5HSVt+Odrag6cfcml^lCQ zb*!@jUvougBWIrkr^J+ZHnO(JtCRJWTI;TwGtRVRzwfsB4INHhBr{eiu?jX0k%}Swenb0Jb@(aHxM#4E7-lW2Wn)$PPR1r@)~*wV8T%ECkUfwPU4^3ub)AC>(1S&48dNU9l0Wv8&4j@ z=-OaBZDM;+edO72sB^|dg!uvrvqn@$P#{xFhZKou${~u5^n^OTT;|S}_-bO{RF_Q}RfbPws^ggXB+@vJtTq4DU?^sM|a)oci*#soxHhkAI~= z3~Q{62dvQ>)|h-T$mkfIJwYy{o-!(R%}bR|^d(VRPe-wk{)Ffmg3To?;j6isGA==y zlVli&?SZ>i1|Z+5oLetn%kea_&uj#=$zB z@;zctX97fPn-9>P(stpVfg>1&1PG|+L)cMAIMtoB(k`Rmsj2yV{vBzh#TmYXcNJAu z<`U$$@Byp?Tm$(tFJd?B5jgjPY$Q`lV@0#X%pXUSFSA))B2daixQU_yp~8Ly&F2C9 zH{f3s_QCfdKif+0Lv0L+oU~!{AFK^UdBpupGL!R3F=Hf6ISayb6Uv2fSEg28U-OPx!>!XUht}gHTU+~74XP1vBeIC8E{~R=WR-wO# zl`Yb0M9cQs{5iEkefpC8$V$J(PSCA=y}BZ{qe2!s;?j5%v3GG`{3kX2q4O4I$Y*@= z{=^5vAK~oy-=uaOJatAayMNb0345*mFSNR|x;L5cO24hT$84qR3d2uTEp6V9q>a2k zIlK_({oPx6Lff&P*w34$pVQJTa;z)0aRW#CQ(cEyvksscZxE#c z!hDBs>e^*xPir(QZ)<jA*6)Pwf{n%hRf64^7Ku4x>KHp@Z>&<%H!`>Qa9IB-uyLDiJ9+B!)H3f zpSFk36uq0c$r&Gsik-)Q%O_kHJkY6Xvquf&!yIS)K-`*{)y<<=n!dtZZ#i*TM`}iG zw{>SnHqzM5!qCd#E1dDQDBjHk3CJan@~uL?Rp?q$)IJ-wL7Zr$q2`lWvM5Q!L^jge z?eDXshrdeuq7`+wi_VMkP}pCzBXw|E=ixQ_GgnJ!$ihMq_{OW=`*BhEss@WLe_GgS z>8}aPmbia78j{;ff#V>Kp0dK65qDZDxERBIcMSxcT$f5md-eNEnAN~Jp=p+ z58`Iuz#Loj+x;tSts-TIb*%7ab>-zATLmrx6Lr%MXka1MEq2Rt0!RAV%k5QRk_I`) zCo>;e>ED8_xHG-N={szDBKw1?2oa!|!K2%v!`4eW?Z%35w)R_Ldv)r?%J8ZWqM?)T zwA$W6+(hg*!lBP5zZ)i-K*U}j&0b&0QHjXfT%AvEzuKnVQtgc4caoUFRHN2=;q2JT z`gN%Iy}~nh*Bl24XT1X?qq4)_W|$Q)ij}??2{$r(^5Jm;m9i&47I6*{k6%X4c{`_K z86N#gw)t>u_a{FV4sq-0h*wY#Ge6-gRO=tj{-A$2ds$T^v}wv2x(-*a=6Ui?`we2O zJM83Ad)#t&9#cT5E-LfY^p7h#g1#wnL{4&P*dEs(4Y4}H#hh%heEA^l?3%n&K5AP_ z?c{QId{IM3(GaaHMHkh8q^9+D|D&Rz>D5!JqW1J^;WWW`gfj-m!~d1rd6M>8`UBZ= zw|`MnuYm$-gXWeeo4QBY{m+huuGEIE%r}(U-FxcS3;bTWofp?>dv3>bh4IY}+Okgz zr>0l;zV1}!dbyU2JdI|*Tj?ELkf&k!9V`0X8Lh5@M!619LitFx>TUTg7>|-nV6}Do zANeU$C*HIz-UNO+VwJl&oXYT)M(P)1=vnSAo*G8qV>^gFI?y^ zioJQXQ(1V#S1C4t>CjlB^S7B2cOcbJ92@bQ249^1}44`e747JqN?wu`19m$MD+&gg&L~{ z88dPpuo%W^03Qw?>^G6xrS+$tQn{K(;UB&$gPRUP>f~pFF*ct?t#+L$RWuM?YGRq> zgiCersr@9?v+@X1M#6rkS9td!C)>pX=gnqFCJ^gpp0J0M2&>eG4HyBJlL$}#Qw2Py z538;8Y912KaS7+^Vc?FE$u^!^T7{9XN>aan$X5xjxRbwfU1(aiT|%WucKF%ihMT@1 zYVVX#NK&^$&ym^MQ`t}>KkjCoi#jLFVgrdFxa~Q}H*7se(~eU94u@7x?ibFUkFnwP z$@Qrvy&{~~NdJOD7#hM(|Frl+=0=^`G~#u2IP|iWI+~BrB8*oh99q_Lm$sv`t)WP5 z_T^+|h1@r^yO6hqrF0F~CO6}X;WE&r;G?rp%R3Q=gSIDQJ)e%Sl|0Dylg)`-#7ZP) zv?FT2o;~?MxjdEp_rw3p@FLF1GsW&RiCvsM?%AmQkF-Nynl6y%J2jD)<&_2Cft zH(Qo7sXD@H2Mb%HUS;56Yvk+hf77){VA;uYrD-JeS@R*;+QSuzwRh5sU?UuQbIN1R zI24m4`2HL;U=Jj;UGp1yI|}nUHjK_4q!mT^Dsu z9xRhpSMd9#5WCdx<5fb-dNewW`+c`JKWx^Mk=d%V%|O(ju^~G~`0CCu6U?n+DAbrK zcAIEuN6Q*dj(vdUHvQlqTCK~#9^4Gj3o`f&^eIe+K*q5ZLwS;8fi%Rg^2zkhKhqI%P zirSw=?44mN-Wgu=-lDEPvANDo6whpcFV!z2HiH&c;fd|;7yppS%nOGX&ct>pnfqma zd|0Lg=Dz@{g6WKVFk5wCBs;k>8>^HHCYn~@e8~>Km7_;#j3jd%D^zW@3Ezo`I>wWX z847n72eL=mk!Px%hR~~%r;6xJpTx(^ib(eQqrwP3E50+lW@C6!cOSH;5zbA|0CHzD zLGR*9iq2QPA=>W7fmpu^*aj%k8=~#GUvdBC%zq*xW>~k3rD^5-65Gd|NT`L(c@Ze% z$vHM1-pwyoqK3>>{$Nu_9QMc|hA4E4Ee5M2i%Xgzp(t_MiIt*PjI;B#=}7iRaQ5zI zo4f)>oW4ATbLvJUBOkE;8m@M00os=f#Q@E5S{|fDZ4j8G4YA~)o)cP-`2TKf_cYg4B?9|tBx%gFf@E>swj8(z>iWtEdErUDay z34Cg-X(cDRWJvzZy~=OlIa&~m%~o3&V7~_=>D>$+rViNXKGc%Ij^eB>c}Aj=zjAM zKl(`Ej@r0nw53RVJ7UAS?m6yao>5n-o;>D;K zPc0$no0|&z_wLuf7siAt;wI`^J{I5g>Spc?GW_rK?`0=?i<8g)&Qfq>z8h_Iz{u)C z7XwBP45wz)ut5}aX!Ph$!X$9E(h{#mh>S#6WYwNLYy~@7oK*K9fjMI&CT3ahUyyQW zLMMq@DvqWBc7{{x-R>2SV&~OIR#N}nnEbo4DCJtZj+I6!2jda{kU^1;k$L)NU?MwF z;#UP>3%tK8@3#UA>oO~?y;IJmc84LJX2F(_?1T{3WYEj8gbh%$cpQtUp;j$|Orrr-sEz|6+t1$hw*Y@0@fv zs~9I^XehwR4j(7O3-27gZ<8b6f?V%D#^hf52r=UYW@LUdq;Kc>F>b$EVwQj(u{k)S z_TAz`QZ|V)cs~xoSlKuccXHgfvdvAx&9K0mWHDwoMatG(FcZ| z0cwf*C6v7GwA2T^_%*d}*yzNV_M>(SJIt?!?Y?`MQVLTb>>MhJaF#Zl{W2@E-#N;P zuUfQ=wdYf(`N?Wc+PP+ny)(1h$_zx2!$Q#S6FV`dI>|=xSI&NVFBSE|)LXP>lP(qE zeiyV=>v6)X<~Rp&@**6uO=vn2+c#30K7$4d7#}67zL*wW=TGHTLTOUCkDgS562Yq-y3dZRJfuRTU+1+Fkb@r11`SlrA zz*}g%$jX4j7F2t`m+eK~9xnUscX*>j_hAWufCkUevH)>H5fF-%XL;cqBsAA?|5}@VR7^>RGhf|*OWvui2WEF$h?Hy_(nV&`?2KQu-v_c8q6WlxmY}; zRyfpH+k9lcRKlJ(SE{*h4;JA0L2)+cgpCZuj~ec*8Z5I%0ElDVs^Xa){qBjJJ2y`! zTIuft5G0u&2~EO}=fA%glLhZhbWCdZ*R0HJX@_Fl8>^U_Q9eq9ZfdwZFt$8MKG5@1 zU0<`($KYWKJ5_^oN&H*i^3GDOXr-kJV|qgXF>&(eOs&jo{pcmNbV6Y->ibV*C|sUX z(JueQ?W1zb%zQ;s)Zs7XrGoP_>Iu_2;g!T&bfmgs)~xX&2(t$dc~Ja>Rc(ZOksimu zDe!X(QboJ`}apHw) z7#Nu$8f%&l$yadOk11vnNwy)GZrIxK|9PaQvD(x}c@1q4&oYrSZqt2+EFf;;+*B9r z6Q>NeGIDm2*(5s8`A&_MI)!%x_+&02qAcIN&#Nq{d0rh>0)~mh(e6{92~I&jAe+7k zI3_upnFde*!Yqn6`2#zy7`%zCnsO~V*Ik1jjFPP!AP2I!a#F8l9)#K_wG;eEP6J?` zGRE(Q$)=!{_QDWbPRb8~2n9j8Xa(1alMPBrgd9$+*>dMxg?9}CBVYQc60jHwFr95+ z3IM8%&I5N0*|XZ@yt~Q=e`+;fC+%~sQboJ`;|-u~wNvH&uj^DmOzdzkddJATr;trf z6nA}O@IWj59bAiHP8$;nF|k8WKud!%^Su`+80h=rU+%4Kr}-po+vlk_00sYFA90q8 zCpM0!&uOgQu@YXaBl1Q(v9Nb@)qWH|0 z;(deeu9^c*2()IYp*wKlGh867z=pxCmA)CFCKyKQiKaMgwRq*95-AT~xY4zSC;p^p zo7gdIwNRgli6RvlTrF zU4D2oD6Y`fYe`uVxKb;9xcm}O=(*x)`A6V+{7sDRxWjKfjyD`wECEXj^$3=H@D5e5 z`h51*{zx=>2MPrsfXdsBjU7l|q(JU%h3IY=dT;o%GS~A}#+hoUuI_3o&Blg)q#^mlAq)@TEi^#<3cguX{lJf6w zUG#VH(8N1(EZFkbn^M2F7mqLkV#k>Z91(AoM;kh)98e z1_4b(xfm!&^1er5h!S19e}xw{taO+>hs^US@_eFs?kCUUvh4}D{(0cI=T2a1m%m;w znrFG4=e-W`?H3V4t3TWiP7^T{f+C)z)DEb|Oc5rO3GaT1a68i|^mpjmHLhdW3K>Rz zZs^!UYh-#x78Om8+p#i;EY-={#t)f&FuXWx^N^Qu(0PX|t>7SkeoEtI4D_qlw9Gti z(!;Yi+ognbBMkJ-o*76Gj8Ietg2EGo--K(PN$)j_sd`5_7xrQ1=?+w05PvpN}Ry@=k37Q)!raa zAIXz!lDzkLD$=-p|AH7|um??`1lc@njx{`ffjmppcf|f!62eLlq^+lt<8mpR?I)Le zt3)jy*3muoa&VWHJesL4HnBOXne084(ZjZfXKrrgML4y!HJtkA0oJS&SP24eTx`w8 zhcCSrd6qeV2{M14mH89%mU8{AOcmuY+gj;9@<0&oSB#$5@6(a?1@v?oQp{+As#q+6KX`F!Uq1S9mGnkEUNd-~tFmPkH1niMgY)qSR;XCQ@3hAbW z4{(Kfkssd%m9cDePG?kH;XJm?4U12k^-|AT616Jb(6|s7_~oPl&WZsD^l7z~)@^+# z%!xNGl%3xGl<2Z7e@Zm>-t{twmUba|UwRUw&uC-x;Y24dY&{+79(ULl#VXUBuoRvB`cp z0T0j3WX);eO_$Ggq!w`2hN#xSQA&pGNxQ64TWe{GND zi$D}#Q?eK|<_pfOy+QRtj$MFqDI6-+_47EB>Fq>-gM2d|%;j`q@{%aY)QzJ3y}}dz z*&AymTc^;F0~&*e;H5Q8^%QTqanQPrfb0E%!i>lG%M`my4R+0&f*dHvbMqag18I3r z3HT{AEJLm&OEIiejNB1xdqnOp3}5wF#p0)!WprK})D8Nzz4SmF-+xrFAL`4qq> z`HXf*{+%}@r4f+J9cA?w98;@C4C*UTsUhw#ul=! zO6Ik3E8W{zm7JuDQY|Q~GRdW@R@lpzxNH6^AKx6nd^m*ul$NU3NK5a#W2il>Lk@y9 z@|QmWeVy?W038E-Z&E%Nb61|enwksKz>EpSLvX3p8QmyD7aV<0Qch))8{I8t$Fz~y z7_K54BjM7g;Y?^b2Dc{;clR4r8$4d`dmke+~0hEa?B*|%Dv=%I%jkD z)5kGU2*oVJuigc6HUwE{N@Y!YeTmitIx^y z7q>-4Y|+ME++bGyCF$p?IVi6ATVtsYIEMCV^Kr4JePgNNuYyp{dBV#w5I@WJQHJ`8 z*O5-u?A%7;DV&PjTPoCYtKDxfgd*63`8=#+`{;(&<|-(n@mB%wxtAg2?8T~ykY5ao z{@5|wM^v{q_j5)zEOM*yyYwfZ{YRo`~M)K^^DJBDo+A>jU&&V*SGlQwDs$U2vq#kUgxFjEnM}U_ ze!!I2YyabzQsS#CNI%I4FF|;z(<|)hFL940^$QT&OR|lX1a>5y6W)LfEgzFsbM``t z5M-Ck4qlcUYu0oB7%m}(yV8Jy1BIaw5HF3zte-5tDsKJcWrLi!-S;Z%$BX1lZYozv z;>5ue!lV3Qb<+7p>Wl8?CL||$>;{7iEL`l9-*o$cAnMU(%U@$n>#>`?6Hjfe=6p1I zZ7NsoULhi(bEF_&EJ-cM?T_7W%S$A+2FMnf?u8$DT@t?+HkTle} zzQnaI@+lidf)X=qM-i@Js4mXGQ=;g*NL7}tMF>`rVrvDm?lFyWJzGl%txJp4_r@<4ov~FQ4%!P2KyY|&Y`p#-AVa2^ zbz6oq336*DoY9P(4CtT7nnn*|StW5wqJ9yV1F(s_A&G)o!%Y;^uao&I>gs@a2=@2| zwZR_V(2nNmr~w4$y5GG`_=l6H!apxdf$VU$%aUjuBrkU*-w6VKdCVSJjd+RJHxA;l z22zxU-y6P+r@lONMysiwAiL)!T3c&Mt=w{dobJdr(`{~+$`PPy#|Y7Z`*FE@9N%!k z;qJsIL2x+H+RdlRJu9LZuzD)_@n;5*5e(}C4CtY>XedO*RYq%CdHKHgRO~?H&5poDq12q5{sp^%)YbyV3VH7>^A7?iuRVra&aJO(^4F68T z2|<7b3Fn8^!&Vfp%w(Vxm19tz!JyC2>jt-`@z^GKwbb(@^<}7Ue-U~`;^hBYAppJ+^Id)3(?e?PW zBfx%oyz;bl=OXKg72Y{op%Geb0rl=ROgSP;y=&ktrGq&OaVbBcj^E&717=8GqPn|RL$BiX?tMPkT#^9xDS zpFd-M9pmEU{ltn~%BPQ1RdG`f`ir+D{&#uXPOai|_@ZA>kA`!k56LYo5(g#mm~4q; z)r*m%B;j0-cpukZKEX7KU^>SMu4W#+Ps))Ulh5R2gq1#l1<;ryWFUEE+{*m7tc(Px zM(pC~`8<7?<7oM0m!XxGBe=n#E<0wegbm%Y4%1$$>n1C`N^E@2*lLzuBp}6+z|jTn zF>nS)@y?ugOC`}U1Ed?mJ|(awG@Ly8hf^yd_Y=GbMg5S+H+hVxrJ0l^#Ih#mONYs( z@wL&=cvLPK81L*QL@&>?G7^F&*-b(_64uB!2{P#jr@lDBN^fL#O5FMsVWNn=BCO7H zicR^R-_c2QUg(H^=xc%W<@dqCk;UQvkF$4ykE*)*{wI(?5b(qbii#RFR#2>Br4j|3 zkpw21C|>YVL9KY9S}!dV!6F)%8R0mNV3ighwWU>CY;Dz6ZNLHnlz`QWc%xqNf}CSi zycGge^8fzUIcH`vLA;PU&(SkH(T0M){V?&Dhh0aOe0RK7A5$1Mm);O*=t)duGnn05DY zv}A$7-}o4tR3%Kz^wzE21bXs^wbf^_``REtG!3J82(fcL1NpyUC%Tj)kDVRDPDuxC zk!P(#9mP}I*;P{96o)92z2entoH>JO8Uk!-i)oXh)=dm>6IelYt+KTIA7URye8LD= z`w(gJ2SX5mzm)ZNGAFA%+W+M>-9-F<=ybP#T|K$HVo?`x=j zJ-G)|=zl^>SIjkUkAiyBZ}Hn7Y14)Li?`edLi`ue4<^S%4NTv@tR|hzEtC?9{onKO zzs<+BB{r8f4~dB#(NuJw-s&qBG2U{5I=PBYBKp|3=}BG5=09zpzo*Zq@!9(j10-5M zqRK(=M(>i9QcPPD6IYXufnh(_YsJ*_wHev}soRJw$(7dd|9EP|%(5vHInm7fZmHsk zlVJT-_TJyMb4p|x$#g&%&o%H`+0UNFFdaQWh)=kqDpE{AyJ>sOE;qU1cJR~Z3B9VyF&?K^>$#hY3 zZ2P>zdWd%hkHF-c;Q3()kAF4Tll_u#&l{d_&!~yk+mY?en(t-FQ&LPcX0cJbp5`Mc;AECFa?vsLL|qbC z2SI2LQWWH+X*wXta62-jfMhwd?SF^5n)M}efcsPU6|`#EDB??w)Z2ILt-N*q%RG9q z=}KAfj=zl`QTvfg3)=^|BHs=iJHXp`gI0$lm%ecz!s(rc+z`z3S~Br-@8j69`2NVA z6Ix%P+zJk+>ADf@)VI8isEKUdTU|;uYdm3p%135hzDSpLT+mZKAzD6&It2W4mzliL z7ZMyWo{-B46a1O)3BURptfK;dYp|ZQl~O&1BfcGzIThZ^e~|%Rr}aeg+&~^+k9&QB zUIuZ#gY&MR8^GKrVXMf!X(b17e0Wq4-+uz)>Nt{@x~AfdEM!wpl8 zh5is;Jgq&Q{M&%ftQCs}Z~v?G!cs(1Y?=OPe;`OF_Jq-+;j56`L9;!G{CN%8pUU24 zNuXm)buFyv$e7kXmbf`$-C4@nGN3r!6v8b0;&~91mH{6J_J8U>)05Zhl+t=c@(tgP z=NhUqscj`U4Acc&)o)L(4bA(e2M`XI$J!qgyiXIF2gNC)BKCyqE318l_p5EZ#Lbb< zx~7DQHV$HTtxEepg7LFn!GD3sKXu?^YD%*y>@arV_D zB;e16>>yoWkebYvRJ2e^&qGG!C&X54gw%#Bw*B)Tf=j@?;T;I|@Ye78l4n!fCN%vi zkt>V;nf9y8E`1xG&swL+eu=K3hv}gXo#Me1Va1o|U+=0%1>L*=gWaHDl3o$f$4+u3 z0B`AzJ$Eoe35Uh<2cARaEtWeAOGms@L*2qQ5SyzMl&NobUp~E}Do?<@+_xdiP&;ZQuJ1 z?!Sngk%UO(mW<^OH*4bA==9D;3vjQso-;%#Vj&!2ShPakKW?ta~DNTDL;I z6Iqjp362v=QY-twS=Xs@^~$Do@RcUCr9VC8TllM~&4xC!b^}1W0bKu2eXA z`bSJX!O+P=f@?{Wd*(}cSAQLvvGLTWCFBqcdZ5#v{(-ruF1zbr2gd%Jj}K&dD2+~h z`b|{>u&MBqhAim!ggXHyus^cKuQncLG1bxCNl&D%8QYKW5Te^ImtnchHpDyLq<=Bv zuoXma_*dJk))w^(;ex4my~9uy0qxGdo=%mZgoW=CQPt2jn5o?LrT7rh_K-aVhB3VM z)P^XsEctD#fk{Zop=-Q;lnq(o5SrTsA2$3Bz{4uNCI|vTmM1S&>sLXv`S2ihAAqi7 zzr>A6V7wY)1li6atJx|4JdwqV2Tl)uAT7d+@B-mqguOx}w zwZ9zju~BLuNrLMfB#EOrKwEF}K72lc-+dfjvJC&C*KBVaCxg_@67Z5?XvTZ7N<{g= z>!V7UAsBE4964!S_GL9vJNr24Ef8^`rLgvUuSd1hukqdY@$0f*3w_Nn-g0Jbg|e7` zblR%Uv4cRb@Hpo^-h#N}Zb?mf}g1&Y&vf-DwJdL)pLO{OX^ z1p4y2Hef;XpA#`H&We5cp;Of(ajFFPd1ue3elqO-nFV&98Q z{vW5px zwk+cbP9Sl+0+`U|qsqfqB01(OtjL<4l3Qwel@e)YwM_xdNR-E*D+)<#Kr%AApvHvT zBlSn&yTtz%7%i+B z{n9&x1x7&hv)?lKBKg9$wYWVuRmTu(wJw%r?|t!jRNlQ+--COSBE+B6!%45TX3VZ~ zG7s{@U&=qmxA7(S0Ixqe`fWQf{=tDLMUF*0gU@m3nmo$}7DdFlVE|~rzais{^?n8| z7Wg-P06QXnAG!(n7o$X0R9M>h!Bnoyo62SS5af|9wyZLbN-oJ_dS2nTp=NO3Ag>M9 zm}lH?neM%JmdZdQQNy#|2X9+1W~;rsbao@@WR|R@R}sP;52K@l zsSo?Db^j#GhKnr(C?}P<`j|WZ!eO-!oh$ijG;|DPUw6`#PmEz?Hw=kR!Ow8^8#_mWpbT$a-ck^F?-2X(yceju}}Uef7;g(9XL-l#{47+ID+|! zgiZ292+72Q8wiWgR1eraK>%_@`MKbR>_B|@FN3g%1f#OW1;TGKB#RapAvXT6rlsE^ zaq0dWFG*-fv5I1sVl;UL@gCLrZ3fSw@4UdP#5$DVd;gXW1SN?mW$I2#vSolbv|ArR}ZMR#rkcJlz{9 z!N$B@w&OjGZpJEkBx@#WL)NMfU4z2U&J!twoN;*U63wzsD9_Ubj+6o5X4dn_&ZF0V zZA7A(SLiI7HJVf5}Ha z3CJfK+;@htyN9lEckL&07todoU;j=pBmYByJ#VJJv(uj@_+$rx9#TR}CVCgVVWYC= zMxOnh_{Q^t6^#WZUHrvpOz8`GX>0D6DT=B^h8{+5{%HLV1%T2seP6U?m}LHCpi>VNTf?`1}ASiS)Mlw)&~9zkJR|Y}cNT zXauH!%p~-`fXa6xIqGDxdA-<+2*pP~z)yATOJZM0qBc8^g+1dUc=|Q{cDJIrLc{qu z#AG5@HsM$NsV=+ug#*!=a~QHTDk1!l&7GO1ce(y={@vhRdR8>{%N_*Yi})B{@;{>0 zKJ=`FXjzjljqZOiL^OGb1l=<7PiM}DfPm3fy()QFV&WHx-1OxE1CYJYdy0sMfCos# zc>7{XlAiH)Ex>RTIqANyDi0{8r(KNXHbB;PXAW^1q!+k0pUDg2#DWA z0jMNePk(nk)@7$Rgg@c3+W!YrN!57nbQ0!o30sJ&e~;?_|CQ9MOQ@YUGSdk__OINm z7R%nak3ZFAJN}_5I8fvfOo3l&&jGu;7A0>o{Tr}Skmh1PaLoLN1Iz1!fQ59)C*ot1 z@+x`nwoK z>5eWk%{V2`a8j3)?j-X{-aPZi^ODuJh@ij{FKi4}r_V|xkm^NWO`N8;(Ywlpl0b{N zt=_M~;<%A*IKEFQ=Eiwy`f@fW?_$Eh;QV_HgNvRM2KT{FvMUjH)4N>%eS(o~J0lv| zuYbeHHfnW<@wNU_Rh%cYIlCmXM!5(VOElq{k%~d;-v%eD^uW*fy98)D{k`n*=X$)G zHsXtq(_;@5IL!^<8CEu9yt*3~z-#6g7P=BLY4%>4g>V^~rGS?F&at_cJ9kjFTsdcs z;X45^x~ZY*Q~w$Pv1G2gIaEzysRdeoQDE)9vsizwW0hoQYZccJugI(;kwmLaq38}=xx`tsix*xS)jUS1v_eAx(+IlCF1igo&yfxLq zHrNA{w*JYSs;D5stJo&Y@xn-2;*ZE7^5Ks(4@P8p167JX_$Nz{A33MJ_&X* zUj|HSGT4IiT_3Fl?t8!~1i(QF?~3<9$3%gaVDGyKyvz?NWPU2ezkDrxraCb!H_}_S zX`$B9zoH{@sy&D~&r>`%`c>*X8SRD&ONzFMJM&iItKTvvm;4^Gi;JmT^m;UT7u)1< zxs_(d=FaM{gD{cHKeX?P^>n%lm8_<6!Wo6l+Q|NIaPLU1`#L)gt@-`UMmnYeeHTfH zu5zL+uHz#9V91-|uf~O1i9aR~okzL-t_eGqlxL%lHB|OC&;!ak!GLRAXm~89ERmHO z0wp-67*2t@tfRf(1EqW~P?;eq^JkC*k?^l37;BjaPD=zc=_^gL*(dpZ&If~i&IkP- z2&F6L+LniZ0%9<*GiXZNvVwc&HXFLQ^@{t>U6 z&QK3(o|Vc{LF64uC)RcVAzjdedMl1@`WA@eL^7&wQdd8>Mb&6pCbT+_E(Z$t^dXuv zo%3YAnzxKDuS|-#W>?3@JGUQbukRG^HROIYiI59o8M!a(Rn7)Hhm@BRr10Ff5^cP+ z#myny7PsgLH;$vv4l#zz%l#7;$u7DliatUy0|dK_Ps8*^y&DXVgJshf#@w+(99P)| z{R50)@^Zo$)c**fn9Gy^l-%+8)WK37|zUFJD2@y+OoI>%DSzsX+I0N;bQPyHB6 zO}@#>WvKqX{1wiPWgv`Ncj^$PY&Ix|emGw-HR0X(0=tJRX#I}w8rJKYiS;G&YixOZ z%ZkcmV?*}x*@=m4U9D-%mClgAZM-6wC$)bYIoO!J&u&C&%)Hs))V^Dv8nKe;xk%ln zmY3F7uTJ(&Of0GX{N~sEdR{^RP^X1oY(zTH755mD>TOR9f~hY4@*#1j(y&NHu{qjGXs|ZVa7vP}_gQnh010hFp3C?RZdlnG#^XQ75p+FIO;lM!_h!@>4KgLBH~YQOq4)T;8L z#@$9z>C_=8mHgC655~in?Y^)id35z@sF~a7v-&hLn(T)ohuBbM9T4@}|G6(OR%nx`0MiJ^(_1uTti<^brN^G!^${v%HH zuVI;{GyQ8Q6v&@E{%oE#!NFWddiL+4g)Z|9Zb)DLqUqP*=ylT^?J~^^5ZUynfX+2A zCo`SuWS=f+fA(S9pvnA)7aF63YMjiyQ3=J_ zf{bp^;iFNZJ$VPPsAUb|`-$qQgPfV~MKwN0o=}7REz5Up9V_~A%QL9#X;G=?>n*WzGU0GfigcP=H=so?{UcRY@;hHH8%u4Fvv5Bw%nG9O3uSjA^a^mWFBWUj zKmJGg_xW*oi(i*vHN7PYnAMCsDdDHftRKcP1jL-lG5XXNW@xztbYUO#E);MV%Jx@F zJ3tS4rZ{sI_=%cYM1-jic^x(8q?f2r7oqXrB6BEZtm*<)En!U>3e6gRr?w4l`n^9Y zKR)6j>+e*mp1PRUVniMdu(|}q(-B^XJV6U)xQ4iHHH*{|(BrIFzD%m)C@0-ZBa#G% zaO>OZDkY#SuSy_q%G{rK?XUd~ty8jPhwK7}KN;~E$uEqk1%VAnc-2nto3()rSc_Uy zUx4bQ6{>8ZDVJ-BCbl_<&jCJJe(!fX#9v)@;?r7wS5u_G$h{%(j~R+p(*7UvknUu{ zYx0oLoM9MzSJ3BLz7v_u?PDmHf#j1D@}z}CSJA-z2PoB$6J)}UWfudRx}ueYUI*dQ zL)y>BG92llr<_@rBPq1aNKAbCfuBZ1;y_u}Xx=U*+A` zbj-20Tb@B|RzYp{Zkko@i6}cNDmIB%-~xf;WPTI1cs4IZnKQo=6^lo2UWDJQtz*I&PdqnXh; zz%AYBV|E11sZq^?qxOeKH8td+5qyWLrcLt?qk>LUP*^CBy4Z%R3x9nm>!iP4WcgCi zUy=OGw8GM2m2(0MB#5HTS2V3JN!`z6fZPX7^(uZiGT0wNUCBSQ!_KfD&9G$bB&^xY zmHckG4e8}4fyLy%&Ck+8xqLU?aR3)up8ji)a;U$|=x(I^%#1HbaQ0X^( zCB6ZE?8LVgmXqv}S$7y+Mj_eBVtdA37U`|`C=VF*B~k>Ov)L+9&%1!K9nei z&n{JW=!`8ZDw5ZwI(j?lW6%o!PyH<1wI4J^=WRM!P*-V#IFYV&f9h8MQixnKj%b}& zi~jKs;#=x{EdC^8R==66d1${?_JIT%=JKB1d&iJ!Pn_5{=AD3s$P4iIaoUF1TlQiB zd;OUv>vsj;w~XqA;Mz>T{wn?ni_a}8e!7Zdq7t*KsR?XWCq3L6C%Q6F4!5%yUXu+`XcFg_9m;5k{y!DkZXKanc48H+_h(IDP)H$?|lolRiG2 zxyW+YnF8xz89;P3j{YS03KoR?ju~Z@w&hJkOVGcX7`jf4j9Nj;GqUUt>}fY!O(39m z0&dbLbT)k@=lnD~&ORt#rWvl5${p0AhdTH2Ashy&8{i*l+Y!@SERrC8E+|~U)&i$x z*{zpCZ)#aKNO0vEpYVDp;_KocumOCpzm1)P7I~2T%{+P8(-qxU2P(|cuW{1fHMGLt zMUeknEdlpT9dl}NRr_&jhlDWeg}`L=*&YxENrQWZkx#U`S|m0#~@IUf;HqAiZ0S?!^P?r+!jUbgJzTX#3rZ`;SZ1sbj4+MfP%3MaFO2a`|X2EdEh9XMX{^vTg76S6DW zO#^Lz&ya-jHkMNnhVmRGspQ{prMlt|8~?wFD@j2$AxR#H^Gm}wh1K!c@D28OtVRF$ zC-Vl)VuvQQ*wB_f`PJo7Vvq~G(dm5FN@cCnoQsQ;)wNDwXg>C3R&Ht=IlW zZ4eguM6Lo096Z?#9-g*6!Y+$5oj(*O{+>_Pr50zugDq`wwpz+d*2fG!XGfJjOn;@x ziIKd}eM5n3ta$OMX8zkXR!vz!wKJF<1ZZj-3ziRPQAV38>0@dQFX(B@Gu@iT>ZNtx zO+yUHIzMT~&Yt!kvt=)(cE=I_2tFofGVec^u@r6vo&YSMz2Ma|&dtMZ*UASflTuDb z8wY}Irmk*E?Kr|o-wBYZ9h@MX%>!z{%#&eP&1bds>r{xc)9KuRuj4^8naGVp3T|Ut zWZ5*Tsdw+a_vMCcoX-@vIx^)SY_+6wFhsOBpT@{2h!{){tM{)}GCk(1s{dySNEM-S z!I=6{s*LSdm0-k~Q_&`NuW+tK zn>&{-r`&6GgZ!JQ2UrB=goZQNk=tZ{BVk!b2HQwr6FdSgZ)1S1WG~?^gF<9C;R)0x zhn8_m#Ch0dCR8)kacq(U`|@KPj}TJoR>TP*$=pZNMKFB70K?ENGI#I? zxlK~O~|DQZ0hLt0LMy=bF-Bd6dobY{nOX?(%Qp?nRL^aHv-{)gg{BVl;y?82g z?PNXztbF(8_INMITg;3zG#nruw*=?Grv6xMYS2d)4U@+(MezczXb(<(Ci~#FAv>{i zYj0$~EshLj$%?#!^DcdcL1+uF1^+K8qHZXo<)3m1F(Tq3A84;*(Ef!y6?H~p;-5#Uqg|dFa5e`V)WfE|1|=Ornl~ zIkS5JSA^vu^~9E+AB`I{BHAi0@m#<)S=q<~*a<}Bv3Dthb5n~q z^=1jhP`n>TmjTManD-55R)tP^5sfkgUqBg+VIp^0FlF)aM>c5I!W(#spw{)qU7=QU zA=EHdh=;xu%TKbBxc5{xj?@m$>#U3%=&qWz!6Nre9PbCR16b+8I}=!aoBxnXq?Di$ zON#D2@H6Sr&YR9>C5G8ipiY$n^OmE%D|PCNzc;<^qA>>X-uvrYM(XY-tZw{&Z)EC^ z*3`H26wLHfj=^|Qw3ZB)tnOBH9 zUIvh&g%#_|<#~hzF&BT5sP5KPouVC{dG7O1tJ-`--Ph4n}(^dZEp;ZpAkCxJW zl^g?IYzg4F?~OnLe(-@lhCKBmKXeVj^nvJ-*I2h`(PHxBNxtN18X`85*#V4sp7DN0 zUjo+ukk>)p?pxJ(FwpVQ*HPG1!8-w1Cjhf~&xJQEDmD<@79C*D=fe>zl6%SygwOay zJNJa!#*Du*<^0)Y!#dj|JQ7>IHd&SG=gS91QfoN5Lonv% zzskbuUC()ku3;qutLV>;Pp<9~R#L;EwKyAw<)z#&dKkv&X!0OC8Oz2L2Hj<+RV1>< zdUw;b+7&@BWZ~10yJm5)ZxSBwd@>l!dm@(e2zBAi@F+XpwucPK4))~^VfkaH-W#(g zV;Cw?qT*1GrR07(?o5a_nTXFRi+OF2tNx7-u>V3v9{(8d6YaNTM{#xE^u-jNUAH)q zt9!aARQvP4z`+7=7K;#)M3ERk_7Y&XPmJp0#36gksO9l$PJk|B6-bPs@K0=J(Ext& zt_@(O$R!g8Zn`CDt`uSruTSURAqJ&0`vR&f|9L&^RGvMhUv0H_%ft2AJrmiVfVvyY zPdcR{IosR&?^tLq{=FcUF*~_JS$H{<{l;U6wLNW!wL(x_@xu$zZ9hZFYb&+p5ZFi4 zTfz7k3=v6%{n_1u|N1*X(ANiRAG0?aCkCf#(PrnC(E7Su2m-mTarWXDTP{M?(y zqr0_Nn=|`%n{TAcmQ#8&j9!&0%L$N9Z_^?q;-L(bgha zOq}-!Vr+MQmG~p*FXx;?B}MoYTc#y`m%i?1*&7h?MBffVot8VEv5R+GjJ(941!Sunp=oiit)Ou4S^fHn%jV>5r*@05bsR?|xZX5SzT;FUi-{ zoK{fP8}*a?JKCca8P8zMNq-?{X>Qmbs&tRdChsaLhoHUA7tA~5YEYtv&ECzwj=p7{ z=9>XwS?A}B}+mO3kg3%}DlXKB8rr1fuyNURDX z>)P8ikdK1$I@{n?70TBJ<*x_+MMnwWx&G%Bm)9X^@9X?1GX1Q4T{Gnp#pQ%rZ$zQo zCrloib~fdD2IaVw45|AV<-)O`PYUHp^CM|sGn9LBD&P#o_I$EM&6fQ!KfHNXY)Me8 z{|47a<~{TGe1W9(o0~)fG$-hTs8rqRox?Wi^#1mTeBm)cYbq5XYhl=ANddG&f+o)o zniK*Bn%Y~f_O2|nw-xtQB5UVIB4mCsI{@+V0*EgKr36e=>bS7iY@yU2gHi_DalynK z9+tYiP%0CY3h}XTSm24L^FzE$1vr2djc-%{Pe2T6+}pR%+6fd6c-`H(tZyYXi+O85 zH5Kxfupq|T{)jPxe!>XG0S_M<@>Wh4eT4)&oo+F{=6m}UKwE=k3Fim}Ai_Y*?)PvW z^oRLQK;u94y4$rO=k7!6n770L8f|c0y3R8a6G)Dckbb;Z7v|g04tgL7ygAo&<=MJs z19uc93aod>EaZJWo345Sl-CV?Q|qwJ@bep$;^+GZK?Ck`=pj}bcY{JR*6?nJYqAAD zo97{31CGyZl$S6!y*RubgjjgH1o1^T=1V?J$wg|GY*fbPe2<$7@P-#k&7+ioT5oq1 z&J#3rnVs6tyR9sw$ghgMx!q@k4^K za9l(roygg-Lt`A!i=phz{C&RtZ_z$ny**=utv2flL;iO!zz101R|ZA|CsVR5h)3l1EDNF!PV#xZh~Fy|=4c}&1G&=R zP8wh+YMcm#*x`~>-SnqYa3C%9T&X)23uNBs0O^e?0QEAfhh?R}6q4n_tBN}?Xda^o zb0j^e&>NfbNIPW~lXk7q{fkSylR<&{Bwoq9nM|S0C9oRIE zMse?KDEZ7g3ho00(~)~aiqetZxj+~hDUWesQW3YL#5_e4$*>{{_inkt77Ll_QI&8A z$+L=TWWpNy8`=Wi=&)if6_KVwV89ED23H2{58|(Pa9Hd>iYfnUr+5E@A&u;znxO~%4TAzAW!vKB(uVA`O6w<} z^5DpkcO;$Flg3*8T}yuf*$2mz+H55lB_weZWRWFEe_reI4ZQ_^W+&dcxEn9cthsqo z!$jX=ryJakMv@^-s$agb+iAHG$AocI6Dz8}yk-B!?A>8F^}0rtas2P1Kyy z>7S0K*HYVhICGkKqf3JjwEghHom0|B-?=NY>9a<6PyZfV2VuM65%M4(06CkzJ)VlV zd-gBb{tIXKi7Q2+d6QMd6bvy)jI{x6=T-b7Ajd)M1lN*?9;Oy$kcl8!7Ed*nmc+Mk zZx^XX=^YDwPba;XxiHu{A-GH@SiL_z5OtpZH?8>nfWYE1*yJvWc_%|-nn!S*d6n

O39Pd1CDlq3}`q6%9rPcszeYQufo9I)YI+^Jk&Nn2w0BXqnNsu7eS!WtfwtN0d`Ko19 zZPXRUmUF=}0{M%vmSM$ryfX)im~2&aGf>e5>?kdi8s3xWLDq~3RzCIFeX^(65$^Q2 zu)jn5adJGh1tk7%$1ji!@tTf zH;Hs)J^Z0G5zrajGyonZ7s&qr+bxwOI|>C0K>436u27d{bTCo>zFUr)lw?C3#TMk_2%ipi!#JGf*(NDb%ZA2dDLNu{+X z!S|W__{GIuS`AGBDDJND%_!hP2|*R8U6|8Q|tJ8agY0?Ok9FBICc>9m1i*^v;*QCcWVDZv_1_O4}%8+53&hg$FaTE zy6WpHl81(D8GH@3_u@b5h(@r~oaoh;yj@#u@*MSowB-;B{TXRgul(t6IQK4aLT(~~ zT)0+XJl^9BMi>!~K8w@{;cRdR`P}9fjw_(|a}Ns@$o-THh+X7-DaDi|f8YB=mCeu$ zfwqVP+`LH&)?YRTq6iqRAH08F8{)I+H~`bDQ0;~`soAF9!l;y!{$V87 z%t+iE+E*APk9j}8*TyNilur${qc&)@*nh(P4=cIql*%`0D68!w6QeTN2JoNCCT(r}sP`5%ugR*#$+Ob`_**zHHyTEWML5U4>)dc9V#_ zhzOipGAeRjW}qc~yMtMer_LxX@za`r6rQm_ZT9AY@fjOqm0B-UhTJfR))Tf_$2t`q z#}dIUN7eNab7*T^@qkDcQ~TatRBOl^gidR%)93!> z7~6V3qrSA6#{FTzZ>&X)Jy3{H4s<33;Jxyk4F@Hcx@5pke;YXEPN7ss$rPM_r1rkK zKk5DVA}vV;$t}uEq{rPc{j!rm%^AuEmA)K!%{cXDU&OE^6@G~xY;dOz0Gs}3;l(t& ze+b5d@iomcVoTc6;O+>Ir`wHsaredc0rD5u_VRQWA9rtXa25;4(R{hDawS^)<&E*o zv&nblvl@MsLNLm$YWwqf-eDyiEM`{yPCk1hgV6NAft)Mt8HzeC#}tL=ijdUiZ!~{D z)2Zkl^i?ojaN~y!7g;c6j@eu_irdh!Zolp70P6rU6dEC1@Vs^(Cz#o`no&Rt3vaA;h^= z>(2-&&a6ZE1!8s_Rg9Q$qHKmrC=jxF&l)HFB_j?e>?*Jm397uw$-JShisp=T0)@#+ zP(^!9MjK)HO)#aYZ$@x_h{l(VU_xnD6Rmu*$byKAayi+diJT?#B*~Ak&%#c7c_k+-gmHVp0v?GCZk9S35e z%6kwPt*m>}eUaKgF~}-QtF09v?mRiUyuo+UWMJ&jfnG5+Dqu>b1JM((wR6Xxc-9_$ z#g=$4=>IMpr*>o#EJQpF3=o#yAxl zEYbqgP`1F{#-W`fk`?hqX+S^%6QlGJo1G!P#0fh83(Z^NjR?l9ExNo)L{Lck_gSTY zg#z<3k_**sPD)q5?}l%UX)V}#Pb*;XMcO8R&rmmxz76_2=2V7@huy1rmz5k6otoC#*#@q6n7q{;&8MUvxAzhmu?P z$P|~rm()Kd zDDvyt8xazYDx&RGxwpl_FUQ$vrd7@#GZ61kpj&!;nE1WtOr23CJ8aue#@*{ z*2E8N$+=Oh1N#=OAeh@~H0kfaAva$2~8rKW4N+{66?1EH&cTx%a zu7FPOz56k8CUzvc2WV0(p*h8L19?4r%k}InHzH z?PR=ha)(4<$h43 z_`pimyZdl;Ar_@|=DpXC3VG)!`yNg48Bu><2LURuoEq=9^ozg zAIQ;F-ktU-aEjf@CkQ|r7XDvYIiQhqeOs##p;xc%K}v&czdLnQ^eqO*hn{Bw19vuM zbX`fJy6?fwIvTsoKK4KLB=V`}hJCk(ZEuH^oXGZDK}NYfk^CV&`*QJ z4AkHF7CeL$4&>uwbQ4;&@zkcBMu|s4A?OQPG6w7%X55rdYAR<3-El}#yXM!MOl2wm z3s_mj7iHD@ELx8*x?PVq>9JsBla>HvhO-ljNK@Y7o?SrTpWh=-PVg$AbN@1`h3yQ- zSa;Gfgh+mtSr5U=wquP=VEW?`+CUYHEm0bJ<-fp65owk=4?OsHYblX>p~OFgdFG*; zKY#~s*!~|y{S2~xo?)Q>1+RBHt@{u2DTHZIXnR(Ee0vA|Z=bRyL07%-S(l zh0Ft$sP(eJbPgjuJ~yJ9w{LHGf{bay%81rR zcVA9W5d3U+UPP`)>ugmH+kY;0_pK-pYoM z6RyI$1#L_4GYnaQfjue%QENPrq`MCe>yQEBZfTX5X)&TFR4-AmMQdH0)Fhb;w;aqW z_1fu8Ms8@0_JcGK{IoTQo(N8q$>~o3EEV$4;UVF^#Am_2^l*b_legt=x?7}Q{&AFu zFFI0>NAO7C7RwX#yZ4t2uMXTO;ew$cakD^gdh;gW{g+O&5hp*4Tvk8ZD)gLL;qQY^ z3mhokkEx@&m+_Z?Ja0UIx$+N+U-6+~#(Yr7p9?$tAgMNc*?|3F+RSXR>5R+EJKv<= zQSS;)B#XA*{p}n)cLZTE=`2Pv4 z5bpv z>!i=(iD2P{boy8$*WGaYH3zL2?X*|I(M~;HV@y?-H)U;PaW2PhP3{}*yRbton#UW; zec6qK2mYj@{pWTbyVV;5&-tca`x35R6y6)&Pn5s^CiThiUGN^yhWFfHtb#n3Gd{ZH zrfy2nB{#!m3mX+b@DHySoWYHNEtyu%0nYxHno-un>bB%5 zsgAzMMsMLvVWHDmjD^_QB2&bvUAxQFy%SEIySB^BAvsPA6S23yApfkw7`Q|ARYt5n z>)mc_jI#=;YiS=G#QRQfCH+y|6W(7;5H+@B$320oKPr{l-nZ#&%c4j!D7LIOd8a;s zQd4@g**^j@Kqn#JcDt{I7)hV4AW!+iRN}_pYGCUAwHc_xaV`D{)ClOLu9{0YGyCw{ zN01fv2Nt8eI(>(Kyr1m#QD<tOeEf)~!Wn*+3;22#5IOf9m#=mI zD(+l2zADk+o;Ik#z53V&cVfcX>%#JISB)$GW_ut1MOd{O2pTnqlpciLgqiQ|G(>ya zvN;PZ^JUNMsPi+ex15kYdptR@y7Pzd2c>Q-O0?B9ZI=Xuh5e?$BbYtPn>?CsVW6SX z8*MeXVr1d7U>iGtHZ$v{vRRqcs7M4);z6=aaz?KQUC!lmaMRbVT0pel!c_A{wCn$b zf4qlLrTP6IyAP4c**B3b8+$#LzdL+r>&gN=ysp;k?8rY{lmA-yZ1kWz8lAm*+7*q? zUS}{?ZbrsB;pQv5pWHoRWtaZkDW!Z$Yed2KDdoHT?$hOWwrAJ+*)d(~vn$fI{Ftuw zQ#;FWpASQ9=K9_~z=?4u?Znc@$?nNDOzwG=UB>I4SGCLUiuQLHhkIVX_Sfw10K2Es zJ#S$9s&IS>x1&q{YM^+0b{JZ(kmH8$Y}v@`gj4?4T!YzKgzs@6yiyZx=L%^;8dN1WKyPjbU~Y7{bJWyy#WlV7J>lb1VBb;n`GuWQq-O?$Ra zis0eRVeEV_g%ED>9z`XX{zZD6ZeHA#)T6?`usa$CeL{7w&cj|-O zJZhybRBCzphgrMH?(z; z&W?xUw-X&Z2psnw=*tSqeb&3WhyJee&Mwj4XS^NdA9a#5I@#-r8QJ+%Y>vgNpUMA< zaeqeHT2XE`mTfKt*KMPYW$c}8qiXcW9aRYgZKKXPn5u>06bL++uUje;sm{`59~%4M zS{kb!-qgd+6|R)M;9a@*m!0-=!b+9byZm_Xy`UF^!3(HCUXjO#m*V{dpjugkt&pCq z%?B#W0lLDPB>oznKRZ5_n`_N{ zK8w}5w}2@{Fdm!8UH&<9p+S=0_X4i7I{YiQH?F}o?N1L~*Z%t=jB(s+TY~&5iQLaR z+XqrUwYsu)cx%&CDV$44@d;D#HMP0KS$ZxpG*6YdYf~R{6Y+jGyh^#``VmJb`;54_ zDG}k5l%15=@NUYBkJ#^q!OqeZDeu@+N3R)Dz&rJnKKebZkYI5qnt7~9m}xgHbgIuoPHta zzK>w?WB^MU@ERS?mr454S2VlAE>uw3eEEIz1+Gv5?pv^`PZWO{sV_Rysz!CtKDDE# zGv_(TCtvw{D)MMpWL9zI9$Y-*XuU3^02VTlH$sTyL>qy_>w-CIxV*_{PyD|?@~LRn@>ya><=o{*u>ZJ zz?}OewKkeEChCm#S}OS`PBNkkG%1p1K5H_V1JGOo#I)r- z5VVlV@G-Tck8=kr3z8T+$&vY8f zpUyyxZd#ft?_b2vKtCA2+vo7N9IpP!d=D;LJ)S53)bHr>XVo-)g70S@P~`Q?BFc37 zGkF!tn|gOgT(0SjhOo1!UC)}35sUmr@iQ3uz$d`mAOB-BogTvL_>5l47NM93{YB2( zc{^{@nx3(RJ(~`eHNU5fjB{`7fsk3zzW-cAR_gtO5m;r(A?!+TJeorRoK8cdWXmcp zM|9?fE&s9)LJTv*dvwRA(Kw>}OQZEyZSIE7ILyQ1EAGCcdr1dmw%lCS{QaY_Be~19 z>k_HJaf#f;MCP&!aWBYeoVau8QT#>U5Vqr0{%2!neCsncxT>6afn)q3eI2}>#dO2O zj#S5<&YX!yf7F=Tur+=!D9sm`2JG$;Bem{)EtVqt1G7s-%UN~)0^U-Su@{0i5- znpB7FOKe_AZ4Pj+5Z5l?p673!`vr}}m)c}&#g?D{2!}cl8OR)M!-JGN)>5xw;uZ{c z!wc&OulJ6Pfd}tU919JDH^kkQsg9n`9e075cxp$lTN)cD{-Yr`tl>QI1t!6B*a3~i z>CVKjsWHc)jM~9(5-QxM!Tn;f98Uy;9uK#~dvTp@bpLJqBHe{LmnQdd<|Kf_n(e<& zQM0dm-wE2xJSD12?byq?qlPDcKZ@u1lqq3)9~88?zW?)6LG`5p_M*2Lx08bwK>d7JM4(*S{g?;Rv>+nbvWz{YY-fK)aa5z zeygWEhAMe>@cnrEj!y|pZS^h+Ki(R&{;#vtdh}6w3{_M2gwS<2t0{@9npNS)qBG`k=_HsL1I-Q~Ca^kVGGaE{zHe{_p-qsIlgtu@j?mCF;+g zKzP3F81u0DZ}86eG!N$&izVS{zgtvq4G8=1@qDqkGAQ>3JYwVi4dwFZpM%5CBRtVFOm3oa${SbsU#|ci6JI7vAo?$eQ?XeG>gEJC$%wmIUbrfoja7LpS(f~ z>p3a|HP*w#2^=QgI~R6~H4n#g)#hY$?l_TZFKM1y!UYoJ^{cIJp=|fKvvf>JeQrvL z)+xQMvo8@M_lZr@6f>7Qk&jQZI0J8ckbuhdJ}I#yDPc$Fn%B% z5B(Ii;f|Z{4TimOWXxYWQXgEdM|W3x$<9!WWd-`+4vPt5m9fG*^6_pKgAy2;I29w#1P8vPvxXoYaO}P%K>E>tbTmz`UEiOFox<+g{T2CC;PSZE_9cS?J;c z{7AJ^&zxW6L<;z>d1|+qlTjX+_Pf;{*Ii)qmejg+cjJ|u@0GHZhswAc;O1+pB8bzn zG)S~F#wH`qkD$E~M>lm})#GC4snKR3v*!EMKa8)+TVNE?bYNrlayA&=bmn{s(K5aY z|0oJXa+vYVO=Cy|<4&%NXlKqdl(y74Hs8TKc*E9oi&+$|;PMwU4DV28tgs%ED`^Wv z9NdYXJ+QR?AR)KuD2)H_p4pqFZW`3YVwSW^>(cIbbZ7F*-bzpoTETTJPafCj*LX$tlj+M{`oCT6hW-C#Y*GIR6()0&m&#fHmlgN_ zE?aS3`oCj%zW)ze|M&h$U64KSps?4&8Fidqub3M~9c}XV4*L7gn4sv&oD#Tl9_?vt1L5YxSxHMl<vqCbn@(%E{bJgulDf%)aBVWEt_`f504N@DUWIi}uX_;BIaI z{Vwz>i?}?I8hIGwiY2Q&#hXC`!1w-m!8gEL@thnt+)65mCFcX*cK*OD@ICTS9}Uz+ z9bPe)dlZRXoHAhOI*`RpNozyDRU&&HV_Hii1OeAnW)lNa+qzBJi(+eJ+j9<*kH9Ne zRsQ=88|>%Q%Jzj3{|5e%+?WBZMj{_cVr$P>C8H=!(7Pt-(B|RaY3hMuImVn-0^j&x zjsI!c=0Ja<5V}ufxiau)8fD&x6x0cYo%ZOC3ZpfU4d@+gte(~~~2R7+Ej zf@A)CzC2KE-Y@veTIRbZAI$GS`wv`7`+vW&B-SppuDn1y>F+b=?>0npzWK9HMG*`0 zpMLjIw6uAJPohJkcS}sd3I?KB?`{9fXShM8uTQvmXYM~2(s1WPU#Q{qE0iq)W;Oi> z*{c4j_S?K)rn>_4w{Hv}_d1BOE_)3Y^f##aAM%SvkNj*S>z>WtOp*?v#=*lXugAAO z3-yv&cP8XDFTWytU{@eP_YaK$2XuWO(U*4;@YiMswP(GdJh|`IW-GnFeX1@uc}`K6 zcX2Hm(ER7?0u;@>igR_mx2fpm)x0d?kZ3;HND9e!Kzd!%eqQ>IC1mxC9UE&JDZqxd zn%tNGzf7rU$Xz#}h#0Sf7(Y#ZPsJ?Z&E}w}e`de#vAHZ&y#e1q)AseF3&8>|iwP6_ zyMFwMe31GixAp>^!x$eqz60G}z55+3Any8mfa?gvV12RhO_^K(6D# z9VFh*tZN$7WuL^!WXN9vD*oFZiZ|b0r6HAQTMfFc&5nD-Zj#hJV9nD=r=NL=z|MMk z{?d)K(wO~Gd42AJatl-)!3#kgbJ9b3l%DwR#{m-^!*A7U$el*nPG`>kkgb0n|5!f^ zFl`+#?AA0SwYr;)p(H*#cp2Xk{H4#AEf|>mZS3|E%+@3Cpuf?%wcS=V&44f5K+;!? zGr9cx4M2N8|kM%^3h( zJ6GzDQ;Rz|At(C-=hzT_s<);P*ZHUxvPw>1UNDlC?=tTEEx^we%e|iNiq!ku+CzqY zhSa>Bc=_*g{3YI&uDY9{P&yp@8;HOHeY0WfPcZbQDZwG&agWFmx|TRbwrjK3Fdv^b{dV^wIWZc^UW_D>n^wXW z=v?ph%$Mv|H_r8M{y(B%zDBM|d?k;9FJN&)LHZl2DVkPJ`F?27t!Agw@SYnnAZb{% zEsFMM8i;j($YN^;)eM{I9z1Dmf<_W@%O@MrfILZg+{4W@iERHBj9+af+-`Qb070YT z5;lKP_1w5tDwxjn&i%5CIcaQFdDA$Fl7EcU8Qfcr#0=OYp)A3(OeE%}FSGbzH8s0# znK%A#+Ok$Jm~>^o8=FV2!}2`<_5v+{su+m$zt~>O;GIyxh`to%TV(Eh>+hdVT`+{pbZ>?F+%u24-&-b`LIuYmXP*_+|^9sKcsNdzvm^6Pw#-I zwLIrzV3g;Em0yoJ-1HmPi%obsY{r>+@9ZK7XO(qhb4N&h&&lx8mTMk%tRAlI)3Zb=&CI%N#UH$?? zTipV_#r!fFQnd1LoqB*$=pS+U;wh4vBM-eAqjD?plT;8L`LE*zGlq9Ey#>~81xy8+ z*O0oLIDiQ9nh5f{X(FPtx4@b9u8wzRO$Hh|zI5lFP)TcXIy>|Vc^dDe8k~oWO5a4Y zHVLLBLuS-8WiEhqhHmkmB-0zo9u#vzc8ci4LYtNSPNVHf$u(HV_P=0Lf>f0yrIaDn&B?l#{GLJAEp71ZRS)_+`; zsLzIaeIawDgL{EQ@m~B~iv#lnJi+z}YF_ff%_tg>A`&=z33u>mg8P)1vq4PJ_#er> zB9r9cm%PR=7zJ4+{Z`8HZ6{apsCn=1r-hK4ss_Y2UAYNXYe3BqMI)w1s$f-PpN9e~c5T1ji_Z&f}11<&^vPZoxI4A7& z%zUp-x>d9*;L%4aG%NysNKv63k&p}v9U2wtStykGm_m%?pD{Cd(DHn<+HIOF=E9uAe5{@Y63-Jx_Kx{yMBtrW01ujFKNz7M$nn&M zZT@hY;=o02Uui}*!AxvLN%PLqgq30gzQML?Dj{1@9>+m>$ibIR%&HWzgl7|r0N^# zRc`g4$*_lK=qY8pY6P#nU1Tl{g+M}0^B{z8;kwx>gUWE>N zsRP|m%22vN+1*m!wFus(N?S&zyzBI1Z~c%&ElYVv^MY$!+mYnZ+-&c&_XAOe0}o%- zN@vy%Iz-XyFgewZkt7n;4- zT2tv3F&`rI?FT|3b-Nb{PwwRig%myf=ArQWj|<;3ii8lB$JXfIb87tWGwnhEsOsfp zIs?kTYK)<)`>PS<-}4p*euOU*f}wnVArp3TL?9?+DP|rQ<+cu8=T8tfq&oUIvyN~y z_BVpDpL;z-_u5;**!%LuVgnb62mAm6q--dP`=1eZu2 zpu(32Xfgk#9Q+#O>IU@8cra}Enxckh@(s_#)n)PKZ?IrjsHjn53>DMhJis2x35W{5 zqG+~3gH`DryRD6j^4X@+tE(u^}Zi5sXdVLFYpx7%h6Fw z<3Gx`bWCdcBa|AXG0D`a@sBA+V2by71Wv(*EJon!`$Gf{DL~c_t|^n)DTfXv0AdAt zTzEn_lDG1vMzY=-v}{eekyX`Ufj8fh--F9(pBlyeyN$DP-V7TtGC34RURw)gX7MEC zhGkxfsB_1^J|)|>268b|Vgsr4hjUObc&SAcFlAoiZ{8qSrynv1Qp?NPfNKr&BQja{ z10Ia)Wzg8E;fFfu8KMI2YQ{dBIu+sC+B`hgbRD5@JH#d~9y8Ye^aglC1zv90a||`` zI9!qk?XMveZZQ+zX;x+mw*2(??oik?$I=p_LD)08F}Cz2x^WG-v65nqQRiD zVNFc&aC#$Z%?=BvaKM`pjXCL`!g>CbUD)r3QOVEV$d}A0UYTrDB*OBmR6f^#{P%>( zvgLI)^i$VHAd~}wH~9l*D%Zah8?pTjSb7YFF-r#i`%~1vgltvtqBk!nR}r+;6twl) zi&0yDf89R63PkO9QLbGNuhHwoQ>@oz{0;{GbCtyZq4xn1Zpb6$hM<)>s(cTvJj8>q z%}t)C=w+IRYxQzS@N&a1u?v12Oxm`%^|USz(;&6Ry4YVRQzu)tJ}B^BzCh2QyL;6L zS3s+mqt*BULF0$$nM)<~{zGEc{O-ID_iG}5Y>=N^f%4k98LpEgySQPUr9Ig|Z-q!> zxW>F*L`_ZUH!Ihi{65nt)>aK}pFHg-Rr zw;KAWpZHCpq>YVxZ}A5u*oiP*LOc48@Qd9n?Ln}MlDm-ofX2s~H&$vh=6p6|-sA!U z=nj`rvgfMqm7oc8bxVEjJRGD=t+HAd!@{OOc+XZvGzRZ4cM>abQY=YmWi44xrDDPo zT*ui@*mOUPWhI-XTZ^$ z8$Q!?`viSu7C~YDR{pW|YIgc#UT5X!SgqP0Dx1YFBS$}2s&Bs)*U5WuwBc0>a)95% z2zBI3W3UB2zNiGYFlrsy$_q$wf%hseQ4b63#yW2n_C?Wtquh2q{Yzic`o8P-WKFO? z$#(}~TColQPofy>nkcT)_AkTlF%DVz2mJTYT>CT?V;q&&<&6Ce+b1s&QGd>~x`t?Xt zDBfKqzB&bXkc4OCE*rtZ3-02aNt-wR8bw9|@K$fHCPD($K+}q)p%z{x zVv)lZyLS*77_g<`elNwy#m=XFAUS5|77=H~LnsX(v6nSe_u!8PBNya8u0tHmDEyAcEH$^@kGT(Mf!DB8?XK zFZy0I9)&cTE9a}k?nl+~Vlb5E_lt+3`Ry_k-GBan8_GzM8~pD>xe)uQXifyL_~rXX z)Cl|RfoG1CWBM>J{*ZWd?|QOI+orrbvqrXTcCmhenF;>E?Kp0NxZYy^DKyn1Y--B} zvFrcV)GHsWsc`?<_5G+_paQoB`{{uGH8IfM6O%pM7j@^bZTSB&_b%{N6zAjjIk`YUaHE0*1&k#q5ig*o z5(UkH1or5OVugyfDmF@OYc178@d5{&^{XgI{0EbDEAwpDXE+MEWD{N?2#|yh-w~o>o96 zN9+M__wNT@PRnbD4)}LO>|f;rERK3gw7Iex0#;dNe-QwmVmf^XhQv82upEOeu-oR| zeUnUj_I*?)6GF(@HFo)5u#N@-5)nl9e?#`Pd~C^qo_k(4bVZ7Vti7Bp`Mjj=)67tvn_cH+MRx}4KF)}KKn&*QV03%X-E@5`3sDK$ z+9+gv4L=wc~GLTwaE}3+J3nGA{#poTML765}`V=#IZiK5cLp5817cYx(_g$``Bg z&9Bb^#t+H1DcV=H0zGT>9Qw!M$vtjk5VsGxA||E-3Yobm7$_+?B?JQb+VO@L9D1fU zRiEF#YJK%x!IP_Ajvi!ZK<3Z1i^{(*g7mHov_njlIALyj1L0|pn-A5~WbpWw-zA$l$^G*9$Yla;AqO5>5P<1S22TIv4ZWCoGG?+YrGiqYCbTm4p8c^+`A#NoY_S4Tf zGcbBW9TFR_ewd%Qem;Rs#2diN-0FL}wqeD58zSZLP-Ye+jUJ0@? zU?cXb`d(H`!>(peh2&uzj*7$N0Tpe) z`HiBYIemY^uQ-@t^vAW&UERMEh%c{#aJ6Y~``y3thH{qMQ;KjiLEk4D_|_S)`&1fr zik9%^Mx~6>lqoq;Qhu#dD862m>p6y0Vd3Ldb=eO~D&)ELWU02zU8#QeyGzyY9`{-G zOFTw?`HXsg^%m7WBFXlEU#R(hn_YQl_^+r*M5pO27Tw0(Pm!>FZUG0oRsIj8rRnu5 z?_H_Q?%RXU#Yo=s-8C}FMZ=|teSzC;rpvSt`Lk#UDQX9bLOVCp@Mm$i&3*bt;cd95 zJHz`@0Dq}^@t0DJ*E{QH9qP+UpW<+>oR0bO3bSIHJ5g#8a(mf5v215s{N1T%v7mbo zITt3Hk+{FR(cg(5r*b8Bhxwr0;|~8B2U&{0tV;P6r|E+2^)C^;({~5NuOiy5fbs9% zA}nTYJMk-_F*cbMEFZtZV&I-BghznM36?WV*`>N?34YpLO#3%tDm5)maoM9 zlB?^+O3PzT-e5HjsH3M4>B)@?k$X2Dz*e`tq_R_}o@)YFGw*Uw5j_tTX~IG-ttw`- zTH+xEl_wQD`+=(KZPlzCL0T^W;N}a}?V(|7Sb^d*f5BV8KiT{+kBQx;5+lBjYNCsz z*H{A7cR4t(A6Gq1TnlE&XToP?p4>J3rpBN%eo?Jpk7ndmX>_b>#G8{6}QacswZ*xDm3a(CUBLSou zJDpvGn26 zAMU1wdkRY8ZIk=CU!S2qWDWq?$W)*aW9)+DzxrFR2A%%>={8+VP)XRcgeppcD z@Z&uTf@pcCk3NJ6ck1MWRx~CbU1}G&L{E^4FLt_pLTSO>@v4Sh?px<}QbE&dr5W%k zQrrxwaYoN|Aau1JsH-fGNJNr1*l&50rS%hI#PaUfH!LT#uc33*QGh}6 z&VOPLb?$c`qfA3wzJzcvN6UqBo#e=dx_qnrf?IM8=N7e%Jt|+t!0_ew)wu~;iv1HV zFK2QC?u~2kEya-*gcko0gDRn&;_;=j*&Mjg{p$7Px3oRyK1Sq!ZN!$b z{cfwT-Ah;DJiP3mQo~3d{Tj+JyiEWjL(!e=>^=B0m-!t}Je4uV?B7yPD7xn|yb4Eb zJz8W}?4@pUI(&nUs#NCu6sMu#L&=i^oYQ~+MSH2&WdcBuNM^LW;uDGu{*?PESMJCv z4}Qy{C?-fIUVm41<+`j>+a_5#YdL8#K>%C6Z`&9?^M%vZe&_caG(DhFG59;ll z=q~|Q1)M~k^ZT2bR zsW-43sW&vS>tj8{ zk3g+coZ(BCs#$pCu}|8(Z*V_R>Gtp!j_Vh|!rc!k_&kroRgR6=ip#}MIGFT{;XK{I zz5y?X6qzsKxQnkLvX*R1qeuD7-?xg68sCWs`{c|`BAft#h`zb}L~JEgV6O2gIpB?! zSF%7aKQofgSd91yN@~{TlWi{>%HOc_d*y`e zmf-UfBIMy*Ivn3P72^!&7ha}-gbNOEk&UQ-cJ>F%0|ATj_;koVHA*y>h`mthGw)sA zs&t8bq$3Dm^+8UFYLM%mJq$g9Zm6Yh6-vY|cSVa(>K^wF`L%1MM$9z-RQ~TB+Gqe; zdo#@$V=&Wztpw9OS5A^D1>Sw@_5%R>Wv!B&K;^d5Ru`f`jm2m%Ko;A?coCgvFgj0; z+i8H(&}3EeRK8Y!jw??pMMh0Mqi{bc&^eZ0Vgn`I`^IzhH9AGWqXOvr9^RM-75J91 z+DN#Z3m$~_)mIzw(J~{x%O|%9Oi&Y49{{{Yd>Jnq;4jiB)&5+WfwFJQRkTrcDuU>Q z6Xg(EwN$tq2?sH>xmS!+cCv^r#yK>*XPr!xg~k7T_bXN^L>rK!Q=ygaQK9JGpgo2Q zi!gTKR6XmrG&*FhIAHvk)?_1#0{~M%`gh!;h=3=HKx?%d$ls?!J3pj4>`x^Q_7EC; z_1DkK&ly+qlNcPcjMG#0-6x=tIKwCN6E;e}LUSCl(H)^ym+USjOXo@^IRkZ0qLO?` zrsCmzE=0P=?MwlxEg(S_l#`Fs3(86AcaM7$zY6C}Yxp-u3)of+#e7 zXEn%W#2;n-?!7NAzj~e^m;m{1WL*-~CGH_-rn5ggMHU77#bo*5DmK_2z7)ORshvRa ziDBcGde)0_w(e2Z$ zCSq|+<8BU60x_p{{T2QQ^Jok0Zu3fjM5=wUmUzD-$%l(;pDa{W@4clMJMm6#^Zm8m z>9IX+GGo8)uV?J~rffO0FG$4!8qKYP!!28ZyLfKLf5dVVWV)dMns<7>NgXIYJO7^Wi}=fP;v-i={1p>; z%S?p;xSrIUFw=Cl5C0d}>}^}l9dV*g{o)qczEz_Zjbv=JIe-5av-i91&M}#R=!ZRo z_zqqU-?25Qtaq46xA3*SYQZ{o`H8xkepE9c0E+65pG zeT=pRd-su@qI(f*%hkyTBO<~PzUd8BCEy$F`unK#_XO$hO$q%d!33G%If!S_V@wa< zA-+Z9%kYez=$m7oBlgVnozvQAId-E6@}zu;JqmnYAVch4yHUjfZOO5GGlspKMEY13 zE2N()=|f2uJ6h2So!Cnf`==G|wMrF^aZu1biuBNaExckQX^H)}+)``b^qm1jiTllQ z`v6kkDJS`&=mPiWo3NZ>dAt9^&!op~V%dy$^Jg?uXV0(NhpL#=S zjgg0sV~|^yB^Q;@h%A@m8`MlC*V?Ht$a88$DMam)i|`c-M-4>pt}>RNYD( zKehfxAnnjHF830HKwN^$(}7XCOJnF#qGwhDzU3B%BJY#r_dwz(u~`)mLCiY~2jm1E zJJ|uMNmfrqsy-a&UP}(xJ4=v^8Q6)1$@|2g)3v?!wGDaKTLcN3c1GH4&OBRqv?Ouh zdrY2aA~SDiWXcehN~$5FCjA;@X}Fp zRIem`fj~uD2$zbvl$|+YC1)QkIv_@6f5G-GpI|Zcnniz9<_B@$?pyqGpfhu^*ddhQ zc=6e!Nn$aNGWz*1Dw{s17Zm)JB-du0OYc4C&lA(K_*DfsAB_LhZ-O_T3uPyTkx8`O z!(`FNhsmOs|8rTi;NQxkuL;WK1q8s(a4Q$0So^|`wj`j0`zDO5Zdxjz@=F-*07{TT5i!6?8JK^-?WYSE zu_?TjS-Ww&_&&SQ&a$DjBcY(<0%>+1Q^3$$`T#_F?n6V?_xc<6J$RwS2B=zMFB>Lf zzu@nJP*NZEoX1h0KYluq;GRTY%WssO!Hq5v4`AHlt0?N%COp!n8NI(ZovKB${E`B? zMtAEXhJ|Zlf87{o*{Y6a4252pGOAvU)wioQr9T{f>>F+4oa(8(SO+-}ssJ%AS-=?$ zP=m(I&g8pOso#^+tI7E`^(|uVm;WQn5fzeM`gAp=L)Lqq`pRS|3I46-dpWu~5E{O^ zyU@-Kcl7AYr02|qDlL0c1}{;!R3GbKlWg&7wLZKq(1{0B2%rH3bXni$7 zuTs9oFF#r2h!h_)*q$+v(x5vRkj{_~6LAdvaIn7rjZ^f`otTrE`ltW#Nt-=aeYCOa zSks=XJ~ESWR+Mu$T~EYaQSIvhKdE>rcF}?Wqnyx0h@EI_0Zv+e2;CAoRb-JT7lH_v z9!?SMFD@mdFgEQ~Y4L^=!6JCv7Q<#_rn_)C2KYuBo1a(4G7yW6-aMYDBNuK zC!l=T`n^u_1E(P0?VJ`^c!?~kxt*2OpoaFzB;{AvYvBEPsk&d43%7S zzNe1=*M4Cdr;X0}!ni8?^5eP(KIhH&!nnHbb7TBU@AX~#_^28@52*P~#PjtRK074v zPdYPiCBBbUg;l5M%|kMd^1bfv$HeJqTx-fVGGpy(_jp*FmK!o3_##_`2rGJ&kGvQ8 zAWeqq`Klm-HOJqj!TiG;bV|QZJcgnl=@y$!tE|~{N{za;aJ131aOPj>UP#rARhNJ-UGQNhxE2N)QmZZ{<;0+W@T9yBK#+?e zz37vJeFN^6^$MTd6iyGsC1Wtk0r79Ru6p6-U4SoHTjf85J3K&Q%ObZAolKj7RDX&6 z`fX@zxwQsg-}PYQ&~#{^AkyQ-rYL3duY~JhfyNS}=04sOy3-*2Y*yX>!6i;H&?@1Ja^HF7yzWz$OONLk84Y4@i_A-+{S|0qKJkew-vRk2k%k#+9hF@+leDizK!@ zk)|)a<+eV#t4$p~anFROri~W8sU80K7byHcI6uR`W;jFF{p-$N!(t&kY9{&`*g!48H%n`5DX*(k5Nc&xtaw_VY7-VPbw}qmZVJHhq46$Za7K zkQnRuYbvZR&TTK`gKby1c{A87m)+4%iE^oYggAG)%bkwp1dI?LzRk15zi6BL_g{YA z_9L)TyC})|oaFp>SpTD{{w32ptbZk|P{01${rWHMxc+}HpT64f%cpLQ9m$5<(SuX+ zY23fBZ$YBIml`^%@051+g@pfTk#`N>c|#xJ5OSLSW!l-@kEVa3a#dH0c9vqC=M z4OcnyXzdRf^E%@aIkmT2pjdj(o-!``So@J0s^hqjb+0@`4<5p+WE1+?$`7;6%tvIv z-0*FU?8Ell%QdfXjY-Z#Yh+%?9@V2^q}Zqe*2o@2Ve91Il+B4IF3Vncxe@>88#~$- zo=(Bss$txmV~u2|4k^Il;hpYYGc(}HIte&pAUcz$xwx2wS&eYj2uo{kpI#baC*{MI zmnmmDQ(khPABBlxz2sr<;eD3L`ySriGoETkU>g5{+Zo;T{1z{f`Q^$a=B`@$t>-tp zyUNdHhF3N-Vl~ASN!SzY?A=ER0&r)BeZ@-B+)?ou0H9)h$9qHU=)+Xrqy@laSaPR z;*GHN8i9n0Z^h4Fq?CIOZNn8bpAehFW6~LA%c>+)!WDU@eH&hkd`7I^ME}hO=oc~V zv0HL3w#K&RcwZ**u6k#FWYkbnl)hTpR}id$J@~p@*PXsk=hdJSOCW`vCpE29j$*s-%f1 z$sbZzJuNRoh{l&Eia%>S(u;&6RwYjPe)j|H(?@EJ_FvmksA@l1mGYQ1t<8Su!***A zSGFcWE~Vmm0y$i`JN>VKD*2i@3iVY3N`)t=yY9Ki z?Z<#shr{=l=o0Z??;J9ITh}sQ1Z^I9_9Yl$$K)5+%q8!(OzYxF)l+r_D*q52Q5kHR zpTdU~gtWuH!S(_j@_q$S-G`r0!ma&!Ux|37{>!yB?cj&T?3SG`yIzb>78!!eCZ!lcc#d%h&3Tu@0dO{<9n+vr}QIbpI||TAO6JN zZniYBk|w^)mW~g$f2*1pk!a#;n&>Z0G^I6RTH}*Vn0-oXCg?WOW+SDKDGcYrBXPx_ zFUEH8S;&%|@TEuNRi3V&$fWrck>jps{@KRhdOrOHn6cJ-0zC8Oyr%7B{62xdZ%b%L z?~2m=N)N|AqIu^H9hFx#a#+S4H*hlgM8z}G@$JSWzKQQV=8Z9W&)*r>>^@SWG?oh) zPIJr4_S8P^e1IvvWp8*29rY=-FS-N{Zo@Ke|NXFR{_j*Z-`l!gkqYt!JiE`m?$7OT zIl&JV5+}Ut)wNG~>GG1rn?HieKGJ;eRP)Pq^M1?0%EDotjF?)|rJJC+-G}I?no$rM zRp|l9$>Nc@w_(3avsG7JriZOcZ&O0(8c*Wqr|8cahA#81TlIbM&JmXNR)X2pE82En zWUrPh*w{;7-SU|G%f~PX?_777eV6%nzhK_4iMAf4*l?(z1{Jj9jz)YQtR^|H3H+ne?qr|_8nArL-jN~X!120AMd7Iov7)_qH%Y>( z#Lx|^^7+(|+;*6+^%!+|&tdw$!ml))z8!X< zjk#}~BeR)3w}rLhdi{KlJg?x{eL?=z%AdvZ=PCX~?4qZGDE@Y*Qu|S1Bq73s1g*L1 zG5QU>B#66cc;!dg1ZHx6*$`4YERoDdg>i`+sF=zLU0RA8p8wE?Icakboxg`$WX-6X zJ28X{XC5j+ruZWCps9$Z=BO0ku(v2?I^*|pb|aJdbfrs{ccg4Ni*4Z2n#sLG1QS5U z)R*LC;YXca_2Q6s6Zl|lLzi&tWpeGJSs&y2p!h%4fm|w@r0d~SGz8tU!JT%2X!4!8 z0Huo44@DCwF738Qlou$@#e*G*hL(nQqCrQRYba6B@MT0pNgn~pM6N9al^RpR-VhpA zB&iQcy2t(zW}^6g+I0KxDSA?Kug>kjSe#``Q1;kGD`6heS&WG2AApp&TrH+VIQmWS zj$by!hcYM9o9Mx#jM)9^;TR+KuzKiBI5-|mXWke}iT4p7G8sqx4k@zAY``xAs@yoa zGaIO?L^}b0HydKo384wak91>Ms_LUEyK#(4cE0@O)}!#2_74Rl?`TnJYi-Cj3jCmkP-W$hkHM$VJae zZv?G%#-q|R`v;TpJ?jRlcQcFkvSumXQhA11Tz_k}S^W8J{lNmU+h~;!KRo$l`WmUt zM+U4S>_YVUwvTcH>^7h1B4R$psjMX{Y?bAO?Q%3BZkJUJtiE-kX;0rGwZJm7qaOn; zrD{i%?j8T%ouuT87_Q@i>GtX%h8u&q>IwR6?)C73K8N!kbCuHUGDNXLo2 zcaOV!3;gX4De-R0)9zM~fzB0w-Zfwkc1!O5BxU~<(~z>xisarT``XU%Ldq!(Vxl0S zUByY7?V!{`-Z&_t-nOz)oI{t;?E;hrZ`a+)rg=O4K;gWqU$o7%`hR?~U%$l1P1SE6 zR{x_rRsBmpQ}zG+Kd=8!e4+aPge*pr{TKI#^!|_0_1~fE?|MZ2;M%-pbip3%O$oF+ zk(bi9G=9lB$kP_f`HQFKgXZpQ3--dOSgWJ-j?57O9bMfm;#3lh;EGG+VDRT!_jbqq zb#GgwxP^0gY1TENCj~n(3dm-AK6RRwx<%ZoeGe$5BQQKe5bw`lYs7nC9u8a4osfH; zJrbvr1#*G56_=H#5uYs;HN*o@Ujb7RZOpMKV~@;hC~M}OM#MTkQhTmGDTQq_AD1mI z#x;v4=W!psq&drSslXcdkvnSc4uwgwmHdc&Z>zh;O-D6hTA@5HzLyTemsn*LgB)G9_;_(SqNw z^kn)Pf!dEk*J{4TQ5FG&iNlvYznKE|;*a>-P%Y2$j~qShf2f!C!J6~-k

zArFCx^w<4}yHTXofAZ2&lcFyv|8qV}l`k1@9OcGgJL&rPegY7{1uF-;m)wiPoHIPO zh=rK*kYH&`H^I+n1MKdt%9Dym=Tv=ujaPXi#}mOn_n@_}t>v{OKlk^AlkW-r5Hf4G znwG6YkV!Tu@M^fDNPUMAb*kx9H7n;0aLjeDnRNJ8SueRtwFF>wYT2Y#-$VAf&%X&1 z`^Q5fUll!w?qqHDuh&ahwIcRKR@Ez^>b7o1tRE_X9C|QfxS2s_ZSIhq{Zj-kw+NGsLFcr|}Zc|sCr7_;{GgXn z%B(2E;(3tXEj9~Rt5_fetFp_Mgsd{=MXtJBCB>ZXuRn!{TpTa45KQDrnLDmXU5S;g zrDtOPIltA7qgzIFj^rvkD00KC0(k85e?a`6eu1iYu&U+Q<*!()_P@h1#IjZBGHEt0 zCIIMMlILZBSTeqtcv*#stYID029h2|>_z$yFgY)~fXs+BrOvD6!LE8mB2-;Q>%bw? zm@QGTCQiRIcttqkTpttwpg;%!?ZE~b*XjVo*DVu77?d-k#`!I#fwbOm--vrHz_O&1gR8;?O zEWK|oIMIBnsM(aWRtq9{Ux{468z(2!P$q3iFXe}6lur09`!nj@EHH7dLpf^;R!)_{ zCBJ3x1lf2+zK}?}yB7n4$1$*?oaBg3V?>FT%7(Og+i8iiE&C|z6uta$V&oZ=lTrU1S9&rY zmJDU(SSckHaJJR_OMf>}3Y0zJ0d++Qf=$%IGt7$Bc!Zy`t#4p&G;2n1Z#4U~X0$vM zg=sT0@ya^A0QAaH+L7ERk{$d?+RIgX{jBT{w~AJ`v69u_j7dV4s6lI};}q(Xy0*%1 z%RdtMo!~cV`rKh_QkLhw57eyr;1~{g%Ah@^2{UIkNGr`_`wX-E*3Z$SG=` zE#4gG169S5*94e#fGU83FUU1I`GORd`UC)RoHzmy(K{!H;wPG+=b zRgM*ay0uTC&Db|Kr6Sg?20mh0$FMz?g(G*9-tlV)^5#DS*ov&_rnFwBE(- z)tG=&@FWN!RQ*l2%KqF$+PP|&+L9Lq(-ASyYTq< z4b;OY7x0ON5y?Eo(&~3fvNn*xhObvG)@YtUOM` zPJHvEt$4jqTJ-B+)h)|8B>@Hu|9lst2w%r267@1C*E1(-%H8`C-afa-)szc9HQ?*c zdKRa}?sG9%D7I)8uQTE|QG3F-ZHCnQ*|pUB18I|sW}220IY646AX%Fw>paO?a>Z3w zj4dm_uGB2XrT-h1bX{rLC}MVuHH$}dGUB36lnwa^806C)6kKkUed#?0Jf@$2MR@de zMywYYk$CQ_o}~gK{&&8depjYcWyJr)OZ4DL#+-qakc%{DXYrtj+IpMKIe;6Q{!w5P zVG`pHl0$oY_qMe?8ORS*8}V~wA`c!#;@#K;R1fl155l7_z08Q0Qu)N`cV+#c3@3V? zLodns22Bm#e!4yV{Ic=ku}ca_rH(71V!|pnd+(9uzP!bnvds>*%7Plv(daW=>K{ zM@66&`sv9%GXOVwFmvh|NN)P}qr~`1sEsT(w!9)9m6bw~x4Y$)PUv=&1vP=irC)kI zC;*SxCdA^*6b{sa3BDfAQ(t+;1=pgXG4uEBQ0t*bE+uy$cy>UTfm1Y+WX;ZVqo1^? z5bQVUl9MQj6~(=Y6S8i_Z1Jf5$a|Zn(k#gB_-i8KT06~7d{-LEnqaLQtDV+MaZ)u7 zxfH8AL(zOv*e;q%Q6GY?v7mG_Pmo(G#fgTinM4N@`vqIN8OEHkjBjDEs?wb^&F7UN zW7Yr?Rd#$W1v!w)@~Nx|>s1rmYI>!cKN028$v*ImEDy(?D3Lr^qq$G^QCo89tMoUh z0zQ_{;wrUDSN(J^pv{(hll&LMmb635#FWctex*e@tWy4pM5^55-iK{r^b$ZNpLAKm0_3u9P(?H);(Rr>M(g9n9)UiCKN_Lp7^wA{_kg zO7;FelA6ayb>2eBQ-O{CptRBKHUbAI4s$vM^xXHD{)t90Z-UTLyY)CQi~mXbpk!N1 zccpJ@xmIahFd6KUOY>q3N$lhu`=2Isfyl4+U}Zu_zwKV^Oxx5RgLfX!Y5U(vogJIH zvcTxjG3kp}te#5p%@(GsMYf1*BfeVzt9_Qmi&P;R3(tW-#@!2P5ecFU4YlS?DTn+c zB7weAnsu+N6dxp%z(kH?#%2n-*C`(iykv_<62I+pP%K(~9TtykzcCT;gH;xz)Ho-jDZ|5{*9x@7c#rPN=xPs(baalgNOvJVa+o ztwXqumCsT>-!<3Jl)#eb4&=rIftj&ZCx=C894p#gjiMYY^3i_HR?& zXerd~+2lh*RPQbZ%*Y{iZ=PRy<<0FX-rx??#aq~0tEN|wRNHaJtf@RzFOy*eDyyWY z4ep--P@;$NYst~_(pG?o??d?6*`oobg5czV?#P1}pO5~7h~5VGhun#vJkrn~#73IX zAC}P$D{wJy`E(~yeFfj-tjoN?G=u%va`Jd^ucrsLdgKJbd6+3B8(x7vv=SUf$NUwv zhw@c}=jb{ezD;i13pKFn9A>rKB1-P(>H8}yh7a7-7dBX#=T=k$KhdYY zR^HXJ11{rSAwl%r`sq8`R&eqIV6AqS^1`wH^3`TV>ykhTYGi}S$vtcMdvEj&5Dzg$ ztl&d}AES7eq!Wy+uPd_u#ur?WS0{^V^su^yGC9>iQdyIGzv2z7ZjSJjy{SgXQ`5K9 z@BP$E@)>!zvwzO0=zgj8U$Kj>=AC14`zp^?0-mWTmA-bvKL)28<|tIz&+ayZP!D_9 z)ttXKdb+Fw&iEdm1+7L|PYzkDf2DrYo~3ju7Nj}kRjV#Hs5E(0(O$evbv8_me@NY| z?3XqI=d|)(X3v8RBH>?yBPOP@3IcI6_#LJlYf7|mO7xI%$MIS(`3$|}$*!B&SQ_d^ zf13$&6J*rwqZU^k>;Cc~otor-VD~lN9o%{0mx~_CsA_aO$)$=(_>5Cr$v0~3aC^H7 zSyzcJS-h$;TiReyD*qbq;I0njtuuVn`?4HUW@?V2A1|Cuf~&0|SuB4|z$Jb95yI}t z`7Y{0_Lqur)4~R4Ti)txLd-k)vGdnLCpcXGrGOCWO_^q)S;L z53*hb>SX zzTJ(4yq>934godJ)ovDPQjM4>oX5wg{?}tYy-%WA&6*)rq3k@)9Hh1U8|fPd>AWE_ z$X)I+Q?%XNKMOSDE(p-tst*Ru+eula#rMJi6uPYJj!{wP-6?q#lp(t}Ckwua?_{!| z$|K;CDk#F;9hodRJ-wjHJJl~JCp_E}k_AVn7gTv%bgF6;-QE36UQ{2urx#RtZ~6sg zpVDni7JOq-S|3&3(|*BjQjk3Xzs85t3#z;*d7Nv0UC78#_YE>%%RyD{Ip)(FlAn&@ zQ;u2*P5ufwPy}7LzeyIp87L*ERRlD+@n$s z6jI5Bl5A(6_K_Bj4b@`Ckbi=t_aUQXbH+!~_wSJLrR^Y9oq&84>Q3sVo*ee_rt!yJ zfuw3D4pRPtFMUXBiEXVbB6hxYFsx%#ORJkFX9if#UUWA)*=nR|Z%N!BiD`lUv_7#O zX+&dO6tg2Lh(!~+`5%>u^qlu&X-5vooy_O7OK=FNdcHaN?k~4U$85xWo z=rZ*e5$75=^unvJyn;RL9nC+jM(ee(wZUZLD{MSN^dq;wGpst;R(L2{Ke(jkZ0j{^ zW%N+Rw6~%w2Zx9jY7_ z-#4|NGHFd^Ht=6%RaVr0N@9`!n<{nG=O>aUIR#r1%K05S$4umW_EsY28gkMaOtW{R zJB!YN+emq%S-jtfs(lt_T_P=R!tfVbeilky%elJ$A!im~?lye>!w>hq<7#91aU-3q z6+{jT))j6jZk%R{%U-E-Pev2FPWW#wzksbhz5UlVwqQJxb~zch6@#mdrPffOmGoCh z#01v*gXH*^1t&79nQ>v?Kie)0py+%q=hJJF>dLhJ#&rLOBceE?+(Zu%f>C)KV|BF8 z4@ajF&f0oYv>hY91-65OY8f_$XzL&&_5>}KD9b;>U3BWsRT4l;Y-F7i_M+HQvgW!c z#{7){)W7IA`9|z&>Jq!?#)B;o0%WaEaSMZSw|>!rSYvab_FcXbld_IDoQTOPw@i%T zvgxBuYvfRYRoc$*S&B6Z+?vvKUv>EG=lsPWC%PKF;6_z>}diQExGAK&*PAd za&>wM{_Uj%`8TP}uBuaq z&yk^ty&2j$)qh_4J?cR~k?FER#O=6|%Z5B3} zL9QqsNu;7?%q^yMLCe!JpAw~$vr6tTI1D?j7+x=swG%sSsk)?`jCWj^$VxEWE4jrw zvCj-Ah}d`V|Ea{@%M0)C6v&rA*yZ*uI##II?ZQ#Q42A9MAfyN6Rc^VL7)-JyV~XdA z{F^4$>=~FW0_BCf%k48c$q<^pLv8}s`+~uDjT*7V;I0-aY^Lzk-AF!(C!~UgjIpx6}VLPuy?hPj1P6bz0 ze^mK}X`h3MMIm5$BPHB^vZ#`J3qLU9Yo~22x6TSX*CvKrbsDD*D(_M{@P4y!tGnkU z@ab@dr0FPZUz^v`G!cL4Tk_N~cWeVQKJ3Cglr_2!u}Guqjov!JaA)|>bVgk{O9|L5 z{=X_8D!7h`DsQCc-e_P)(F-Z+UP->E&VAe2w`ts+v@wCZ_x?(WfsyYhoDL_`Z`J98 zbozq^}XMsSwCdg0ryI z-^dT3XS`0cPTA|HG{oKH(`5gN4<;lNZ%#hll**ozdX%ecrE2sx=}D=vd?07q*@T55 z5GPL3T24&xqcUUp%>~>fvnHs@TtgXbZ3C*X+^Mh2tzBG6qpwM;kFSub!*ckoY{2R4uXT1i_Sz6=F1@3-VFhS|d2174F5@?)@ zBok=W_+6Tdj@!gD!iYh>N08UbE(|t9-PKoSy%Uv^dpHRK88riX zNhL+$Xcc+?ur~UxGFL5w$8@v0%=kB z^@T)`F0~e@rk%vx`O~BlQxlY$7g^;!L(fCe4>7jim@7@z%H%{U7AefbOi;L;F_;za zs4)y+3<-RaZodN#mKX0XH_CTMf{W(LfLTW4zmeVpP=7Buv_sS}8HYTfJ)#ULa`qva z%1dyE_;%TOjV@DP8}Wsw0vNG3h4zigE%Ch-C48-F*U~@j^{d~b?$U}XFnx`%!ZbB2 zrT?U}mCD)4ZYeT}Sa;_nNJ-;gB#4{GktBovHeHGCw{g_2aQFM;4u)Fwa z3|d`gmDayy)#Re4ww`6oI{759du6mP$IQGe*XnFT#WGj%x;u^iTl8}%x;{(mDc(0w zN(!aS;GZ8j9I^9XN}9c>T=D@D|4;U zS)UuZT_+j?S57p>W?w|OfzOR&oJo8;(Ks`E7NMhznV+%h)zJpdT4~Ih0YMtiDPDyo zD8&gwFNxl%++0|g-?kp5uvt^~LTV#6OXbnhGjv%LV4LZezWV+2ekkD6Y5yQQhJA;{~ohJ+GIZ{|amtzIZ z%*%6)=QB#JcRVbJ2`DFO(v$lDpR3{u(m3W3n5yWW4Sg8cJ3|r@rh5A{B`ZQpC)0bR zNh6I!*Jb#Sg^WewParYklr<1|S02j=B$m+kxy&p2Nie$8U@4u&L4B_G70<(RI1D9&K4(azF|%XGV=g z@Aol5`PWPQotj2C9u1;YR)07x`auRf#E4fC|4&8d*$nce;S370xTky1w@QZ;d=nrH zs>z7u!KBm_T#}yz=HW+Qur~egs^cbO9V8uW_-9-iDDsJ&dcN!MTcm3X+Z)Fmz?Os;4HYsccEd+x$UcI zH>1~5gAajrGa6L$=Fe#oC1s$N?7~|c@JAOUVjiQ1xFP2z`V>8sYs4n8HI74`^#*Q+ zf|m**tHD*^S#Eu-Fmik6=&HdWWoD>m9Qf#0RsHo~BlZQNM!d#a_zg!tW-67O4b_*m z4K6QiD(5J31Gy|Eons5_;AIYG>5M zMZNRd*mg>2V{y5(TVqnbr_Ti{b}Jp&4pAr$ViVrjh;w+%XB_XqV-?okNYarrW*RGm zbC_(Mq{zv7R?yUH)NP$%65CQ|D!hA(5PS&;Zl5+}?Fuoo0e?)QU5uI6gUB)sEV!8o zuly#z=Ba>CUMzNMpc1EG zO6gX9_wyQ6A@$SNU#Elig-9TLso1D#p+Dh@HL}j0{fzXjVwG3| zQlipV6oeZX;bvh4UM(9y7(%XHFIHZKU~IIZ@~dT;kGytg%@Z38AG_WIDbny4o`~Z@ zyiSF1<}!-Xlivw$Eba1+ccNl|*}=5Rb;T`@Yc%%Gg`V}gS&c7WbOg=DlG>jSHy>7M z+GvvB?Pc`B0%XykK#`gaBi;iNPAJ5&vl&4G2u^J-sG&AzaA=<^>xi5z2Dof8)p2p@ zmuSU^wQ)>*T}FMphQepcvPf1JHS=ci%Eq$#v5o^?(h03$N71S0oXTd0Jx{7~E(=1W zv+tLL1(F~)YFLiTQ^Y#cxdQcmql(J%LmW?3HPHhYQU(p6tLVYS|CK`C4^C2QFA`nM zj!UDV!k0xcoO7G#`cB-U`x;7Mwn%?j^W!>y6GeH;kvH8LUzx`#C|7Ct@c~epuiC?f zWZ2$?LVOkT=JTvo{Yb^vO4UDKRs%BnK?==OY5dG7CuBBzcD{6`=k-yR(qig)d<;3I z*1>Y?%W}DFbF(i9{pDlCUi2sh^y0E5PvcFrh4cFC6VN~F_2|Lesn|U0ashh8`o7sP zO0E=<@u}%iK#v~iJawHw_VlERy(@$*dLV=%r6}KSiDAU2qi@iRJ|IR=L1gKtv^4Fv z9INomuGmX}erbw(4+IvNmRW`6u#H_oj6%k0;bRsYm_|;m|dsN3?WdZ>G&gn-7jM>c$ z8R(DaD?kt2{pPK=)nx4PQP79K-1Lc|(kHiX*E zK&_hlL!GBK{;y_0oGNHY5o;Mol$ZfeW?&vbXA(lzHYR}Ufm0k&AfOEf%zzpg{x{Zf zkszPS0U3=D8Wn|Jr>Irp>Rb*CdQ0|lJ_3dRMq_p-1UUwFGbGWV%$4`b+r-a zc8nCaxED`NH7W$)_+)AQ?FF4?ra2<&)U+bS#k6Ew41@|&11)BYJ~ux*;$8>8S9vbOru&EBl2 zLe_e&Vi3A($x9JhDEcYv0F7*RspvoniaX^yDQ=C-cVbPCA3)m`152$%f(`9PXvFWu zG{qj1@}rP>J|x#elwu*Uc6ufglU#pPs1+-IPGKXm#tf?Ux%VkiXMK61d6Um=q^E=E zDZ%?Q87thzdLzkiw6ZNc=MZcMBbAU;3fW6|%_*sE5p{AFAx$5 z8L0$wsPKIyBd=rQ3E3_((zK38u-zo^w2;q9yP1~XN>Fc?HKeHFt8m^)k*2p>`SNfF zmtuJ$?n+qSf`BvbQN$+FQVF_4urD7TAXoywx$P;}xl_xv4LH-mR~4CE-jQHa2Epjp zou{t-U$NDNumx#HD?w}747IjOQ`6>!E8wX6K`L-aI%)>DL@dG`U3(Fthm0DYb^;W-vkxJO#k_^p9)_;uD?EO4Yz^df}#HpgFdL*}2a_i$l z-xNNkR*0v}dNmZ?v5gG_ywPhYObgc=u?v*?m_4LUc339oYC{KA#1+9g&Kf=iaq9Sq zIPop~q~!Kw-rQcl%f@`GkPR{&BgNSTw&zLFdbI`wL6#{~f8pmwd~p}iT~gNb1^SCx zRo9@$I16t(@+oL8Nz^O_d@aN*{H&CqYEBO$x{D)us*TEGwgYM?6A2#DK-&Vf%W>m; z(-|RWBvnr`2K#*?=T_wEhDhN7Zie7HJ1&C*E}Wt|8B1ui_1k-jS&=B`?2vKUrs7ri z6c#Iu)0p!L;1Y%AN(7P5rr0kCE&VCe?3HM!{`7@1-a<=n)m=_UTR zLWIa88JATnZMz@7FOpr4SC!)OU($n((F4J0eG)LR-bu8$Js5+lZ2*+fxQIq*UNL;S z;=M>}!Y|KXsIylKC_wYkIo?%prvyDF*9FhR9n#hXvWt+mE>L?A&OG(g(YoL(zSank zKs~{2I1!li#Q&ovfEbiZfc#NsE-ZPB=srA^RAf7{_7ROH~3rm>~Tn&^2+06 z=tddazSX!xXNblKh}buvbII+X!*m&A_KOVP8%yC7jeDoyNR{@gyxa7afNlp38lB@8 zcX0DS^jr91J#+7CAHJ#qUo5je_4N?bS{IS$(5M4xT{^%%l zni*-Q`lm!)PL(XBD+j6t$G=hhYm|BK)7)gYQAeaD(fmIKjRZ%_*w|NWay&0wuZP5l z1l@>rOOjLis}9z5Z^^`pt>G?o{p9HWgKZ8YUJgwCb(`O?hVZ{zzInrBS)oiNs7lJH zwdzACSlOAcK)Y4uqOP(k?8wgS^+)Amnb*YNB3g>V9!*z z%hEc2I!&oHfAA=^Dy|xWww$w{0P-MN3cZfdmW|mnsn5GvEn9oqa*qq@wO(k;RHM_U zbZw>Js^#|rDPN&l0vY_-Z@ztG1Y7mr1a>}A&b z2oaphxrnAstL0ifDO@eQx2jX-0tFrP^T#xl_W~?mVHN$n9%~4MGNMxH3mVzp3tMls z9G_Ce(GOV&8MEIPKAup+FFXwU6WU7Wsp4|<9}DWYmA|3d%PX^7S@^ch^{s>nL!jDw zLDEa-pyK2<%wVVh=+;P zcKP@g8*x7Qs*6`))+i4jdS&U)FHWr18N z;GWrP+-rbfE5KKPn#E&EOpmEw2r;h%RHP06{R7m04EF+9of#7;TUxblor>J2R$Mf<7~sU{Xl6aRaav*317 zIkojjD<0wTuHfbM2lkI>b*%`+3YNK$XmE(oq zmFo0HqkXxrVTN+N2_U$tq>S2*ti)Cuy*TZ6`0*MTLq~o5eS%kR0gb<_(z_IMS9|oP zoyI3G{Eo(Yfg24uINFZ~p8d@V&LVt)Xm%t2cc;Voi!he)@ z7NpP-#2kA4U^|7&HTN@?!en5T71VcDCshSc-s4wQwEHX|HJC<}`PV?|lG z6IJ;LWg%e{{og4IPeVIN#m8lD31uOTRUf5{KEwAd?i27tANu#69Az&N3;FoBL8rRG zIBl|D$QHKjDJJ-q_KY(wYgV>GuVss{tarR;w?Uz54RbSRg}iwp+7kLe3J<+?==MYE zG^CYkGOw<1wf8!o$hwPA6CD_k+S`u2zbNm4BT(F%r=-@A>FX8E9LWS0(&LW0*kh}t zr@TMJ_rnT8L2~+}qYu6(jJSib)?(aNTxJ`xDZNJRPs0A4c4>f7J-WH$D&z>PI!T^b zdaE_GUdtD*ir1+*FfLscZ1g6Ie$|dT6BO5Z>Sa)y5sN@}9V%4cNotqA168QSL_!_V z6sJkeT3@(Yl%18ZZZ-9>%Y}3lZwH5)O< z$hTss`V5TnPD95?s0>HQWic2jx$IR4E;v0uzWzU2piKR#f%NY_g3w<-d;ob@D@)qossWRdT!q5pD>WCbmjNlICbV=4 zB@#9&ZzTQF=K?t5KYldlW1mwlZTB^f&wJJYY-Dl z28#wU5H=Bd2?_{!O>Y4%Ya9Me2|=nhP6dzgL+?oYOsyu^ySogw=luwUjjcd!ixKs; zjN?2V=&h+Q(Oj1?#cF5UF>wiO@HRpw=)+z=B)cqQu-0$7;pl+(k{q=Z&b1b$EcInAn#6KomSV+QeKUAujtoj-4Wudj8*u# zjn1`t5p9iZ!vCfmo?m1bK3Pq^4zfB!_`cN$LjO!&$EWkA(NNhKsO-v|mRjp|?*aH( zsT1OOc+cTd_H)J>uD~Thd2Na~nE?H|!BLz(e%&h+wOjb)({ORW#ZK~B1eelOJVy?> zakz6`dffQQrfqOEH0Q8GO*lmkkn?F){2s={4axwHs7g!31q^XTH*O+*qE$ARI7N?= zN&Jm29N%<`o@tb+Q`usjmMo4`*1#2Se3>t}g`E%tQ>x{mQJpHgu{z>Z;L&t5o|)Io zr@AHbjd4ubLbqa_@EFby=#Y_>S)5|y=p8|(o}@^`o>Gk!qr7kj!5HuP0hQ4+_oUtG z6lwY?Q9(nFtW8ckyP)(C(;1yty(7O$H1o<^5uf40dat*P_oQk*k%79Cmdfc=N1$+t zGwfVcI{b~@)4n3t&a~%Ax;a1&#}R17>MHvih4D!|8inQ6M&Y=* zM&UJ&8ihA5HVS`PXB1X78HH1t(_j-HO4)SqbdtKAG8{iuWL&0UASKvvDv=*cMaWU$ zYf!PO*m=Z9u7EsIhRiPGO(76=U16M)eP@S7qc^$OZ$)3AL zHIhRyx3Ym}d!7{N5Zd#k>nVU=sR1tcCuN7F8Yj`Hgr8H5`mO0G#C|uVskDx{hw7Py z`vvZL9v*U^4z)XxpNz*N7bmHRuw0x(MA#LRsZq|$=ek`-%7O3Ia=`SsQ1qUH9>Hl7 zRDhHQx2;wP=(aqchUGlzzREMy6-T%`Z*#8$ryx$ip9-6hpg;RIb)FRZx!_5mld3K5 zm^z`3sx2+caNYgIpZjnsc5DHxv*^0vi6ih+iVi#9pP&~%#!Hgk6b6A$f<2tsoXijS zly4N4fk@>b(l`+58W8D55b2j7QdKj^v^O1@OumsVUC>8|T53@E!p<7qRj39cjiFFO z{9OJD%8)LYR7(v^;eIqIUr`I(%%Mnd`G3A}<)af#)WE$$2Bg{kupA}F>znEN{i z@$N%^?-jBEdmxw@4+{Ji(7NG%n*9vur3k%M{`?lvNin zvsS#D%$+kzl)M0s?m1Tq^i?7E%6~{~1O0)7X<;uy&B(dS-N2E2_vOc{2+SI+sjd>1BRlJ|*!^ec6q( zR4zy6vkJ_E8qWg~VTb_(OUTmng(PD!x(>j716*cl~$N5TOjv>SW5SON$Tgq4u>g{zeQMYe!L z#}6zIa?)YJnPNC=HHo$&aRRiBi76c@wP!?W}|W!Wij9QTl)0M}oLghQ-d7v9%jrr zM3ItM+vJnw^^Ox^^+T^XI#6Of*T5O{nPzaWoI%(6oUJ%+iLu;|jb*KB8$+BG!pt(k zV5UHt@1H)8BbLiKNR)lr0^HeDSZ4Dq2_+np4w9lIE#pyBBO$q*oB0&*ij-$7h!-j7 zu3D;~t7U(kKbJ=A$3v6N8P5%+-vvf2moDs6K*%@ZzoUSDsW#%Hc(GNTQ8iupdKT5_ zXJ^n9Px$yP0gA?)!9a}n3QRwMm!}ef!cxY$Y=v4KnaeMyW2iI%;;@2q4ev8q zpGOx7oNz8v-Irti@e$`S_x8C3q3JtSmwlTaq; zE#)eUKmtKlE_j?;=;JHID@5Y{_O~r86xB0yBgF-Yr$TNzR@VNemF`I)>t*i>Xh7kc zzT{;g^ZDWTiLT02p2Kgn5ob-Q(MLGrxyj1f?qi2{3JcQImrwd%9)Ra?MMTS*B#z7> zCy68PknPu}Cn5LnYF}sQ$>I;BikI5zjuSm+Oj#gQ{aRi1`$qs8UWF~OXx#tXs^);0ZKnLvK`Bde^dx>y4xCFbjhaIGC-Oisz67cq#6W=j zD7QZK#0xFOpA>tJAWDcTA$@R$<+(pRU*fo^cke1bOsO=G`cIA6nUJb;*+bO_jx}a& zBww=&f;EQbg3s|$VD*#La2F$H;7OvH!k2v&qnHF^Fk&kZ0&dCqBF#Cl#C3-8$uekr zQm*^X+rdDJ?mCbO#Sdtiu$2Qoh;;QK;nGHk5@9K>t*3i}5sNBMV^y~b0hQ1h1^_mR z1f@LnR}SRGIkzi%0|{{Ws3iD&8%4oWN{5OvRdeX<1TvLW=88+ZK#YhI_f;Wc!*;iV z1lq;ANz)Z-M$k66naG%Z0Oh1`zgf{>DOpHoWxjAN?$mNjVm=gK%RV*9*V5&(Gmzr$ zy@a+B$*#GZtr9hpoBo0DN3%<#&+3f$ik`4e;dDQR^+X?+`OPq54S6y?4Hah+tEqtK zzeo~FOE{C*#b?N8`;7Pna^Bm~C9Sggn9dZ6=x-yzFUo|ixvDy)S}~O@ex!_h#X`b! zX%^`H2^6u_Iu|}!LaynQ&-Worwe&?XQs>;0%wU7t`y(0+sw5ewJ#KzN&1kabiLRiP zt51y?UtrGD^yl;D1YZR$#!EByGEo~7T)FO?pz`4%r?glR=G4Nn*e8_*?!;;WSndyq zNy3O}U*RR7#dk8I(#1>XiPHA{7qMAYw09v-@K<2W3#|CG6Y|OWURRgzI8h z4BLIsO?R2oalVo0Q^dvVQ{cY#6`XZfzCvx$!clQy7C&i4i5H>mjps>2ay*!+u`z<- zaAj*ov>8z;xE0!0hvRh^?!yzo81WyInWnPb z_~18!JwkA>e0LPDVXMxEY*kk+0nx&x4O;t@$)Rd39-}*Rty(dgplxtQzQ1%-I@V>c z*7>v{E*w3SX~bLjaL7ieDBQ#`W6l%t8GJ$7^@cJ8J=hDGNawQUjI^fu!1s+=vv@Z- zD^L;$=3{C}YG_SHe3EErFVL|-EC5c&n+TR{JcpHAnTi@zM101Ji`{k& zJh1jBl@}OuE|nIX>`Co%MpTO4Jl=GAUQ7BCsfLg*MC4GlCiLdAnuVRK`UxYAzph-m zrqsB{FH^DdYM>l)E4MQTW_0@=K%Z5)l{4@Km0NHMjNgSk9oDV#6^wy3rraD2d9*?v zt4~(sF+#|r`}UiJB+hCyW}b!?dw9{S3jCrJ$$o~S#*EAkip_(?e{LG5k6_6kkz1|G zYrGIZ$2`>MA&D~PGj1gU-BbS#*(Mi0!rr{|*~JDU&=$FM=w3EM_;UMiF$5f3B%M-A zRN|L=zak3)t~2ia`6((4%UbRY=sB~i9>T0Uk58cS!X9{cBQxsNx*)I=!~kyw(^m0H zqkN^FuY9A7U}jkb2pbrE1qIkQdZ?=~riYwbH zFTrgawQTWMb?JKZA%GlqhV@=fJHX13UZOro9l8~_=l7HXAt?v}o!?+Qr^d#bPmhL~ zy&pl0o$PqsR842o+UA7X@a!sVhy-5`8P9i`XmRuMbE7h9MrU|esg2p}x;ZK|+qM{J zs}@{uoy=7^6}7UIQUnuU1YO(ewzE=epWFJBF#KB4#EjX!PgC;~;6<;;d1$-T&f4oU z*TZ$;)l8sI_h@)X@Q}JZK=Ynxb1sMfpjlxsHLaYvv}Jg@x)b?a9jJ?}FKAcfmFBPDQ`~UX;65ukdg;q2EPaJ}$P;*} z0)vR8xw)7^6}30fDFm)GYGx8v5T5B=8Z?VHn-yzKqkKbD*_>Hhywir<|6?8dGjI(# zsOPIN=pkL;gyBNA2v(&~P}9lb_*VuX5_W}EQ+&IEyJ2HHl+%%h{r!%PR%a)`Im1p? zZ>5RYh%XIWQBbZ#^@|<~5+p%ZZqC?a2i4?CQMkceG;A4W#2JxiW?r0Y?#~eIM)rF~ zXdBU;-va{@s@po_z9(^=uMZ5?Y+34y*G)x2X7xT(Uf9$GtisLSqFmZ{bMV0ii_qmr4-e}wxhI&0doLFY8A?MU5eUl34+6rC6B3rFgMRveh z!e*?^?jO-Na?G?fa8I52Rvr#8^X(L~&c(87$>#$6F-BTqZlU&=|BibMAtcUEf3vOA z9f=$$^Av*t$XX+4-3L)rAioe=iB*3!Vf9YU5!(cd8t#F2dXC6Mi(%i+b$>)xuGz{} zan}9U@!lXhjA1w(I=6QQ$;n~Z!ENXIrKjJW=DtF~bS_vpIq?q4R6=pY+3^T(%%^8l z$@elAi;R~BbE#Lp_eD$Hg|H^WtW~zh-Jlh2Hr%~3xYd5x!`;{b7ZHg7)AQuwN1P}} z!r9OtDw*kgKce&Tn_cN$`toIqPw!SeS-6df@~Dud@w!1nLQdoPz_S;``&JsRS>{<3 zP?M33K=l66APvyV5lCNPnm7**B2l(yfD~)kEIY?JI`cR zCFa0TAj;utuog{ za|H8h);eQdRqI4yUY%$&P(Y6cm4+ivvFaA^$^bXts#^oMia#SFGiY>ylZYCC$bxWo zJIOt?1`{}uBj&5@R>%XCK9Y7l=ErSak)f!Y3UaK^hwXB5bh@0H@a9DX5gmvq%8HHJ z;g?}CqJl8Ev*p0)-^7GXJSN^0VnPIUh?{BR7vXT|`jQmX+4B2zXQ-jFM7*pcOSmv{ zBUR-KLQJHpdozuQVeA>FW>xpGcLxGqBQGN5TQm6cUw`j{KgOHp$qV1a&DBc2MweoG zw+ZO8W~~4S8&{;pAE==#W9rtdk~lEEVzH-2OV4P~^SoTPb4iuKF!w_=81b6aKkCX63SrhWBIWAy zwBnM~*Sq-Da|i)%(c7&Bk11O>+#krwTBJ*4pA}7k?J1mC&bhzE|M74*$Yuf8Nm{fe z>sT>-S8R>9=+*26c#?r=Ub9Bhe0b>M@T{FY%(U*A0TqVi40BwKpM29LmvbG%)59VS@9(egloQ#kYU?cN#Y$bT+_Mb z{r%m?4*OJ9#@GUHh_GgX3|v+q7H$q7tFP30=M z?f@JJu4WVwPx5&5%#|A7qJID-V(Mub=3j4EHutC@Ct(?dFUPAA&9!U2v%uoJ$%0Yb!n}(w_F#dOFXYuFyN{4x;Z6{tfqjS2 zu<9Nak0GiZgHx~>jgRY~jkoLgv=*P_ot&f-t8?k^QV zn(BV_3wnM^%mK<#E8e03o^HdV(reoO9u@al-W$i)nQ~tba?HJghphKW-3wVg>^2z5MxHUdf);vdUCX~;Fkwb%zOd)!g^%YF|{&r z^+Sx(@yPyiu3TTfw99yuqx$3V^}?)NkIllf(oiox8AEEndKCKb^tvA~6{Ckb$609O zk04&r#9O2c_js|-sPW$83g1M0UKXPi~Jl?%@1eN2&Yu2b<=#)<{awgV{q zC-y(s?Z6;KFZrYR-5G<=(G%N3FW`R*XxIRjxO3^ro3KGdE~STg@D0m`68G2gVMWpT zslMh8^n>6t)`I@v+E-Wh#d)|aXf4PuY(V}RjTGH9X%`xeH1?9VaXS76Wlhao6aOZY zIM-TmaVbo%l~&7y&;Er4=vmh*keDlQ^nrB9BYan5iVUpM4avFUg2|X}##B`$hg@hH zo#fp3E1?;YaeOSInMq5%av}h=rj?p5(!dyA;Y4#6TkahcJJB2DL-#f@n2pOSNB7rd zbLLvA>XuS3>+=L_6!(Km+&!E`FuqmIYuyO61Hws!w%wOJY9t97w?Bl&w)!X&e|83S{~+`uDEocY9q;j_|WUS0Wm_7 zgRUs4v~W8uI1kE42Cq?c54BUazmp|t!wpfSlhht7wXgZc+JsZEu>KcrZ+_sB?2b`$ z_--7KhlW#?hwqu3D5R51@*2kHxvSQK!s-}~ufqy>4ly80^YF+%2Q#|9sDELo4l>J+oxh z!}$M8aT!Dl61wST9Ckj7ZIkUYcL`D6#{M`3hjiU7y#p#q-2`??jvDnWYLBW>OL;he zujF-6i@sq?JAZ}yJ+M5dweS0_O*?RFGyZjJi$sM^yeV)q-Y;9ck)C%MD&t72y2G7c zVEQvEAvDkT36~MbLY#(&p)_r^hkk)8+C6BC)KbM=$y%0%_H|Ll^-(q=T!T-g2+xCi zI$wxougv>#ajT_-H?#Z=AF=(C(S$D%KfyCHimW9syp9e4+O2FofU?Gfmj|$CIG!Rl z;L9T3HnFlRG2Krkj??!kJy9=ZD zo3QGCr@zMYHr`%gY&{}49IzL>8DM;&hFzk+J}?j7h%uuu*$k5#s$Mr=_c>ouz|{Sc zI^K6G(#yBb80rtjdWcKGg4RQe>sCYy#8**)d^7fo@d%p58tQqQ3~nHgR6`&3aI}g>b~c>LN}BnnTG8?bvW2rSW7iB^6m)jPE4Oa{f$Mh}g5pt8IRZkBChKd!=hXjv*c z?bO^k2#j>>&Y%LpR6*RN?m7(Rwv=U1jV?ir+Q0Z$*}d|j5p&nE-+|`oZ7ewt;!Kf7 z{J00f-7d2x@ZkV^RlR9b!aV9119qG~x5{V1RpRX-oI%#p6Cx7JaR2uAMB^4j)8+L; z&i2_~Gsk}SkDHVsIh&EOIpZ`zHM%SWp&ej=V_A?~eL|Pf#Ns$__E1cdb~F5Em3t9` zRB)R8WalzOhh5W_#g|th#r^OFI4V7y?~M<7P+s^S(ZdRn?gGt&6-`vb3$7B1J`uU; z4N8$WcU^~N#{>Rk;`HRSyMA(D+?7k*GeLV2nlH@KsLyb?2+hou{4wS!s_zvqWo{k5wl}U%kN#jP~8niZNLap1E;`vh(hZU%oN| zHcNZoF#bOPLT@LuAzy|cblVuA&x7k9!dwm2o?XheGEZ#q2{?trxcBkfsFd400mYgs z&i#HsMtOiFq{!{hdiV_bT-`>p-8{H9c#L^?Lxwc*fXY-w`amwP<0Wn8B{?@V>ecUudRSMdl4~bK_?7HoKcY zJ0|g*;F7z6uSB$_-^rc$AJ#%w#|G7#CDlAJ?moFesaG6u^uSi131q69!+K%p7#2Pi zNf!>jDGHu@ue?Z&D%Tm9D3!7I%MA3{?Y|P(yezCxEV^e2O_6QDVqb%EAETs;KtCnx zJ$FxJ=$I`^zHmd9M##(QbBL0#JiD(0Nn=ptTBBl9>YlRMS$1y{yM~+4rzw~XJ9ti) z`SFxOTZ>GriF-2o8kMgzm9^IGrj}yC7RT?AP6Fxs@jT@yIo|$&DoVb}b9tVO*VCPH zcQ8Hc)E?RjQiyP@4+v`wzV03eSj@Co2vDVcuR&VauOS#^3DU9Q+hlp3Kg}p7_UwiIkuP_ex^!dkd6Z8B?v; zP4E&>jf~~M)sWAa`*PrF$Y;6Qex>vxfO7}4xDc)UCXY&};XF+Fz3!jh=O>qB;G4t! z=Ds3&Ar9Tv(54)CL^Tx+eDRG4{1aXq@7?b}4D)obv{KWS zEAIt@fOwp5MklI2agb@>OMt-8OP`i$k{IZsW`iJ z=+?ptG6rRlbjmKP7aB>QvH%i_kmCQ~TL8lODQ2XIHv%yISawfcHYQ}*iVU%dr^$3h zE1m8{nPqC!eDXpuGeyYt4YCd%LK;=ob7NoxS#_Twtu)fu8@|2$JXf{m{d$cG*>DI+`hcQH%_4C zbEZ_2nNKovW$i zDZA`a8!w<+pBtcWz{y!Pp9`{xt|U$DQ41==hhnDB`I6eEMz~w8~QVM0_IZtR*{+ zLQj|)} zRdnPxGOEMYY9kMsM#eK3=l7-&d3LXc3+&(Xx{r+bIw>P`wi?W@rWwf0BU7E`WwZtz zcm%4m{Ryba!1vD3%A!m--!`>WEq#L4c^%9d(jhrRsxtJr?#7(1ROmXN#&f#TB3IH` z($;fScHY$2q(P!6+22FSc3LyO=`wIBV!Yk5m!I9%cK`OKgdHghlb9o!iu)&ai)i=? z9fjI@o^#B(PP;KhMy$9e5W$3Y6`QQu)$3RI+SPp>TRNTX-9!h}008F(E`x^e*z}N8 zEz3>~{QC0V1R1hT+v99z{7qqfjPBzATc@c5NeB>V3s0<>r&k z*UHU$a`Ad4&6~i^z2?6Vb+gZ79 z@65b?(7dfNZLa>FKZc)}^0B78V3J?{15^_fn!>RN4hK8=b$Oh9=1IO*{!{J@$t*^Em=)8M<=UtYaJXAKMnmriD}eU~BJux1A)V5f>UJUh8cClKa1{1&1}h`q+`P$gq06wP2-9 zN~YA5S5oH}$M+s#Tj#E@%i5@7|FDT$zDdIxTeBqFqrNj$FOrhD7vL~ zV?k__JN?A1etkXLO)iFQa$Nom&Bb6R-X$BzDyQs5i98-S`v417$Q_NbzTWAXNiy%t326#l!Fq-!g|3|BZg}T2MqCL1^e%JfAN)=) zrQXDFOA}*aP6jt<9n2dAAsHkE%(Rq~R2Hh`MjBIU!QjHxNy{AnLMb;Tn=dsTZR zn6|gK*@Kth!*7Z2#PmTK23y{ie5-@u!Y&~dLq~A>LfN5i$*l6yA=%s? zp{phd{tH~I|86HHDqKGZC#y1WtroaeRh3ug$0jhaYB@0(%hTZlP=d*u+#f0|Du|_f zKL0XzG`|cyL&^My-81xMt-z^j1QRjvw5_Vu?vHuJs1%+8TOYr2b15kNNUs;)QWQzv zH6)U}ve-_}ER7^@C;|6xGEMiOY*VLzOn4^Vloa~QUUs|`21&Ic2!bi_9gxaD}Yr$CJ0t!8}H2vLC z6kfHS7^Cp^w`!=^vvNDymL6Va4vZ8KVbX`R)yE=9A>5eCs zW`PVe*_R92b_A!t8BSf8Co#?Sf1o(jaB+9yBu5uA)@Dvv@3Ll#<`qd^+ZrkVBnrNE z3n%X^DViK&d(v7kI!~fXxqh}Y+TFQlq}& z>Xjw=!Ej4uNip4`r&Pj~;!BHi&gQ{4tmpfVagWQcU$XB#?f`yrFGVnV1pnqmPYx$8 zew84KX2b%+c10}BVR#o;v30d~1PN!oqsY3a4%JYA z)6eIB8zX4#8rmNw^{ME+C>dZu&g?`1sW_7-XC3)oRA+L(KEJ6 z)~6txB>h-g4RcDY;Tx;Ig3*p{IOBwHa`ce&6vH>e$=kt@DFwokQF7|=yu!>! zgD4Z{Bl{X7iAhbJg^}bW5Tv?M&}8ELWcA;zx>eHkh_Rpxx#1+Vd1}zD)J3c1O<;`m z{K?n3hfrYpfnA`BaKuSsO5-i8`!Xv&MAkL&ruzhcJvlfgdGa6J53;}gnJ^8V%)3k` zOw_&Lp0pWm2@0qb^&;gr6vuw0d9G!h%3qyYazQF`Q-Hv!<>^Db`AQaSAuZm5cje$+ zBymHrd$kU|g7f$tewUg4Lgi!gqxZTNy9ILu?$Kif=F!Tri8D3{EOYr5!*e&{5u7|a zamID}vIi|k65y0zX+CYZWqV}027jsc2d%bN=iF6)@|7pMWwA_Bbf|Yxqin8*%+;iZ zS0^t)$X`j2SoM>v#5j?g=jCNYemaunA64j6gCv*NrJ@R%^&Xo#1I20_idFOr zZ^DI?qg-uNuGeq=4^(()?GV4ZG6A#tNk~N}M{V^OruaJzVJ3T@O$C+#WGHUpE zQ1zspKsGKNzOU9*OC|V(C_t6F(zSm5X}-PyE*hQTMNb!-FS?lO3>Q|77?&TLn4P<) ziz!f&Gv!uImgMQStcduLB0_?Ttp!Ic%LC!lyorkLpMNEQ6V5wjpX;);@DTz7P90x40JyD(w+_>9&-l#8INTJ08@BX(VSbr#>m&Ccv- zMy6OADSv(H-*I$b9!Z_Cm6(w^>KDS1g zRlfWQCm5wF9lRH{W3*@;R{}F)AxSwE0HoOc-`(rZ&%qPv-KxKg5<9+YuT}pLPi|Po zVC;xg{<#E7ASRwKB4|xk!u_#+?#ZuI{_JFt*S5U8SU$~;zpK6y-*Ou?{%|CDT`|z9 zyT(rDA3sD!m5?-Fo_g!fSLBzp%)I`#2KMqD?3VDLvUS*%oTOKYEEYxYQsE^h9sI} zXG3HS)tFwxR5>v2QmLDgx|$Y*K{bUsSAJ>TRfTy}H80U@9ZHGSALOqZaZ7&e`|%yf zvSxaY@8}ji9j!GsjHJMVUF6X-bLHTt>>88vvohi2AfthIvbwH*dGz&g@`53vT!o32 znk~v-y3xERnQ;h_45Y#WDPal%DyvQo`zUDJ^%S8Lu%#f9CX7nY2&a$M-Sq@M70sI?RnR$=ZObi>SxHsE^~38LtSB!W>+SM7#5|C9j=WTcmP{$`iT!K zxtDDtk#^?_H)1|Bj1Nn42%Jy96eS1fO46g-X{2js@|Dx~)AhORFDE~#Xg_;I?~xGw z4FXi_Zr;)rlJqrQN#$$#F)?^4_>SC zbwyZTHF-1a-^G= z|1>$K5FcZ$j6waa+uZJar}(P=*3_u4&*Flec2LInU-z=FvQCOV1aJ3mFE#3ke!QID zrT&9b^vpNZzgAw>cBy}n6wNqL{fWBxIUsErqu{dok157sL?}cC4<75bKOQ7LTHhHT zosY8zpe)H5z1YPvKau&KZ-V7A?R9q!K1ngJ)afM;KG=7k_<1e>lwOPuu)ta)W{0-NMvMUB6?(1W4Qe5 z=!r%|e%@J_oG993VW|94GEw0ASmd6`^3Ms4xD@_=GLJ@`8_Sb>6#sbRkRg^e<&5te z*6;razvrC)6n-qt|F_^5dPSsfZeD8NU)M$LHCSmda;aeCZo$ZQ__jod3Wpm#1Tifd zNBj;{M1+s30ker6C943=~MKNff2lX%--LQ9-4=s%X>2@TJSBp?Cg_B;&em!N|omAG?T4h6iPmirk%GrMuzj*r3S$hz_c=~bVtTc6!G<9kuk>8T} zaE`bJ3OXdb4FI@<7^cA!Vzcwdq<_urCi(ZIf01o3%kO=96Fuu6-e!{e$8E5u@f&F_ zM+)pibD=EF={`hCXpYnfBuiTB43N+v5fHCs=xwCX8~84gVKKlzAlWq-va@qIu=0N{ zjA+74#7DHLvrWPVg?0o7Q)g5t9csG+IFR9_*&*7U*nFT{^6^hYRsmj22N{Xu*Gjn`@(5PULR{#Azl z9+qLMB@O-kcMknMi4i>y`uhv`ZsZ!U8omws`>U3C^!Fe?l>X{9_y>lPl}|!*SwP^r z5J1?_;aL8%`@lp1aBCz{YA416i0g$GfA05}rN{FV`8#-XCvVP87J6AU82O|KqawU&BRka2aNc43jL^74)0`Yp zb1D-%lvFp~`aRjDti;n#C)=WjhMPBuNw9TCzrgv)i-)U%8yg6B2RvPOhSeid{lma z#R$2Js#ABq+h+JpxTUA?$Z-57yolu=aUaP6bvrq{!U$W$ZWD3ZRksp*LVTEcn6ajh z{0jPLX-m)Z=O0d157A8{_PGfgo_eejd}_cK8NHCiCbAjJJN*4;;qMP8s*2s47@VwM zHQ!6q)tujszt12L0Mpo~ZAl-h^e2(D@_jX_2E!tRU@j9uM^on!Abd4b#g|jdov^?#j$^)M(>TLrDvTb z4%%?A#eISI!1-J$vz{-^09f6LSk&&rrowEgkSz55lio78KjE!5*V2SC*_r+myGr`- z+Z>fu?S)($Bu5_jH#Vr+MIcXn%VlhOGuP^QU8I3H9?>dVs+s^#U|-WfwXR6=j#8k} zXw_Zp17PG7_WFKl8)Fu_B495i3ny*xD9mvs=qDD>RY0}Jxe{p7*PA76{5#Q zX~L?L`9%_aTM({2b;7k21kOvA-0KEu&XX7CF3ay7bZ^eIU)j*NCtv(SYg97z#9HpS zndju=Xi*qhw^Yq@(=@1H6Y+h%dzyS+ndm!)FCXFg+?M=%Svl?{<_G2XP|oI4r*qeP z`v`dTPlU|+eSZ_{r~HD%s<d07A zF}WJ&VCl>FFA^(E7iBBm-5VKd7JT|XlFENa_BtXeCNIFJyev8o68=CR_zo$QJ%m2U5 z?|;{yjUL8v|M=dX*4+<*cHzcxk$9 zN!F{mAZ$I`M4qN&2-&o)XNlg>bWkjE3{T|NcssFC9X+R=YnO4Ol4NE&S}HDlVZ-_( zZyIyiD}1sTO^wK@L0X>fUv|ig;kJje<MvuMWG6wwrp|9N=v9$4=XA?v1cA!w=+pshVEp{ce)nn>12D zBk51(ly#>6+u&jPzvM4(d+@e2-Qe+)1>Abx++LU_9l69``tsWM7dmU+62GiEWfw}& zD{j|i?%mLTw!WQ#H@4WqoPk0HZyqB{Q`Vs%0lK-=Amfq#?1kC&%0F9cW?Rw4$$oC? zXBGgLj4q0)@b8zx;|CqAiQ)g!UfJ?2Lm+(7vK9e|TH8)q1>{UC>mdS7)M?#!VuYx~AAax4nP(axKdC=ibBe z<>>38vtA0%OZS)@ZZ!IO^?666SU$4BnNk)Q5m7d5p)|_TJ&9C_5hCULZ;s#`?j@y#u;8qA{Q$ zy*^%I3XpsgTNl2?X;$ab4?kx^@H4ylvvaHk@V_OI;Ai%Vy>_=-hhX5CZ2)Wb$B-i0 zT4BJd7ki!ktvu`gYmf^PLtEIP?tE>AlW9Pklx) zamW;Z>KA|J+)A;k5aml_51<7V#f=*=D~YS-BkZGe&9Z9a(;D)+3~?M)+A1#UQPog@++LYO@00SwB8i2 zl*m**Y+-i>8>%9&VKin`MX5Uc6PVs!WS}#e>TW7Sm*M0%G}=Rza$`D!oPlrRoQ?-) zE{dbuQn;9QI_ez>Si1vJSk>fKgQmDNjRo56Ik7+uy~bx2v#7t^C3Oj#Djze%s!z%< z3BsDK#p;irX3V;Z0@)16;+xG)Y-|~+)JM8L2W0dHqVl$>1<+2d{GKT3@49ST6gU-f z`Y31fXU^LM@-OTmUlSe9PM*4#Dk_uL6(y%1nX5WDWlfcd_SCqZaVKbr(L3ns^@U`Y0$29NEBYR)XGHh@H_<2JaJf=9fm1KoOTT^{?1C~rC zTZgu?zc#elYA6Dy<2&-L2d>hGp!I;H`;ZgV@5x`Bu`6VZ==9>NctHlN4huUu@Qpqk zA4ycTtM7t~1e*v#LEoCsI3c%}h*;rf!8ZG0jA}bI=f<9az?0l6Z~^_;jYF?^VDZ;O zu6V$Hq4DVY^o5N_cefXLMS03ZgRL*zBsH5`^K@looLB|(iOq8)5}ahYcNF%C5gT6- zNRI9s(f}@QXAJO!0x5&$sax#Gc*iliSXO15pO*zUm3$m+fqu@< ze0IFKr-0`E4fIC>LSjP{3N?kyco6^JP%P7zYZGLDHc$; z+Xc7hq(Zwe5vIols&{~&G;zAu<{gEmsn~o9rxtVlqG>ZG?cwuO`4)GM=6f@n^V;0A zl@nLyf)fi$E+a+E+Kuylz>+Av@txn^I;!`(zXhJJsCtEka!~ac9oAdbdp7s3Ll2Cku#hn?Gtsg82wS5+fe;VY? zYcyXxx!LUzif`=3tJmTm_nfs(PTI=-yCi*;bl}`Cu>vMAx~M8ad{pVl83@IX9 zy5z{JM3gWs%7&=ZjJO=h(vuT<6DtK(a(6r?&q+*dWPd?Tj(^Vo8en2>5L3gh0<%uf zbw<9?#e$dgWIQEQC+@c3frH1*kRyEfb-t1oPU>NE}w@}lZu>sKS4HbuL=Z;X&h-2E0Mb? z&j|*(L=p{&cUxN2W&hCU>#0$vpV5nc@W$C=P0QRfoQW6I zz1T?VmLl=YzdeELKra)@m6IKb=OjXhvxVXdmRmCk0cw=TM5;|+)XTAweG$}LvMFi! zZy|Bkr=+VsMg$&TJrjV)oK=!ZB7%4Y;>#8naJR`W8A1GI=^d}) zr{gVt~Un-)&B%XMZUz6vMd|9d~IU+p6LqCw)LBG?q9*yHwyu4Oj z?;}{R#8TeSK><_49Wk{p>9}p!Or*Sh=E=B*(1W%S636`QR7xt@sksViiFDcU(ICW*pDSP5n^xm)kXc8|+~7*_|I}^;^a)si6pod~-lgzJ%Uimx;Bo+UH= z>1XO)E?;8JmR&i9qGRB9-QBp|#qZZ;OY{jEvblIEtGO(h(=c~6pXSadH=i@WE(9Kt zRQ+yhEhH09pfWL6{hCAfg1_@9b-ueiUzR+nby(4QNsZv$S4~z1sY3!S`N+EGC~2*m zIp=CXrhXuk3|4Syb}jYXJ^W+%e&i&*Q9uzN4EWkfBO;Pj#htMs3sIeMryC+l4LjlV z-uzO^;#7MpEsXDcu8BXLF(|Inxk!SZ;!BAF0_oZ*4;vD*^wKFjmL@;l!-s(=>biu~ zv~TE3XPneOtPBM*DQ7&v_&5|#6^E0dL6$(?(8XOx;-;%itkc6BsRpSow|X%$d8VE= zS+hnmdw3tQZud(p8^3)rDD=nxy0q>)oRJAB5c_7LIQAihW@%q0_vvwh{?ADdDDjfE zFV(k@)1f-F;QN{qP?v?kqW&o2PRpwZ(?#9|wX5yq%TiOiPAulwQe!c2CWyqj^~Lp| z!Wl*GbcoKw*ZtOK>i!Gtt=&1Els6>$N73X~2<9WK zEs{Fr`y2WNLJRS;LXy*tO?*+&pc6yx)nFbdgyI1I;Wb+K#MWakjAx4f_%tF9jT<$*0Sbd`ch4%8;z_r3vk z5_=Q;$obAfAZI>y?_>bE^rkoUMpDlxp(PYOB+ix8v$83sbmJVloz4@VJ6B4Q0S^*} zq`-ecC_phd1B&=MoSq~JIShn}cbtA#FZExpM1F+g>w}@%+k<29+XLg!w#7KrPah;< zmj5s=z3_@XRj|;y*MYpqeIIn3mpSP%;kdc5i< ze4(1Ox9)}f^zaZY@c?63FNpHoz}{qD-@(nEp>0d^$VNK2l9QVTowhAL+NygWG;Z4* zUuV_s>}%a4k_1~nv=Fs0AUXI+EST#1AfZ_u3@?&8`F!_}{{rtPT%W;vW|6~}K0ESX z;C;<55AO~1Wqo1?5tV%ZDM-ag&5}^Umx^*?=|5e8XW5w66$qm19V=sw}-MGM(bzi5!F({uHJf z#z=gXgpe8iNXFR++8e#D*c+}llS){gVtN)Qe|zZv4{&k}@KT(dDpN9?ZZw`bB&i53 zJEd3GI^&7mPipL9+46W(&yzF_NxWkxDZE7{=z4o-ygv@_{UC$G?wMIW5qyn_7IW9nmm4;MJmWbS z_$qygIM$|T3Z9?_mA`MLrt+MN=>JpE+zMRx5zU*0eGXmaOJ|kJB8Z>)>-tW&A9;p- z|5>uSSdL7LB|uo_Zq;vO5G|_3VJ`)+2+-GY-uxM+ZauJumy!jxPSQK`g8FNDYV1K( zNJwUdrdGWqb=mGnO%sP}#gM@Xd>*<-)69^kX24;(s&1Z6?Q|08=o>Rbn1R=%r#;(4 zmz6D#)EEu3vHP80{%GBISJ-TX%siCzGTXT}4&i2$bMCF+)CgCC^k%Qam$$_nI|{xx zvN%EZqwW{-4Ka5u5w=`ZX<1CZk4}RAVLuIv!RM;_PyK!$zP%_sYqv$>=9yMFb#afq zwY!SLR@FPp@=ig0jU+y?GovxX@b1l!&g~yAF62XCg}e2kSM8xoV!gOSmg~B;kClvA zP{*pfRx+?RCK}9tp=CYJ@@CIX8C=JaCYlf1P1P^Cl>_r5RdNKp{TZZuxOsQ?@KB;l zaUeQpd6U@lh42;g#lxtrJ;jwyz<*?@{NbLIB?yViI>)MilA6p_#-VF^|1T)W89`Z7 z;=StBWMb6@oM~`3b%V$oMl*|8DdA^oSW92h_ zP~JQ~vj!*WK77W(YoAo+qP|hgXm&QrmM0b)<^$^)+9qu0z6TI9c1^4O!{x?h>lO!_ zn>&ta-jO%7*_|RXXwJU#sDlFj&+|CUpT}rextWKZ(z}wJzB$uLeB>O(RB#(O*AlPJ zX|#;yNM`INmamtnC+pu8&WN&xhH{iIpZBv%{zlZ4XE%0-TC;ZJ48-;~*^RE;X6ege zVdZMp8)rsJb86!D7!TDiR|YWLdFDxVC(5m8Z(}Vxk3Ic$Ckj#)iev#r2)dslqH^0c z6|CngN~k^A)5(OZOh&81W4NIwJiXHLx%o?cUcbidB~kiGb}xN-I4Lu4 zG2gTEP9FR(=KVUHNXM5Qd8`l-AUx5!U_{*2TU zLoeW%=R{^j$>cwZ%Cw19o!sp7NHpU!b>EX;KL7T{5Z@KNtG6=nx|OH{B1QW9wsV}w zp$D!+mI?bc^Er^()+SPqekT*5z%Kp6r zFfU<9&My|M7Y3rtNhWnBRea53Ac@1W@|7K@V_D$_W#Wxse<0NKDd(Ct9OI6WY3;v$ zyDrbHUsr!eM!dp$0YWdcicodMu?AF44i{D*!xejID+>i|C_Ijbo8|wASQl(2Nk?kpR}pK>W+TUc ziF|SI<{w{=?mjE;DDhHe$dwS&6EPD@PwJIpk85IK(Jn_<$xUY6Bk~b}R-2GUMwe5v zS3Y2rCC-E|bDsNMPn?*q3f*snY*n>6fhj;TqHFyttw}dhdx@S~|5QJal)euey$wC! zRqs;T&zxN^nhA~%vUSbIvX#`Q}kywJkl3H*WcJK z%qy{Y`^w4N7Yhe_P8=6-Fo}RM4IZ~D+hEHx+MsxQ>jp6yZ8WHqlrzjM-w@hh=LzDm zJh6bb=GL(`bG-WBKtJ_u%q+{&85b@2a!9n-{|zq>69T5|7K6unyu9ktAosL;UIc7% z<48EG&2uD7W2in|sw={b>6^J@7wIPy3_jfdEesN)i@2jG^5-FBYTDyy>-EKrauO&s zYlG~xdCjO869w0EPgwOgzy$@xCh<4a2#_$3p!U~2&*bA3iWcehFi2y(ZYcnZ=_SoPNncSw!; zbCHo#OHX5QE~YH&k9wHz)Ze|>wE(k+U#Ve>-sl%_pYZqy!xOlRU8g=|_cto*yydR< zUB#kQg=;>@<*Ii1>I_#skfYcMeUjy>KY~Q*NQ1M+84|cPU^PFGg&@9ZQ4%GkG`& zp6M>*A6-$wZDil#!_A7e0Z2K$t%TvZfa`-Svyj;clrfLYJ_D|fJMZgG_XONqJf9*8hEhilWQHOx29-4GqlyMs49ky5O7+D(Sfb_8T*VS!Y|93{k z&v*FgHu0RnnKQsY_ZYN`E*_8m7&dWq!urpcbtLhwi6AiQ{GyWtFlJ-R(-j0%&OaXQ zDI_i$p17R;n=jR=Tz4g?tL&Pz6-yC2`R+xO*vamLc9O6(b^ITWWz!f<<7}@{&q4<| zjr{bkuixaX8maom`W*yjiN4|W=G)*#`zTvpCKj{7bhCw%yo-&3WzHGd0eYXHi_|T{ z)ZvO!wpUv+E)CfsO-MT1@b(YfT}+O}vEpw4B~M`vbCxmnvREnWRWYljPGFIso8;1K z^lv1s9J(<&cn)VDLxk*wx3eqOntNX+e$VnZW9?x|6MM1C#mSHwIJ`%1_9dO4|B%*C z#fvp3^n$<_glQM*4YqRHz+DF+;UEzTWmbpfCkE@?;r!>B$RoS)^UutG_Cn8>AwjX` zi%Rn!F{u(kwAh+`HEbcI-lNL$C6zdiLU@j<)pKOcUW_8`%6+232O+?HiD>9Ixs#md zKgx2VcBs;GgT>Rq%qCUM8jKmXs$^g9;m2Vusr;keo~Xqc=vo(*%9MxVpDdDk>A7e4|U09k!k^lzTklJD^37 z*g5M=QSKLe%Kf|U(YWbp!d(OKu2c&1PlWT$33dB>VF~UvYo&Cndx>l@@b_-v z9{gQ~UKdGTU*uN7APJ~QbEIuC8BTUyW7Ubo7+rfO_P$kjFweKIciuXM%fjV|n=&V- zJtouu5d~g2)(lJdElFa;@h?GIZ;9$~z^lsV3UE`;TrDi)8om`ZJ!sT)_X!3mTwyp! zr&}g%VeugHf0%rI@uuzw1BF9;HEAiAy1hV>thd`O)-m+-Z!xbw9_YJ6_=mG(s6)pP z(castufisB$MR2?b@&pSp6sJ`bLTnQgLLe7+8Olv`z7}ysLJWB5;vyg`D?I9I(wCW zn0{Br?;M-_+K;QqNT#Lk00{y}sgX;xZlUtes>B9P+#0Wyv4554CUhIt**RBTR_G%I zcU4y=o-i`*Ljq02A!;YyGd%c2SrPMf@S$PToh5u0if`$~z~s}JT=SczqspWG!*bFMXmLXIx^0)dz_Y9mW^p9lqJ z>Y!fO-FvhChK&6lAExrOPCi$8%C?sm0%1D$`djAgct~vbCXttpOwus?@Cp(ddQxk4 zXD_4{{K5I~2dqa7dz+Dk_8*z}6WWhBpg-ZuGju$C{qe}^UdeS%{3&)?#zN=5 zZDICjaUQ}rLsr#Nv9qN3)mohu6g)ay^RA5?`Me z@!u$OuTlJ~F5h6Kp5%9~&Y-b*J4j4QY@8b&CX}O#zvR2N z8Z_?faAA!JGucd-P?4F#4bpR|H`n6?eHOY5C2r9&hMGK)0`_g-| zs-q%(P?D~N0lNtpQx_(8t5loDKj6TV{K2A;FTH-H!#8fp3G1AK%ht>5pGPjMlZI@iGO;Ztny37C#wp_|45AM z*3gC3iGMm}0BfJ{ICH-2f877GxBjR7XL|opzVnxV9H4*6Wxu^gpqNBKM-qnJga5~I zaQTvAlKk3mlTo(mo4<^{C{aCUz45eNwoc;@%EV@-^^&{Jb)WNIE`Xy z&L41U;slwbe@IE%lOsx(7dj)?ai*hwP3&`%4QbAS&KoIw{Nn_>@tpL}o$t?E-|5BYW^)~YE5jqnQK#%3 z)MbQ(gjY1g8p-n2Jd2!ZgwY z)jz~>0A!8C+LDC4Gy0Ootae5>N!|?dgFEqx?mkQap6AQ~5KJE&QDQ4EmHKLuc@*eD)IW`K`^q-#MWeNLI4XQc2FL z2}8v0&$e5Cib^A*={D-?QifnYbv7QQtvyb}Gn2(t8@fX7J&+9c-h3nE14tc019E7+ zzBdmt<(|ZMyTRz#aOw=g+-XfG=lp`^WM0&b5~lVAxBf|RI}_@w6LO|Kh%kEyKQL)$@8DsecI; zape0u&hV9ALxltY$icb3c1t%=!S&PqQlRPgWh)n<*J4e*yixQ0@LTe$x%0f=(!TS_ zg+0-k7+F>~^YEEu92+!qvN@{pHtCXukK-ngZS_ZvBCBpfJc<%2B9P!BQ!?GhiKyb#<*eV9+riO=OrgAa z>P?&$O70oNu+B;>?)6%H=geu><6tZPrQQnj%LlmArR(?;ZEim>g0J1~{B7j_PIs58 z224!amdOP>^t3<)FFExOM`_U;AzFlg1QKHl+~s_cU`v14-4AO|r_q!1t6!lDWby?Y zQu1;j3EDX4TWM^prFKol01UaA-{R;_=g8jCn@9E|KtQ7YhAuH{j`6COqX7E~Q4=t2 zben6F@T+Tb(2n%`KH7zADoX}LtV$BY!W9-r$~R9PC2mc{#heBaKcmIxJ+(*e9eevl z!-9qT)~RKd@IK^+CW!vx$UU7NlH!O_8F<0ril?#1-1C8vkqeS@c%=T)?|ps9>2`8n zV3L5acTqYAKJwnZ=af7@PE+A!Wb>>o^B6!bb|aUaLEATXF1q3}ISDb7Zpd2s+zkH4 zJGxtS4^V&RO$&t`uqa2p*pG1HZg7ayuzvbXLSXEm7j}Rt!b*Z)5TBHKLX2>%1F4~6| zL8X5>$A4eP`}Ax(HL2FF*$Tgad7)2S$*sz84wTMEf36sG)Kg&4WvJ{vzAF6CGvH8v z8A5p4Lgps_l}@&;ySVYBEqV&9kkgAJ>uom`R6KxqeGs)e2 zF2|}e_{sV5Zji{M zsp_qZWE~LPTb*%tW2<+`%uu!*bgmQ*av0(7!s(+&z`uu(+U4V zRIBdCe$BF_hArHRcCNQrH7B=t`67ftbBt-X3{np&#~f$sE!=TNCh6!XYHx30M0v3v z@V7V+h@H=^F~x*=LhA3@s}F(cizgp&hQg1 zY{IpFYhirT%=BMW4}~(S+MT6?OJ@6CU1m&&K@%D)BL7uI;IPauVofv|Y?pk+b z0Jm`G$P%FJB%rqjo+aiWNVm3PG7P$)ZVotaNC;N zyLN(tm+ZW4MeSX?oNYePSobzxTl$6ltc4u@^G>!0Q}^ zgtN_pF9rhBrbbdX_F@}#Wo)P%DIBZX#ad^_Uom2YGR{K27kGyURV8Dcwa&ZFKm0m} z%9rPQU%uj(l2$TQ`%;N!u;(H(X-8G~NlVI_YDXRv=vrp<_N4`?qIvZ)^o6~c>`kfx zv?>X|jPESGi@aJp3TIZS@LkVD-doBpR|gnYJwUo?JMP z*qW2?kaX)k!{pzNw|9i&A9t{sH}&`fv}etwYXTn#%Nx2vlDMpuyTBTQ-hYz(tB!8L z`}mHY*8Sgyxyy+cvZD~29ws{8-o6qh+%wW^Wn}Q;u$C1>f-B8aVdklrCk}AXNu<1W z%3s|g8Z!KlGlAaNv&am;5dM#STp)gVu6>p?~t%Hav`2%h}uhnS(Lt^W9O?uRq@ zj6KacZ)LUI4`=tHn=^CZ^Y7|Q9!mYhqkCVTOGb!-cxP}rGJO?H>P#-1kSOfvdCu+e zuR9aV>YHvKf;dTb|H5GR>|J6j4o8Cbx;sZ7QwNzE?~@QF%iX?z-Kch?a|o@Z8&#$d z=2i7pcN6!K?H{cMUcaw;@aS=Qfz0J|-}XgPyYv8CR>|Zv&Qz(CBhQK5mE6g~zmtdf za_K~sOD`dpa%!Rl!p$Zj50@=>A0LN!dTNe}r}$?|#Dg~beC*hIrs>O13<%Kyzc#0B zHBUitBsuKV54$=ZM1AkRP_>YkB5A?^6o&jAR z8efM$Y3IynVd7o4*QcAa_JGJ%=Y&AIa}uiQ=UaG_OMYH{8cA}Istg3Z`xwcGO}?+g zo8s*QmiX{-jvFlct)xaotM^{|^ec{D`LBZP+l81FxAmgAbAp0z?nw@mB9vE7J^UIv4@_3weTxaK7lyF#5 z5Z$TQopRbi{$v1@*g%dWfzok_7Uz@nX0+mAJ9`Q~kH_xrK6EP>t`t0GHd^WzdpCEc z-;wd^7)b-u!BL9X(IU|{Zc$=*{JtDEHqQ63}7 zsd5k{`eS^YMY{J^O`cJXXU`ZAjFRVe;@cc?KV5=Nz>ydFh*ee`y@oiCE=GOqDi}mz zhCwJE$##X~Zf17kP23xdy;eJ-IL2*3a{H#>S$s)RI+djf>7Zjb^KNl3M|RB-V>wd3 zHTE;Uc+mNEvWs%-&;L^Ksu`cAYUz6as0a|JTD!LDs^CKLJ8%$csvzlPf_YQ_dq9Do zMSOC_vhRT9EN-_FJ_x_;t9YEQ+~M)JjL&UKZ{xu`mYO*Jg6(0>(ATxnTy^3rhCHQT z`g@W;0TIp#_zT1daa^I%3s*MpL@!*)i4Cq&TpxSdeUPvAZU11eebKCCmwjn<`R*z0 z=^vST+*pMkc{35RqSe&o|J3M_q1u@!l27qxXP`QD-Ok${=W&-j?z-(E9(T**?%NVP z?vckmR>MyKGe7sr&%IW|4d!QO;I@&XcEMVT1KyH~JJEAEe$5`T*nS^)bqaIq2)@!7 zp+>aj>+`0q(tYdsw3p3}Es}poF8a0_Uc~Lzfzp6IYo}NaR-NQK5~2zx{*E)>(3Qz} zN=(7sn>KgGZz~K&Z?#i$DN{Q9O7QG}iXwznV|Dr0Q}6QNP4W-*{9ppFb$;DTQG5Eq zVe7XoQwb=pB2Z;Xr2NY%=#Q)AsCySr_Bdw0&;3%Q?PXmqdAeUfIys#D+J&U~>QOtg ze<1pbsDOgZo74XdI{!`Jt@CyP3e=b(tPsHJ$iZNbe#$?Yy0SVI>jV(70j~HMl^@B* zfi?SCer8AHoRBk`DIbz`A^i&<9$Yh*z85|uNn(aJhimfh=YXsjbkL#I(4Qd+DFUsX zRzo-awM%~OvKqd|xhDk4uiaL|CjBJ_-lfpwd-_X^yh|a;*Yy_^c`&y+>E(Uw_?cYk zbEwhj%3YG-mRD)M)7{B4a{`teN!#s8FF7hl&i>CnS<{P>7YzuFm{@4l4F<^EIW=pC zkiJ!S1RhxsjC*d&wt*~D2OGXEYb6&FNWx*KNB8VNzTVx%c+ z_0e!jUGBY!@@>s)V#EK^-i}ec6B}_g(qoysS0JA8f9*37r8aY2WF2#5+#WsU&PVcH z?>8U0Z{c6er-|3!JfF$k4mh6)4ArAsISiQUcjfOyp0s8C5~12VO9YW6;z*u%k~Ah- z0xm!A73|Ui(E0aX!EP-8qa_84e6mLiKDZp_~Ua%z#DLMM~gzqi38kKMAaESqBVcYRG0xNzreG2N1=7U z95Ap`Q#pLOiPHE+GP`bK8{o^S$AAgP%PNkl$`eik?+GVCDO;AU^T0kE*H}-M|Z=*h2=dQMcUn=QypYu14GF<*a?Bg)EqwbMYl!-6XZ-{*J z^>>*N2cabqQ?yTxe*jh0Xwcb9=08ShugI%lx5BfBR7b#PFDA(@wC@<^^aX_?{MD*N z{6|vX=SY1=-n9N`#-dWF@mSll>-St6J>V2_httXTBp zNb2e$9g8vMq%otspX7W;8><+AmS@_^(6?v}_7|eBrtdR)I`O=H=@GwyCR%#NNqi>MC+Yu8CTbBrFGhG zS{}luFn~Q`q)_Y!zWt=jYtHF7^F9q&!F^ok^FAaT`W%?M^ZD3WD9tkf5&Rs8Zlqer_JHa z|BO4TlQ(i-1R;bY$i!920X%UQh=q0`1~?&R&g6lz8NoH~Y{3?Wx968Asx6U^&#q4F z5gq4MR&LftR_<5uq^`}xUdXPW%xL)OJp<|aMo*%bYO89asQFx%)t(jU`}ynC^ek}J zytjpA0N;%tt8CkH&k1Sxxie@Z?sqylGABixZ;rZ^2cjGW~E4{`4TCv{c-|L<~9 zQ0ucMDvIe=WNcbNrLoG&uI%be%&4U(iYQ5vWu?K4UpeXx)zTW5anVDVn`}lr;{~M17J2Rip`JB%=@AE$I`}=+V zgO1Fi)Z{urP{Rj}v5|p2rQ;vc4>HgT-_k&n&fOr2oKNCtdNEd@ORw~&ZdU(2H$?KB zYsGK{UP`Vm@n5=`_`G%F=X<8_%I51^mT^b#H~5+@rBpB#+fHNxitGr$TJ-;c>323|XFxvr_iQ2#NP-6w5 z08W=%it0wNbNVOdIj2IC4d$ht8cdg25mG!-`NTYX;v>nRc}o#rANDF)vud6cv9}7d zc_zGbP%4IrImkZpJLDZAwKMnX3ydna-Um$%#*AT?Ce*aPSerTwmRFsgz;Oz|@A=f> zO|9cb5`uk|n!GPQOie$YC`=z7+La0o=RXHk$PjiEY>^dad)QYCbJm!!YL@E`z|AEnZzGz!F(FFVJ|-gxU-`$Z*t%smHf!u(>lu z?c%5BjJ9XgzB`%!=E&ha74@d+&ocfsI~YIlRnd6E z-8Q6ci}^L4hVRnTpRY340C*s3UG`gSHv49f{djd%m28}kB4zjhlRs89Ry77$30@%! zs+2Q=%)f-m`#-^EB~Ak1}cfc|xh{wpdu4+~-pzdcUQvg)Y?_{q}u1n+|CIo`BU6#R8JKX`_ zS8+go5N@e~^m$`?A?^o)n>*d#Zhe(z$xb7c!d0PmX`=-h1MsJN?|%F4)(2{l#)@aq zreg)e2Bh6O$}qu9-4vqHHM4mW3*!zgO(1I%fDQK@xW=m!l-|(@sKpAGjt9p+fMKNW zSvMxFaVI;A19(xiUhMQe|1JDUV`gO32Vpn`$ZE&@mRUt-?SBA39ZJb^M?HfT=K|{j zI>o!jY;(JP8?sCqZ0L`#umrM6$eW3 zPhAbfIBjeGN8z?TFPU6DVR#QV$PJA8r1OY*eX)XCaKBPM@WH!svyKYUHOO2l!28;x zsY^|ql|2uet()my>dnW7Au(`Bo!*)9v4RpAj>YY?j8#w&(NoUxUX5Ig@L(cQgpFFr zel{tichvC@GS|=mBUH~*oR8r1tJ4`~{q?84d~lv}nJ%;yfmXFF3j_2XO6qm#b@9SM zyD7>;k;GI!#UvH0kRQMojy6Ky-_bKf@FAiqFFSDS9KoGj28&L7#;txG9)g))1<&aR zo51Q>t2k^AGvqQqc&4`nn1?pC;u|cM?&qHB=`O!d{1226I(*k)ZM4BWXs1-5Ma-i` zlX#l+J`36PLGc4FstJ|oFS%pZ8_Z3ALh96t7k`KZSbkr~(aUi=pwU?Dd+5U}OY)$N zp~Q)a7wdK-uki6FeKu|C1@C9PNIdvS=D;y+xmAQdh{%twN)HWHwoqA9|9&1%`gu(M z;CYO27d>qAkSK;G*zImLiEm)fuZ_R8KWF28(mniCALge1BYDDmmqce>9hlIcSNr%V z_fg&xZXh@u-oojSQVx@nXa)g3T;fnt2XDnJ?$O5b4oTTy>%1edg0sSeVh;i(+=L5A z*_?jrFv!y3iQM@$+Gy`o&xikQq(*+p{$Qd|h!yZLo6oXmjemb%^nz`8?>E_o>q36z z_g_4>T@#WT)O1QR_ki(_1uwTl<#X4hb}^t_;XFQ+0>wukZw!%z{WPW^^8_|x%qYQ~82kr?U($;pI)Ocgs0Zl^W8t_Hz41 zf%ebEZdUB#+N|t_)m>Sg@Tf*z**W1$g1Vbq`Kqe(GEx_ARzA&`r)LDyI%fpm;Qxi4 zRY9FqAK+s>H~HA)KeqahDsAsN%iZDw`9Qx$`;SKdagzU-=0A)c)U~uyO1?wo=6sIPaW1^ju8&z!Jv0*LF2|zXl>fB7~IKESMW{K{{*UqYjlaTx*vf~yxA07 zFlcvXf8UHCwHKB2y9=#$H?@lID^=^Bvx7QoVhsXQdOdP+djHnt0#Q{88&g)x7gJcG zR;HpRevmz90GAf5(PEd$$?6ciV>&+wz>MS5t8U!0s;S*pC8+zo2E!me!~bv9=ntpW z?ES6L`qQXCC+W{L{kf1oH?%SgeRhPOi^I>Q;b&*~xjy{d6n<{yvpAA>Mf@}eoKjT; zojo07l{=9)bR}--&}h!6P=ZB-NC2*=3K(iO0FkoVEouM08(SMH!P7C7DQvKMnY%6np;IsfpQ3ncaW$B2Cn z*CYFMB0oBoqZaW7+KO{6?m;)~uMKbkQG*%$S*ZS?>Y-xe}1p9!*Q zUYVct59Pi8SnmV@KmFgl_#*#elc)OZ-KEy^nz2L=R_tBcC3PaSgqiH~EC`Es%_9@{+dQHOJgFojM8OD9$1AKU2dc6DL zl((>%Fp&8A+@yaL-vO5dheE^Z4MQ}D#k_lodkjMx-nqpF{tTCBfbs_GLlktz#MdI4gDiEg2b zW0X62Eustl5_=v=W8R&Tr?+DHyOhn^4$YAzCy!c>qF(BQB_4yAkhzs z=NdpO)i^ow1Qeep+R}-rvc}J&xb*A^1u7IJiJV4CCvU}!Fs7V&S z4;k~xvxAcP?++)4%#1Kk(vO+(;?>xVPXO#32L*}3a(f&<@PW6@U59&KA^of_KUY;# zaBy_b&pJJ)Ohb4q*egP!{b;|Zz~lV4J*D2`&mVdRQdr_nog8o^ypsq zzzi+KJ9Hz0Iv#+~-Tc3Xd#?C-LnGPi*#8d-&v+D_%RQzdUtvGR9omV7hTr%G%iL}L z=Cb06>aWo7t!GRFU&_-^E)t`EW)0Fy=>e|6Wb?b({4GbTVnzD$FN;ws8A7!r7(-#@ zqRAU}iUPxrNKf8KX{_MNzrubJ^*c$sm%NpI8gJRrk}iVSM)!x;-|AfU;*@E@2COUb{4iW&q3sv5mmh8mk&pm}yfZ!^7!yAok^BY09~ME43~+QB1}9_wkC6f&N^YxW-j7(65xG zm#q|J6lSWvFq{lJ*vvxv*-KaTAv8fo{ac(?Ed%_C9;(J<12SOdQBcm?mYhCd3m8Gv z4-sW%fm-cq(HnIzT}qdFLj!2+y}~sa*o#{0UdguW3O124r4;oY|d=pQN{le&-&> zs)r*}vZo>9h?NitkU8HttayVpY~_~lb)WmiufVoZ#GabDJhxFK=|@U(N4iq@L5D^; zm#=Kyig{tK2UQD``}YXq$REkrs(ib#4N4@wN@R&x5TiG?%A zL0!7tl6PO}rF?N#$^g>BGBYWg5!qe$7Dm3@+s3_3bDCCbsZzKD+&2awV&^bY<;5gY zpNthI`q*6A_AGs4I~}5O2ib+z^FT94Vwct`lugjLb8}+h(oa{J^=}u7>CdfsAHnM$ zT{6-dW!)+oQue^Pkd&t^gWtXOAGnF6egD=OK)k$A<`OP`JzOU*W9FW_6FWURoKd@b4x0mO)C?AT(mf+6W6K(+=di97%lP=407jN|*%GW=5v;uxI2fMS*wz=QE z(&m2B+0on|KRKckBvEXTHv<%}aK{6P^ZFn;VoO)cBJdbEC_6Gt02px5ry>gartm+P z>~QbgC90O}fI#G07HRV)rMVbI{it?=B=@+NF_Q}N`5G7F`7=k>#+ET={hObtTSsP5 zaK)dX_9qq&ua4LMd)`H{Wh|%ujaPBWg-7Xy)8}Gf=!tX{-rtH@y&baK5oE{Mh_<+) zZ@)qy)3`$*wH!w_sa;+H2G|-yleywdji{gzg;4~l!6nrq)2)%Uy`uxq_s1@UQS-h; z(6Uw8BHx7ZbLk6ha~D-7bygpnDY)`_9+1F5X6v9&%TW|$jqA0oIZy7{3c)R+ugLXWTz9~nM!-2Zf7$0 zTJcWXGp)Q=-j3aqxi^w^?+}0+>*^HT5}dDF{Aswa=tlU3G52hsJAZpo5pLLnZFLG? zKEz0nTVDMdERnSlzyv%2F`h#qEUvZoet3)AmmjiKUj$v<27Z?0XY;sFkZ6wHpPR(; zw6wdg>|%Qq<}NntWJ`zJ|4we^=Png<81XNCZ{bCgT9IWbTBJvVtPJIVwj;^;hcz|= z2@L7|jXRWu>D_UDh(WBVYTONc+~Ur^4`!qp6!&Go#Me(+gr4&IlOQNx=K^$N${OQa zCCqW>J*^>>=Ud#N9haZmA;FCdkai+Z!*OYp8f{S-Y*3j=D{QAddrQPgzIzg!Ry;-N(Oxu06ZEqi_!=Qs>pJVy#Cr8OP*KZ24`}1fsf>D0bnmEM}@exd4 zMXyX-|$6L9_b0hv2xXcVoLm_B~VO?xoNAujr!J{+cLE4VkD7sm-)6(Q`g81 z<4Y3drQm--EhUgydD__Ybvjy zvft1bLfhk@LJ9v%j^C?oxKnDhPiKR8k-o%wBq(VIunqX*tr^!?0A0vl?2+_p%p30E zjW9hKI?MW())W2)ulBS&KiKd2dwXMM-8^kyZZ?e&t1jdd&1ubQvKsJ%!$RIY1k z@i+2Qb->RF0fV1gxh$_z|0i^pkCg$UACZZC8^;^0shG6X1jh@gz{QjnL(!LrtcaHM>>t__5;B6`n>xX| zp{#APdTX)XZ*|GB$n~SUSogKX6Ds#VuX+;u2d`S@YJB(0if@1!(fSq|o?dSE8N#Gx z?&ZgXM3a^=jHS_BQU{9R54RVOxi@-ghAE-f-fQzT)1tdzl8JlkZ!;$JgDC&qZHd3k zyk-qAUdW3p)P49trTkm=PlNLN^^MK>jQix@#o-UbfKD-WaRTGNgB43~pcd%Z3nWhq zM@L~=!(L|b(EZr++|4*UL}qF4v931JKhMf8OkiiKdKUNSrs38H?o?*X@x{3U<*6Jk}k z^CVk98!kbDKw_2XpMAiPvLetTHFVpW#vr?fKGeLnk3*OCT=%AxU-2aNIdxkYM~=ph zpdiOVC=kJT2toNg>YfQX*qAupCQFPcn1pdlp(JuIPN-#O>3!`b(e%i!vH%Ygalkw9 zW}VBd^g6dlX$2&*N)r$aqRD6W1Us4HaEscIyeC^r6o3PSm%cGU9ZY|d*1{T_iB267P2%8NDI`*A%De8-R0Vs>eVcrTX@y0BnGip zm_U`j$h}fkyuobht@<9VnXQotR%G&efE>&h6EACR=@gbX9qv^l5!^Un}&%;yu(3eZNZaC7xJ>f^OhKCFg znrNyv9KF#wCT0Z8{rwJw>J^V=9JUra>63??pJ0b(ot9Z z`K8|52iI0H@IA#DnqrIY&`%jAID~6I9R0&%L)XXh`zHQA0vJ!Pr3}yaX}vMnZ$Pm3 zK=8+#yG#7g%o{6zh!M5$xd+w^t?IeCFFlLK!|O*^vbr71{4iSZ9QUT;{A%Sj=}kbC z*AIU1Z;;H~Tyh!b@{_OWttt{k5Zs-AF`(@z7b`lLJc5$_TV}!Rk&FjIKThNMy(^vw z%a7Tk&1w zp`)Dix9CRgB@kE)go5WVW94yc&4p4VJFz(;(vPkRGA5#;&*vU>gKxIb%dah%i{THm zW@e6PL4N8wvtD+)7j6eCxY9tE11Ryakz1V-K)3cTfOyna<@RCe`i8(|wEe=QWThX9 zW3IRfPSLVVV)Tu=l%J~?kW2e^ITzVo%)8{a6(4_wR)(igN!ya!sjr}+1`B6tgybb} z#pa%>PZD-eziH;a#i#8FDeT(y~o@6sXXb~q_4f|e=1LUHpy$<{--j-ldUbE3L zDVD91Ie|hga!OBKm%~!Rgf2`#PV_Ixt+3O zQ3gT93#Pau|AesV#a#k7Ev^X-EB!^NPbw+SlNR^N??de)61_qjEd};l|;f2VPNrL1Ow# zHsY^QZ#(^EvSmx7Ee9TZzv+05`r&8aVb{Wv6JwlgQBzkVuXVePtfy)9>CT=zL%6x= zGUH8mJ-_$x0`6b(}ZTt8t)x0DsusC5+g#H)Zmi)(dH>{Z(YsX6kd?olqqA6K>3$0@;_?ZFk%#$P(kpvUt>uT6 z2&V#vY9gLWQPLp05#e1oH1FnIZ+JQLI+qE|p&J88er~%R`i(oyen23X91cz_U$vtAm~=lq+l#3NCM<*Sx_GU*8&7{% zxDu=G_Mzlm!Ij^rXmUZ9M91a6r)$)c%4y^c6Ox6)2SJi?v@`&$SKajEH1pR`dhbA< zbEoiAT{q>A8-{WEpjhs73wczW;Pn-+7`IcSOtu#(pvaeWyMeRYJwH(=T(tBO_{3`s z;JKDo^UqX*-Q6|*d5$%ir&7U^XW1&PiQMlm~mp9`j6xA)CdW{*CAc4OgK_rK`emp_2M;#?p*3<1u=au6~uP zni)q~jrUJs8T9u@m%4DLhaDf}o0w6%TOH?b(JW|K+Bz9|?%Vv56=j3#fPDtpd3@8# zP@q02{D2>zQBUCQ4y;Fzxt^sXC+<`9rER-qjbi3{Q_sOATH|;xsuOk3fuv)$xd-Yo zY=53EO5^*GkraSVxR;7|zEk3teglJmRmG!d;Vx|`Z`dyP{okWqXn-YpqLS?%M<=z~ zwk;|LjQa3G6&AhtlE#w1Swu(sF;SR{AHL@UN#5dn$|O(rWDrh|g_C|`wP@9*WbOsH z@VpfmZoQe-(8fJBE*vKjsl9IP?~JgdW|JeGCRU$h3uNzZ_t4GC;w{1PS9Hmda4A|q zk_=0(;7Qvr>AggSKmHpbO=>^kr+=gSF@3Ow{HBkPGFC>rPuP&7H=apr+rOuga2CsR zlJfNb7#|ZbVw^}l#VI0(?>RA^(`$>rV#gb4bu}-9w+eIdxnMwl$i4DwLGycyBO>+6 zD&IX69N|BGY9jZI;Zm_h#S*!1Q@)eUoS<4htK?qr(?y5^y*$cwvV-weg8iD65)^t zJMVL$`w(k%5HK%HO!Yr3%mfWIrOd&De>Va%;+YMg2AKsd%Q&~uD9#qwjA1#MU8GHpyd zz-h5viJcJ2=hwXJ5uLKvth9J7Rj-4L{F7=gN9oS&ly{)lhnCkX1f1LC49u zwR+{e11&fP{CU_dmps7e^bXM#%Pf_6z>Bm@?t#_7g$6pLEc0I)MFAZ{rVzqUi^uSY zmrt8ocaZ{mI*a3fd#OW0?|slLLbQq>Q(Nj&^$gImd?sA4L|soj*Ij(e%qY#aWI@{& z`_;8+|=W!W;JydM8R*PNj5R&ktuNnp=lop>x!ugc&1Z@s0LJ}Ze-OJLokzC@#?*2acTVok~x2oK34n!$P>@c z8{#%1mO^YcTu&%Z{?s8v1~pR|#772Q`$eqW<>8d|Gpk7_4b8o6Drw1&fnJGD`7QU{ zFH1V5%Fiiq62YsKEAwTmWN$oZ6qxFZZWI1=V4PhueUkEGXfi9xi}?%$WC~iX4=Jd~ z*JnOUu)1M?FNp3S65Kup8Ek!pJ{;kUSGX)of4H0Q0izBw4{DJ|RgS!0md}ZnuHy+% zH|r`5c_NkDW*z7D{<}B_x3FGzE6vBYt%9(QXP2<4*~95|5a#(`W##9$nCpx6t+W_- zxDmAF_Pl3F7y5wwpz+uWd+sYQ2(9RG9-C3gMNk3v(oszRo@hU6z1uNvvED?}S-#LO zM$=$ffB2w^%4|?7=;4S2)C)#cv#g^36sr8*!i1NAnvPj%DE&3&!6 zcZzNJrr_!|H1V#zM%#*2HV%?q%fm0@(W-k)MKwM-^)K_X%S)a&Or1!g=z$w$E?ivgx0%^iHwpn7TgWoGdF{SI@0WY?6*w5urpbj4(%_J(h#Bnsau*Py7h_>hkWdnS)x)cRVnS1UIFA9UAa zJ^&+7Hejm}} za(;&4f6UFg5m}I2%Pv>Hh;K^ky}G4S%gjK6>^F^kc7T==i>T#b6GPknVI)W<|*EEi(*T3nB zD>M9UE;RbeI8CiPcDv|YLI-nsF1OC@tO_y;KQQ($ALiU;?*3(-E2A2St1eVj0+uB> z_lxk;-mlkkV;QjvOIKjjsA`bOBDh?2cbZW7IC?UnGOChSwkGOG%G?@U@f__G(W=6E zCk|F`-I|FXb#@}Nuv@>OS#ay@YJA!wsb$1RBQ=e>hVJ0oC45^ubSv7GQb7}SyV^Dl zR6@!X3REY)L!~`4eB}pzoFVSkFCrEc<{S{g*3#>EFA2PeV9K>a1pDn`{2h1QhRwXU z_!BPKzSB&q#&KH4(Tr=%wsG_IW>TmwsxH=XrK22UCPO9Re3~WH=QId@>(9+^dcsem z;GMr5uB6RYjm!7@$sn_tH?_H1lhBp7blD?ZFdK=PZ>?Q%1=l>DDxL!6gT$0os8c4L zT1kMw7;-%KWV~%92|mW1Rg|=F*6?Iu*qBn-dOUv?2u19>qH@*_{NxFROOLKj6s8cM zu_0(vv^0lY4<2{-o*~~OT7z?IPOl!vP^-8rQ0x#$K(JQ*<|s_ng5z|I%tn0<4Khxj zd(oa(jN3EFjMV3lAoC@ClJ34s_rb{X_#NCzdhaFGg|BUr|Df$105E~eAeBtiO=}09 zsq$sWXSRbf6YX9aN}`REyrLDwZmnF#~P7A zne3$Y2?%i;f*;A=naFLtz37v0?tGn6=`XTXrV&o97IAVdU z<5Y=#kD2@tllmXWgHI%LCUUa4KBFl&VOOzQ@9J1~W~$%yBG4!^pk-&y=yzX- zvaC4s8Ay+6@4?oyF5=e*2l{R(3LRSFwq!iQMC+%%j^*T|_Jvy)C7;CGMXV zoG@uAaaoWtaB5K&$JVl7;e2}LDe!LzPwFtCTHd-8!~OJ@WeZSvS(3tD1LuDY22#RO zg31c}7O&(SyjKVzR*;LH5y24J^1@DNk=y(8%Kae2ke5Vvp#uxATFb61O*?J_H7MMV<}vPJ}= z6JKvV(nNxuP$=~a!Du=X&)9>Zx>QW{-1DAsPz~c0>-;|AFbo|2$~Ax5&wD)5y#Ot{+SP+OYA8HX~5lK(iAr;=)w3V0E#CUxRo0(OtMnVS4?eiPm(Q$*om}@%xZSVR;>o@? zg^iLQ{1}#Dmtr2!hDM||EB5CZZK8LtRnEyX z!e29s0f4UJ4R~-ux*q8&mLFyX|Ao$&kmfGw<0CRLxo-?)keSHz`)RGRr?}G=hH;RY zPpbvA!F`#PkC_F8`U~>>B3f+(cti?HIE5L~GQklyQZzA&B&+cZ5W`@R@Ln1ZGOzJ~ zd#9i*BGPMH?xMrR$VM|i(et&4o`W1png9J-5Pmu>RBd_ltS`bp7h9r`DS*2Z(4xd| zt9tiJ`hIPwtDYyuzx2e+hv*-3O$*_5IQc$+rN~ofC-Of; z7d^)&nf;`oP-ytf5}52cf5x)4Hx~@=6Ztd*l(eQ-UHwuMWMp7!1i7f6x7hTl0krK9 zOC05Ys~~Czz3u!Ny$z!`Cb=Xm3z-TM`Ev-h`k}%w7w{k-Gx=~gK~(=c{Bq}W%ni0Y zRI_d&jq2@fgxW^%bvORZ*W3Fo`#5S7)!Vy!yb{5R!&m9(OD}Im_|-R365Cf4{|3Ge z2rd(zM5|oKCUnEDkluCPuw?F4vrr0`7q9a%Ysu>ObS`2+a+ZZe{B?Ztk6S_%FN|9SaONF8JycWP!U-znp&vyhJG7Fu>pu; zEmcLS0?~St96ww-@=yuY*?EkWIvwTgkM!}D=eLdP*qqZ}3*C2@$n4TYIsf3w)!gbg zd+h@SXAUpcGvQF~*YBRcbtoQkI7Tw4nu5L9ADF&gbDx&YL4L7*i*x})MU?a*ca~I8 zf(OL{b1!Sz${;z1*KrZ3q^5-~)t3jzXHXHZNX!haS|4a+Ig5{$#-}O7r$62&v$x|A zh!XX`t}?xv`sshto=vYSzRqKPI#mdwI+XY4-;#9-4I>V-1J`aE*M~!w_(K@Iz$s;9 zKYQRmD@Z~>!ET?e8Rm2cm;Z`8UoD(c%QhVRrNW5tyx9C$H*W=tt*HJj@C?^zF06ir zwt4R2c2ReDb5g`<3cs)`HW97i_u>YbHft3gO5DZ*1~Hm5kaWeLcPIOISPWIQSP`%= z(khlQl4kt+h6b1m-JbLxqXfMbNmKkQ`OnzPSnpY^CBMsgtN|BDR1Gq_X_fPXCtoq5 zs+=?icXih?O|2^_$- zt4w*d!0OcJHPSy{8wPFW_p$JpQZ&nY78eE{T8QA^+P^31y=!~cR?_D({lr7kbV^h1 zF(iREiQ;gqVIqG~-*|KKjz#V=(pwc>yNl0d{109JUoBiZdbrE2_UVx;xdGN$xGjgd z8z(mxW0bkRkESrw?X@J%2_I z$}iva@e!(9XT(ZEUbB*n@teHnCf=h?x(F8uvbSjsFvLIc6DW4y*!c@Ilm%;SmHPR* zT6roGn-pssT&CjzkZ340?d2f1Usj1SKs&O1iEhQGcliZex6&3cGhSpPYLV2W6@xCv zX_;SC%yjm(oF3D2yWd}`s}KrTVIsgA3__EUy%i71%O4O0DbW%-GwPU=T)a`11Zu>Sg4tewF2^A>Fwd;;VD$k6 z0)(k}lE0PG^qOnH9nI*BXnVO%1=+F+OJGVGzq_wZ-@9{J8_-?+s<*G4@^16XTk9bE zGS9@@=1VeI3=4=a2vkV2c(n;*tdzWXBEV-XWG=gL)vX^{j$ifmS38qI0zH)e5LtQN z6Y4>!bMF$a%ITp#6g?GhYMmR2AQ4(@kY6Rp+-Ou{@Lrdr@Tlr0Yb{DTa*ZasHlE)v zncLd>(2#g;zn;0`w-xkwt6qkdlH0)1VfSA)qN;7v?l6QQTphYDeLy^ajFAcL?0qG= zAn)f^Q$2+~s64-I%`{&^iFVu84oVMIS*3c;2KH6j^;9>$bDq*TcuHKQs#XEiHOXAM zDw+FAGWX^FA@U*}=RNg`Sk^b=xv3^<7=`R(N@`@TgAZWDnyy#!Z0=)S0)I5GHsZ9_ zt@!mzy;d!PP37^8nLe8xQB@qvQVTERT`g531qb8-J3hSsd)S1$BrG&%r+y8%s5az& zO?dJzQmPMqAaP9BFgb+^`Cugbux#%h{zda|D@GW9%j8^_HJdtmXbCm z)W&kV#c5tEp8PH;!9DZK^fXdZhVihwV7{0lvdO!EI-;wyY6VRoXEkd)BLpa4!qgu|E&zhRI8x;!9aja&!LSrKF>|tmvoVVukJzs7o=)CBqvf zf7EJ##j_b~89u_l_MaFX{x@x=;iqf;yVIu;vv)u|cXnCP`3-kMNB;f-3QzVxuvQ!9U>s9m9Fl2#{9ew!cR5Icwq$KnO2hXE@eq z?{k=^;L$>V;pd%M;V1K0k8{-KG0_^g(j~D$=y2}wy}|txxysT%G9R{3IN~eh8u2dD z$cr2=P^SNd^ACUu;gfpJ)h?5q#v>2wk^Id&I|UP} z+(N2*Y?>w_h4%}M`e471>UddbW02XT8ESNr;m-tTL4vEVHYDhD_y3n6L1%FSH^|?s zejr}`L~Ow>sj8eG0(mSS@n|j+NpJ z+qNNpK#;KHRX=Xii}brkY2=Qa?G5CqTG7ArP;!ip zuXPWuCY}YECki`ay{P9Ty)`<7WnNMhO$hNdTitc^W_in^@|0R{c;F{YdUqxr!hs5l zNA#-p^B=u@LjB6%)*-4upb+%-iM{P7aWd2DnOiE~%6hu1{?K-_a+3rS0X( z(1}IVtV3Ly)X~RDfg3q2B^)!K{vlA9F#3gxfQ5z)XjAZ`CGJIx3h<*PZdj@3QE$%F543g0lS zEQd40CGOjZ)AYFn(TS`Y3}uBmXuzCrGYtqpTLO+C=zv#KYOVLA zIf#Spe-Xi(zP`HUckvwYcJj5>KQ;3TM%Wsgp8j22!8n=E(kPt8?59KUc#y~bwiN>H%Zb@9`P`$M#kdn7-KB3^l*hyfQ%jnYq} zK9+jwYOEDx^zevej+nAW!9}gzu+snnb$DM(>Of2%q8dkG)F3MD7^!*MF-L-l+^Vb- zB=ZLJb#h;Y0{YvhmD0;0$p_Do$g$Rw z;>h#gk9@di41KvbiC3+78n1D84f|k!kJ*bKy+djR=7By|L`Ti$mgjZHeSRJzQSFxJ zUE6OosFKmhhwEMJzB?00%Tl+-eT}cE)faDTd9e{Ye*loH0P;&RiN5GxGt6v zu^Q+P@$fN!o&%=9eHM|3F_Phjo zI`XGN#71A^wWqU!-j=|=Qq~a<_KTJSx1UCEBiTrB6S{hk9nUhmpMDHXDf<&b{`S}% zRgG0uQo(8~Ni7GbceOmGTW*g_h4our@cvG2@C)x$VS}*w?l0CNLo1@)&~1pel>uRYx5L z{g#atWx*DULUFu2wxn?T`tz*3kD@P+PG4W{_{W_VXmod#{skVXj|pu)Y|tkhFX7rdQ)Qt%fb{O3*r~g<1^%&ZaS(sj21s3 zuc10G6j!V#n(q8QKqj`p2pN zG@K!;l*)8Je%bwwvVI%>oC{T*7p@d`qq2R%hSsiOSA38w zWjX5-YA?8}=`fN}QhOU1?d|aQOXy_G(>Ac;cQlUtB}3d}Ty=-k^dU~d&;Ifi_*eVk z_{S~xiMPD4;^+a z*6mF8BKD6oJc&@GZugV_z$BKG_w{d6!1b;?7jJXvy(0EH0(M&=p_lfnogw7Io7P=l zT_w&>tj#KSBea5nAtOvJj{i9!;$`0a{{8NGbffX;J}|G~H~&R~sloiQelWinitYaO z?GWboxRrbr%+EsZZqA*{ zMhFm}1m>C1vn-vr__%W)<|};33UCV-h16UB26uSKc!A_}*KvvA)f}#r`9+x@1)2H0 zr_7TY#0v@y2eySY;cGd)4xTi!Vm{K(i_7gDtvt=;I^0Ezd!E$@&C#GXwjJa?~nC=>AOEJ z#Ed3=MTi>h*9v*_2H^6P2u-y0SB>{%Ctd!s+UMgggEi>H_P zb(XK%8&;OR%&*fYd6jNk>RVFGzHYoa1+Q+o&(`0ocO_o^Fwp?-=hf*7UX86|Td3dt zInwVA`yTLbCI-RuHT)mnitNMggy-PKf3@pnzRdx~y)weJG6$o>LoPBr^OQ;HKHs_! z(En`^pfBrp74&F0Y`FyQN`8Iil^+UkIQ34H!XfUL7vhY{@B8u$xj2rZ=5v~?J*1N` zUfvAbd@o*wzW_TIy13c%>~zonh~Lx8DCN4KUJkRG&KSKm;@~a}J2-aqX*Iz$t8iNd z!SyRC0Tf#IzRF4K)ET`%#;8=&oA2O;o@BTE1XIl;@d4ueeAQO#OQ5-cm5_k@ULcC6f<%>9jET?@&1g&f*s)p995}y%)w3ba+kA&mnQm z^j~?WmT{HB-u!({cJeHvKZi03vvFbdYK`AzM za=m-y-&A;F=g+}UHHag_^TM?BItvleRP4yEO0)~IKNXaDicrRvYH3xBG<|y5@vFsC0FLc@mcIS@|MY^Wb|eF4RcP-rm(n!~2v~gE zsYB>44Z=R*&a}3xdTzJ_F}BM5hHl9*93u4FDkagE^=;_EyC=H`zx!5&uTe{U{?(B$ zRi>NIJrd$&B~qq7D}-Fds+kqxzl(LW^*s-x8TR7)`pEyMoa{O%eOY#Nnj}8>>T^U_ z#=7UJJZTz5mxl2NRHI5mlMlK4l7?~g|6~|t{MMpv#2&?X?0iY-Ga@qtDN(E{x1&@i zm>k1LNQC?@g?cMkkkQjv+dQgIQre1GlGhdJvWJqCL-{km|F*S_saFZK8bYHNV@J=f zO>ZLJWl&Z6$<`O|2DdTaA6Fa89bao5ys)B*;72ww5s*}F%#qUiu-ol>(4(#AN#FWqVTN)#03PwBYzQkx?h-P%atBmUPo8=Q>@kGG#c`GkM$aN^{*6T z(mZnbTIoDKvs?Ip8|pc8kt@aLwV%9N3G4`8V!3y0U&!lHyz`fR7No3?h8(Jo8i^=C zU=H|d+1x%pogL>Y42N=qlo&Mngu>VrFCEJd(xOxadwTnS{?qX(;uljl#oNY>BzR#J zH{E+*-JJ{wD8?r3o!)~$Q-9YRh%JYFAqry{N}oQzB0lq?y(1st&(+n(ra<8Pj?EuC zLI!lG>=$=60H6|`Ep?l!Q{F*skUbTuVYbcv`C@qwL3S^`>NqKnpQfT>#po^mM`9`Z z(cFKz?LXhW%DdwH@2+3)`xqK|`+@9d$gyW|!JYZ;=E@~9e6-VH2a~3q9y+Eo%Gb~D z4>c_pZ#|9g!~#wO%LxOoRlJOq476B01*(_w>dvk;+}#HbMnGcfP~f`#bU;JgRjfJ` zG|Kxq+OKXPgY0?K#&i3x_hS7D`*xl-)W?VvXZ+}`5N@{L>$j()x`oAw_&qB&xZRh? zvVDow5bsQXq&S2l;Uf4Ee(2Y7aC!^xF45Bv`^x9V!!Ns6RKp&}+&ktG_d=0uBk?7x zD%w@N23SVx=#&XQ8-K-m6z{SZHG@ZN zy4DwmsQ&qm)nWfsbF!4ZQL)0uA3l3TRVB-16U}Hlx+*=g4|b-%f-~yHGqwGv?to(7 zTU32`{E%}uf>Y1CeO3?F8qATOD%*)LvI=&!v7_e>cfdQKPz29teo=gidDw~W!tF~% z+U9;kS;tVYVX!N+(`BZ~5B?@2uxL6$B1cE@i)`V?w5?%UI!3pIV@f@`oZJLiT~NdZ z55Hru{n+MS$bWDMG(p1HZA}aGiag8I_6W2I&$y3oe)}k1c*o#cEzvgju^;=WMumNs_fxzS-}uJP z&Ar9Z+_ZgIj&D4X!I#^E%h$T&JHcg;nB>jE;6I!XMhDI7q9lbsO#kW7{{w5xZG`ivg{&k(B63slIR+(rwz;@ch?@ zHPuh52{JD*Q%+droW&r!p6~LuuRO);u$}yl-_;uaOBPOiTgS+?$rv}ILp30G%%AVic7ig7a-S0&y%Gf!o@izj?k)7)0TS-#DiC zIqL4dT@|!{owelaJ0ztYPrY7+c=2tguXtT|vU-=DE!e@$-eQlfT`LfY)(=6>&Wz~wC)1dCW_s_WbzSTi&K>^x zu=?vMn7Tv;zSlTEl6^)mf{0zt10cl-C6b0cEgat!vGoC z6;D8%*EMyu&=hSDUda*gls}9I$E~pkb9!)QR}-0iT0P+ptMR_rIS9$zb#C_8JtkpU zBp|qXB!3bk-;UiG;S`REWpwB3TY0+CLDgxJen!`Sf^`1+E)x9C5a|A5?} zCj43-n?C3=s?i?PyQ!)5(vd>2m|?}GBZXo74cfmFUJ#C5Iuaz4maEpnGX4hb`-T_Z zvkM^Fpzwk)?b4B;8dW^(5pb~xOSc~h;Ut4aV(Adp!d-Hb4_yl~zowBz1L?Y#s7aHILO=&{ zk>nskKwtc{;5V`G<#D-|HMy1POQ8#~LUN6`$iK0Ea|)4i)l5%jbxRhTAgg?D(FjwW zeK|6@Rp`i z9C?07zw>*>7GS!HN>CS1XLYm>(Tf(JV|3jLe3a-V*TOraW$qM!FKbGzT4zE&Aj3e7%oAZSs&}gI{oCSYWh@n8>sKHO8uU%;Eg0=J6DL zj^01D_~VyesNh$TJmtRBR$XOvnn*hRfcsIt5IKgju@Isa)xeG17}nnZ3h zXXsjyqp4gXFs^45d7ql81Sq~qEH`)rcNO0(EATjO6;m%yR#_|6Ce#lY2 z<^HruCZGInZ|D>=#y$$G8~T^BC?rqpJe6*T(QO3gR3H!&Qpx+n=nD<2_+8!#oKkz3 z09@3;-s=ACufN;d^KwWpgfGR*O?YVqfMI=6Xm7;0Fu{3oJeOS5hma5nf1)|OyTuON zX5yzBwDE(?WTf7>H{AvqrMo0KtXVM6T&6piN|U*_I9MQ=Kdpvm7nfqnWv4@qB%Xy( zP2pO2L9Lc1>L)D?u6$QGBpC0>7mgKPibT96_3cFN(L~+mo})UFg%q+HXAX%lT3qrQ zZqE1K#RW>e%ZK$0Df@LV#p)iFroZrJuEeV!WA_pqxeVcKsiE6TJiWwiy?!UytTKuh z<0cQ~&%X3zG!tS;5%71EQABzn_57h*Z`rKzV)$7Df~=@Li#TkCghC2(PGptf-Ahe~ zki4^zl3oUZAY1L*?lH;g{48~csBKrv5-pS}=oB{z7d_v~?`~u_#v0VH2C|Qmqe*?8 z4!3Bk=+2}LJE|-rx|^T0NF?|Rf`?ThrTi25oNxPf66?6i=HT&mtm_@__uK;PaAQv3 znbaP%Tljz7bC|T}f7iC>q)sG-eJQKXzU<}|wtj={1uRDW%2;sRN=$sox|i)v4^5KQ zFIa}Z^r2=#TJ702x{-Z;&XI}S`b6C(s?si<_jq}K#JjoxN^dC-G+DjHPH?MOpQVZ1 zBZ=zg<~$bP{x3wJOCR7!HzCtxo})mSY$1)PrVW2TnSJyC5lSJhTD-W{%`!j2{UOv9 z#wuQX9MA?%MZhT`MCh^@gK;PH0YEKs9q<95v#4l!ow-MRUU5;!kWdeNF;g!N>8=L;lV>sE#9e+^sP}y zy2r1(2eB^h`kMw<^*kr|ndP^vaV}B;nyX^@!H*@(AlP$#1$}|lox45Mvm*XfvS;+P zyi5!%CiZ>7H?xlvC*Q8d;eL}nQt-wM)X1^hQ6t&IN7F9q&(}jx{vw8`r_)1d=c)!# zy2RoKqUw!B>||JFFVblLEz509=*GwmWcy-i?J%QRswiOyRvo5kZkn&W?Tc!>V3az{ z%{ZP^;n*-UpLS#3`Gfi3BcDjvnWy)RLeYJ0$l|Coo@T^3=(4S;Rwc!zSzgerf__!#)ZJ^8~BCG8SwPT5S zvw!oUl!^N1f`!w#N|le4B9h%72UO%g@q!4rn+>=@_Va2CfFA|Gsk1#mFEx8JMZ8I2 z?sl`i%vORu^sh3O(=j-R>gbT7O4xx`cDq_65cps-V*@EYelY0NZQO*GxC?)z69#rA zs$UCF7nnarlHnq?xrzoVCK;c;%@99P{i+*%g?tR>*T!9X7{vWEtoT6sNV?{LC73_aU1cEjJ4?)s!#ZH^AWlV=STesrUG2)Bo`hZY z4!7r)&Asktd}s4~E6(OA9P#lcEDV-vHt*>kT|d!ZAH8Ld@cIm{`|(EjU_zW*C>t_+ zsX@6s2yJN?NtavFEXfT&tvPA^bM)GDytXRQ`Gq64-5>S5mw)4=W*f=FjnPQ{^OS1* zydPh|vB*$L?XoU+=}SV}f&Numx3ax-Q%|wNA8k5HqVTnOzXjpCdrMLHrihM;{RYm;0QHcTPqT7yOT37n;T zQ#n195(PTU=n7R62QooyL{&a{69+7QS)%x)#qvlUOXfb(K%zhw{>4F7XM|85H^>~p zgW5k?o%d$qrSg6l@Zv;uSKHj1s_i&qFU}y!Jj0za*4_Ey6x__PGaaLiZn#&5sBRQI(@gQPTnWY;V&A@2Z$++T#&H@$+cFGfTML1F@`#~-B^utJe9aYM%1uNz*y1*PL*J3kD_Lrgd5U+*{nQ#{ zM$>bIHx+3CVZo7KYZgpCH|f7~9Haij_6)iuevG6l5>PJUa#5g;E<~YbO`jYuo6sf0 z-KI}M&zUtRDGujdr4tn+C}iIOufp+p*6osiN0wxcC3!;=U55D!@j{ouWnV8VJzlXV zM}-XRaWZ}TfFUa2)VFdLhmPR@@>R3qZB}tZN?6=1deruKf*++9aPsFX>0kLeP(2%5 z+gEKrmGB!G(aQB9!JcerRZHoKpMCD2KCT+VX7htj=OR2{Dv4{IZ9A)He;0YEF_v%8 zbyW;5Bs(c{>c0N4Tv8a=DtK@D1kj(o?c*aPaUO1}q2#?5TDPq0xi#Deg@&f?J*qgb z;q~6G!OtCjP!(%m)sr{oI%XTI^TmUSI{4hCKGuyg{kKh8;DA6?p3uQ#zeU46rbd7NO) ze4Q$fgaHjcujzDmbpu7JJ*^`?tA2I*AZr+qW;76-eC4)>EO2LQSI^t zFP{gPbIVl)ryrM$}x-3UusOak-Rh;WbPfLeOXvUdzD!K@i=WK z`zeJ{b=LE@=!H_?=MH3tFT71pOwa0~*|wH<@-2~Du1LqE>dfHE%&NawA-hZ;xooTd zr9ttl-T%^P`PIQk&sdLFV;(^Zr1CA*f2>iypu4gBE$W-9y{iB0W@Fw>)GyZ?Qu8L} zo8JSF%k2$0d!IWMb%SU0Zdp8TKmezOAIfSzlTBRn^K0HlIaH7Y3SQ$o!4q0t4i&mGstu6Gml)nK9;}604yWhHbe~fG?5}r zInIrDLFNLDu6|4Ez~zis)->CrY$s}2YppDmIOa2C% zeVx1m74~DRoV{R;_DBVL_V$t7gZ{jk1&kKu|JDg8{|^(=5b^^{Q0)0jhXMIGfS$Ka zX7KMBQI?dWQv3ZpEuLyB0_qa;(S%n(t|KKf08_{<++$uWrYO~5Ha@x;o zcjP;~0!gtf$@HP`aiUzKwlVD0;8`mr1h|A9n(`v7g9RE@N~nppnW;XU=< z-hiTan9sKDyEi^In1x-iMsKOu8{o^aJ{9Rx&~$8f3;!+J?#Z^4kLleZDNhuP%5%%s z$5ZV@;TA0uq`%cZZV{DG30Ep_1goR}Z(*_COpI)qe$& zZ=@(+P%onOIV^@+Bd{^2h166YEV;q3oc5s{wc?h zsDCqPyNy@KLO+x;4MvZlXd%Nh0*@f1P=@1A6DD6{fX^=%#B(ciom5-r@!+zH>7ElA zs;cEc&C0N9RP-oa&OPDzgZmvPqkF2XNY)^ux+)se$6_Apps$@()qB$Dkm#(C78%|Y{v=Er|C_)(lq0zfs}=G?RKQkJ-EOu^+Ej}_62hf#MiE+oh*x0wMYA%km^ zVI*(gN%8lyj@NZ2Ii{WGynfr1yEmaSF9W?Wpbh^CHauqy6c0A?0i2D_P-|}voyKy8 zD(<%bV7`ga#@}Jmo+MGGfD#2nutt#iF^$WRN!55d>kk7_#Y2w_Orb=L-{NYtpChW4 z-dMbu%N^y`#r^ar`JiLw}(TjegwBm@-NKfl5w!kt51gTUTrkB70|qYeP^}km9{ngDno;nUL4X@ z`uP(5^qu#3I_*2}aI2n|^|=t5j@n!ONpWiF4PC z26!OsSUz%vVf^hw{E<()vb9__#Op7@kBTJKu!!g<=+bQ%9eV1o?hJ12%-Pei!gYFq z6slui7NnNzweCp1$J^$~QFJFSkc|B1*SM`6_9ret6l{11yEIwH6|22ugQc-IS5eVY zeSP&r5vNpxC7myQq)$cbXWEP;4Q4913w>ikT;Mv=a=hlSN1}lu{J0leC^7f6kQky zS49U=pIzBhbhRscO88ZNsO$^szHm(^*KTjs_pVN`S5J(Jp2$6sDBP@G;f;FRo3R@^ zuox>A>n(iyD4RNsH1ir<1~$YU_Y9YFT^JJ6yCGll2*lMBan%=$wJo>4eLdgi+;isZ zXO6lGh5r~P-Bs?4f4|z>vnZlJAH?c23V&U&MtD}i>OEaE`|~qa_SapAmejLajGg{x z1Q!f`_#=CAddIn)NbOPoL7hy5wLx8@ETrkJ74r`#AIYUQ@AtmM1Xs1a!?a~{T=0%& zH~V8<83UvM*z->>r-XA&eZO*krtrHt|6+!J_WcS9xo2{B+4F9Nf>CxF^5_tT7x8EGBWPq>bsV?HcmdMk3d z0qLSga@jTD*Nou%n`Q(T{wuO~0lrl;nt}@g^sO4cTy*@_8Nt)*W(3^?ME9(03hIvE z$}w(f;I*16RQ<@U&tGlp!g{ARkj%8IrG2lFxrcl1 z=`tAcRFyeBa@Ki1t5=A`=)5}Xode{9(qTV|p`EJerVX^+U2PWctwr&BwqcAX%`;DU z;cISoQfP2ikbOg!r)PB+Nre+7gSKwIbENS!K0KWOFjd7z?JDs{$CwLgJu_w@M5&rU zCSUt3$X+C70_B>0n4wwA0i8_?HmL+!(}GU5Do!$Pv%JH4L;bmK2;W$^T0Y#baoy4B zV!r#-hv@~aO`>o(`!>5tU*+E@EaRKYaIygG$)2ZRGS49G+S1G%!tO0(6I@~*8fjOy zh9COZmEFj1CIo(F9bb9(4n7jOg1X>itNprVDIdjJrrw;}+MK^D+sR!H1ZP|7;I+JU zhygsvd|d$yb_jDzZkIa?z&7WW>vdh(D*ozKxs`t9a`tj&Xz%cYPE3CriB)q$cAHoj zw0o?6U2x@Bcn1_;L&9FroZD{pf`U410Zl#=-m}{MTinnGH-i;ad*(KqS~K*oTCiMm zGaNjiX~C{m#$t;V9BY&IQ)fJa5eGy-9OJ>U|KwyuLfy9}>YU}<9lI(~y<8)S*S!Uf z&|EOr$)kvjPf-r(YvhJSZHyA8<5fa{< zt&1rTZeCHcu!iTggpUh@^4Ew?v?yTYGvHv@KG(GbgVkK9iW_y;f5N9=`*v1SdF6ua zk9nI>koT`$@%!A%+lsRe8eSrA7z~xu(&vm~By;alSzZ{Otb5@9qU=rJqpYs~|3nf2 zw@DQhH$+7-+A67{M8OhGbRvmj6}4K_7Pq=rX9TN2Fd5Bs7@<`v+OHPthE-cyH>{#z z4b&A^Tq-CC_i@+F zA!2SC#fD_tfK72QeYw}S6FU5(j6G_er5#yXW8S#8&~zKqry!nRTv4-bLHFdYVntnj zAuyyDN``K064Gyv*1Fh6u1}xXH~2AQ)MoDS$e~ojc0y}rmbhs!85;v?%EhtOZE?>A zj3p4z0&rT(uj8>p+P;qcqWrqD?b(3gYTqN&^V5&p;-w^S8WOyzLddC4zv3D$GrpmA zAW1#ZOcZ0hqlXZYrYvp9KAw7=2Gr4pK-3gH)zc&NS;Rrq8N5tG1pQcXoqx6HWOo?b zu*1C3WSDg*O;fbl-N1T<4m_^U?Y2nj(f3UUXi6xu9xM!inWwavFo=`0WfUJ=6Pu(W zyqtz)K&Fj(m^X1V)*h~D9*~)$b0TCbURV1M_2p%3`UvGD`T>ric5n=_tF-+)!H)ch zV{B>yl!)pyNovij=lu2sM#EtB5|%w4JO0gh_DDh;*66}q6c?rLUp)(p2~{ zzF|Bwll=kTPy_d8LPNOslJ@%D!p`ItLyc#8ZWF(PoSF%nw#GN^qG9GK5tMAh?*V;g zijk9)TTaC-==&NX)?rHT^^0fqtMV zZ5?f<=-1zO|1x^qW&5a_SALPNs(7KKuV#ty|HR&IH{@K~H*PSWXk`STP19k4Ktm(; zDEx#>QHvQY;JEjEaFj8|K(|4{oP}E3OzG?r&=aypIGCnL!F@YjD?ib$nxkE{PwDn0 z+DETP3^ShHTc@z#fR)G7_h{kWVYZv>ZMw9c{cdWgo_k7ma0%zhl7`B;!Ei|-UJhqt zcy-Nl%!U=18b+D^CYFixK%sGC1g50aA?~CqjB9FsVwn%KtnS;VN#6}$!}>YZ{JPX@+@1-xA%HO*Gwiy=@waN`P+plzBEtz zeHUu!pmkvv(+!5d;C91LS1`W<7VsqCSQ8CmBSe&P4PA!>WJQeK;XK$%ypsj41)r>8 zNloA8=E=ADV(VUPZ}oYtT(=fRD3^~uNcuONtKA(*xTytkue9EHB)jWvbko)D`hWJ< zztG=`X;FW2KU!xsKj;koA>Us<#(u)*t?Y#KELl;ysPKd?x2LpoS#Z=xbAjojtgM%! z#*(vz!XYD14L8aWz?xo7C3%QckKFAa3dv?rmG-^@CpW5q-I-+hsSO!>6}Pe~`V4`g z!u4fvY)pSlPbMYAvsvRDS?_*JFQD^F)%j5vN1~|PR8PRq+jr{I|202}U3Th&?a?l_ zrHKU*Z{cuxQo~M|Cj=B}nx;SHf$@-JW@%Opc}R$}#5!)!L{O$vXVZie;R1npJ1Tu9 zC8RdHZLkBhQ*N}@>=43J^8&qXh`Q{9E{J*#2_G3qU6GiZvChDwrp*r48)jCX=YGln zc*T;BM~G;V?Vmt6GY9)yNwPz3tHjv#@K9Kj)%>5_Sh~9E1An`zS8+}0Sf<{ykwX;7 zG=<#B^7~|_=rb_e4eguVjWsftc&A;)+a^795cO+6mbO{S0VU^2ee*}5R&(6}EgvMF zLg}i*0W*H|qoL6e-ySWnCj-N^EczN4{BeZ99|b|2Zi9BXy;pwPX*WaU;~rMIseLSx z|BkuA&zP~-vlTEFOFb(-2O!t`7O6-04(RS38WPe&Raovtg^I9vf2q4auTfZ8NQuEs z_A>e9*G2yJPi@X$qQ7ZAQtQSJl}%_V2c)~1J{5T?g-{osV4ITp4({yE>cijWS=0E6 z`KdYV_Yb^Kr4#tN{iKN24Z5OVXR?g4x!BT|B|lf85laNpAn<5P#f}e+~mRqfmVbQ zC(0vhWQY*&osc_1uKiFR_(AcMv4~)(}n2VE1t6GXC79{uRFylF{a7Ses;9?&iY#dHxsSi`Gd8 z7*jB@b}dcxBAJF{lJE+v(Sy8m*&>v>*5&S5h&EM-eV8JWug?L?XKN+;y3AgZ(1vpj zkldXcO2_@n`#Ix{N~J|;bOA`z9-w>T+vChpc<>iA(b=~tUO;b6zx5qTnf zzHX*UzNFS|t22|#5J>>IS?i{C3F3*h^p!ID(jMY4b(8UMr0ZH$b0yX?8cmOyE6rmk zQaR?|>Ni`yu}{x18%P%L5+7k>oo14g+4R%hKPfMyh>g}B^lKMTcB-Gs`Q#x}=w z$GXDmREIp4S`M}vS+14}dNJT{n+ZnABpx3}%~W5=5Cm;aYe+wJ0pA+auW}BWASzRC zW964_^b5;7N!-AbIu8GBu8~?K8G92!*Ir328b{HKS%$V)${8it{0K7f$RTPO&d62O zO`lTt;y8e^T=-L2A+my|QXt?Bp_J4QUh!al#Dj+F-1r|iq?6NeQa5C-oHp6R#c@_& z$^BC73gE&uJ8qRyl(?f60vNY5JvPx}+~BBdqQ~a3t)UfRohFak)3I$yUsPwi7sEX? z2#o4((Df_<8WA3Pg~fKbSwF$DXk;k$DPt6X85le0z9hkh6oC~YlND`*EX&_?5f(vb zN;COiVJ~G?J}Z{$Zj+ujrfX_-XqRuVGsYUsLB(Jl-1dN0U)kQ69#;`w1kvOvllwxS zg%d||LS{_wpjXlNh!it*(@x1A*_S=sX8Ago3(ci-Vl9V)i2CYx$T)t-{Lg!NY)y+- zf(IDe6s@MGU;02VQ|Lk;6hLq@jkgdhX2&aurfO`GOpy8lfC*u23RdtTFQ39iXZpMv z_uIwvr#vNX)_F%ttQtELEkL{9^)q9QzN75bP2*O83b$;YUhr)!HKOYYabTz)!&@x; z>l9|D@Gs&)c4gIkEL=M$5A_vPB}O)7_RPQbV9#U+w*5$PfC>Oy^r!{*wg|0|#%k`D zT+5!AAKYXwX!-o=X2Q5{e=jDfauRg(r7v_emzUujA_MgktmH?NCr3=x`G4edvV;_< zd(!@T8N?bve}u>#SBtuf6*>(-HNxvGldz z_eMH?K1}$l-eM9-`0yb2`0d*63xdlGx>`%-3_4K^BY7vxM@#KagFrCm<&qIiT6oQ+ zbzgqF-_s}Zve8NS)0O(Eq|5k?;?C0=vSZsUVvXxx8>hNme z%Z!~^RL<+YuXX!m`7yg2-TkFEuo>N*_DGKU|4(*NxqUsHQ6ivg*GKyHv)AhTuM6L= z(D$F`zi)YFcPYR|2^JmJy1FesiU}Xzn}}qE-*QYhWRKiTN=IAnggm`9RIeX@u>LnNo9t6=cig29+)_h zoDp0o%9lRi`yF0k$BRGu3R3v-qSkZ3u=tbJ37I_8hbR|?AtsMOs2bEox~Jc&w%mK6 zym&0oNCYxS8i0gDo6VG*k(=f={j1CJ72>6Rav*`<)Ob6)u9WGlBtwBSMs>4JD)8yN ze4e*YPD@`T}{<>~z5{WsR~tS#QL2rX@eN<^b|`n~v4VI6llJjwz{wpl6yh4Cs5 z)EOENk5c1(g6F|_^8$m%KgkaHZV$uY3@|v;ZC3>gBF_OV&d{P;AAv$R4d0pWK9_Ra zSn39zfj2ki+Kt@P<*&82^~-Iar&o+N#c^}V0W4y|NqvHJf_Pkx~w6=-r9uIboLTU$mQy=3Z&-5q12Y^VbXF7zscNq zzc%XP^z)A>v-=!V#-$no7gvPH_!Ievc?T3BU@mC6=zo1!uTlRGivOJoH3D>)d% zmnzk6?Wx%#4|n?=sI(gF4%|$N{i@wvbA->cPFdNbOt}0UmROMFcI51CbI&c(*1HIj zTdK9#0fC5Z%^BkEBmKu@A?yK0LW%^_<&o8|$0k}SG?^Y|H&lM9QZLnCGmSuW`CBPX zM*X2)pHXf&Y-^Dh)tY730v6GEhabZJ8`@CnVy!X)Td{)NEDwk9 zH|>uYg;|fZj8|%w_E*r=wUJ^sSyRoR`{c>_MxgX*x!r$TUSgUj>r+JU6Y0jRqZmqM zR=MD+jn;o_4R5-?UZX_$p}qOP2M0*kG7~#m=t;1T?U>c>py^nVD)>UY=#U$CgBtGO zz>O>%SU*(MLcv*`b}Ku7MNYv?&bgw4tMBJ_aFtf*vYpS6nf~$jCxGu+!r;h{Ps{gLs^d7kvQH}d^;1qDIFVDiNqaXlS?)E1A$m+)sy4|Ei2 zOpN=9_&wOwITA}f!SaRc<%Q-)SSG(dxKXG89trv4ca52gy&0l`x9T$|5;%%7(}7pG zv2>Fw+dteK)L695aryvlj`^|F1kp&>&7m+*+Z^{Uh!`Yx;P-9q++{ED%*+!oULssO zyR1~K)dWQq1?j@LVksX{)P;E=KQ?B8I^5aZxnE;@*TYLr1xL!lD`KW(EiI zLxG=Z7p$M8dZcrM>Cjg(y;ajv)^joh*12yk4~fl^`34ex^1l&VEIou5-JA!Zu|Xb+ z-n}5PDj*0kuK2%;$-_U^YTG_X4G-Nugi|r?ct4?Bj>s8xBFa%!v6Ic?nX{0TWfUr zSL*dLjlI-0Qcb}`%t&5W*Ju9=pO&sXhi^|5knMG?w1=}Pau}XkL=O$wy2;P7->eGe zz`w8CtHgbG{z~vWb~0RkYP`9#U*bCcElXVK2Cye&MvUT2G)l3yFN@R zJw-Mj2K3`jv2ib~hX(PT=$DK=5)br7F5pp9ObDv<;Bhy|V}_pAq*8aaOoxfDWc2q9uIJd&TrjuxwMmE8AW8)PZfyCE#rYlX!;$dZkau}Ln`ts7|)nV&2D&NhqgvNb`Ss%_SUF#a1!XjI@W4Q zpFZmr5z34ro@p(0^Dwj8&s(eh9Nce2Ib}Ey$-?NTH{ots73_16v<6R|ZPN?EHQ3yZ zu^)h2X^lagtiB7}FKA&rOSY9Ac1NRL5d4OY>O!w)6_FO5?uq5F`oBL&afNEy`)wbT zp=58Jzx(g#xY(;qSF|)t|<)|J9GUG)TrUX@im^1^qMVc^H$9_LSO63sEa_U~O7OLWO0+(e`^o35 z>VMS>#y={ECQ|6ieENlPvG9=}dZUoGySuzm@l0$t>Qb6Y%E}>IaFOV&27_9k(c7|G50FavkA=GIeXMU3TEJ zn|fdeaF5(sWFJKQ_~q{Q_>VkxoBsO0>Hp?$3$IR)tjJm3RxEpv`t8ntUXwGY-WINr zT_H6$qeNy*{JfKfi1N&W(lrq})}s0q?$&%m6C$&CKrL_GvZvef)i0*f7TWgl0{UVG z8A}nI$2Wh;ubBh*Sjy`EU2U=>Uw@&bi4RcOM^$h#{(lmM{Y5cruUGA0qepmldJ?t6Z z_Xz7@uRJ8Ghi$e#s!x3zy1zqr?f{rx@&ruZP?Q816S7+F|Ic#bK)*=-+B1V%GF{vm*%8(6?|Xv~gnjU4 z>1T6t%ZfCg2RQm_G76jpc)ZpgP4*#Z{9R%(5HUy8#A5AcrWAN41-@U4*0Doo!w zs$l#)M*Yg|f0ag(oBt7<1+3BBL=^>wvP0hKup?mU=p37E?|#g^g5ys9{7Aoc_E z`so}Y6CLhEAv-(p#e3jMX*q5m+_0z48qR=Wf9RsZM)2u8!$`P3o*l8?t=grtvuHjA zdw;$3+o;$CHhmT6$o#DMn8Ex{pv{3r^@?ztt=_G9)p#a7-shFNlQsk>=qtD;jZ5Wy z35l=~4pD3NHlzhHP>YBgax#>8$xzBKWo8Rx4jeWn=zULmX_p(Ed-G=#|v4@b#-Lj); zRV0!Z)8gBatwmDvmQE=5#%_7b@gB`XN@b8C+hOIMmE#znmy~;hvLjtQ}6Ibw#1*3mwcIeq$`Xpy!tYJ2ek)##o&Wo0@ z)EvoKTY7_EXNKhgf%STC+4f{@BV%zCUy;}NCW(5B6x;FOOrS;h} zu+U*tmn^arjrwaE#$$CTrz_pVxLACtpkg!Dr|N{s(Y_#?2g6XFb~M{@wo8LlsU9N}+<`B@^n zdUi+-$r08z!#ezaH?{GepkNg}6x!WaVf{?Y``%u+wsq5JZ~nI~{rYsz;8417m)x1x zb0U5!<*q)xPK7(oBna<^M&p^Cw`7*Zb%tUsZ?ov`;BNy-y_)pEyy_^BYDoPCyZY12O!q=6Dm8||{EJx2J^EJqrF|Z!33$e?6nRrj#M{s1d7ihwuZq2T zisKWA#?B1A8Y^9PL}+D}mD;^_ma>IO;flN(1Kjf)gx#)1w5hNz(v{6TkdQCFM8yiz zV^TPwVDdu}J0Vk#c&srC(C*=0?EdhA*35{oiymVbZK!O^dZtYAoA!%M&Ycz!s-fEpWOo)=09-2O|k>qPzt$ ztZ^ZM+OCVWJOPdhTkc=_7H&Cj=pE_9w_fIl`fTk!I%Z%``W8mc_&V8oDjU6aUDYBT z27CTI+;Tr+I_{So8(VC-`VPNlT~;c6CN$+f%0Pdo@hQJQ#P6pky+28T!1;Z63cW*` zpKoVOd%E9pw{U%kzKaeeTcOC#$~k4P%pPcRvF> zBvBLH!*eH+XQ+uLLtyAWYLEh?!gnJUVsIU^KX$X^KB@`>&GIx7t!mEC$0v*Z-6pRw zTr+V_K|a)-Xzm%+Qc17mG!YbgKny0Ltai8cr($w*t~80#nOw*^$%6NR6VtL2c!9fu z7P<5m{aq6EM|rV!w`eEzx7z)x4$V!Sec(GoR#-)6p9zUHJD#7-9cOw{p^1}+LQucY zhE_k{9kik|fYTV?%;WQ{8r7WlN2((6kyQG%~2=>9ia}#4?|{Q6v+$otn};aLDW} zINDQ#!cV*p(1euPb!{{mUibl`>9&?YvZt9)wLUK{qGwt zAMPySOPm00{v)^JDIqgBmyX=2YT-RYiX*WQDUrsVCv5Btj_19LCpTse@-CR!V1!Rd zHiv;t$vN@#EG?M{IjQ|XB7^CHn?8Omshc7LxY2DG9uydhSbndg^QEHB%jo5wMN7bsm4T~RTw-)6Z(=;s06HN zQ@PlkLF1~JF>9q|2=3zNa9^2Mr4dD1X}zlmg>ec-WbbSJJxLE2P|ah@O2?h#VWWAt zt|FR~GriVOs;M)vhrMF`oSfN#aPh@X+31AV)sLzx)4f3r)oaGT+$b}dEk#*^uxyWd zAkz}Wt1Z28+<66B2Co7jP%;triH6})p?bp&5>_jt8=IB(i1GsP(8jT`p%`{svuy8zh` zI;FPpa=3o6YIC!eX2Lx2pUAB2%~M3-EE@MxezZq2Az6<3OEm7Ea*z4(p7Qgyog62F zRnyN7CbZj7;JR(cg=hIy%oucJ2D_KO6I~ewnYRTnh@@MNGZk0mcy6^lY`w&*ZIoE^ zV9Sj#R97*~Q&%t=b#n&Up9ckr_kdA`i0sk|z6+_Dd$bxd?-ny0^UCE;^zut~ct`Vw zve+#TfQshzeSLg;V|sIA<;n;PiCrSLm3hjO#F}x#ly+Rb^tuz6xfTu=s1RVmSRc93 z%soD8ih!&yeODIcsg3Ck4Aofq38P*Ab4E%uHm2X9i)&|*$ZYe-*gODQ;0Nm=75DcW z*LDUUL$Y~!f{=UN8j&`%2RG0%lEVzc_#Zt^&_JgQ;8&JI-N9;Xx!3_Gujgw>?zo<< zQQF>0oE#CqMwrTS(n1+W z2`osFFZvF4q)qNavp;^FdyA#gnE90eFN@u;zb)VeXqHbGG)Vh+>X05hljoE-RXg_w z@;7X?Gd3BW2pOA4aE&S0OWpG7JmHTJi-zh-HU=8Aw}u{-6*o2`l1Ewf`dITV3>BgW zvJ~&2)`u9AUvf5py_>#AKM`u7N#ut4b8r+Qt!FoW-!u|clzxxwNS9t)m>9e*@grfW zq55&X9lPx<7#V55vF4Zf0C(~CLU>2m$;Bu)$*&%gbbT4t|mGL>W@{NJ%YD4O6NtO}?f;BXbkRI$Iu27J4i2rHh z>rmcdcbC*rFI(?Zp@Zkl^DZW2-OM|-vCwB?Qpf6`WU7MT&x7_g$#t!|cE&N!(121|{ID#zc9 z=>(>rRjqT2W|x&j#xHT30RZmGmJ1#)+?%t7Sg6O)cFY`+7u_E(yLH~>LU(+3k^!VkKv|6mC$RGcgPwaHfn>FbQQQas>bAO1;RceWv>-mbzQMQtOKrMxJ1dwlb`uc@PWzwY!9$!FJn= zNCwQK?sa$3Nhp3@@1-|-kAm6rdZp=)qfZjDaH5cyG0(k+_g{}yKi>Va%TF)x6DVB0 z!q(kGG{{Xqf6L)lo`{Nf6YGHdSFnGS@*uR_DIOW=)xA;^>JN(FbFo_K4@w!j&bF6BeOtD>Z9<&y_e5^UnjR<9Qk&M~n zcEh$TAg#K$+t4oPVvL7za-mt@C2WIt8Pr3xuUWn2yuYmb0ovziNeXB$#)qU6fnf%O zrEd06!^M~*UH21;j4E5f!)OhRS?_c@i0s?c{a?N(pmSIaa=V=;eFv5V!0xWPkksI- zbKSGDzpO*1c5gCnq-SuHU0b#hE?!qRSz=w9pm$yJzS-rWs1=84>sv zNO~VT%?&tJU}E=#qx)2vSPQ2c-0m6-!D!0<%heU`owbaNi64PxCKxjJVtUTv4OOob z$B4|ElF69zVuw|IKr&zL z(QYe6~c+-41UxwinDx!+kghC#0ayEG#&}3TfjLhCGNJX z!Bhdt+@A7-`2NfD{l{*rr&X6R)^FN!j6a2AkmuX(f+HAXPNcu#G$8IHmYS!-Av@&D zmEC2taAi_?fzt}2x~IpnH}d{!*`T5r2zMhF`B*%X_SwkwRqGZ72h&v)58$3#2{&Za zCw7uQ-?v#rP&etn<*!YGtlkI?-uVaj6%_j4i~hH`&ubyVY}CKFnPb0ch-(gExA-A6 zK%goR1$&u%D;R=8`oi(~0}>+|aO`viI*D|+Lq59P>UC($&HX?mWh6gnRUpfO1-lyE zsjj^Mxtca+I52-05Bd=1w4m-`ehg_bBHJB}Y<);ki^`o47)ZeX>iW|EQh8cZ>>j!E zOz+crcQlkPcRTljq^fh*oy4-tD7wnhQZWYJhYXC~#XYwD?F1dmF5zOr&F;@Rk=MH9 z(*Un-a#d6xtIl2fY}43>QT}AFjpu289lC20-<4?I{ua~xZU!b9Z(ZFw;l9a~S1#JC zgvnACiOI^Ov7HDLEc7Ne#vZ22%V}f3eF=>O?-`*q0RsL?kda;u*(Yu?T*!!_M$qJ- zZxMB_+qk*Y?5NRrSo-%JrUA$)7*E6e^BL}vWvDy{F}mU%bPd!xcLz!xO{WLMA45Fg zo4nP1zX;@D>1$xL2n=vBB)6R5${0>~h^~6#;J6f#>TF9GIG;W&C*@M^_T#hr(~bY@ z{y6vDAMB4yi|E(=dAZ*ow{QQ${qdLI+y3Yg`#<)_#&>?OKYA4PFZ?f@thu+l;j-Qq z?T=+>Kr@cDXSB0Z%yb3;sC4}N~ISyE1m({2)x5Qp(}($xs+vD8$F>s}U> zTp>WjjEEYdKV_j5PmHnJHjk$&=yCj}f#@Knhh6#Y2i_iGV@{YS@Cve>#S6Gy zV1u?l&2Z`x-)a54u0Vx6I(GNzQPu#^R-vGpAVMYpxMgZ^jrd5U)eijm2eRn;9x~@u z)E|2k;igQ;J+h8q26Qhh=&AX(C#-+U4h{17s^AYAD~g9M0c$4mwO~&GF+KP$j7b!G zs)R4OV+;0jz|!yWQ6I>j+HxflSbgb7!~$?vUdIRMuJ&vC9=+FCz4E$CP&qW7slzL! z+y6~*8tZqAwfq(|7Fp3$?v3Q3l`bGcAwDX!<>*Ov??DZv9W|XJdTZDIPCcgtL1V0z zo1s5qm}~FiNv!1;V5#Z@89u)TP9Zf!P($SgmTv%Wa+Q4@lGx^W<$`$W`);3A)@!;sV=?Nlxf9uuX0PDQV?5{7K4e1GTq<~ z(M?vLp%v*y^dSVtNu!9pvzerax?Y7fj2~;-KY<$DQR8(Sr$8LKvzIc-CPf65ZWeaK zenE0rqE2gBU%gYTKJ_F{y{B0xaXK3H)8m+R7rWI zBt(3=4kL-`uYSl}pgpbGzri9qJX)Ao>Nb#~n-nU)-D35Wrp^_%3*1$o(mrGR(3a~M zp^@eK(~c}b)^8YZFQNx+pI{UqyE_lXRdcf0QzF7D?Fh2q8+oYRjp66e4_IH2owg4YnKO)hBQZ-xB(83qRgmIPXI;Yse1n9c!TgF(nO!Mx|@a z=bK{B{ie0>8)Df!oie#UtSFvbVxT5AYljus2sQ_|Fmz}Sw=HR4UB;O~c$%{OYS#qa zMRPWv>4$KHdRsz$_Cz9RtW-y$jC?Wz%^=>LgtlrMIF=eB;_-8;Kla3m#AFkIBl!jU zVi2c=JK!_pD#3#cY8w^XR)@QC38$WjQI4*Pv0sYu5U`f)Tg+hN+(Q;pdTy^gJr{_d zf-tFVfxfLWy#(aZ^@xIbytF@R(G?Q%d`2Z>WxsdT1|~LZERHB zp*(k&AEIn5Gh-?{Z9~7r4*czy1K6E1D0m$?*xAfD+}~Kq+HaL|_N0YpcH%m7SUXRf z$jq^c=L+1)58=js?TQ7g^4@gNuKo4eRae7)5!kLEV1TibSNH5&T-aC_CiM50DE!|C$9+ z1q?07Ulw~okSbZ&Z)}ysPqlDQ!YZIemMfU#U%!Lb=~|52Jwz|iggysv(wQ4^U06RX z@4v*k8^){oBoDXqYbHqaLHr_dLgS>DRxPq)aAYuWeMrA#GPBixBPiE*>!)Z$362+b?*Fzw0BhVs>tc zJ%0jKKj>u1U9AglUb}|ea$KCE2xa+A2fah-PRJSv?sUoqp zS|n{8ouoc9xSuzC-?>-^?0hBI+3mcFhjqW6$ebqEWKT2^{MJuoEe{h7#s3p+x%(ye zW$F6X42SOH;eJxl9a>O^&qXU6mf>1+xqb9c+MDhs8OTCe6|W z0r0=8#j0kbuC{XP=aDC8kL2VePqFkhLrn8CfM^h2ln=}aUe+&yk@ zP}pP3T5f9v5aF4HT5hphXR`hC_1wZ7x&xI98t=I<&K`?xL3yfHxS4%0KGw1W^KwUvs}&!{Q*7cFXL zc_zKo{p$-s?Q{76l#iD(E4EAGM)BSQ4p7{GyL*ZBFzt%12fPy3j%4xpHCl+&d!prx zbz{;+YN0(SVgRw0e{qgkf~$qd99V7xSxHfHe*|Lrd+2ho^__w zO?5{DlU+`8@nrbpvsH3n%{R@H_|*|5p4*iB>joM#V=Jf;W^AAwFhe$=t3^F70z|t` zix@BiHP!E3|3?dQEBHM7BU58P1$`F({Wj-R?dPJ$ZozsEAG0H5hwQ?0Vp<{5##YzQ ze&-9@E%=)?GCGs~`M?S+g z^+xh=_A(=$?&~>QyAyi56S)ZK1=T@!SMW(B5`4rgy>zdl9%fiUavAMX|MoASH1==U`G zE%+NSg=KbEidb<#apD5^!9sSWcPZ(@dL;nE)0DY-9qhc8n4I!^w11 zIOs3{2>DK?d=Ec9%#%_YgMv4({QLbs9WxpCm)_A8{|(uzdl!<%;+dFgtgV}G1v;

$Jp8g*W$BxvVcm$*cw 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%0A_Thhw}$!blDqUM0evj!5wERR+{6>3uTKB+(( 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

*!S?Fe2$L%@t#AOlSJy@x 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

l|sPT-z&&y=5q`q_jmPky*4I>O4JZ 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�t!BfxbsS^! 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

2j{asL$8 z53L$nY?ls0+XBsOE4Ui|jX`UG_C=n9zJ)g2O~u)2b7M9&G^(3f(wrnsThKYpGi*&8 zC3TBgA5N7{_)X7Yyc}FengSkua&a31cBz)ylw-TC^)-Os{Pu<97coBAcGM<42L8PZ$%<^N@57OO$y9|dZ}zAL{K?^kq+a>)x)!Y^eOsBqK&WpX z06Y7E1-CY0vfUbt+grhYFrd9jS_?Ei>!<%uL2HKQeIC)K zQ+Y8ipUR7IYtY))$=mc?#-m7H4tZOkbway>XIEwyM=ISx0U)W*G=UifBU2da1v_+o zTEZn&JxN7txgOlh8In>yGmf>2j&< zm2320A29tXc|Ps^@rAH=O7&Fh4}?y!349~?rhi=s=d+{_ZO|H_ z72&YyE{HKV|PqZ!2I-%7V#nI}Z^+U55ZHjA#HV#dF zLO-Q#hc*VS(wdt%(4J~odj*6yEkQjEplbl?3DS-4to zhrx|0U*4{nKbU!^DF!F%rAG(AJ>h?#)M0eh0xfe10LhnrHo# z-w|ko&}{9;WS~dTYxp+_ZwTHec@DNa?nAa+rZFsTDNoC!shC(uo~MD;vaNFWljbyO{#FEjq8)}-HdmNi z&}*_ zc9~zjiw5LdG@oS&&D9$>W^1a`vzIh7TNz&N&as2yS`=_hqY5Rja znrEyajnfnMI=cpHnHm=Sc10^MZ$&~J0skMH+$%O;m=C%^34Ov(R!{6zAYApZqsW0ap9yvd(0Bp(rvpYl@+ zt?d_g&5w93@D9Lxq`+4H?wjD!g)VsQ@FoI}`tf>WW8-djh08X-#Zg~7c6xn;wDY8W zP&AfJLR&t!5Z%F!ZA|rAd7pt_^2>#Ar=e)e&^AN!^NJj_vg_#I&|b%Luo>C|Y;lM^ z7AvX-a|n#tTCa=P9zR#JP(J>X^q>`N)vp$k|A^)J`JLRS4%Pl{liLS&>|S8i_G4fh z{wKA6*Z7$0ouQ6S!f%IvvEIv1<(-9g0GgillbjW3ZP08D$d@JRSCt)(|5!`m=C#$( zx=C}hXg-a~Z^83z7O!pwGXHPDexl}Xwk`>1L;1`guqPgI<;5SNsFZkT=7Lu+q z{_wUcEpzHJn|0CNDz)Dj`1U_6xINzdEg4hL2BA&z9NNX~of$JOrQE67u+5aF|KKX|r8#FAJB%-A0ATwUgkk z9X;XJeWSHI$v6#f1sO&5Dy{Q$!A{+0 zF}Wd>h55X<-_G?mJ(JJV2DU7-SiBF1Hsrh^8wXw7A?@9L;I?40g0=>{)YbbHSHx|OTjeL96< zXD}|euh%vbDz!Lix+H4(tGSW+80kM9=g*~YRdKwHY6I7O;bQSOZ$pgPEn3U*S0C;N zTUEZ8ytIrzg3cA+MeD8**=8}Pqu|>r7Tw)uUiYGTZsu|`GYavT{CV(o4_GYzc9i8g zRaJL2l=-XD*~*)k|AT*&>ekDTb=GV?hqr8V#^si$Ceo~ITHIjIxbL!WNHxjjsRw-P zgBFtqU^2ry%(i-b=EuGi(!C?#YahJm))RdlMP+u8;~h4pPJ_)qWHI>z=|X+RSleQ{ z)AC(%Gyct=FD6t`ip7U0A^(V9tD~kX~!28dnZNA0urG&n_+d2W+>e+rK&le+It!9$xpbN7@%&Pm*!? z=TrvOk>^uKVU5Dy099&BGfXY|RV?cZvMV=Ut!d)xeqPdXQ}f!M|g`9xJOV|*vw zqm+)H+IlOrWoR!I!M8QC@D0q_l1`|;Tfx=UEf$|`Nbm7czwJ)>ACzhb1iP-by@pnwG+ts z_!S57N1wG={Cx`Kc*CG~)qrUR^NjE=bT7(F3;ZtlPguv-W=rMeApBnVyJEhz-3wLb zQ2&R)je?8UiN>IfL-TE-cAA2AGNR?6O+(8=lkSH4b-s^9s+5maFl7yk(fwJJ13O@s zNbGV}S#6cO1$zN*Wh33UIY8!bZG51$B)0{8#rDPGb$H~){%Ae89&nA|Se7h|QAM`< zuT3mBAN{YZ7;n&=E>4iXW9MS>qPV|UJ(k`nyw+%ypILCjyVAa5b_Jh}y5Q_+sV$S? zbE=%>FK7G)S5p?{r)Vyce)N-aD*tuD@1>n%J6xErF>GFF`47`7zrTsJdS4Ie=bIOk zf!KyQ|Ipv@_db8a!saMsP?*pN}Wb^F89KK!mFng~QNxsZ1>AJ35Or8>_ zi~3sWPxTf;cAs&ztT|)lE7)&v^)=?m@|D_zEv9=fl*8uJ($PGR~m|xl07UowIU{}C4 zt1Y}g?AqdX<*&(4sa-5k=D_rGS^2$bF?oT~c^$HM==xc+ewZAaW~w>OhHQBiZUW!&(na?j)LzBrIP<``sCyˬ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 + * @date Wed May 18 00:21:44 JST 1994 + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + */ +#include "ruby/internal/assume.h" +#include "ruby/internal/attr/cold.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/dllexport.h" +#include "ruby/backward/2/assume.h" + +/* RUBY_NDEBUG is very simple: after everything described below are done, + * define it with either NDEBUG is undefined (=0) or defined (=1). It is truly + * subordinate. + * + * RUBY_DEBUG versus NDEBUG is complicated. Assertions shall be: + * + * | -UNDEBUG | -DNDEBUG + * ---------------+----------+--------- + * -URUBY_DEBUG | (*1) | disabled + * -DRUBY_DEBUG=0 | disabled | disabled + * -DRUBY_DEBUG=1 | enabled | (*2) + * -DRUBY_DEBUG | enabled | (*2) + * + * where: + * + * - (*1): Assertions shall be silently disabled, no warnings, in favour of + * commit 21991e6ca59274e41a472b5256bd3245f6596c90. + * + * - (*2): Compile-time warnings shall be issued. + */ + +/** @cond INTERNAL_MACRO */ + +/* + * Pro tip: `!!RUBY_DEBUG-1` expands to... + * + * - `!!(-1)` (== `!0` == `1`) when RUBY_DEBUG is defined to be empty, + * - `(!!0)-1` (== `0-1` == `-1`) when RUBY_DEBUG is defined as 0, and + * - `(!!n)-1` (== `1-1` == `0`) when RUBY_DEBUG is defined as something else. + */ +#if ! defined(RUBY_DEBUG) +# define RBIMPL_RUBY_DEBUG 0 +#elif !!RUBY_DEBUG-1 < 0 +# define RBIMPL_RUBY_DEBUG 0 +#else +# define RBIMPL_RUBY_DEBUG 1 +#endif + +/* + * ISO/IEC 9899 (all past versions) says that "If NDEBUG is defined as a macro + * name at the point in the source file where is included, ..." + * which means we must not take its defined value into account. + */ +#if defined(NDEBUG) +# define RBIMPL_NDEBUG 1 +#else +# define RBIMPL_NDEBUG 0 +#endif + +/** @endcond */ + +/* Here we go... */ +#undef RUBY_DEBUG +#undef RUBY_NDEBUG +#undef NDEBUG +#if defined(__DOXYGEN__) +# /** Define this macro when you want assertions. */ +# define RUBY_DEBUG 0 +# /** Define this macro when you don't want assertions. */ +# define NDEBUG +# /** This macro is basically the same as #NDEBUG */ +# define RUBY_NDEBUG 1 + +#elif (RBIMPL_NDEBUG == 1) && (RBIMPL_RUBY_DEBUG == 0) +# /* Assertions disabled as per request, no conflicts. */ +# define RUBY_DEBUG 0 +# define RUBY_NDEBUG 1 +# define NDEBUG + +#elif (RBIMPL_NDEBUG == 0) && (RBIMPL_RUBY_DEBUG == 1) +# /* Assertions enabled as per request, no conflicts. */ +# define RUBY_DEBUG 1 +# define RUBY_NDEBUG 0 +# /* keep NDEBUG undefined */ + +#elif (RBIMPL_NDEBUG == 0) && (RBIMPL_RUBY_DEBUG == 0) +# /* The (*1) situation in above diagram. */ +# define RUBY_DEBUG 0 +# define RUBY_NDEBUG 1 +# define NDEBUG + +#elif (RBIMPL_NDEBUG == 1) && (RBIMPL_RUBY_DEBUG == 1) +# /* The (*2) situation in above diagram. */ +# define RUBY_DEBUG 1 +# define RUBY_NDEBUG 0 +# /* keep NDEBUG undefined */ + +# if defined(_MSC_VER) +# pragma message("NDEBUG is ignored because RUBY_DEBUG>0.") +# elif defined(__GNUC__) +# pragma GCC warning "NDEBUG is ignored because RUBY_DEBUG>0." +# else +# error NDEBUG is ignored because RUBY_DEBUG>0. +# endif +#endif +#undef RBIMPL_NDEBUG +#undef RBIMPL_RUBY_DEBUG + +/** @cond INTERNAL_MACRO */ +#define RBIMPL_ASSERT_NOTHING RBIMPL_CAST((void)0) + +RBIMPL_SYMBOL_EXPORT_BEGIN() +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_COLD() +void rb_assert_failure(const char *file, int line, const char *name, const char *expr); +RBIMPL_SYMBOL_EXPORT_END() + +#ifdef RUBY_FUNCTION_NAME_STRING +# define RBIMPL_ASSERT_FUNC RUBY_FUNCTION_NAME_STRING +#else +# define RBIMPL_ASSERT_FUNC RBIMPL_CAST((const char *)0) +#endif + +/** @endcond */ + +/** + * Prints the given message, and terminates the entire process abnormally. + * + * @param mesg The message to display. + */ +#define RUBY_ASSERT_FAIL(mesg) \ + rb_assert_failure(__FILE__, __LINE__, RBIMPL_ASSERT_FUNC, mesg) + +/** + * Asserts that the expression is truthy. If not aborts with the message. + * + * @param expr What supposedly evaluates to true. + * @param mesg The message to display on failure. + */ +#define RUBY_ASSERT_MESG(expr, mesg) \ + (RB_LIKELY(expr) ? RBIMPL_ASSERT_NOTHING : RUBY_ASSERT_FAIL(mesg)) + +/** + * A variant of #RUBY_ASSERT that does not interface with #RUBY_DEBUG. + * + * @copydetails #RUBY_ASSERT + */ +#define RUBY_ASSERT_ALWAYS(expr) RUBY_ASSERT_MESG((expr), #expr) + +/** + * Asserts that the given expression is truthy if and only if #RUBY_DEBUG is truthy. + * + * @param expr What supposedly evaluates to true. + */ +#if RUBY_DEBUG +# define RUBY_ASSERT(expr) RUBY_ASSERT_MESG((expr), #expr) +#else +# define RUBY_ASSERT(expr) RBIMPL_ASSERT_NOTHING +#endif + +/** + * A variant of #RUBY_ASSERT that interfaces with #NDEBUG instead of + * #RUBY_DEBUG. This almost resembles `assert` C standard macro, except minor + * implementation details. + * + * @copydetails #RUBY_ASSERT + */ +/* Currently `RUBY_DEBUG == ! defined(NDEBUG)` is always true. There is no + * difference any longer between this one and `RUBY_ASSERT`. */ +#if defined(NDEBUG) +# define RUBY_ASSERT_NDEBUG(expr) RBIMPL_ASSERT_NOTHING +#else +# define RUBY_ASSERT_NDEBUG(expr) RUBY_ASSERT_MESG((expr), #expr) +#endif + +/** + * @copydoc #RUBY_ASSERT_WHEN + * @param mesg The message to display on failure. + */ +#if RUBY_DEBUG +# define RUBY_ASSERT_MESG_WHEN(cond, expr, mesg) RUBY_ASSERT_MESG((expr), (mesg)) +#else +# define RUBY_ASSERT_MESG_WHEN(cond, expr, mesg) \ + ((cond) ? RUBY_ASSERT_MESG((expr), (mesg)) : RBIMPL_ASSERT_NOTHING) +#endif + +/** + * A variant of #RUBY_ASSERT that asserts when either #RUBY_DEBUG or `cond` + * parameter is truthy. + * + * @param cond Extra condition that shall hold for assertion to take effect. + * @param expr What supposedly evaluates to true. + */ +#define RUBY_ASSERT_WHEN(cond, expr) RUBY_ASSERT_MESG_WHEN((cond), (expr), #expr) + +/** + * This is either #RUBY_ASSERT or #RBIMPL_ASSUME, depending on #RUBY_DEBUG. + * + * @copydetails #RUBY_ASSERT + */ +#if RUBY_DEBUG +# define RBIMPL_ASSERT_OR_ASSUME(expr) RUBY_ASSERT_ALWAYS(expr) +#elif RBIMPL_COMPILER_BEFORE(Clang, 7, 0, 0) +# /* See commit 67d259c5dccd31fe49d417fec169977712ffdf10 */ +# define RBIMPL_ASSERT_OR_ASSUME(expr) RBIMPL_ASSERT_NOTHING +#elif defined(RUBY_ASSERT_NOASSUME) +# /* See commit d300a734414ef6de7e8eb563b7cc4389c455ed08 */ +# define RBIMPL_ASSERT_OR_ASSUME(expr) RBIMPL_ASSERT_NOTHING +#elif ! defined(RBIMPL_HAVE___ASSUME) +# define RBIMPL_ASSERT_OR_ASSUME(expr) RBIMPL_ASSERT_NOTHING +#else +# define RBIMPL_ASSERT_OR_ASSUME(expr) RBIMPL_ASSUME(expr) +#endif + +#endif /* RUBY_ASSERT_H */ diff --git a/libs/libruby/ruby/atomic.h b/libs/libruby/ruby/atomic.h new file mode 100644 index 0000000..3eb80fb --- /dev/null +++ b/libs/libruby/ruby/atomic.h @@ -0,0 +1,890 @@ +#ifndef RUBY_ATOMIC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_ATOMIC_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Atomic operations + * + * Basically, if we could assume either C11 or C++11, these macros are just + * redundant. Sadly we cannot. We have to do them ourselves. + */ + +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include /* size_t */ +#endif + +#ifdef HAVE_SYS_TYPES_H +# include /* ssize_t */ +#endif + +#if RBIMPL_COMPILER_SINCE(MSVC, 13, 0, 0) +# pragma intrinsic(_InterlockedOr) +#elif defined(__sun) && defined(HAVE_ATOMIC_H) +# include +#endif + +#include "ruby/assert.h" +#include "ruby/backward/2/limits.h" +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/noalias.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/value.h" +#include "ruby/internal/static_assert.h" +#include "ruby/internal/stdbool.h" + +/* + * Asserts that your environment supports more than one atomic types. These + * days systems tend to have such property (C11 was a standard of decades ago, + * right?) but we still support older ones. + */ +#if defined(__DOXYGEN__) || defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(HAVE_GCC_SYNC_BUILTINS) +# define RUBY_ATOMIC_GENERIC_MACRO 1 +#endif + +/** + * Type that is eligible for atomic operations. Depending on your host + * platform you might have more than one such type, but we choose one of them + * anyways. + */ +#if defined(__DOXYGEN__) +using rb_atomic_t = std::atomic; +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) +typedef unsigned int rb_atomic_t; +#elif defined(HAVE_GCC_SYNC_BUILTINS) +typedef unsigned int rb_atomic_t; +#elif defined(_WIN32) +typedef LONG rb_atomic_t; +#elif defined(__sun) && defined(HAVE_ATOMIC_H) +typedef unsigned int rb_atomic_t; +#else +# error No atomic operation found +#endif + +/** + * Atomically replaces the value pointed by `var` with the result of addition + * of `val` to the old value of `var`. + * + * @param var A variable of ::rb_atomic_t. + * @param val Value to add. + * @return What was stored in `var` before the addition. + * @post `var` holds `var + val`. + */ +#define RUBY_ATOMIC_FETCH_ADD(var, val) rbimpl_atomic_fetch_add(&(var), (val)) + +/** + * Atomically replaces the value pointed by `var` with the result of + * subtraction of `val` to the old value of `var`. + * + * @param var A variable of ::rb_atomic_t. + * @param val Value to subtract. + * @return What was stored in `var` before the subtraction. + * @post `var` holds `var - val`. + */ +#define RUBY_ATOMIC_FETCH_SUB(var, val) rbimpl_atomic_fetch_sub(&(var), (val)) + +/** + * Atomically replaces the value pointed by `var` with the result of + * bitwise OR between `val` and the old value of `var`. + * + * @param var A variable of ::rb_atomic_t. + * @param val Value to mix. + * @return void + * @post `var` holds `var | val`. + * @note For portability, this macro can return void. + */ +#define RUBY_ATOMIC_OR(var, val) rbimpl_atomic_or(&(var), (val)) + +/** + * Atomically replaces the value pointed by `var` with `val`. This is just an + * assignment, but you can additionally know the previous value. + * + * @param var A variable of ::rb_atomic_t. + * @param val Value to set. + * @return What was stored in `var` before the assignment. + * @post `var` holds `val`. + */ +#define RUBY_ATOMIC_EXCHANGE(var, val) rbimpl_atomic_exchange(&(var), (val)) + +/** + * Atomic compare-and-swap. This stores `val` to `var` if and only if the + * assignment changes the value of `var` from `oldval` to `newval`. You can + * detect whether the assignment happened or not using the return value. + * + * @param var A variable of ::rb_atomic_t. + * @param oldval Expected value of `var` before the assignment. + * @param newval What you want to store at `var`. + * @retval oldval Successful assignment (`var` is now `newval`). + * @retval otherwise Something else is at `var`; not updated. + */ +#define RUBY_ATOMIC_CAS(var, oldval, newval) \ + rbimpl_atomic_cas(&(var), (oldval), (newval)) + +/** + * Identical to #RUBY_ATOMIC_EXCHANGE, except for the return type. + * + * @param var A variable of ::rb_atomic_t. + * @param val Value to set. + * @return void + * @post `var` holds `val`. + */ +#define RUBY_ATOMIC_SET(var, val) rbimpl_atomic_set(&(var), (val)) + +/** + * Identical to #RUBY_ATOMIC_FETCH_ADD, except for the return type. + * + * @param var A variable of ::rb_atomic_t. + * @param val Value to add. + * @return void + * @post `var` holds `var + val`. + */ +#define RUBY_ATOMIC_ADD(var, val) rbimpl_atomic_add(&(var), (val)) + +/** + * Identical to #RUBY_ATOMIC_FETCH_SUB, except for the return type. + * + * @param var A variable of ::rb_atomic_t. + * @param val Value to subtract. + * @return void + * @post `var` holds `var - val`. + */ +#define RUBY_ATOMIC_SUB(var, val) rbimpl_atomic_sub(&(var), (val)) + +/** + * Atomically increments the value pointed by `var`. + * + * @param var A variable of ::rb_atomic_t. + * @return void + * @post `var` holds `var + 1`. + */ +#define RUBY_ATOMIC_INC(var) rbimpl_atomic_inc(&(var)) + +/** + * Atomically decrements the value pointed by `var`. + * + * @param var A variable of ::rb_atomic_t. + * @return void + * @post `var` holds `var - 1`. + */ +#define RUBY_ATOMIC_DEC(var) rbimpl_atomic_dec(&(var)) + +/** + * Identical to #RUBY_ATOMIC_INC, except it expects its argument is `size_t`. + * There are cases where ::rb_atomic_t is 32bit while `size_t` is 64bit. This + * should be used for size related operations to support such platforms. + * + * @param var A variable of `size_t`. + * @return void + * @post `var` holds `var + 1`. + */ +#define RUBY_ATOMIC_SIZE_INC(var) rbimpl_atomic_size_inc(&(var)) + +/** + * Identical to #RUBY_ATOMIC_DEC, except it expects its argument is `size_t`. + * There are cases where ::rb_atomic_t is 32bit while `size_t` is 64bit. This + * should be used for size related operations to support such platforms. + * + * @param var A variable of `size_t`. + * @return void + * @post `var` holds `var - 1`. + */ +#define RUBY_ATOMIC_SIZE_DEC(var) rbimpl_atomic_size_dec(&(var)) + +/** + * Identical to #RUBY_ATOMIC_EXCHANGE, except it expects its arguments are + * `size_t`. There are cases where ::rb_atomic_t is 32bit while `size_t` is + * 64bit. This should be used for size related operations to support such + * platforms. + * + * @param var A variable of `size_t`. + * @param val Value to set. + * @return What was stored in `var` before the assignment. + * @post `var` holds `val`. + */ +#define RUBY_ATOMIC_SIZE_EXCHANGE(var, val) \ + rbimpl_atomic_size_exchange(&(var), (val)) + +/** + * Identical to #RUBY_ATOMIC_CAS, except it expects its arguments are `size_t`. + * There are cases where ::rb_atomic_t is 32bit while `size_t` is 64bit. This + * should be used for size related operations to support such platforms. + * + * @param var A variable of `size_t`. + * @param oldval Expected value of `var` before the assignment. + * @param newval What you want to store at `var`. + * @retval oldval Successful assignment (`var` is now `newval`). + * @retval otherwise Something else is at `var`; not updated. + */ +#define RUBY_ATOMIC_SIZE_CAS(var, oldval, newval) \ + rbimpl_atomic_size_cas(&(var), (oldval), (newval)) + +/** + * Identical to #RUBY_ATOMIC_ADD, except it expects its arguments are `size_t`. + * There are cases where ::rb_atomic_t is 32bit while `size_t` is 64bit. This + * should be used for size related operations to support such platforms. + * + * @param var A variable of `size_t`. + * @param val Value to add. + * @return void + * @post `var` holds `var + val`. + */ +#define RUBY_ATOMIC_SIZE_ADD(var, val) rbimpl_atomic_size_add(&(var), (val)) + +/** + * Identical to #RUBY_ATOMIC_SUB, except it expects its arguments are `size_t`. + * There are cases where ::rb_atomic_t is 32bit while `size_t` is 64bit. This + * should be used for size related operations to support such platforms. + * + * @param var A variable of `size_t`. + * @param val Value to subtract. + * @return void + * @post `var` holds `var - val`. + */ +#define RUBY_ATOMIC_SIZE_SUB(var, val) rbimpl_atomic_size_sub(&(var), (val)) + +/** + * Identical to #RUBY_ATOMIC_EXCHANGE, except it expects its arguments are + * `void*`. There are cases where ::rb_atomic_t is 32bit while `void*` is + * 64bit. This should be used for pointer related operations to support such + * platforms. + * + * @param var A variable of `void *`. + * @param val Value to set. + * @return What was stored in `var` before the assignment. + * @post `var` holds `val`. + * + * @internal + * + * :FIXME: this `(void*)` cast is evil! However `void*` is incompatible with + * some pointers, most notably function pointers. + */ +#define RUBY_ATOMIC_PTR_EXCHANGE(var, val) \ + RBIMPL_CAST(rbimpl_atomic_ptr_exchange((void **)&(var), (void *)val)) + +/** + * Identical to #RUBY_ATOMIC_CAS, except it expects its arguments are `void*`. + * There are cases where ::rb_atomic_t is 32bit while `void*` is 64bit. This + * should be used for size related operations to support such platforms. + * + * @param var A variable of `void*`. + * @param oldval Expected value of `var` before the assignment. + * @param newval What you want to store at `var`. + * @retval oldval Successful assignment (`var` is now `newval`). + * @retval otherwise Something else is at `var`; not updated. + */ +#define RUBY_ATOMIC_PTR_CAS(var, oldval, newval) \ + RBIMPL_CAST(rbimpl_atomic_ptr_cas((void **)&(var), (oldval), (newval))) + +/** + * Identical to #RUBY_ATOMIC_EXCHANGE, except it expects its arguments are + * ::VALUE. There are cases where ::rb_atomic_t is 32bit while ::VALUE is + * 64bit. This should be used for pointer related operations to support such + * platforms. + * + * @param var A variable of ::VALUE. + * @param val Value to set. + * @return What was stored in `var` before the assignment. + * @post `var` holds `val`. + */ +#define RUBY_ATOMIC_VALUE_EXCHANGE(var, val) \ + rbimpl_atomic_value_exchange(&(var), (val)) + +/** + * Identical to #RUBY_ATOMIC_CAS, except it expects its arguments are ::VALUE. + * There are cases where ::rb_atomic_t is 32bit while ::VALUE is 64bit. This + * should be used for size related operations to support such platforms. + * + * @param var A variable of `void*`. + * @param oldval Expected value of `var` before the assignment. + * @param newval What you want to store at `var`. + * @retval oldval Successful assignment (`var` is now `newval`). + * @retval otherwise Something else is at `var`; not updated. + */ +#define RUBY_ATOMIC_VALUE_CAS(var, oldval, newval) \ + rbimpl_atomic_value_cas(&(var), (oldval), (newval)) + +/** @cond INTERNAL_MACRO */ +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline rb_atomic_t +rbimpl_atomic_fetch_add(volatile rb_atomic_t *ptr, rb_atomic_t val) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + return __atomic_fetch_add(ptr, val, __ATOMIC_SEQ_CST); + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + return __sync_fetch_and_add(ptr, val); + +#elif defined(_WIN32) + return InterlockedExchangeAdd(ptr, val); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + /* + * `atomic_add_int_nv` takes its second argument as `int`! Meanwhile our + * `rb_atomic_t` is unsigned. We cannot pass `val` as-is. We have to + * manually check integer overflow. + */ + RBIMPL_ASSERT_OR_ASSUME(val <= INT_MAX); + return atomic_add_int_nv(ptr, val) - val; + +#else +# error Unsupported platform. +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void +rbimpl_atomic_add(volatile rb_atomic_t *ptr, rb_atomic_t val) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + /* + * GCC on amd64 is smart enough to detect this `__atomic_add_fetch`'s + * return value is not used, then compiles it into single `LOCK ADD` + * instruction. + */ + __atomic_add_fetch(ptr, val, __ATOMIC_SEQ_CST); + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + __sync_add_and_fetch(ptr, val); + +#elif defined(_WIN32) + /* + * `InterlockedExchangeAdd` is `LOCK XADD`. It seems there also is + * `_InterlockedAdd` intrinsic in ARM Windows but not for x86? Sticking to + * `InterlockedExchangeAdd` for better portability. + */ + InterlockedExchangeAdd(ptr, val); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + /* Ditto for `atomic_add_int_nv`. */ + RBIMPL_ASSERT_OR_ASSUME(val <= INT_MAX); + atomic_add_int(ptr, val); + +#else +# error Unsupported platform. +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void +rbimpl_atomic_size_add(volatile size_t *ptr, size_t val) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + __atomic_add_fetch(ptr, val, __ATOMIC_SEQ_CST); + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + __sync_add_and_fetch(ptr, val); + +#elif defined(_WIN32) && defined(_M_AMD64) + /* Ditto for `InterlockeExchangedAdd`. */ + InterlockedExchangeAdd64(ptr, val); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) && (defined(_LP64) || defined(_I32LPx)) + /* Ditto for `atomic_add_int_nv`. */ + RBIMPL_ASSERT_OR_ASSUME(val <= LONG_MAX); + atomic_add_long(ptr, val); + +#else + RBIMPL_STATIC_ASSERT(size_of_rb_atomic_t, sizeof *ptr == sizeof(rb_atomic_t)); + + volatile rb_atomic_t *const tmp = RBIMPL_CAST((volatile rb_atomic_t *)ptr); + rbimpl_atomic_add(tmp, val); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void +rbimpl_atomic_inc(volatile rb_atomic_t *ptr) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(HAVE_GCC_SYNC_BUILTINS) + rbimpl_atomic_add(ptr, 1); + +#elif defined(_WIN32) + InterlockedIncrement(ptr); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + atomic_inc_uint(ptr); + +#else + rbimpl_atomic_add(ptr, 1); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void +rbimpl_atomic_size_inc(volatile size_t *ptr) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(HAVE_GCC_SYNC_BUILTINS) + rbimpl_atomic_size_add(ptr, 1); + +#elif defined(_WIN32) && defined(_M_AMD64) + InterlockedIncrement64(ptr); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) && (defined(_LP64) || defined(_I32LPx)) + atomic_inc_ulong(ptr); + +#else + rbimpl_atomic_size_add(ptr, 1); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline rb_atomic_t +rbimpl_atomic_fetch_sub(volatile rb_atomic_t *ptr, rb_atomic_t val) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + return __atomic_fetch_sub(ptr, val, __ATOMIC_SEQ_CST); + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + return __sync_fetch_and_sub(ptr, val); + +#elif defined(_WIN32) + /* rb_atomic_t is signed here! Safe to do `-val`. */ + return InterlockedExchangeAdd(ptr, -val); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + /* Ditto for `rbimpl_atomic_fetch_add`. */ + const signed neg = -1; + RBIMPL_ASSERT_OR_ASSUME(val <= INT_MAX); + return atomic_add_int_nv(ptr, neg * val) + val; + +#else +# error Unsupported platform. +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void +rbimpl_atomic_sub(volatile rb_atomic_t *ptr, rb_atomic_t val) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + __atomic_sub_fetch(ptr, val, __ATOMIC_SEQ_CST); + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + __sync_sub_and_fetch(ptr, val); + +#elif defined(_WIN32) + InterlockedExchangeAdd(ptr, -val); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + const signed neg = -1; + RBIMPL_ASSERT_OR_ASSUME(val <= INT_MAX); + atomic_add_int(ptr, neg * val); + +#else +# error Unsupported platform. +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void +rbimpl_atomic_size_sub(volatile size_t *ptr, size_t val) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + __atomic_sub_fetch(ptr, val, __ATOMIC_SEQ_CST); + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + __sync_sub_and_fetch(ptr, val); + +#elif defined(_WIN32) && defined(_M_AMD64) + const ssize_t neg = -1; + InterlockedExchangeAdd64(ptr, neg * val); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) && (defined(_LP64) || defined(_I32LPx)) + const signed neg = -1; + RBIMPL_ASSERT_OR_ASSUME(val <= LONG_MAX); + atomic_add_long(ptr, neg * val); + +#else + RBIMPL_STATIC_ASSERT(size_of_rb_atomic_t, sizeof *ptr == sizeof(rb_atomic_t)); + + volatile rb_atomic_t *const tmp = RBIMPL_CAST((volatile rb_atomic_t *)ptr); + rbimpl_atomic_sub(tmp, val); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void +rbimpl_atomic_dec(volatile rb_atomic_t *ptr) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(HAVE_GCC_SYNC_BUILTINS) + rbimpl_atomic_sub(ptr, 1); + +#elif defined(_WIN32) + InterlockedDecrement(ptr); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + atomic_dec_uint(ptr); + +#else + rbimpl_atomic_sub(ptr, 1); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void +rbimpl_atomic_size_dec(volatile size_t *ptr) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) || defined(HAVE_GCC_SYNC_BUILTINS) + rbimpl_atomic_size_sub(ptr, 1); + +#elif defined(_WIN32) && defined(_M_AMD64) + InterlockedDecrement64(ptr); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) && (defined(_LP64) || defined(_I32LPx)) + atomic_dec_ulong(ptr); + +#else + rbimpl_atomic_size_sub(ptr, 1); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void +rbimpl_atomic_or(volatile rb_atomic_t *ptr, rb_atomic_t val) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + __atomic_or_fetch(ptr, val, __ATOMIC_SEQ_CST); + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + __sync_or_and_fetch(ptr, val); + +#elif RBIMPL_COMPILER_SINCE(MSVC, 13, 0, 0) + _InterlockedOr(ptr, val); + +#elif defined(_WIN32) && defined(__GNUC__) + /* This was for old MinGW. Maybe not needed any longer? */ + __asm__( + "lock\n\t" + "orl\t%1, %0" + : "=m"(ptr) + : "Ir"(val)); + +#elif defined(_WIN32) && defined(_M_IX86) + __asm mov eax, ptr; + __asm mov ecx, val; + __asm lock or [eax], ecx; + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + atomic_or_uint(ptr, val); + +#else +# error Unsupported platform. +#endif +} + +/* Nobody uses this but for theoretical backwards compatibility... */ +#if RBIMPL_COMPILER_BEFORE(MSVC, 13, 0, 0) +static inline rb_atomic_t +rb_w32_atomic_or(volatile rb_atomic_t *var, rb_atomic_t val) +{ + return rbimpl_atomic_or(var, val); +} +#endif + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline rb_atomic_t +rbimpl_atomic_exchange(volatile rb_atomic_t *ptr, rb_atomic_t val) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + return __atomic_exchange_n(ptr, val, __ATOMIC_SEQ_CST); + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + return __sync_lock_test_and_set(ptr, val); + +#elif defined(_WIN32) + return InterlockedExchange(ptr, val); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + return atomic_swap_uint(ptr, val); + +#else +# error Unsupported platform. +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline size_t +rbimpl_atomic_size_exchange(volatile size_t *ptr, size_t val) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + return __atomic_exchange_n(ptr, val, __ATOMIC_SEQ_CST); + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + return __sync_lock_test_and_set(ptr, val); + +#elif defined(_WIN32) && defined(_M_AMD64) + return InterlockedExchange64(ptr, val); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) && (defined(_LP64) || defined(_I32LPx)) + return atomic_swap_ulong(ptr, val); + +#else + RBIMPL_STATIC_ASSERT(size_of_size_t, sizeof *ptr == sizeof(rb_atomic_t)); + + volatile rb_atomic_t *const tmp = RBIMPL_CAST((volatile rb_atomic_t *)ptr); + const rb_atomic_t ret = rbimpl_atomic_exchange(tmp, val); + return RBIMPL_CAST((size_t)ret); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void * +rbimpl_atomic_ptr_exchange(void *volatile *ptr, const void *val) +{ +#if 0 + +#elif defined(InterlockedExchangePointer) + /* const_cast */ + PVOID *pptr = RBIMPL_CAST((PVOID *)ptr); + PVOID pval = RBIMPL_CAST((PVOID)val); + return InterlockedExchangePointer(pptr, pval); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + return atomic_swap_ptr(ptr, RBIMPL_CAST((void *)val)); + +#else + RBIMPL_STATIC_ASSERT(sizeof_voidp, sizeof *ptr == sizeof(size_t)); + + const size_t sval = RBIMPL_CAST((size_t)val); + volatile size_t *const sptr = RBIMPL_CAST((volatile size_t *)ptr); + const size_t sret = rbimpl_atomic_size_exchange(sptr, sval); + return RBIMPL_CAST((void *)sret); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline VALUE +rbimpl_atomic_value_exchange(volatile VALUE *ptr, VALUE val) +{ + RBIMPL_STATIC_ASSERT(sizeof_value, sizeof *ptr == sizeof(size_t)); + + const size_t sval = RBIMPL_CAST((size_t)val); + volatile size_t *const sptr = RBIMPL_CAST((volatile size_t *)ptr); + const size_t sret = rbimpl_atomic_size_exchange(sptr, sval); + return RBIMPL_CAST((VALUE)sret); +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void +rbimpl_atomic_set(volatile rb_atomic_t *ptr, rb_atomic_t val) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + __atomic_store_n(ptr, val, __ATOMIC_SEQ_CST); + +#else + /* Maybe std::atomic::store can be faster? */ + rbimpl_atomic_exchange(ptr, val); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline rb_atomic_t +rbimpl_atomic_cas(volatile rb_atomic_t *ptr, rb_atomic_t oldval, rb_atomic_t newval) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + __atomic_compare_exchange_n( + ptr, &oldval, newval, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); + return oldval; + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + return __sync_val_compare_and_swap(ptr, oldval, newval); + +#elif RBIMPL_COMPILER_SINCE(MSVC, 13, 0, 0) + return InterlockedCompareExchange(ptr, newval, oldval); + +#elif defined(_WIN32) + PVOID *pptr = RBIMPL_CAST((PVOID *)ptr); + PVOID pold = RBIMPL_CAST((PVOID)oldval); + PVOID pnew = RBIMPL_CAST((PVOID)newval); + PVOID pret = InterlockedCompareExchange(pptr, pnew, pold); + return RBIMPL_CAST((rb_atomic_t)pret); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + return atomic_cas_uint(ptr, oldval, newval); + +#else +# error Unsupported platform. +#endif +} + +/* Nobody uses this but for theoretical backwards compatibility... */ +#if RBIMPL_COMPILER_BEFORE(MSVC, 13, 0, 0) +static inline rb_atomic_t +rb_w32_atomic_cas(volatile rb_atomic_t *var, rb_atomic_t oldval, rb_atomic_t newval) +{ + return rbimpl_atomic_cas(var, oldval, newval); +} +#endif + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline size_t +rbimpl_atomic_size_cas(volatile size_t *ptr, size_t oldval, size_t newval) +{ +#if 0 + +#elif defined(HAVE_GCC_ATOMIC_BUILTINS) + __atomic_compare_exchange_n( + ptr, &oldval, newval, 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); + return oldval; + +#elif defined(HAVE_GCC_SYNC_BUILTINS) + return __sync_val_compare_and_swap(ptr, oldval, newval); + +#elif defined(_WIN32) && defined(_M_AMD64) + return InterlockedCompareExchange64(ptr, newval, oldval); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) && (defined(_LP64) || defined(_I32LPx)) + return atomic_cas_ulong(ptr, oldval, newval); + +#else + RBIMPL_STATIC_ASSERT(size_of_size_t, sizeof *ptr == sizeof(rb_atomic_t)); + + volatile rb_atomic_t *tmp = RBIMPL_CAST((volatile rb_atomic_t *)ptr); + return rbimpl_atomic_cas(tmp, oldval, newval); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline void * +rbimpl_atomic_ptr_cas(void **ptr, const void *oldval, const void *newval) +{ +#if 0 + +#elif defined(InterlockedExchangePointer) + /* ... Can we say that InterlockedCompareExchangePtr surly exists when + * InterlockedExchangePointer is defined? Seems so but...?*/ + PVOID *pptr = RBIMPL_CAST((PVOID *)ptr); + PVOID pold = RBIMPL_CAST((PVOID)oldval); + PVOID pnew = RBIMPL_CAST((PVOID)newval); + return InterlockedCompareExchangePointer(pptr, pnew, pold); + +#elif defined(__sun) && defined(HAVE_ATOMIC_H) + void *pold = RBIMPL_CAST((void *)oldval); + void *pnew = RBIMPL_CAST((void *)newval); + return atomic_cas_ptr(ptr, pold, pnew); + + +#else + RBIMPL_STATIC_ASSERT(sizeof_voidp, sizeof *ptr == sizeof(size_t)); + + const size_t snew = RBIMPL_CAST((size_t)newval); + const size_t sold = RBIMPL_CAST((size_t)oldval); + volatile size_t *const sptr = RBIMPL_CAST((volatile size_t *)ptr); + const size_t sret = rbimpl_atomic_size_cas(sptr, sold, snew); + return RBIMPL_CAST((void *)sret); + +#endif +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +static inline VALUE +rbimpl_atomic_value_cas(volatile VALUE *ptr, VALUE oldval, VALUE newval) +{ + RBIMPL_STATIC_ASSERT(sizeof_value, sizeof *ptr == sizeof(size_t)); + + const size_t snew = RBIMPL_CAST((size_t)newval); + const size_t sold = RBIMPL_CAST((size_t)oldval); + volatile size_t *const sptr = RBIMPL_CAST((volatile size_t *)ptr); + const size_t sret = rbimpl_atomic_size_cas(sptr, sold, snew); + return RBIMPL_CAST((VALUE)sret); +} +/** @endcond */ +#endif /* RUBY_ATOMIC_H */ diff --git a/libs/libruby/ruby/backward.h b/libs/libruby/ruby/backward.h new file mode 100644 index 0000000..f804c2c --- /dev/null +++ b/libs/libruby/ruby/backward.h @@ -0,0 +1,25 @@ +#ifndef RUBY_RUBY_BACKWARD_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_RUBY_BACKWARD_H 1 +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ +#include "ruby/internal/value.h" +#include "ruby/internal/interpreter.h" +#include "ruby/backward/2/attributes.h" + +#define RBIMPL_ATTR_DEPRECATED_SINCE(ver) RBIMPL_ATTR_DEPRECATED(("since " #ver)) +#define RBIMPL_ATTR_DEPRECATED_INTERNAL(ver) RBIMPL_ATTR_DEPRECATED(("since "#ver", also internal")) +#define RBIMPL_ATTR_DEPRECATED_INTERNAL_ONLY() RBIMPL_ATTR_DEPRECATED(("only for internal use")) + +RBIMPL_ATTR_DEPRECATED_INTERNAL_ONLY() void rb_clear_constant_cache(void); + +/* from version.c */ +#if defined(RUBY_SHOW_COPYRIGHT_TO_DIE) && !!(RUBY_SHOW_COPYRIGHT_TO_DIE+0) +# error RUBY_SHOW_COPYRIGHT_TO_DIE is deprecated +#endif + +#endif /* RUBY_RUBY_BACKWARD_H */ diff --git a/libs/libruby/ruby/backward/2/assume.h b/libs/libruby/ruby/backward/2/assume.h new file mode 100644 index 0000000..d148710 --- /dev/null +++ b/libs/libruby/ruby/backward/2/assume.h @@ -0,0 +1,56 @@ +#ifndef RUBY_BACKWARD2_ASSUME_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_ASSUME_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #ASSUME / #RB_LIKELY / #UNREACHABLE + */ +#include "ruby/internal/config.h" +#include "ruby/internal/assume.h" +#include "ruby/internal/has/builtin.h" + +#define ASSUME RBIMPL_ASSUME /**< @old{RBIMPL_ASSUME} */ +#define UNREACHABLE RBIMPL_UNREACHABLE() /**< @old{RBIMPL_UNREACHABLE} */ +#define UNREACHABLE_RETURN RBIMPL_UNREACHABLE_RETURN /**< @old{RBIMPL_UNREACHABLE_RETURN} */ + +/* likely */ +#if RBIMPL_HAS_BUILTIN(__builtin_expect) +/** + * Asserts that the given Boolean expression likely holds. + * + * @param x An expression that likely holds. + * + * @note Consider this macro carefully. It has been here since when CPUs were + * like babies, but contemporary processors are beasts. They are + * smarter than mare mortals like us today. Their branch predictions + * highly expectedly outperform your use of this macro. + */ +# define RB_LIKELY(x) (__builtin_expect(!!(x), 1)) + +/** + * Asserts that the given Boolean expression likely doesn't hold. + * + * @param x An expression that likely doesn't hold. + */ +# define RB_UNLIKELY(x) (__builtin_expect(!!(x), 0)) +#else +# define RB_LIKELY(x) (x) +# define RB_UNLIKELY(x) (x) +#endif + +#endif /* RUBY_BACKWARD2_ASSUME_H */ diff --git a/libs/libruby/ruby/backward/2/attributes.h b/libs/libruby/ruby/backward/2/attributes.h new file mode 100644 index 0000000..73acfc9 --- /dev/null +++ b/libs/libruby/ruby/backward/2/attributes.h @@ -0,0 +1,165 @@ +#ifndef RUBY_BACKWARD2_ATTRIBUTES_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_ATTRIBUTES_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Various attribute-related macros. + * + * ### Q&A ### + * + * - Q: Why are the macros defined in this header file so inconsistent in + * style? + * + * - A: Don't know. Don't blame me. Backward compatibility is the key here. + * I'm just preserving what they have been. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/attr/alloc_size.h" +#include "ruby/internal/attr/cold.h" +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/deprecated.h" +#include "ruby/internal/attr/error.h" +#include "ruby/internal/attr/forceinline.h" +#include "ruby/internal/attr/format.h" +#include "ruby/internal/attr/maybe_unused.h" +#include "ruby/internal/attr/noinline.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/attr/restrict.h" +#include "ruby/internal/attr/returns_nonnull.h" +#include "ruby/internal/attr/warning.h" +#include "ruby/internal/has/attribute.h" + +/* function attributes */ +#undef CONSTFUNC +#define CONSTFUNC(x) RBIMPL_ATTR_CONST() x + +#undef PUREFUNC +#define PUREFUNC(x) RBIMPL_ATTR_PURE() x + +#undef DEPRECATED +#define DEPRECATED(x) RBIMPL_ATTR_DEPRECATED(("")) x + +#undef DEPRECATED_BY +#define DEPRECATED_BY(n,x) RBIMPL_ATTR_DEPRECATED(("by: " # n)) x + +#undef DEPRECATED_TYPE +#if defined(__GNUC__) +# define DEPRECATED_TYPE(mesg, decl) \ + _Pragma("message \"DEPRECATED_TYPE is deprecated\""); \ + decl RBIMPL_ATTR_DEPRECATED(mseg) +#elif defined(_MSC_VER) +# pragma deprecated(DEPRECATED_TYPE) +# define DEPRECATED_TYPE(mesg, decl) \ + __pragma(message(__FILE__"("STRINGIZE(__LINE__)"): warning: " \ + "DEPRECATED_TYPE is deprecated")) \ + decl RBIMPL_ATTR_DEPRECATED(mseg) +#else +# define DEPRECATED_TYPE(mesg, decl) \ + <-<-"DEPRECATED_TYPE is deprecated"->-> +#endif + +#undef RUBY_CXX_DEPRECATED +#define RUBY_CXX_DEPRECATED(mseg) RBIMPL_ATTR_DEPRECATED((mseg)) + +#undef NOINLINE +#define NOINLINE(x) RBIMPL_ATTR_NOINLINE() x + +#ifndef MJIT_HEADER +# undef ALWAYS_INLINE +# define ALWAYS_INLINE(x) RBIMPL_ATTR_FORCEINLINE() x +#endif + +#undef ERRORFUNC +#define ERRORFUNC(mesg, x) RBIMPL_ATTR_ERROR(mesg) x +#if RBIMPL_HAS_ATTRIBUTE(error) +# define HAVE_ATTRIBUTE_ERRORFUNC 1 +#endif + +#undef WARNINGFUNC +#define WARNINGFUNC(mesg, x) RBIMPL_ATTR_WARNING(mesg) x +#if RBIMPL_HAS_ATTRIBUTE(warning) +# define HAVE_ATTRIBUTE_WARNINGFUNC 1 +#endif + +/* + cold attribute for code layout improvements + RUBY_FUNC_ATTRIBUTE not used because MSVC does not like nested func macros + */ +#undef COLDFUNC +#define COLDFUNC RBIMPL_ATTR_COLD() + +#define PRINTF_ARGS(decl, string_index, first_to_check) \ + RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, (string_index), (first_to_check)) \ + decl + +#undef RUBY_ATTR_ALLOC_SIZE +#define RUBY_ATTR_ALLOC_SIZE RBIMPL_ATTR_ALLOC_SIZE + +#undef RUBY_ATTR_MALLOC +#define RUBY_ATTR_MALLOC RBIMPL_ATTR_RESTRICT() + +#undef RUBY_ATTR_RETURNS_NONNULL +#define RUBY_ATTR_RETURNS_NONNULL RBIMPL_ATTR_RETURNS_NONNULL() + +#ifndef FUNC_MINIMIZED +#define FUNC_MINIMIZED(x) x +#endif + +#ifndef FUNC_UNOPTIMIZED +#define FUNC_UNOPTIMIZED(x) x +#endif + +#ifndef RUBY_ALIAS_FUNCTION_TYPE +#define RUBY_ALIAS_FUNCTION_TYPE(type, prot, name, args) \ + FUNC_MINIMIZED(type prot) {return (type)name args;} +#endif + +#ifndef RUBY_ALIAS_FUNCTION_VOID +#define RUBY_ALIAS_FUNCTION_VOID(prot, name, args) \ + FUNC_MINIMIZED(void prot) {name args;} +#endif + +#ifndef RUBY_ALIAS_FUNCTION +#define RUBY_ALIAS_FUNCTION(prot, name, args) \ + RUBY_ALIAS_FUNCTION_TYPE(VALUE, prot, name, args) +#endif + +#undef RUBY_FUNC_NONNULL +#define RUBY_FUNC_NONNULL(n, x) RBIMPL_ATTR_NONNULL(n) x + +#undef NORETURN +#define NORETURN(x) RBIMPL_ATTR_NORETURN() x +#define NORETURN_STYLE_NEW + +#ifndef PACKED_STRUCT +# define PACKED_STRUCT(x) x +#endif + +#ifndef PACKED_STRUCT_UNALIGNED +# if UNALIGNED_WORD_ACCESS +# define PACKED_STRUCT_UNALIGNED(x) PACKED_STRUCT(x) +# else +# define PACKED_STRUCT_UNALIGNED(x) x +# endif +#endif + +#undef RB_UNUSED_VAR +#define RB_UNUSED_VAR(x) x RBIMPL_ATTR_MAYBE_UNUSED() + +#endif /* RUBY_BACKWARD2_ATTRIBUTES_H */ diff --git a/libs/libruby/ruby/backward/2/bool.h b/libs/libruby/ruby/backward/2/bool.h new file mode 100644 index 0000000..f2fa390 --- /dev/null +++ b/libs/libruby/ruby/backward/2/bool.h @@ -0,0 +1,36 @@ +#ifndef RUBY_BACKWARD2_BOOL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_BOOL_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines old TRUE / FALSE + */ +#include "ruby/internal/stdbool.h" + +#ifndef FALSE +# define FALSE false +#elif FALSE +# error FALSE must be false +#endif + +#ifndef TRUE +# define TRUE true +#elif ! TRUE +# error TRUE must be true +#endif + +#endif /* RUBY_BACKWARD2_BOOL_H */ diff --git a/libs/libruby/ruby/backward/2/gcc_version_since.h b/libs/libruby/ruby/backward/2/gcc_version_since.h new file mode 100644 index 0000000..00cc40c --- /dev/null +++ b/libs/libruby/ruby/backward/2/gcc_version_since.h @@ -0,0 +1,37 @@ +#ifndef RUBY_BACKWARD2_GCC_VERSION_SINCE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_GCC_VERSION_SINCE_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines old GCC_VERSION_SINCE + */ +#include "ruby/internal/compiler_since.h" + +#ifndef GCC_VERSION_SINCE +#define GCC_VERSION_SINCE(x, y, z) RBIMPL_COMPILER_SINCE(GCC, (x), (y), (z)) +#endif + +#ifndef GCC_VERSION_BEFORE +#define GCC_VERSION_BEFORE(x, y, z) \ + (RBIMPL_COMPILER_BEFORE(GCC, (x), (y), (z)) || \ + (RBIMPL_COMPILER_IS(GCC) && \ + ((RBIMPL_COMPILER_VERSION_MAJOR == (x)) && \ + ((RBIMPL_COMPILER_VERSION_MINOR == (y)) && \ + (RBIMPL_COMPILER_VERSION_PATCH == (z)))))) +#endif + +#endif /* RUBY_BACKWARD2_GCC_VERSION_SINCE_H */ diff --git a/libs/libruby/ruby/backward/2/inttypes.h b/libs/libruby/ruby/backward/2/inttypes.h new file mode 100644 index 0000000..4546087 --- /dev/null +++ b/libs/libruby/ruby/backward/2/inttypes.h @@ -0,0 +1,131 @@ +#ifndef RUBY_BACKWARD2_INTTYPES_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_INTTYPES_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief C99 shim for `` + */ +#include "ruby/internal/config.h" /* PRI_LL_PREFIX etc. are here */ + +#ifdef HAVE_INTTYPES_H +# include +#endif + +#include "ruby/internal/value.h" /* PRI_VALUE_PREFIX is here. */ + +#ifndef PRI_INT_PREFIX +# define PRI_INT_PREFIX "" +#endif + +#ifndef PRI_LONG_PREFIX +# define PRI_LONG_PREFIX "l" +#endif + +#ifndef PRI_SHORT_PREFIX +# define PRI_SHORT_PREFIX "h" +#endif + +#ifdef PRI_64_PREFIX +# /* Take that. */ +#elif SIZEOF_LONG == 8 +# define PRI_64_PREFIX PRI_LONG_PREFIX +#elif SIZEOF_LONG_LONG == 8 +# define PRI_64_PREFIX PRI_LL_PREFIX +#endif + +#ifndef PRIdPTR +# define PRIdPTR PRI_PTR_PREFIX"d" +# define PRIiPTR PRI_PTR_PREFIX"i" +# define PRIoPTR PRI_PTR_PREFIX"o" +# define PRIuPTR PRI_PTR_PREFIX"u" +# define PRIxPTR PRI_PTR_PREFIX"x" +# define PRIXPTR PRI_PTR_PREFIX"X" +#endif + +#ifndef RUBY_PRI_VALUE_MARK +# define RUBY_PRI_VALUE_MARK "\v" +#endif + +#if defined PRIdPTR && !defined PRI_VALUE_PREFIX +# define PRIdVALUE PRIdPTR +# define PRIoVALUE PRIoPTR +# define PRIuVALUE PRIuPTR +# define PRIxVALUE PRIxPTR +# define PRIXVALUE PRIXPTR +# define PRIsVALUE PRIiPTR"" RUBY_PRI_VALUE_MARK +#else +# define PRIdVALUE PRI_VALUE_PREFIX"d" +# define PRIoVALUE PRI_VALUE_PREFIX"o" +# define PRIuVALUE PRI_VALUE_PREFIX"u" +# define PRIxVALUE PRI_VALUE_PREFIX"x" +# define PRIXVALUE PRI_VALUE_PREFIX"X" +# define PRIsVALUE PRI_VALUE_PREFIX"i" RUBY_PRI_VALUE_MARK +#endif + +#ifndef PRI_VALUE_PREFIX +# define PRI_VALUE_PREFIX "" +#endif + +#ifdef PRI_TIMET_PREFIX +# /* Take that. */ +#elif SIZEOF_TIME_T == SIZEOF_INT +# define PRI_TIMET_PREFIX +#elif SIZEOF_TIME_T == SIZEOF_LONG +# define PRI_TIMET_PREFIX "l" +#elif SIZEOF_TIME_T == SIZEOF_LONG_LONG +# define PRI_TIMET_PREFIX PRI_LL_PREFIX +#endif + +#ifdef PRI_PTRDIFF_PREFIX +# /* Take that. */ +#elif SIZEOF_PTRDIFF_T == SIZEOF_INT +# define PRI_PTRDIFF_PREFIX "" +#elif SIZEOF_PTRDIFF_T == SIZEOF_LONG +# define PRI_PTRDIFF_PREFIX "l" +#elif SIZEOF_PTRDIFF_T == SIZEOF_LONG_LONG +# define PRI_PTRDIFF_PREFIX PRI_LL_PREFIX +#endif + +#ifndef PRIdPTRDIFF +# define PRIdPTRDIFF PRI_PTRDIFF_PREFIX"d" +# define PRIiPTRDIFF PRI_PTRDIFF_PREFIX"i" +# define PRIoPTRDIFF PRI_PTRDIFF_PREFIX"o" +# define PRIuPTRDIFF PRI_PTRDIFF_PREFIX"u" +# define PRIxPTRDIFF PRI_PTRDIFF_PREFIX"x" +# define PRIXPTRDIFF PRI_PTRDIFF_PREFIX"X" +#endif + +#ifdef PRI_SIZE_PREFIX +# /* Take that. */ +#elif SIZEOF_SIZE_T == SIZEOF_INT +# define PRI_SIZE_PREFIX "" +#elif SIZEOF_SIZE_T == SIZEOF_LONG +# define PRI_SIZE_PREFIX "l" +#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG +# define PRI_SIZE_PREFIX PRI_LL_PREFIX +#endif + +#ifndef PRIdSIZE +# define PRIdSIZE PRI_SIZE_PREFIX"d" +# define PRIiSIZE PRI_SIZE_PREFIX"i" +# define PRIoSIZE PRI_SIZE_PREFIX"o" +# define PRIuSIZE PRI_SIZE_PREFIX"u" +# define PRIxSIZE PRI_SIZE_PREFIX"x" +# define PRIXSIZE PRI_SIZE_PREFIX"X" +#endif + +#endif /* RUBY_BACKWARD2_INTTYPES_H */ diff --git a/libs/libruby/ruby/backward/2/limits.h b/libs/libruby/ruby/backward/2/limits.h new file mode 100644 index 0000000..6f7021e --- /dev/null +++ b/libs/libruby/ruby/backward/2/limits.h @@ -0,0 +1,99 @@ +#ifndef RUBY_BACKWARD2_LIMITS_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_LIMITS_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Historical shim for ``. + * + * The macros in this header file are obsolescent. Does anyone really need our + * own definition of `CHAR_BIT` today? + */ +#include "ruby/internal/config.h" + +#ifdef HAVE_LIMITS_H +# include +#endif + +#include "ruby/backward/2/long_long.h" + +#ifndef LONG_MAX +# /* assuming 32bit(2's complement) long */ +# define LONG_MAX 2147483647L +#endif + +#ifndef LONG_MIN +# define LONG_MIN (-LONG_MAX-1) +#endif + +#ifndef CHAR_BIT +# define CHAR_BIT 8 +#endif + +#ifdef LLONG_MAX +# /* Take that. */ +#elif defined(LONG_LONG_MAX) +# define LLONG_MAX LONG_LONG_MAX +#elif defined(_I64_MAX) +# define LLONG_MAX _I64_MAX +#else +# /* assuming 64bit(2's complement) long long */ +# define LLONG_MAX 9223372036854775807LL +#endif + +#ifdef LLONG_MIN +# /* Take that. */ +#elif defined(LONG_LONG_MIN) +# define LLONG_MIN LONG_LONG_MIN +#elif defined(_I64_MAX) +# define LLONG_MIN _I64_MIN +#else +# define LLONG_MIN (-LLONG_MAX-1) +#endif + +#ifdef SIZE_MAX +# /* Take that. */ +#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG +# define SIZE_MAX ULLONG_MAX +# define SIZE_MIN ULLONG_MIN +#elif SIZEOF_SIZE_T == SIZEOF_LONG +# define SIZE_MAX ULONG_MAX +# define SIZE_MIN ULONG_MIN +#elif SIZEOF_SIZE_T == SIZEOF_INT +# define SIZE_MAX UINT_MAX +# define SIZE_MIN UINT_MIN +#else +# define SIZE_MAX USHRT_MAX +# define SIZE_MIN USHRT_MIN +#endif + +#ifdef SSIZE_MAX +# /* Take that. */ +#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG +# define SSIZE_MAX LLONG_MAX +# define SSIZE_MIN LLONG_MIN +#elif SIZEOF_SIZE_T == SIZEOF_LONG +# define SSIZE_MAX LONG_MAX +# define SSIZE_MIN LONG_MIN +#elif SIZEOF_SIZE_T == SIZEOF_INT +# define SSIZE_MAX INT_MAX +# define SSIZE_MIN INT_MIN +#else +# define SSIZE_MAX SHRT_MAX +# define SSIZE_MIN SHRT_MIN +#endif + +#endif /* RUBY_BACKWARD2_LIMITS_H */ diff --git a/libs/libruby/ruby/backward/2/long_long.h b/libs/libruby/ruby/backward/2/long_long.h new file mode 100644 index 0000000..8e6b274 --- /dev/null +++ b/libs/libruby/ruby/backward/2/long_long.h @@ -0,0 +1,73 @@ +#ifndef RUBY_BACKWARD2_LONG_LONG_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_LONG_LONG_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines old #LONG_LONG + * + * No known compiler that can compile today's ruby lacks long long. + * Historically MSVC was one of such compiler, but it implemented long long a + * while ago (some time back in 2013). The macros are for backwards + * compatibility only. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/has/warning.h" +#include "ruby/internal/warning_push.h" + +#if defined(__DOXYGEN__) +# /** @cond INTERNAL_MACRO */ +# define HAVE_LONG_LONG 1 +# define HAVE_TRUE_LONG_LONG 1 +# /** @endcond */ +# /** @deprecated Just use `long long` directly. */ +# define LONG_LONG long long. + +#elif RBIMPL_HAS_WARNING("-Wc++11-long-long") +# define HAVE_TRUE_LONG_LONG 1 +# define LONG_LONG \ + RBIMPL_WARNING_PUSH() \ + RBIMPL_WARNING_IGNORED(-Wc++11-long-long) \ + long long \ + RBIMPL_WARNING_POP() + +#elif RBIMPL_HAS_WARNING("-Wlong-long") +# define HAVE_TRUE_LONG_LONG 1 +# define LONG_LONG \ + RBIMPL_WARNING_PUSH() \ + RBIMPL_WARNING_IGNORED(-Wlong-long) \ + long long \ + RBIMPL_WARNING_POP() + +#elif defined(HAVE_LONG_LONG) +# define HAVE_TRUE_LONG_LONG 1 +# define LONG_LONG long long + +#elif SIZEOF___INT64 > 0 +# define HAVE_LONG_LONG 1 +# define LONG_LONG __int64 +# undef SIZEOF_LONG_LONG +# define SIZEOF_LONG_LONG SIZEOF___INT64 + +#else +# error Hello! Ruby developers believe this message must not happen. +# error If you encounter this message, can you file a bug report? +# error Remember to attach a detailed description of your environment. +# error Thank you! +#endif + +#endif /* RBIMPL_BACKWARD2_LONG_LONG_H */ diff --git a/libs/libruby/ruby/backward/2/r_cast.h b/libs/libruby/ruby/backward/2/r_cast.h new file mode 100644 index 0000000..3d0f40f --- /dev/null +++ b/libs/libruby/ruby/backward/2/r_cast.h @@ -0,0 +1,32 @@ +#ifndef RUBY_BACKWARD2_R_CAST_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_R_CAST_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines old R_CAST + * + * Nobody is actively using this macro. + */ +#define R_CAST(st) (struct st*) +#define RMOVED(obj) (R_CAST(RMoved)(obj)) + +#if defined(__GNUC__) +# warning R_CAST and RMOVED are deprecated +#elif defined(_MSC_VER) +# pragma message("warning: R_CAST and RMOVED are deprecated") +#endif +#endif /* RUBY_BACKWARD2_R_CAST_H */ diff --git a/libs/libruby/ruby/backward/2/rmodule.h b/libs/libruby/ruby/backward/2/rmodule.h new file mode 100644 index 0000000..53b3783 --- /dev/null +++ b/libs/libruby/ruby/backward/2/rmodule.h @@ -0,0 +1,36 @@ +#ifndef RUBY_BACKWARD2_RMODULE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_RMODULE_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Orphan macros. + * + * These macros seems broken since at least 2011. Nobody (except ruby itself + * who is implementing the internals) could have used those macros for a while. + * Kept public as-is here to keep some theoretical backwards compatibility. + */ +#define RMODULE_IV_TBL(m) RCLASS_IV_TBL(m) +#define RMODULE_CONST_TBL(m) RCLASS_CONST_TBL(m) +#define RMODULE_M_TBL(m) RCLASS_M_TBL(m) +#define RMODULE_SUPER(m) RCLASS_SUPER(m) + +#if defined(__GNUC__) +# warning RMODULE_* macros are deprecated +#elif defined(_MSC_VER) +# pragma message("warning: RMODULE_* macros are deprecated") +#endif +#endif /* RUBY_BACKWARD2_RMODULE_H */ diff --git a/libs/libruby/ruby/backward/2/stdalign.h b/libs/libruby/ruby/backward/2/stdalign.h new file mode 100644 index 0000000..8b491bf --- /dev/null +++ b/libs/libruby/ruby/backward/2/stdalign.h @@ -0,0 +1,30 @@ +#ifndef RUBY_BACKWARD2_STDALIGN_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_STDALIGN_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RUBY_ALIGNAS / #RUBY_ALIGNOF + */ +#include "ruby/internal/stdalign.h" + +#undef RUBY_ALIGNAS +#undef RUBY_ALIGNOF +#define RUBY_ALIGNAS RBIMPL_ALIGNAS /**< @copydoc RBIMPL_ALIGNAS */ +#define RUBY_ALIGNOF RBIMPL_ALIGNOF /**< @copydoc RBIMPL_ALIGNOF */ + +#endif /* RUBY_BACKWARD2_STDALIGN_H */ diff --git a/libs/libruby/ruby/backward/2/stdarg.h b/libs/libruby/ruby/backward/2/stdarg.h new file mode 100644 index 0000000..08659fe --- /dev/null +++ b/libs/libruby/ruby/backward/2/stdarg.h @@ -0,0 +1,69 @@ +#ifndef RUBY_BACKWARD2_STDARG_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_BACKWARD2_STDARG_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines old #_ + * + * Nobody should ever use these macros any longer. No known compilers lack + * prototypes today. It's 21st century. Just forget them. + */ + +#undef _ +/** + * @deprecated Nobody practically needs this macro any longer. + * @brief This was a transition path from K&R to ANSI. + */ +#ifdef HAVE_PROTOTYPES +# define _(args) args +#else +# define _(args) () +#endif + +#undef __ +/** + * @deprecated Nobody practically needs this macro any longer. + * @brief This was a transition path from K&R to ANSI. + */ +#ifdef HAVE_STDARG_PROTOTYPES +# define __(args) args +#else +# define __(args) () +#endif + +/** + * Functions declared using this macro take arbitrary arguments, including + * void. + * + * ```CXX + * void func(ANYARGS); + * ``` + * + * This was a necessary evil when there was no such thing like function + * overloading. But it is the 21st century today. People generally need not + * use this. Just use a granular typed function. + * + * @see ruby::backward::cxxanyargs + */ +#ifdef __cplusplus +#define ANYARGS ... +#else +#define ANYARGS +#endif + +#endif /* RUBY_BACKWARD2_STDARG_H */ diff --git a/libs/libruby/ruby/backward/cxxanyargs.hpp b/libs/libruby/ruby/backward/cxxanyargs.hpp new file mode 100644 index 0000000..2414b7a --- /dev/null +++ b/libs/libruby/ruby/backward/cxxanyargs.hpp @@ -0,0 +1,700 @@ +#ifndef RUBY_BACKWARD_CXXANYARGS_HPP //-*-C++-*-vi:ft=cpp +#define RUBY_BACKWARD_CXXANYARGS_HPP +/// @file +/// @author @shyouhei +/// @copyright This file is a part of the programming language Ruby. +/// Permission is hereby granted, to either redistribute and/or +/// modify this file, provided that the conditions mentioned in the +/// file COPYING are met. Consult the file for details. +/// @note DO NOT MODERNISE THIS FILE! As the file name implies it is +/// meant to be a backwards compatibility shim. Please stick to +/// C++ 98 and never use newer features, like `constexpr`. +/// @brief Provides old prototypes for C++ programs. +#include "ruby/internal/config.h" +#include "ruby/internal/intern/class.h" +#include "ruby/internal/intern/cont.h" +#include "ruby/internal/intern/hash.h" +#include "ruby/internal/intern/proc.h" +#include "ruby/internal/intern/thread.h" +#include "ruby/internal/intern/variable.h" +#include "ruby/internal/intern/vm.h" +#include "ruby/internal/iterator.h" +#include "ruby/internal/method.h" +#include "ruby/internal/value.h" +#include "ruby/internal/variable.h" +#include "ruby/backward/2/stdarg.h" +#include "ruby/st.h" + +extern "C++" { + +#ifdef HAVE_NULLPTR +#include +#endif + +/// @brief The main namespace. +/// @note The name "ruby" might already be taken, but that must not be a +/// problem because namespaces are allowed to reopen. +namespace ruby { + +/// Backwards compatibility layer. +namespace backward { + +/// Provides ANYARGS deprecation warnings. In C, ANYARGS means there is no +/// function prototype. Literally anything, even including nothing, can be a +/// valid ANYARGS. So passing a correctly prototyped function pointer to an +/// ANYARGS-ed function parameter is valid, at the same time passing an +/// ANYARGS-ed function pointer to a granular typed function parameter is also +/// valid. However on the other hand in C++, ANYARGS doesn't actually mean any +/// number of arguments. C++'s ANYARGS means _variadic_ number of arguments. +/// This is incompatible with ordinal, correct function prototypes. +/// +/// Luckily, function prototypes being distinct each other means they can be +/// overloaded. We can provide a compatibility layer for older Ruby APIs which +/// used to have ANYARGS. This namespace includes such attempts. +namespace cxxanyargs { + +typedef VALUE type(ANYARGS); ///< ANYARGS-ed function type. +typedef void void_type(ANYARGS); ///< ANYARGS-ed function type, void variant. +typedef int int_type(ANYARGS); ///< ANYARGS-ed function type, int variant. +typedef VALUE onearg_type(VALUE); ///< Single-argumented function type. + +/// @name Hooking global variables +/// @{ + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Define a function-backended global variable. +/// @param[in] q Name of the variable. +/// @param[in] w Getter function. +/// @param[in] e Setter function. +/// @note Both functions can be nullptr. +/// @see rb_define_hooked_variable() +/// @deprecated Use granular typed overload instead. +inline void +rb_define_virtual_variable(const char *q, type *w, void_type *e) +{ + rb_gvar_getter_t *r = reinterpret_cast(w); + rb_gvar_setter_t *t = reinterpret_cast(e); + ::rb_define_virtual_variable(q, r, t); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +inline void +rb_define_virtual_variable(const char *q, rb_gvar_getter_t *w, void_type *e) +{ + rb_gvar_setter_t *t = reinterpret_cast(e); + ::rb_define_virtual_variable(q, w, t); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +inline void +rb_define_virtual_variable(const char *q, type *w, rb_gvar_setter_t *e) +{ + rb_gvar_getter_t *r = reinterpret_cast(w); + ::rb_define_virtual_variable(q, r, e); +} + +#ifdef HAVE_NULLPTR +inline void +rb_define_virtual_variable(const char *q, rb_gvar_getter_t *w, std::nullptr_t e) +{ + ::rb_define_virtual_variable(q, w, e); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +inline void +rb_define_virtual_variable(const char *q, type *w, std::nullptr_t e) +{ + rb_gvar_getter_t *r = reinterpret_cast(w); + ::rb_define_virtual_variable(q, r, e); +} + +inline void +rb_define_virtual_variable(const char *q, std::nullptr_t w, rb_gvar_setter_t *e) +{ + ::rb_define_virtual_variable(q, w, e); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +inline void +rb_define_virtual_variable(const char *q, std::nullptr_t w, void_type *e) +{ + rb_gvar_setter_t *r = reinterpret_cast(e); + ::rb_define_virtual_variable(q, w, r); +} +#endif + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Define a function-backended global variable. +/// @param[in] q Name of the variable. +/// @param[in] w Variable storage. +/// @param[in] e Getter function. +/// @param[in] r Setter function. +/// @note Both functions can be nullptr. +/// @see rb_define_virtual_variable() +/// @deprecated Use granular typed overload instead. +inline void +rb_define_hooked_variable(const char *q, VALUE *w, type *e, void_type *r) +{ + rb_gvar_getter_t *t = reinterpret_cast(e); + rb_gvar_setter_t *y = reinterpret_cast(r); + ::rb_define_hooked_variable(q, w, t, y); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +inline void +rb_define_hooked_variable(const char *q, VALUE *w, rb_gvar_getter_t *e, void_type *r) +{ + rb_gvar_setter_t *y = reinterpret_cast(r); + ::rb_define_hooked_variable(q, w, e, y); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +inline void +rb_define_hooked_variable(const char *q, VALUE *w, type *e, rb_gvar_setter_t *r) +{ + rb_gvar_getter_t *t = reinterpret_cast(e); + ::rb_define_hooked_variable(q, w, t, r); +} + +#ifdef HAVE_NULLPTR +inline void +rb_define_hooked_variable(const char *q, VALUE *w, rb_gvar_getter_t *e, std::nullptr_t r) +{ + ::rb_define_hooked_variable(q, w, e, r); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +inline void +rb_define_hooked_variable(const char *q, VALUE *w, type *e, std::nullptr_t r) +{ + rb_gvar_getter_t *y = reinterpret_cast(e); + ::rb_define_hooked_variable(q, w, y, r); +} + +inline void +rb_define_hooked_variable(const char *q, VALUE *w, std::nullptr_t e, rb_gvar_setter_t *r) +{ + ::rb_define_hooked_variable(q, w, e, r); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +inline void +rb_define_hooked_variable(const char *q, VALUE *w, std::nullptr_t e, void_type *r) +{ + rb_gvar_setter_t *y = reinterpret_cast(r); + ::rb_define_hooked_variable(q, w, e, y); +} +#endif + +/// @} +/// @name Exceptions and tag jumps +/// @{ + +// RUBY_CXX_DEPRECATED("by rb_block_call since 1.9") +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Old way to implement iterators. +/// @param[in] q A function that can yield. +/// @param[in] w Passed to `q`. +/// @param[in] e What is to be yielded. +/// @param[in] r Passed to `e`. +/// @return The return value of `q`. +/// @note `e` can be nullptr. +/// @deprecated This function is obsoleted since long before 2.x era. Do not +/// use it any longer. rb_block_call() is provided instead. +inline VALUE +rb_iterate(onearg_type *q, VALUE w, type *e, VALUE r) +{ + rb_block_call_func_t t = reinterpret_cast(e); + return backward::rb_iterate_deprecated(q, w, t, r); +} + +#ifdef HAVE_NULLPTR +RUBY_CXX_DEPRECATED("by rb_block_call since 1.9") +inline VALUE +rb_iterate(onearg_type *q, VALUE w, std::nullptr_t e, VALUE r) +{ + return backward::rb_iterate_deprecated(q, w, e, r); +} +#endif + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Call a method with a block. +/// @param[in] q The self. +/// @param[in] w The method. +/// @param[in] e The # of elems of `r` +/// @param[in] r The arguments. +/// @param[in] t What is to be yielded. +/// @param[in] y Passed to `t` +/// @return Return value of `q#w(*r,&t)` +/// @note 't' can be nullptr. +/// @deprecated Use granular typed overload instead. +inline VALUE +rb_block_call(VALUE q, ID w, int e, const VALUE *r, type *t, VALUE y) +{ + rb_block_call_func_t u = reinterpret_cast(t); + return ::rb_block_call(q, w, e, r, u, y); +} + +#ifdef HAVE_NULLPTR +inline VALUE +rb_block_call(VALUE q, ID w, int e, const VALUE *r, std::nullptr_t t, VALUE y) +{ + return ::rb_block_call(q, w, e, r, t, y); +} +#endif + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief An equivalent of `rescue` clause. +/// @param[in] q A function that can raise. +/// @param[in] w Passed to `q`. +/// @param[in] e A function that cleans-up. +/// @param[in] r Passed to `e`. +/// @return The return value of `q` if no exception occurs, or the return +/// value of `e` if otherwise. +/// @note `e` can be nullptr. +/// @see rb_ensure() +/// @see rb_rescue2() +/// @see rb_protect() +/// @deprecated Use granular typed overload instead. +inline VALUE +rb_rescue(type *q, VALUE w, type *e, VALUE r) +{ + typedef VALUE func1_t(VALUE); + typedef VALUE func2_t(VALUE, VALUE); + func1_t *t = reinterpret_cast(q); + func2_t *y = reinterpret_cast(e); + return ::rb_rescue(t, w, y, r); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief An equivalent of `rescue` clause. +/// @param[in] q A function that can raise. +/// @param[in] w Passed to `q`. +/// @param[in] e A function that cleans-up. +/// @param[in] r Passed to `e`. +/// @param[in] ... 0-terminated list of subclass of @ref rb_eException. +/// @return The return value of `q` if no exception occurs, or the return +/// value of `e` if otherwise. +/// @note `e` can be nullptr. +/// @see rb_ensure() +/// @see rb_rescue() +/// @see rb_protect() +/// @deprecated Use granular typed overload instead. +inline VALUE +rb_rescue2(type *q, VALUE w, type *e, VALUE r, ...) +{ + typedef VALUE func1_t(VALUE); + typedef VALUE func2_t(VALUE, VALUE); + func1_t *t = reinterpret_cast(q); + func2_t *y = reinterpret_cast(e); + va_list ap; + va_start(ap, r); + VALUE ret = ::rb_vrescue2(t, w, y, r, ap); + va_end(ap); + return ret; +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief An equivalent of `ensure` clause. +/// @param[in] q A function that can raise. +/// @param[in] w Passed to `q`. +/// @param[in] e A function that ensures. +/// @param[in] r Passed to `e`. +/// @return The return value of `q`. +/// @note It makes no sense to pass nullptr to `e`. +/// @see rb_rescue() +/// @see rb_rescue2() +/// @see rb_protect() +/// @deprecated Use granular typed overload instead. +inline VALUE +rb_ensure(type *q, VALUE w, type *e, VALUE r) +{ + typedef VALUE func1_t(VALUE); + func1_t *t = reinterpret_cast(q); + func1_t *y = reinterpret_cast(e); + return ::rb_ensure(t, w, y, r); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief An equivalent of `Kernel#catch`. +/// @param[in] q The "tag" string. +/// @param[in] w A function that can throw. +/// @param[in] e Passed to `w`. +/// @return What was thrown. +/// @note `q` can be a nullptr but makes no sense to pass nullptr to`w`. +/// @see rb_block_call() +/// @see rb_protect() +/// @see rb_rb_catch_obj() +/// @see rb_rescue() +/// @deprecated Use granular typed overload instead. +inline VALUE +rb_catch(const char *q, type *w, VALUE e) +{ + rb_block_call_func_t r = reinterpret_cast(w); + return ::rb_catch(q, r, e); +} + +#ifdef HAVE_NULLPTR +inline VALUE +rb_catch(const char *q, std::nullptr_t w, VALUE e) +{ + return ::rb_catch(q, w, e); +} +#endif + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief An equivalent of `Kernel#catch`. +/// @param[in] q The "tag" object. +/// @param[in] w A function that can throw. +/// @param[in] e Passed to `w`. +/// @return What was thrown. +/// @note It makes no sense to pass nullptr to`w`. +/// @see rb_block_call() +/// @see rb_protect() +/// @see rb_rb_catch_obj() +/// @see rb_rescue() +/// @deprecated Use granular typed overload instead. +inline VALUE +rb_catch_obj(VALUE q, type *w, VALUE e) +{ + rb_block_call_func_t r = reinterpret_cast(w); + return ::rb_catch_obj(q, r, e); +} + +/// @} +/// @name Procs, Fibers and Threads +/// @{ + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Creates a rb_cFiber instance. +/// @param[in] q The fiber body. +/// @param[in] w Passed to `q`. +/// @return What was allocated. +/// @note It makes no sense to pass nullptr to`q`. +/// @see rb_proc_new() +/// @see rb_thread_create() +/// @deprecated Use granular typed overload instead. +inline VALUE +rb_fiber_new(type *q, VALUE w) +{ + rb_block_call_func_t e = reinterpret_cast(q); + return ::rb_fiber_new(e, w); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Creates a @ref rb_cProc instance. +/// @param[in] q The proc body. +/// @param[in] w Passed to `q`. +/// @return What was allocated. +/// @note It makes no sense to pass nullptr to`q`. +/// @see rb_fiber_new() +/// @see rb_thread_create() +/// @deprecated Use granular typed overload instead. +inline VALUE +rb_proc_new(type *q, VALUE w) +{ + rb_block_call_func_t e = reinterpret_cast(q); + return ::rb_proc_new(e, w); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Creates a @ref rb_cThread instance. +/// @param[in] q The thread body. +/// @param[in] w Passed to `q`. +/// @return What was allocated. +/// @note It makes no sense to pass nullptr to`q`. +/// @see rb_proc_new() +/// @see rb_fiber_new() +/// @deprecated Use granular typed overload instead. +inline VALUE +rb_thread_create(type *q, void *w) +{ + typedef VALUE ptr_t(void*); + ptr_t *e = reinterpret_cast(q); + return ::rb_thread_create(e, w); +} + +/// @} +/// @name Hash and st_table +/// @{ + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Iteration over the given table. +/// @param[in] q A table to scan. +/// @param[in] w A function to iterate. +/// @param[in] e Passed to `w`. +/// @retval 0 Always returns 0. +/// @note It makes no sense to pass nullptr to`w`. +/// @see st_foreach_check() +/// @see rb_hash_foreach() +/// @deprecated Use granular typed overload instead. +inline int +st_foreach(st_table *q, int_type *w, st_data_t e) +{ + st_foreach_callback_func *r = + reinterpret_cast(w); + return ::st_foreach(q, r, e); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Iteration over the given table. +/// @param[in] q A table to scan. +/// @param[in] w A function to iterate. +/// @param[in] e Passed to `w`. +/// @retval 0 Successful end of iteration. +/// @retval 1 Element removed during traversing. +/// @note It makes no sense to pass nullptr to`w`. +/// @see st_foreach() +/// @deprecated Use granular typed overload instead. +inline int +st_foreach_check(st_table *q, int_type *w, st_data_t e, st_data_t) +{ + st_foreach_check_callback_func *t = + reinterpret_cast(w); + return ::st_foreach_check(q, t, e, 0); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Iteration over the given table. +/// @param[in] q A table to scan. +/// @param[in] w A function to iterate. +/// @param[in] e Passed to `w`. +/// @note It makes no sense to pass nullptr to`w`. +/// @see st_foreach_check() +/// @deprecated Use granular typed overload instead. +inline void +st_foreach_safe(st_table *q, int_type *w, st_data_t e) +{ + st_foreach_callback_func *r = + reinterpret_cast(w); + ::st_foreach_safe(q, r, e); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Iteration over the given hash. +/// @param[in] q A hash to scan. +/// @param[in] w A function to iterate. +/// @param[in] e Passed to `w`. +/// @note It makes no sense to pass nullptr to`w`. +/// @see st_foreach() +/// @deprecated Use granular typed overload instead. +inline void +rb_hash_foreach(VALUE q, int_type *w, VALUE e) +{ + st_foreach_callback_func *r = + reinterpret_cast(w); + ::rb_hash_foreach(q, r, e); +} + +RUBY_CXX_DEPRECATED("Use of ANYARGS in this function is deprecated") +/// @brief Iteration over each instance variable of the object. +/// @param[in] q An object. +/// @param[in] w A function to iterate. +/// @param[in] e Passed to `w`. +/// @note It makes no sense to pass nullptr to`w`. +/// @see st_foreach() +/// @deprecated Use granular typed overload instead. +inline void +rb_ivar_foreach(VALUE q, int_type *w, VALUE e) +{ + st_foreach_callback_func *r = + reinterpret_cast(w); + ::rb_ivar_foreach(q, r, e); +} + +/// @} + +/// Driver for *_define_method. ::rb_define_method function for instance takes +/// a pointer to ANYARGS-ed functions, which in fact varies 18 different +/// prototypes. We still need to preserve ANYARGS for storages but why not +/// check the consistencies if possible. In C++ a function has its own +/// prototype, which is a compile-time constant (static type) by nature. We +/// can list up all the possible input types and provide warnings for other +/// cases. This is such attempt. +namespace define_method { + +/// Type of ::rb_f_notimplement(). +typedef VALUE notimpl_type(int, const VALUE *, VALUE, VALUE); + +/// @brief Template metaprogramming to generate function prototypes. +/// @tparam T Type of method id (`ID` or `const char*` in practice). +/// @tparam F Definition driver e.g. ::rb_define_method. +template +struct driver { + + /// @brief Defines a method + /// @tparam N Arity of the function. + /// @tparam U The function in question + template + struct engine { + + /* :TODO: Following deprecation attribute renders tons of warnings (one + * per every method definitions), which is annoying. Of course + * annoyance is the core feature of deprecation warnings... But that + * could be too much, especially when the warnings happen inside of + * machine-generated programs. And SWIG is known to do such thing. + * The new (granular) API was introduced in API version 2.7. As of + * this writing the version is 2.8. Let's warn this later, some time + * during 3.x. Hopefully codes in old (ANYARGS-ed) format should be + * less than now. */ +#if (RUBY_API_VERSION_MAJOR * 100 + RUBY_API_VERSION_MINOR) >= 301 + RUBY_CXX_DEPRECATED("use of ANYARGS is deprecated") +#endif + /// @copydoc define(VALUE klass, T mid, U func) + /// @deprecated Pass correctly typed function instead. + static inline void + define(VALUE klass, T mid, type func) + { + F(klass, mid, func, N); + } + + /// @brief Defines klass#mid as func, whose arity is N. + /// @param[in] klass Where the method lives. + /// @param[in] mid Name of the method to define. + /// @param[in] func Function that implements klass#mid. + static inline void + define(VALUE klass, T mid, U func) + { + F(klass, mid, reinterpret_cast(func), N); + } + + /// @copydoc define(VALUE klass, T mid, U func) + static inline void + define(VALUE klass, T mid, notimpl_type func) + { + F(klass, mid, reinterpret_cast(func), N); + } + }; + + /// @cond INTERNAL_MACRO + template struct specific : public engine {}; + template struct specific<15, b> : public engine<15, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific<14, b> : public engine<14, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific<13, b> : public engine<13, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific<12, b> : public engine<12, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific<11, b> : public engine<11, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific<10, b> : public engine<10, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 9, b> : public engine< 9, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 8, b> : public engine< 8, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 7, b> : public engine< 7, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 6, b> : public engine< 6, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 5, b> : public engine< 5, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 4, b> : public engine< 4, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 3, b> : public engine< 3, VALUE(*)(VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 2, b> : public engine< 2, VALUE(*)(VALUE, VALUE, VALUE)> {}; + template struct specific< 1, b> : public engine< 1, VALUE(*)(VALUE, VALUE)> {}; + template struct specific< 0, b> : public engine< 0, VALUE(*)(VALUE)> {}; + template struct specific<-1, b> : public engine<-1, VALUE(*)(int argc, VALUE *argv, VALUE self)> { + using engine<-1, VALUE(*)(int argc, VALUE *argv, VALUE self)>::define; + static inline void define(VALUE c, T m, VALUE(*f)(int argc, const VALUE *argv, VALUE self)) { F(c, m, reinterpret_cast(f), -1); } + }; + template struct specific<-2, b> : public engine<-2, VALUE(*)(VALUE, VALUE)> {}; + /// @endcond +}; + +/* We could perhaps merge this struct into the one above using variadic + * template parameters if we could assume C++11, but sadly we cannot. */ +/// @copydoc ruby::backward::cxxanyargs::define_method::driver +template +struct driver0 { + + /// @brief Defines a method + /// @tparam N Arity of the function. + /// @tparam U The function in question + template + struct engine { + RUBY_CXX_DEPRECATED("use of ANYARGS is deprecated") + /// @copydoc define(T mid, U func) + /// @deprecated Pass correctly typed function instead. + static inline void + define(T mid, type func) + { + F(mid, func, N); + } + + /// @brief Defines Kernel#mid as func, whose arity is N. + /// @param[in] mid Name of the method to define. + /// @param[in] func Function that implements klass#mid. + static inline void + define(T mid, U func) + { + F(mid, reinterpret_cast(func), N); + } + + /// @copydoc define(T mid, U func) + /// @deprecated Pass correctly typed function instead. + static inline void + define(T mid, notimpl_type func) + { + F(mid, reinterpret_cast(func), N); + } + }; + + /// @cond INTERNAL_MACRO + template struct specific : public engine {}; + template struct specific<15, b> : public engine<15, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific<14, b> : public engine<14, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific<13, b> : public engine<13, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific<12, b> : public engine<12, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific<11, b> : public engine<11, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific<10, b> : public engine<10, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 9, b> : public engine< 9, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 8, b> : public engine< 8, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 7, b> : public engine< 7, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 6, b> : public engine< 6, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 5, b> : public engine< 5, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 4, b> : public engine< 4, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 3, b> : public engine< 3, VALUE(*)(VALUE, VALUE, VALUE, VALUE)> {}; + template struct specific< 2, b> : public engine< 2, VALUE(*)(VALUE, VALUE, VALUE)> {}; + template struct specific< 1, b> : public engine< 1, VALUE(*)(VALUE, VALUE)> {}; + template struct specific< 0, b> : public engine< 0, VALUE(*)(VALUE)> {}; + template struct specific<-1, b> : public engine<-1, VALUE(*)(int argc, VALUE *argv, VALUE self)> { + using engine<-1, VALUE(*)(int argc, VALUE *argv, VALUE self)>::define; + static inline void define(T m, VALUE(*f)(int argc, const VALUE *argv, VALUE self)) { F(m, reinterpret_cast(f), -1); } + }; + template struct specific<-2, b> : public engine<-2, VALUE(*)(VALUE, VALUE)> {}; + /// @endcond +}; + +struct rb_define_method : public driver {}; ///< Dispatches appropriate driver for ::rb_define_method. +struct rb_define_method_id : public driver {}; ///< Dispatches appropriate driver for ::rb_define_method_id. +struct rb_define_private_method : public driver {}; ///< Dispatches appropriate driver for ::rb_define_private_method. +struct rb_define_protected_method : public driver {}; ///< Dispatches appropriate driver for ::rb_define_protected_method. +struct rb_define_singleton_method : public driver {}; ///< Dispatches appropriate driver for ::rb_define_singleton_method. +struct rb_define_module_function : public driver {}; ///< Dispatches appropriate driver for ::rb_define_module_function. +struct rb_define_global_function : public driver0 {}; ///< Dispatches appropriate driver for ::rb_define_global_function. + +/// @brief Defines klass\#mid. +/// @param klass Where the method lives. +/// @copydetails #rb_define_global_function(mid, func, arity) +#define rb_define_method(klass, mid, func, arity) ::ruby::backward::cxxanyargs::define_method::rb_define_method::specific::define(klass, mid, func) + +/// @copydoc #rb_define_method(klass, mid, func, arity) +#define rb_define_method_id(klass, mid, func, arity) ::ruby::backward::cxxanyargs::define_method::rb_define_method_id::specific::define(klass, mid, func) + +/// @brief Defines klass\#mid and makes it private. +/// @copydetails #rb_define_method(klass, mid, func, arity) +#define rb_define_private_method(klass, mid, func, arity) ::ruby::backward::cxxanyargs::define_method::rb_define_private_method::specific::define(klass, mid, func) + +/// @brief Defines klass\#mid and makes it protected. +/// @copydetails #rb_define_method +#define rb_define_protected_method(klass, mid, func, arity) ::ruby::backward::cxxanyargs::define_method::rb_define_protected_method::specific::define(klass, mid, func) + +/// @brief Defines klass.mid.(klass, mid, func, arity) +/// @copydetails #rb_define_method +#define rb_define_singleton_method(klass, mid, func, arity) ::ruby::backward::cxxanyargs::define_method::rb_define_singleton_method::specific::define(klass, mid, func) + +/// @brief Defines klass\#mid and makes it a module function. +/// @copydetails #rb_define_method(klass, mid, func, arity) +#define rb_define_module_function(klass, mid, func, arity) ::ruby::backward::cxxanyargs::define_method::rb_define_module_function::specific::define(klass, mid, func) + +/// @brief Defines ::rb_mKernel \#mid. +/// @param mid Name of the defining method. +/// @param func Implementation of \#mid. +/// @param arity Arity of \#mid. +#define rb_define_global_function(mid, func, arity) ::ruby::backward::cxxanyargs::define_method::rb_define_global_function::specific::define(mid, func) + +}}}}} + +using namespace ruby::backward::cxxanyargs; +#endif // RUBY_BACKWARD_CXXANYARGS_HPP diff --git a/libs/libruby/ruby/config.h b/libs/libruby/ruby/config.h new file mode 100644 index 0000000..f70b065 --- /dev/null +++ b/libs/libruby/ruby/config.h @@ -0,0 +1,505 @@ +#ifndef INCLUDE_RUBY_CONFIG_H +#define INCLUDE_RUBY_CONFIG_H 1 +/* confdefs.h */ +#define HAVE_STDIO_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_WCHAR_H 1 +#define STDC_HEADERS 1 +#define _ALL_SOURCE 1 +#define _DARWIN_C_SOURCE 1 +#define _GNU_SOURCE 1 +#define _HPUX_ALT_XOPEN_SOCKET_API 1 +#define _NETBSD_SOURCE 1 +#define _OPENBSD_SOURCE 1 +#define _POSIX_PTHREAD_SEMANTICS 1 +#define __STDC_WANT_IEC_60559_ATTRIBS_EXT__ 1 +#define __STDC_WANT_IEC_60559_BFP_EXT__ 1 +#define __STDC_WANT_IEC_60559_DFP_EXT__ 1 +#define __STDC_WANT_IEC_60559_EXT__ 1 +#define __STDC_WANT_IEC_60559_FUNCS_EXT__ 1 +#define __STDC_WANT_IEC_60559_TYPES_EXT__ 1 +#define __STDC_WANT_LIB_EXT2__ 1 +#define __STDC_WANT_MATH_SPEC_FUNCS__ 1 +#define _TANDEM_SOURCE 1 +#define __EXTENSIONS__ 1 +#define RUBY_SYMBOL_EXPORT_BEGIN _Pragma("GCC visibility push(default)") +#define RUBY_SYMBOL_EXPORT_END _Pragma("GCC visibility pop") +#define HAVE_STMT_AND_DECL_IN_EXPR 1 +#define HAVE_PTHREAD_H 1 +#define _REENTRANT 1 +#define _THREAD_SAFE 1 +#define HAVE_LIBPTHREAD 1 +#define THREAD_IMPL_H "thread_pthread.h" +#define THREAD_IMPL_SRC "thread_pthread.c" +#define HAVE_LIBCRYPT 1 +#define HAVE_LIBDL 1 +#define HAVE_DIRENT_H 1 +#define HAVE__BOOL 1 +#define HAVE_STDBOOL_H 1 +#define HAVE_SYS_WAIT_H 1 +#define HAVE_GRP_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_FLOAT_H 1 +#define HAVE_LANGINFO_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_LOCALE_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_PWD_H 1 +#define HAVE_SANITIZER_ASAN_INTERFACE_H 1 +#define HAVE_STDALIGN_H 1 +#define HAVE_STDIO_H 1 +#define HAVE_SYS_EVENTFD_H 1 +#define HAVE_SYS_FCNTL_H 1 +#define HAVE_SYS_FILE_H 1 +#define HAVE_SYS_IOCTL_H 1 +#define HAVE_SYS_PARAM_H 1 +#define HAVE_SYS_PRCTL_H 1 +#define HAVE_SYS_RANDOM_H 1 +#define HAVE_SYS_RESOURCE_H 1 +#define HAVE_SYS_SELECT_H 1 +#define HAVE_SYS_SENDFILE_H 1 +#define HAVE_SYS_SOCKET_H 1 +#define HAVE_SYS_SYSCALL_H 1 +#define HAVE_SYS_SYSMACROS_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_SYS_TIMES_H 1 +#define HAVE_SYS_UIO_H 1 +#define HAVE_SYSCALL_H 1 +#define HAVE_TIME_H 1 +#define HAVE_UCONTEXT_H 1 +#define HAVE_UTIME_H 1 +#define HAVE_SYS_EPOLL_H 1 +#define HAVE_STDCKDINT_H 1 +#define HAVE_STDATOMIC_H 1 +#define HAVE_X86INTRIN_H 1 +#if defined(__x86_64__) +#define HAVE_X86INTRIN_H 1 +#endif +#define HAVE_GMP_H 1 +#define HAVE_LIBGMP 1 +#define HAVE_TYPEOF 1 +#define restrict __restrict__ +#define HAVE_LONG_LONG 1 +#define HAVE_OFF_T 1 +#define SIZEOF_INT 4 +#define SIZEOF_SHORT 2 +#define SIZEOF_LONG 8 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF___INT64 0 +#define SIZEOF___INT128 16 +#define SIZEOF_OFF_T 8 +#define SIZEOF_VOIDP 8 +#define SIZEOF_FLOAT 4 +#define SIZEOF_DOUBLE 8 +#define SIZEOF_TIME_T 8 +#define SIZEOF_CLOCK_T 8 +#define RBIMPL_ATTR_PACKED_STRUCT_BEGIN() +#define RBIMPL_ATTR_PACKED_STRUCT_END() __attribute__((packed)) +#define USE_UNALIGNED_MEMBER_ACCESS 1 +#define PRI_LL_PREFIX "ll" +#define HAVE_PID_T 1 +#define rb_pid_t pid_t +#define SIGNEDNESS_OF_PID_T -1 +#define PIDT2NUM(v) INT2NUM(v) +#define NUM2PIDT(v) NUM2INT(v) +#define PRI_PIDT_PREFIX PRI_INT_PREFIX +#define HAVE_UID_T 1 +#define rb_uid_t uid_t +#define SIGNEDNESS_OF_UID_T +1 +#define UIDT2NUM(v) UINT2NUM(v) +#define NUM2UIDT(v) NUM2UINT(v) +#define PRI_UIDT_PREFIX PRI_INT_PREFIX +#define HAVE_GID_T 1 +#define rb_gid_t gid_t +#define SIGNEDNESS_OF_GID_T +1 +#define GIDT2NUM(v) UINT2NUM(v) +#define NUM2GIDT(v) NUM2UINT(v) +#define PRI_GIDT_PREFIX PRI_INT_PREFIX +#define HAVE_TIME_T 1 +#define rb_time_t time_t +#define SIGNEDNESS_OF_TIME_T -1 +#define TIMET2NUM(v) LONG2NUM(v) +#define NUM2TIMET(v) NUM2LONG(v) +#define PRI_TIMET_PREFIX PRI_LONG_PREFIX +#define HAVE_DEV_T 1 +#define rb_dev_t dev_t +#define SIGNEDNESS_OF_DEV_T +1 +#define DEVT2NUM(v) ULONG2NUM(v) +#define NUM2DEVT(v) NUM2ULONG(v) +#define PRI_DEVT_PREFIX PRI_LONG_PREFIX +#define HAVE_MODE_T 1 +#define rb_mode_t mode_t +#define SIGNEDNESS_OF_MODE_T +1 +#define MODET2NUM(v) UINT2NUM(v) +#define NUM2MODET(v) NUM2UINT(v) +#define PRI_MODET_PREFIX PRI_INT_PREFIX +#define HAVE_RLIM_T 1 +#define rb_rlim_t rlim_t +#define SIGNEDNESS_OF_RLIM_T +1 +#define RLIM2NUM(v) ULONG2NUM(v) +#define NUM2RLIM(v) NUM2ULONG(v) +#define PRI_RLIM_PREFIX PRI_LONG_PREFIX +#define HAVE_OFF_T 1 +#define rb_off_t off_t +#define SIGNEDNESS_OF_OFF_T -1 +#define OFFT2NUM(v) LONG2NUM(v) +#define NUM2OFFT(v) NUM2LONG(v) +#define PRI_OFFT_PREFIX PRI_LONG_PREFIX +#define HAVE_CLOCKID_T 1 +#define rb_clockid_t clockid_t +#define SIGNEDNESS_OF_CLOCKID_T -1 +#define CLOCKID2NUM(v) INT2NUM(v) +#define NUM2CLOCKID(v) NUM2INT(v) +#define PRI_CLOCKID_PREFIX PRI_INT_PREFIX +#define HAVE_VA_ARGS_MACRO 1 +#define HAVE__ALIGNOF 1 +#define CONSTFUNC(x) __attribute__((__const__)) x +#define PUREFUNC(x) __attribute__((__pure__)) x +#define NORETURN(x) __attribute__((__noreturn__)) x +#define DEPRECATED(x) __attribute__((__deprecated__)) x +#define DEPRECATED_BY(n, x) __attribute__((__deprecated__("by " #n))) x +#define NOINLINE(x) __attribute__((__noinline__)) x +#define ALWAYS_INLINE(x) __attribute__((__always_inline__)) x +#define NO_SANITIZE(san, x) __attribute__((__no_sanitize__(san))) x +#define NO_SANITIZE_ADDRESS(x) __attribute__((__no_sanitize_address__)) x +#define NO_ADDRESS_SAFETY_ANALYSIS(x) \ + __attribute__((__no_address_safety_analysis__)) x +#define WARN_UNUSED_RESULT(x) __attribute__((__warn_unused_result__)) x +#define MAYBE_UNUSED(x) __attribute__((__unused__)) x +#define ERRORFUNC(mesg, x) __attribute__((__error__ mesg)) x +#define WARNINGFUNC(mesg, x) __attribute__((__warning__ mesg)) x +#define WEAK(x) __attribute__((__weak__)) x +#define HAVE_FUNC_WEAK 1 +#define RUBY_CXX_DEPRECATED(msg) __attribute__((__deprecated__(msg))) +#define HAVE_NULLPTR 1 +#define FUNC_UNOPTIMIZED(x) __attribute__((__optimize__("O0"))) x +#define FUNC_MINIMIZED(x) \ + __attribute__((__optimize__("-Os", "-fomit-frame-pointer"))) x +#define HAVE_ATTRIBUTE_FUNCTION_ALIAS 1 +#define RUBY_ALIAS_FUNCTION_TYPE(type, prot, name, args) \ + type prot __attribute__((alias(#name))); +#define RUBY_ALIAS_FUNCTION_VOID(prot, name, args) \ + RUBY_ALIAS_FUNCTION_TYPE(void, prot, name, args) +#define HAVE_GCC_ATOMIC_BUILTINS 1 +#define HAVE_GCC_SYNC_BUILTINS 1 +#define HAVE___BUILTIN_UNREACHABLE 1 +#define RUBY_FUNC_EXPORTED __attribute__((__visibility__("default"))) extern +#define RUBY_FUNC_NONNULL(n, x) __attribute__((__nonnull__(n))) x +#define RUBY_FUNCTION_NAME_STRING __func__ +#define ENUM_OVER_INT 1 +#define HAVE_DECL_SYS_NERR 0 +#define HAVE_DECL_GETENV 1 +#define SIZEOF_SIZE_T 8 +#define SIZEOF_PTRDIFF_T 8 +#define SIZEOF_DEV_T 8 +#define PRI_SIZE_PREFIX "z" +#define PRI_PTRDIFF_PREFIX "t" +#define HAVE_STRUCT_STAT_ST_BLKSIZE 1 +#define HAVE_STRUCT_STAT_ST_BLOCKS 1 +#define HAVE_STRUCT_STAT_ST_RDEV 1 +#define SIZEOF_STRUCT_STAT_ST_SIZE SIZEOF_OFF_T +#define SIZEOF_STRUCT_STAT_ST_BLOCKS SIZEOF_OFF_T +#define SIZEOF_STRUCT_STAT_ST_INO SIZEOF_LONG +#define SIZEOF_STRUCT_STAT_ST_DEV SIZEOF_DEV_T +#define SIZEOF_STRUCT_STAT_ST_RDEV SIZEOF_DEV_T +#define HAVE_STRUCT_STAT_ST_ATIM 1 +#define HAVE_STRUCT_STAT_ST_MTIM 1 +#define HAVE_STRUCT_STAT_ST_CTIM 1 +#define HAVE_STRUCT_STATX_STX_BTIME 1 +#define HAVE_STRUCT_TIMEVAL 1 +#define SIZEOF_STRUCT_TIMEVAL_TV_SEC SIZEOF_TIME_T +#define HAVE_STRUCT_TIMESPEC 1 +#define HAVE_STRUCT_TIMEZONE 1 +#define HAVE_RB_FD_INIT 1 +#define HAVE_INT8_T 1 +#define SIZEOF_INT8_T 1 +#define HAVE_UINT8_T 1 +#define SIZEOF_UINT8_T 1 +#define HAVE_INT16_T 1 +#define SIZEOF_INT16_T 2 +#define HAVE_UINT16_T 1 +#define SIZEOF_UINT16_T 2 +#define HAVE_INT32_T 1 +#define SIZEOF_INT32_T 4 +#define HAVE_UINT32_T 1 +#define SIZEOF_UINT32_T 4 +#define HAVE_INT64_T 1 +#define SIZEOF_INT64_T 8 +#define HAVE_UINT64_T 1 +#define SIZEOF_UINT64_T 8 +#define HAVE_INT128_T 1 +#define int128_t __int128 +#define SIZEOF_INT128_T SIZEOF___INT128 +#define HAVE_UINT128_T 1 +#define uint128_t unsigned __int128 +#define SIZEOF_UINT128_T SIZEOF___INT128 +#define HAVE_INTPTR_T 1 +#define SIZEOF_INTPTR_T 8 +#define HAVE_UINTPTR_T 1 +#define SIZEOF_UINTPTR_T 8 +#define HAVE_SSIZE_T 1 +#define SIZEOF_SSIZE_T 8 +#define STACK_END_ADDRESS __libc_stack_end +#define GETGROUPS_T gid_t +#define HAVE_ALLOCA_H 1 +#define HAVE_ALLOCA 1 +#define HAVE_DUP 1 +#define HAVE_DUP2 1 +#define HAVE_ACOSH 1 +#define HAVE_CBRT 1 +#define HAVE_CRYPT 1 +#define HAVE_ERF 1 +#define HAVE_EXPLICIT_BZERO 1 +#define HAVE_FFS 1 +#define HAVE_FLOCK 1 +#define HAVE_HYPOT 1 +#define HAVE_LGAMMA_R 1 +#define HAVE_MEMMOVE 1 +#define HAVE_NAN 1 +#define HAVE_NEXTAFTER 1 +#define HAVE_STRCHR 1 +#define HAVE_STRERROR 1 +#define HAVE_STRLCAT 1 +#define HAVE_STRLCPY 1 +#define HAVE_STRSTR 1 +#define HAVE_TGAMMA 1 +#define HAVE_ISFINITE 1 +#define SPT_TYPE SPT_REUSEARGV +#define HAVE_SIGNBIT 1 +#define HAVE_FORK 1 +#define HAVE_VFORK 1 +#define HAVE_WORKING_VFORK 1 +#define HAVE_WORKING_FORK 1 +#define HAVE__LONGJMP 1 +#define HAVE_ARC4RANDOM_BUF 1 +#define HAVE_ATAN2L 1 +#define HAVE_ATAN2F 1 +#define HAVE_DECL_ATOMIC_SIGNAL_FENCE 1 +#define HAVE_CHMOD 1 +#define HAVE_CHOWN 1 +#define HAVE_CHROOT 1 +#define HAVE_CLOCK_GETTIME 1 +#define HAVE_COPY_FILE_RANGE 1 +#define HAVE_COSH 1 +#define HAVE_CRYPT_R 1 +#define HAVE_DIRFD 1 +#define HAVE_DL_ITERATE_PHDR 1 +#define HAVE_DLOPEN 1 +#define HAVE_DLADDR 1 +#define HAVE_DUP3 1 +#define HAVE_EACCESS 1 +#define HAVE_ENDGRENT 1 +#define HAVE_EVENTFD 1 +#define HAVE_EXECL 1 +#define HAVE_EXECLE 1 +#define HAVE_EXECV 1 +#define HAVE_EXECVE 1 +#define HAVE_FCHDIR 1 +#define HAVE_FCHMOD 1 +#define HAVE_FCHOWN 1 +#define HAVE_FCNTL 1 +#define HAVE_FDATASYNC 1 +#define HAVE_FDOPENDIR 1 +#define HAVE_FMOD 1 +#define HAVE_FSTATAT 1 +#define HAVE_FSYNC 1 +#define HAVE_FTRUNCATE 1 +#define HAVE_FTRUNCATE64 1 +#define HAVE_GETCWD 1 +#define HAVE_GETEGID 1 +#define HAVE_GETENTROPY 1 +#define HAVE_GETEUID 1 +#define HAVE_GETGID 1 +#define HAVE_GETGRNAM 1 +#define HAVE_GETGRNAM_R 1 +#define HAVE_GETGROUPS 1 +#define HAVE_GETLOGIN 1 +#define HAVE_GETLOGIN_R 1 +#define HAVE_GETPGID 1 +#define HAVE_GETPGRP 1 +#define HAVE_GETPPID 1 +#define HAVE_GETPRIORITY 1 +#define HAVE_GETPWNAM 1 +#define HAVE_GETPWNAM_R 1 +#define HAVE_GETPWUID 1 +#define HAVE_GETPWUID_R 1 +#define HAVE_GETRANDOM 1 +#define HAVE_GETRESGID 1 +#define HAVE_GETRESUID 1 +#define HAVE_GETRLIMIT 1 +#define HAVE_GETSID 1 +#define HAVE_GETTIMEOFDAY 1 +#define HAVE_GETUID 1 +#define HAVE_GMTIME_R 1 +#define HAVE_INITGROUPS 1 +#define HAVE_IOCTL 1 +#define HAVE_KILL 1 +#define HAVE_KILLPG 1 +#define HAVE_LCHMOD 1 +#define HAVE_LCHOWN 1 +#define HAVE_LINK 1 +#define HAVE_LLABS 1 +#define HAVE_LOCKF 1 +#define HAVE_LOG2 1 +#define HAVE_LSTAT 1 +#define HAVE_LUTIMES 1 +#define HAVE_MALLOC_USABLE_SIZE 1 +#define HAVE_MALLOC_TRIM 1 +#define HAVE_MBLEN 1 +#define HAVE_MEMALIGN 1 +#define HAVE_WRITEV 1 +#define HAVE_MEMRCHR 1 +#define HAVE_MEMMEM 1 +#define HAVE_MKFIFO 1 +#define HAVE_MKNOD 1 +#define HAVE_MKTIME 1 +#define HAVE_MMAP 1 +#define HAVE_MREMAP 1 +#define HAVE_OPENAT 1 +#define HAVE_PCLOSE 1 +#define HAVE_PIPE 1 +#define HAVE_PIPE2 1 +#define HAVE_POLL 1 +#define HAVE_POPEN 1 +#define HAVE_POSIX_FADVISE 1 +#define HAVE_POSIX_MADVISE 1 +#define HAVE_POSIX_MEMALIGN 1 +#define HAVE_PPOLL 1 +#define HAVE_PREAD 1 +#define HAVE_PWRITE 1 +#define HAVE_QSORT_R 1 +#define HAVE_READLINK 1 +#define HAVE_REALPATH 1 +#define HAVE_ROUND 1 +#define HAVE_SCHED_GETAFFINITY 1 +#define HAVE_SEEKDIR 1 +#define HAVE_SENDFILE 1 +#define HAVE_SETEGID 1 +#define HAVE_SETENV 1 +#define HAVE_SETEUID 1 +#define HAVE_SETGID 1 +#define HAVE_SETGROUPS 1 +#define HAVE_SETPGID 1 +#define HAVE_SETPGRP 1 +#define HAVE_SETREGID 1 +#define HAVE_SETRESGID 1 +#define HAVE_SETRESUID 1 +#define HAVE_SETREUID 1 +#define HAVE_SETRLIMIT 1 +#define HAVE_SETSID 1 +#define HAVE_SETUID 1 +#define HAVE_SHUTDOWN 1 +#define HAVE_SIGACTION 1 +#define HAVE_SIGALTSTACK 1 +#define HAVE_SIGPROCMASK 1 +#define HAVE_SINH 1 +#define HAVE_SNPRINTF 1 +#define HAVE_SYMLINK 1 +#define HAVE_SYSCALL 1 +#define HAVE_SYSCONF 1 +#define HAVE_SYSTEM 1 +#define HAVE_TANH 1 +#define HAVE_TELLDIR 1 +#define HAVE_TIMEGM 1 +#define HAVE_TIMES 1 +#define HAVE_TRUNCATE 1 +#define HAVE_TRUNCATE64 1 +#define HAVE_TZSET 1 +#define HAVE_UMASK 1 +#define HAVE_UNSETENV 1 +#define HAVE_UTIMENSAT 1 +#define HAVE_UTIMES 1 +#define HAVE_WAIT4 1 +#define HAVE_WAITPID 1 +#define HAVE_STATX 1 +#define HAVE_CRYPT_H 1 +#define HAVE_STRUCT_CRYPT_DATA_INITIALIZED 1 +#define HAVE_BUILTIN___BUILTIN_ALLOCA_WITH_ALIGN 1 +#define HAVE_BUILTIN___BUILTIN_ASSUME_ALIGNED 1 +#define HAVE_BUILTIN___BUILTIN_BSWAP16 1 +#define HAVE_BUILTIN___BUILTIN_BSWAP32 1 +#define HAVE_BUILTIN___BUILTIN_BSWAP64 1 +#define HAVE_BUILTIN___BUILTIN_POPCOUNT 1 +#define HAVE_BUILTIN___BUILTIN_POPCOUNTLL 1 +#define HAVE_BUILTIN___BUILTIN_CLZ 1 +#define HAVE_BUILTIN___BUILTIN_CLZL 1 +#define HAVE_BUILTIN___BUILTIN_CLZLL 1 +#define HAVE_BUILTIN___BUILTIN_CTZ 1 +#define HAVE_BUILTIN___BUILTIN_CTZLL 1 +#define HAVE_BUILTIN___BUILTIN_CONSTANT_P 1 +#define HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR 1 +#define HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P 1 +#define HAVE_BUILTIN___BUILTIN_TYPES_COMPATIBLE_P 1 +#define HAVE_BUILTIN___BUILTIN_TRAP 1 +#define HAVE_BUILTIN___BUILTIN_EXPECT 1 +#define HAVE_BUILTIN___BUILTIN_ADD_OVERFLOW 1 +#define HAVE_BUILTIN___BUILTIN_ADD_OVERFLOW_P 1 +#define USE___BUILTIN_ADD_OVERFLOW_LONG_LONG 1 +#define HAVE_BUILTIN___BUILTIN_SUB_OVERFLOW 1 +#define HAVE_BUILTIN___BUILTIN_SUB_OVERFLOW_P 1 +#define USE___BUILTIN_SUB_OVERFLOW_LONG_LONG 1 +#define HAVE_BUILTIN___BUILTIN_MUL_OVERFLOW 1 +#define HAVE_BUILTIN___BUILTIN_MUL_OVERFLOW_P 1 +#define USE___BUILTIN_MUL_OVERFLOW_LONG_LONG 1 +#define HAVE_GNU_QSORT_R 1 +#define ATAN2_INF_C99 1 +#define HAVE_CLOCK_GETRES 1 +#define HAVE_LIBRT 1 +#define HAVE_LIBRT 1 +#define HAVE_TIMER_CREATE 1 +#define HAVE_TIMER_SETTIME 1 +#define HAVE_STRUCT_TM_TM_ZONE 1 +#define HAVE_TM_ZONE 1 +#define HAVE_STRUCT_TM_TM_GMTOFF 1 +#define HAVE_DAYLIGHT 1 +#define NEGATIVE_TIME_T 1 +#define POSIX_SIGNAL 1 +#define HAVE_SIG_T 1 +#define RSHIFT(x, y) ((x) >> (int)(y)) +#define USE_COPY_FILE_RANGE 1 +#define HAVE__SC_CLK_TCK 1 +#define STACK_GROW_DIRECTION -1 +#define COROUTINE_H "coroutine/amd64/Context.h" +#define HAVE_SCHED_YIELD 1 +#define HAVE_PTHREAD_ATTR_SETINHERITSCHED 1 +#define HAVE_PTHREAD_ATTR_GETSTACK 1 +#define HAVE_PTHREAD_ATTR_GETGUARDSIZE 1 +#define HAVE_PTHREAD_CONDATTR_SETCLOCK 1 +#define HAVE_PTHREAD_SETNAME_NP 1 +#define HAVE_PTHREAD_SIGMASK 1 +#define HAVE_PTHREAD_GETATTR_NP 1 +#define SET_CURRENT_THREAD_NAME(name) pthread_setname_np(pthread_self(), name) +#define SET_ANOTHER_THREAD_NAME(thid, name) pthread_setname_np(thid, name) +#define RB_THREAD_LOCAL_SPECIFIER _Thread_local +#define DEFINE_MCONTEXT_PTR(mc, uc) mcontext_t *mc = &(uc)->uc_mcontext +#define HAVE_GETCONTEXT 1 +#define HAVE_SETCONTEXT 1 +#define HAVE_SYS_USER_H 1 +#define HAVE_CONST_PAGE_SIZE 0 +#define IOCTL_REQ_TYPE unsigned long +#define NUM2IOCTLREQ(num) NUM2ULONG(num) +#define USE_ELF 1 +#define HAVE_ELF_H 1 +#define HAVE_LIBZ 1 +#define HAVE_BACKTRACE 1 +#define DLEXT_MAXLEN 3 +#define DLEXT ".so" +#define SOEXT ".so" +#define LIBDIR_BASENAME "lib" +#define HAVE__SETJMP 1 +#define RUBY_SETJMP(env) _setjmp((env)) +#define RUBY_LONGJMP(env, val) _longjmp((env), val) +#define RUBY_JMP_BUF jmp_buf +#define USE_MODULAR_GC 0 +#define USE_YJIT 1 +#define USE_RJIT 1 +#define RUBY_PLATFORM "x86_64-linux" +#define RB_DEFAULT_PARSER RB_DEFAULT_PARSER_PRISM +#endif /* INCLUDE_RUBY_CONFIG_H */ diff --git a/libs/libruby/ruby/debug.h b/libs/libruby/ruby/debug.h new file mode 100644 index 0000000..f95acdb --- /dev/null +++ b/libs/libruby/ruby/debug.h @@ -0,0 +1,667 @@ +#ifndef RB_DEBUG_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RB_DEBUG_H 1 +/** + * @file + * @author $Author: ko1 $ + * @date Tue Nov 20 20:35:08 2012 + * @copyright Copyright (C) 2012 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/returns_nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/event.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* Note: This file contains experimental APIs. */ +/* APIs can be replaced at Ruby 2.0.1 or later */ + +/** + * @name Frame-profiling APIs + * + * @{ + */ + +RBIMPL_ATTR_NONNULL((3)) +/** + * Queries mysterious "frame"s of the given range. + * + * The returned values are opaque backtrace pointers, which you are allowed to + * issue a very limited set of operations listed below. Don't call arbitrary + * ruby methods. + * + * @param[in] start Start position (0 means the topmost). + * @param[in] limit Number objects of `buff`. + * @param[out] buff Return buffer. + * @param[out] lines Return buffer. + * @return Number of objects filled into `buff`. + * @post `buff` is filled with backtrace pointers. + * @post `lines` is filled with `__LINE__` of each backtraces. + * + * @internal + * + * @shyouhei doesn't like this abuse of ::VALUE. It should have been + * `const struct rb_callable_method_entry_struct *`. + */ +int rb_profile_frames(int start, int limit, VALUE *buff, int *lines); + +/** + * Queries the path of the passed backtrace. + * + * @param[in] frame What rb_profile_frames() returned. + * @retval RUBY_Qnil The frame is implemented in C etc. + * @retval otherwise Where `frame` is running. + */ +VALUE rb_profile_frame_path(VALUE frame); + +/** + * Identical to rb_profile_frame_path(), except it tries to expand the + * returning path. In case the path is `require`-d from something else + * rb_profile_frame_path() can return relative paths. This one tries to avoid + * that. + * + * @param[in] frame What rb_profile_frames() returned. + * @retval "" The frame is in C. + * @retval RUBY_Qnil Can't infer real path (inside of `eval` etc.). + * @retval otherwise Where `frame` is running. + */ +VALUE rb_profile_frame_absolute_path(VALUE frame); + +/** + * Queries human-readable "label" string. This is `"

"` for the toplevel, + * `""` for evaluated ones, method name for methods, class name for + * classes. + * + * @param[in] frame What rb_profile_frames() returned. + * @retval RUBY_Qnil Can't infer the label (C etc.). + * @retval "
" The frame is global toplevel. + * @retval "" The frame is dynamic. + * @retval otherwise Label of the frame. + */ +VALUE rb_profile_frame_label(VALUE frame); + +/** + * Identical to rb_profile_frame_label(), except it does not "qualify" the + * result. Consider the following backtrace: + * + * ```ruby + * def bar + * caller_locations + * end + * + * def foo + * [1].map { bar }.first + * end + * + * obj = foo.first + * obj.label # => "block in foo" + * obj.base_label # => "foo" + * ``` + * + * @param[in] frame What rb_profile_frames() returned. + * @retval RUBY_Qnil Can't infer the label (C etc.). + * @retval "
" The frame is global toplevel. + * @retval "" The frame is dynamic. + * @retval otherwise Base label of the frame. + */ +VALUE rb_profile_frame_base_label(VALUE frame); + +/** + * Identical to rb_profile_frame_label(), except it returns a qualified result. + * + * @param[in] frame What rb_profile_frames() returned. + * @retval RUBY_Qnil Can't infer the label (C etc.). + * @retval "
" The frame is global toplevel. + * @retval "" The frame is dynamic. + * @retval otherwise Qualified label of the frame. + * + * @internal + * + * As of writing there is no way to obtain this return value from a Ruby + * script. This may change in future (it took 8 years and still no progress, + * though). + */ +VALUE rb_profile_frame_full_label(VALUE frame); + +/** + * Queries the first line of the method of the passed frame pointer. Can be + * handy when for instance a debugger want to display the frame in question. + * + * @param[in] frame What rb_profile_frames() returned. + * @retval RUBY_Qnil Can't infer the line (C etc.). + * @retval otherwise Line number of the method in question. + */ +VALUE rb_profile_frame_first_lineno(VALUE frame); + +/** + * Queries the class path of the method that the passed frame represents. + * + * @param[in] frame What rb_profile_frames() returned. + * @retval RUBY_Qnil Can't infer the class (global toplevel etc.). + * @retval otherwise Class path as in rb_class_path(). + */ +VALUE rb_profile_frame_classpath(VALUE frame); + +/** + * Queries if the method of the passed frame is a singleton class. + * + * @param[in] frame What rb_profile_frames() returned. + * @retval RUBY_Qtrue It is a singleton method. + * @retval RUBY_Qfalse Otherwise (normal method/non-method). + */ +VALUE rb_profile_frame_singleton_method_p(VALUE frame); + +/** + * Queries the name of the method of the passed frame. + * + * @param[in] frame What rb_profile_frames() returned. + * @retval RUBY_Qnil The frame in question is not a method. + * @retval otherwise Name of the method of the frame. + */ +VALUE rb_profile_frame_method_name(VALUE frame); + +/** + * Identical to rb_profile_frame_method_name(), except it "qualifies" the + * return value with its defining class. + * + * @param[in] frame What rb_profile_frames() returned. + * @retval RUBY_Qnil The frame in question is not a method. + * @retval otherwise Qualified name of the method of the frame. + */ +VALUE rb_profile_frame_qualified_method_name(VALUE frame); + +/** @} */ + +/** + * @name Debug inspector APIs + * + * @{ + */ + +/** Opaque struct representing a debug inspector. */ +typedef struct rb_debug_inspector_struct rb_debug_inspector_t; + +/** + * Type of the callback function passed to rb_debug_inspector_open(). + * Inspection shall happen only inside of them. The passed pointers gets + * invalidated once after the callback returns. + * + * @param[in] dc A debug context. + * @param[in,out] data What was passed to rb_debug_inspector_open(). + * @return What would be the return value of rb_debug_inspector_open(). + */ +typedef VALUE (*rb_debug_inspector_func_t)(const rb_debug_inspector_t *dc, void *data); + +/** + * Prepares, executes, then cleans up a debug session. + * + * @param[in] func A callback to run inside of a debug session. + * @param[in,out] data Passed as-is to `func`. + * @return What was returned from `func`. + */ +VALUE rb_debug_inspector_open(rb_debug_inspector_func_t func, void *data); + +/** + * Queries the backtrace object of the context. This is as if you call + * `caller_locations` at the point of debugger. + * + * @param[in] dc A debug context. + * @return An array of `Thread::Backtrace::Location` which represents the + * current point of execution at `dc`. + + */ +VALUE rb_debug_inspector_backtrace_locations(const rb_debug_inspector_t *dc); + +/** + * Queries the current receiver of the passed context's upper frame. + * + * @param[in] dc A debug context. + * @param[in] index Index of the frame from top to bottom. + * @exception rb_eArgError `index` out of range. + * @return The current receiver at `index`-th frame. + */ +VALUE rb_debug_inspector_frame_self_get(const rb_debug_inspector_t *dc, long index); + +/** + * Queries the current class of the passed context's upper frame. + * + * @param[in] dc A debug context. + * @param[in] index Index of the frame from top to bottom. + * @exception rb_eArgError `index` out of range. + * @return The current class at `index`-th frame. + */ +VALUE rb_debug_inspector_frame_class_get(const rb_debug_inspector_t *dc, long index); + +/** + * Queries the binding of the passed context's upper frame. + * + * @param[in] dc A debug context. + * @param[in] index Index of the frame from top to bottom. + * @exception rb_eArgError `index` out of range. + * @return The binding at `index`-th frame. + */ +VALUE rb_debug_inspector_frame_binding_get(const rb_debug_inspector_t *dc, long index); + +/** + * Queries the instruction sequence of the passed context's upper frame. + * + * @param[in] dc A debug context. + * @param[in] index Index of the frame from top to bottom. + * @exception rb_eArgError `index` out of range. + * @retval RUBY_Qnil `index`-th frame is not in Ruby (C etc.). + * @retval otherwise An instance of `RubyVM::InstructionSequence` which + * represents the instruction sequence at `index`-th + * frame. + */ +VALUE rb_debug_inspector_frame_iseq_get(const rb_debug_inspector_t *dc, long index); + +/** + * Queries the depth of the passed context's upper frame. + * + * Note that the depth is not same as the frame index because debug_inspector + * skips some special frames but the depth counts all frames. + * + * @param[in] dc A debug context. + * @param[in] index Index of the frame from top to bottom. + * @exception rb_eArgError `index` out of range. + * @retval The depth at `index`-th frame in Integer. + */ +VALUE rb_debug_inspector_frame_depth(const rb_debug_inspector_t *dc, long index); + +// A macro to recognize `rb_debug_inspector_frame_depth()` is available or not +#define RB_DEBUG_INSPECTOR_FRAME_DEPTH(dc, index) rb_debug_inspector_frame_depth(dc, index) + +/** + * Return current frmae depth. + * + * @retval The depth of the current frame in Integer. + */ +VALUE rb_debug_inspector_current_depth(void); + +/** @} */ + +/** + * @name Old style set_trace_func APIs + * + * @{ + */ + +/* duplicated def of include/ruby/ruby.h */ +#include "ruby/internal/event.h" + +/** + * Identical to rb_remove_event_hook(), except it additionally takes the data + * argument. This extra argument is the same as that of rb_add_event_hook(), + * and this function removes the hook which matches both arguments at once. + * + * @param[in] func A callback. + * @param[in] data What to be passed to `func`. + * @return Number of deleted event hooks. + * @note As multiple events can share the same `func` it is quite + * possible for the return value to become more than one. + */ +int rb_remove_event_hook_with_data(rb_event_hook_func_t func, VALUE data); + +/** + * Identical to rb_add_event_hook(), except its effect is limited to the passed + * thread. Other threads are not affected by this. + * + * @param[in] thval An instance of ::rb_cThread. + * @param[in] func A callback. + * @param[in] events A set of events that `func` should run. + * @param[in] data Passed as-is to `func`. + * @exception rb_eTypeError `thval` is not a thread. + */ +void rb_thread_add_event_hook(VALUE thval, rb_event_hook_func_t func, rb_event_flag_t events, VALUE data); + +/** + * Identical to rb_remove_event_hook(), except it additionally takes a thread + * argument. This extra argument is the same as that of + * rb_thread_add_event_hook(), and this function removes the hook which matches + * both arguments at once. + * + * @param[in] thval An instance of ::rb_cThread. + * @param[in] func A callback. + * @exception rb_eTypeError `thval` is not a thread. + * @return Number of deleted event hooks. + * @note As multiple events can share the same `func` it is quite + * possible for the return value to become more than one. + */ +int rb_thread_remove_event_hook(VALUE thval, rb_event_hook_func_t func); + +/** + * Identical to rb_thread_remove_event_hook(), except it additionally takes the + * data argument. It can also be seen as a routine identical to + * rb_remove_event_hook_with_data(), except it additionally takes the thread. + * This function deletes hooks that satisfy all three criteria. + * + * @param[in] thval An instance of ::rb_cThread. + * @param[in] func A callback. + * @param[in] data What to be passed to `func`. + * @exception rb_eTypeError `thval` is not a thread. + * @return Number of deleted event hooks. + * @note As multiple events can share the same `func` it is quite + * possible for the return value to become more than one. + */ +int rb_thread_remove_event_hook_with_data(VALUE thval, rb_event_hook_func_t func, VALUE data); + +/** @} */ + +/** + * @name TracePoint APIs + * + * @{ + */ + +/** + * Creates a tracepoint by registering a callback function for one or more + * tracepoint events. Once the tracepoint is created, you can use + * rb_tracepoint_enable to enable the tracepoint. + * + * @param[in] target_thread_not_supported_yet Meant for picking the + * thread in which the tracepoint is to be created. + * However, current implementation ignore this + * parameter, tracepoint is created for all threads. + * Simply specify Qnil. + * @param[in] events Event(s) to listen to. + * @param[in] func A callback function. + * @param[in,out] data Void pointer that will be passed to the callback + * function. + * + * When the callback function is called, it will be passed 2 parameters: + * 1. `VALUE tpval` - the TracePoint object from which trace args can be + * extracted. + * 1. `void *data` - A void pointer which helps to share scope with the + * callback function. + * + * It is important to note that you cannot register callbacks for normal events + * and internal events simultaneously because they are different purpose. You + * can use any Ruby APIs (calling methods and so on) on normal event hooks. + * However, in internal events, you can not use any Ruby APIs (even object + * creations). This is why we can't specify internal events by TracePoint + * directly. Limitations are MRI version specific. + * + * Example: + * + * ```CXX + * rb_tracepoint_new( + * Qnil, + * RUBY_INTERNAL_EVENT_NEWOBJ | RUBY_INTERNAL_EVENT_FREEOBJ, + * obj_event_i, + * data); + * ``` + * + * In this example, a callback function `obj_event_i` will be registered for + * internal events #RUBY_INTERNAL_EVENT_NEWOBJ and + * #RUBY_INTERNAL_EVENT_FREEOBJ. + */ +VALUE rb_tracepoint_new(VALUE target_thread_not_supported_yet, rb_event_flag_t events, void (*func)(VALUE, void *), void *data); + +/** + * Starts (enables) trace(s) defined by the passed object. A TracePoint object + * does not immediately take effect on creation. You have to explicitly call + * this API. + * + * @param[in] tpval An instance of TracePoint. + * @exception rb_eArgError A trace is already running. + * @return Undefined value. Forget this. It should have returned `void`. + * @post Trace(s) defined by `tpval` start. + */ +VALUE rb_tracepoint_enable(VALUE tpval); + +/** + * Stops (disables) an already running instance of TracePoint. + * + * @param[in] tpval An instance of TracePoint. + * @return Undefined value. Forget this. It should have returned `void`. + * @post Trace(s) defined by `tpval` stop. + */ +VALUE rb_tracepoint_disable(VALUE tpval); + +/** + * Queries if the passed TracePoint is up and running. + * + * @param[in] tpval An instance of TracePoint. + * @retval RUBY_Qtrue It is. + * @retval RUBY_Qfalse It isn't. + */ +VALUE rb_tracepoint_enabled_p(VALUE tpval); + +/** + * Type that represents a specific trace event. Roughly resembles the + * tracepoint object that is passed to the block of `TracePoint.new`: + * + * ```ruby + * TracePoint.new(*events) do |obj| + * ... # ^^^^^ Resembles this object. + * end + * ``` + */ +typedef struct rb_trace_arg_struct rb_trace_arg_t; + +RBIMPL_ATTR_RETURNS_NONNULL() +/** + * Queries the current event of the passed tracepoint. + * + * @param[in] tpval An instance of TracePoint. + * @exception rb_eRuntimeError `tpval` is disabled. + * @return The current event. + * + * @internal + * + * `tpval` is a fake. There is only one instance of ::rb_trace_arg_t at one + * time. This function just returns that global variable. + */ +rb_trace_arg_t *rb_tracearg_from_tracepoint(VALUE tpval); + +RBIMPL_ATTR_NONNULL(()) +/** + * Queries the event of the passed trace. + * + * @param[in] trace_arg A trace instance. + * @return Its event. + */ +rb_event_flag_t rb_tracearg_event_flag(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_tracearg_event_flag(), except it returns the name of the + * event in Ruby's symbol. + * + * @param[in] trace_arg A trace instance. + * @return Its event, in Ruby level Symbol object. + */ +VALUE rb_tracearg_event(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Queries the line of the point where the trace is at. + * + * @param[in] trace_arg A trace instance. + * @retval 0 The trace is not at Ruby frame. + * @return otherwise Its line number. + */ +VALUE rb_tracearg_lineno(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Queries the file name of the point where the trace is at. + * + * @param[in] trace_arg A trace instance. + * @retval RUBY_Qnil The trace is not at Ruby frame. + * @retval otherwise Its path. + */ +VALUE rb_tracearg_path(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Queries the method name of the point where the trace is at. + * + * @param[in] trace_arg A trace instance. + * @retval RUBY_Qnil There is no method. + * @retval otherwise Its method name, in Ruby level Symbol. + */ +VALUE rb_tracearg_method_id(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_tracearg_method_id(), except it returns callee id like + * rb_frame_callee(). + * + * @param[in] trace_arg A trace instance. + * @retval RUBY_Qnil There is no method. + * @retval otherwise Its method name, in Ruby level Symbol. + */ +VALUE rb_tracearg_callee_id(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Queries the class that defines the method that the passed trace is at. This + * can be different from the class of rb_tracearg_self()'s return value because + * of inheritance(s). + * + * @param[in] trace_arg A trace instance. + * @retval RUBY_Qnil There is no method. + * @retval otherwise Its method's class. + */ +VALUE rb_tracearg_defined_class(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Creates a binding object of the point where the trace is at. + * + * @param[in] trace_arg A trace instance. + * @retval RUBY_Qnil The point has no binding. + * @retval otherwise Its binding. + * + * @internal + * + * @shyouhei has no idea on which situation shall this function return + * ::RUBY_Qnil. + */ +VALUE rb_tracearg_binding(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Queries the receiver of the point trace is at. + * + * @param[in] trace_arg A trace instance. + * @return Its receiver. + */ +VALUE rb_tracearg_self(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Queries the return value that the trace represents. + * + * @param[in] trace_arg A trace instance. + * @exception rb_eRuntimeError The tracing event is not return-related. + * @return The return value. + */ +VALUE rb_tracearg_return_value(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Queries the raised exception that the trace represents. + * + * @param[in] trace_arg A trace instance. + * @exception rb_eRuntimeError The tracing event is not exception-related. + * @return The raised exception. + */ +VALUE rb_tracearg_raised_exception(rb_trace_arg_t *trace_arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Queries the allocated/deallocated object that the trace represents. + * + * @param[in] trace_arg A trace instance. + * @exception rb_eRuntimeError The tracing event is not GC-related. + * @return The allocated/deallocated object. + */ +VALUE rb_tracearg_object(rb_trace_arg_t *trace_arg); + + +/** @} */ + +/** + * @name Postponed Job API + * + * @{ + */ + +/* + * Postponed Job API + * rb_postponed_job_register and rb_postponed_job_register_one are + * async-signal-safe and used via SIGPROF by the "stackprof" RubyGem + */ + +/** + * Type of postponed jobs. + * + * @param[in,out] arg What was passed to rb_postponed_job_register(). + */ +typedef void (*rb_postponed_job_func_t)(void *arg); + +/** + * Registers a postponed job. + * + * There are situations when running a ruby program is not possible. For + * instance when a program is in a signal handler; for another instance when + * the GC is busy. On such situations however, there might be needs to do + * something. We cannot but defer such operations until we are 100% sure it is + * safe to execute them. This mechanism is called postponed jobs. This + * function registers a new one. The registered job would eventually gets + * executed. + * + * @param[in] flags (Unused) reserved for future extensions. + * @param[in] func Job body. + * @param[in,out] data Passed as-is to `func`. + * @retval 0 Postponed job buffer is full. Failed. + * @retval otherwise Opaque return value. + * @post The passed job is postponed. + */ +int rb_postponed_job_register(unsigned int flags, rb_postponed_job_func_t func, void *data); + +/** + * Identical to rb_postponed_job_register_one(), except it additionally checks + * for duplicated registration. In case the passed job is already in the + * postponed job buffer this function does nothing. + * + * @param[in] flags (Unused) reserved for future extensions. + * @param[in] func Job body. + * @param[in,out] data Passed as-is to `func`. + * @retval 0 Postponed job buffer is full. Failed. + * @retval otherwise Opaque return value. + */ +int rb_postponed_job_register_one(unsigned int flags, rb_postponed_job_func_t func, void *data); + +/** @} */ + +/** + * @cond INTERNAL_MACRO + * + * Anything after this are intentionally left undocumented, to honour the + * comment below. + */ + +/* undocumented advanced tracing APIs */ + +typedef enum { + RUBY_EVENT_HOOK_FLAG_SAFE = 0x01, + RUBY_EVENT_HOOK_FLAG_DELETED = 0x02, + RUBY_EVENT_HOOK_FLAG_RAW_ARG = 0x04 +} rb_event_hook_flag_t; + +void rb_add_event_hook2(rb_event_hook_func_t func, rb_event_flag_t events, VALUE data, rb_event_hook_flag_t hook_flag); +void rb_thread_add_event_hook2(VALUE thval, rb_event_hook_func_t func, rb_event_flag_t events, VALUE data, rb_event_hook_flag_t hook_flag); + +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_DEBUG_H */ diff --git a/libs/libruby/ruby/defines.h b/libs/libruby/ruby/defines.h new file mode 100644 index 0000000..84acc70 --- /dev/null +++ b/libs/libruby/ruby/defines.h @@ -0,0 +1,116 @@ +#ifndef RUBY_DEFINES_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_DEFINES_H 1 +/** + * @file + * @author $Author$ + * @date Wed May 18 00:21:44 JST 1994 + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ + +#include "ruby/internal/config.h" + +/* AC_INCLUDES_DEFAULT */ +#include + +#ifdef HAVE_SYS_TYPES_H +#include +#endif + +#ifdef HAVE_SYS_STAT_H +#include +#endif + +#ifdef STDC_HEADERS +#include +#include +#else +#ifdef HAVE_STDLIB_H +#include +#endif +#endif + +#ifdef HAVE_STRING_H +#if !defined STDC_HEADERS && defined HAVE_MEMORY_H +#include +#endif +#include +#endif + +#ifdef HAVE_STRINGS_H +#include +#endif + +#ifdef HAVE_INTTYPES_H +#include +#endif + +#ifdef HAVE_STDINT_H +#include +#endif + +#ifdef HAVE_STDALIGN_H +#include +#endif + +#ifdef HAVE_UNISTD_H +#include +#endif + +#ifdef HAVE_SYS_SELECT_H +#include +#endif + +#ifdef RUBY_USE_SETJMPEX +#include +#endif + +#include "ruby/backward/2/assume.h" +#include "ruby/backward/2/attributes.h" +#include "ruby/backward/2/bool.h" +#include "ruby/backward/2/long_long.h" +#include "ruby/backward/2/stdalign.h" +#include "ruby/backward/2/stdarg.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/dosish.h" +#include "ruby/internal/xmalloc.h" +#include "ruby/missing.h" + +/** + * Asserts that the compilation unit includes Ruby's CAPI. This has been here + * since the very beginning (at least since version 0.49). + */ +#define RUBY + +#ifdef __GNUC__ +#/** This is expanded to nothing for non-GCC compilers. */ +#define RB_GNUC_EXTENSION __extension__ +#/** This is expanded to the passed token for non-GCC compilers. */ +#define RB_GNUC_EXTENSION_BLOCK(x) __extension__({ x; }) +#else +#define RB_GNUC_EXTENSION +#define RB_GNUC_EXTENSION_BLOCK(x) (x) +#endif + +/** @cond INTERNAL_MACRO */ + +/* :FIXME: Can someone tell us why is this macro defined here? @shyouhei + * thinks this is a truly internal macro but cannot move around because he + * doesn't understand the reason of this arrangement. */ +#ifndef RUBY_MBCHAR_MAXSIZE +#define RUBY_MBCHAR_MAXSIZE INT_MAX +#/* MB_CUR_MAX will not work well in C locale */ +#endif + +#if defined(__sparc) +RBIMPL_SYMBOL_EXPORT_BEGIN() +void rb_sparc_flush_register_windows(void); +RBIMPL_SYMBOL_EXPORT_END() +#define FLUSH_REGISTER_WINDOWS rb_sparc_flush_register_windows() +#else +#define FLUSH_REGISTER_WINDOWS ((void)0) +#endif +/** @endcond */ +#endif /* RUBY_DEFINES_H */ diff --git a/libs/libruby/ruby/digest.h b/libs/libruby/ruby/digest.h new file mode 100644 index 0000000..8a4c5b7 --- /dev/null +++ b/libs/libruby/ruby/digest.h @@ -0,0 +1,72 @@ +/************************************************ + + digest.h - header file for ruby digest modules + + $Author$ + created at: Fri May 25 08:54:56 JST 2001 + + + Copyright (C) 2001-2006 Akinori MUSHA + + $RoughId: digest.h,v 1.3 2001/07/13 15:38:27 knu Exp $ + $Id$ + +************************************************/ + +#include "ruby.h" + +#define RUBY_DIGEST_API_VERSION 3 + +typedef int (*rb_digest_hash_init_func_t)(void *); +typedef void (*rb_digest_hash_update_func_t)(void *, unsigned char *, size_t); +typedef int (*rb_digest_hash_finish_func_t)(void *, unsigned char *); + +typedef struct { + int api_version; + size_t digest_len; + size_t block_len; + size_t ctx_size; + rb_digest_hash_init_func_t init_func; + rb_digest_hash_update_func_t update_func; + rb_digest_hash_finish_func_t finish_func; +} rb_digest_metadata_t; + +#define DEFINE_UPDATE_FUNC_FOR_UINT(name) \ +void \ +rb_digest_##name##_update(void *ctx, unsigned char *ptr, size_t size) \ +{ \ + const unsigned int stride = 16384; \ + \ + for (; size > stride; size -= stride, ptr += stride) { \ + name##_Update(ctx, ptr, stride); \ + } \ + if (size > 0) name##_Update(ctx, ptr, size); \ +} + +#define DEFINE_FINISH_FUNC_FROM_FINAL(name) \ +int \ +rb_digest_##name##_finish(void *ctx, unsigned char *ptr) \ +{ \ + return name##_Final(ptr, ctx); \ +} + +static inline VALUE +rb_digest_namespace(void) +{ + rb_require("digest"); + return rb_path2class("Digest"); +} + +static inline ID +rb_id_metadata(void) +{ + return rb_intern_const("metadata"); +} + +static inline VALUE +rb_digest_make_metadata(const rb_digest_metadata_t *meta) +{ +#undef RUBY_UNTYPED_DATA_WARNING +#define RUBY_UNTYPED_DATA_WARNING 0 + return rb_obj_freeze(Data_Wrap_Struct(0, 0, 0, (void *)meta)); +} diff --git a/libs/libruby/ruby/encoding.h b/libs/libruby/ruby/encoding.h new file mode 100644 index 0000000..1256393 --- /dev/null +++ b/libs/libruby/ruby/encoding.h @@ -0,0 +1,31 @@ +#ifndef RUBY_ENCODING_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_ENCODING_H 1 +/** + * @file + * @author $Author: matz $ + * @date Thu May 24 11:49:41 JST 2007 + * @copyright Copyright (C) 2007 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @brief Encoding relates APIs. + * + * These APIs are mainly for implementing encodings themselves. Encodings are + * built on top of Ruby's core CAPIs. Though not prohibited, there can be + * relatively less rooms for things in this header file be useful when writing + * an extension library. + */ +#include "ruby/ruby.h" + +#include "ruby/internal/encoding/coderange.h" +#include "ruby/internal/encoding/ctype.h" +#include "ruby/internal/encoding/encoding.h" +#include "ruby/internal/encoding/pathname.h" +#include "ruby/internal/encoding/re.h" +#include "ruby/internal/encoding/sprintf.h" +#include "ruby/internal/encoding/string.h" +#include "ruby/internal/encoding/symbol.h" +#include "ruby/internal/encoding/transcode.h" + +#endif /* RUBY_ENCODING_H */ diff --git a/libs/libruby/ruby/fiber/scheduler.h b/libs/libruby/ruby/fiber/scheduler.h new file mode 100644 index 0000000..250b39b --- /dev/null +++ b/libs/libruby/ruby/fiber/scheduler.h @@ -0,0 +1,374 @@ +#ifndef RUBY_FIBER_SCHEDULER_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_FIBER_SCHEDULER_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @brief Scheduler APIs. + */ +#include "ruby/internal/config.h" + +#include + +#ifdef STDC_HEADERS +#include /* size_t */ +#endif + +#include "ruby/ruby.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/arithmetic.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +#define RUBY_FIBER_SCHEDULER_VERSION 2 + +struct timeval; + +/** + * Wrap a `ssize_t` and `int errno` into a single `VALUE`. This interface should + * be used to safely capture results from system calls like `read` and `write`. + * + * You should use `rb_fiber_scheduler_io_result_apply` to unpack the result of + * this value and update `int errno`. + * + * You should not directly try to interpret the result value as it is considered + * an opaque representation. However, the general representation is an integer + * in the range of `[-int errno, size_t size]`. Linux generally restricts the + * result of system calls like `read` and `write` to `<= 2^31` which means this + * will typically fit within a single FIXNUM. + * + * @param[in] result The result of the system call. + * @param[in] error The value of `errno`. + * @return A `VALUE` which contains the result and/or errno. + */ +static inline VALUE +rb_fiber_scheduler_io_result(ssize_t result, int error) +{ + if (result == -1) { + return RB_INT2NUM(-error); + } + else { + return RB_SIZE2NUM(result); + } +} + +/** + * Apply an io result to the local thread, returning the value of the original + * system call that created it and updating `int errno`. + * + * You should not directly try to interpret the result value as it is considered + * an opaque representation. + * + * @param[in] result The `VALUE` which contains an errno and/or result size. + * @post Updates `int errno` with the value if negative. + * @return The original result of the system call. + */ +static inline ssize_t +rb_fiber_scheduler_io_result_apply(VALUE result) +{ + if (RB_FIXNUM_P(result) && RB_NUM2INT(result) < 0) { + errno = -RB_NUM2INT(result); + return -1; + } + else { + return RB_NUM2SIZE(result); + } +} + +/** + * Queries the current scheduler of the current thread that is calling this + * function. + * + * @retval RUBY_Qnil No scheduler has been set so far to this thread (which + * is the default). + * @retval otherwise The scheduler that was last set for the current thread + * with rb_fiber_scheduler_set(). + */ +VALUE rb_fiber_scheduler_get(void); + +/** + * Destructively assigns the passed scheduler to that of the current thread + * that is calling this function. If the scheduler is set, non-blocking fibers + * (created by `Fiber.new` with `blocking: false`, or by `Fiber.schedule`) call + * that scheduler's hook methods on potentially blocking operations, and the + * current thread will call scheduler's `#close` method on finalisation + * (allowing the scheduler to properly manage all non-finished fibers). + * `scheduler` can be an object of any class corresponding to + * `Fiber::SchedulerInterface`. Its implementation is up to the user. + * + * @param[in] scheduler The scheduler to set. + * @exception rb_eArgError `scheduler` does not conform the interface. + * @post Current thread's scheduler is `scheduler`. + */ +VALUE rb_fiber_scheduler_set(VALUE scheduler); + +/** + * Identical to rb_fiber_scheduler_get(), except it also returns ::RUBY_Qnil in + * case of a blocking fiber. As blocking fibers do not participate schedulers' + * scheduling this function can be handy. + * + * @retval RUBY_Qnil No scheduler is in effect. + * @retval otherwise The scheduler that is in effect, if any. + */ +VALUE rb_fiber_scheduler_current(void); + +/** + * Identical to rb_fiber_scheduler_current(), except it queries for that of the + * passed thread instead of the implicit current one. + * + * @param[in] thread Target thread. + * @exception rb_eTypeError `thread` is not a thread. + * @retval RUBY_Qnil No scheduler is in effect in `thread`. + * @retval otherwise The scheduler that is in effect in `thread`. + */ +VALUE rb_fiber_scheduler_current_for_thread(VALUE thread); + +/** + * Converts the passed timeout to an expression that rb_fiber_scheduler_block() + * etc. expects. + * + * @param[in] timeout A duration (can be `NULL`). + * @retval RUBY_Qnil No timeout (blocks indefinitely). + * @retval otherwise A timeout object. + */ +VALUE rb_fiber_scheduler_make_timeout(struct timeval *timeout); + +/** + * Closes the passed scheduler object. This expects the scheduler to wait for + * all fibers. Thus the scheduler's main loop tends to start here. + * + * @param[in] scheduler Target scheduler. + * @return What `scheduler.close` returns. + */ +VALUE rb_fiber_scheduler_close(VALUE scheduler); + +/** + * Non-blocking `sleep`. Depending on scheduler implementation, this for + * instance switches to another fiber etc. + * + * @param[in] scheduler Target scheduler. + * @param[in] duration Passed as-is to `scheduler.kernel_sleep`. + * @return What `scheduler.kernel_sleep` returns. + */ +VALUE rb_fiber_scheduler_kernel_sleep(VALUE scheduler, VALUE duration); + +/** + * Identical to rb_fiber_scheduler_kernel_sleep(), except it can pass multiple + * arguments. + * + * @param[in] scheduler Target scheduler. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Passed as-is to `scheduler.kernel_sleep` + * @return What `scheduler.kernel_sleep` returns. + */ +VALUE rb_fiber_scheduler_kernel_sleepv(VALUE scheduler, int argc, VALUE * argv); + +/* Description TBW */ +#if 0 +VALUE rb_fiber_scheduler_timeout_after(VALUE scheduler, VALUE timeout, VALUE exception, VALUE message); +VALUE rb_fiber_scheduler_timeout_afterv(VALUE scheduler, int argc, VALUE * argv); +int rb_fiber_scheduler_supports_process_wait(VALUE scheduler); +#endif + +/** + * Non-blocking `waitpid`. Depending on scheduler implementation, this for + * instance switches to another fiber etc. + * + * @param[in] scheduler Target scheduler. + * @param[in] pid Process ID to wait. + * @param[in] flags Wait flags, e.g. `WUNTRACED`. + * @return What `scheduler.process_wait` returns. + */ +VALUE rb_fiber_scheduler_process_wait(VALUE scheduler, rb_pid_t pid, int flags); + +/** + * Non-blocking wait for the passed "blocker", which is for instance + * `Thread.join` or `Mutex.lock`. Depending on scheduler implementation, this + * for instance switches to another fiber etc. + * + * @param[in] scheduler Target scheduler. + * @param[in] blocker What blocks the current fiber. + * @param[in] timeout Numeric timeout. + * @return What `scheduler.block` returns. + */ +VALUE rb_fiber_scheduler_block(VALUE scheduler, VALUE blocker, VALUE timeout); + +/** + * Wakes up a fiber previously blocked using rb_fiber_scheduler_block(). + * + * @param[in] scheduler Target scheduler. + * @param[in] blocker What was awaited for. + * @param[in] fiber What to unblock. + * @return What `scheduler.unblock` returns. + */ +VALUE rb_fiber_scheduler_unblock(VALUE scheduler, VALUE blocker, VALUE fiber); + +/** + * Non-blocking version of rb_io_wait(). Depending on scheduler + * implementation, this for instance switches to another fiber etc. + * + * The "events" here is a Ruby level integer, which is an OR-ed value of + * `IO::READABLE`, `IO::WRITABLE`, and `IO::PRIORITY`. + * + * @param[in] scheduler Target scheduler. + * @param[in] io An io object to wait. + * @param[in] events An integer set of interests. + * @param[in] timeout Numeric timeout. + * @return What `scheduler.io_wait` returns. + */ +VALUE rb_fiber_scheduler_io_wait(VALUE scheduler, VALUE io, VALUE events, VALUE timeout); + +/** + * Non-blocking wait until the passed IO is ready for reading. This is a + * special case of rb_fiber_scheduler_io_wait(), where the interest is + * `IO::READABLE` and timeout is never. + * + * @param[in] scheduler Target scheduler. + * @param[in] io An io object to wait. + * @return What `scheduler.io_wait` returns. + */ +VALUE rb_fiber_scheduler_io_wait_readable(VALUE scheduler, VALUE io); + +/** + * Non-blocking wait until the passed IO is ready for writing. This is a + * special case of rb_fiber_scheduler_io_wait(), where the interest is + * `IO::WRITABLE` and timeout is never. + * + * @param[in] scheduler Target scheduler. + * @param[in] io An io object to wait. + * @return What `scheduler.io_wait` returns. + */ +VALUE rb_fiber_scheduler_io_wait_writable(VALUE scheduler, VALUE io); + +/** + * Non-blocking version of `IO.select`. + * + * It's possible that this will be emulated using a thread, so you should not + * rely on it for high performance. + * + * @param[in] scheduler Target scheduler. + * @param[in] readables An array of readable objects. + * @param[in] writables An array of writable objects. + * @param[in] exceptables An array of objects that might encounter exceptional conditions. + * @param[in] timeout Numeric timeout or nil. + * @return What `scheduler.io_select` returns, normally a 3-tuple of arrays of ready objects. + */ +VALUE rb_fiber_scheduler_io_select(VALUE scheduler, VALUE readables, VALUE writables, VALUE exceptables, VALUE timeout); + +/** + * Non-blocking version of `IO.select`, `argv` variant. + */ +VALUE rb_fiber_scheduler_io_selectv(VALUE scheduler, int argc, VALUE *argv); + +/** + * Non-blocking read from the passed IO. + * + * @param[in] scheduler Target scheduler. + * @param[out] io An io object to read from. + * @param[out] buffer Return buffer. + * @param[in] length Requested number of bytes to read. + * @param[in] offset The offset in the buffer to read to. + * @retval RUBY_Qundef `scheduler` doesn't have `#io_read`. + * @return otherwise What `scheduler.io_read` returns `[-errno, size]`. + */ +VALUE rb_fiber_scheduler_io_read(VALUE scheduler, VALUE io, VALUE buffer, size_t length, size_t offset); + +/** + * Non-blocking write to the passed IO. + * + * @param[in] scheduler Target scheduler. + * @param[out] io An io object to write to. + * @param[in] buffer What to write. + * @param[in] length Number of bytes to write. + * @param[in] offset The offset in the buffer to write from. + * @retval RUBY_Qundef `scheduler` doesn't have `#io_write`. + * @return otherwise What `scheduler.io_write` returns `[-errno, size]`. + */ +VALUE rb_fiber_scheduler_io_write(VALUE scheduler, VALUE io, VALUE buffer, size_t length, size_t offset); + +/** + * Non-blocking read from the passed IO at the specified offset. + * + * @param[in] scheduler Target scheduler. + * @param[out] io An io object to read from. + * @param[in] from The offset in the given IO to read the data from. + * @param[out] buffer The buffer to read the data to. + * @param[in] length Requested number of bytes to read. + * @param[in] offset The offset in the buffer to read to. + * @retval RUBY_Qundef `scheduler` doesn't have `#io_read`. + * @return otherwise What `scheduler.io_read` returns. + */ +VALUE rb_fiber_scheduler_io_pread(VALUE scheduler, VALUE io, rb_off_t from, VALUE buffer, size_t length, size_t offset); + +/** + * Non-blocking write to the passed IO at the specified offset. + * + * @param[in] scheduler Target scheduler. + * @param[out] io An io object to write to. + * @param[in] from The offset in the given IO to write the data to. + * @param[in] buffer The buffer to write the data from. + * @param[in] length Number of bytes to write. + * @param[in] offset The offset in the buffer to write from. + * @retval RUBY_Qundef `scheduler` doesn't have `#io_write`. + * @return otherwise What `scheduler.io_write` returns. + */ +VALUE rb_fiber_scheduler_io_pwrite(VALUE scheduler, VALUE io, rb_off_t from, VALUE buffer, size_t length, size_t offset); + +/** + * Non-blocking read from the passed IO using a native buffer. + * + * @param[in] scheduler Target scheduler. + * @param[out] io An io object to read from. + * @param[out] buffer Return buffer. + * @param[in] size Size of the return buffer. + * @param[in] length Requested number of bytes to read. + * @retval RUBY_Qundef `scheduler` doesn't have `#io_read`. + * @return otherwise What `scheduler.io_read` returns. + */ +VALUE rb_fiber_scheduler_io_read_memory(VALUE scheduler, VALUE io, void *buffer, size_t size, size_t length); + +/** + * Non-blocking write to the passed IO using a native buffer. + * + * @param[in] scheduler Target scheduler. + * @param[out] io An io object to write to. + * @param[in] buffer What to write. + * @param[in] size Size of the buffer. + * @param[in] length Number of bytes to write. + * @retval RUBY_Qundef `scheduler` doesn't have `#io_write`. + * @return otherwise What `scheduler.io_write` returns. + */ +VALUE rb_fiber_scheduler_io_write_memory(VALUE scheduler, VALUE io, const void *buffer, size_t size, size_t length); + +/** + * Non-blocking close the given IO. + * + * @param[in] scheduler Target scheduler. + * @param[in] io An io object to close. + * @retval RUBY_Qundef `scheduler` doesn't have `#io_close`. + * @return otherwise What `scheduler.io_close` returns. + */ +VALUE rb_fiber_scheduler_io_close(VALUE scheduler, VALUE io); + +/** + * Non-blocking DNS lookup. + * + * @param[in] scheduler Target scheduler. + * @param[in] hostname A host name to query. + * @retval RUBY_Qundef `scheduler` doesn't have `#address_resolve`. + * @return otherwise What `scheduler.address_resolve` returns. + */ +VALUE rb_fiber_scheduler_address_resolve(VALUE scheduler, VALUE hostname); + +/** + * Create and schedule a non-blocking fiber. + * + */ +VALUE rb_fiber_scheduler_fiber(VALUE scheduler, int argc, VALUE *argv, int kw_splat); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_FIBER_SCHEDULER_H */ diff --git a/libs/libruby/ruby/intern.h b/libs/libruby/ruby/intern.h new file mode 100644 index 0000000..2480e2e --- /dev/null +++ b/libs/libruby/ruby/intern.h @@ -0,0 +1,64 @@ +#ifndef RUBY_INTERN_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_INTERN_H 1 +/** + * @file + * @author $Author$ + * @date Thu Jun 10 14:22:17 JST 1993 + * @copyright Copyright (C) 1993-2007 Yukihiro Matsumoto + * @copyright Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + * @copyright Copyright (C) 2000 Information-technology Promotion Agency, Japan + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ +#include "ruby/internal/config.h" +#include "ruby/defines.h" + +#include + +#include "ruby/st.h" + +/* + * Functions and variables that are used by more than one source file of + * the kernel. + */ + +#include "ruby/internal/intern/array.h" +#include "ruby/internal/intern/bignum.h" +#include "ruby/internal/intern/class.h" +#include "ruby/internal/intern/compar.h" +#include "ruby/internal/intern/complex.h" +#include "ruby/internal/intern/cont.h" +#include "ruby/internal/intern/dir.h" +#include "ruby/internal/intern/enum.h" +#include "ruby/internal/intern/enumerator.h" +#include "ruby/internal/intern/error.h" +#include "ruby/internal/intern/eval.h" +#include "ruby/internal/intern/file.h" +#include "ruby/internal/intern/gc.h" +#include "ruby/internal/intern/hash.h" +#include "ruby/internal/intern/io.h" +#include "ruby/internal/intern/load.h" +#include "ruby/internal/intern/marshal.h" +#include "ruby/internal/intern/numeric.h" +#include "ruby/internal/intern/object.h" +#include "ruby/internal/intern/parse.h" +#include "ruby/internal/intern/proc.h" +#include "ruby/internal/intern/process.h" +#include "ruby/internal/intern/random.h" +#include "ruby/internal/intern/range.h" +#include "ruby/internal/intern/rational.h" +#include "ruby/internal/intern/re.h" +#include "ruby/internal/intern/ruby.h" +#include "ruby/internal/intern/select.h" +#include "ruby/internal/intern/signal.h" +#include "ruby/internal/intern/sprintf.h" +#include "ruby/internal/intern/string.h" +#include "ruby/internal/intern/struct.h" +#include "ruby/internal/intern/thread.h" +#include "ruby/internal/intern/time.h" +#include "ruby/internal/intern/variable.h" +#include "ruby/internal/intern/vm.h" + +#endif /* RUBY_INTERN_H */ diff --git a/libs/libruby/ruby/internal/abi.h b/libs/libruby/ruby/internal/abi.h new file mode 100644 index 0000000..44111a0 --- /dev/null +++ b/libs/libruby/ruby/internal/abi.h @@ -0,0 +1,58 @@ +#ifndef RUBY_ABI_H +#define RUBY_ABI_H + +#ifdef RUBY_ABI_VERSION /* should match the definition in config.h */ + +/* This number represents Ruby's ABI version. + * + * In development Ruby, it should be bumped every time an ABI incompatible + * change is introduced. This will force other developers to rebuild extension + * gems. + * + * The following cases are considered as ABI incompatible changes: + * - Changing any data structures. + * - Changing macros or inline functions causing a change in behavior. + * - Deprecating or removing function declarations. + * + * The following cases are NOT considered as ABI incompatible changes: + * - Any changes that does not involve the header files in the `include` + * directory. + * - Adding macros, inline functions, or function declarations. + * - Backwards compatible refactors. + * - Editing comments. + * + * In released versions of Ruby, this number is not defined since teeny + * versions of Ruby should guarantee ABI compatibility. + */ +#define RUBY_ABI_VERSION 3 + +/* Windows does not support weak symbols so ruby_abi_version will not exist + * in the shared library. */ +#if defined(HAVE_FUNC_WEAK) && !defined(_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) +# define RUBY_DLN_CHECK_ABI +#endif +#endif /* RUBY_ABI_VERSION */ + +#ifdef RUBY_DLN_CHECK_ABI + +# ifdef __cplusplus +extern "C" { +# endif + +RUBY_FUNC_EXPORTED unsigned long long __attribute__((weak)) +ruby_abi_version(void) +{ +# ifdef RUBY_ABI_VERSION + return RUBY_ABI_VERSION; +# else + return 0; +# endif +} + +# ifdef __cplusplus +} +# endif + +#endif + +#endif diff --git a/libs/libruby/ruby/internal/anyargs.h b/libs/libruby/ruby/internal/anyargs.h new file mode 100644 index 0000000..e3e1b61 --- /dev/null +++ b/libs/libruby/ruby/internal/anyargs.h @@ -0,0 +1,376 @@ +#ifndef RBIMPL_ANYARGS_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ANYARGS_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Function overloads to issue warnings around #ANYARGS. + * + * For instance ::rb_define_method takes a pointer to #ANYARGS -ed functions, + * which in fact varies 18 different prototypes. We still need to preserve + * #ANYARGS for storages but why not check the consistencies if possible. With + * those complex macro overlays defined in this header file, use of a function + * pointer gets checked against the corresponding arity argument. + * + * ### Q&A ### + * + * - Q: Where did the magic number "18" came from in the description above? + * + * - A: Count the case branch of `vm_method.c:call_cfunc_invoker_func()`. Note + * also that the 18 branches has lasted for at least 25 years. See also + * commit 200e0ee2fd3c1c006c528874a88f684447215524. + * + * - Q: What is this `__weakref__` thing? + * + * - A: That is a kind of function overloading mechanism that GCC provides. In + * this case for instance `rb_define_method_00` is an alias of + * ::rb_define_method, with a strong type. + * + * - Q: What is this `__transparent_union__` thing? + * + * A: That is another kind of function overloading mechanism that GCC + * provides. In this case the attributed function pointer is either + * `VALUE(*)(int,VALUE*,VALUE)` or `VALUE(*)(int,const VALUE*,VALUE)`. + * + * This is better than `void*` or #ANYARGS because we can reject all other + * possibilities than the two. + * + * - Q: What does this #rb_define_method macro mean? + * + * - A: It selects appropriate alias of the ::rb_define_method function, + * depending on the last (arity) argument. + * + * - Q: Why the special case for ::rb_f_notimplement ? + * + * - A: Function pointer to ::rb_f_notimplement is special cased in + * `vm_method.c:rb_add_method_cfunc()`. That should be handled by the + * `__builtin_choose_expr` chain inside of #rb_define_method macro + * expansion. In order to do so, comparison like + * `(func == rb_f_notimplement)` is inappropriate for + * `__builtin_choose_expr`'s expression (which must be a compile-time + * integer constant but the address of ::rb_f_notimplement is not fixed + * until the linker). Instead we are using + * `__builtin_types_compatible_p`, and in doing so we need to distinguish + * ::rb_f_notimplement from others, by type. + */ +#include "ruby/internal/attr/maybe_unused.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/weakref.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/config.h" +#include "ruby/internal/has/attribute.h" +#include "ruby/internal/intern/class.h" +#include "ruby/internal/intern/vm.h" +#include "ruby/internal/method.h" +#include "ruby/internal/value.h" +#include "ruby/backward/2/stdarg.h" + +#if defined(__cplusplus) +# include "ruby/backward/cxxanyargs.hpp" + +#elif defined(_WIN32) || defined(__CYGWIN__) +# /* Skip due to [Bug #16134] */ + +#elif ! RBIMPL_HAS_ATTRIBUTE(transparent_union) +# /* :TODO: improve here, please find a way to support. */ + +#elif ! defined(HAVE_VA_ARGS_MACRO) +# /* :TODO: improve here, please find a way to support. */ + +#else +# /** @cond INTERNAL_MACRO */ +# if ! defined(HAVE_BUILTIN___BUILTIN_TYPES_COMPATIBLE_P) +# define RBIMPL_CFUNC_IS_rb_f_notimplement(f) 0 +# else +# define RBIMPL_CFUNC_IS_rb_f_notimplement(f) \ + __builtin_types_compatible_p( \ + __typeof__(f), \ + __typeof__(rb_f_notimplement)) +# endif + +# if ! defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) +# define RBIMPL_ANYARGS_DISPATCH(expr, truthy, falsy) (falsy) +# else +# define RBIMPL_ANYARGS_DISPATCH(expr, truthy, falsy) \ + __builtin_choose_expr( \ + __builtin_choose_expr( \ + __builtin_constant_p(expr), \ + (expr), 0), \ + (truthy), (falsy)) +# endif + +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_m2(n) RBIMPL_ANYARGS_DISPATCH((n) == -2, rb_define_singleton_method_m2, rb_define_singleton_method_m3) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_m1(n) RBIMPL_ANYARGS_DISPATCH((n) == -1, rb_define_singleton_method_m1, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_m2(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_00(n) RBIMPL_ANYARGS_DISPATCH((n) == 0, rb_define_singleton_method_00, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_m1(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_01(n) RBIMPL_ANYARGS_DISPATCH((n) == 1, rb_define_singleton_method_01, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_00(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_02(n) RBIMPL_ANYARGS_DISPATCH((n) == 2, rb_define_singleton_method_02, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_01(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_03(n) RBIMPL_ANYARGS_DISPATCH((n) == 3, rb_define_singleton_method_03, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_02(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_04(n) RBIMPL_ANYARGS_DISPATCH((n) == 4, rb_define_singleton_method_04, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_03(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_05(n) RBIMPL_ANYARGS_DISPATCH((n) == 5, rb_define_singleton_method_05, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_04(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_06(n) RBIMPL_ANYARGS_DISPATCH((n) == 6, rb_define_singleton_method_06, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_05(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_07(n) RBIMPL_ANYARGS_DISPATCH((n) == 7, rb_define_singleton_method_07, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_06(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_08(n) RBIMPL_ANYARGS_DISPATCH((n) == 8, rb_define_singleton_method_08, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_07(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_09(n) RBIMPL_ANYARGS_DISPATCH((n) == 9, rb_define_singleton_method_09, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_08(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_10(n) RBIMPL_ANYARGS_DISPATCH((n) == 10, rb_define_singleton_method_10, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_09(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_11(n) RBIMPL_ANYARGS_DISPATCH((n) == 11, rb_define_singleton_method_11, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_10(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_12(n) RBIMPL_ANYARGS_DISPATCH((n) == 12, rb_define_singleton_method_12, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_11(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_13(n) RBIMPL_ANYARGS_DISPATCH((n) == 13, rb_define_singleton_method_13, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_12(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_14(n) RBIMPL_ANYARGS_DISPATCH((n) == 14, rb_define_singleton_method_14, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_13(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_15(n) RBIMPL_ANYARGS_DISPATCH((n) == 15, rb_define_singleton_method_15, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_14(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_m2(n) RBIMPL_ANYARGS_DISPATCH((n) == -2, rb_define_protected_method_m2, rb_define_protected_method_m3) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_m1(n) RBIMPL_ANYARGS_DISPATCH((n) == -1, rb_define_protected_method_m1, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_m2(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_00(n) RBIMPL_ANYARGS_DISPATCH((n) == 0, rb_define_protected_method_00, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_m1(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_01(n) RBIMPL_ANYARGS_DISPATCH((n) == 1, rb_define_protected_method_01, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_00(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_02(n) RBIMPL_ANYARGS_DISPATCH((n) == 2, rb_define_protected_method_02, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_01(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_03(n) RBIMPL_ANYARGS_DISPATCH((n) == 3, rb_define_protected_method_03, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_02(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_04(n) RBIMPL_ANYARGS_DISPATCH((n) == 4, rb_define_protected_method_04, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_03(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_05(n) RBIMPL_ANYARGS_DISPATCH((n) == 5, rb_define_protected_method_05, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_04(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_06(n) RBIMPL_ANYARGS_DISPATCH((n) == 6, rb_define_protected_method_06, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_05(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_07(n) RBIMPL_ANYARGS_DISPATCH((n) == 7, rb_define_protected_method_07, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_06(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_08(n) RBIMPL_ANYARGS_DISPATCH((n) == 8, rb_define_protected_method_08, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_07(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_09(n) RBIMPL_ANYARGS_DISPATCH((n) == 9, rb_define_protected_method_09, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_08(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_10(n) RBIMPL_ANYARGS_DISPATCH((n) == 10, rb_define_protected_method_10, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_09(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_11(n) RBIMPL_ANYARGS_DISPATCH((n) == 11, rb_define_protected_method_11, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_10(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_12(n) RBIMPL_ANYARGS_DISPATCH((n) == 12, rb_define_protected_method_12, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_11(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_13(n) RBIMPL_ANYARGS_DISPATCH((n) == 13, rb_define_protected_method_13, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_12(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_14(n) RBIMPL_ANYARGS_DISPATCH((n) == 14, rb_define_protected_method_14, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_13(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_15(n) RBIMPL_ANYARGS_DISPATCH((n) == 15, rb_define_protected_method_15, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_14(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_m2(n) RBIMPL_ANYARGS_DISPATCH((n) == -2, rb_define_private_method_m2, rb_define_private_method_m3) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_m1(n) RBIMPL_ANYARGS_DISPATCH((n) == -1, rb_define_private_method_m1, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_m2(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_00(n) RBIMPL_ANYARGS_DISPATCH((n) == 0, rb_define_private_method_00, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_m1(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_01(n) RBIMPL_ANYARGS_DISPATCH((n) == 1, rb_define_private_method_01, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_00(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_02(n) RBIMPL_ANYARGS_DISPATCH((n) == 2, rb_define_private_method_02, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_01(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_03(n) RBIMPL_ANYARGS_DISPATCH((n) == 3, rb_define_private_method_03, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_02(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_04(n) RBIMPL_ANYARGS_DISPATCH((n) == 4, rb_define_private_method_04, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_03(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_05(n) RBIMPL_ANYARGS_DISPATCH((n) == 5, rb_define_private_method_05, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_04(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_06(n) RBIMPL_ANYARGS_DISPATCH((n) == 6, rb_define_private_method_06, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_05(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_07(n) RBIMPL_ANYARGS_DISPATCH((n) == 7, rb_define_private_method_07, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_06(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_08(n) RBIMPL_ANYARGS_DISPATCH((n) == 8, rb_define_private_method_08, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_07(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_09(n) RBIMPL_ANYARGS_DISPATCH((n) == 9, rb_define_private_method_09, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_08(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_10(n) RBIMPL_ANYARGS_DISPATCH((n) == 10, rb_define_private_method_10, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_09(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_11(n) RBIMPL_ANYARGS_DISPATCH((n) == 11, rb_define_private_method_11, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_10(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_12(n) RBIMPL_ANYARGS_DISPATCH((n) == 12, rb_define_private_method_12, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_11(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_13(n) RBIMPL_ANYARGS_DISPATCH((n) == 13, rb_define_private_method_13, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_12(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_14(n) RBIMPL_ANYARGS_DISPATCH((n) == 14, rb_define_private_method_14, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_13(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_15(n) RBIMPL_ANYARGS_DISPATCH((n) == 15, rb_define_private_method_15, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_14(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_m2(n) RBIMPL_ANYARGS_DISPATCH((n) == -2, rb_define_module_function_m2, rb_define_module_function_m3) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_m1(n) RBIMPL_ANYARGS_DISPATCH((n) == -1, rb_define_module_function_m1, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_m2(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_00(n) RBIMPL_ANYARGS_DISPATCH((n) == 0, rb_define_module_function_00, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_m1(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_01(n) RBIMPL_ANYARGS_DISPATCH((n) == 1, rb_define_module_function_01, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_00(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_02(n) RBIMPL_ANYARGS_DISPATCH((n) == 2, rb_define_module_function_02, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_01(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_03(n) RBIMPL_ANYARGS_DISPATCH((n) == 3, rb_define_module_function_03, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_02(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_04(n) RBIMPL_ANYARGS_DISPATCH((n) == 4, rb_define_module_function_04, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_03(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_05(n) RBIMPL_ANYARGS_DISPATCH((n) == 5, rb_define_module_function_05, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_04(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_06(n) RBIMPL_ANYARGS_DISPATCH((n) == 6, rb_define_module_function_06, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_05(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_07(n) RBIMPL_ANYARGS_DISPATCH((n) == 7, rb_define_module_function_07, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_06(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_08(n) RBIMPL_ANYARGS_DISPATCH((n) == 8, rb_define_module_function_08, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_07(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_09(n) RBIMPL_ANYARGS_DISPATCH((n) == 9, rb_define_module_function_09, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_08(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_10(n) RBIMPL_ANYARGS_DISPATCH((n) == 10, rb_define_module_function_10, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_09(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_11(n) RBIMPL_ANYARGS_DISPATCH((n) == 11, rb_define_module_function_11, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_10(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_12(n) RBIMPL_ANYARGS_DISPATCH((n) == 12, rb_define_module_function_12, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_11(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_13(n) RBIMPL_ANYARGS_DISPATCH((n) == 13, rb_define_module_function_13, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_12(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_14(n) RBIMPL_ANYARGS_DISPATCH((n) == 14, rb_define_module_function_14, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_13(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_15(n) RBIMPL_ANYARGS_DISPATCH((n) == 15, rb_define_module_function_15, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_14(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_m2(n) RBIMPL_ANYARGS_DISPATCH((n) == -2, rb_define_global_function_m2, rb_define_global_function_m3) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_m1(n) RBIMPL_ANYARGS_DISPATCH((n) == -1, rb_define_global_function_m1, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_m2(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_00(n) RBIMPL_ANYARGS_DISPATCH((n) == 0, rb_define_global_function_00, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_m1(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_01(n) RBIMPL_ANYARGS_DISPATCH((n) == 1, rb_define_global_function_01, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_00(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_02(n) RBIMPL_ANYARGS_DISPATCH((n) == 2, rb_define_global_function_02, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_01(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_03(n) RBIMPL_ANYARGS_DISPATCH((n) == 3, rb_define_global_function_03, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_02(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_04(n) RBIMPL_ANYARGS_DISPATCH((n) == 4, rb_define_global_function_04, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_03(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_05(n) RBIMPL_ANYARGS_DISPATCH((n) == 5, rb_define_global_function_05, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_04(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_06(n) RBIMPL_ANYARGS_DISPATCH((n) == 6, rb_define_global_function_06, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_05(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_07(n) RBIMPL_ANYARGS_DISPATCH((n) == 7, rb_define_global_function_07, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_06(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_08(n) RBIMPL_ANYARGS_DISPATCH((n) == 8, rb_define_global_function_08, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_07(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_09(n) RBIMPL_ANYARGS_DISPATCH((n) == 9, rb_define_global_function_09, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_08(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_10(n) RBIMPL_ANYARGS_DISPATCH((n) == 10, rb_define_global_function_10, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_09(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_11(n) RBIMPL_ANYARGS_DISPATCH((n) == 11, rb_define_global_function_11, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_10(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_12(n) RBIMPL_ANYARGS_DISPATCH((n) == 12, rb_define_global_function_12, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_11(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_13(n) RBIMPL_ANYARGS_DISPATCH((n) == 13, rb_define_global_function_13, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_12(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_14(n) RBIMPL_ANYARGS_DISPATCH((n) == 14, rb_define_global_function_14, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_13(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_15(n) RBIMPL_ANYARGS_DISPATCH((n) == 15, rb_define_global_function_15, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_14(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_m2(n) RBIMPL_ANYARGS_DISPATCH((n) == -2, rb_define_method_id_m2, rb_define_method_id_m3) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_m1(n) RBIMPL_ANYARGS_DISPATCH((n) == -1, rb_define_method_id_m1, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_m2(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_00(n) RBIMPL_ANYARGS_DISPATCH((n) == 0, rb_define_method_id_00, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_m1(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_01(n) RBIMPL_ANYARGS_DISPATCH((n) == 1, rb_define_method_id_01, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_00(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_02(n) RBIMPL_ANYARGS_DISPATCH((n) == 2, rb_define_method_id_02, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_01(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_03(n) RBIMPL_ANYARGS_DISPATCH((n) == 3, rb_define_method_id_03, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_02(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_04(n) RBIMPL_ANYARGS_DISPATCH((n) == 4, rb_define_method_id_04, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_03(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_05(n) RBIMPL_ANYARGS_DISPATCH((n) == 5, rb_define_method_id_05, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_04(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_06(n) RBIMPL_ANYARGS_DISPATCH((n) == 6, rb_define_method_id_06, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_05(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_07(n) RBIMPL_ANYARGS_DISPATCH((n) == 7, rb_define_method_id_07, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_06(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_08(n) RBIMPL_ANYARGS_DISPATCH((n) == 8, rb_define_method_id_08, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_07(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_09(n) RBIMPL_ANYARGS_DISPATCH((n) == 9, rb_define_method_id_09, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_08(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_10(n) RBIMPL_ANYARGS_DISPATCH((n) == 10, rb_define_method_id_10, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_09(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_11(n) RBIMPL_ANYARGS_DISPATCH((n) == 11, rb_define_method_id_11, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_10(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_12(n) RBIMPL_ANYARGS_DISPATCH((n) == 12, rb_define_method_id_12, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_11(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_13(n) RBIMPL_ANYARGS_DISPATCH((n) == 13, rb_define_method_id_13, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_12(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_14(n) RBIMPL_ANYARGS_DISPATCH((n) == 14, rb_define_method_id_14, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_13(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_15(n) RBIMPL_ANYARGS_DISPATCH((n) == 15, rb_define_method_id_15, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_14(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_m2(n) RBIMPL_ANYARGS_DISPATCH((n) == -2, rb_define_method_m2, rb_define_method_m3) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_m1(n) RBIMPL_ANYARGS_DISPATCH((n) == -1, rb_define_method_m1, RBIMPL_ANYARGS_DISPATCH_rb_define_method_m2(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_00(n) RBIMPL_ANYARGS_DISPATCH((n) == 0, rb_define_method_00, RBIMPL_ANYARGS_DISPATCH_rb_define_method_m1(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_01(n) RBIMPL_ANYARGS_DISPATCH((n) == 1, rb_define_method_01, RBIMPL_ANYARGS_DISPATCH_rb_define_method_00(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_02(n) RBIMPL_ANYARGS_DISPATCH((n) == 2, rb_define_method_02, RBIMPL_ANYARGS_DISPATCH_rb_define_method_01(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_03(n) RBIMPL_ANYARGS_DISPATCH((n) == 3, rb_define_method_03, RBIMPL_ANYARGS_DISPATCH_rb_define_method_02(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_04(n) RBIMPL_ANYARGS_DISPATCH((n) == 4, rb_define_method_04, RBIMPL_ANYARGS_DISPATCH_rb_define_method_03(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_05(n) RBIMPL_ANYARGS_DISPATCH((n) == 5, rb_define_method_05, RBIMPL_ANYARGS_DISPATCH_rb_define_method_04(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_06(n) RBIMPL_ANYARGS_DISPATCH((n) == 6, rb_define_method_06, RBIMPL_ANYARGS_DISPATCH_rb_define_method_05(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_07(n) RBIMPL_ANYARGS_DISPATCH((n) == 7, rb_define_method_07, RBIMPL_ANYARGS_DISPATCH_rb_define_method_06(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_08(n) RBIMPL_ANYARGS_DISPATCH((n) == 8, rb_define_method_08, RBIMPL_ANYARGS_DISPATCH_rb_define_method_07(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_09(n) RBIMPL_ANYARGS_DISPATCH((n) == 9, rb_define_method_09, RBIMPL_ANYARGS_DISPATCH_rb_define_method_08(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_10(n) RBIMPL_ANYARGS_DISPATCH((n) == 10, rb_define_method_10, RBIMPL_ANYARGS_DISPATCH_rb_define_method_09(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_11(n) RBIMPL_ANYARGS_DISPATCH((n) == 11, rb_define_method_11, RBIMPL_ANYARGS_DISPATCH_rb_define_method_10(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_12(n) RBIMPL_ANYARGS_DISPATCH((n) == 12, rb_define_method_12, RBIMPL_ANYARGS_DISPATCH_rb_define_method_11(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_13(n) RBIMPL_ANYARGS_DISPATCH((n) == 13, rb_define_method_13, RBIMPL_ANYARGS_DISPATCH_rb_define_method_12(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_14(n) RBIMPL_ANYARGS_DISPATCH((n) == 14, rb_define_method_14, RBIMPL_ANYARGS_DISPATCH_rb_define_method_13(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_15(n) RBIMPL_ANYARGS_DISPATCH((n) == 15, rb_define_method_15, RBIMPL_ANYARGS_DISPATCH_rb_define_method_14(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method(n, f) RBIMPL_ANYARGS_DISPATCH(RBIMPL_CFUNC_IS_rb_f_notimplement(f), rb_define_singleton_method_notimpl, RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method_15(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method(n, f) RBIMPL_ANYARGS_DISPATCH(RBIMPL_CFUNC_IS_rb_f_notimplement(f), rb_define_protected_method_notimpl, RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method_15(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_private_method(n, f) RBIMPL_ANYARGS_DISPATCH(RBIMPL_CFUNC_IS_rb_f_notimplement(f), rb_define_private_method_notimpl, RBIMPL_ANYARGS_DISPATCH_rb_define_private_method_15(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_module_function(n, f) RBIMPL_ANYARGS_DISPATCH(RBIMPL_CFUNC_IS_rb_f_notimplement(f), rb_define_module_function_notimpl, RBIMPL_ANYARGS_DISPATCH_rb_define_module_function_15(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_global_function(n, f) RBIMPL_ANYARGS_DISPATCH(RBIMPL_CFUNC_IS_rb_f_notimplement(f), rb_define_global_function_notimpl, RBIMPL_ANYARGS_DISPATCH_rb_define_global_function_15(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method_id(n, f) RBIMPL_ANYARGS_DISPATCH(RBIMPL_CFUNC_IS_rb_f_notimplement(f), rb_define_method_id_notimpl, RBIMPL_ANYARGS_DISPATCH_rb_define_method_id_15(n)) +# define RBIMPL_ANYARGS_DISPATCH_rb_define_method(n, f) RBIMPL_ANYARGS_DISPATCH(RBIMPL_CFUNC_IS_rb_f_notimplement(f), rb_define_method_notimpl, RBIMPL_ANYARGS_DISPATCH_rb_define_method_15(n)) +# define RBIMPL_ANYARGS_ATTRSET(sym) RBIMPL_ATTR_MAYBE_UNUSED() RBIMPL_ATTR_NONNULL(()) RBIMPL_ATTR_WEAKREF(sym) +# define RBIMPL_ANYARGS_DECL(sym, ...) \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _notimpl(__VA_ARGS__, VALUE(*)(int, const VALUE *, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _m3(__VA_ARGS__, VALUE(*)(ANYARGS), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _m2(__VA_ARGS__, VALUE(*)(VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _m1(__VA_ARGS__, VALUE(*)(int, union { VALUE *x; const VALUE *y; } __attribute__((__transparent_union__)), VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _00(__VA_ARGS__, VALUE(*)(VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _01(__VA_ARGS__, VALUE(*)(VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _02(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _03(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _04(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _05(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _06(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _07(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _08(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _09(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _10(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _11(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _12(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _13(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _14(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); \ +RBIMPL_ANYARGS_ATTRSET(sym) static void sym ## _15(__VA_ARGS__, VALUE(*)(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE), int); +RBIMPL_ANYARGS_DECL(rb_define_singleton_method, VALUE, const char *) +RBIMPL_ANYARGS_DECL(rb_define_protected_method, VALUE, const char *) +RBIMPL_ANYARGS_DECL(rb_define_private_method, VALUE, const char *) +RBIMPL_ANYARGS_DECL(rb_define_module_function, VALUE, const char *) +RBIMPL_ANYARGS_DECL(rb_define_global_function, const char *) +RBIMPL_ANYARGS_DECL(rb_define_method_id, VALUE, ID) +RBIMPL_ANYARGS_DECL(rb_define_method, VALUE, const char *) +/** @endcond */ + +/** + * @brief Defines klass\#mid. + * @see ::rb_define_method + * @param klass Where the method lives. + * @param mid Name of the defining method. + * @param func Implementation of klass\#mid. + * @param arity Arity of klass\#mid. + */ +#define rb_define_method(klass, mid, func, arity) RBIMPL_ANYARGS_DISPATCH_rb_define_method((arity), (func))((klass), (mid), (func), (arity)) + +/** + * @brief Defines klass\#mid. + * @see ::rb_define_method_id + * @param klass Where the method lives. + * @param mid Name of the defining method. + * @param func Implementation of klass\#mid. + * @param arity Arity of klass\#mid. + */ +#define rb_define_method_id(klass, mid, func, arity) RBIMPL_ANYARGS_DISPATCH_rb_define_method_id((arity), (func))((klass), (mid), (func), (arity)) + +/** + * @brief Defines obj.mid. + * @see ::rb_define_singleton_method + * @param obj Where the method lives. + * @param mid Name of the defining method. + * @param func Implementation of obj.mid. + * @param arity Arity of obj.mid. + */ +#define rb_define_singleton_method(obj, mid, func, arity) RBIMPL_ANYARGS_DISPATCH_rb_define_singleton_method((arity), (func))((obj), (mid), (func), (arity)) + +/** + * @brief Defines klass\#mid and make it protected. + * @see ::rb_define_protected_method + * @param klass Where the method lives. + * @param mid Name of the defining method. + * @param func Implementation of klass\#mid. + * @param arity Arity of klass\#mid. + */ +#define rb_define_protected_method(klass, mid, func, arity) RBIMPL_ANYARGS_DISPATCH_rb_define_protected_method((arity), (func))((klass), (mid), (func), (arity)) + +/** + * @brief Defines klass\#mid and make it private. + * @see ::rb_define_private_method + * @param klass Where the method lives. + * @param mid Name of the defining method. + * @param func Implementation of klass\#mid. + * @param arity Arity of klass\#mid. + */ +#define rb_define_private_method(klass, mid, func, arity) RBIMPL_ANYARGS_DISPATCH_rb_define_private_method((arity), (func))((klass), (mid), (func), (arity)) + +/** + * @brief Defines mod\#mid and make it a module function. + * @see ::rb_define_module_function + * @param mod Where the method lives. + * @param mid Name of the defining method. + * @param func Implementation of mod\#mid. + * @param arity Arity of mod\#mid. + */ +#define rb_define_module_function(mod, mid, func, arity) RBIMPL_ANYARGS_DISPATCH_rb_define_module_function((arity), (func))((mod), (mid), (func), (arity)) + +/** + * @brief Defines ::rb_mKerbel \#mid. + * @see ::rb_define_global_function + * @param mid Name of the defining method. + * @param func Implementation of ::rb_mKernel \#mid. + * @param arity Arity of ::rb_mKernel \#mid. + */ +#define rb_define_global_function(mid, func, arity) RBIMPL_ANYARGS_DISPATCH_rb_define_global_function((arity), (func))((mid), (func), (arity)) + +#endif /* __cplusplus */ + +/** + * This macro is to properly cast a function parameter of *_define_method + * family. It has been around since 1.x era so you can maximise backwards + * compatibility by using it. + * + * ```CXX + * rb_define_method(klass, "method", RUBY_METHOD_FUNC(func), arity); + * ``` + * + * @param func A pointer to a function that implements a method. + */ +#if ! defined(RUBY_DEVEL) +# define RUBY_METHOD_FUNC(func) RBIMPL_CAST((VALUE (*)(ANYARGS))(func)) + +#elif ! RUBY_DEVEL +# define RUBY_METHOD_FUNC(func) RBIMPL_CAST((VALUE (*)(ANYARGS))(func)) + +#elif ! defined(rb_define_method) +# define RUBY_METHOD_FUNC(func) RBIMPL_CAST((VALUE (*)(ANYARGS))(func)) + +#else +# define RUBY_METHOD_FUNC(func) (func) + +#endif + +#endif /* RBIMPL_ANYARGS_H */ diff --git a/libs/libruby/ruby/internal/arithmetic.h b/libs/libruby/ruby/internal/arithmetic.h new file mode 100644 index 0000000..7ebb4a8 --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic.h @@ -0,0 +1,39 @@ +#ifndef RBIMPL_ARITHMETIC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Conversion between C's arithmetic types and Ruby's numeric + * types. + */ +#include "ruby/internal/arithmetic/char.h" +#include "ruby/internal/arithmetic/double.h" +#include "ruby/internal/arithmetic/fixnum.h" +#include "ruby/internal/arithmetic/gid_t.h" +#include "ruby/internal/arithmetic/int.h" +#include "ruby/internal/arithmetic/intptr_t.h" +#include "ruby/internal/arithmetic/long.h" +#include "ruby/internal/arithmetic/long_long.h" +#include "ruby/internal/arithmetic/mode_t.h" +#include "ruby/internal/arithmetic/off_t.h" +#include "ruby/internal/arithmetic/pid_t.h" +#include "ruby/internal/arithmetic/short.h" +#include "ruby/internal/arithmetic/size_t.h" +#include "ruby/internal/arithmetic/st_data_t.h" +#include "ruby/internal/arithmetic/uid_t.h" +#endif /* RBIMPL_ARITHMETIC_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/char.h b/libs/libruby/ruby/internal/arithmetic/char.h new file mode 100644 index 0000000..920fdc0 --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/char.h @@ -0,0 +1,81 @@ +#ifndef RBIMPL_ARITHMETIC_CHAR_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_CHAR_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `char` and Ruby's. + */ +#include "ruby/internal/arithmetic/int.h" /* NUM2INT is here, but */ +#include "ruby/internal/arithmetic/long.h" /* INT2FIX is here.*/ +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/constexpr.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/core/rstring.h" +#include "ruby/internal/value_type.h" + +#define RB_NUM2CHR rb_num2char_inline /**< @alias{rb_num2char_inline} */ +#define NUM2CHR RB_NUM2CHR /**< @old{RB_NUM2CHR} */ +#define CHR2FIX RB_CHR2FIX /**< @old{RB_CHR2FIX} */ + +/** @cond INTERNAL_MACRO */ +#define RB_CHR2FIX RB_CHR2FIX +/** @endcond */ + +RBIMPL_ATTR_CONST_UNLESS_DEBUG() +RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Converts a C's `unsigned char` into an instance of ::rb_cInteger. + * + * @param[in] c Arbitrary `unsigned char` value. + * @return An instance of ::rb_cInteger. + * + * @internal + * + * Nobody explicitly states this but in Ruby, a char means an unsigned integer + * value of range 0..255. This is a general principle. AFAIK there is no + * single line of code where char is signed. + */ +static inline VALUE +RB_CHR2FIX(unsigned char c) +{ + return RB_INT2FIX(c); +} + +/** + * Converts an instance of ::rb_cNumeric into C's `char`. At the same time it + * accepts a String of more than one character, and returns its first byte. In + * the early days there was a Ruby level "character" literal `?c`, which + * roughly worked this way. + * + * @param[in] x Either a string or a numeric. + * @exception rb_eTypeError `x` is not a numeric. + * @exception rb_eRangeError `x` is out of range of `unsigned int`. + * @return The passed value converted into C's `char`. + */ +static inline char +rb_num2char_inline(VALUE x) +{ + if (RB_TYPE_P(x, RUBY_T_STRING) && (RSTRING_LEN(x)>=1)) + return RSTRING_PTR(x)[0]; + else + return RBIMPL_CAST((char)RB_NUM2INT(x)); +} + +#endif /* RBIMPL_ARITHMETIC_CHAR_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/double.h b/libs/libruby/ruby/internal/arithmetic/double.h new file mode 100644 index 0000000..229de47 --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/double.h @@ -0,0 +1,72 @@ +#ifndef RBIMPL_ARITHMETIC_DOUBLE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_DOUBLE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `double` and Ruby's. + */ +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +#define NUM2DBL rb_num2dbl /**< @old{rb_num2dbl} */ +#define RFLOAT_VALUE rb_float_value /**< @old{rb_float_value} */ +#define DBL2NUM rb_float_new /**< @old{rb_float_new} */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * Converts an instance of ::rb_cNumeric into C's `double`. + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @return The passed value converted into C's `double`. + */ +double rb_num2dbl(VALUE num); + +RBIMPL_ATTR_PURE() +/** + * Extracts its double value from an instance of ::rb_cFloat. + * + * @param[in] num An instance of ::rb_cFloat. + * @pre Must not pass anything other than a Fixnum. + * @return The passed value converted into C's `double`. + */ +double rb_float_value(VALUE num); + +/** + * Converts a C's `double` into an instance of ::rb_cFloat. + * + * @param[in] d Arbitrary `double` value. + * @return An instance of ::rb_cFloat. + */ +VALUE rb_float_new(double d); + +/** + * Identical to rb_float_new(), except it does not generate Flonums. + * + * @param[in] d Arbitrary `double` value. + * @return An instance of ::rb_cFloat. + * + * @internal + * + * @shyouhei has no idea why it is here. + */ +VALUE rb_float_new_in_heap(double d); +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_ARITHMETIC_DOUBLE_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/fixnum.h b/libs/libruby/ruby/internal/arithmetic/fixnum.h new file mode 100644 index 0000000..c8927ac --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/fixnum.h @@ -0,0 +1,60 @@ +#ifndef RBIMPL_ARITHMETIC_FIXNUM_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_FIXNUM_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Handling of integers formerly known as Fixnums. + */ +#include "ruby/backward/2/limits.h" + +#define FIXABLE RB_FIXABLE /**< @old{RB_FIXABLE} */ +#define FIXNUM_MAX RUBY_FIXNUM_MAX /**< @old{RUBY_FIXNUM_MAX} */ +#define FIXNUM_MIN RUBY_FIXNUM_MIN /**< @old{RUBY_FIXNUM_MIN} */ +#define NEGFIXABLE RB_NEGFIXABLE /**< @old{RB_NEGFIXABLE} */ +#define POSFIXABLE RB_POSFIXABLE /**< @old{RB_POSFIXABLE} */ + +/** + * Checks if the passed value is in range of fixnum, assuming it is a positive + * number. Can sometimes be useful for C's unsigned integer types. + * + * @internal + * + * FIXABLE can be applied to anything, from double to intmax_t. The problem is + * double. On a 64bit system RUBY_FIXNUM_MAX is 4,611,686,018,427,387,903, + * which is not representable by a double. The nearest value that a double can + * represent is 4,611,686,018,427,387,904, which is not fixable. The + * seemingly-strange "< FIXNUM_MAX + 1" expression below is due to this. + */ +#define RB_POSFIXABLE(_) ((_) < RUBY_FIXNUM_MAX + 1) + +/** + * Checks if the passed value is in range of fixnum, assuming it is a negative + * number. This is an implementation of #RB_FIXABLE. Rarely used stand alone. + */ +#define RB_NEGFIXABLE(_) ((_) >= RUBY_FIXNUM_MIN) + +/** Checks if the passed value is in range of fixnum */ +#define RB_FIXABLE(_) (RB_POSFIXABLE(_) && RB_NEGFIXABLE(_)) + +/** Maximum possible value that a fixnum can represent. */ +#define RUBY_FIXNUM_MAX (LONG_MAX / 2) + +/** Minimum possible value that a fixnum can represent. */ +#define RUBY_FIXNUM_MIN (LONG_MIN / 2) + +#endif /* RBIMPL_ARITHMETIC_FIXNUM_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/gid_t.h b/libs/libruby/ruby/internal/arithmetic/gid_t.h new file mode 100644 index 0000000..361220b --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/gid_t.h @@ -0,0 +1,41 @@ +#ifndef RBIMPL_ARITHMETIC_GID_T_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_GID_T_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `gid_t` and Ruby's. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/arithmetic/long.h" + +/** Converts a C's `gid_t` into an instance of ::rb_cInteger. */ +#ifndef GIDT2NUM +# define GIDT2NUM RB_LONG2NUM +#endif + +/** Converts an instance of ::rb_cNumeric into C's `gid_t`. */ +#ifndef NUM2GIDT +# define NUM2GIDT RB_NUM2LONG +#endif + +/** A rb_sprintf() format prefix to be used for a `gid_t` parameter. */ +#ifndef PRI_GIDT_PREFIX +# define PRI_GIDT_PREFIX PRI_LONG_PREFIX +#endif + +#endif /* RBIMPL_ARITHMETIC_GID_T_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/int.h b/libs/libruby/ruby/internal/arithmetic/int.h new file mode 100644 index 0000000..6bd8ec2 --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/int.h @@ -0,0 +1,264 @@ +#ifndef RBIMPL_ARITHMETIC_INT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_INT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `int` and Ruby's. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/arithmetic/fixnum.h" +#include "ruby/internal/arithmetic/intptr_t.h" +#include "ruby/internal/arithmetic/long.h" +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/constexpr.h" +#include "ruby/internal/compiler_is.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/special_consts.h" +#include "ruby/internal/value.h" +#include "ruby/internal/warning_push.h" +#include "ruby/assert.h" + +#define RB_INT2NUM rb_int2num_inline /**< @alias{rb_int2num_inline} */ +#define RB_NUM2INT rb_num2int_inline /**< @alias{rb_num2int_inline} */ +#define RB_UINT2NUM rb_uint2num_inline /**< @alias{rb_uint2num_inline} */ + +#define FIX2INT RB_FIX2INT /**< @old{RB_FIX2INT} */ +#define FIX2UINT RB_FIX2UINT /**< @old{RB_FIX2UINT} */ +#define INT2NUM RB_INT2NUM /**< @old{RB_INT2NUM} */ +#define NUM2INT RB_NUM2INT /**< @old{RB_NUM2INT} */ +#define NUM2UINT RB_NUM2UINT /**< @old{RB_NUM2UINT} */ +#define UINT2NUM RB_UINT2NUM /**< @old{RB_UINT2NUM} */ + +/** @cond INTERNAL_MACRO */ +#define RB_FIX2INT RB_FIX2INT +#define RB_NUM2UINT RB_NUM2UINT +#define RB_FIX2UINT RB_FIX2UINT +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Converts an instance of ::rb_cNumeric into C's `long`. + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `int`. + * @return The passed value converted into C's `long`. + * + * @internal + * + * Yes, the API is really strange. It returns `long`, but raises when the + * value is out of `int`. This seems to be due to the fact that Matz favoured + * K&R before, and his machine at that moment was an ILP32 architecture. + */ +long rb_num2int(VALUE num); + +/** + * Identical to rb_num2int(). + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `int`. + * @return The passed value converted into C's `long`. + * + * @internal + * + * This function seems to be a complete waste of disk space. @shyouhei has no + * idea why this is a different thing from rb_num2short(). + */ +long rb_fix2int(VALUE num); + +/** + * Converts an instance of ::rb_cNumeric into C's `unsigned long`. + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `unsigned int`. + * @return The passed value converted into C's `unsigned long`. + * + * @internal + * + * Yes, the API is really strange. It returns `unsigned long`, but raises when + * the value is out of `unsigned int`. This seems to be due to the fact that + * Matz favoured K&R before, and his machine at that moment was an ILP32 + * architecture. + */ +unsigned long rb_num2uint(VALUE num); + +/** + * Identical to rb_num2uint(). + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `unsigned int`. + * @return The passed value converted into C's `unsigned long`. + * + * @internal + * + * This function seems to be a complete waste of disk space. @shyouhei has no + * idea why this is a different thing from rb_num2short(). + */ +unsigned long rb_fix2uint(VALUE num); +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_ARTIFICIAL() +/** + * Converts a Fixnum into C's `int`. + * + * @param[in] x Some Fixnum. + * @pre Must not pass anything other than a Fixnum. + * @return The passed value converted into C's `int`. + */ +static inline int +RB_FIX2INT(VALUE x) +{ + /* "FIX2INT raises a TypeError if passed nil", says rubyspec. Not sure if + * that is a desired behaviour but just preserve backwards compatilibily. + */ +#if 0 + RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(x)); +#endif + long ret; + + if /* constexpr */ (sizeof(int) < sizeof(long)) { + ret = rb_fix2int(x); + } + else { + ret = RB_FIX2LONG(x); + } + + return RBIMPL_CAST((int)ret); +} + +/** + * Converts an instance of ::rb_cNumeric into C's `int`. + * + * @param[in] x Something numeric. + * @exception rb_eTypeError `x` is not a numeric. + * @exception rb_eRangeError `x` is out of range of `int`. + * @return The passed value converted into C's `int`. + */ +static inline int +rb_num2int_inline(VALUE x) +{ + long ret; + + if /* constexpr */ (sizeof(int) == sizeof(long)) { + ret = RB_NUM2LONG(x); + } + else if (RB_FIXNUM_P(x)) { + ret = rb_fix2int(x); + } + else { + ret = rb_num2int(x); + } + + return RBIMPL_CAST((int)ret); +} + +/** + * Converts an instance of ::rb_cNumeric into C's `unsigned int`. + * + * @param[in] x Something numeric. + * @exception rb_eTypeError `x` is not a numeric. + * @exception rb_eRangeError `x` is out of range of `unsigned int`. + * @return The passed value converted into C's `unsigned int`. + */ +RBIMPL_ATTR_ARTIFICIAL() +static inline unsigned int +RB_NUM2UINT(VALUE x) +{ + unsigned long ret; + + if /* constexpr */ (sizeof(int) < sizeof(long)) { + ret = rb_num2uint(x); + } + else { + ret = RB_NUM2ULONG(x); + } + + return RBIMPL_CAST((unsigned int)ret); +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * Converts a Fixnum into C's `int`. + * + * @param[in] x Some Fixnum. + * @pre Must not pass anything other than a Fixnum. + * @return The passed value converted into C's `int`. + */ +static inline unsigned int +RB_FIX2UINT(VALUE x) +{ +#if 0 /* Ditto for RB_FIX2INT. */ + RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(x)); +#endif + unsigned long ret; + + if /* constexpr */ (sizeof(int) < sizeof(long)) { + ret = rb_fix2uint(x); + } + else { + ret = RB_FIX2ULONG(x); + } + + return RBIMPL_CAST((unsigned int)ret); +} + +RBIMPL_WARNING_PUSH() +#if RBIMPL_COMPILER_IS(GCC) +RBIMPL_WARNING_IGNORED(-Wtype-limits) /* We can ignore them here. */ +#elif RBIMPL_HAS_WARNING("-Wtautological-constant-out-of-range-compare") +RBIMPL_WARNING_IGNORED(-Wtautological-constant-out-of-range-compare) +#endif + +/** + * Converts a C's `int` into an instance of ::rb_cInteger. + * + * @param[in] v Arbitrary `int` value. + * @return An instance of ::rb_cInteger. + */ +static inline VALUE +rb_int2num_inline(int v) +{ + if (RB_FIXABLE(v)) + return RB_INT2FIX(v); + else + return rb_int2big(v); +} + +/** + * Converts a C's `unsigned int` into an instance of ::rb_cInteger. + * + * @param[in] v Arbitrary `unsigned int` value. + * @return An instance of ::rb_cInteger. + */ +static inline VALUE +rb_uint2num_inline(unsigned int v) +{ + if (RB_POSFIXABLE(v)) + return RB_LONG2FIX(v); + else + return rb_uint2big(v); +} + +RBIMPL_WARNING_POP() + +#endif /* RBIMPL_ARITHMETIC_INT_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/intptr_t.h b/libs/libruby/ruby/internal/arithmetic/intptr_t.h new file mode 100644 index 0000000..a354f44 --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/intptr_t.h @@ -0,0 +1,74 @@ +#ifndef RBIMPL_ARITHMETIC_INTPTR_T_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_INTPTR_T_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `intptr_t` and Ruby's. + */ +#include "ruby/internal/config.h" + +#ifdef HAVE_STDINT_H +# include +#endif + +#include "ruby/internal/value.h" +#include "ruby/internal/dllexport.h" + +#define rb_int_new rb_int2inum /**< @alias{rb_int2inum} */ +#define rb_uint_new rb_uint2inum /**< @alias{rb_uint2inum} */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Converts a C's `intptr_t` into an instance of ::rb_cInteger. + * + * @param[in] i Arbitrary `intptr_t` value. + * @return An instance of ::rb_cInteger. + * @note This function always allocates Bignums, even if the given number + * is small enough to fit into a Fixnum. + */ +VALUE rb_int2big(intptr_t i); + +/** + * Converts a C's `intptr_t` into an instance of ::rb_cInteger. + * + * @param[in] i Arbitrary `intptr_t` value. + * @return An instance of ::rb_cInteger. + */ +VALUE rb_int2inum(intptr_t i); + +/** + * Converts a C's `intptr_t` into an instance of ::rb_cInteger. + * + * @param[in] i Arbitrary `intptr_t` value. + * @return An instance of ::rb_cInteger. + * @note This function always allocates Bignums, even if the given number + * is small enough to fit into a Fixnum. + */ +VALUE rb_uint2big(uintptr_t i); + +/** + * Converts a C's `uintptr_t` into an instance of ::rb_cInteger. + * + * @param[in] i Arbitrary `uintptr_t` value. + * @return An instance of ::rb_cInteger. + */ +VALUE rb_uint2inum(uintptr_t i); +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_ARITHMETIC_INTPTR_T_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/long.h b/libs/libruby/ruby/internal/arithmetic/long.h new file mode 100644 index 0000000..6b8fd8f --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/long.h @@ -0,0 +1,356 @@ +#ifndef RBIMPL_ARITHMETIC_LONG_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_LONG_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `long` and Ruby's. + * + * ### Q&A ### + * + * - Q: Why are INT2FIX etc. here, not in `int.h`? + * + * - A: Because they are in fact handling `long`. It seems someone did not + * understand the difference of `int` and `long` when they designed those + * macros. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/arithmetic/fixnum.h" /* FIXABLE */ +#include "ruby/internal/arithmetic/intptr_t.h" /* rb_int2big etc.*/ +#include "ruby/internal/assume.h" +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/cold.h" +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/constexpr.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/special_consts.h" /* FIXNUM_FLAG */ +#include "ruby/internal/value.h" +#include "ruby/assert.h" + +#define FIX2LONG RB_FIX2LONG /**< @old{RB_FIX2LONG} */ +#define FIX2ULONG RB_FIX2ULONG /**< @old{RB_FIX2ULONG} */ +#define INT2FIX RB_INT2FIX /**< @old{RB_INT2FIX} */ +#define LONG2FIX RB_INT2FIX /**< @old{RB_INT2FIX} */ +#define LONG2NUM RB_LONG2NUM /**< @old{RB_LONG2NUM} */ +#define NUM2LONG RB_NUM2LONG /**< @old{RB_NUM2LONG} */ +#define NUM2ULONG RB_NUM2ULONG /**< @old{RB_NUM2ULONG} */ +#define RB_FIX2LONG rb_fix2long /**< @alias{rb_fix2long} */ +#define RB_FIX2ULONG rb_fix2ulong /**< @alias{rb_fix2ulong} */ +#define RB_LONG2FIX RB_INT2FIX /**< @alias{RB_INT2FIX} */ +#define RB_LONG2NUM rb_long2num_inline /**< @alias{rb_long2num_inline} */ +#define RB_NUM2LONG rb_num2long_inline /**< @alias{rb_num2long_inline} */ +#define RB_NUM2ULONG rb_num2ulong_inline /**< @alias{rb_num2ulong_inline} */ +#define RB_ULONG2NUM rb_ulong2num_inline /**< @alias{rb_ulong2num_inline} */ +#define ULONG2NUM RB_ULONG2NUM /**< @old{RB_ULONG2NUM} */ +#define rb_fix_new RB_INT2FIX /**< @alias{RB_INT2FIX} */ +#define rb_long2int rb_long2int_inline /**< @alias{rb_long2int_inline} */ + +/** @cond INTERNAL_MACRO */ +#define RB_INT2FIX RB_INT2FIX +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_COLD() +/** + * This is an utility function to raise an ::rb_eRangeError. + * + * @param[in] num A signed value about to overflow. + * @exception rb_eRangeError `num` is out of range of `int`. + */ +void rb_out_of_int(SIGNED_VALUE num); + +/** + * Converts an instance of ::rb_cNumeric into C's `long`. + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `long`. + * @return The passed value converted into C's `long`. + */ +long rb_num2long(VALUE num); + +/** + * Converts an instance of ::rb_cNumeric into C's `unsigned long`. + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `unsigned long`. + * @return The passed value converted into C's `unsigned long`. + */ +unsigned long rb_num2ulong(VALUE num); +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_CONST_UNLESS_DEBUG() +RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Converts a C's `long` into an instance of ::rb_cInteger. + * + * @param[in] i Arbitrary `long` value. + * @return An instance of ::rb_cInteger. + */ +static inline VALUE +RB_INT2FIX(long i) +{ + RBIMPL_ASSERT_OR_ASSUME(RB_FIXABLE(i)); + + /* :NOTE: VALUE can be wider than long. As j being unsigned, 2j+1 is fully + * defined. Also it can be compiled into a single LEA instruction. */ + const unsigned long j = i; + const unsigned long k = (j << 1) + RUBY_FIXNUM_FLAG; + const long l = k; + const SIGNED_VALUE m = l; /* Sign extend */ + const VALUE n = m; + + RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(n)); + return n; +} + +/** + * Checks if `int` can hold the given integer. + * + * @param[in] n Arbitrary `long` value. + * @exception rb_eRangeError `n` is out of range of `int`. + * @return Identical value of type `int` + */ +static inline int +rb_long2int_inline(long n) +{ + int i = RBIMPL_CAST((int)n); + + if /* constexpr */ (sizeof(long) <= sizeof(int)) { + RBIMPL_ASSUME(i == n); + } + + if (i != n) + rb_out_of_int(n); + + return i; +} + +RBIMPL_ATTR_CONST_UNLESS_DEBUG() +RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) +/** + * @private + * + * This is an implementation detail of rb_fix2long(). People don't use it + * directly. + * + * @param[in] x A Fixnum. + * @return Identical value of type `long` + * @pre Must not pass anything other than a Fixnum. + */ +static inline long +rbimpl_fix2long_by_idiv(VALUE x) +{ + RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(x)); + + /* :NOTE: VALUE can be wider than long. (x-1)/2 never overflows because + * RB_FIXNUM_P(x) holds. Also it has no portability issue like y>>1 + * below. */ + const SIGNED_VALUE y = x - RUBY_FIXNUM_FLAG; + const SIGNED_VALUE z = y / 2; + const long w = RBIMPL_CAST((long)z); + + RBIMPL_ASSERT_OR_ASSUME(RB_FIXABLE(w)); + return w; +} + +RBIMPL_ATTR_CONST_UNLESS_DEBUG() +RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) +/** + * @private + * + * This is an implementation detail of rb_fix2long(). People don't use it + * directly. + * + * @param[in] x A Fixnum. + * @return Identical value of type `long` + * @pre Must not pass anything other than a Fixnum. + */ +static inline long +rbimpl_fix2long_by_shift(VALUE x) +{ + RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(x)); + + /* :NOTE: VALUE can be wider than long. If right shift is arithmetic, this + * is noticeably faster than above. */ + const SIGNED_VALUE y = x; + const SIGNED_VALUE z = y >> 1; + const long w = RBIMPL_CAST((long)z); + + RBIMPL_ASSERT_OR_ASSUME(RB_FIXABLE(w)); + return w; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +/** + * @private + * + * This is an implementation detail of rb_fix2long(). People don't use it + * directly. + * + * @retval true This C compiler's right shift operator is arithmetic. + * @retval false This C compiler's right shift operator is logical. + */ +static inline bool +rbimpl_right_shift_is_arithmetic_p(void) +{ + return (-1 >> 1) == -1; +} + +RBIMPL_ATTR_CONST_UNLESS_DEBUG() +RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) +/** + * Converts a Fixnum into C's `long`. + * + * @param[in] x Some Fixnum. + * @pre Must not pass anything other than a Fixnum. + * @return The passed value converted into C's `long`. + */ +static inline long +rb_fix2long(VALUE x) +{ + if /* constexpr */ (rbimpl_right_shift_is_arithmetic_p()) { + return rbimpl_fix2long_by_shift(x); + } + else { + return rbimpl_fix2long_by_idiv(x); + } +} + +RBIMPL_ATTR_CONST_UNLESS_DEBUG() +RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) +/** + * Converts a Fixnum into C's `unsigned long`. + * + * @param[in] x Some Fixnum. + * @pre Must not pass anything other than a Fixnum. + * @return The passed value converted into C's `unsigned long`. + * @note Negative fixnums will be converted into large unsigned longs. + */ +static inline unsigned long +rb_fix2ulong(VALUE x) +{ + RBIMPL_ASSERT_OR_ASSUME(RB_FIXNUM_P(x)); + return rb_fix2long(x); +} + +/** + * Converts an instance of ::rb_cNumeric into C's `long`. + * + * @param[in] x Something numeric. + * @exception rb_eTypeError `x` is not a numeric. + * @exception rb_eRangeError `x` is out of range of `long`. + * @return The passed value converted into C's `long`. + */ +static inline long +rb_num2long_inline(VALUE x) +{ + if (RB_FIXNUM_P(x)) + return RB_FIX2LONG(x); + else + return rb_num2long(x); +} + +/** + * Converts an instance of ::rb_cNumeric into C's `unsigned long`. + * + * @param[in] x Something numeric. + * @exception rb_eTypeError `x` is not a numeric. + * @exception rb_eRangeError `x` is out of range of `unsigned long`. + * @return The passed value converted into C's `unsigned long`. + * + * @internal + * + * This (negative fixnum would become a large unsigned long while negative + * bignum is an exception) has been THE behaviour of NUM2ULONG since the + * beginning. It is strange, but we can no longer change how it works at this + * moment. We have to get by with it. + * + * @see https://bugs.ruby-lang.org/issues/9089 + */ +static inline unsigned long +rb_num2ulong_inline(VALUE x) +{ + if (RB_FIXNUM_P(x)) + return RB_FIX2ULONG(x); + else + return rb_num2ulong(x); +} + +/** + * Converts a C's `long` into an instance of ::rb_cInteger. + * + * @param[in] v Arbitrary `long` value. + * @return An instance of ::rb_cInteger. + */ +static inline VALUE +rb_long2num_inline(long v) +{ + if (RB_FIXABLE(v)) + return RB_LONG2FIX(v); + else + return rb_int2big(v); +} + +/** + * Converts a C's `unsigned long` into an instance of ::rb_cInteger. + * + * @param[in] v Arbitrary `unsigned long` value. + * @return An instance of ::rb_cInteger. + */ +static inline VALUE +rb_ulong2num_inline(unsigned long v) +{ + if (RB_POSFIXABLE(v)) + return RB_LONG2FIX(v); + else + return rb_uint2big(v); +} + +/** + * @cond INTERNAL_MACRO + * + * Following overload is necessary because sometimes INT2FIX is used as a enum + * value (e.g. `enum { FOO = INT2FIX(0) };`). THIS IS NG in theory because a + * VALUE does not fit into an enum (which must be a signed int). But we cannot + * break existing codes. + */ +#if RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 +# /* C++ can write constexpr as enum values. */ + +#elif ! defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) +# undef INT2FIX +# define INT2FIX(i) (RBIMPL_CAST((VALUE)(i)) << 1 | RUBY_FIXNUM_FLAG) + +#else +# undef INT2FIX +# define INT2FIX(i) \ + __builtin_choose_expr( \ + __builtin_constant_p(i), \ + RBIMPL_CAST((VALUE)(i)) << 1 | RUBY_FIXNUM_FLAG, \ + RB_INT2FIX(i)) +#endif +/** @endcond */ + +#endif /* RBIMPL_ARITHMETIC_LONG_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/long_long.h b/libs/libruby/ruby/internal/arithmetic/long_long.h new file mode 100644 index 0000000..65dec87 --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/long_long.h @@ -0,0 +1,135 @@ +#ifndef RBIMPL_ARITHMETIC_LONG_LONG_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_LONG_LONG_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `long long` and Ruby's. + */ +#include "ruby/internal/value.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/special_consts.h" +#include "ruby/backward/2/long_long.h" + +#define RB_LL2NUM rb_ll2num_inline /**< @alias{rb_ll2num_inline} */ +#define RB_ULL2NUM rb_ull2num_inline /**< @alias{rb_ull2num_inline} */ +#define LL2NUM RB_LL2NUM /**< @old{RB_LL2NUM} */ +#define ULL2NUM RB_ULL2NUM /**< @old{RB_ULL2NUM} */ +#define RB_NUM2LL rb_num2ll_inline /**< @alias{rb_num2ll_inline} */ +#define RB_NUM2ULL rb_num2ull_inline /**< @alias{rb_num2ull_inline} */ +#define NUM2LL RB_NUM2LL /**< @old{RB_NUM2LL} */ +#define NUM2ULL RB_NUM2ULL /**< @old{RB_NUM2ULL} */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * Converts a C's `long long` into an instance of ::rb_cInteger. + * + * @param[in] num Arbitrary `long long` value. + * @return An instance of ::rb_cInteger. + */ +VALUE rb_ll2inum(LONG_LONG num); + +/** + * Converts a C's `unsigned long long` into an instance of ::rb_cInteger. + * + * @param[in] num Arbitrary `unsigned long long` value. + * @return An instance of ::rb_cInteger. + */ +VALUE rb_ull2inum(unsigned LONG_LONG num); + +/** + * Converts an instance of ::rb_cNumeric into C's `long long`. + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `long long`. + * @return The passed value converted into C's `long long`. + */ +LONG_LONG rb_num2ll(VALUE num); + +/** + * Converts an instance of ::rb_cNumeric into C's `unsigned long long`. + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `unsigned long long`. + * @return The passed value converted into C's `unsigned long long`. + */ +unsigned LONG_LONG rb_num2ull(VALUE num); +RBIMPL_SYMBOL_EXPORT_END() + +/** + * Converts a C's `long long` into an instance of ::rb_cInteger. + * + * @param[in] n Arbitrary `long long` value. + * @return An instance of ::rb_cInteger + */ +static inline VALUE +rb_ll2num_inline(LONG_LONG n) +{ + if (FIXABLE(n)) return LONG2FIX((long)n); + return rb_ll2inum(n); +} + +/** + * Converts a C's `unsigned long long` into an instance of ::rb_cInteger. + * + * @param[in] n Arbitrary `unsigned long long` value. + * @return An instance of ::rb_cInteger + */ +static inline VALUE +rb_ull2num_inline(unsigned LONG_LONG n) +{ + if (POSFIXABLE(n)) return LONG2FIX((long)n); + return rb_ull2inum(n); +} + +/** + * Converts an instance of ::rb_cNumeric into C's `long long`. + * + * @param[in] x Something numeric. + * @exception rb_eTypeError `x` is not a numeric. + * @exception rb_eRangeError `x` is out of range of `long long`. + * @return The passed value converted into C's `long long`. + */ +static inline LONG_LONG +rb_num2ll_inline(VALUE x) +{ + if (RB_FIXNUM_P(x)) + return RB_FIX2LONG(x); + else + return rb_num2ll(x); +} + +/** + * Converts an instance of ::rb_cNumeric into C's `unsigned long long`. + * + * @param[in] x Something numeric. + * @exception rb_eTypeError `x` is not a numeric. + * @exception rb_eRangeError `x` is out of range of `unsigned long long`. + * @return The passed value converted into C's `unsigned long long`. + */ +static inline unsigned LONG_LONG +rb_num2ull_inline(VALUE x) +{ + if (RB_FIXNUM_P(x)) + return RB_FIX2LONG(x); + else + return rb_num2ull(x); +} + +#endif /* RBIMPL_ARITHMETIC_LONG_LONG_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/mode_t.h b/libs/libruby/ruby/internal/arithmetic/mode_t.h new file mode 100644 index 0000000..5b7ad35 --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/mode_t.h @@ -0,0 +1,41 @@ +#ifndef RBIMPL_ARITHMETIC_MODE_T_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_MODE_T_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `mode_t` and Ruby's. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/arithmetic/int.h" + +/** Converts a C's `mode_t` into an instance of ::rb_cInteger. */ +#ifndef NUM2MODET +# define NUM2MODET RB_NUM2INT +#endif + +/** Converts an instance of ::rb_cNumeric into C's `mode_t`. */ +#ifndef MODET2NUM +# define MODET2NUM RB_INT2NUM +#endif + +/** A rb_sprintf() format prefix to be used for a `mode_t` parameter. */ +#ifndef PRI_MODET_PREFIX +# define PRI_MODET_PREFIX PRI_INT_PREFIX +#endif + +#endif /* RBIMPL_ARITHMETIC_MODE_T_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/off_t.h b/libs/libruby/ruby/internal/arithmetic/off_t.h new file mode 100644 index 0000000..0ec9362 --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/off_t.h @@ -0,0 +1,62 @@ +#ifndef RBIMPL_ARITHMETIC_OFF_T_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_OFF_T_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `off_t` and Ruby's. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/arithmetic/int.h" +#include "ruby/internal/arithmetic/long.h" +#include "ruby/internal/arithmetic/long_long.h" +#include "ruby/backward/2/long_long.h" + +/** Converts a C's `off_t` into an instance of ::rb_cInteger. */ +#ifdef OFFT2NUM +# /* take that. */ +#elif SIZEOF_OFF_T == SIZEOF_LONG_LONG +# define OFFT2NUM RB_LL2NUM +#elif SIZEOF_OFF_T == SIZEOF_LONG +# define OFFT2NUM RB_LONG2NUM +#else +# define OFFT2NUM RB_INT2NUM +#endif + +/** Converts an instance of ::rb_cNumeric into C's `off_t`. */ +#ifdef NUM2OFFT +# /* take that. */ +#elif SIZEOF_OFF_T == SIZEOF_LONG_LONG +# define NUM2OFFT RB_NUM2LL +#elif SIZEOF_OFF_T == SIZEOF_LONG +# define NUM2OFFT RB_NUM2LONG +#else +# define NUM2OFFT RB_NUM2INT +#endif + +/** A rb_sprintf() format prefix to be used for an `off_t` parameter. */ +#ifdef PRI_OFFT_PREFIX +# /* take that. */ +#elif SIZEOF_OFF_T == SIZEOF_LONG_LONG +# define PRI_OFFT_PREFIX PRI_LL_PREFIX +#elif SIZEOF_OFF_T == SIZEOF_LONG +# define PRI_OFFT_PREFIX PRI_LONG_PREFIX +#else +# define PRI_OFFT_PREFIX PRI_INT_PREFIX +#endif + +#endif /* RBIMPL_ARITHMETIC_OFF_T_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/pid_t.h b/libs/libruby/ruby/internal/arithmetic/pid_t.h new file mode 100644 index 0000000..df9704e --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/pid_t.h @@ -0,0 +1,41 @@ +#ifndef RBIMPL_ARITHMETIC_PID_T_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_PID_T_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `pid_t` and Ruby's. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/arithmetic/long.h" + +/** Converts a C's `pid_t` into an instance of ::rb_cInteger. */ +#ifndef PIDT2NUM +# define PIDT2NUM RB_LONG2NUM +#endif + +/** Converts an instance of ::rb_cNumeric into C's `pid_t`. */ +#ifndef NUM2PIDT +# define NUM2PIDT RB_NUM2LONG +#endif + +/** A rb_sprintf() format prefix to be used for a `pid_t` parameter. */ +#ifndef PRI_PIDT_PREFIX +# define PRI_PIDT_PREFIX PRI_LONG_PREFIX +#endif + +#endif /* RBIMPL_ARITHMETIC_PID_T_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/short.h b/libs/libruby/ruby/internal/arithmetic/short.h new file mode 100644 index 0000000..7a324d9 --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/short.h @@ -0,0 +1,113 @@ +#ifndef RBIMPL_ARITHMETIC_SHORT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_SHORT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `short` and Ruby's. + * + * Shyouhei wonders: why there is no SHORT2NUM, given there are both + * #USHORT2NUM and #CHR2FIX? + */ +#include "ruby/internal/value.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/special_consts.h" + +#define RB_NUM2SHORT rb_num2short_inline /**< @alias{rb_num2short_inline} */ +#define RB_NUM2USHORT rb_num2ushort /**< @alias{rb_num2ushort} */ +#define NUM2SHORT RB_NUM2SHORT /**< @old{RB_NUM2SHORT} */ +#define NUM2USHORT RB_NUM2USHORT /**< @old{RB_NUM2USHORT} */ +#define USHORT2NUM RB_INT2FIX /**< @old{RB_INT2FIX} */ +#define RB_FIX2SHORT rb_fix2short /**< @alias{rb_fix2ushort} */ +#define FIX2SHORT RB_FIX2SHORT /**< @old{RB_FIX2SHORT} */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Converts an instance of ::rb_cNumeric into C's `short`. + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `short`. + * @return The passed value converted into C's `short`. + */ +short rb_num2short(VALUE num); + +/** + * Converts an instance of ::rb_cNumeric into C's `unsigned short`. + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `unsigned short`. + * @return The passed value converted into C's `unsigned short`. + */ +unsigned short rb_num2ushort(VALUE num); + +/** + * Identical to rb_num2short(). + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `short`. + * @return The passed value converted into C's `short`. + * + * @internal + * + * This function seems to be a complete waste of disk space. @shyouhei has no + * idea why this is a different thing from rb_num2short(). + */ +short rb_fix2short(VALUE num); + +/** + * Identical to rb_num2ushort(). + * + * @param[in] num Something numeric. + * @exception rb_eTypeError `num` is not a numeric. + * @exception rb_eRangeError `num` is out of range of `unsigned short`. + * @return The passed value converted into C's `unsigned short`. + * + * @internal + * + * This function seems to be a complete waste of disk space. @shyouhei has no + * idea why this is a different thing from rb_num2ushort(). + */ +unsigned short rb_fix2ushort(VALUE num); +RBIMPL_SYMBOL_EXPORT_END() + +/** + * Identical to rb_num2short(). + * + * @param[in] x Something numeric. + * @exception rb_eTypeError `x` is not a numeric. + * @exception rb_eRangeError `x` is out of range of `short`. + * @return The passed value converted into C's `short`. + * + * @internal + * + * This function seems to be a complete waste of time. @shyouhei has no idea + * why this is a different thing from rb_num2short(). + */ +static inline short +rb_num2short_inline(VALUE x) +{ + if (RB_FIXNUM_P(x)) + return rb_fix2short(x); + else + return rb_num2short(x); +} + +#endif /* RBIMPL_ARITHMETIC_SHORT_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/size_t.h b/libs/libruby/ruby/internal/arithmetic/size_t.h new file mode 100644 index 0000000..1082160 --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/size_t.h @@ -0,0 +1,66 @@ +#ifndef RBIMPL_ARITHMETIC_SIZE_T_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_SIZE_T_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `size_t` and Ruby's. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/arithmetic/int.h" +#include "ruby/internal/arithmetic/long.h" +#include "ruby/internal/arithmetic/long_long.h" +#include "ruby/backward/2/long_long.h" + +#if defined(__DOXYGEN__) +# /** Converts a C's `size_t` into an instance of ::rb_cInteger. */ +# define RB_SIZE2NUM RB_ULONG2NUM +# /** Converts a C's `ssize_t` into an instance of ::rb_cInteger. */ +# define RB_SSIZE2NUM RB_LONG2NUM +#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG +# define RB_SIZE2NUM RB_ULL2NUM +# define RB_SSIZE2NUM RB_LL2NUM +#elif SIZEOF_SIZE_T == SIZEOF_LONG +# define RB_SIZE2NUM RB_ULONG2NUM +# define RB_SSIZE2NUM RB_LONG2NUM +#else +# define RB_SIZE2NUM RB_UINT2NUM +# define RB_SSIZE2NUM RB_INT2NUM +#endif + +#if defined(__DOXYGEN__) +# /** Converts an instance of ::rb_cInteger into C's `size_t`. */ +# define RB_NUM2SIZE RB_NUM2ULONG +# /** Converts an instance of ::rb_cInteger into C's `ssize_t`. */ +# define RB_NUM2SSIZE RB_NUM2LONG +#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG +# define RB_NUM2SIZE RB_NUM2ULL +# define RB_NUM2SSIZE RB_NUM2LL +#elif SIZEOF_SIZE_T == SIZEOF_LONG +# define RB_NUM2SIZE RB_NUM2ULONG +# define RB_NUM2SSIZE RB_NUM2LONG +#else +# define RB_NUM2SIZE RB_NUM2UINT +# define RB_NUM2SSIZE RB_NUM2INT +#endif + +#define NUM2SIZET RB_NUM2SIZE /**< @old{RB_NUM2SIZE} */ +#define SIZET2NUM RB_SIZE2NUM /**< @old{RB_SIZE2NUM} */ +#define NUM2SSIZET RB_NUM2SSIZE /**< @old{RB_NUM2SSIZE} */ +#define SSIZET2NUM RB_SSIZE2NUM /**< @old{RB_SSIZE2NUM} */ + +#endif /* RBIMPL_ARITHMETIC_SIZE_T_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/st_data_t.h b/libs/libruby/ruby/internal/arithmetic/st_data_t.h new file mode 100644 index 0000000..3bff4ff --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/st_data_t.h @@ -0,0 +1,75 @@ +#ifndef RBIMPL_ARITHMERIC_ST_DATA_T_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMERIC_ST_DATA_T_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `st_data_t` and Ruby's. + */ +#include "ruby/internal/arithmetic/fixnum.h" +#include "ruby/internal/arithmetic/long.h" +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/constexpr.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/value.h" +#include "ruby/assert.h" +#include "ruby/st.h" + +#define ST2FIX RB_ST2FIX /**< @old{RB_ST2FIX} */ +/** @cond INTERNAL_MACRO */ +#define RB_ST2FIX RB_ST2FIX +/** @endcond */ + +RBIMPL_ATTR_CONST_UNLESS_DEBUG() +RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(CXX14) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Converts a C's `st_data_t` into an instance of ::rb_cInteger. + * + * @param[in] i The data in question. + * @return A converted result + * @warning THIS CONVERSION LOSES DATA! Be warned. + * @see https://bugs.ruby-lang.org/issues/13877 + * @see https://bugs.ruby-lang.org/issues/14218 + * + * @internal + * + * This is needed because of hash functions. Hash functions return + * `st_data_t`, which could theoretically be bigger than Fixnums. However + * allocating Bignums for them every time we calculate hash values is just too + * heavy. To avoid penalty we need to ignore some upper bit(s) and stick to + * Fixnums. This function is used for that purpose. + */ +static inline VALUE +RB_ST2FIX(st_data_t i) +{ + SIGNED_VALUE x = i; + + if (x >= 0) { + x &= RUBY_FIXNUM_MAX; + } + else { + x |= RUBY_FIXNUM_MIN; + } + + RBIMPL_ASSERT_OR_ASSUME(RB_FIXABLE(x)); + unsigned long y = RBIMPL_CAST((unsigned long)x); + return RB_LONG2FIX(y); +} + +#endif /* RBIMPL_ARITHMETIC_ST_DATA_T_H */ diff --git a/libs/libruby/ruby/internal/arithmetic/uid_t.h b/libs/libruby/ruby/internal/arithmetic/uid_t.h new file mode 100644 index 0000000..12cde2a --- /dev/null +++ b/libs/libruby/ruby/internal/arithmetic/uid_t.h @@ -0,0 +1,41 @@ +#ifndef RBIMPL_ARITHMETIC_UID_T_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ARITHMETIC_UID_T_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Arithmetic conversion between C's `uid_t` and Ruby's. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/arithmetic/long.h" + +/** Converts a C's `uid_t` into an instance of ::rb_cInteger. */ +#ifndef UIDT2NUM +# define UIDT2NUM RB_LONG2NUM +#endif + +/** Converts an instance of ::rb_cNumeric into C's `uid_t`. */ +#ifndef NUM2UIDT +# define NUM2UIDT RB_NUM2LONG +#endif + +/** A rb_sprintf() format prefix to be used for a `uid_t` parameter. */ +#ifndef PRI_UIDT_PREFIX +# define PRI_UIDT_PREFIX PRI_LONG_PREFIX +#endif + +#endif /* RBIMPL_ARITHMETIC_UID_T_H */ diff --git a/libs/libruby/ruby/internal/assume.h b/libs/libruby/ruby/internal/assume.h new file mode 100644 index 0000000..4c183e8 --- /dev/null +++ b/libs/libruby/ruby/internal/assume.h @@ -0,0 +1,87 @@ +#ifndef RBIMPL_ASSUME_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ASSUME_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ASSUME / #RBIMPL_UNREACHABLE. + * + * These macros must be defined at once because: + * + * - #RBIMPL_ASSUME could fallback to #RBIMPL_UNREACHABLE. + * - #RBIMPL_UNREACHABLE could fallback to #RBIMPL_ASSUME. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/has/builtin.h" +#include "ruby/internal/warning_push.h" + +/** @cond INTERNAL_MACRO */ +#if defined(HAVE___ASSUME) +# define RBIMPL_HAVE___ASSUME +#endif +/** @endcond */ + +/** Wraps (or simulates) `__builtin_unreachable`. */ +#if RBIMPL_HAS_BUILTIN(__builtin_unreachable) +# define RBIMPL_UNREACHABLE_RETURN(_) __builtin_unreachable() + +#elif defined(RBIMPL_HAVE___ASSUME) +# define RBIMPL_UNREACHABLE_RETURN(_) return (__assume(0), (_)) + +#else +# define RBIMPL_UNREACHABLE_RETURN(_) return (_) +#endif + +/** Wraps (or simulates) `__builtin_unreachable`. */ +#if RBIMPL_HAS_BUILTIN(__builtin_unreachable) +# define RBIMPL_UNREACHABLE __builtin_unreachable + +#elif defined(RBIMPL_HAVE___ASSUME) +# define RBIMPL_UNREACHABLE() __assume(0) +#endif + +/** Wraps (or simulates) `__assume`. */ +#if RBIMPL_COMPILER_SINCE(Intel, 13, 0, 0) +# /* icc warnings are false positives. Ignore them. */ +# /* "warning #2261: __assume expression with side effects discarded" */ +# define RBIMPL_ASSUME(expr) \ + RBIMPL_WARNING_PUSH() \ + RBIMPL_WARNING_IGNORED(2261) \ + __assume(expr) \ + RBIMPL_WARNING_POP() + +#elif defined(RBIMPL_HAVE___ASSUME) +# define RBIMPL_ASSUME __assume + +#elif RBIMPL_HAS_BUILTIN(__builtin_assume) +# define RBIMPL_ASSUME __builtin_assume + +#elif ! defined(RBIMPL_UNREACHABLE) +# define RBIMPL_ASSUME(_) RBIMPL_CAST((void)(_)) + +#else +# define RBIMPL_ASSUME(_) \ + (RB_LIKELY(!!(_)) ? RBIMPL_CAST((void)0) : RBIMPL_UNREACHABLE()) +#endif + +#if ! defined(RBIMPL_UNREACHABLE) +# define RBIMPL_UNREACHABLE() RBIMPL_ASSUME(0) +#endif + +#endif /* RBIMPL_ASSUME_H */ diff --git a/libs/libruby/ruby/internal/attr/alloc_size.h b/libs/libruby/ruby/internal/attr/alloc_size.h new file mode 100644 index 0000000..954a201 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/alloc_size.h @@ -0,0 +1,32 @@ +#ifndef RBIMPL_ATTR_ALLOC_SIZE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_ALLOC_SIZE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_ALLOC_SIZE. + */ +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((alloc_size))` */ +#if RBIMPL_HAS_ATTRIBUTE(alloc_size) +# define RBIMPL_ATTR_ALLOC_SIZE(tuple) __attribute__((__alloc_size__ tuple)) +#else +# define RBIMPL_ATTR_ALLOC_SIZE(tuple) /* void */ +#endif + +#endif /* RBIMPL_ATTR_ALLOC_SIZE_H */ diff --git a/libs/libruby/ruby/internal/attr/artificial.h b/libs/libruby/ruby/internal/attr/artificial.h new file mode 100644 index 0000000..ef5f36a --- /dev/null +++ b/libs/libruby/ruby/internal/attr/artificial.h @@ -0,0 +1,46 @@ +#ifndef RBIMPL_ATTR_ARTIFICIAL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_ARTIFICIAL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_ARTIFICIAL. + * + * ### Q&A ### + * + * - Q: What is this attribute? I don't get what GCC manual is talking about. + * + * - A: In short it is an attribute to manipulate GDB backtraces. The + * attribute makes the best sense when it comes with + * __attribute__((always_inline)). When a function annotated with this + * attribute gets inlined, and when you somehow look at a backtrace which + * includes such inlined call site, then the backtrace shows the caller + * and not the callee. This is handy for instance when an identical + * function is inlined more than once in a single big function. On such + * case it gets vital to know where the inlining happened in the callee. + * See also https://stackoverflow.com/a/21936099 + */ +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((artificial))` */ +#if RBIMPL_HAS_ATTRIBUTE(artificial) +# define RBIMPL_ATTR_ARTIFICIAL() __attribute__((__artificial__)) +#else +# define RBIMPL_ATTR_ARTIFICIAL() /* void */ +#endif + +#endif /* RBIMPL_ATTR_ARTIFICIAL_H */ diff --git a/libs/libruby/ruby/internal/attr/cold.h b/libs/libruby/ruby/internal/attr/cold.h new file mode 100644 index 0000000..c68b3ae --- /dev/null +++ b/libs/libruby/ruby/internal/attr/cold.h @@ -0,0 +1,37 @@ +#ifndef RBIMPL_ATTR_COLD_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_COLD_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_COLD. + */ +#include "ruby/internal/compiler_is.h" +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((cold))` */ +#if RBIMPL_COMPILER_IS(SunPro) +# /* Recent SunPro has __has_attribute, and is broken. */ +# /* It reports it has attribute cold, reality isn't (warnings issued). */ +# define RBIMPL_ATTR_COLD() /* void */ +#elif RBIMPL_HAS_ATTRIBUTE(cold) +# define RBIMPL_ATTR_COLD() __attribute__((__cold__)) +#else +# define RBIMPL_ATTR_COLD() /* void */ +#endif + +#endif /* RBIMPL_ATTR_COLD_H */ diff --git a/libs/libruby/ruby/internal/attr/const.h b/libs/libruby/ruby/internal/attr/const.h new file mode 100644 index 0000000..e66aa17 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/const.h @@ -0,0 +1,46 @@ +#ifndef RBIMPL_ATTR_CONST_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_CONST_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_CONST. + */ +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/has/attribute.h" +#include "ruby/internal/has/declspec_attribute.h" + +/** Wraps (or simulates) `__attribute__((const))` */ +#if RBIMPL_HAS_ATTRIBUTE(const) +# define RBIMPL_ATTR_CONST() __attribute__((__const__)) +#elif RBIMPL_HAS_DECLSPEC_ATTRIBUTE(noalias) +# /* If a function can be a const, that is also a noalias. */ +# define RBIMPL_ATTR_CONST() __declspec(noalias) +#elif RBIMPL_COMPILER_SINCE(SunPro, 5, 10, 0) +# define RBIMPL_ATTR_CONST() _Pragma("no_side_effect") +#else +# define RBIMPL_ATTR_CONST() /* void */ +#endif + +/** Enables #RBIMPL_ATTR_CONST if and only if. ! #RUBY_DEBUG. */ +#if !defined(RUBY_DEBUG) || !RUBY_DEBUG +# define RBIMPL_ATTR_CONST_UNLESS_DEBUG() RBIMPL_ATTR_CONST() +#else +# define RBIMPL_ATTR_CONST_UNLESS_DEBUG() /* void */ +#endif + +#endif /* RBIMPL_ATTR_CONST_H */ diff --git a/libs/libruby/ruby/internal/attr/constexpr.h b/libs/libruby/ruby/internal/attr/constexpr.h new file mode 100644 index 0000000..abc4f23 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/constexpr.h @@ -0,0 +1,84 @@ +#ifndef RBIMPL_ATTR_CONSTEXPR_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_CONSTEXPR_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief #RBIMPL_ATTR_CONSTEXPR. + */ +#include "ruby/internal/has/feature.h" +#include "ruby/internal/compiler_is.h" + +/** @cond INTERNAL_MACRO */ +#if ! defined(__cplusplus) +# /* Makes no sense. */ +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX11 0 +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 0 + +#elif defined(__cpp_constexpr) +# /* https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations */ +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX11 (__cpp_constexpr >= 200704L) +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 (__cpp_constexpr >= 201304L) + +#elif RBIMPL_COMPILER_SINCE(MSVC, 19, 0, 0) +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX11 RBIMPL_COMPILER_SINCE(MSVC, 19, 00, 00) +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 RBIMPL_COMPILER_SINCE(MSVC, 19, 11, 00) + +#elif RBIMPL_COMPILER_SINCE(SunPro, 5, 13, 0) +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX11 (__cplusplus >= 201103L) +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 (__cplusplus >= 201402L) + +#elif RBIMPL_COMPILER_SINCE(GCC, 4, 9, 0) +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX11 (__cplusplus >= 201103L) +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 (__cplusplus >= 201402L) + +#elif RBIMPL_HAS_FEATURE(cxx_relaxed_constexpr) +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX11 1 +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 1 + +#elif RBIMPL_HAS_FEATURE(cxx_constexpr) +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX11 1 +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 0 + +#else +# /* :FIXME: icpc must have constexpr but don't know how to detect. */ +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX11 0 +# define RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 0 +#endif +/** @endcond */ + +/** Wraps (or simulates) C++11 `constexpr`. */ +#if RBIMPL_HAS_ATTR_CONSTEXPR_CXX14 +# define RBIMPL_ATTR_CONSTEXPR(_) constexpr + +#elif RBIMPL_HAS_ATTR_CONSTEXPR_CXX11 +# define RBIMPL_ATTR_CONSTEXPR(_) RBIMPL_ATTR_CONSTEXPR_ ## _ +# define RBIMPL_ATTR_CONSTEXPR_CXX11 constexpr +# define RBIMPL_ATTR_CONSTEXPR_CXX14 /* void */ + +#else +# define RBIMPL_ATTR_CONSTEXPR(_) /* void */ +#endif + +/** Enables #RBIMPL_ATTR_CONSTEXPR if and only if. ! #RUBY_DEBUG. */ +#if !RUBY_DEBUG +# define RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(_) RBIMPL_ATTR_CONSTEXPR(_) +#else +# define RBIMPL_ATTR_CONSTEXPR_UNLESS_DEBUG(_) /* void */ +#endif + +#endif /* RBIMPL_ATTR_CONSTEXPR_H */ diff --git a/libs/libruby/ruby/internal/attr/deprecated.h b/libs/libruby/ruby/internal/attr/deprecated.h new file mode 100644 index 0000000..e1bbdbd --- /dev/null +++ b/libs/libruby/ruby/internal/attr/deprecated.h @@ -0,0 +1,75 @@ +#ifndef RBIMPL_ATTR_DEPRECATED_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_DEPRECATED_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_DEPRECATED. + */ +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/has/attribute.h" +#include "ruby/internal/has/c_attribute.h" +#include "ruby/internal/has/cpp_attribute.h" +#include "ruby/internal/has/declspec_attribute.h" +#include "ruby/internal/has/extension.h" + +/** Wraps (or simulates) `[[deprecated]]` */ +#if defined(__COVERITY__) +/* Coverity Scan emulates gcc but seems not to support this attribute correctly */ +# define RBIMPL_ATTR_DEPRECATED(msg) + +#elif RBIMPL_HAS_EXTENSION(attribute_deprecated_with_message) +# define RBIMPL_ATTR_DEPRECATED(msg) __attribute__((__deprecated__ msg)) + +#elif defined(__cplusplus) && RBIMPL_COMPILER_SINCE(GCC, 10, 1, 0) && RBIMPL_COMPILER_BEFORE(GCC, 10, 3, 0) +# /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95302 */ +# define RBIMPL_ATTR_DEPRECATED(msg) /* disable until they fix this bug */ + +#elif RBIMPL_COMPILER_SINCE(GCC, 4, 5, 0) +# define RBIMPL_ATTR_DEPRECATED(msg) __attribute__((__deprecated__ msg)) + +#elif RBIMPL_COMPILER_SINCE(Intel, 13, 0, 0) +# define RBIMPL_ATTR_DEPRECATED(msg) __attribute__((__deprecated__ msg)) + +#elif RBIMPL_HAS_ATTRIBUTE(deprecated) /* but not with message. */ +# define RBIMPL_ATTR_DEPRECATED(msg) __attribute__((__deprecated__)) + +#elif RBIMPL_COMPILER_SINCE(MSVC, 14, 0, 0) +# define RBIMPL_ATTR_DEPRECATED(msg) __declspec(deprecated msg) + +#elif RBIMPL_HAS_DECLSPEC_ATTRIBUTE(deprecated) +# define RBIMPL_ATTR_DEPRECATED(msg) __declspec(deprecated) + +#elif RBIMPL_HAS_CPP_ATTRIBUTE(deprecated) +# define RBIMPL_ATTR_DEPRECATED(msg) [[deprecated msg]] + +#elif RBIMPL_HAS_C_ATTRIBUTE(deprecated) +# define RBIMPL_ATTR_DEPRECATED(msg) [[deprecated msg]] + +#else +# define RBIMPL_ATTR_DEPRECATED(msg) /* void */ +#endif + +/** This is when a function is used internally (for backwards compatibility + * etc.), but extension libraries must consider it deprecated. */ +#if defined(RUBY_EXPORT) +# define RBIMPL_ATTR_DEPRECATED_EXT(msg) /* void */ +#else +# define RBIMPL_ATTR_DEPRECATED_EXT(msg) RBIMPL_ATTR_DEPRECATED(msg) +#endif + +#endif /* RBIMPL_ATTR_DEPRECATED_H */ diff --git a/libs/libruby/ruby/internal/attr/diagnose_if.h b/libs/libruby/ruby/internal/attr/diagnose_if.h new file mode 100644 index 0000000..cadc6ce --- /dev/null +++ b/libs/libruby/ruby/internal/attr/diagnose_if.h @@ -0,0 +1,42 @@ +#ifndef RBIMPL_ATTR_DIAGNOSE_IF_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_DIAGNOSE_IF_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_DIAGNOSE_IF. + */ +#include "ruby/internal/has/attribute.h" +#include "ruby/internal/warning_push.h" + +/** Wraps (or simulates) `__attribute__((diagnose_if))` */ +#if RBIMPL_COMPILER_BEFORE(Clang, 5, 0, 0) +# /* https://bugs.llvm.org/show_bug.cgi?id=34319 */ +# define RBIMPL_ATTR_DIAGNOSE_IF(_, __, ___) /* void */ + +#elif RBIMPL_HAS_ATTRIBUTE(diagnose_if) +# define RBIMPL_ATTR_DIAGNOSE_IF(_, __, ___) \ + RBIMPL_WARNING_PUSH() \ + RBIMPL_WARNING_IGNORED(-Wgcc-compat) \ + __attribute__((__diagnose_if__(_, __, ___))) \ + RBIMPL_WARNING_POP() + +#else +# define RBIMPL_ATTR_DIAGNOSE_IF(_, __, ___) /* void */ +#endif + +#endif /* RBIMPL_ATTR_DIAGNOSE_IF_H */ diff --git a/libs/libruby/ruby/internal/attr/enum_extensibility.h b/libs/libruby/ruby/internal/attr/enum_extensibility.h new file mode 100644 index 0000000..eb0d5b6 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/enum_extensibility.h @@ -0,0 +1,32 @@ +#ifndef RBIMPL_ATTR_ENUM_EXTENSIBILITY_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_ENUM_EXTENSIBILITY_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief #RBIMPL_ATTR_ENUM_EXTENSIBILITY. + */ +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((enum_extensibility))` */ +#if RBIMPL_HAS_ATTRIBUTE(enum_extensibility) +# define RBIMPL_ATTR_ENUM_EXTENSIBILITY(_) __attribute__((__enum_extensibility__(_))) +#else +# define RBIMPL_ATTR_ENUM_EXTENSIBILITY(_) /* void */ +#endif + +#endif /* RBIMPL_ATTR_ENUM_EXTENSIBILITY_H */ diff --git a/libs/libruby/ruby/internal/attr/error.h b/libs/libruby/ruby/internal/attr/error.h new file mode 100644 index 0000000..2ed388a --- /dev/null +++ b/libs/libruby/ruby/internal/attr/error.h @@ -0,0 +1,32 @@ +#ifndef RBIMPL_ATTR_ERROR_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_ERROR_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_ERROR. + */ +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((error))` */ +#if RBIMPL_HAS_ATTRIBUTE(error) +# define RBIMPL_ATTR_ERROR(msg) __attribute__((__error__ msg)) +#else +# define RBIMPL_ATTR_ERROR(msg) /* void */ +#endif + +#endif /* RBIMPL_ATTR_ERROR_H */ diff --git a/libs/libruby/ruby/internal/attr/flag_enum.h b/libs/libruby/ruby/internal/attr/flag_enum.h new file mode 100644 index 0000000..3053d75 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/flag_enum.h @@ -0,0 +1,33 @@ +#ifndef RBIMPL_ATTR_FLAG_ENUM_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_FLAG_ENUM_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_FLAG_ENUM. + * @see https://clang.llvm.org/docs/AttributeReference.html#flag_enum + */ +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((flag_enum)` */ +#if RBIMPL_HAS_ATTRIBUTE(flag_enum) +# define RBIMPL_ATTR_FLAG_ENUM() __attribute__((__flag_enum__)) +#else +# define RBIMPL_ATTR_FLAG_ENUM() /* void */ +#endif + +#endif /* RBIMPLATTR_FLAG_ENUM_H */ diff --git a/libs/libruby/ruby/internal/attr/forceinline.h b/libs/libruby/ruby/internal/attr/forceinline.h new file mode 100644 index 0000000..b7daafe --- /dev/null +++ b/libs/libruby/ruby/internal/attr/forceinline.h @@ -0,0 +1,40 @@ +#ifndef RBIMPL_ATTR_FORCEINLINE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_FORCEINLINE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_FORCEINLINE. + */ +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/has/attribute.h" + +/** + * Wraps (or simulates) `__forceinline`. MSVC complains on declarations like + * `static inline __forceinline void foo()`. It seems MSVC's `inline` and + * `__forceinline` are mutually exclusive. We have to mimic that behaviour for + * non-MSVC compilers. + */ +#if RBIMPL_COMPILER_SINCE(MSVC, 12, 0, 0) +# define RBIMPL_ATTR_FORCEINLINE() __forceinline +#elif RBIMPL_HAS_ATTRIBUTE(always_inline) +# define RBIMPL_ATTR_FORCEINLINE() __attribute__((__always_inline__)) inline +#else +# define RBIMPL_ATTR_FORCEINLINE() inline +#endif + +#endif /* RBIMPL_ATTR_FORCEINLINE_H */ diff --git a/libs/libruby/ruby/internal/attr/format.h b/libs/libruby/ruby/internal/attr/format.h new file mode 100644 index 0000000..b3488ee --- /dev/null +++ b/libs/libruby/ruby/internal/attr/format.h @@ -0,0 +1,38 @@ +#ifndef RBIMPL_ATTR_FORMAT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_FORMAT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_FORMAT. + */ +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((format))` */ +#if RBIMPL_HAS_ATTRIBUTE(format) +# define RBIMPL_ATTR_FORMAT(x, y, z) __attribute__((__format__(x, y, z))) +#else +# define RBIMPL_ATTR_FORMAT(x, y, z) /* void */ +#endif + +#if defined(__MINGW_PRINTF_FORMAT) +# define RBIMPL_PRINTF_FORMAT __MINGW_PRINTF_FORMAT +#else +# define RBIMPL_PRINTF_FORMAT __printf__ +#endif + +#endif /* RBIMPL_ATTR_FORMAT_H */ diff --git a/libs/libruby/ruby/internal/attr/maybe_unused.h b/libs/libruby/ruby/internal/attr/maybe_unused.h new file mode 100644 index 0000000..3ee8be4 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/maybe_unused.h @@ -0,0 +1,38 @@ +#ifndef RBIMPL_ATTR_MAYBE_UNUSED_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_MAYBE_UNUSED_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_MAYBE_UNUSED. + */ +#include "ruby/internal/has/attribute.h" +#include "ruby/internal/has/c_attribute.h" +#include "ruby/internal/has/cpp_attribute.h" + +/** Wraps (or simulates) `[[maybe_unused]]` */ +#if RBIMPL_HAS_CPP_ATTRIBUTE(maybe_unused) +# define RBIMPL_ATTR_MAYBE_UNUSED() [[maybe_unused]] +#elif RBIMPL_HAS_C_ATTRIBUTE(maybe_unused) +# define RBIMPL_ATTR_MAYBE_UNUSED() [[maybe_unused]] +#elif RBIMPL_HAS_ATTRIBUTE(unused) +# define RBIMPL_ATTR_MAYBE_UNUSED() __attribute__((__unused__)) +#else +# define RBIMPL_ATTR_MAYBE_UNUSED() /* void */ +#endif + +#endif /* RBIMPL_ATTR_MAYBE_UNUSED */ diff --git a/libs/libruby/ruby/internal/attr/noalias.h b/libs/libruby/ruby/internal/attr/noalias.h new file mode 100644 index 0000000..0790ef6 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/noalias.h @@ -0,0 +1,69 @@ +#ifndef RBIMPL_ATTR_NOALIAS_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_NOALIAS_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_NOALIAS. + * + * ### Q&A ### + * + * - Q: There are seemingly similar attributes named #RBIMPL_ATTR_CONST, + * #RBIMPL_ATTR_PURE, and #RBIMPL_ATTR_NOALIAS. What are the difference? + * + * - A: Allowed operations are different. + * + * - #RBIMPL_ATTR_CONST ... Functions attributed by this are not allowed to + * read/write _any_ pointers at all (there are exceptional situations + * when reading a pointer is possible but forget that; they are too + * exceptional to be useful). Just remember that everything pointer- + * related are NG. + * + * - #RBIMPL_ATTR_PURE ... Functions attributed by this can read any + * nonvolatile pointers, but no writes are allowed at all. The ability + * to read _any_ nonvolatile pointers makes it possible to mark ::VALUE- + * taking functions as being pure, as long as they are read-only. + * + * - #RBIMPL_ATTR_NOALIAS ... Can both read/write, but only through + * pointers passed to the function as parameters. This is a typical + * situation when you create a C++ non-static member function which only + * concerns `this`. No global variables are allowed to read/write. So + * this is not a super-set of being pure. If you want to read something, + * that has to be passed to the function as a pointer. ::VALUE -taking + * functions thus cannot be attributed as such. + */ +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/has/declspec_attribute.h" + +/** Wraps (or simulates) `__declspec((noalias))` */ +#if RBIMPL_COMPILER_BEFORE(Clang, 12, 0, 0) +# /* +# * `::llvm::Attribute::ArgMemOnly` was buggy before. Maybe because nobody +# * actually seriously used it. It seems they somehow mitigated the situation +# * in LLVM 12. Still not found the exact changeset which fiexed the +# * attribute, though. +# * +# * :FIXME: others (armclang, xlclang, ...) can also be affected? +# */ +# define RBIMPL_ATTR_NOALIAS() /* void */ +#elif RBIMPL_HAS_DECLSPEC_ATTRIBUTE(noalias) +# define RBIMPL_ATTR_NOALIAS() __declspec(noalias) +#else +# define RBIMPL_ATTR_NOALIAS() /* void */ +#endif + +#endif /* RBIMPL_ATTR_NOALIAS_H */ diff --git a/libs/libruby/ruby/internal/attr/nodiscard.h b/libs/libruby/ruby/internal/attr/nodiscard.h new file mode 100644 index 0000000..c3ae118 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/nodiscard.h @@ -0,0 +1,45 @@ +#ifndef RBIMPL_ATTR_NODISCARD_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_NODISCARD_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_NODISCARD. + */ +#include "ruby/internal/has/attribute.h" +#include "ruby/internal/has/c_attribute.h" +#include "ruby/internal/has/cpp_attribute.h" + +/** + * Wraps (or simulates) `[[nodiscard]]`. In C++ (at least since C++20) a + * nodiscard attribute can have a message why the result shall not be ignored. + * However GCC attribute and SAL annotation cannot take them. + */ +#if RBIMPL_HAS_CPP_ATTRIBUTE(nodiscard) +# define RBIMPL_ATTR_NODISCARD() [[nodiscard]] +#elif RBIMPL_HAS_C_ATTRIBUTE(nodiscard) +# define RBIMPL_ATTR_NODISCARD() [[nodiscard]] +#elif RBIMPL_HAS_ATTRIBUTE(warn_unused_result) +# define RBIMPL_ATTR_NODISCARD() __attribute__((__warn_unused_result__)) +#elif defined(_Check_return_) +# /* Take SAL definition. */ +# define RBIMPL_ATTR_NODISCARD() _Check_return_ +#else +# define RBIMPL_ATTR_NODISCARD() /* void */ +#endif + +#endif /* RBIMPL_ATTR_NODISCARD_H */ diff --git a/libs/libruby/ruby/internal/attr/noexcept.h b/libs/libruby/ruby/internal/attr/noexcept.h new file mode 100644 index 0000000..ea3001d --- /dev/null +++ b/libs/libruby/ruby/internal/attr/noexcept.h @@ -0,0 +1,91 @@ +#ifndef RBIMPL_ATTR_NOEXCEPT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_NOEXCEPT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_NOEXCEPT. + * + * This isn't actually an attribute in C++ but who cares... + * + * Mainly due to aesthetic reasons, this one is rarely used in the project. + * But can be handy on occasions, especially when a function's noexcept-ness + * depends on its calling functions. + * + * ### Q&A ### + * + * - Q: Can a function that raises Ruby exceptions be attributed `noexcept`? + * + * - A: Yes. `noexcept` is about C++ exceptions, not Ruby's. They don't + * interface each other. You can safely attribute a function that raises + * Ruby exceptions as `noexcept`. + * + * - Q: How, then, can I assert that a function I wrote doesn't raise any Ruby + * exceptions? + * + * - A: `__attribute__((__leaf__))` is for that purpose. A function attributed + * as leaf can still throw C++ exceptions, but not Ruby's. Note however, + * that it's extremely difficult -- if not impossible -- to assert that a + * function doesn't raise any Ruby exceptions at all. Use of that + * attribute is not recommended; mere mortals can't properly use that by + * hand. + * + * - Q: Does it make sense to attribute an inline function `noexcept`? + * + * - A: I thought so before. But no, I don't think they are useful any longer. + * + * - When an inline function attributed `noexcept` actually doesn't throw + * any exceptions at all: these days I don't see any difference in + * generated assembly by adding/removing this attribute. C++ compilers + * get smarter and smarter. Today they can infer if it actually throws + * or not without any annotations by humans (correct me if I'm wrong). + * + * - When an inline function attributed `noexcepr` actually _does_ throw an + * exception: they have to call `std::terminate` then (C++ standard + * mandates so). This means exception handling routines are actually + * enforced, not omitted. This doesn't impact runtime performance (The + * Itanium C++ ABI has zero-cost exception handling), but does impact on + * generated binary size. This is bad. + */ +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/has/feature.h" + +/** Wraps (or simulates) C++11 `noexcept` */ +#if ! defined(__cplusplus) +# /* Doesn't make sense. */ +# define RBIMPL_ATTR_NOEXCEPT(_) /* void */ + +#elif RBIMPL_HAS_FEATURE(cxx_noexcept) +# define RBIMPL_ATTR_NOEXCEPT(_) noexcept(noexcept(_)) + +#elif defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__ +# define RBIMPL_ATTR_NOEXCEPT(_) noexcept(noexcept(_)) + +#elif defined(__INTEL_CXX11_MODE__) +# define RBIMPL_ATTR_NOEXCEPT(_) noexcept(noexcept(_)) + +#elif RBIMPL_COMPILER_SINCE(MSVC, 19, 0, 0) +# define RBIMPL_ATTR_NOEXCEPT(_) noexcept(noexcept(_)) + +#elif __cplusplus >= 201103L +# define RBIMPL_ATTR_NOEXCEPT(_) noexcept(noexcept(_)) + +#else +# define RBIMPL_ATTR_NOEXCEPT(_) /* void */ +#endif + +#endif /* RBIMPL_ATTR_NOEXCEPT_H */ diff --git a/libs/libruby/ruby/internal/attr/noinline.h b/libs/libruby/ruby/internal/attr/noinline.h new file mode 100644 index 0000000..b7605a0 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/noinline.h @@ -0,0 +1,35 @@ +#ifndef RBIMPL_ATTR_NOINLINE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_NOINLINE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_NOINLINE. + */ +#include "ruby/internal/has/attribute.h" +#include "ruby/internal/has/declspec_attribute.h" + +/** Wraps (or simulates) `__declspec(noinline)` */ +#if RBIMPL_HAS_DECLSPEC_ATTRIBUTE(noinline) +# define RBIMPL_ATTR_NOINLINE() __declspec(noinline) +#elif RBIMPL_HAS_ATTRIBUTE(noinline) +# define RBIMPL_ATTR_NOINLINE() __attribute__((__noinline__)) +#else +# define RBIMPL_ATTR_NOINLINE() /* void */ +#endif + +#endif /* RBIMPL_ATTR_NOINLINE_H */ diff --git a/libs/libruby/ruby/internal/attr/nonnull.h b/libs/libruby/ruby/internal/attr/nonnull.h new file mode 100644 index 0000000..778d5be --- /dev/null +++ b/libs/libruby/ruby/internal/attr/nonnull.h @@ -0,0 +1,34 @@ +#ifndef RBIMPL_ATTR_NONNULL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_NONNULL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_NONNULL. + */ +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((nonnull))` */ +#if RBIMPL_HAS_ATTRIBUTE(nonnull) +# define RBIMPL_ATTR_NONNULL(list) __attribute__((__nonnull__ list)) +# define RBIMPL_NONNULL_ARG(arg) RBIMPL_ASSERT_NOTHING +#else +# define RBIMPL_ATTR_NONNULL(list) /* void */ +# define RBIMPL_NONNULL_ARG(arg) RUBY_ASSERT(arg) +#endif + +#endif /* RBIMPL_ATTR_NONNULL_H */ diff --git a/libs/libruby/ruby/internal/attr/noreturn.h b/libs/libruby/ruby/internal/attr/noreturn.h new file mode 100644 index 0000000..5839212 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/noreturn.h @@ -0,0 +1,48 @@ +#ifndef RBIMPL_ATTR_NORETURN_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_NORETURN_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_NORETURN. + */ +#include "ruby/internal/has/attribute.h" +#include "ruby/internal/has/cpp_attribute.h" +#include "ruby/internal/has/declspec_attribute.h" + +/** Wraps (or simulates) `[[noreturn]]` */ +#if RBIMPL_HAS_DECLSPEC_ATTRIBUTE(noreturn) +# define RBIMPL_ATTR_NORETURN() __declspec(noreturn) + +#elif RBIMPL_HAS_ATTRIBUTE(noreturn) +# define RBIMPL_ATTR_NORETURN() __attribute__((__noreturn__)) + +#elif RBIMPL_HAS_CPP_ATTRIBUTE(noreturn) +# define RBIMPL_ATTR_NORETURN() [[noreturn]] + +#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112) +# define RBIMPL_ATTR_NORETURN() _Noreturn + +#elif defined(_Noreturn) +# /* glibc has this macro. */ +# define RBIMPL_ATTR_NORETURN() _Noreturn + +#else +# define RBIMPL_ATTR_NORETURN() /* void */ +#endif + +#endif /* RBIMPL_ATTR_NORETURN_H */ diff --git a/libs/libruby/ruby/internal/attr/pure.h b/libs/libruby/ruby/internal/attr/pure.h new file mode 100644 index 0000000..015711b --- /dev/null +++ b/libs/libruby/ruby/internal/attr/pure.h @@ -0,0 +1,43 @@ +#ifndef RBIMPL_ATTR_PURE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_PURE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_PURE. + */ +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/has/attribute.h" +#include "ruby/assert.h" + +/** Wraps (or simulates) `__attribute__((pure))` */ +#if RBIMPL_HAS_ATTRIBUTE(pure) +# define RBIMPL_ATTR_PURE() __attribute__((__pure__)) +#elif RBIMPL_COMPILER_SINCE(SunPro, 5, 10, 0) +# define RBIMPL_ATTR_PURE() _Pragma("does_not_write_global_data") +#else +# define RBIMPL_ATTR_PURE() /* void */ +#endif + +/** Enables #RBIMPL_ATTR_PURE if and only if. ! #RUBY_DEBUG. */ +#if !RUBY_DEBUG +# define RBIMPL_ATTR_PURE_UNLESS_DEBUG() RBIMPL_ATTR_PURE() +#else +# define RBIMPL_ATTR_PURE_UNLESS_DEBUG() /* void */ +#endif + +#endif /* RBIMPL_ATTR_PURE_H */ diff --git a/libs/libruby/ruby/internal/attr/restrict.h b/libs/libruby/ruby/internal/attr/restrict.h new file mode 100644 index 0000000..e391041 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/restrict.h @@ -0,0 +1,44 @@ +#ifndef RBIMPL_ATTR_RESTRICT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_RESTRICT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_RESTRICT. + */ +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/has/attribute.h" + +/* :FIXME: config.h includes conflicting `#define restrict`. MSVC can be + * detected using `RBIMPL_COMPILER_SINCE()`, but Clang & family cannot use + * `__has_declspec_attribute()` which involves macro substitution. */ + +/** Wraps (or simulates) `__declspec(restrict)` */ +#if RBIMPL_COMPILER_SINCE(MSVC, 14, 0, 0) +# define RBIMPL_ATTR_RESTRICT() __declspec(re ## strict) + +#elif RBIMPL_HAS_ATTRIBUTE(malloc) +# define RBIMPL_ATTR_RESTRICT() __attribute__((__malloc__)) + +#elif RBIMPL_COMPILER_SINCE(SunPro, 5, 10, 0) +# define RBIMPL_ATTR_RESTRICT() _Pragma("returns_new_memory") + +#else +# define RBIMPL_ATTR_RESTRICT() /* void */ +#endif + +#endif /* RBIMPL_ATTR_RESTRICT_H */ diff --git a/libs/libruby/ruby/internal/attr/returns_nonnull.h b/libs/libruby/ruby/internal/attr/returns_nonnull.h new file mode 100644 index 0000000..5d6f1d1 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/returns_nonnull.h @@ -0,0 +1,37 @@ +#ifndef RBIMPL_ATTR_RETURNS_NONNULL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_RETURNS_NONNULL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_RETURNS_NONNULL. + */ +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((returns_nonnull))` */ +#if defined(_Ret_nonnull_) +# /* Take SAL definition. */ +# define RBIMPL_ATTR_RETURNS_NONNULL() _Ret_nonnull_ + +#elif RBIMPL_HAS_ATTRIBUTE(returns_nonnull) +# define RBIMPL_ATTR_RETURNS_NONNULL() __attribute__((__returns_nonnull__)) + +#else +# define RBIMPL_ATTR_RETURNS_NONNULL() /* void */ +#endif + +#endif /* RBIMPL_ATTR_RETURNS_NONNULL_H */ diff --git a/libs/libruby/ruby/internal/attr/warning.h b/libs/libruby/ruby/internal/attr/warning.h new file mode 100644 index 0000000..e5ced26 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/warning.h @@ -0,0 +1,32 @@ +#ifndef RBIMPL_ATTR_WARNING_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_WARNING_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_WARNING. + */ +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((warning))` */ +#if RBIMPL_HAS_ATTRIBUTE(warning) +# define RBIMPL_ATTR_WARNING(msg) __attribute__((__warning__ msg)) +#else +# define RBIMPL_ATTR_WARNING(msg) /* void */ +#endif + +#endif /* RBIMPL_ATTR_WARNING_H */ diff --git a/libs/libruby/ruby/internal/attr/weakref.h b/libs/libruby/ruby/internal/attr/weakref.h new file mode 100644 index 0000000..f118bb6 --- /dev/null +++ b/libs/libruby/ruby/internal/attr/weakref.h @@ -0,0 +1,32 @@ +#ifndef RBIMPL_ATTR_WEAKREF_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ATTR_WEAKREF_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ATTR_WEAKREF. + */ +#include "ruby/internal/has/attribute.h" + +/** Wraps (or simulates) `__attribute__((weakref))` */ +#if RBIMPL_HAS_ATTRIBUTE(weakref) +# define RBIMPL_ATTR_WEAKREF(sym) __attribute__((__weakref__(# sym))) +#else +# define RBIMPL_ATTR_WEAKREF(sym) /* void */ +#endif + +#endif /* RBIMPL_ATTR_WEAKREF_H */ diff --git a/libs/libruby/ruby/internal/cast.h b/libs/libruby/ruby/internal/cast.h new file mode 100644 index 0000000..a31fddb --- /dev/null +++ b/libs/libruby/ruby/internal/cast.h @@ -0,0 +1,50 @@ +#ifndef RBIMPL_CAST_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_CAST_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines RBIMPL_CAST. + * + * This casting macro makes sense only inside of other macros that are part of + * public headers. They could be used from C++, and C-style casts could issue + * warnings. Ruby internals are pure C so they should not bother. + */ +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/has/warning.h" +#include "ruby/internal/warning_push.h" + +#if ! defined(__cplusplus) +# define RBIMPL_CAST(expr) (expr) + +#elif RBIMPL_COMPILER_SINCE(GCC, 4, 6, 0) +# /* g++ has -Wold-style-cast since 1997 or so, but its _Pragma is broken. */ +# /* See https://gcc.godbolt.org/z/XWhU6J */ +# define RBIMPL_CAST(expr) (expr) +# pragma GCC diagnostic ignored "-Wold-style-cast" + +#elif RBIMPL_HAS_WARNING("-Wold-style-cast") +# define RBIMPL_CAST(expr) \ + RBIMPL_WARNING_PUSH() \ + RBIMPL_WARNING_IGNORED(-Wold-style-cast) \ + (expr) \ + RBIMPL_WARNING_POP() + +#else +# define RBIMPL_CAST(expr) (expr) +#endif + +#endif /* RBIMPL_CAST_H */ diff --git a/libs/libruby/ruby/internal/compiler_is.h b/libs/libruby/ruby/internal/compiler_is.h new file mode 100644 index 0000000..7070b03 --- /dev/null +++ b/libs/libruby/ruby/internal/compiler_is.h @@ -0,0 +1,45 @@ +#ifndef RBIMPL_COMPILER_IS_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_COMPILER_IS_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_COMPILER_IS. + */ + +/** + * @brief Checks if the compiler is of given brand. + * @param cc Compiler brand, like `MSVC`. + * @retval true It is. + * @retval false It isn't. + */ +#define RBIMPL_COMPILER_IS(cc) RBIMPL_COMPILER_IS_ ## cc + +#include "ruby/internal/compiler_is/apple.h" +#include "ruby/internal/compiler_is/clang.h" +#include "ruby/internal/compiler_is/gcc.h" +#include "ruby/internal/compiler_is/intel.h" +#include "ruby/internal/compiler_is/msvc.h" +#include "ruby/internal/compiler_is/sunpro.h" +/* :TODO: Other possible compilers to support: + * + * - IBM XL: recent XL are clang-backended so some tweaks like we do for + * Apple's might be needed. + * + * - ARM's armclang: ditto, it can be clang-backended. */ + +#endif /* RBIMPL_COMPILER_IS_H */ diff --git a/libs/libruby/ruby/internal/compiler_is/apple.h b/libs/libruby/ruby/internal/compiler_is/apple.h new file mode 100644 index 0000000..a81f1f2 --- /dev/null +++ b/libs/libruby/ruby/internal/compiler_is/apple.h @@ -0,0 +1,40 @@ +#ifndef RBIMPL_COMPILER_IS_APPLE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_COMPILER_IS_APPLE_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines RBIMPL_COMPILER_IS_Apple. + * + * Apple ships clang. Problem is, its `__clang_major__` etc. are not the + * upstream LLVM version, but XCode's. We have to think Apple's is distinct + * from LLVM's, when it comes to compiler detection business in this header + * file. + */ +#if ! defined(__clang__) +# define RBIMPL_COMPILER_IS_Apple 0 + +#elif ! defined(__apple_build_version__) +# define RBIMPL_COMPILER_IS_Apple 0 + +#else +# define RBIMPL_COMPILER_IS_Apple 1 +# define RBIMPL_COMPILER_VERSION_MAJOR __clang_major__ +# define RBIMPL_COMPILER_VERSION_MINOR __clang_minor__ +# define RBIMPL_COMPILER_VERSION_PATCH __clang_patchlevel__ +#endif + +#endif /* RBIMPL_COMPILER_IS_APPLE_H */ diff --git a/libs/libruby/ruby/internal/compiler_is/clang.h b/libs/libruby/ruby/internal/compiler_is/clang.h new file mode 100644 index 0000000..169ff78 --- /dev/null +++ b/libs/libruby/ruby/internal/compiler_is/clang.h @@ -0,0 +1,37 @@ +#ifndef RBIMPL_COMPILER_IS_CLANG_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_COMPILER_IS_CLANG_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines RBIMPL_COMPILER_IS_Clang. + */ +#include "ruby/internal/compiler_is/apple.h" + +#if ! defined(__clang__) +# define RBIMPL_COMPILER_IS_Clang 0 + +#elif RBIMPL_COMPILER_IS(Apple) +# define RBIMPL_COMPILER_IS_Clang 0 + +#else +# define RBIMPL_COMPILER_IS_Clang 1 +# define RBIMPL_COMPILER_VERSION_MAJOR __clang_major__ +# define RBIMPL_COMPILER_VERSION_MINOR __clang_minor__ +# define RBIMPL_COMPILER_VERSION_PATCH __clang_patchlevel__ +#endif + +#endif /* RBIMPL_COMPILER_IS_CLANG_H */ diff --git a/libs/libruby/ruby/internal/compiler_is/gcc.h b/libs/libruby/ruby/internal/compiler_is/gcc.h new file mode 100644 index 0000000..accc80e --- /dev/null +++ b/libs/libruby/ruby/internal/compiler_is/gcc.h @@ -0,0 +1,45 @@ +#ifndef RBIMPL_COMPILER_IS_GCC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_COMPILER_IS_GCC_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines RBIMPL_COMPILER_IS_GCC. + */ +#include "ruby/internal/compiler_is/apple.h" +#include "ruby/internal/compiler_is/clang.h" +#include "ruby/internal/compiler_is/intel.h" + +#if ! defined(__GNUC__) +# define RBIMPL_COMPILER_IS_GCC 0 + +#elif RBIMPL_COMPILER_IS(Apple) +# define RBIMPL_COMPILER_IS_GCC 0 + +#elif RBIMPL_COMPILER_IS(Clang) +# define RBIMPL_COMPILER_IS_GCC 0 + +#elif RBIMPL_COMPILER_IS(Intel) +# define RBIMPL_COMPILER_IS_GCC 0 + +#else +# define RBIMPL_COMPILER_IS_GCC 1 +# define RBIMPL_COMPILER_VERSION_MAJOR __GNUC__ +# define RBIMPL_COMPILER_VERSION_MINOR __GNUC_MINOR__ +# define RBIMPL_COMPILER_VERSION_PATCH __GNUC_PATCHLEVEL__ +#endif + +#endif /* RBIMPL_COMPILER_IS_GCC_H */ diff --git a/libs/libruby/ruby/internal/compiler_is/intel.h b/libs/libruby/ruby/internal/compiler_is/intel.h new file mode 100644 index 0000000..377946a --- /dev/null +++ b/libs/libruby/ruby/internal/compiler_is/intel.h @@ -0,0 +1,40 @@ +#ifndef RBIMPL_COMPILER_IS_INTEL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_COMPILER_IS_INTEL_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines RBIMPL_COMPILER_IS_Intel. + */ +#if ! defined(__INTEL_COMPILER) +# define RBIMPL_COMPILER_IS_Intel 0 + +#elif ! defined(__INTEL_COMPILER_UPDATE) +# define RBIMPL_COMPILER_IS_Intel 1 +# /* __INTEL_COMPILER = XXYZ */ +# define RBIMPL_COMPILER_VERSION_MAJOR (__INTEL_COMPILER / 100) +# define RBIMPL_COMPILER_VERSION_MINOR (__INTEL_COMPILER % 100 / 10) +# define RBIMPL_COMPILER_VERSION_PATCH (__INTEL_COMPILER % 10) + +#else +# define RBIMPL_COMPILER_IS_Intel 1 +# /* __INTEL_COMPILER = XXYZ */ +# define RBIMPL_COMPILER_VERSION_MAJOR (__INTEL_COMPILER / 100) +# define RBIMPL_COMPILER_VERSION_MINOR (__INTEL_COMPILER % 100 / 10) +# define RBIMPL_COMPILER_VERSION_PATCH __INTEL_COMPILER_UPDATE +#endif + +#endif /* RBIMPL_COMPILER_IS_INTEL_H */ diff --git a/libs/libruby/ruby/internal/compiler_is/msvc.h b/libs/libruby/ruby/internal/compiler_is/msvc.h new file mode 100644 index 0000000..8a864ea --- /dev/null +++ b/libs/libruby/ruby/internal/compiler_is/msvc.h @@ -0,0 +1,56 @@ +#ifndef RBIMPL_COMPILER_IS_MSVC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_COMPILER_IS_MSVC_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines RBIMPL_COMPILER_IS_MSVC. + */ +#include "ruby/internal/compiler_is/clang.h" +#include "ruby/internal/compiler_is/intel.h" + +#if ! defined(_MSC_VER) +# define RBIMPL_COMPILER_IS_MSVC 0 + +#elif RBIMPL_COMPILER_IS(Clang) +# define RBIMPL_COMPILER_IS_MSVC 0 + +#elif RBIMPL_COMPILER_IS(Intel) +# define RBIMPL_COMPILER_IS_MSVC 0 + +#elif _MSC_VER >= 1400 +# define RBIMPL_COMPILER_IS_MSVC 1 +# /* _MSC_FULL_VER = XXYYZZZZZ */ +# define RBIMPL_COMPILER_VERSION_MAJOR (_MSC_FULL_VER / 10000000) +# define RBIMPL_COMPILER_VERSION_MINOR (_MSC_FULL_VER % 10000000 / 100000) +# define RBIMPL_COMPILER_VERSION_PATCH (_MSC_FULL_VER % 100000) + +#elif defined(_MSC_FULL_VER) +# define RBIMPL_COMPILER_IS_MSVC 1 +# /* _MSC_FULL_VER = XXYYZZZZ */ +# define RBIMPL_COMPILER_VERSION_MAJOR (_MSC_FULL_VER / 1000000) +# define RBIMPL_COMPILER_VERSION_MINOR (_MSC_FULL_VER % 1000000 / 10000) +# define RBIMPL_COMPILER_VERSION_PATCH (_MSC_FULL_VER % 10000) + +#else +# define RBIMPL_COMPILER_IS_MSVC 1 +# /* _MSC_VER = XXYY */ +# define RBIMPL_COMPILER_VERSION_MAJOR (_MSC_VER / 100) +# define RBIMPL_COMPILER_VERSION_MINOR (_MSC_VER % 100) +# define RBIMPL_COMPILER_VERSION_PATCH 0 +#endif + +#endif /* RBIMPL_COMPILER_IS_MSVC_H */ diff --git a/libs/libruby/ruby/internal/compiler_is/sunpro.h b/libs/libruby/ruby/internal/compiler_is/sunpro.h new file mode 100644 index 0000000..c11c845 --- /dev/null +++ b/libs/libruby/ruby/internal/compiler_is/sunpro.h @@ -0,0 +1,54 @@ +#ifndef RBIMPL_COMPILER_IS_SUNPRO_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_COMPILER_IS_SUNPRO_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines RBIMPL_COMPILER_IS_SunPro. + */ +#if ! (defined(__SUNPRO_C) || defined(__SUNPRO_CC)) +# define RBIMPL_COMPILER_IS_SunPro 0 + +#elif defined(__SUNPRO_C) && __SUNPRO_C >= 0x5100 +# define RBIMPL_COMPILER_IS_SunPro 1 +# /* __SUNPRO_C = 0xXYYZ */ +# define RBIMPL_COMPILER_VERSION_MAJOR (__SUNPRO_C >> 12) +# define RBIMPL_COMPILER_VERSION_MINOR ((__SUNPRO_C >> 8 & 0xF) * 10 + (__SUNPRO_C >> 4 & 0xF)) +# define RBIMPL_COMPILER_VERSION_PATCH (__SUNPRO_C & 0xF) + +#elif defined(__SUNPRO_CC) && __SUNPRO_CC >= 0x5100 +# define RBIMPL_COMPILER_IS_SunPro 1 +# /* __SUNPRO_CC = 0xXYYZ */ +# define RBIMPL_COMPILER_VERSION_MAJOR (__SUNPRO_CC >> 12) +# define RBIMPL_COMPILER_VERSION_MINOR ((__SUNPRO_CC >> 8 & 0xF) * 10 + (__SUNPRO_CC >> 4 & 0xF)) +# define RBIMPL_COMPILER_VERSION_PATCH (__SUNPRO_CC & 0xF) + +#elif defined(__SUNPRO_C) +# define RBIMPL_COMPILER_IS_SunPro 1 +# /* __SUNPRO_C = 0xXYZ */ +# define RBIMPL_COMPILER_VERSION_MAJOR (__SUNPRO_C >> 8) +# define RBIMPL_COMPILER_VERSION_MINOR (__SUNPRO_C >> 4 & 0xF) +# define RBIMPL_COMPILER_VERSION_PATCH (__SUNPRO_C & 0xF) + +#else +# define RBIMPL_COMPILER_IS_SunPro 1 +# /* __SUNPRO_CC = 0xXYZ */ +# define RBIMPL_COMPILER_VERSION_MAJOR (__SUNPRO_CC >> 8) +# define RBIMPL_COMPILER_VERSION_MINOR (__SUNPRO_CC >> 4 & 0xF) +# define RBIMPL_COMPILER_VERSION_PATCH (__SUNPRO_CC & 0xF) +#endif + +#endif /* RBIMPL_COMPILER_IS_SUNPRO_H */ diff --git a/libs/libruby/ruby/internal/compiler_since.h b/libs/libruby/ruby/internal/compiler_since.h new file mode 100644 index 0000000..1929032 --- /dev/null +++ b/libs/libruby/ruby/internal/compiler_since.h @@ -0,0 +1,61 @@ +#ifndef RBIMPL_COMPILER_SINCE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_COMPILER_SINCE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_COMPILER_SINCE. + */ +#include "ruby/internal/compiler_is.h" + +/** + * @brief Checks if the compiler is of given brand and is newer than or equal + * to the passed version. + * @param cc Compiler brand, like `MSVC`. + * @param x Major version. + * @param y Minor version. + * @param z Patchlevel. + * @retval true cc >= x.y.z. + * @retval false otherwise. + */ +#define RBIMPL_COMPILER_SINCE(cc, x, y, z) \ + (RBIMPL_COMPILER_IS(cc) && \ + ((RBIMPL_COMPILER_VERSION_MAJOR > (x)) || \ + ((RBIMPL_COMPILER_VERSION_MAJOR == (x)) && \ + ((RBIMPL_COMPILER_VERSION_MINOR > (y)) || \ + ((RBIMPL_COMPILER_VERSION_MINOR == (y)) && \ + (RBIMPL_COMPILER_VERSION_PATCH >= (z))))))) + +/** + * @brief Checks if the compiler is of given brand and is older than the + * passed version. + * @param cc Compiler brand, like `MSVC`. + * @param x Major version. + * @param y Minor version. + * @param z Patchlevel. + * @retval true cc < x.y.z. + * @retval false otherwise. + */ +#define RBIMPL_COMPILER_BEFORE(cc, x, y, z) \ + (RBIMPL_COMPILER_IS(cc) && \ + ((RBIMPL_COMPILER_VERSION_MAJOR < (x)) || \ + ((RBIMPL_COMPILER_VERSION_MAJOR == (x)) && \ + ((RBIMPL_COMPILER_VERSION_MINOR < (y)) || \ + ((RBIMPL_COMPILER_VERSION_MINOR == (y)) && \ + (RBIMPL_COMPILER_VERSION_PATCH < (z))))))) + +#endif /* RBIMPL_COMPILER_SINCE_H */ diff --git a/libs/libruby/ruby/internal/config.h b/libs/libruby/ruby/internal/config.h new file mode 100644 index 0000000..99d0fef --- /dev/null +++ b/libs/libruby/ruby/internal/config.h @@ -0,0 +1,155 @@ +#ifndef RBIMPL_CONFIG_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_CONFIG_H +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Thin wrapper to ruby/config.h + */ +#include "ruby/config.h" + +#ifdef RUBY_EXTCONF_H +#include RUBY_EXTCONF_H +#endif + +#include "ruby/internal/compiler_since.h" + +#undef HAVE_PROTOTYPES +#define HAVE_PROTOTYPES 1 + +#undef HAVE_STDARG_PROTOTYPES +#define HAVE_STDARG_PROTOTYPES 1 + +#undef TOKEN_PASTE +#define TOKEN_PASTE(x, y) x##y + +#if defined(__cplusplus) +#/* __builtin_choose_expr and __builtin_types_compatible aren't available +# * on C++. See https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html */ +#undef HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P +#undef HAVE_BUILTIN___BUILTIN_TYPES_COMPATIBLE_P + +/* HAVE_VA_ARGS_MACRO is for C. C++ situations might be different. */ +#undef HAVE_VA_ARGS_MACRO +#if __cplusplus >= 201103L +#define HAVE_VA_ARGS_MACRO +#elif defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__ +#define HAVE_VA_ARGS_MACRO +#elif defined(__INTEL_CXX11_MODE__) +#define HAVE_VA_ARGS_MACRO +#elif RBIMPL_COMPILER_SINCE(MSVC, 16, 0, 0) +#define HAVE_VA_ARGS_MACRO +#else +#/* NG, not known. */ +#endif +#endif + +#if RBIMPL_COMPILER_BEFORE(GCC, 4, 9, 0) +#/* See https://bugs.ruby-lang.org/issues/14221 */ +#undef HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P +#endif + +#if RBIMPL_COMPILER_BEFORE(GCC, 5, 0, 0) +#/* GCC 4.9.2 reportedly has this feature and is broken. The function is not +# * officially documented below. Seems we should not use it. +# * https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Other-Builtins.html */ +#undef HAVE_BUILTIN___BUILTIN_ALLOCA_WITH_ALIGN +#endif + +#if defined(__SUNPRO_CC) +#/* Oracle Developer Studio 12.5: GCC compatibility guide says it supports +# * statement expressions. But to our knowledge they support the extension +# * only for C and not for C++. Prove me wrong. Am happy to support them if +# * there is a way. */ +#undef HAVE_STMT_AND_DECL_IN_EXPR +#endif + +#ifndef STRINGIZE0 +#define STRINGIZE(expr) STRINGIZE0(expr) +#define STRINGIZE0(expr) #expr +#endif + +#ifdef AC_APPLE_UNIVERSAL_BUILD +#undef WORDS_BIGENDIAN +#ifdef __BIG_ENDIAN__ +#define WORDS_BIGENDIAN +#endif +#endif + +#ifndef DLEXT_MAXLEN +#define DLEXT_MAXLEN 4 +#endif + +#ifndef RUBY_PLATFORM +#define RUBY_PLATFORM "unknown-unknown" +#endif + +#ifdef UNALIGNED_WORD_ACCESS +#/* Take that. */ +#elif defined(__i386) +#define UNALIGNED_WORD_ACCESS 1 +#elif defined(__i386__) +#define UNALIGNED_WORD_ACCESS 1 +#elif defined(_M_IX86) +#define UNALIGNED_WORD_ACCESS 1 +#elif defined(__x86_64) +#define UNALIGNED_WORD_ACCESS 1 +#elif defined(__x86_64__) +#define UNALIGNED_WORD_ACCESS 1 +#elif defined(_M_AMD64) +#define UNALIGNED_WORD_ACCESS 1 +#elif defined(__powerpc64__) +#define UNALIGNED_WORD_ACCESS 1 +#elif defined(__POWERPC__) // __POWERPC__ is defined for ppc and ppc64 on Darwin +#define UNALIGNED_WORD_ACCESS 1 +#elif defined(__aarch64__) +#define UNALIGNED_WORD_ACCESS 1 +#elif defined(__mc68020__) +#define UNALIGNED_WORD_ACCESS 1 +#else +#define UNALIGNED_WORD_ACCESS 0 +#endif + +/* Detection of __VA_OPT__ */ +#if !defined(HAVE_VA_ARGS_MACRO) +#undef HAVE___VA_OPT__ + +#elif defined(__cplusplus) +#if __cplusplus > 201703L +#define HAVE___VA_OPT__ +#else +#undef HAVE___VA_OPT__ +#endif +#else +#/* Idea taken from: https://stackoverflow.com/a/48045656 */ +#define RBIMPL_TEST3(q, w, e, ...) e +#define RBIMPL_TEST2(...) RBIMPL_TEST3(__VA_OPT__(, ), 1, 0, 0) +#define RBIMPL_TEST1() RBIMPL_TEST2("ruby") +#if RBIMPL_TEST1() +#define HAVE___VA_OPT__ +#else +#undef HAVE___VA_OPT__ +#endif +#undef RBIMPL_TEST1 +#undef RBIMPL_TEST2 +#undef RBIMPL_TEST3 +#endif /* HAVE_VA_ARGS_MACRO */ + +#ifndef USE_RVARGC +#define USE_RVARGC 1 +#endif + +#endif /* RBIMPL_CONFIG_H */ diff --git a/libs/libruby/ruby/internal/constant_p.h b/libs/libruby/ruby/internal/constant_p.h new file mode 100644 index 0000000..92d69cb --- /dev/null +++ b/libs/libruby/ruby/internal/constant_p.h @@ -0,0 +1,38 @@ +#ifndef RBIMPL_CONSTANT_P_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_CONSTANT_P_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_CONSTANT_P. + * + * Note that __builtin_constant_p can be applicable inside of inline functions, + * according to GCC manual. Clang lacks that feature, though. + * + * @see https://bugs.llvm.org/show_bug.cgi?id=4898 + * @see https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html + */ +#include "ruby/internal/has/builtin.h" + +/** Wraps (or simulates) `__builtin_constant_p` */ +#if RBIMPL_HAS_BUILTIN(__builtin_constant_p) +# define RBIMPL_CONSTANT_P(expr) __builtin_constant_p(expr) +#else +# define RBIMPL_CONSTANT_P(expr) 0 +#endif + +#endif /* RBIMPL_CONSTANT_P_H */ diff --git a/libs/libruby/ruby/internal/core.h b/libs/libruby/ruby/internal/core.h new file mode 100644 index 0000000..3f4561c --- /dev/null +++ b/libs/libruby/ruby/internal/core.h @@ -0,0 +1,35 @@ +#ifndef RBIMPL_CORE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_CORE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Core data structures, definitions and manipulations. + */ +#include "ruby/internal/core/rarray.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/core/rbignum.h" +#include "ruby/internal/core/rclass.h" +#include "ruby/internal/core/rdata.h" +#include "ruby/internal/core/rfile.h" +#include "ruby/internal/core/rhash.h" +#include "ruby/internal/core/robject.h" +#include "ruby/internal/core/rregexp.h" +#include "ruby/internal/core/rstring.h" +#include "ruby/internal/core/rstruct.h" +#include "ruby/internal/core/rtypeddata.h" +#endif /* RBIMPL_CORE_H */ diff --git a/libs/libruby/ruby/internal/core/rarray.h b/libs/libruby/ruby/internal/core/rarray.h new file mode 100644 index 0000000..c3bb40b --- /dev/null +++ b/libs/libruby/ruby/internal/core/rarray.h @@ -0,0 +1,585 @@ +#ifndef RBIMPL_RARRAY_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RARRAY_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines struct ::RArray. + */ +#include "ruby/internal/arithmetic/long.h" +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/constexpr.h" +#include "ruby/internal/attr/maybe_unused.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/fl_type.h" +#include "ruby/internal/rgengc.h" +#include "ruby/internal/stdbool.h" +#include "ruby/internal/value.h" +#include "ruby/internal/value_type.h" +#include "ruby/assert.h" + +/** + * @private + * @warning Do not touch this macro. + * @warning It is an implementation detail. + * @warning The value of this macro must match for ruby itself and all + * extension libraries, otherwise serious memory corruption shall + * occur. + */ +#ifndef USE_TRANSIENT_HEAP +# define USE_TRANSIENT_HEAP 1 +#endif + +/** + * Convenient casting macro. + * + * @param obj An object, which is in fact an ::RArray. + * @return The passed object casted to ::RArray. + */ +#define RARRAY(obj) RBIMPL_CAST((struct RArray *)(obj)) +/** @cond INTERNAL_MACRO */ +#define RARRAY_EMBED_FLAG RARRAY_EMBED_FLAG +#define RARRAY_EMBED_LEN_MASK RARRAY_EMBED_LEN_MASK +#define RARRAY_EMBED_LEN_MAX RARRAY_EMBED_LEN_MAX +#define RARRAY_EMBED_LEN_SHIFT RARRAY_EMBED_LEN_SHIFT +#if USE_TRANSIENT_HEAP +# define RARRAY_TRANSIENT_FLAG RARRAY_TRANSIENT_FLAG +#else +# define RARRAY_TRANSIENT_FLAG 0 +#endif +/** @endcond */ +#define RARRAY_LEN rb_array_len /**< @alias{rb_array_len} */ +#define RARRAY_CONST_PTR rb_array_const_ptr /**< @alias{rb_array_const_ptr} */ +#define RARRAY_CONST_PTR_TRANSIENT rb_array_const_ptr_transient /**< @alias{rb_array_const_ptr_transient} */ + +/** @cond INTERNAL_MACRO */ +#if defined(__fcc__) || defined(__fcc_version) || \ + defined(__FCC__) || defined(__FCC_VERSION) +/* workaround for old version of Fujitsu C Compiler (fcc) */ +# define FIX_CONST_VALUE_PTR(x) ((const VALUE *)(x)) +#else +# define FIX_CONST_VALUE_PTR(x) (x) +#endif + +#define RARRAY_EMBED_LEN RARRAY_EMBED_LEN +#define RARRAY_LENINT RARRAY_LENINT +#define RARRAY_TRANSIENT_P RARRAY_TRANSIENT_P +#define RARRAY_ASET RARRAY_ASET +#define RARRAY_PTR RARRAY_PTR +/** @endcond */ + +/** + * @private + * + * Bits that you can set to ::RBasic::flags. + * + * @warning These enums are not the only bits we use for arrays. + * + * @internal + * + * Unlike strings, flag usages for arrays are scattered across the entire + * source codes. @shyouhei doesn't know the complete list. But what is listed + * here is at least incomplete. + */ +enum ruby_rarray_flags { + /** + * This flag has something to do with memory footprint. If the array is + * "small" enough, ruby tries to be creative to abuse padding bits of + * struct ::RArray for storing its contents. This flag denotes that + * situation. + * + * @warning This bit has to be considered read-only. Setting/clearing + * this bit without corresponding fix up must cause immediate + * SEGV. Also, internal structures of an array change + * dynamically and transparently throughout of its lifetime. + * Don't assume it being persistent. + * + * @internal + * + * 3rd parties must not be aware that there even is more than one way to + * store array elements. It was a bad idea to expose this to them. + */ + RARRAY_EMBED_FLAG = RUBY_FL_USER1, + + /* RUBY_FL_USER2 is for ELTS_SHARED */ + + /** + * When an array employs embedded strategy (see ::RARRAY_EMBED_FLAG), these + * bits are used to store the number of elements actually filled into + * ::RArray::ary. + * + * @internal + * + * 3rd parties must not be aware that there even is more than one way to + * store array elements. It was a bad idea to expose this to them. + */ +#if USE_RVARGC + RARRAY_EMBED_LEN_MASK = RUBY_FL_USER9 | RUBY_FL_USER8 | RUBY_FL_USER7 | RUBY_FL_USER6 | + RUBY_FL_USER5 | RUBY_FL_USER4 | RUBY_FL_USER3 +#else + RARRAY_EMBED_LEN_MASK = RUBY_FL_USER4 | RUBY_FL_USER3 +#endif + +#if USE_TRANSIENT_HEAP + , + + /** + * This flag has something to do with an array's "transiency". A transient + * array is an array of young generation (of generational GC), who stores + * its elements inside of dedicated memory pages called a transient heap. + * Not every young generation share that storage scheme, but elder + * generations must no join. + * + * @internal + * + * 3rd parties must not be aware that there even is more than one way to + * store array elements. It was a bad idea to expose this to them. + */ + RARRAY_TRANSIENT_FLAG = RUBY_FL_USER13 +#endif +}; + +/** + * This is an enum because GDB wants it (rather than a macro). People need not + * bother. + */ +enum ruby_rarray_consts { + /** Where ::RARRAY_EMBED_LEN_MASK resides. */ + RARRAY_EMBED_LEN_SHIFT = RUBY_FL_USHIFT + 3 + +#if !USE_RVARGC + , + + /** Max possible number elements that can be embedded. */ + RARRAY_EMBED_LEN_MAX = RBIMPL_EMBED_LEN_MAX_OF(VALUE) +#endif +}; + +/** Ruby's array. */ +struct RArray { + + /** Basic part, including flags and class. */ + struct RBasic basic; + + /** Array's specific fields. */ + union { + + /** + * Arrays that use separated memory region for elements use this + * pattern. + */ + struct { + + /** Number of elements of the array. */ + long len; + + /** Auxiliary info. */ + union { + + /** + * Capacity of `*ptr`. A continuous memory region of at least + * `capa` elements is expected to exist at `*ptr`. This can be + * bigger than `len`. + */ + long capa; + + /** + * Parent of the array. Nowadays arrays can share their + * backend memory regions each other, constructing gigantic + * nest of objects. This situation is called "shared", and + * this is the field to control such properties. + */ +#if defined(__clang__) /* <- clang++ is sane */ || \ + !defined(__cplusplus) /* <- C99 is sane */ || \ + (__cplusplus > 199711L) /* <- C++11 is sane */ + const +#endif + VALUE shared_root; + } aux; + + /** + * Pointer to the C array that holds the elements of the array. In + * the old days each array had dedicated memory regions. That is + * no longer true today, but there still are arrays of such + * properties. This field could be used to point such things. + */ + const VALUE *ptr; + } heap; + + /** + * Embedded elements. When an array is short enough, it uses this area + * to store its elements. In this case the length is encoded into the + * flags. + */ +#if USE_RVARGC + /* This is a length 1 array because: + * 1. GCC has a bug that does not optimize C flexible array members + * (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102452) + * 2. Zero length arrays are not supported by all compilers + */ + const VALUE ary[1]; +#else + const VALUE ary[RARRAY_EMBED_LEN_MAX]; +#endif + } as; +}; + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * @private + * + * Declares a section of code where raw pointers are used. This is an + * implementation detail of #RARRAY_PTR_USE. People don't use it directly. + * + * @param[in] ary An object of ::RArray. + * @return `ary`'s backend C array. + */ +VALUE *rb_ary_ptr_use_start(VALUE ary); + +/** + * @private + * + * Declares an end of a section formerly started by rb_ary_ptr_use_start(). + * This is an implementation detail of #RARRAY_PTR_USE. People don't use it + * directly. + * + * @param[in] a An object of ::RArray. + */ +void rb_ary_ptr_use_end(VALUE a); + +#if USE_TRANSIENT_HEAP +/** + * Destructively converts an array of transient backend into ordinal one. + * + * @param[out] a An object of ::RArray. + * @pre `a` must be a transient array. + * @post `a` gets out of transient heap, destructively. + */ +void rb_ary_detransient(VALUE a); +#endif +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries the length of the array. + * + * @param[in] ary Array in question. + * @return Its number of elements. + * @pre `ary` must be an instance of ::RArray, and must has its + * ::RARRAY_EMBED_FLAG flag set. + * + * @internal + * + * This was a macro before. It was inevitable to be public, since macros are + * global constructs. But should it be forever? Now that it is a function, + * @shyouhei thinks it could just be eliminated, hidden into implementation + * details. + */ +static inline long +RARRAY_EMBED_LEN(VALUE ary) +{ + RBIMPL_ASSERT_TYPE(ary, RUBY_T_ARRAY); + RBIMPL_ASSERT_OR_ASSUME(RB_FL_ANY_RAW(ary, RARRAY_EMBED_FLAG)); + + VALUE f = RBASIC(ary)->flags; + f &= RARRAY_EMBED_LEN_MASK; + f >>= RARRAY_EMBED_LEN_SHIFT; + return RBIMPL_CAST((long)f); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +/** + * Queries the length of the array. + * + * @param[in] a Array in question. + * @return Its number of elements. + * @pre `a` must be an instance of ::RArray. + */ +static inline long +rb_array_len(VALUE a) +{ + RBIMPL_ASSERT_TYPE(a, RUBY_T_ARRAY); + + if (RB_FL_ANY_RAW(a, RARRAY_EMBED_FLAG)) { + return RARRAY_EMBED_LEN(a); + } + else { + return RARRAY(a)->as.heap.len; + } +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * Identical to rb_array_len(), except it differs for the return type. + * + * @param[in] ary Array in question. + * @exception rb_eRangeError Too long. + * @return Its number of elements. + * @pre `ary` must be an instance of ::RArray. + * + * @internal + * + * This API seems redundant but has actual usages. + */ +static inline int +RARRAY_LENINT(VALUE ary) +{ + return rb_long2int(RARRAY_LEN(ary)); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries if the array is a transient array. + * + * @param[in] ary Array in question. + * @retval true Yes it is. + * @retval false No it isn't. + * @pre `ary` must be an instance of ::RArray. + * + * @internal + * + * @shyouhei doesn't understand the benefit of this function called from + * extension libraries. + */ +static inline bool +RARRAY_TRANSIENT_P(VALUE ary) +{ + RBIMPL_ASSERT_TYPE(ary, RUBY_T_ARRAY); + +#if USE_TRANSIENT_HEAP + return RB_FL_ANY_RAW(ary, RARRAY_TRANSIENT_FLAG); +#else + return false; +#endif +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +/** + * @private + * + * This is an implementation detail of RARRAY_PTR(). People do not use it + * directly. + * + * @param[in] a An object of ::RArray. + * @return Its backend storage. + */ +static inline const VALUE * +rb_array_const_ptr_transient(VALUE a) +{ + RBIMPL_ASSERT_TYPE(a, RUBY_T_ARRAY); + + if (RB_FL_ANY_RAW(a, RARRAY_EMBED_FLAG)) { + return FIX_CONST_VALUE_PTR(RARRAY(a)->as.ary); + } + else { + return FIX_CONST_VALUE_PTR(RARRAY(a)->as.heap.ptr); + } +} + +#if ! USE_TRANSIENT_HEAP +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +#endif +/** + * @private + * + * This is an implementation detail of RARRAY_PTR(). People do not use it + * directly. + * + * @param[in] a An object of ::RArray. + * @return Its backend storage. + * @post `a` is not a transient array. + */ +static inline const VALUE * +rb_array_const_ptr(VALUE a) +{ + RBIMPL_ASSERT_TYPE(a, RUBY_T_ARRAY); + +#if USE_TRANSIENT_HEAP + if (RARRAY_TRANSIENT_P(a)) { + rb_ary_detransient(a); + } +#endif + return rb_array_const_ptr_transient(a); +} + +/** + * @private + * + * This is an implementation detail of #RARRAY_PTR_USE. People do not use it + * directly. + * + * @param[in] a An object of ::RArray. + * @param[in] allow_transient Whether `a` can be transient or not. + * @return Its backend storage. + * @post `a` is not a transient array unless `allow_transient`. + */ +static inline VALUE * +rb_array_ptr_use_start(VALUE a, + RBIMPL_ATTR_MAYBE_UNUSED() + int allow_transient) +{ + RBIMPL_ASSERT_TYPE(a, RUBY_T_ARRAY); + +#if USE_TRANSIENT_HEAP + if (!allow_transient) { + if (RARRAY_TRANSIENT_P(a)) { + rb_ary_detransient(a); + } + } +#endif + + return rb_ary_ptr_use_start(a); +} + +/** + * @private + * + * This is an implementation detail of #RARRAY_PTR_USE. People do not use it + * directly. + * + * @param[in] a An object of ::RArray. + * @param[in] allow_transient Whether `a` can be transient or not. + */ +static inline void +rb_array_ptr_use_end(VALUE a, + RBIMPL_ATTR_MAYBE_UNUSED() + int allow_transient) +{ + RBIMPL_ASSERT_TYPE(a, RUBY_T_ARRAY); + rb_ary_ptr_use_end(a); +} + +/** + * @private + * + * This is an implementation detail of #RARRAY_PTR_USE. People do not use it + * directly. + */ +#define RBIMPL_RARRAY_STMT(flag, ary, var, expr) do { \ + RBIMPL_ASSERT_TYPE((ary), RUBY_T_ARRAY); \ + const VALUE rbimpl_ary = (ary); \ + VALUE *var = rb_array_ptr_use_start(rbimpl_ary, (flag)); \ + expr; \ + rb_array_ptr_use_end(rbimpl_ary, (flag)); \ +} while (0) + +/** + * @private + * + * This is an implementation detail of #RARRAY_PTR_USE. People do not use it + * directly. + */ +#define RARRAY_PTR_USE_END(a) rb_array_ptr_use_end(a, 0) + +/** + * Declares a section of code where raw pointers are used. In case you need to + * touch the raw C array instead of polite CAPIs, then that operation shall be + * wrapped using this macro. + * + * ```CXX + * const auto ary = rb_eval_string("[...]"); + * const auto len = RARRAY_LENINT(ary); + * const auto symwrite = rb_intern("write"); + * + * RARRAY_PTR_USE(ary, ptr, { + * rb_funcallv(rb_stdout, symwrite, len, ptr); + * }); + * ``` + * + * @param ary An object of ::RArray. + * @param ptr_name A variable name which points the C array in `expr`. + * @param expr The expression that touches `ptr_name`. + * + * @internal + * + * For historical reasons use of this macro is not enforced. There are + * extension libraries in the wild which call RARRAY_PTR() without it. We want + * them use it... Maybe some transition path can be implemented later. + */ +#define RARRAY_PTR_USE(ary, ptr_name, expr) \ + RBIMPL_RARRAY_STMT(0, ary, ptr_name, expr) + +/** + * Identical to #RARRAY_PTR_USE, except the pointer can be a transient one. + * + * @param ary An object of ::RArray. + * @param ptr_name A variable name which points the C array in `expr`. + * @param expr The expression that touches `ptr_name`. + */ +#define RARRAY_PTR_USE_TRANSIENT(ary, ptr_name, expr) \ + RBIMPL_RARRAY_STMT(1, ary, ptr_name, expr) + +/** + * Wild use of a C pointer. This function accesses the backend storage + * directly. This is slower than #RARRAY_PTR_USE_TRANSIENT. It exercises + * extra manoeuvres to protect our generational GC. Use of this function is + * considered archaic. Use a modern way instead. + * + * @param[in] ary An object of ::RArray. + * @return The backend C array. + * + * @internal + * + * That said... there are extension libraries in the wild who uses it. We + * cannot but continue supporting. + */ +static inline VALUE * +RARRAY_PTR(VALUE ary) +{ + RBIMPL_ASSERT_TYPE(ary, RUBY_T_ARRAY); + + VALUE tmp = RB_OBJ_WB_UNPROTECT_FOR(ARRAY, ary); + return RBIMPL_CAST((VALUE *)RARRAY_CONST_PTR(tmp)); +} + +/** + * Assigns an object in an array. + * + * @param[out] ary Destination array object. + * @param[in] i Index of `ary`. + * @param[in] v Arbitrary ruby object. + * @pre `ary` must be an instance of ::RArray. + * @pre `ary`'s length must be longer than or equal to `i`. + * @pre `i` must be greater than or equal to zero. + * @post `ary`'s `i`th element is set to `v`. + */ +static inline void +RARRAY_ASET(VALUE ary, long i, VALUE v) +{ + RARRAY_PTR_USE_TRANSIENT(ary, ptr, + RB_OBJ_WRITE(ary, &ptr[i], v)); +} + +/** + * @deprecated + * + * :FIXME: we want to convert RARRAY_AREF into an inline function (to add rooms + * for more sanity checks). However there were situations where the address of + * this macro is taken i.e. &RARRAY_AREF(...). They cannot be possible if this + * is not a macro. Such usages are abuse, and we eliminated them internally. + * However we are afraid of similar things to remain in the wild. This macro + * remains as it is due to that. If we could warn such usages we can set a + * transition path, but currently no way is found to do so. + */ +#define RARRAY_AREF(a, i) RARRAY_CONST_PTR_TRANSIENT(a)[i] + +#endif /* RBIMPL_RARRAY_H */ diff --git a/libs/libruby/ruby/internal/core/rbasic.h b/libs/libruby/ruby/internal/core/rbasic.h new file mode 100644 index 0000000..4617f74 --- /dev/null +++ b/libs/libruby/ruby/internal/core/rbasic.h @@ -0,0 +1,158 @@ +#ifndef RBIMPL_RBASIC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RBASIC_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines struct ::RBasic. + */ +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/constexpr.h" +#include "ruby/internal/attr/forceinline.h" +#include "ruby/internal/attr/noalias.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/special_consts.h" +#include "ruby/internal/value.h" +#include "ruby/assert.h" + +/** + * Convenient casting macro. + * + * @param obj Arbitrary Ruby object. + * @return The passed object casted to ::RBasic. + */ +#define RBASIC(obj) RBIMPL_CAST((struct RBasic *)(obj)) +/** @cond INTERNAL_MACRO */ +#define RBASIC_CLASS RBASIC_CLASS +#define RBIMPL_RVALUE_EMBED_LEN_MAX 3 +#define RVALUE_EMBED_LEN_MAX RVALUE_EMBED_LEN_MAX +#define RBIMPL_EMBED_LEN_MAX_OF(T) \ + RBIMPL_CAST((int)(sizeof(VALUE[RBIMPL_RVALUE_EMBED_LEN_MAX]) / (sizeof(T)))) +/** @endcond */ + +/** + * This is an enum because GDB wants it (rather than a macro). People need not + * bother. + */ +enum ruby_rvalue_flags { + /** Max possible number of objects that can be embedded. */ + RVALUE_EMBED_LEN_MAX = RBIMPL_RVALUE_EMBED_LEN_MAX +}; + +/** + * Ruby's object's, base components. Every single ruby objects have them in + * common. + */ +struct +RUBY_ALIGNAS(SIZEOF_VALUE) +RBasic { + + /** + * Per-object flags. Each ruby objects have their own characteristics + * apart from their classes. For instance whether an object is frozen or + * not is not controlled by its class. This is where such properties are + * stored. + * + * @see enum ::ruby_fl_type + * + * @note This is ::VALUE rather than an enum for alignment purpose. Back + * in the 1990s there were no such thing like `_Alignas` in C. + */ + VALUE flags; + + /** + * Class of an object. Every object has its class. Also, everything is an + * object in Ruby. This means classes are also objects. Classes have + * their own classes, classes of classes have their classes, too ... and + * it recursively continues forever. + * + * Also note the `const` qualifier. In ruby an object cannot "change" its + * class. + */ + const VALUE klass; + +#ifdef __cplusplus + public: + RBIMPL_ATTR_CONSTEXPR(CXX11) + RBIMPL_ATTR_ARTIFICIAL() + RBIMPL_ATTR_FORCEINLINE() + RBIMPL_ATTR_NOALIAS() + /** + * We need to define this explicit constructor because the field `klass` is + * const-qualified above, which effectively defines the implicit default + * constructor as "deleted" (as of C++11) -- No way but to define one by + * ourselves. + */ + RBasic() : + flags(RBIMPL_VALUE_NULL), + klass(RBIMPL_VALUE_NULL) + { + } +#endif +}; + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * Make the object invisible from Ruby code. + * + * It is useful to let Ruby's GC manage your internal data structure -- The + * object keeps being managed by GC, but `ObjectSpace.each_object` never yields + * the object. + * + * Note that the object also lose a way to call a method on it. + * + * @param[out] obj A Ruby object. + * @return The passed object. + * @post The object is destructively modified to be invisible. + * @see rb_obj_reveal + */ +VALUE rb_obj_hide(VALUE obj); + +/** + * Make a hidden object visible again. + * + * It is the caller's responsibility to pass the right `klass` which `obj` + * originally used to belong to. + * + * @param[out] obj A Ruby object. + * @param[in] klass Class of `obj`. + * @return Passed `obj`. + * @pre `obj` was previously hidden. + * @post `obj`'s class is `klass`. + * @see rb_obj_hide + */ +VALUE rb_obj_reveal(VALUE obj, VALUE klass); /* do not use this API to change klass information */ +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries the class of an object. + * + * @param[in] obj An object. + * @return Its class. + */ +static inline VALUE +RBASIC_CLASS(VALUE obj) +{ + RBIMPL_ASSERT_OR_ASSUME(! RB_SPECIAL_CONST_P(obj)); + return RBASIC(obj)->klass; +} + +#endif /* RBIMPL_RBASIC_H */ diff --git a/libs/libruby/ruby/internal/core/rbignum.h b/libs/libruby/ruby/internal/core/rbignum.h new file mode 100644 index 0000000..1d31743 --- /dev/null +++ b/libs/libruby/ruby/internal/core/rbignum.h @@ -0,0 +1,80 @@ +#ifndef RBIMPL_RBIGNUM_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RBIGNUM_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines to manipulate struct RBignum. + * @note The struct RBignum itself is opaque. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/value_type.h" +#include "ruby/internal/stdbool.h" + +#define RBIGNUM_SIGN rb_big_sign /**< @alias{rb_big_sign} */ + +/** @cond INTERNAL_MACRO */ +#define RBIGNUM_POSITIVE_P RBIGNUM_POSITIVE_P +#define RBIGNUM_NEGATIVE_P RBIGNUM_NEGATIVE_P +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * The "sign" of a bignum. + * + * @param[in] num An object of RBignum. + * @retval 1 It is greater than or equal to zero. + * @retval 0 It is less than zero. + * + * @internal + * + * Implementation wise, unlike fixnums (which are 2's complement), bignums are + * signed magnitude system. Theoretically it could be possible to have + * negative zero instances. But in reality there is no way to create such + * thing. Nobody ever needed that kind of insanity. + */ +int rb_big_sign(VALUE num); +RBIMPL_SYMBOL_EXPORT_END() + +/** + * Checks if the bignum is positive. + * @param[in] b An object of RBignum. + * @retval false `b` is less than zero. + * @retval true Otherwise. + */ +static inline bool +RBIGNUM_POSITIVE_P(VALUE b) +{ + RBIMPL_ASSERT_TYPE(b, RUBY_T_BIGNUM); + return RBIGNUM_SIGN(b); +} + +/** + * Checks if the bignum is negative. + * @param[in] b An object of RBignum. + * @retval true `b` is less than zero. + * @retval false Otherwise. + */ +static inline bool +RBIGNUM_NEGATIVE_P(VALUE b) +{ + RBIMPL_ASSERT_TYPE(b, RUBY_T_BIGNUM); + return ! RBIGNUM_POSITIVE_P(b); +} + +#endif /* RBIMPL_RBIGNUM_H */ diff --git a/libs/libruby/ruby/internal/core/rclass.h b/libs/libruby/ruby/internal/core/rclass.h new file mode 100644 index 0000000..b0b6bfc --- /dev/null +++ b/libs/libruby/ruby/internal/core/rclass.h @@ -0,0 +1,93 @@ +#ifndef RBIMPL_RCLASS_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RCLASS_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines to manipulate struct RClass. + * @note The struct RClass itself is opaque. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/cast.h" + +/** @cond INTERNAL_MACRO */ +#define RMODULE_IS_REFINEMENT RMODULE_IS_REFINEMENT +/** @endcond */ + +/** + * Convenient casting macro. + * + * @param obj An object, which is in fact an RClass. + * @return The passed object casted to RClass. + */ +#define RCLASS(obj) RBIMPL_CAST((struct RClass *)(obj)) + +/** @alias{RCLASS} */ +#define RMODULE RCLASS + +/** @alias{rb_class_get_superclass} */ +#define RCLASS_SUPER rb_class_get_superclass + +/** + * @private + * + * Bits that you can set to ::RBasic::flags. + * + * @internal + * + * Why is it here, given RClass itself is not? + */ +enum ruby_rmodule_flags { + /** + * This flag has something to do with refinements. A module created using + * rb_mod_refine() has this flag set. This is the bit which controls + * difference between normal inclusion versus refinements. + */ + RMODULE_IS_REFINEMENT = RUBY_FL_USER3 +}; + +struct RClass; /* Opaque, declared here for RCLASS() macro. */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * Returns the superclass of a class. + * @param[in] klass An object of RClass. + * @retval RUBY_Qfalse `klass` has no super class. + * @retval otherwise Raw superclass of `klass` + * @see rb_class_superclass + * + * ### Q&A ### + * + * - Q: How can a class have no super class? + * + * - A: `klass` could be a module. Or it could be ::rb_cBasicObject. + * + * - Q: What do you mean by "raw" superclass? + * + * - A: This is a really good question. The answer is that this function + * returns something different from what you would normally expect. On + * occasions ruby inserts hidden classes in a hierarchy of class + * inheritance behind-the-scene. Such classes are called "iclass"es and + * distinguished using ::RUBY_T_ICLASS in C level. They are truly + * transparent from Ruby level but can be accessed from C, by using this + * API. + */ +VALUE rb_class_get_superclass(VALUE klass); +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_RCLASS_H */ diff --git a/libs/libruby/ruby/internal/core/rdata.h b/libs/libruby/ruby/internal/core/rdata.h new file mode 100644 index 0000000..43ab3c0 --- /dev/null +++ b/libs/libruby/ruby/internal/core/rdata.h @@ -0,0 +1,386 @@ +#ifndef RBIMPL_RDATA_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RDATA_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines struct ::RData. + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#include "ruby/internal/attr/deprecated.h" +#include "ruby/internal/attr/warning.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/fl_type.h" +#include "ruby/internal/value.h" +#include "ruby/internal/value_type.h" +#include "ruby/defines.h" + +/** @cond INTERNAL_MACRO */ +#ifdef RUBY_UNTYPED_DATA_WARNING +# /* Take that. */ +#elif defined(RUBY_EXPORT) +# define RUBY_UNTYPED_DATA_WARNING 1 +#else +# define RUBY_UNTYPED_DATA_WARNING 0 +#endif + +#define RBIMPL_DATA_FUNC(f) RBIMPL_CAST((void (*)(void *))(f)) +#define RBIMPL_ATTRSET_UNTYPED_DATA_FUNC() \ + RBIMPL_ATTR_WARNING(("untyped Data is unsafe; use TypedData instead")) \ + RBIMPL_ATTR_DEPRECATED(("by TypedData")) + +#define RBIMPL_MACRO_SELECT(x, y) x ## y +#define RUBY_MACRO_SELECT(x, y) RBIMPL_MACRO_SELECT(x, y) +/** @endcond */ + +/** + * Convenient casting macro. + * + * @param obj An object, which is in fact an ::RData. + * @return The passed object casted to ::RData. + */ +#define RDATA(obj) RBIMPL_CAST((struct RData *)(obj)) + +/** + * Convenient getter macro. + * + * @param obj An object, which is in fact an ::RData. + * @return The passed object's ::RData::data field. + */ +#define DATA_PTR(obj) RDATA(obj)->data + +/** + * This is a value you can set to ::RData::dfree. Setting this means the data + * was allocated using ::ruby_xmalloc() (or variants), and shall be freed using + * ::ruby_xfree(). + * + * @warning Do not use this if you want to use system malloc, because the + * system and Ruby might or might not share the same malloc + * implementation. + */ +#define RUBY_DEFAULT_FREE RBIMPL_DATA_FUNC(-1) + +/** + * This is a value you can set to ::RData::dfree. Setting this means the data + * is managed by someone else, like, statically allocated. Of course you are + * on your own then. + */ +#define RUBY_NEVER_FREE RBIMPL_DATA_FUNC(0) + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define RUBY_UNTYPED_DATA_FUNC(f) f RBIMPL_ATTRSET_UNTYPED_DATA_FUNC() + +/* +#define RUBY_DATA_FUNC(func) ((void (*)(void*))(func)) +*/ + +/** + * This is the type of callbacks registered to ::RData. The argument is the + * `data` field. + */ +typedef void (*RUBY_DATA_FUNC)(void*); + +/** + * @deprecated + * + * Old "untyped" user data. It has roughly the same usage as struct + * ::RTypedData, but lacked several features such as support for compaction GC. + * Use of this struct is not recommended any longer. If it is dead necessary, + * please inform the core devs about your usage. + * + * @internal + * + * @shyouhei tried to add RBIMPL_ATTR_DEPRECATED for this type but that yielded + * too many warnings in the core. Maybe we want to retry later... Just add + * deprecated document for now. + */ +struct RData { + + /** Basic part, including flags and class. */ + struct RBasic basic; + + /** + * This function is called when the object is experiencing GC marks. If it + * contains references to other Ruby objects, you need to mark them also. + * Otherwise GC will smash your data. + * + * @see rb_gc_mark() + * @warning This is called during GC runs. Object allocations are + * impossible at that moment (that is why GC runs). + */ + RUBY_DATA_FUNC dmark; + + /** + * This function is called when the object is no longer used. You need to + * do whatever necessary to avoid memory leaks. + * + * @warning This is called during GC runs. Object allocations are + * impossible at that moment (that is why GC runs). + */ + RUBY_DATA_FUNC dfree; + + /** Pointer to the actual C level struct that you want to wrap. */ + void *data; +}; + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * This is the primitive way to wrap an existing C struct into ::RData. + * + * @param[in] klass Ruby level class of the returning object. + * @param[in] datap Pointer to the target C struct. + * @param[in] dmark Mark function. + * @param[in] dfree Free function. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return An allocated object that wraps `datap`. + */ +VALUE rb_data_object_wrap(VALUE klass, void *datap, RUBY_DATA_FUNC dmark, RUBY_DATA_FUNC dfree); + +/** + * Identical to rb_data_object_wrap(), except it allocates a new data region + * internally instead of taking an existing one. The allocation is done using + * ruby_calloc(). Hence it makes no sense to pass anything other than + * ::RUBY_DEFAULT_FREE to the last argument. + * + * @param[in] klass Ruby level class of the returning object. + * @param[in] size Requested size of memory to allocate. + * @param[in] dmark Mark function. + * @param[in] dfree Free function. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return An allocated object that wraps a new `size` byte region. + */ +VALUE rb_data_object_zalloc(VALUE klass, size_t size, RUBY_DATA_FUNC dmark, RUBY_DATA_FUNC dfree); + +/** + * @private + * Documented in include/ruby/internal/globals.h + */ +RUBY_EXTERN VALUE rb_cObject; +RBIMPL_SYMBOL_EXPORT_END() + +/** + * Converts sval, a pointer to your struct, into a Ruby object. + * + * @param klass A ruby level class. + * @param mark Mark function. + * @param free Free function. + * @param sval A pointer to your struct. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return A created Ruby object. + */ +#define Data_Wrap_Struct(klass, mark, free, sval) \ + rb_data_object_wrap( \ + (klass), \ + (sval), \ + RBIMPL_DATA_FUNC(mark), \ + RBIMPL_DATA_FUNC(free)) + +/** + * @private + * + * This is an implementation detail of #Data_Make_Struct. People don't use it + * directly. + * + * @param result Variable name of created Ruby object. + * @param klass Ruby level class of the object. + * @param type Type name of the C struct. + * @param size Size of the C struct. + * @param mark Mark function. + * @param free Free function. + * @param sval Variable name of created C struct. + */ +#define Data_Make_Struct0(result, klass, type, size, mark, free, sval) \ + VALUE result = rb_data_object_zalloc( \ + (klass), \ + (size), \ + RBIMPL_DATA_FUNC(mark), \ + RBIMPL_DATA_FUNC(free)); \ + (sval) = RBIMPL_CAST((type *)DATA_PTR(result)); \ + RBIMPL_CAST(/*suppress unused variable warnings*/(void)(sval)) + +/** + * Identical to #Data_Wrap_Struct, except it allocates a new data region + * internally instead of taking an existing one. The allocation is done using + * ruby_calloc(). Hence it makes no sense to pass anything other than + * ::RUBY_DEFAULT_FREE to the `free` argument. + * + * @param klass Ruby level class of the returning object. + * @param type Type name of the C struct. + * @param mark Mark function. + * @param free Free function. + * @param sval Variable name of created C struct. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return A created Ruby object. + */ +#ifdef HAVE_STMT_AND_DECL_IN_EXPR +#define Data_Make_Struct(klass, type, mark, free, sval) \ + RB_GNUC_EXTENSION({ \ + Data_Make_Struct0( \ + data_struct_obj, \ + klass, \ + type, \ + sizeof(type), \ + mark, \ + free, \ + sval); \ + data_struct_obj; \ + }) +#else +#define Data_Make_Struct(klass, type, mark, free, sval) \ + rb_data_object_make( \ + (klass), \ + RBIMPL_DATA_FUNC(mark), \ + RBIMPL_DATA_FUNC(free), \ + RBIMPL_CAST((void **)&(sval)), \ + sizeof(type)) +#endif + +/** + * Obtains a C struct from inside of a wrapper Ruby object. + * + * @param obj An instance of ::RData. + * @param type Type name of the C struct. + * @param sval Variable name of obtained C struct. + * @return Unwrapped C struct that `obj` holds. + */ +#define Data_Get_Struct(obj, type, sval) \ + ((sval) = RBIMPL_CAST((type*)rb_data_object_get(obj))) + +RBIMPL_ATTRSET_UNTYPED_DATA_FUNC() +/** + * @private + * + * This is an implementation detail of rb_data_object_wrap(). People don't use + * it directly. + * + * @param[in] klass Ruby level class of the returning object. + * @param[in] ptr Pointer to the target C struct. + * @param[in] mark Mark function. + * @param[in] free Free function. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return An allocated object that wraps `datap`. + */ +static inline VALUE +rb_data_object_wrap_warning(VALUE klass, void *ptr, RUBY_DATA_FUNC mark, RUBY_DATA_FUNC free) +{ + return rb_data_object_wrap(klass, ptr, mark, free); +} + +/** + * @private + * + * This is an implementation detail of #Data_Get_Struct. People don't use it + * directly. + * + * @param[in] obj An instance of ::RData. + * @return Unwrapped C struct that `obj` holds. + */ +static inline void * +rb_data_object_get(VALUE obj) +{ + Check_Type(obj, RUBY_T_DATA); + return DATA_PTR(obj); +} + +RBIMPL_ATTRSET_UNTYPED_DATA_FUNC() +/** + * @private + * + * This is an implementation detail of #Data_Get_Struct. People don't use it + * directly. + * + * @param[in] obj An instance of ::RData. + * @return Unwrapped C struct that `obj` holds. + */ +static inline void * +rb_data_object_get_warning(VALUE obj) +{ + return rb_data_object_get(obj); +} + +#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) +# define rb_data_object_wrap_warning(klass, ptr, mark, free) \ + RB_GNUC_EXTENSION( \ + __builtin_choose_expr( \ + __builtin_constant_p(klass) && !(klass), \ + rb_data_object_wrap(klass, ptr, mark, free), \ + (rb_data_object_wrap_warning)(klass, ptr, mark, free))) +#endif + +/** + * This is an implementation detail of #Data_Make_Struct. People don't use it + * directly. + * + * @param[in] klass Ruby level class of the returning object. + * @param[in] mark_func Mark function. + * @param[in] free_func Free function. + * @param[in] datap Variable of created C struct. + * @param[in] size Requested size of allocation. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return A created Ruby object. + * @post `*datap` holds the created C struct. + */ +static inline VALUE +rb_data_object_make(VALUE klass, RUBY_DATA_FUNC mark_func, RUBY_DATA_FUNC free_func, void **datap, size_t size) +{ + Data_Make_Struct0(result, klass, void, size, mark_func, free_func, *datap); + return result; +} + +RBIMPL_ATTR_DEPRECATED(("by: rb_data_object_wrap")) +/** @deprecated This function was renamed to rb_data_object_wrap(). */ +static inline VALUE +rb_data_object_alloc(VALUE klass, void *data, RUBY_DATA_FUNC dmark, RUBY_DATA_FUNC dfree) +{ + return rb_data_object_wrap(klass, data, dmark, dfree); +} + +/** @cond INTERNAL_MACRO */ +#define rb_data_object_wrap_0 rb_data_object_wrap +#define rb_data_object_wrap_1 rb_data_object_wrap_warning +#define rb_data_object_wrap_2 rb_data_object_wrap_ /* Used here vvvv */ +#define rb_data_object_wrap RUBY_MACRO_SELECT(rb_data_object_wrap_2, RUBY_UNTYPED_DATA_WARNING) +#define rb_data_object_get_0 rb_data_object_get +#define rb_data_object_get_1 rb_data_object_get_warning +#define rb_data_object_get_2 rb_data_object_get_ /* Used here vvvv */ +#define rb_data_object_get RUBY_MACRO_SELECT(rb_data_object_get_2, RUBY_UNTYPED_DATA_WARNING) +#define rb_data_object_make_0 rb_data_object_make +#define rb_data_object_make_1 rb_data_object_make_warning +#define rb_data_object_make_2 rb_data_object_make_ /* Used here vvvv */ +#define rb_data_object_make RUBY_MACRO_SELECT(rb_data_object_make_2, RUBY_UNTYPED_DATA_WARNING) +/** @endcond */ +#endif /* RBIMPL_RDATA_H */ diff --git a/libs/libruby/ruby/internal/core/rfile.h b/libs/libruby/ruby/internal/core/rfile.h new file mode 100644 index 0000000..f8dddde --- /dev/null +++ b/libs/libruby/ruby/internal/core/rfile.h @@ -0,0 +1,51 @@ +#ifndef RBIMPL_RFILE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RFILE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines struct ::RFile. + */ +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/cast.h" + +/* rb_io_t is in ruby/io.h. The header file has historically not been included + * into ruby/ruby.h. We follow that tradition. */ +struct rb_io_t; + +/** + * Ruby's File and IO. Ruby's IO are not just file descriptors. They have + * buffers. They also have encodings. Various information are controlled + * using this struct. + */ +struct RFile { + + /** Basic part, including flags and class. */ + struct RBasic basic; + + /** IO's specific fields. */ + struct rb_io_t *fptr; +}; + +/** + * Convenient casting macro. + * + * @param obj An object, which is in fact an ::RFile. + * @return The passed object casted to ::RFile. + */ +#define RFILE(obj) RBIMPL_CAST((struct RFile *)(obj)) +#endif /* RBIMPL_RFILE_H */ diff --git a/libs/libruby/ruby/internal/core/rhash.h b/libs/libruby/ruby/internal/core/rhash.h new file mode 100644 index 0000000..61d2c15 --- /dev/null +++ b/libs/libruby/ruby/internal/core/rhash.h @@ -0,0 +1,144 @@ +#ifndef RBIMPL_RHASH_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RHASH_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines to manipulate struct RHash. + * @note The struct RHash itself is opaque. + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#if !defined RUBY_EXPORT && !defined RUBY_NO_OLD_COMPATIBILITY +# include "ruby/backward.h" +#endif + +/** + * Retrieves the internal table. + * + * @param[in] h An instance of RHash. + * @pre `h` must be of ::RUBY_T_HASH. + * @return A struct st_table which has the contents of this hash. + * @note Nowadays as Ruby evolved over ages, RHash has multiple backend + * storage engines. `h`'s backend is not guaranteed to be a + * st_table. This function creates one when necessary. + */ +#define RHASH_TBL(h) rb_hash_tbl(h, __FILE__, __LINE__) + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + * + * @internal + * + * Declaration of rb_hash_iter_lev() is at include/ruby/backward.h. + */ +#define RHASH_ITER_LEV(h) rb_hash_iter_lev(h) + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + * + * @internal + * + * Declaration of rb_hash_ifnone() is at include/ruby/backward.h. + */ +#define RHASH_IFNONE(h) rb_hash_ifnone(h) + +/** + * Queries the size of the hash. Size here means the number of keys that the + * hash stores. + * + * @param[in] h An instance of RHash. + * @pre `h` must be of ::RUBY_T_HASH. + * @return The size of the hash. + */ +#define RHASH_SIZE(h) rb_hash_size_num(h) + +/** + * Checks if the hash is empty. + * + * @param[in] h An instance of RHash. + * @pre `h` must be of ::RUBY_T_HASH. + * @retval true It is. + * @retval false It isn't. + */ +#define RHASH_EMPTY_P(h) (RHASH_SIZE(h) == 0) + +/** + * Destructively updates the default value of the hash. + * + * @param[out] h An instance of RHash. + * @param[in] ifnone Arbitrary default value. + * @pre `h` must be of ::RUBY_T_HASH. + * + * @internal + * + * But why you can set this, given rb_hash_ifnone() doesn't exist? + */ +#define RHASH_SET_IFNONE(h, ifnone) rb_hash_set_ifnone((VALUE)h, ifnone) + +struct st_table; /* in ruby/st.h */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * This is the implementation detail of #RHASH_SIZE. People don't call this + * directly. + * + * @param[in] hash An instance of RHash. + * @pre `hash` must be of ::RUBY_T_HASH. + * @return The size of the hash. + */ +size_t rb_hash_size_num(VALUE hash); + +/** + * This is the implementation detail of #RHASH_TBL. People don't call this + * directly. + * + * @param[in] hash An instance of RHash. + * @param[in] file The `__FILE__`. + * @param[in] line The `__LINE__`. + * @pre `hash` must be of ::RUBY_T_HASH. + * @return Table that has the contents of the hash. + */ +struct st_table *rb_hash_tbl(VALUE hash, const char *file, int line); + +/** + * This is the implementation detail of #RHASH_SET_IFNONE. People don't call + * this directly. + * + * @param[out] hash An instance of RHash. + * @param[in] ifnone Arbitrary default value. + * @pre `hash` must be of ::RUBY_T_HASH. + */ +VALUE rb_hash_set_ifnone(VALUE hash, VALUE ifnone); +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_RHASH_H */ diff --git a/libs/libruby/ruby/internal/core/rmatch.h b/libs/libruby/ruby/internal/core/rmatch.h new file mode 100644 index 0000000..2d2fd89 --- /dev/null +++ b/libs/libruby/ruby/internal/core/rmatch.h @@ -0,0 +1,146 @@ +#ifndef RBIMPL_RMATCH_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RMATCH_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines struct ::RMatch. + */ +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/value.h" +#include "ruby/internal/value_type.h" +#include "ruby/assert.h" + +/** + * Convenient casting macro. + * + * @param obj An object, which is in fact an ::RMatch. + * @return The passed object casted to ::RMatch. + */ +#define RMATCH(obj) RBIMPL_CAST((struct RMatch *)(obj)) +/** @cond INTERNAL_MACRO */ +#define RMATCH_REGS RMATCH_REGS +/** @endcond */ + +struct re_patter_buffer; /* a.k.a. OnigRegexType, defined in onigmo.h */ +struct re_registers; /* Also in onigmo.h */ + +/** + * @old{re_pattern_buffer} + * + * @internal + * + * @shyouhei wonders: is anyone actively using this typedef ...? + */ +typedef struct re_pattern_buffer Regexp; + +/** + * Represents the region of a capture group. This is basically for caching + * purpose. re_registers have similar concepts (`beg` and `end`) but they are + * in `ptrdiff_t*`. In order for us to implement `MatchData#offset` that info + * has to be converted to offset integers. This is the struct to hold such + * things. + * + * @internal + * + * But why on earth it has to be visible from extension libraries? + */ +struct rmatch_offset { + long beg; /**< Beginning of a group. */ + long end; /**< End of a group. */ +}; + +/** Represents a match. */ +struct rmatch { + /** + * "Registers" of a match. This is a quasi-opaque struct that holds + * execution result of a match. Roughly resembles `&~`. + */ + struct re_registers regs; + + /** Capture group offsets, in C array. */ + struct rmatch_offset *char_offset; + + /** Number of ::rmatch_offset that ::rmatch::char_offset holds. */ + int char_offset_num_allocated; +}; + +/** + * Regular expression execution context. When a regular expression "matches" + * to a string, it generates capture groups etc. This struct holds that info. + * Visible from Ruby as an instance of `MatchData`. + * + * @note There is no way for extension libraries to manually generate this + * struct except by actually exercising the match operation of a regular + * expression. + */ +struct RMatch { + + /** Basic part, including flags and class. */ + struct RBasic basic; + + /** + * The target string that the match was made against. + */ + VALUE str; + + /** + * The result of this match. + */ + struct rmatch *rmatch; + + /** + * The expression of this match. + */ + VALUE regexp; /* RRegexp */ +}; + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries the raw ::re_registers. + * + * @param[in] match A match object + * @pre `match` must be of ::RMatch. + * @return Its execution result. + * @note Good. So you are aware of the fact that it could return NULL. + * Yes. It actually does. This is a really bizarre thing. The + * situation is about `String#gsub` and its family. They take + * strings as arguments, like `"foo".sub("bar", "baz")`. On such + * situations, in order to optimise memory allocations, these + * methods do not involve regular expressions at all. They just + * sequentially scan the receiver. Okay. The story begins here. + * Even when they do not kick our regexp engine, there must be + * backref objects e.g. `$&`. But how? You know what? Ruby fakes + * them. It allocates an empty ::RMatch and behaves as if there + * were execution contexts. In reality there weren't. No + * ::re_registers are allocated then. There is no way for this + * function but to return NULL for those fake ::RMatch. This is + * the reason for the nullability of this function. + */ +static inline struct re_registers * +RMATCH_REGS(VALUE match) +{ + RBIMPL_ASSERT_TYPE(match, RUBY_T_MATCH); + RBIMPL_ASSERT_OR_ASSUME(RMATCH(match)->rmatch != NULL); + return &RMATCH(match)->rmatch->regs; +} + +#endif /* RBIMPL_RMATCH_H */ diff --git a/libs/libruby/ruby/internal/core/robject.h b/libs/libruby/ruby/internal/core/robject.h new file mode 100644 index 0000000..b1c2e1b --- /dev/null +++ b/libs/libruby/ruby/internal/core/robject.h @@ -0,0 +1,176 @@ +#ifndef RBIMPL_ROBJECT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ROBJECT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines struct ::RObject. + */ +#include "ruby/internal/config.h" + +#ifdef HAVE_STDINT_H +# include +#endif + +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/deprecated.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/fl_type.h" +#include "ruby/internal/value.h" +#include "ruby/internal/value_type.h" + +/** + * Convenient casting macro. + * + * @param obj An object, which is in fact an ::RObject. + * @return The passed object casted to ::RObject. + */ +#define ROBJECT(obj) RBIMPL_CAST((struct RObject *)(obj)) +/** @cond INTERNAL_MACRO */ +#define ROBJECT_EMBED_LEN_MAX ROBJECT_EMBED_LEN_MAX +#define ROBJECT_EMBED ROBJECT_EMBED +#define ROBJECT_IV_CAPACITY ROBJECT_IV_CAPACITY +#define ROBJECT_IVPTR ROBJECT_IVPTR +/** @endcond */ + +/** + * @private + * + * Bits that you can set to ::RBasic::flags. + */ +enum ruby_robject_flags { + /** + * This flag has something to do with memory footprint. If the object is + * "small" enough, ruby tries to be creative to abuse padding bits of + * struct ::RObject for storing instance variables. This flag denotes that + * situation. + * + * @warning This bit has to be considered read-only. Setting/clearing + * this bit without corresponding fix up must cause immediate + * SEGV. Also, internal structures of an object change + * dynamically and transparently throughout of its lifetime. + * Don't assume it being persistent. + * + * @internal + * + * 3rd parties must not be aware that there even is more than one way to + * store instance variables. Might better be hidden. + */ + ROBJECT_EMBED = RUBY_FL_USER1 +}; + +#if !USE_RVARGC +/** + * This is an enum because GDB wants it (rather than a macro). People need not + * bother. + */ +enum ruby_robject_consts { + /** Max possible number of instance variables that can be embedded. */ + ROBJECT_EMBED_LEN_MAX = RBIMPL_EMBED_LEN_MAX_OF(VALUE) +}; +#endif + +struct st_table; + +/** + * Ruby's ordinal objects. Unless otherwise special cased, all predefined and + * user-defined classes share this struct to hold their instances. + */ +struct RObject { + + /** Basic part, including flags and class. */ + struct RBasic basic; + + /** Object's specific fields. */ + union { + + /** + * Object that use separated memory region for instance variables use + * this pattern. + */ + struct { + /** Pointer to a C array that holds instance variables. */ + VALUE *ivptr; + + /** + * This is a table that holds instance variable name to index + * mapping. Used when accessing instance variables using names. + * + * @internal + * + * This is a shortcut for `RCLASS_IV_INDEX_TBL(rb_obj_class(obj))`. + */ + struct rb_id_table *iv_index_tbl; + } heap; + +#if USE_RVARGC + /* Embedded instance variables. When an object is small enough, it + * uses this area to store the instance variables. + * + * This is a length 1 array because: + * 1. GCC has a bug that does not optimize C flexible array members + * (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102452) + * 2. Zero length arrays are not supported by all compilers + */ + VALUE ary[1]; +#else + /** + * Embedded instance variables. When an object is small enough, it + * uses this area to store the instance variables. + */ + VALUE ary[ROBJECT_EMBED_LEN_MAX]; +#endif + } as; +}; + +/* Offsets for YJIT */ +#ifndef __cplusplus +static const int32_t ROBJECT_OFFSET_AS_HEAP_IVPTR = offsetof(struct RObject, as.heap.ivptr); +static const int32_t ROBJECT_OFFSET_AS_HEAP_IV_INDEX_TBL = offsetof(struct RObject, as.heap.iv_index_tbl); +static const int32_t ROBJECT_OFFSET_AS_ARY = offsetof(struct RObject, as.ary); +#endif + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries the instance variables. + * + * @param[in] obj Object in question. + * @return Its instance variables, in C array. + * @pre `obj` must be an instance of ::RObject. + * + * @internal + * + * @shyouhei finds no reason for this to be visible from extension libraries. + */ +static inline VALUE * +ROBJECT_IVPTR(VALUE obj) +{ + RBIMPL_ASSERT_TYPE(obj, RUBY_T_OBJECT); + + struct RObject *const ptr = ROBJECT(obj); + + if (RB_FL_ANY_RAW(obj, ROBJECT_EMBED)) { + return ptr->as.ary; + } + else { + return ptr->as.heap.ivptr; + } +} + +#endif /* RBIMPL_ROBJECT_H */ diff --git a/libs/libruby/ruby/internal/core/rregexp.h b/libs/libruby/ruby/internal/core/rregexp.h new file mode 100644 index 0000000..cf54a39 --- /dev/null +++ b/libs/libruby/ruby/internal/core/rregexp.h @@ -0,0 +1,168 @@ +#ifndef RBIMPL_RREGEXP_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RREGEXP_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines struct ::RRegexp. + */ +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/core/rstring.h" +#include "ruby/internal/value.h" +#include "ruby/internal/value_type.h" + +/** + * Convenient casting macro. + * + * @param obj An object, which is in fact an ::RRegexp. + * @return The passed object casted to ::RRegexp. + */ +#define RREGEXP(obj) RBIMPL_CAST((struct RRegexp *)(obj)) + +/** + * Convenient accessor macro. + * + * @param obj An object, which is in fact an ::RRegexp. + * @return The passed object's pattern buffer. + */ +#define RREGEXP_PTR(obj) (RREGEXP(obj)->ptr) +/** @cond INTERNAL_MACRO */ +#define RREGEXP_SRC RREGEXP_SRC +#define RREGEXP_SRC_PTR RREGEXP_SRC_PTR +#define RREGEXP_SRC_LEN RREGEXP_SRC_LEN +#define RREGEXP_SRC_END RREGEXP_SRC_END +/** @endcond */ + +struct re_patter_buffer; /* a.k.a. OnigRegexType, defined in onigmo.h */ + +/** + * Ruby's regular expression. A regexp is compiled into its own intermediate + * representation. This one holds that info. Regexp "match" operation then + * executes that IR. + */ +struct RRegexp { + + /** Basic part, including flags and class. */ + struct RBasic basic; + + /** + * The pattern buffer. This is a quasi-opaque struct that holds compiled + * intermediate representation of the regular expression. + * + * @note Compilation of a regexp could be delayed until actual match. + */ + struct re_pattern_buffer *ptr; + + /** Source code of this expression. */ + const VALUE src; + + /** + * Reference count. A regexp match can take extraordinarily long time to + * run. Ruby's regular expression is heavily extended and not a regular + * language any longer; runs in NP-time in practice. Now, Ruby also has + * threads and GVL. In order to prevent long GVL lockup, our regexp engine + * can release it on occasions. This means that multiple threads can touch + * a regular expressions at once. That itself is okay. But their cleanup + * phase shall wait for all the concurrent runs, to prevent use-after-free + * situation. This field is used to count such threads that are executing + * this particular pattern buffer. + * + * @warning Of course, touching this field from extension libraries causes + * catastrophic effects. Just leave it. + */ + unsigned long usecnt; +}; + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Convenient getter function. + * + * @param[in] rexp The regular expression in question. + * @return The source code of the regular expression. + * @pre `rexp` must be of ::RRegexp. + */ +static inline VALUE +RREGEXP_SRC(VALUE rexp) +{ + RBIMPL_ASSERT_TYPE(rexp, RUBY_T_REGEXP); + VALUE ret = RREGEXP(rexp)->src; + RBIMPL_ASSERT_TYPE(ret, RUBY_T_STRING); + return ret; +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Convenient getter function. + * + * @param[in] rexp The regular expression in question. + * @return The source code of the regular expression, in C's string. + * @pre `rexp` must be of ::RRegexp. + * + * @internal + * + * It seems nobody uses this function in the wild. Subject to hide? + */ +static inline char * +RREGEXP_SRC_PTR(VALUE rexp) +{ + return RSTRING_PTR(RREGEXP_SRC(rexp)); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Convenient getter function. + * + * @param[in] rexp The regular expression in question. + * @return The length of the source code of the regular expression. + * @pre `rexp` must be of ::RRegexp. + * + * @internal + * + * It seems nobody uses this function in the wild. Subject to hide? + */ +static inline long +RREGEXP_SRC_LEN(VALUE rexp) +{ + return RSTRING_LEN(RREGEXP_SRC(rexp)); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Convenient getter function. + * + * @param[in] rexp The regular expression in question. + * @return The end of the source code of the regular expression. + * @pre `rexp` must be of ::RRegexp. + * + * @internal + * + * It seems nobody uses this function in the wild. Subject to hide? + */ +static inline char * +RREGEXP_SRC_END(VALUE rexp) +{ + return RSTRING_END(RREGEXP_SRC(rexp)); +} + +#endif /* RBIMPL_RREGEXP_H */ diff --git a/libs/libruby/ruby/internal/core/rstring.h b/libs/libruby/ruby/internal/core/rstring.h new file mode 100644 index 0000000..e394ab7 --- /dev/null +++ b/libs/libruby/ruby/internal/core/rstring.h @@ -0,0 +1,578 @@ +#ifndef RBIMPL_RSTRING_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RSTRING_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines struct ::RString. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/arithmetic/long.h" +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/fl_type.h" +#include "ruby/internal/value_type.h" +#include "ruby/internal/warning_push.h" +#include "ruby/assert.h" + +/** + * Convenient casting macro. + * + * @param obj An object, which is in fact an ::RString. + * @return The passed object casted to ::RString. + */ +#define RSTRING(obj) RBIMPL_CAST((struct RString *)(obj)) + +/** @cond INTERNAL_MACRO */ +#define RSTRING_NOEMBED RSTRING_NOEMBED +#if !USE_RVARGC +#define RSTRING_EMBED_LEN_MASK RSTRING_EMBED_LEN_MASK +#define RSTRING_EMBED_LEN_SHIFT RSTRING_EMBED_LEN_SHIFT +#define RSTRING_EMBED_LEN_MAX RSTRING_EMBED_LEN_MAX +#endif +#define RSTRING_FSTR RSTRING_FSTR +#define RSTRING_EMBED_LEN RSTRING_EMBED_LEN +#define RSTRING_LEN RSTRING_LEN +#define RSTRING_LENINT RSTRING_LENINT +#define RSTRING_PTR RSTRING_PTR +#define RSTRING_END RSTRING_END +/** @endcond */ + +/** + * @name Conversion of Ruby strings into C's + * + * @{ + */ + +/** + * Ensures that the parameter object is a String. This is done by calling its + * `to_str` method. + * + * @param[in,out] v Arbitrary Ruby object. + * @exception rb_eTypeError No implicit conversion defined. + * @post `v` is a String. + */ +#define StringValue(v) rb_string_value(&(v)) + +/** + * Identical to #StringValue, except it returns a `char*`. + * + * @param[in,out] v Arbitrary Ruby object. + * @exception rb_eTypeError No implicit conversion defined. + * @return Converted Ruby string's backend C string. + * @post `v` is a String. + */ +#define StringValuePtr(v) rb_string_value_ptr(&(v)) + +/** + * Identical to #StringValuePtr, except it additionally checks for the contents + * for viability as a C string. Ruby can accept wider range of contents as + * strings, compared to C. This function is to check that. + * + * @param[in,out] v Arbitrary Ruby object. + * @exception rb_eTypeError No implicit conversion defined. + * @exception rb_eArgError String is not C-compatible. + * @return Converted Ruby string's backend C string. + * @post `v` is a String. + */ +#define StringValueCStr(v) rb_string_value_cstr(&(v)) + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define SafeStringValue(v) StringValue(v) + +/** + * Identical to #StringValue, except it additionally converts the string's + * encoding to default external encoding. Ruby has a concept called encodings. + * A string can have different encoding than the environment expects. Someone + * has to make sure its contents be converted to something suitable. This is + * that routine. Call it when necessary. + * + * @param[in,out] v Arbitrary Ruby object. + * @exception rb_eTypeError No implicit conversion defined. + * @return Converted Ruby string's backend C string. + * @post `v` is a String. + * + * @internal + * + * Not sure but it seems this macro does not raise on encoding + * incompatibilities? Doesn't sound right to @shyouhei. + */ +#define ExportStringValue(v) do { \ + StringValue(v); \ + (v) = rb_str_export(v); \ +} while (0) + +/** @} */ + +/** + * @private + * + * Bits that you can set to ::RBasic::flags. + * + * @warning These enums are not the only bits we use for strings. + * + * @internal + * + * Actually all bits through FL_USER1 to FL_USER19 are used for strings. Why + * only this tiny part of them are made public here? @shyouhei can find no + * reason. + */ +enum ruby_rstring_flags { + + /** + * This flag has something to do with memory footprint. If the string is + * short enough, ruby tries to be creative to abuse padding bits of struct + * ::RString for storing contents. If this flag is set that string does + * _not_ do that, to resort to good old fashioned external allocation + * strategy instead. + * + * @warning This bit has to be considered read-only. Setting/clearing + * this bit without corresponding fix up must cause immediate + * SEGV. Also, internal structures of a string change + * dynamically and transparently throughout of its lifetime. + * Don't assume it being persistent. + * + * @internal + * + * 3rd parties must not be aware that there even is more than one way to + * store a string. Might better be hidden. + */ + RSTRING_NOEMBED = RUBY_FL_USER1, + +#if !USE_RVARGC + /** + * When a string employs embedded strategy (see ::RSTRING_NOEMBED), these + * bits are used to store the number of bytes actually filled into + * ::RString::ary. + * + * @internal + * + * 3rd parties must not be aware that there even is more than one way to + * store a string. Might better be hidden. + */ + RSTRING_EMBED_LEN_MASK = RUBY_FL_USER2 | RUBY_FL_USER3 | RUBY_FL_USER4 | + RUBY_FL_USER5 | RUBY_FL_USER6, +#endif + + /* Actually, string encodings are also encoded into the flags, using + * remaining bits.*/ + + /** + * This flag has something to do with infamous "f"string. What is a + * fstring? Well it is a special subkind of strings that is immutable, + * deduped globally, and managed by our GC. It is much like a Symbol (in + * fact Symbols are dynamic these days and are backended using fstrings). + * This concept has been silently introduced at some point in 2.x era. + * Since then it gained wider acceptance in the core. But extension + * libraries could not know that until very recently. Strings of this flag + * live in a special Limbo deep inside of the interpreter. Never try to + * manipulate it by hand. + * + * @internal + * + * Fstrings are not the only variant strings that we implement today. + * Other things are behind-the-scene. This is the only one that is visible + * from extension library. There is no clear reason why it has to be. + * Given there are more "polite" ways to create fstrings, it seems this bit + * need not be exposed to extension libraries. Might better be hidden. + */ + RSTRING_FSTR = RUBY_FL_USER17 +}; + +#if !USE_RVARGC +/** + * This is an enum because GDB wants it (rather than a macro). People need not + * bother. + */ +enum ruby_rstring_consts { + /** Where ::RSTRING_EMBED_LEN_MASK resides. */ + RSTRING_EMBED_LEN_SHIFT = RUBY_FL_USHIFT + 2, + + /** Max possible number of characters that can be embedded. */ + RSTRING_EMBED_LEN_MAX = RBIMPL_EMBED_LEN_MAX_OF(char) - 1 +}; +#endif + +/** + * Ruby's String. A string in ruby conceptually has these information: + * + * - Encoding of the string. + * - Length of the string. + * - Contents of the string. + * + * It is worth noting that a string is _not_ an array of characters in ruby. + * It has never been. In 1.x a string was an array of integers. Since 2.x a + * string is no longer an array of anything. A string is a string -- just like + * a Time is not an integer. + */ +struct RString { + + /** Basic part, including flags and class. */ + struct RBasic basic; + + /** String's specific fields. */ + union { + + /** + * Strings that use separated memory region for contents use this + * pattern. + */ + struct { + + /** + * Length of the string, not including terminating NUL character. + * + * @note This is in bytes. + */ + long len; + + /** + * Pointer to the contents of the string. In the old days each + * string had dedicated memory regions. That is no longer true + * today, but there still are strings of such properties. This + * field could be used to point such things. + */ + char *ptr; + + /** Auxiliary info. */ + union { + + /** + * Capacity of `*ptr`. A continuous memory region of at least + * `capa` bytes is expected to exist at `*ptr`. This can be + * bigger than `len`. + */ + long capa; + + /** + * Parent of the string. Nowadays strings can share their + * contents each other, constructing gigantic nest of objects. + * This situation is called "shared", and this is the field to + * control such properties. + */ + VALUE shared; + } aux; + } heap; + + /** Embedded contents. */ + struct { +#if USE_RVARGC + long len; + /* This is a length 1 array because: + * 1. GCC has a bug that does not optimize C flexible array members + * (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102452) + * 2. Zero length arrays are not supported by all compilers + */ + char ary[1]; +#else + /** + * When a string is short enough, it uses this area to store the + * contents themselves. This was impractical in the 20th century, + * but these days 64 bit machines can typically hold 24 bytes here. + * Could be sufficiently large. In this case the length is encoded + * into the flags. + */ + char ary[RSTRING_EMBED_LEN_MAX + 1]; +#endif + } embed; + } as; +}; + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * Identical to rb_check_string_type(), except it raises exceptions in case of + * conversion failures. + * + * @param[in] obj Target object. + * @exception rb_eTypeError No implicit conversion to String. + * @return Return value of `obj.to_str`. + * @see rb_io_get_io + * @see rb_ary_to_ary + */ +VALUE rb_str_to_str(VALUE obj); + +/** + * Identical to rb_str_to_str(), except it fills the passed pointer with the + * converted object. + * + * @param[in,out] ptr Pointer to a variable of target object. + * @exception rb_eTypeError No implicit conversion to String. + * @return Return value of `obj.to_str`. + * @post `*ptr` is the return value. + */ +VALUE rb_string_value(volatile VALUE *ptr); + +/** + * Identical to rb_str_to_str(), except it returns the converted string's + * backend memory region. + * + * @param[in,out] ptr Pointer to a variable of target object. + * @exception rb_eTypeError No implicit conversion to String. + * @post `*ptr` is the return value of `obj.to_str`. + * @return Pointer to the contents of the return value. + */ +char *rb_string_value_ptr(volatile VALUE *ptr); + +/** + * Identical to rb_string_value_ptr(), except it additionally checks for the + * contents for viability as a C string. Ruby can accept wider range of + * contents as strings, compared to C. This function is to check that. + * + * @param[in,out] ptr Pointer to a variable of target object. + * @exception rb_eTypeError No implicit conversion to String. + * @exception rb_eArgError String is not C-compatible. + * @post `*ptr` is the return value of `obj.to_str`. + * @return Pointer to the contents of the return value. + */ +char *rb_string_value_cstr(volatile VALUE *ptr); + +/** + * Identical to rb_str_to_str(), except it additionally converts the string + * into default external encoding. Ruby has a concept called encodings. A + * string can have different encoding than the environment expects. Someone + * has to make sure its contents be converted to something suitable. This is + * that routine. Call it when necessary. + * + * @param[in] obj Target object. + * @exception rb_eTypeError No implicit conversion to String. + * @return Converted ruby string of default external encoding. + */ +VALUE rb_str_export(VALUE obj); + +/** + * Identical to rb_str_export(), except it converts into the locale encoding + * instead. + * + * @param[in] obj Target object. + * @exception rb_eTypeError No implicit conversion to String. + * @return Converted ruby string of locale encoding. + */ +VALUE rb_str_export_locale(VALUE obj); + +RBIMPL_ATTR_ERROR(("rb_check_safe_str() and Check_SafeStr() are obsolete; use StringValue() instead")) +/** + * @private + * + * @deprecated This function once was a thing in the old days, but makes no + * sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + */ +void rb_check_safe_str(VALUE); + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define Check_SafeStr(v) rb_check_safe_str(RBIMPL_CAST((VALUE)(v))) + +/** + * @private + * + * Prints diagnostic message to stderr when RSTRING_PTR or RSTRING_END + * is NULL. + * + * @param[in] func The function name where encountered NULL pointer. + */ +void rb_debug_rstring_null_ptr(const char *func); +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries the length of the string. + * + * @param[in] str String in question. + * @return Its length, in bytes. + * @pre `str` must be an instance of ::RString, and must has its + * ::RSTRING_NOEMBED flag off. + * + * @internal + * + * This was a macro before. It was inevitable to be public, since macros are + * global constructs. But should it be forever? Now that it is a function, + * @shyouhei thinks it could just be eliminated, hidden into implementation + * details. + */ +static inline long +RSTRING_EMBED_LEN(VALUE str) +{ + RBIMPL_ASSERT_TYPE(str, RUBY_T_STRING); + RBIMPL_ASSERT_OR_ASSUME(! RB_FL_ANY_RAW(str, RSTRING_NOEMBED)); + +#if USE_RVARGC + long f = RSTRING(str)->as.embed.len; + return f; +#else + VALUE f = RBASIC(str)->flags; + f &= RSTRING_EMBED_LEN_MASK; + f >>= RSTRING_EMBED_LEN_SHIFT; + return RBIMPL_CAST((long)f); +#endif +} + +RBIMPL_WARNING_PUSH() +#if RBIMPL_COMPILER_IS(Intel) +RBIMPL_WARNING_IGNORED(413) +#endif + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * @private + * + * "Expands" an embedded string into an ordinal one. This is a function that + * returns aggregated type. The returned struct always has its `as.heap.len` + * an `as.heap.ptr` fields set appropriately. + * + * This is an implementation detail that 3rd parties should never bother. + */ +static inline struct RString +rbimpl_rstring_getmem(VALUE str) +{ + RBIMPL_ASSERT_TYPE(str, RUBY_T_STRING); + + if (RB_FL_ANY_RAW(str, RSTRING_NOEMBED)) { + return *RSTRING(str); + } + else { + /* Expecting compilers to optimize this on-stack struct away. */ + struct RString retval; + retval.as.heap.len = RSTRING_EMBED_LEN(str); + retval.as.heap.ptr = RSTRING(str)->as.embed.ary; + return retval; + } +} + +RBIMPL_WARNING_POP() + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries the length of the string. + * + * @param[in] str String in question. + * @return Its length, in bytes. + * @pre `str` must be an instance of ::RString. + */ +static inline long +RSTRING_LEN(VALUE str) +{ + return rbimpl_rstring_getmem(str).as.heap.len; +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries the contents pointer of the string. + * + * @param[in] str String in question. + * @return Pointer to its contents. + * @pre `str` must be an instance of ::RString. + */ +static inline char * +RSTRING_PTR(VALUE str) +{ + char *ptr = rbimpl_rstring_getmem(str).as.heap.ptr; + + if (RB_UNLIKELY(! ptr)) { + /* :BEWARE: @shyouhei thinks that currently, there are rooms for this + * function to return NULL. In the 20th century that was a pointless + * concern. However struct RString can hold fake strings nowadays. It + * seems no check against NULL are exercised around handling of them + * (one of such usages is located in marshal.c, which scares + * @shyouhei). Better check here for maximum safety. + * + * Also, this is not rb_warn() because RSTRING_PTR() can be called + * during GC (see what obj_info() does). rb_warn() needs to allocate + * Ruby objects. That is not possible at this moment. */ + rb_debug_rstring_null_ptr("RSTRING_PTR"); + } + + return ptr; +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries the end of the contents pointer of the string. + * + * @param[in] str String in question. + * @return Pointer to its end of contents. + * @pre `str` must be an instance of ::RString. + */ +static inline char * +RSTRING_END(VALUE str) +{ + struct RString buf = rbimpl_rstring_getmem(str); + + if (RB_UNLIKELY(! buf.as.heap.ptr)) { + /* Ditto. */ + rb_debug_rstring_null_ptr("RSTRING_END"); + } + + return &buf.as.heap.ptr[buf.as.heap.len]; +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * Identical to RSTRING_LEN(), except it differs for the return type. + * + * @param[in] str String in question. + * @exception rb_eRangeError Too long. + * @return Its length, in bytes. + * @pre `str` must be an instance of ::RString. + * + * @internal + * + * This API seems redundant but has actual usages. + */ +static inline int +RSTRING_LENINT(VALUE str) +{ + return rb_long2int(RSTRING_LEN(str)); +} + +/** + * Convenient macro to obtain the contents and length at once. + * + * @param str String in question. + * @param ptrvar Variable where its contents is stored. + * @param lenvar Variable where its length is stored. + */ +#ifdef HAVE_STMT_AND_DECL_IN_EXPR +# define RSTRING_GETMEM(str, ptrvar, lenvar) \ + __extension__ ({ \ + struct RString rbimpl_str = rbimpl_rstring_getmem(str); \ + (ptrvar) = rbimpl_str.as.heap.ptr; \ + (lenvar) = rbimpl_str.as.heap.len; \ + }) +#else +# define RSTRING_GETMEM(str, ptrvar, lenvar) \ + ((ptrvar) = RSTRING_PTR(str), \ + (lenvar) = RSTRING_LEN(str)) +#endif /* HAVE_STMT_AND_DECL_IN_EXPR */ +#endif /* RBIMPL_RSTRING_H */ diff --git a/libs/libruby/ruby/internal/core/rstruct.h b/libs/libruby/ruby/internal/core/rstruct.h new file mode 100644 index 0000000..69be487 --- /dev/null +++ b/libs/libruby/ruby/internal/core/rstruct.h @@ -0,0 +1,121 @@ +#ifndef RBIMPL_RSTRUCT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RSTRUCT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines to manipulate struct RStruct. + * @note The struct RStruct itself is opaque. + */ +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/value_type.h" +#include "ruby/internal/arithmetic/long.h" +#include "ruby/internal/arithmetic/int.h" +#if !defined RUBY_EXPORT && !defined RUBY_NO_OLD_COMPATIBILITY +# include "ruby/backward.h" +#endif + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + * + * @internal + * + * Declaration of rb_struct_ptr() is at include/ruby/backward.h. + */ +#define RSTRUCT_PTR(st) rb_struct_ptr(st) +/** @cond INTERNAL_MACRO */ +#define RSTRUCT_LEN RSTRUCT_LEN +#define RSTRUCT_SET RSTRUCT_SET +#define RSTRUCT_GET RSTRUCT_GET +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * Returns the number of struct members. + * + * @param[in] st An instance of RStruct. + * @return The number of members of `st`. + * @pre `st` must be of ::RUBY_T_STRUCT. + */ +VALUE rb_struct_size(VALUE st); + +/** + * Resembles `Struct#[]`. + * + * @param[in] st An instance of RStruct. + * @param[in] k Index a.k.a. key of the struct. + * @exception rb_eTypeError `k` is neither Numeric, Symbol, nor String. + * @exception rb_eIndexError Numerical index out of range. + * @exception rb_eNameError No such key. + * @return The member stored at `k` in `st`. + * @pre `st` must be of ::RUBY_T_STRUCT. + */ +VALUE rb_struct_aref(VALUE st, VALUE k); + +/** + * Resembles `Struct#[]=`. + * + * @param[out] st An instance of RStruct. + * @param[in] k Index a.k.a. key of the struct. + * @param[in] v Value to store. + * @exception rb_eTypeError `k` is neither Numeric, Symbol, nor String. + * @exception rb_eIndexError Numerical index out of range. + * @exception rb_eNameError No such key. + * @return Passed `v`. + * @pre `st` must be of ::RUBY_T_STRUCT. + * @post `v` is stored at `k` in `st`. + */ +VALUE rb_struct_aset(VALUE st, VALUE k, VALUE v); +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_ARTIFICIAL() +/** @copydoc rb_struct_size() */ +static inline long +RSTRUCT_LEN(VALUE st) +{ + RBIMPL_ASSERT_TYPE(st, RUBY_T_STRUCT); + + return RB_NUM2LONG(rb_struct_size(st)); +} + +RBIMPL_ATTR_ARTIFICIAL() +/** @copydoc rb_struct_aset() */ +static inline VALUE +RSTRUCT_SET(VALUE st, int k, VALUE v) +{ + RBIMPL_ASSERT_TYPE(st, RUBY_T_STRUCT); + + return rb_struct_aset(st, INT2NUM(k), (v)); +} + +RBIMPL_ATTR_ARTIFICIAL() +/** @copydoc rb_struct_aref() */ +static inline VALUE +RSTRUCT_GET(VALUE st, int k) +{ + RBIMPL_ASSERT_TYPE(st, RUBY_T_STRUCT); + + return rb_struct_aref(st, INT2NUM(k)); +} + +#endif /* RBIMPL_RSTRUCT_H */ diff --git a/libs/libruby/ruby/internal/core/rtypeddata.h b/libs/libruby/ruby/internal/core/rtypeddata.h new file mode 100644 index 0000000..bbf2088 --- /dev/null +++ b/libs/libruby/ruby/internal/core/rtypeddata.h @@ -0,0 +1,604 @@ +#ifndef RBIMPL_RTYPEDDATA_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RTYPEDDATA_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines struct ::RTypedData. + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#include "ruby/internal/assume.h" +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/flag_enum.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/core/rdata.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/error.h" +#include "ruby/internal/fl_type.h" +#include "ruby/internal/stdbool.h" +#include "ruby/internal/value_type.h" + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define HAVE_TYPE_RB_DATA_TYPE_T 1 + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define HAVE_RB_DATA_TYPE_T_FUNCTION 1 + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define HAVE_RB_DATA_TYPE_T_PARENT 1 + +/** + * This is a value you can set to ::rb_data_type_struct::dfree. Setting this + * means the data was allocated using ::ruby_xmalloc() (or variants), and shall + * be freed using ::ruby_xfree(). + * + * @warning Do not use this if you want to use system malloc, because the + * system and Ruby might or might not share the same malloc + * implementation. + */ +#define RUBY_TYPED_DEFAULT_FREE RUBY_DEFAULT_FREE + +/** + * This is a value you can set to ::rb_data_type_struct::dfree. Setting this + * means the data is managed by someone else, like, statically allocated. Of + * course you are on your own then. + */ +#define RUBY_TYPED_NEVER_FREE RUBY_NEVER_FREE + +/** + * Convenient casting macro. + * + * @param obj An object, which is in fact an ::RTypedData. + * @return The passed object casted to ::RTypedData. + */ +#define RTYPEDDATA(obj) RBIMPL_CAST((struct RTypedData *)(obj)) + +/** + * Convenient getter macro. + * + * @param v An object, which is in fact an ::RTypedData. + * @return The passed object's ::RTypedData::data field. + */ +#define RTYPEDDATA_DATA(v) (RTYPEDDATA(v)->data) + +/** @old{rb_check_typeddata} */ +#define Check_TypedStruct(v, t) \ + rb_check_typeddata(RBIMPL_CAST((VALUE)(v)), (t)) + +/** @cond INTERNAL_MACRO */ +#define RTYPEDDATA_P RTYPEDDATA_P +#define RTYPEDDATA_TYPE RTYPEDDATA_TYPE +#define RUBY_TYPED_FREE_IMMEDIATELY RUBY_TYPED_FREE_IMMEDIATELY +#define RUBY_TYPED_FROZEN_SHAREABLE RUBY_TYPED_FROZEN_SHAREABLE +#define RUBY_TYPED_WB_PROTECTED RUBY_TYPED_WB_PROTECTED +#define RUBY_TYPED_PROMOTED1 RUBY_TYPED_PROMOTED1 +/** @endcond */ + +/** + * @private + * + * Bits for rb_data_type_struct::flags. + */ +enum +RBIMPL_ATTR_FLAG_ENUM() +rbimpl_typeddata_flags { + /** + * This flag has something to do with Ruby's global interpreter lock. For + * maximum safety, Ruby locks the entire VM during GC. However your + * callback functions could unintentionally unlock it, for instance when + * they try to flush an IO buffer. Such operations are dangerous (threads + * then run alongside of GC). By default, to prevent those scenario, + * callbacks are deferred until the GC engine is 100% sure threads can run. + * This flag skips that; structs with it are deallocated during the sweep + * phase. + * + * Using this flag needs deep understanding of both GC and threads. You + * would better leave it unspecified. + */ + RUBY_TYPED_FREE_IMMEDIATELY = 1, + + /** + * This flag has something to do with Ractor. Multiple Ractors run without + * protecting each other. Sharing an object among Ractors is basically + * dangerous, disabled by default. This flag is used to bypass that + * restriction. but setting it is not enough. In addition to do so, an + * object also has to be frozen, and be passed to + * rb_ractor_make_shareable() before being actually shareable. Of course, + * you have to manually prevent race conditions then. + * + * Using this flag needs deep understanding of multithreaded programming. + * You would better leave it unspecified. + */ + RUBY_TYPED_FROZEN_SHAREABLE = RUBY_FL_SHAREABLE, + + /** + * This flag has something to do with our garbage collector. These days + * ruby objects are "generational". There are those who are young and + * those who are old. Young objects are prone to die; monitored relatively + * extensively by the garbage collector. OTOH old objects tend to live + * longer. They are relatively rarely considered. This basically works. + * But there is one tweak that has to be exercised. When an elder object + * has reference(s) to younger one(s), that referenced objects must not + * die. In order to detect additions of such references, old generations + * are protected by write barriers. It is a very difficult hack to + * appropriately insert write barriers everywhere. This mechanism is + * disabled by default for 3rd party extensions (they never get aged). By + * specifying this flag you can enable the generational feature to your + * data structure. Of course, you have to manually insert write barriers + * then. + * + * Using this flag needs deep understanding of GC internals, often at the + * level of source code. You would better leave it unspecified. + */ + RUBY_TYPED_WB_PROTECTED = RUBY_FL_WB_PROTECTED, /* THIS FLAG DEPENDS ON Ruby version */ + + /** + * This flag is mysterious. It seems nobody is currently using it. The + * intention of this flag is also unclear. We need further investigations. + */ + RUBY_TYPED_PROMOTED1 = RUBY_FL_PROMOTED1 /* THIS FLAG DEPENDS ON Ruby version */ +}; + +/** + * This is the struct that holds necessary info for a struct. It roughly + * resembles a Ruby level class; multiple objects can share a ::rb_data_type_t + * instance. + */ +typedef struct rb_data_type_struct rb_data_type_t; + +/** @copydoc rb_data_type_t */ +struct rb_data_type_struct { + + /** + * Name of structs of this kind. This is used for diagnostic purposes. + * This has to be unique in the process, but doesn't has to be a valid + * C/Ruby identifier. + */ + const char *wrap_struct_name; + + /** Function pointers. Resembles C++ `vtbl`.*/ + struct { + + /** + * This function is called when the object is experiencing GC marks. + * If it contains references to other Ruby objects, you need to mark + * them also. Otherwise GC will smash your data. + * + * @see rb_gc_mark() + * @warning This is called during GC runs. Object allocations are + * impossible at that moment (that is why GC runs). + */ + RUBY_DATA_FUNC dmark; + + /** + * This function is called when the object is no longer used. You need + * to do whatever necessary to avoid memory leaks. + * + * @warning This is called during GC runs. Object allocations are + * impossible at that moment (that is why GC runs). + */ + RUBY_DATA_FUNC dfree; + + /** + * This function is to query the size of the underlying memory regions. + * + * @internal + * + * This function has only one usage, which is form inside of + * `ext/objspace`. + */ + size_t (*dsize)(const void *); + + /** + * This function is called when the object is relocated. Like + * ::rb_data_type_struct::dmark, you need to update references to Ruby + * objects inside of your structs. + * + * @see rb_gc_location() + * @warning This is called during GC runs. Object allocations are + * impossible at that moment (that is why GC runs). + */ + RUBY_DATA_FUNC dcompact; + + /** + * This field is reserved for future extension. For now, it must be + * filled with zeros. + */ + void *reserved[1]; /* For future extension. + This array *must* be filled with ZERO. */ + } function; + + /** + * Parent of this class. Sometimes C structs have inheritance-like + * relationships. An example is `struct sockaddr` and its family. If you + * design such things, make ::rb_data_type_t for each of them and connect + * using this field. Ruby can then transparently cast your data back and + * forth when you call #TypedData_Get_Struct(). + * + * ```CXX + * struct parent { }; + * static inline const rb_data_type_t parent_type = { + * .wrap_struct_name = "parent", + * }; + * + * struct child: public parent { }; + * static inline const rb_data_type_t child_type = { + * .wrap_struct_name = "child", + * .parent = &parent_type, + * }; + * + * // This function can take both parent_class and child_class. + * static inline struct parent * + * get_parent(VALUE v) + * { + * struct parent *p; + * TypedData_Get_Struct(v, parent_type, struct parent, p); + * return p; + * } + * ``` + */ + const rb_data_type_t *parent; + + /** + * Type-specific static data. This area can be used for any purpose by a + * programmer who define the type. Ruby does not manage this at all. + */ + void *data; /* This area can be used for any purpose + by a programmer who define the type. */ + + /** + * Type-specific behavioural characteristics. This is a bitfield. It is + * an EXTREMELY WISE IDEA to leave this field blank. It is designed so + * that setting zero is the safest thing to do. If you risk to set any + * bits on, you have to know exactly what you are doing. + * + * @internal + * + * Why it has to be a ::VALUE? @shyouhei doesn't understand the design. + */ + VALUE flags; /* RUBY_FL_WB_PROTECTED */ +}; + +/** + * "Typed" user data. By using this, extension libraries can wrap a C struct + * to make it visible from Ruby. For instance if you have a `struct timeval`, + * and you want users to use it, + * + * ```CXX + * static inline const rb_data_type_t timeval_type = { + * // Note that unspecified fields are 0-filled by default. + * .wrap_struct_name = "timeval", + * .function = { + * .dmark = nullptr, // no need to mark + * .dfree = RUBY_TYPED_DEFAULT_FREE, // use ruby_xfree() + * .dsize = [](auto) { + * return sizeof(struct timeval); + * }, + * }, + * }; + * + * extern "C" void + * Init_timeval(void) + * { + * auto klass = rb_define_class("YourName", rb_cObject); + * + * rb_define_alloc_func(klass, [](auto klass) { + * struct timeval *t; + * auto ret = TypedData_Make_Struct( + * klass, struct timeval, &timeval_type, t); + * + * if (auto i = gettimeofday(t, nullptr); i == -1) { + * rb_sys_fail("gettimeofday(3)"); + * } + * else { + * return ret; + * } + * }); + * } + * ``` + */ +struct RTypedData { + + /** The part that all ruby objects have in common. */ + struct RBasic basic; + + /** + * This field stores various information about how Ruby should handle a + * data. This roughly resembles a Ruby level class (apart from method + * definition etc.) + */ + const rb_data_type_t *type; + + /** + * This has to be always 1. + * + * @internal + * + * Why, then, this is not a const ::VALUE? + */ + VALUE typed_flag; + + /** Pointer to the actual C level struct that you want to wrap. */ + void *data; +}; + +RBIMPL_SYMBOL_EXPORT_BEGIN() +RBIMPL_ATTR_NONNULL((3)) +/** + * This is the primitive way to wrap an existing C struct into ::RTypedData. + * + * @param[in] klass Ruby level class of the returning object. + * @param[in] datap Pointer to the target C struct. + * @param[in] type The characteristics of the passed data. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return An allocated object that wraps `datap`. + */ +VALUE rb_data_typed_object_wrap(VALUE klass, void *datap, const rb_data_type_t *type); + +/** + * Identical to rb_data_typed_object_wrap(), except it allocates a new data + * region internally instead of taking an existing one. The allocation is done + * using ruby_calloc(). Hence it makes no sense for `type->function.dfree` to + * be anything other than ::RUBY_TYPED_DEFAULT_FREE. + * + * @param[in] klass Ruby level class of the returning object. + * @param[in] size Requested size of memory to allocate. + * @param[in] type The characteristics of the passed data. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return An allocated object that wraps a new `size` byte region. + */ +VALUE rb_data_typed_object_zalloc(VALUE klass, size_t size, const rb_data_type_t *type); + +/** + * Checks for the domestic relationship between the two. + * + * @param[in] child A data type supposed to be a child of `parent`. + * @param[in] parent A data type supposed to be a parent of `child`. + * @retval true `child` is a descendent of `parent`. + * @retval false Otherwise. + * + * @internal + * + * You can path NULL to both arguments, don't know what that means though. + */ +int rb_typeddata_inherited_p(const rb_data_type_t *child, const rb_data_type_t *parent); + +/** + * Checks if the given object is of given kind. + * + * @param[in] obj An instance of ::RTypedData. + * @param[in] data_type Expected data type of `obj`. + * @retval true `obj` is of `data_type`. + * @retval false Otherwise. + */ +int rb_typeddata_is_kind_of(VALUE obj, const rb_data_type_t *data_type); + +/** + * Identical to rb_typeddata_is_kind_of(), except it raises exceptions instead + * of returning false. + * + * @param[in] obj An instance of ::RTypedData. + * @param[in] data_type Expected data type of `obj`. + * @exception rb_eTypeError obj is not of `data_type`. + * @return Unwrapped C struct that `obj` holds. + * @post Upon successful return `obj`'s type is guaranteed `data_type`. + */ +void *rb_check_typeddata(VALUE obj, const rb_data_type_t *data_type); +RBIMPL_SYMBOL_EXPORT_END() + +/** + * Converts sval, a pointer to your struct, into a Ruby object. + * + * @param klass A ruby level class. + * @param data_type The type of `sval`. + * @param sval A pointer to your struct. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return A created Ruby object. + */ +#define TypedData_Wrap_Struct(klass,data_type,sval)\ + rb_data_typed_object_wrap((klass),(sval),(data_type)) + +/** + * @private + * + * This is an implementation detail of #TypedData_Make_Struct. People don't + * use it directly. + * + * @param result Variable name of created Ruby object. + * @param klass Ruby level class of the object. + * @param type Type name of the C struct. + * @param size Size of the C struct. + * @param data_type The data type describing `type`. + * @param sval Variable name of created C struct. + */ +#define TypedData_Make_Struct0(result, klass, type, size, data_type, sval) \ + VALUE result = rb_data_typed_object_zalloc(klass, size, data_type); \ + (sval) = RBIMPL_CAST((type *)RTYPEDDATA_DATA(result)); \ + RBIMPL_CAST(/*suppress unused variable warnings*/(void)(sval)) + +/** + * Identical to #TypedData_Wrap_Struct, except it allocates a new data region + * internally instead of taking an existing one. The allocation is done using + * ruby_calloc(). Hence it makes no sense for `data_type->function.dfree` to + * be anything other than ::RUBY_TYPED_DEFAULT_FREE. + * + * @param klass Ruby level class of the object. + * @param type Type name of the C struct. + * @param data_type The data type describing `type`. + * @param sval Variable name of created C struct. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return A created Ruby object. + */ +#ifdef HAVE_STMT_AND_DECL_IN_EXPR +#define TypedData_Make_Struct(klass, type, data_type, sval) \ + RB_GNUC_EXTENSION({ \ + TypedData_Make_Struct0( \ + data_struct_obj, \ + klass, \ + type, \ + sizeof(type), \ + data_type, \ + sval); \ + data_struct_obj; \ + }) +#else +#define TypedData_Make_Struct(klass, type, data_type, sval) \ + rb_data_typed_object_make( \ + (klass), \ + (data_type), \ + RBIMPL_CAST((void **)&(sval)), \ + sizeof(type)) +#endif + +/** + * Obtains a C struct from inside of a wrapper Ruby object. + * + * @param obj An instance of ::RTypedData. + * @param type Type name of the C struct. + * @param data_type The data type describing `type`. + * @param sval Variable name of obtained C struct. + * @exception rb_eTypeError `obj` is not a kind of `data_type`. + * @return Unwrapped C struct that `obj` holds. + */ +#define TypedData_Get_Struct(obj,type,data_type,sval) \ + ((sval) = RBIMPL_CAST((type *)rb_check_typeddata((obj), (data_type)))) + +RBIMPL_ATTR_PURE() +RBIMPL_ATTR_ARTIFICIAL() +/** + * @private + * + * This is an implementation detail of Check_Type(). People don't use it + * directly. + * + * @param[in] obj Object in question + * @retval true `obj` is an instance of ::RTypedData. + * @retval false `obj` is an instance of ::RData. + * @pre `obj` must be a Ruby object of ::RUBY_T_DATA. + */ +static inline bool +rbimpl_rtypeddata_p(VALUE obj) +{ + return RTYPEDDATA(obj)->typed_flag == 1; +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Checks whether the passed object is ::RTypedData or ::RData. + * + * @param[in] obj Object in question + * @retval true `obj` is an instance of ::RTypedData. + * @retval false `obj` is an instance of ::RData. + * @pre `obj` must be a Ruby object of ::RUBY_T_DATA. + */ +static inline bool +RTYPEDDATA_P(VALUE obj) +{ +#if RUBY_DEBUG + if (RB_UNLIKELY(! RB_TYPE_P(obj, RUBY_T_DATA))) { + Check_Type(obj, RUBY_T_DATA); + RBIMPL_UNREACHABLE_RETURN(false); + } +#endif + + return rbimpl_rtypeddata_p(obj); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/* :TODO: can this function be __attribute__((returns_nonnull)) or not? */ +/** + * Queries for the type of given object. + * + * @param[in] obj Object in question + * @return Data type struct that corresponds to `obj`. + * @pre `obj` must be an instance of ::RTypedData. + */ +static inline const struct rb_data_type_struct * +RTYPEDDATA_TYPE(VALUE obj) +{ +#if RUBY_DEBUG + if (RB_UNLIKELY(! RTYPEDDATA_P(obj))) { + rb_unexpected_type(obj, RUBY_T_DATA); + RBIMPL_UNREACHABLE_RETURN(NULL); + } +#endif + + return RTYPEDDATA(obj)->type; +} + +/** + * While we don't stop you from using this function, it seems to be an + * implementation detail of #TypedData_Make_Struct, which is preferred over + * this one. + * + * @param[in] klass Ruby level class of the returning object. + * @param[in] type The data type + * @param[out] datap Return pointer. + * @param[in] size Size of the C struct. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eNoMemError Out of memory. + * @return A created Ruby object. + * @post `*datap` points to the C struct wrapped by the returned object. + */ +static inline VALUE +rb_data_typed_object_make(VALUE klass, const rb_data_type_t *type, void **datap, size_t size) +{ + TypedData_Make_Struct0(result, klass, void, size, type, *datap); + return result; +} + +RBIMPL_ATTR_DEPRECATED(("by: rb_data_typed_object_wrap")) +/** @deprecated This function was renamed to rb_data_typed_object_wrap(). */ +static inline VALUE +rb_data_typed_object_alloc(VALUE klass, void *datap, const rb_data_type_t *type) +{ + return rb_data_typed_object_wrap(klass, datap, type); +} + +#endif /* RBIMPL_RTYPEDDATA_H */ diff --git a/libs/libruby/ruby/internal/ctype.h b/libs/libruby/ruby/internal/ctype.h new file mode 100644 index 0000000..0f7ca6c --- /dev/null +++ b/libs/libruby/ruby/internal/ctype.h @@ -0,0 +1,545 @@ +#ifndef RBIMPL_CTYPE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_CTYPE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Our own, locale independent, character handling routines. + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/constexpr.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" + +/** + * @name Old character classification macros + * + * What is this #ISPRINT business? Well, according to our VCS and some + * internet surfing, it appears that the initial intent of these macros were to + * mimic codes appear in common in several GNU projects. As far as @shyouhei + * detects they seem to originate GNU regex (that standalone one rather than + * Gnulib or Glibc), and at least date back to 1995. + * + * Let me lawfully quote from a GNU coreutils commit + * https://git.savannah.gnu.org/cgit/coreutils.git/commit/?id=49803907f5dbd7646184a8912c9db9b09dcd0f22 + * + * > Jim Meyering writes: + * > + * > "... Some ctype macros are valid only for character codes that + * > isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when + * > using /bin/cc or gcc but without giving an ansi option). So, all + * > ctype uses should be through macros like ISPRINT... If + * > STDC_HEADERS is defined, then autoconf has verified that the ctype + * > macros don't need to be guarded with references to isascii. ... + * > Defining isascii to 1 should let any compiler worth its salt + * > eliminate the && through constant folding." + * > + * > Bruno Haible adds: + * > + * > "... Furthermore, isupper(c) etc. have an undefined result if c is + * > outside the range -1 <= c <= 255. One is tempted to write isupper(c) + * > with c being of type `char', but this is wrong if c is an 8-bit + * > character >= 128 which gets sign-extended to a negative value. + * > The macro ISUPPER protects against this as well." + * + * So the intent was to reroute old problematic systems that no longer exist. + * At the same time the problems described above no longer hurt us, because we + * decided to completely avoid using system-provided isupper etc. to reinvent + * the wheel. These macros are entirely legacy; please ignore them. + * + * But let me also put stress that GNU people are wise; they use those macros + * only inside of their own implementations and never let them be public. On + * the other hand ruby has thoughtlessly publicised them to 3rd party libraries + * since its beginning, which is a very bad idea. These macros are too easy to + * get conflicted with definitions elsewhere. + * + * New programs should stick to the `rb_` prefixed names. + * + * @note It seems we just mimic the API. We do not share their implementation + * with GPL-ed programs. + * + * @{ + */ +#ifndef ISPRINT +# define ISASCII rb_isascii /**< @old{rb_isascii}*/ +# define ISPRINT rb_isprint /**< @old{rb_isprint}*/ +# define ISGRAPH rb_isgraph /**< @old{rb_isgraph}*/ +# define ISSPACE rb_isspace /**< @old{rb_isspace}*/ +# define ISUPPER rb_isupper /**< @old{rb_isupper}*/ +# define ISLOWER rb_islower /**< @old{rb_islower}*/ +# define ISALNUM rb_isalnum /**< @old{rb_isalnum}*/ +# define ISALPHA rb_isalpha /**< @old{rb_isalpha}*/ +# define ISDIGIT rb_isdigit /**< @old{rb_isdigit}*/ +# define ISXDIGIT rb_isxdigit /**< @old{rb_isxdigit}*/ +# define ISBLANK rb_isblank /**< @old{rb_isblank}*/ +# define ISCNTRL rb_iscntrl /**< @old{rb_iscntrl}*/ +# define ISPUNCT rb_ispunct /**< @old{rb_ispunct}*/ +#endif + +#define TOUPPER rb_toupper /**< @old{rb_toupper}*/ +#define TOLOWER rb_tolower /**< @old{rb_tolower}*/ +#define STRCASECMP st_locale_insensitive_strcasecmp /**< @old{st_locale_insensitive_strcasecmp}*/ +#define STRNCASECMP st_locale_insensitive_strncasecmp /**< @old{st_locale_insensitive_strncasecmp}*/ +#define STRTOUL ruby_strtoul /**< @old{ruby_strtoul}*/ + +/** @} */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** @name locale insensitive functions + * @{ + */ + +/* In descriptions below, `the POSIX Locale` and `the "C" locale` are tactfully + * used as to whether the described function mimics POSIX or C99. */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Our own locale-insensitive version of `strcasecmp(3)`. The "case" here + * always means that of the POSIX Locale. It doesn't depend on runtime locale + * settings. + * + * @param[in] s1 Comparison LHS. + * @param[in] s2 Comparison RHS. + * @retval -1 `s1` is "less" than `s2`. + * @retval 0 Both strings converted into lowercase would be identical. + * @retval 1 `s1` is "greater" than `s2`. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + */ +int st_locale_insensitive_strcasecmp(const char *s1, const char *s2); + +RBIMPL_ATTR_NONNULL(()) +/** + * Our own locale-insensitive version of `strcnasecmp(3)`. The "case" here + * always means that of the POSIX Locale. It doesn't depend on runtime locale + * settings. + * + * @param[in] s1 Comparison LHS. + * @param[in] s2 Comparison RHS. + * @param[in] n Comparison shall stop after first `n` bytes are scanned. + * @retval -1 `s1` is "less" than `s2`. + * @retval 0 Both strings converted into lowercase would be identical. + * @retval 1 `s1` is "greater" than `s2`. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning This function is _not_ timing safe. + */ +int st_locale_insensitive_strncasecmp(const char *s1, const char *s2, size_t n); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Our own locale-insensitive version of `strtoul(3)`. The conversion is done + * as if the current locale is set to the "C" locale, no matter actual runtime + * locale settings. + * + * @note This is needed because `strtoul("i", 0, 36)` would return zero + * if it is locale sensitive and the current locale is `tr_TR`. + * @param[in] str String of digits, optionally preceded with whitespaces + * (ignored) and optionally `+` or `-` sign. + * @param[out] endptr NULL, or an arbitrary pointer (overwritten on return). + * @param[in] base `2` to `36` inclusive for each base, or special case + * `0` to detect the base from the contents of the string. + * @return Converted integer, casted to unsigned long. + * @post If `endptr` is not NULL, it is updated to point the first such + * byte where conversion failed. + * @note This function sets `errno` on failure. + * - `EINVAL`: Passed `base` is out of range. + * - `ERANGE`: Converted integer is out of range of `long`. + * @warning As far as @shyouhei reads ISO/IEC 9899:2018 section 7.22.1.4, a + * conforming `strtoul` implementation shall render `ERANGE` + * whenever it finds the input string represents a negative + * integer. Such thing can never be representable using `unsigned + * long`. However this implementation does not honour that + * language. It just casts such negative value to the return + * type, resulting a very big return value. This behaviour is at + * least questionable. But we can no longer change that at this + * point. + * @note Not only does this function works under the "C" locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + */ +unsigned long ruby_strtoul(const char *str, char **endptr, int base); +RBIMPL_SYMBOL_EXPORT_END() + +/* + * We are making the functions below to return `int` instead of `bool`. They + * have been as such since their birth at 5f237d79033b2109afb768bc889611fa9630. + */ + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `isascii(3)`. + * + * @param[in] c Byte in question to query. + * @retval false `c` is out of range of ASCII character set. + * @retval true Yes it is. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_isascii(int c) +{ + return '\0' <= c && c <= '\x7f'; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `isupper(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in IEEE 1003.1 section 7.3.1.1 "upper". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_isupper(int c) +{ + return 'A' <= c && c <= 'Z'; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `islower(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in IEEE 1003.1 section 7.3.1.1 "lower". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_islower(int c) +{ + return 'a' <= c && c <= 'z'; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `isalpha(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in either IEEE 1003.1 section 7.3.1.1 + * "upper" or "lower". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_isalpha(int c) +{ + return rb_isupper(c) || rb_islower(c); +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `isdigit(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in IEEE 1003.1 section 7.3.1.1 "digit". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_isdigit(int c) +{ + return '0' <= c && c <= '9'; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `isalnum(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in either IEEE 1003.1 section 7.3.1.1 + * "upper", "lower", or "digit". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_isalnum(int c) +{ + return rb_isalpha(c) || rb_isdigit(c); +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `isxdigit(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in IEEE 1003.1 section 7.3.1.1 "xdigit". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_isxdigit(int c) +{ + return rb_isdigit(c) || ('A' <= c && c <= 'F') || ('a' <= c && c <= 'f'); +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `isblank(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in IEEE 1003.1 section 7.3.1.1 "blank". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_isblank(int c) +{ + return c == ' ' || c == '\t'; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `isspace(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in IEEE 1003.1 section 7.3.1.1 "space". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_isspace(int c) +{ + return c == ' ' || ('\t' <= c && c <= '\r'); +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `iscntrl(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in IEEE 1003.1 section 7.3.1.1 "cntrl". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_iscntrl(int c) +{ + return ('\0' <= c && c < ' ') || c == '\x7f'; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Identical to rb_isgraph(), except it also returns true for `' '`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in either IEEE 1003.1 section 7.3.1.1 + * "upper", "lower", "digit", "punct", or a `' '`. + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_isprint(int c) +{ + return ' ' <= c && c <= '\x7e'; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `ispunct(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in IEEE 1003.1 section 7.3.1.1 "punct". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_ispunct(int c) +{ + return !rb_isalnum(c); +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `isgraph(3)`. + * + * @param[in] c Byte in question to query. + * @retval true `c` is listed in either IEEE 1003.1 section 7.3.1.1 + * "upper", "lower", "digit", or "punct". + * @retval false Anything else. + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_isgraph(int c) +{ + return '!' <= c && c <= '\x7e'; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `tolower(3)`. + * + * @param[in] c Byte in question to convert. + * @retval c The byte is not listed in in IEEE 1003.1 section + * 7.3.1.1 "upper". + * @retval otherwise Byte converted using the map defined in IEEE 1003.1 + * section 7.3.1 "tolower". + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_tolower(int c) +{ + return rb_isupper(c) ? (c|0x20) : c; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Our own locale-insensitive version of `toupper(3)`. + * + * @param[in] c Byte in question to convert. + * @retval c The byte is not listed in in IEEE 1003.1 section + * 7.3.1.1 "lower". + * @retval otherwise Byte converted using the map defined in IEEE 1003.1 + * section 7.3.1 "toupper". + * @note Not only does this function works under the POSIX Locale, but + * also assumes its execution character set be what ruby calls an + * ASCII-compatible character set; which does not include for + * instance EBCDIC or UTF-16LE. + * @warning `c` is an int. This means that when you pass a `char` value + * here, it experiences "integer promotion" as defined in ISO/IEC + * 9899:2018 section 6.3.1.1 paragraph 1. + */ +static inline int +rb_toupper(int c) +{ + return rb_islower(c) ? (c&0x5f) : c; +} + +/** @} */ +#endif /* RBIMPL_CTYPE_H */ diff --git a/libs/libruby/ruby/internal/dllexport.h b/libs/libruby/ruby/internal/dllexport.h new file mode 100644 index 0000000..08a2622 --- /dev/null +++ b/libs/libruby/ruby/internal/dllexport.h @@ -0,0 +1,112 @@ +#ifndef RBIMPL_DLLEXPORT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_DLLEXPORT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Tweaking visibility of C variables/functions. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/compiler_is.h" + +/** + * Declaration of externally visible global variables. Here "externally" means + * they should be visible from extension libraries. Depending on operating + * systems (dynamic linkers, to be precise), global variables inside of a DLL + * may or may not be visible form outside of that DLL by default. This + * declaration manually tweaks that default and ensures the declared variable + * be truly globally visible. + * + * ```CXX + * extern VALUE foo; // hidden on some OS + * RUBY_EXTERN VALUE foo; // ensure visible + * ``` + */ +#undef RUBY_EXTERN +#if defined(MJIT_HEADER) && defined(_WIN32) +# define RUBY_EXTERN extern __declspec(dllimport) +#elif defined(RUBY_EXPORT) +# define RUBY_EXTERN extern +#elif defined(_WIN32) +# define RUBY_EXTERN extern __declspec(dllimport) +#else +# define RUBY_EXTERN extern +#endif + +#ifndef RUBY_SYMBOL_EXPORT_BEGIN +# define RUBY_SYMBOL_EXPORT_BEGIN /* begin */ +#endif + +#ifndef RUBY_SYMBOL_EXPORT_END +# define RUBY_SYMBOL_EXPORT_END /* end */ +#endif + +#ifndef RUBY_FUNC_EXPORTED +# define RUBY_FUNC_EXPORTED /* void */ +#endif + +/** + * @cond INTERNAL_MACRO + * + * These MJIT related macros are placed here because translate_mjit_header can + * need them. Extension libraries should not touch. + */ + +/* These macros are used for functions which are exported only for MJIT + and NOT ensured to be exported in future versions. */ + +#if ! defined(MJIT_HEADER) +# define MJIT_FUNC_EXPORTED RUBY_FUNC_EXPORTED +#elif ! RBIMPL_COMPILER_IS(MSVC) +# define MJIT_FUNC_EXPORTED RUBY_FUNC_EXPORTED +#else +# define MJIT_FUNC_EXPORTED static +#endif + +#define MJIT_SYMBOL_EXPORT_BEGIN RUBY_SYMBOL_EXPORT_BEGIN +#define MJIT_SYMBOL_EXPORT_END RUBY_SYMBOL_EXPORT_END + +/* On mswin, MJIT header transformation can't be used since cl.exe can't output + preprocessed output preserving macros. So this `MJIT_STATIC` is needed + to force non-static function to static on MJIT header to avoid symbol conflict. */ +#ifdef MJIT_HEADER +# define MJIT_STATIC static +#else +# define MJIT_STATIC +#endif + +/** @endcond */ + +/** Shortcut macro equivalent to `RUBY_SYMBOL_EXPORT_BEGIN extern "C" {`. + * \@shyouhei finds it handy. */ +#if defined(__DOXYGEN__) +# define RBIMPL_SYMBOL_EXPORT_BEGIN() /* void */ +#elif defined(__cplusplus) +# define RBIMPL_SYMBOL_EXPORT_BEGIN() RUBY_SYMBOL_EXPORT_BEGIN extern "C" { +#else +# define RBIMPL_SYMBOL_EXPORT_BEGIN() RUBY_SYMBOL_EXPORT_BEGIN +#endif + +/** Counterpart of #RBIMPL_SYMBOL_EXPORT_BEGIN */ +#if defined(__DOXYGEN__) +# define RBIMPL_SYMBOL_EXPORT_END() /* void */ +#elif defined(__cplusplus) +# define RBIMPL_SYMBOL_EXPORT_END() } RUBY_SYMBOL_EXPORT_END +#else +# define RBIMPL_SYMBOL_EXPORT_END() RUBY_SYMBOL_EXPORT_END +#endif +#endif /* RBIMPL_DLLEXPORT_H */ diff --git a/libs/libruby/ruby/internal/dosish.h b/libs/libruby/ruby/internal/dosish.h new file mode 100644 index 0000000..7d354dd --- /dev/null +++ b/libs/libruby/ruby/internal/dosish.h @@ -0,0 +1,89 @@ +#ifndef RBIMPL_DOSISH_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_DOSISH_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Support for so-called dosish systems. + */ +#ifdef __CYGWIN__ +#undef _WIN32 +#endif + +#if defined(_WIN32) +/* + DOSISH mean MS-Windows style filesystem. + But you should use more precise macros like DOSISH_DRIVE_LETTER, PATH_SEP, + ENV_IGNORECASE or CASEFOLD_FILESYSTEM. + */ +#define DOSISH 1 +# define DOSISH_DRIVE_LETTER +#endif + +#ifdef _WIN32 +#include "ruby/win32.h" +#endif + +/** The delimiter of `PATH` environment variable. */ +#if defined(DOSISH) +#define PATH_SEP ";" +#else +#define PATH_SEP ":" +#endif + +/** Identical to #PATH_SEP, except it is of type `char`. */ +#define PATH_SEP_CHAR PATH_SEP[0] + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + * + * @internal + * + * For historical interests: there was an operating system called Human68k + * which used an environment variable called `"path"` for this purpose. + */ +#define PATH_ENV "PATH" + +#if defined(DOSISH) +#define ENV_IGNORECASE +#endif + +/** + * Stone age assumption was that an operating system supports only one file + * system at a moment. This macro was to detect if such (one and only) file + * system has case sensitivity. This assumption is largely not true any + * longer; most operating systems can mount many kinds of file systems side by + * side. Also there are file systems that do or do not ignore cases depending + * on configuration (e.g. EXT4's `casefold` feature). + * + * This macro is still used internally (for instance Ruby level constant + * `File::FNM_SYSCASE` depends on it), but it is basically a wrong idea for you + * to use it today. Please just find another way. + */ +#ifndef CASEFOLD_FILESYSTEM +# if defined DOSISH +# define CASEFOLD_FILESYSTEM 1 +# else +# define CASEFOLD_FILESYSTEM 0 +# endif +#endif + +#endif /* RBIMPL_DOSISH_H */ diff --git a/libs/libruby/ruby/internal/encoding/coderange.h b/libs/libruby/ruby/internal/encoding/coderange.h new file mode 100644 index 0000000..7a81208 --- /dev/null +++ b/libs/libruby/ruby/internal/encoding/coderange.h @@ -0,0 +1,202 @@ +#ifndef RUBY_INTERNAL_ENCODING_CODERANGE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_INTERNAL_ENCODING_CODERANGE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines for code ranges. + */ + +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/fl_type.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** What rb_enc_str_coderange() returns. */ +enum ruby_coderange_type { + + /** The object's coderange is unclear yet. */ + RUBY_ENC_CODERANGE_UNKNOWN = 0, + + /** The object holds 0 to 127 inclusive and nothing else. */ + RUBY_ENC_CODERANGE_7BIT = ((int)RUBY_FL_USER8), + + /** The object's encoding and contents are consistent each other */ + RUBY_ENC_CODERANGE_VALID = ((int)RUBY_FL_USER9), + + /** The object holds invalid/malformed/broken character(s). */ + RUBY_ENC_CODERANGE_BROKEN = ((int)(RUBY_FL_USER8|RUBY_FL_USER9)), + + /** Where the coderange resides. */ + RUBY_ENC_CODERANGE_MASK = (RUBY_ENC_CODERANGE_7BIT| + RUBY_ENC_CODERANGE_VALID| + RUBY_ENC_CODERANGE_BROKEN) +}; + +RBIMPL_ATTR_CONST() +/** + * @private + * + * This is an implementation detail of #RB_ENC_CODERANGE_CLEAN_P. People don't + * use it directly. + * + * @param[in] cr An enum ::ruby_coderange_type. + * @retval 1 It is. + * @retval 0 It isn't. + */ +static inline int +rb_enc_coderange_clean_p(int cr) +{ + return (cr ^ (cr >> 1)) & RUBY_ENC_CODERANGE_7BIT; +} + +RBIMPL_ATTR_CONST() +/** + * Queries if a code range is "clean". "Clean" in this context means it is + * known and valid. + * + * @param[in] cr An enum ::ruby_coderange_type. + * @retval 1 It is. + * @retval 0 It isn't. + */ +static inline bool +RB_ENC_CODERANGE_CLEAN_P(enum ruby_coderange_type cr) +{ + return rb_enc_coderange_clean_p(cr); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +/** + * Queries the (inline) code range of the passed object. The object must be + * capable of having inline encoding. Using this macro needs deep + * understanding of bit level object binary layout. + * + * @param[in] obj Target object. + * @return An enum ::ruby_coderange_type. + */ +static inline enum ruby_coderange_type +RB_ENC_CODERANGE(VALUE obj) +{ + VALUE ret = RB_FL_TEST_RAW(obj, RUBY_ENC_CODERANGE_MASK); + + return RBIMPL_CAST((enum ruby_coderange_type)ret); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +/** + * Queries the (inline) code range of the passed object is + * ::RUBY_ENC_CODERANGE_7BIT. The object must be capable of having inline + * encoding. Using this macro needs deep understanding of bit level object + * binary layout. + * + * @param[in] obj Target object. + * @retval 1 It is ascii only. + * @retval 0 Otherwise (including cases when the range is not known). + */ +static inline bool +RB_ENC_CODERANGE_ASCIIONLY(VALUE obj) +{ + return RB_ENC_CODERANGE(obj) == RUBY_ENC_CODERANGE_7BIT; +} + +/** + * Destructively modifies the passed object so that its (inline) code range is + * the passed one. The object must be capable of having inline encoding. + * Using this macro needs deep understanding of bit level object binary layout. + * + * @param[out] obj Target object. + * @param[out] cr An enum ::ruby_coderange_type. + * @post `obj`'s code range is `cr`. + */ +static inline void +RB_ENC_CODERANGE_SET(VALUE obj, enum ruby_coderange_type cr) +{ + RB_FL_UNSET_RAW(obj, RUBY_ENC_CODERANGE_MASK); + RB_FL_SET_RAW(obj, cr); +} + +/** + * Destructively clears the passed object's (inline) code range. The object + * must be capable of having inline encoding. Using this macro needs deep + * understanding of bit level object binary layout. + * + * @param[out] obj Target object. + * @post `obj`'s code range is ::RUBY_ENC_CODERANGE_UNKNOWN. + */ +static inline void +RB_ENC_CODERANGE_CLEAR(VALUE obj) +{ + RB_FL_UNSET_RAW(obj, RUBY_ENC_CODERANGE_MASK); +} + +RBIMPL_ATTR_CONST() +/* assumed ASCII compatibility */ +/** + * "Mix" two code ranges into one. This is handy for instance when you + * concatenate two strings into one. Consider one of then is valid but the + * other isn't. The result must be invalid. This macro computes that kind of + * mixture. + * + * @param[in] a An enum ::ruby_coderange_type. + * @param[in] b Another enum ::ruby_coderange_type. + * @return The `a` "and" `b`. + */ +static inline enum ruby_coderange_type +RB_ENC_CODERANGE_AND(enum ruby_coderange_type a, enum ruby_coderange_type b) +{ + if (a == RUBY_ENC_CODERANGE_7BIT) { + return b; + } + else if (a != RUBY_ENC_CODERANGE_VALID) { + return RUBY_ENC_CODERANGE_UNKNOWN; + } + else if (b == RUBY_ENC_CODERANGE_7BIT) { + return RUBY_ENC_CODERANGE_VALID; + } + else { + return b; + } +} + +#define ENC_CODERANGE_MASK RUBY_ENC_CODERANGE_MASK /**< @old{RUBY_ENC_CODERANGE_MASK} */ +#define ENC_CODERANGE_UNKNOWN RUBY_ENC_CODERANGE_UNKNOWN /**< @old{RUBY_ENC_CODERANGE_UNKNOWN} */ +#define ENC_CODERANGE_7BIT RUBY_ENC_CODERANGE_7BIT /**< @old{RUBY_ENC_CODERANGE_7BIT} */ +#define ENC_CODERANGE_VALID RUBY_ENC_CODERANGE_VALID /**< @old{RUBY_ENC_CODERANGE_VALID} */ +#define ENC_CODERANGE_BROKEN RUBY_ENC_CODERANGE_BROKEN /**< @old{RUBY_ENC_CODERANGE_BROKEN} */ +#define ENC_CODERANGE_CLEAN_P(cr) RB_ENC_CODERANGE_CLEAN_P(cr) /**< @old{RB_ENC_CODERANGE_CLEAN_P} */ +#define ENC_CODERANGE(obj) RB_ENC_CODERANGE(obj) /**< @old{RB_ENC_CODERANGE} */ +#define ENC_CODERANGE_ASCIIONLY(obj) RB_ENC_CODERANGE_ASCIIONLY(obj) /**< @old{RB_ENC_CODERANGE_ASCIIONLY} */ +#define ENC_CODERANGE_SET(obj,cr) RB_ENC_CODERANGE_SET(obj,cr) /**< @old{RB_ENC_CODERANGE_SET} */ +#define ENC_CODERANGE_CLEAR(obj) RB_ENC_CODERANGE_CLEAR(obj) /**< @old{RB_ENC_CODERANGE_CLEAR} */ +#define ENC_CODERANGE_AND(a, b) RB_ENC_CODERANGE_AND(a, b) /**< @old{RB_ENC_CODERANGE_AND} */ +#define ENCODING_CODERANGE_SET(obj, encindex, cr) RB_ENCODING_CODERANGE_SET(obj, encindex, cr) /**< @old{RB_ENCODING_CODERANGE_SET} */ + +/** @cond INTERNAL_MACRO */ +#define RB_ENC_CODERANGE RB_ENC_CODERANGE +#define RB_ENC_CODERANGE_AND RB_ENC_CODERANGE_AND +#define RB_ENC_CODERANGE_ASCIIONLY RB_ENC_CODERANGE_ASCIIONLY +#define RB_ENC_CODERANGE_CLEAN_P RB_ENC_CODERANGE_CLEAN_P +#define RB_ENC_CODERANGE_CLEAR RB_ENC_CODERANGE_CLEAR +#define RB_ENC_CODERANGE_SET RB_ENC_CODERANGE_SET +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_INTERNAL_ENCODING_CODERANGE_H */ diff --git a/libs/libruby/ruby/internal/encoding/ctype.h b/libs/libruby/ruby/internal/encoding/ctype.h new file mode 100644 index 0000000..05c314a --- /dev/null +++ b/libs/libruby/ruby/internal/encoding/ctype.h @@ -0,0 +1,258 @@ +#ifndef RUBY_INTERNAL_ENCODING_CTYPE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_INTERNAL_ENCODING_CTYPE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines to query chacater types. + */ + +#include "ruby/onigmo.h" +#include "ruby/internal/attr/const.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/encoding/encoding.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Queries if the passed pointer points to a newline character. What is a + * newline and what is not depends on the passed encoding. + * + * @param[in] p Pointer to a possibly-middle of a character. + * @param[in] end End of the string. + * @param[in] enc Encoding. + * @retval false It isn't. + * @retval true It is. + */ +static inline bool +rb_enc_is_newline(const char *p, const char *e, rb_encoding *enc) +{ + OnigUChar *up = RBIMPL_CAST((OnigUChar *)p); + OnigUChar *ue = RBIMPL_CAST((OnigUChar *)e); + + return ONIGENC_IS_MBC_NEWLINE(enc, up, ue); +} + +/** + * Queries if the passed code point is of passed character type in the passed + * encoding. The "character type" here is a set of macros defined in onigmo.h, + * like `ONIGENC_CTYPE_PUNCT`. + * + * @param[in] c An `OnigCodePoint` value. + * @param[in] t An `OnigCtype` value. + * @param[in] enc A `rb_encoding*` value. + * @retval true `c` is of `t` in `enc`. + * @retval false Otherwise. + */ +static inline bool +rb_enc_isctype(OnigCodePoint c, OnigCtype t, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_CTYPE(enc, c, t); +} + +/** + * Identical to rb_isascii(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @retval false `c` is out of range of ASCII character set in `enc`. + * @retval true Otherwise. + * + * @internal + * + * `enc` is ignored. This is at least an intentional implementation detail + * (not a bug). But there could be rooms for future extensions. + */ +static inline bool +rb_enc_isascii(OnigCodePoint c, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_ASCII(c); +} + +/** + * Identical to rb_isalpha(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @retval true `enc` classifies `c` as "ALPHA". + * @retval false Otherwise. + */ +static inline bool +rb_enc_isalpha(OnigCodePoint c, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_ALPHA(enc, c); +} + +/** + * Identical to rb_islower(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @retval true `enc` classifies `c` as "LOWER". + * @retval false Otherwise. + */ +static inline bool +rb_enc_islower(OnigCodePoint c, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_LOWER(enc, c); +} + +/** + * Identical to rb_isupper(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @retval true `enc` classifies `c` as "UPPER". + * @retval false Otherwise. + */ +static inline bool +rb_enc_isupper(OnigCodePoint c, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_UPPER(enc, c); +} + +/** + * Identical to rb_iscntrl(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @retval true `enc` classifies `c` as "CNTRL". + * @retval false Otherwise. + */ +static inline bool +rb_enc_iscntrl(OnigCodePoint c, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_CNTRL(enc, c); +} + +/** + * Identical to rb_ispunct(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @retval true `enc` classifies `c` as "PUNCT". + * @retval false Otherwise. + */ +static inline bool +rb_enc_ispunct(OnigCodePoint c, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_PUNCT(enc, c); +} + +/** + * Identical to rb_isalnum(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @retval true `enc` classifies `c` as "ANUM". + * @retval false Otherwise. + */ +static inline bool +rb_enc_isalnum(OnigCodePoint c, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_ALNUM(enc, c); +} + +/** + * Identical to rb_isprint(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @retval true `enc` classifies `c` as "PRINT". + * @retval false Otherwise. + */ +static inline bool +rb_enc_isprint(OnigCodePoint c, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_PRINT(enc, c); +} + +/** + * Identical to rb_isspace(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @retval true `enc` classifies `c` as "PRINT". + * @retval false Otherwise. + */ +static inline bool +rb_enc_isspace(OnigCodePoint c, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_SPACE(enc, c); +} + +/** + * Identical to rb_isdigit(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @retval true `enc` classifies `c` as "DIGIT". + * @retval false Otherwise. + */ +static inline bool +rb_enc_isdigit(OnigCodePoint c, rb_encoding *enc) +{ + return ONIGENC_IS_CODE_DIGIT(enc, c); +} + +RBIMPL_ATTR_CONST() +/** + * Identical to rb_toupper(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @return `c`'s (Ruby's definition of) upper case counterpart. + * + * @internal + * + * As `RBIMPL_ATTR_CONST` implies this function ignores `enc`. + */ +int rb_enc_toupper(int c, rb_encoding *enc); + +RBIMPL_ATTR_CONST() +/** + * Identical to rb_tolower(), except it additionally takes an encoding. + * + * @param[in] c A code point. + * @param[in] enc An encoding. + * @return `c`'s (Ruby's definition of) lower case counterpart. + * + * @internal + * + * As `RBIMPL_ATTR_CONST` implies this function ignores `enc`. + */ +int rb_enc_tolower(int c, rb_encoding *enc); + +RBIMPL_SYMBOL_EXPORT_END() + +/** @cond INTERNAL_MACRO */ +#define rb_enc_is_newline rb_enc_is_newline +#define rb_enc_isalnum rb_enc_isalnum +#define rb_enc_isalpha rb_enc_isalpha +#define rb_enc_isascii rb_enc_isascii +#define rb_enc_isctype rb_enc_isctype +#define rb_enc_isdigit rb_enc_isdigit +#define rb_enc_islower rb_enc_islower +#define rb_enc_isprint rb_enc_isprint +#define rb_enc_iscntrl rb_enc_iscntrl +#define rb_enc_ispunct rb_enc_ispunct +#define rb_enc_isspace rb_enc_isspace +#define rb_enc_isupper rb_enc_isupper +/** @endcond */ + +#endif /* RUBY_INTERNAL_ENCODING_CTYPE_H */ diff --git a/libs/libruby/ruby/internal/encoding/encoding.h b/libs/libruby/ruby/internal/encoding/encoding.h new file mode 100644 index 0000000..4748ca8 --- /dev/null +++ b/libs/libruby/ruby/internal/encoding/encoding.h @@ -0,0 +1,1060 @@ +#ifndef RUBY_INTERNAL_ENCODING_ENCODING_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_INTERNAL_ENCODING_ENCODING_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines ::rb_encoding + */ + +#include "ruby/oniguruma.h" +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/deprecated.h" +#include "ruby/internal/attr/noalias.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/attr/returns_nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/fl_type.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * `Encoding` class. + * + * @ingroup object + */ +RUBY_EXTERN VALUE rb_cEncoding; + +/** + * @private + * + * Bit constants used when embedding encodings into ::RBasic::flags. Extension + * libraries must not bother such things. + */ +enum ruby_encoding_consts { + + /** Max possible number of embeddable encodings. */ + RUBY_ENCODING_INLINE_MAX = 127, + + /** Where inline encodings reside. */ + RUBY_ENCODING_SHIFT = (RUBY_FL_USHIFT+10), + + /** Bits we use to store inline encodings. */ + RUBY_ENCODING_MASK = (RUBY_ENCODING_INLINE_MAX<> RUBY_ENCODING_SHIFT; + + return RBIMPL_CAST((int)ret); +} + +#define ENCODING_SET_INLINED(obj,i) RB_ENCODING_SET_INLINED(obj,i) /**< @old{RB_ENCODING_SET_INLINED} */ +#define ENCODING_SET(obj,i) RB_ENCODING_SET(obj,i) /**< @old{RB_ENCODING_SET} */ +#define ENCODING_GET_INLINED(obj) RB_ENCODING_GET_INLINED(obj) /**< @old{RB_ENCODING_GET_INLINED} */ +#define ENCODING_GET(obj) RB_ENCODING_GET(obj) /**< @old{RB_ENCODING_GET} */ +#define ENCODING_IS_ASCII8BIT(obj) RB_ENCODING_IS_ASCII8BIT(obj) /**< @old{RB_ENCODING_IS_ASCII8BIT} */ +#define ENCODING_MAXNAMELEN RUBY_ENCODING_MAXNAMELEN /**< @old{RUBY_ENCODING_MAXNAMELEN} */ + +/** + * The type of encoding. Our design here is we take Oniguruma/Onigmo's + * multilingualisation schema as our base data structure. + */ +typedef const OnigEncodingType rb_encoding; + +RBIMPL_ATTR_NOALIAS() +/** + * Converts a character option to its encoding. It only supports a very + * limited set of Japanese encodings due to its Japanese origin. Ruby still + * has this in-core for backwards compatibility. But new codes must not bother + * such concept like one-character encoding option. Consider deprecated in + * practice. + * + * @param[in] c One of `['n', 'e', 's', 'u', 'i', 'x', 'm']`. + * @param[out] option Return buffer. + * @param[out] kcode Return buffer. + * @retval 1 `c` understood properly. + * @retval 0 `c` is not understood. + * @post `option` is a ::OnigOptionType. + * @post `kcode` is an enum `ruby_preserved_encindex`. + * + * @internal + * + * `kcode` is opaque because `ruby_preserved_encindex` is not visible from + * extension libraries. But who cares? + */ +int rb_char_to_option_kcode(int c, int *option, int *kcode); + +/** + * Creates a new encoding, using the passed one as a template. + * + * @param[in] name Name of the creating encoding. + * @param[in] src Template. + * @exception rb_eArgError Duplicated or malformed `name`. + * @return Replicated new encoding's index. + * @post Encoding named `name` is created as a copy of `src`, whose index + * is the return value. + * + * @internal + * + * `name` can be `NULL`, but that just raises an exception. OTOH it seems no + * sanity check is done against `src`...? + */ +int rb_enc_replicate(const char *name, rb_encoding *src); + +/** + * Creates a new "dummy" encoding. Roughly speaking, an encoding is dummy when + * it is stateful. Notable example of dummy encoding are those defined in + * ISO/IEC 2022 + * + * @param[in] name Name of the creating encoding. + * @exception rb_eArgError Duplicated or malformed `name`. + * @return New dummy encoding's index. + * @post Encoding named `name` is created, whose index is the return + * value. + */ +int rb_define_dummy_encoding(const char *name); + +RBIMPL_ATTR_PURE() +/** + * Queries if the passed encoding is dummy. + * + * @param[in] enc Encoding in question. + * @retval 1 It is. + * @retval 0 It isn't. + */ +int rb_enc_dummy_p(rb_encoding *enc); + +RBIMPL_ATTR_PURE() +/** + * Queries the index of the encoding. An encoding's index is a Ruby-local + * concept. It is a (sequential) number assigned to each encoding. + * + * @param[in] enc Encoding in question. + * @return Its index. + * @note You can pass null pointers to this function. It is equivalent + * to rb_usascii_encindex() then. + */ +int rb_enc_to_index(rb_encoding *enc); + +/** + * Queries the index of the encoding of the passed object, if any. + * + * @param[in] obj Object in question. + * @retval -1 `obj` is incapable of having an encoding. + * @retval otherwise `obj`'s encoding's index. + */ +int rb_enc_get_index(VALUE obj); + +/** + * @alias{rb_enc_get_index} + * + * @internal + * + * Implementation wise this is not a verbatim alias of rb_enc_get_index(). But + * the API is consistent. Don't bother. + */ +static inline int +RB_ENCODING_GET(VALUE obj) +{ + int encindex = RB_ENCODING_GET_INLINED(obj); + + if (encindex == RUBY_ENCODING_INLINE_MAX) { + return rb_enc_get_index(obj); + } + else { + return encindex; + } +} + +/** + * Destructively assigns an encoding (via its index) to an object. + * + * @param[out] obj Object in question. + * @param[in] encindex An encoding index. + * @exception rb_eFrozenError `obj` is frozen. + * @exception rb_eArgError `obj` is incapable of having an encoding. + * @exception rb_eEncodingError `encindex` is out of bounds. + * @exception rb_eLoadError Failed to load the encoding. + */ +void rb_enc_set_index(VALUE obj, int encindex); + +/** @alias{rb_enc_set_index} */ +static inline void +RB_ENCODING_SET(VALUE obj, int encindex) +{ + rb_enc_set_index(obj, encindex); +} + +/** + * This is #RB_ENCODING_SET + RB_ENC_CODERANGE_SET combo. The object must be + * capable of having inline encoding. Using this macro needs deep + * understanding of bit level object binary layout. + * + * @param[out] obj Target object. + * @param[in] encindex Encoding in encindex format. + * @param[in] cr An enum ::ruby_coderange_type. + * @post `obj`'s encoding is `encindex`. + * @post `obj`'s code range is `cr`. + */ +static inline void +RB_ENCODING_CODERANGE_SET(VALUE obj, int encindex, enum ruby_coderange_type cr) +{ + RB_ENCODING_SET(obj, encindex); + RB_ENC_CODERANGE_SET(obj, cr); +} + +RBIMPL_ATTR_PURE() +/** + * Queries if the passed object can have its encoding. + * + * @param[in] obj Object in question. + * @retval 1 It can. + * @retval 0 It cannot. + */ +int rb_enc_capable(VALUE obj); + +/** + * Queries the index of the encoding. + * + * @param[in] name Name of the encoding to find. + * @exception rb_eArgError No such encoding named `name`. + * @retval -1 `name` exists, but unable to load. + * @retval otherwise Index of encoding named `name`. + */ +int rb_enc_find_index(const char *name); + +/** + * Registers an "alias" name. In the wild, an encoding can be called using + * multiple names. For instance an encoding known as `"CP932"` is also called + * `"SJIS"` on occasions. This API registers such relationships. + * + * @param[in] alias New name. + * @param[in] orig Old name. + * @exception rb_eArgError `alias` is duplicated or malformed. + * @retval -1 Failed to load `orig`. + * @retval otherwise The index of `orig` and `alias`. + * @post `alias` is a synonym of `orig`. They refer to the identical + * encoding. + */ +int rb_enc_alias(const char *alias, const char *orig); + +/** + * Obtains a encoding index from a wider range of objects (than + * rb_enc_find_index()). + * + * @param[in] obj An ::rb_cEncoding, or its name in ::rb_cString. + * @retval -1 `obj` is unexpected type/contents. + * @retval otherwise Index corresponding to `obj`. + */ +int rb_to_encoding_index(VALUE obj); + +/** + * Identical to rb_find_encoding(), except it raises an exception instead of + * returning NULL. + * + * @param[in] obj An ::rb_cEncoding, or its name in ::rb_cString. + * @exception rb_eTypeError `obj` is neither ::rb_cEncoding nor ::rb_cString. + * @exception rb_eArgError `obj` is an unknown encoding name. + * @return Encoding of `obj`. + */ +rb_encoding *rb_to_encoding(VALUE obj); + +/** + * Identical to rb_to_encoding_index(), except the return type. + * + * @param[in] obj An ::rb_cEncoding, or its name in ::rb_cString. + * @exception rb_eTypeError `obj` is neither ::rb_cEncoding nor ::rb_cString. + * @retval NULL No such encoding. + * @return otherwise Encoding of `obj`. + */ +rb_encoding *rb_find_encoding(VALUE obj); + +/** + * Identical to rb_enc_get_index(), except the return type. + * + * @param[in] obj Object in question. + * @retval NULL Obj is incapable of having an encoding. + * @retval otherwise `obj`'s encoding. + */ +rb_encoding *rb_enc_get(VALUE obj); + +/** + * Look for the "common" encoding between the two. One character can or cannot + * be expressed depending on an encoding. This function finds the super-set of + * encodings that satisfy contents of both arguments. If that is impossible + * returns NULL. + * + * @param[in] str1 An object. + * @param[in] str2 Another object. + * @retval NULL No encoding can satisfy both at once. + * @retval otherwise Common encoding between the two. + * @note Arguments can be non-string, e.g. Regexp. + */ +rb_encoding *rb_enc_compatible(VALUE str1, VALUE str2); + +/** + * Identical to rb_enc_compatible(), except it raises an exception instead of + * returning NULL. + * + * @param[in] str1 An object. + * @param[in] str2 Another object. + * @exception rb_eEncCompatError No encoding can satisfy both. + * @return Common encoding between the two. + * @note Arguments can be non-string, e.g. Regexp. + */ +rb_encoding *rb_enc_check(VALUE str1,VALUE str2); + +/** + * Identical to rb_enc_set_index(), except it additionally does contents fix-up + * depending on the passed object. It for instance changes the byte length of + * terminating `U+0000` according to the passed encoding. + * + * @param[out] obj Object in question. + * @param[in] encindex An encoding index. + * @exception rb_eFrozenError `obj` is frozen. + * @exception rb_eArgError `obj` is incapable of having an encoding. + * @exception rb_eEncodingError `encindex` is out of bounds. + * @exception rb_eLoadError Failed to load the encoding. + * @return The passed `obj`. + * @post `obj`'s contents might be fixed according to `encindex`. + */ +VALUE rb_enc_associate_index(VALUE obj, int encindex); + +/** + * Identical to rb_enc_associate_index(), except it takes an encoding itself + * instead of its index. + * + * @param[out] obj Object in question. + * @param[in] enc An encoding. + * @exception rb_eFrozenError `obj` is frozen. + * @exception rb_eArgError `obj` is incapable of having an encoding. + * @return The passed `obj`. + * @post `obj`'s contents might be fixed according to `enc`. + */ +VALUE rb_enc_associate(VALUE obj, rb_encoding *enc); + +/** + * Destructively copies the encoding of the latter object to that of former + * one. It can also be seen as a routine identical to + * rb_enc_associate_index(), except it takes an object's encoding instead of an + * encoding's index. + * + * @param[out] dst Object to modify. + * @param[in] src Object to reference. + * @exception rb_eFrozenError `dst` is frozen. + * @exception rb_eArgError `dst` is incapable of having an encoding. + * @exception rb_eEncodingError `src` is incapable of having an encoding. + * @post `dst`'s encoding is that of `src`'s. + */ +void rb_enc_copy(VALUE dst, VALUE src); + + +/** + * Identical to rb_find_encoding(), except it takes an encoding index instead + * of a Ruby object. + * + * @param[in] idx An encoding index. + * @retval NULL No such encoding. + * @retval otherwise An encoding whose index is `idx`. + */ +rb_encoding *rb_enc_from_index(int idx); + +/** + * Identical to rb_find_encoding(), except it takes a C's string instead of + * Ruby's. + * + * @param[in] name Name of the encoding to query. + * @retval NULL No such encoding. + * @retval otherwise An encoding whose index is `idx`. + */ +rb_encoding *rb_enc_find(const char *name); + +/** + * Queries the (canonical) name of the passed encoding. + * + * @param[in] enc An encoding. + * @return Its name. + */ +static inline const char * +rb_enc_name(rb_encoding *enc) +{ + return enc->name; +} + +/** + * Queries the minimum number of bytes that the passed encoding needs to + * represent a character. For ASCII and compatible encodings this is typically + * 1. There are however encodings whose minimum is not 1; they are + * historically called wide characters. + * + * @param[in] enc An encoding. + * @return Its least possible number of bytes except 0. + */ +static inline int +rb_enc_mbminlen(rb_encoding *enc) +{ + return enc->min_enc_len; +} + +/** + * Queries the maximum number of bytes that the passed encoding needs to + * represent a character. Fixed-width encodings have the same value for this + * one and #rb_enc_mbminlen. However there are variable-width encodings. + * UTF-8, for instance, takes from 1 up to 6 bytes. + * + * @param[in] enc An encoding. + * @return Its maximum possible number of bytes of a character. + */ +static inline int +rb_enc_mbmaxlen(rb_encoding *enc) +{ + return enc->max_enc_len; +} + +/** + * Queries the number of bytes of the character at the passed pointer. + * + * @param[in] p Pointer to a character's first byte. + * @param[in] e End of the string that has `p`. + * @param[in] enc Encoding of the string. + * @return If the character at `p` does not end until `e`, number of bytes + * between `p` and `e`. Otherwise the number of bytes that the + * character at `p` is encoded. + * + * @internal + * + * Strictly speaking there are chances when `p` points to a middle byte of a + * wide character. This function returns "the number of bytes from `p` to + * nearest of either `e` or the next character boundary", if you go strict. + */ +int rb_enc_mbclen(const char *p, const char *e, rb_encoding *enc); + +/** + * Identical to rb_enc_mbclen() unless the character at `p` overruns `e`. That + * can happen for instance when you read from a socket and its partial read + * cuts a wide character in-between. In those situations this function + * "estimates" theoretical length of the character in question. Typically it + * tends to be possible to know how many bytes a character needs before + * actually reaching its end; for instance UTF-8 encodes a character's length + * in the first byte of it. This function returns that info. + * + * @note This implies that the string is not broken. + * + * @param[in] p Pointer to the character's first byte. + * @param[in] e End of the string that has `p`. + * @param[in] enc Encoding of the string. + * @return Number of bytes of character at `p`, measured or estimated. + */ +int rb_enc_fast_mbclen(const char *p, const char *e, rb_encoding *enc); + +/** + * Queries the number of bytes of the character at the passed pointer. This + * function returns 3 different types of information: + * + * ```CXX + * auto n = rb_enc_precise_mbclen(p, q, r); + * + * if (ONIGENC_MBCLEN_CHARFOUND_P(n)) { + * // Character found. Normal return. + * auto found_length = ONIGENC_MBCLEN_CHARFOUND_LEN(n); + * } + * else if (ONIGENC_MBCLEN_NEEDMORE_P(n)) { + * // Character overruns past `q`; needs more. + * auto requested_length = ONIGENC_MBCLEN_NEEDMORE_LEN(n); + * } + * else { + * // `p` is broken. + * assert(ONIGENC_MBCLEN_INVALID_P(n)); + * } + * ``` + * + * @param[in] p Pointer to the character's first byte. + * @param[in] e End of the string that has `p`. + * @param[in] enc Encoding of the string. + * @return Encoded read/needed number of bytes (see above). + */ +int rb_enc_precise_mbclen(const char *p, const char *e, rb_encoding *enc); + +#define MBCLEN_CHARFOUND_P(ret) ONIGENC_MBCLEN_CHARFOUND_P(ret) /**< @old{ONIGENC_MBCLEN_CHARFOUND_P} */ +#define MBCLEN_CHARFOUND_LEN(ret) ONIGENC_MBCLEN_CHARFOUND_LEN(ret) /**< @old{ONIGENC_MBCLEN_CHARFOUND_LEN} */ +#define MBCLEN_INVALID_P(ret) ONIGENC_MBCLEN_INVALID_P(ret) /**< @old{ONIGENC_MBCLEN_INVALID_P} */ +#define MBCLEN_NEEDMORE_P(ret) ONIGENC_MBCLEN_NEEDMORE_P(ret) /**< @old{ONIGENC_MBCLEN_NEEDMORE_P} */ +#define MBCLEN_NEEDMORE_LEN(ret) ONIGENC_MBCLEN_NEEDMORE_LEN(ret) /**< @old{ONIGENC_MBCLEN_NEEDMORE_LEN} */ + +/** + * Queries the code point of character pointed by the passed pointer. If that + * code point is included in ASCII that code point is returned. Otherwise -1. + * This can be different from just looking at the first byte. For instance it + * reads 2 bytes in case of UTF-16BE. + * + * @param[in] p Pointer to the character's first byte. + * @param[in] e End of the string that has `p`. + * @param[in] len Return buffer. + * @param[in] enc Encoding of the string. + * @retval -1 The character at `p` is not i ASCII. + * @retval otherwise A code point of the character at `p`. + * @post `len` (if set) is the number of bytes of `p`. + */ +int rb_enc_ascget(const char *p, const char *e, int *len, rb_encoding *enc); + +/** + * Queries the code point of character pointed by the passed pointer. + * Exceptions happen in case of broken input. + * + * @param[in] p Pointer to the character's first byte. + * @param[in] e End of the string that has `p`. + * @param[in] len Return buffer. + * @param[in] enc Encoding of the string. + * @exception rb_eArgError `p` is broken. + * @return Code point of the character pointed by `p`. + * @post `len` (if set) is the number of bytes of `p`. + */ +unsigned int rb_enc_codepoint_len(const char *p, const char *e, int *len, rb_encoding *enc); + +/** + * Queries the code point of character pointed by the passed pointer. + * Exceptions happen in case of broken input. + * + * @deprecated Use rb_enc_codepoint_len() instead. + * @param[in] p Pointer to the character's first byte. + * @param[in] e End of the string that has `p`. + * @param[in] enc Encoding of the string. + * @exception rb_eArgError `p` is broken. + * @return Code point of the character pointed by `p`. + * + * @internal + * + * @matz says in commit 91e5ba1cb865a2385d3e1cbfacd824496898e098 that the line + * below is a "prototype for obsolete function". However even today there + * still are some use cases of it throughout our repository. It seems it has + * its own niche. + */ +static inline unsigned int +rb_enc_codepoint(const char *p, const char *e, rb_encoding *enc) +{ + return rb_enc_codepoint_len(p, e, 0, enc); + /* ^^^ + * This can be `NULL` in C, `nullptr` in C++, and `0` for both. + * We choose the most portable one here. + */ +} + + +/** + * Identical to rb_enc_codepoint(), except it assumes the passed character is + * not broken. + * + * @param[in] p Pointer to the character's first byte. + * @param[in] e End of the string that has `p`. + * @param[in] enc Encoding of the string. + * @return Code point of the character pointed by `p`. + */ +static inline OnigCodePoint +rb_enc_mbc_to_codepoint(const char *p, const char *e, rb_encoding *enc) +{ + const OnigUChar *up = RBIMPL_CAST((const OnigUChar *)p); + const OnigUChar *ue = RBIMPL_CAST((const OnigUChar *)e); + + return ONIGENC_MBC_TO_CODE(enc, up, ue); +} + +/** + * Queries the number of bytes requested to represent the passed code point + * using the passed encoding. + * + * @param[in] code Code point in question. + * @param[in] enc Encoding to convert the code into a byte sequence. + * @exception rb_eArgError `enc` does not glean `code`. + * @return Number of bytes requested to represent `code` using `enc`. + */ +int rb_enc_codelen(int code, rb_encoding *enc); + +/** + * Identical to rb_enc_codelen(), except it returns 0 for invalid code points. + * + * @param[in] c Code point in question. + * @param[in] enc Encoding to convert `c` into a byte sequence. + * @retval 0 `c` is invalid. + * @return otherwise Number of bytes needed for `enc` to encode `c`. + */ +static inline int +rb_enc_code_to_mbclen(int c, rb_encoding *enc) +{ + OnigCodePoint uc = RBIMPL_CAST((OnigCodePoint)c); + + return ONIGENC_CODE_TO_MBCLEN(enc, uc); +} + +/** + * Identical to rb_enc_uint_chr(), except it writes back to the passed buffer + * instead of allocating one. + * + * @param[in] c Code point. + * @param[out] buf Return buffer. + * @param[in] enc Target encoding scheme. + * @retval <= 0 `c` is invalid in `enc`. + * @return otherwise Number of bytes written to `buf`. + * @post `c` is encoded according to `enc`, then written to `buf`. + * + * @internal + * + * The second argument must be typed. But its current usages prevent us from + * being any stricter than this. :FIXME: + */ +static inline int +rb_enc_mbcput(unsigned int c, void *buf, rb_encoding *enc) +{ + OnigCodePoint uc = RBIMPL_CAST((OnigCodePoint)c); + OnigUChar *ubuf = RBIMPL_CAST((OnigUChar *)buf); + + return ONIGENC_CODE_TO_MBC(enc, uc, ubuf); +} + +/** + * Queries the previous (left) character. + * + * @param[in] s Start of the string. + * @param[in] p Pointer to a character. + * @param[in] e End of the string. + * @param[in] enc Encoding. + * @retval NULL No previous character. + * @retval otherwise Pointer to the head of the previous character. + */ +static inline char * +rb_enc_prev_char(const char *s, const char *p, const char *e, rb_encoding *enc) +{ + const OnigUChar *us = RBIMPL_CAST((const OnigUChar *)s); + const OnigUChar *up = RBIMPL_CAST((const OnigUChar *)p); + const OnigUChar *ue = RBIMPL_CAST((const OnigUChar *)e); + OnigUChar *ur = onigenc_get_prev_char_head(enc, us, up, ue); + + return RBIMPL_CAST((char *)ur); +} + +/** + * Queries the left boundary of a character. This function takes a pointer + * that is not necessarily a head of a character, and searches for its head. + * + * @param[in] s Start of the string. + * @param[in] p Pointer to a possibly-middle of a character. + * @param[in] e End of the string. + * @param[in] enc Encoding. + * @return Pointer to the head of the character that contains `p`. + */ +static inline char * +rb_enc_left_char_head(const char *s, const char *p, const char *e, rb_encoding *enc) +{ + const OnigUChar *us = RBIMPL_CAST((const OnigUChar *)s); + const OnigUChar *up = RBIMPL_CAST((const OnigUChar *)p); + const OnigUChar *ue = RBIMPL_CAST((const OnigUChar *)e); + OnigUChar *ur = onigenc_get_left_adjust_char_head(enc, us, up, ue); + + return RBIMPL_CAST((char *)ur); +} + +/** + * Queries the right boundary of a character. This function takes a pointer + * that is not necessarily a head of a character, and searches for its tail. + * + * @param[in] s Start of the string. + * @param[in] p Pointer to a possibly-middle of a character. + * @param[in] e End of the string. + * @param[in] enc Encoding. + * @return Pointer to the end of the character that contains `p`. + */ +static inline char * +rb_enc_right_char_head(const char *s, const char *p, const char *e, rb_encoding *enc) +{ + const OnigUChar *us = RBIMPL_CAST((const OnigUChar *)s); + const OnigUChar *up = RBIMPL_CAST((const OnigUChar *)p); + const OnigUChar *ue = RBIMPL_CAST((const OnigUChar *)e); + OnigUChar *ur = onigenc_get_right_adjust_char_head(enc, us, up, ue); + + return RBIMPL_CAST((char *)ur); +} + +/** + * Scans the string backwards for n characters. + * + * @param[in] s Start of the string. + * @param[in] p Pointer to a character. + * @param[in] e End of the string. + * @param[in] n Steps. + * @param[in] enc Encoding. + * @retval NULL There are no `n` characters left. + * @retval otherwise Pointer to `n` character before `p`. + */ +static inline char * +rb_enc_step_back(const char *s, const char *p, const char *e, int n, rb_encoding *enc) +{ + const OnigUChar *us = RBIMPL_CAST((const OnigUChar *)s); + const OnigUChar *up = RBIMPL_CAST((const OnigUChar *)p); + const OnigUChar *ue = RBIMPL_CAST((const OnigUChar *)e); + const OnigUChar *ur = onigenc_step_back(enc, us, up, ue, n); + + return RBIMPL_CAST((char *)ur); +} + +/** + * @private + * + * This is an implementation detail of rb_enc_asciicompat(). People don't use + * it directly. Just always use rb_enc_asciicompat(). + * + * @param[in] enc Encoding in question. + * @retval 1 It is ASCII compatible. + * @retval 0 It isn't. + */ +static inline int +rb_enc_asciicompat_inline(rb_encoding *enc) +{ + return rb_enc_mbminlen(enc)==1 && !rb_enc_dummy_p(enc); +} + +/** + * Queries if the passed encoding is _in some sense_ compatible with ASCII. + * The concept of ASCII compatibility is nuanced, and private to our + * implementation. For instance SJIS is ASCII compatible to us, despite their + * having different characters at code point `0x5C`. This is based on some + * practical consideration that Japanese people confuses SJIS to be "upper + * compatible" with ASCII (which is in fact a wrong idea, but we just don't go + * strict here). An example of ASCII incompatible encoding is UTF-16. UTF-16 + * shares code points with ASCII, but employs a completely different encoding + * scheme. + * + * @param[in] enc Encoding in question. + * @retval 0 It is incompatible. + * @retval 1 It is compatible. + */ +static inline bool +rb_enc_asciicompat(rb_encoding *enc) +{ + if (rb_enc_mbminlen(enc) != 1) { + return false; + } + else if (rb_enc_dummy_p(enc)) { + return false; + } + else { + return true; + } +} + +/** + * Queries if the passed string is in an ASCII-compatible encoding. + * + * @param[in] str A Ruby's string to query. + * @retval 0 `str` is not a String, or an ASCII-incompatible string. + * @retval 1 Otherwise. + */ +static inline bool +rb_enc_str_asciicompat_p(VALUE str) +{ + rb_encoding *enc = rb_enc_get(str); + + return rb_enc_asciicompat(enc); +} + +/** + * Queries the Ruby-level counterpart instance of ::rb_cEncoding that + * corresponds to the passed encoding. + * + * @param[in] enc An encoding + * @retval RUBY_Qnil `enc` is a null pointer. + * @retval otherwise An instance of ::rb_cEncoding. + */ +VALUE rb_enc_from_encoding(rb_encoding *enc); + +RBIMPL_ATTR_PURE() +/** + * Queries if the passed encoding is either one of UTF-8/16/32. + * + * @note It does not take UTF-7, which we actually support, into account. + * + * @param[in] enc Encoding in question. + * @retval 0 It is not a Unicode variant. + * @retval otherwise It is. + * + * @internal + * + * In reality it returns 1/0, but the value is abstracted as + * `ONIGENC_FLAG_UNICODE`. + */ +int rb_enc_unicode_p(rb_encoding *enc); + +RBIMPL_ATTR_RETURNS_NONNULL() +/** + * Queries the encoding that represents ASCII-8BIT a.k.a. binary. + * + * @return The encoding that represents ASCII-8BIT. + * + * @internal + * + * This can not return NULL once the process properly boots up. + */ +rb_encoding *rb_ascii8bit_encoding(void); + +RBIMPL_ATTR_RETURNS_NONNULL() +/** + * Queries the encoding that represents UTF-8. + * + * @return The encoding that represents UTF-8. + * + * @internal + * + * This can not return NULL once the process properly boots up. + */ +rb_encoding *rb_utf8_encoding(void); + +RBIMPL_ATTR_RETURNS_NONNULL() +/** + * Queries the encoding that represents US-ASCII. + * + * @return The encoding that represents US-ASCII. + * + * @internal + * + * This can not return NULL once the process properly boots up. + */ +rb_encoding *rb_usascii_encoding(void); + +/** + * Queries the encoding that represents the current locale. + * + * @return The encoding that represents the process' locale. + * + * @internal + * + * This is dynamic. If you change the process' locale by e.g. calling + * `setlocale(3)`, that should also change the return value of this function. + * + * There is no official way for Ruby scripts to manipulate locales, though. + */ +rb_encoding *rb_locale_encoding(void); + +/** + * Queries the "filesystem" encoding. This is the encoding that ruby expects + * info from the OS' file system are in. This affects for instance return + * value of rb_dir_getwd(). Most notably on Windows it can be an alias of OS + * codepage. Most notably on Linux users can set this via default external + * encoding. + * + * @return The "filesystem" encoding. + */ +rb_encoding *rb_filesystem_encoding(void); + +/** + * Queries the "default external" encoding. This is used to interact with + * outer-process things such as File. Though not recommended, you can set this + * using rb_enc_set_default_external(). + * + * @return The "default external" encoding. + */ +rb_encoding *rb_default_external_encoding(void); + +/** + * Queries the "default internal" encoding. This could be a null pointer. + * Otherwise, outer-process info are transcoded from default external encoding + * to this one during reading from an IO. + * + * @return The "default internal" encoding (if any). + */ +rb_encoding *rb_default_internal_encoding(void); + +#ifndef rb_ascii8bit_encindex +RBIMPL_ATTR_CONST() +/** + * Identical to rb_ascii8bit_encoding(), except it returns the encoding's index + * instead of the encoding itself. + * + * @return The index of encoding of ASCII-8BIT. + * + * @internal + * + * This happens to be 0. + */ +int rb_ascii8bit_encindex(void); +#endif + +/** + * Queries if the passed object is in ascii 8bit (== binary) encoding. The + * object must be capable of having inline encoding. Using this macro needs + * deep understanding of bit level object binary layout. + * + * @param[in] obj An object to check. + * @retval 1 It is. + * @retval 0 It isn't. + */ +static inline bool +RB_ENCODING_IS_ASCII8BIT(VALUE obj) +{ + return RB_ENCODING_GET_INLINED(obj) == rb_ascii8bit_encindex(); +} + +#ifndef rb_utf8_encindex +RBIMPL_ATTR_CONST() +/** + * Identical to rb_utf8_encoding(), except it returns the encoding's index + * instead of the encoding itself. + * + * @return The index of encoding of UTF-8. + */ +int rb_utf8_encindex(void); +#endif + +#ifndef rb_usascii_encindex +RBIMPL_ATTR_CONST() +/** + * Identical to rb_usascii_encoding(), except it returns the encoding's index + * instead of the encoding itself. + * + * @return The index of encoding of UTF-8. + */ +int rb_usascii_encindex(void); +#endif + +/** + * Identical to rb_locale_encoding(), except it returns the encoding's index + * instead of the encoding itself. + * + * @return The index of the locale encoding. + */ +int rb_locale_encindex(void); + +/** + * Identical to rb_filesystem_encoding(), except it returns the encoding's + * index instead of the encoding itself. + * + * @return The index of the filesystem encoding. + */ +int rb_filesystem_encindex(void); + +/** + * Identical to rb_default_external_encoding(), except it returns the + * Ruby-level counterpart instance of ::rb_cEncoding that corresponds to the + * default external encoding. + * + * @return An instance of ::rb_cEncoding of default external. + */ +VALUE rb_enc_default_external(void); + +/** + * Identical to rb_default_internal_encoding(), except it returns the + * Ruby-level counterpart instance of ::rb_cEncoding that corresponds to the + * default internal encoding. + * + * @return An instance of ::rb_cEncoding of default internal. + */ +VALUE rb_enc_default_internal(void); + +/** + * Destructively assigns the passed encoding as the default external encoding. + * You should not use this API. It has process-global side effects. Also it + * doesn't change encodings of strings that have already been read. + * + * @param[in] encoding Ruby level encoding. + * @exception rb_eArgError `encoding` is ::RUBY_Qnil. + * @post The default external encoding is `encoding`. + */ +void rb_enc_set_default_external(VALUE encoding); + +/** + * Destructively assigns the passed encoding as the default internal encoding. + * You should not use this API. It has process-global side effects. Also it + * doesn't change encodings of strings that have already been read. + * + * @param[in] encoding Ruby level encoding. + * @post The default internal encoding is `encoding`. + * @note Unlike rb_enc_set_default_external() you can pass ::RUBY_Qnil. + */ +void rb_enc_set_default_internal(VALUE encoding); + +/** + * Returns a platform-depended "charmap" of the current locale. This + * information is called a "Codeset name" in IEEE 1003.1 section 13 + * (``). This is a very low-level API. The return value can have + * no corresponding encoding when passed to rb_find_encoding(). + * + * @param[in] klass Ignored for no reason (why...) + * @return The low-level locale charmap, in Ruby's String. + */ +VALUE rb_locale_charmap(VALUE klass); + +RBIMPL_SYMBOL_EXPORT_END() + +/** @cond INTERNAL_MACRO */ +#define RB_ENCODING_GET RB_ENCODING_GET +#define RB_ENCODING_GET_INLINED RB_ENCODING_GET_INLINED +#define RB_ENCODING_IS_ASCII8BIT RB_ENCODING_IS_ASCII8BIT +#define RB_ENCODING_SET RB_ENCODING_SET +#define RB_ENCODING_SET_INLINED RB_ENCODING_SET_INLINED +#define rb_enc_asciicompat rb_enc_asciicompat +#define rb_enc_code_to_mbclen rb_enc_code_to_mbclen +#define rb_enc_codepoint rb_enc_codepoint +#define rb_enc_left_char_head rb_enc_left_char_head +#define rb_enc_mbc_to_codepoint rb_enc_mbc_to_codepoint +#define rb_enc_mbcput rb_enc_mbcput +#define rb_enc_mbmaxlen rb_enc_mbmaxlen +#define rb_enc_mbminlen rb_enc_mbminlen +#define rb_enc_name rb_enc_name +#define rb_enc_prev_char rb_enc_prev_char +#define rb_enc_right_char_head rb_enc_right_char_head +#define rb_enc_step_back rb_enc_step_back +#define rb_enc_str_asciicompat_p rb_enc_str_asciicompat_p +/** @endcond */ + +#endif /* RUBY_INTERNAL_ENCODING_ENCODING_H */ diff --git a/libs/libruby/ruby/internal/encoding/pathname.h b/libs/libruby/ruby/internal/encoding/pathname.h new file mode 100644 index 0000000..0b5e85a --- /dev/null +++ b/libs/libruby/ruby/internal/encoding/pathname.h @@ -0,0 +1,184 @@ +#ifndef RUBY_INTERNAL_ENCODING_PATHNAME_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_INTERNAL_ENCODING_PATHNAME_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines to manipulate encodings of pathnames. + */ + +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/encoding/encoding.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() +RBIMPL_ATTR_NONNULL(()) +/** + * Returns a path component directly adjacent to the passed pointer. + * + * ``` + * "/multi/byte/encoded/pathname.txt" + * ^ ^ ^ + * | | +--- end + * | +--- @return + * +--- path + * ``` + * + * @param[in] path Where to start scanning. + * @param[in] end End of the path string. + * @param[in] enc Encoding of the string. + * @return A pointer in the passed string where the next path component + * resides, or `end` if there is no next path component. + */ +char *rb_enc_path_next(const char *path, const char *end, rb_encoding *enc); + +RBIMPL_ATTR_NONNULL(()) +/** + * Seeks for non-prefix part of a pathname. This can be a no-op when the OS + * has no such concept like a path prefix. But there are OSes where path + * prefixes do exist. + * + * ``` + * "C:\multi\byte\encoded\pathname.txt" + * ^ ^ ^ + * | | +--- end + * | +--- @return + * +--- path + * ``` + * + * @param[in] path Where to start scanning. + * @param[in] end End of the path string. + * @param[in] enc Encoding of the string. + * @return A pointer in the passed string where non-prefix part starts, or + * `path` if the OS does not have path prefix. + */ +char *rb_enc_path_skip_prefix(const char *path, const char *end, rb_encoding *enc); + +RBIMPL_ATTR_NONNULL(()) +/** + * Returns the last path component. + * + * ``` + * "/multi/byte/encoded/pathname.txt" + * ^ ^ ^ + * | | +--- end + * | +--- @return + * +--- path + * ``` + * + * @param[in] path Where to start scanning. + * @param[in] end End of the path string. + * @param[in] enc Encoding of the string. + * @return A pointer in the passed string where the last path component + * resides, or `end` if there is no more path component. + */ +char *rb_enc_path_last_separator(const char *path, const char *end, rb_encoding *enc); + +RBIMPL_ATTR_NONNULL(()) +/** + * This just returns the passed end basically. It makes difference in case the + * passed string ends with tons of path separators like the following: + * + * ``` + * "/path/that/ends/with/lots/of/slashes//////////////" + * ^ ^ ^ + * | | +--- end + * | +--- @return + * +--- path + * ``` + * + * @param[in] path Where to start scanning. + * @param[in] end End of the path string. + * @param[in] enc Encoding of the string. + * @return A pointer in the passed string where the trailing path + * separators start, or `end` if there is no trailing path + * separators. + * + * @internal + * + * It seems this function was introduced to mimic what POSIX says about + * `basename(3)`. + */ +char *rb_enc_path_end(const char *path, const char *end, rb_encoding *enc); + +RBIMPL_ATTR_NONNULL((1, 4)) +/** + * Our own encoding-aware version of `basename(3)`. Normally, this function + * returns the last path component of the given name. However in case the + * passed name ends with a path separator, it returns the name of the + * directory, not the last (empty) component. Also if the passed name is a + * root directory, it returns that root directory. Note however that Windows + * filesystem have drive letters, which this function does not return. + * + * @param[in] name Target path. + * @param[out] baselen Return buffer. + * @param[in,out] alllen Number of bytes of `name`. + * @param[enc] enc Encoding of `name`. + * @return The rightmost component of `name`. + * @post `baselen`, if passed, is updated to be the number of bytes + * of the returned basename. + * @post `alllen`, if passed, is updated to be the number of bytes of + * strings not considered as the basename. + */ +const char *ruby_enc_find_basename(const char *name, long *baselen, long *alllen, rb_encoding *enc); + +RBIMPL_ATTR_NONNULL((1, 3)) +/** + * Our own encoding-aware version of `extname`. This function first applies + * rb_enc_path_last_separator() to the passed name and only concerns its return + * value (ignores any parent directories). This function returns complicated + * results: + * + * ```CXX + * auto path = "..."; + * auto len = strlen(path); + * auto ret = ruby_enc_find_extname(path, &len, rb_ascii8bit_encoding()); + * + * switch(len) { + * case 0: + * if (ret == 0) { + * // `path` is a file without extensions. + * } + * else { + * // `path` is a dotfile. + * // `ret` is the file's name. + * } + * break; + * + * case 1: + * // `path` _ends_ with a dot. + * // `ret` is that dot. + * break; + * + * default: + * // `path` has an extension. + * // `ret` is that extension. + * } + * ``` + * + * @param[in] name Target path. + * @param[in,out] len Number of bytes of `name`. + * @param[in] enc Encoding of `name`. + * @return See above. + * @post `len`, if passed, is updated (see above). + */ +const char *ruby_enc_find_extname(const char *name, long *len, rb_encoding *enc); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_INTERNAL_ENCODING_PATHNAME_H */ diff --git a/libs/libruby/ruby/internal/encoding/re.h b/libs/libruby/ruby/internal/encoding/re.h new file mode 100644 index 0000000..d0de23b --- /dev/null +++ b/libs/libruby/ruby/internal/encoding/re.h @@ -0,0 +1,46 @@ +#ifndef RUBY_INTERNAL_ENCODING_RE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_INTERNAL_ENCODING_RE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines to manipulate encodings of symbols. + */ + +#include "ruby/internal/dllexport.h" +#include "ruby/internal/encoding/encoding.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Identical to rb_reg_new(), except it additionally takes an encoding. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @param[in] enc Encoding of `ptr`. + * @param[in] opts Options e.g. ONIG_OPTION_MULTILINE. + * @exception rb_eRegexpError Failed to compile `ptr`. + * @return An allocated new instance of ::rb_cRegexp, of `enc` encoding, + * whose expression is compiled according to `ptr`. + */ +VALUE rb_enc_reg_new(const char *ptr, long len, rb_encoding *enc, int opts); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_INTERNAL_ENCODING_RE_H */ diff --git a/libs/libruby/ruby/internal/encoding/sprintf.h b/libs/libruby/ruby/internal/encoding/sprintf.h new file mode 100644 index 0000000..cb8737b --- /dev/null +++ b/libs/libruby/ruby/internal/encoding/sprintf.h @@ -0,0 +1,78 @@ +#ifndef RUBY_INTERNAL_ENCODING_SPRINTF_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_INTERNAL_ENCODING_SPRINTF_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines to manipulate encodings of symbols. + */ +#include "ruby/internal/config.h" +#include +#include "ruby/internal/attr/format.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/encoding/encoding.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) +/** + * Identical to rb_sprintf(), except it additionally takes an encoding. The + * passed encoding rules both the incoming format specifier and the resulting + * string. + * + * @param[in] enc Encoding of `fmt`. + * @param[in] fmt A `printf`-like format specifier. + * @param[in] ... Variadic number of contents to format. + * @return A rendered new instance of ::rb_cString, of `enc` encoding. + */ +VALUE rb_enc_sprintf(rb_encoding *enc, const char *fmt, ...); + +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 0) +/** + * Identical to rb_enc_sprintf(), except it takes a `va_list` instead of + * variadic arguments. It can also be seen as a routine identical to + * rb_vsprintf(), except it additionally takes an encoding. + * + * @param[in] enc Encoding of `fmt`. + * @param[in] fmt A `printf`-like format specifier. + * @param[in] ap Contents to format. + * @return A rendered new instance of ::rb_cString, of `enc` encoding. + */ +VALUE rb_enc_vsprintf(rb_encoding *enc, const char *fmt, va_list ap); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL((3)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 3, 4) +/** + * Identical to rb_raise(), except it additionally takes an encoding. + * + * @param[in] enc Encoding of the generating exception. + * @param[in] exc A subclass of ::rb_eException. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + * @param[in] ... Contents of the message. + * @exception exc The specified exception. + * @note It never returns. + */ +void rb_enc_raise(rb_encoding *enc, VALUE exc, const char *fmt, ...); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_INTERNAL_ENCODING_SPRINTF_H */ diff --git a/libs/libruby/ruby/internal/encoding/string.h b/libs/libruby/ruby/internal/encoding/string.h new file mode 100644 index 0000000..6ed7ca1 --- /dev/null +++ b/libs/libruby/ruby/internal/encoding/string.h @@ -0,0 +1,346 @@ +#ifndef RUBY_INTERNAL_ENCODING_STRING_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_INTERNAL_ENCODING_STRING_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines to manipulate encodings of strings. + */ + +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/encoding/encoding.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/intern/string.h" /* rbimpl_strlen */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Identical to rb_enc_str_new(), except it additionally takes an encoding. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @param[in] enc Encoding of `ptr`. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString, of `len` bytes length, of `enc` + * encoding, whose contents are verbatim copy of `ptr`. + * @pre At least `len` bytes of continuous memory region shall be + * accessible via `ptr`. + * @note `enc` can be a null pointer. It can also be seen as a routine + * identical to rb_usascii_str_new() then. + */ +VALUE rb_enc_str_new(const char *ptr, long len, rb_encoding *enc); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Identical to rb_enc_str_new(), except it assumes the passed pointer is a + * pointer to a C string. It can also be seen as a routine identical to + * rb_str_new_cstr(), except it additionally takes an encoding. + * + * @param[in] ptr A C string. + * @param[in] enc Encoding of `ptr`. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString, of `enc` encoding, whose contents + * are verbatim copy of `ptr`. + * @pre `ptr` must not be a null pointer. + * @pre Because `ptr` is a C string it makes no sense for `enc` to be + * something like UTF-32. + * @note `enc` can be a null pointer. It can also be seen as a routine + * identical to rb_usascii_str_new_cstr() then. + */ +VALUE rb_enc_str_new_cstr(const char *ptr, rb_encoding *enc); + +/** + * Identical to rb_enc_str_new(), except it takes a C string literal. It can + * also be seen as a routine identical to rb_str_new_static(), except it + * additionally takes an encoding. + * + * @param[in] ptr A C string literal. + * @param[in] len `strlen(ptr)`. + * @param[in] enc Encoding of `ptr`. + * @exception rb_eArgError `len` out of range of `size_t`. + * @pre `ptr` must be a C string constant. + * @return An instance of ::rb_cString, of `enc` encoding, whose backend + * storage is the passed C string literal. + * @warning It is a very bad idea to write to a C string literal (often + * immediate SEGV shall occur). Consider return values of this + * function be read-only. + * @note `enc` can be a null pointer. It can also be seen as a routine + * identical to rb_usascii_str_new_static() then. + */ +VALUE rb_enc_str_new_static(const char *ptr, long len, rb_encoding *enc); + +/** + * Identical to rb_enc_str_new(), except it returns a "f"string. It can also + * be seen as a routine identical to rb_interned_str(), except it additionally + * takes an encoding. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @param[in] enc Encoding of `ptr`. + * @exception rb_eArgError `len` is negative. + * @return A found or created instance of ::rb_cString, of `len` bytes + * length, of `enc` encoding, whose contents are identical to that + * of `ptr`. + * @pre At least `len` bytes of continuous memory region shall be + * accessible via `ptr`. + * @note `enc` can be a null pointer. + */ +VALUE rb_enc_interned_str(const char *ptr, long len, rb_encoding *enc); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Identical to rb_enc_str_new_cstr(), except it returns a "f"string. It can + * also be seen as a routine identical to rb_interned_str_cstr(), except it + * additionally takes an encoding. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] enc Encoding of `ptr`. + * @return A found or created instance of ::rb_cString of `enc` encoding, + * whose contents are identical to that of `ptr`. + * @pre At least `len` bytes of continuous memory region shall be + * accessible via `ptr`. + * @note `enc` can be a null pointer. + */ +VALUE rb_enc_interned_str_cstr(const char *ptr, rb_encoding *enc); + +/** + * Counts the number of characters of the passed string, according to the + * passed encoding. This has to be complicated. The passed string could be + * invalid and/or broken. This routine would scan from the beginning til the + * end, byte by byte, to seek out character boundaries. Could be super slow. + * + * @param[in] head Leftmost pointer to the string. + * @param[in] tail Rightmost pointer to the string. + * @param[in] enc Encoding of the string. + * @return Number of characters exist in `head` .. `tail`. The definition + * of "character" depends on the passed `enc`. + */ +long rb_enc_strlen(const char *head, const char *tail, rb_encoding *enc); + +/** + * Queries the n-th character. Like rb_enc_strlen() this function can be fast + * or slow depending on the contents. Don't expect characters to be uniformly + * distributed across the entire string. + * + * @param[in] head Leftmost pointer to the string. + * @param[in] tail Rightmost pointer to the string. + * @param[in] nth Requested index of characters. + * @param[in] enc Encoding of the string. + * @return Pointer to the first byte of the character that is `nth` + * character ahead of `head`, or `tail` if there is no such + * character (OOB etc). The definition of "character" depends on + * the passed `enc`. + */ +char *rb_enc_nth(const char *head, const char *tail, long nth, rb_encoding *enc); + +/** + * Identical to rb_enc_get_index(), except the return type. + * + * @param[in] obj Object in question. + * @exception rb_eTypeError `obj` is incapable of having an encoding. + * @return `obj`'s encoding. + */ +VALUE rb_obj_encoding(VALUE obj); + +/** + * Identical to rb_str_cat(), except it additionally takes an encoding. + * + * @param[out] str Destination object. + * @param[in] ptr Contents to append. + * @param[in] len Length of `src`, in bytes. + * @param[in] enc Encoding of `ptr`. + * @exception rb_eArgError `len` is negative. + * @exception rb_eEncCompatError `enc` is not compatible with `str`. + * @return The passed `dst`. + * @post The contents of `ptr` is copied, transcoded into `dst`'s + * encoding, then pasted into `dst`'s end. + */ +VALUE rb_enc_str_buf_cat(VALUE str, const char *ptr, long len, rb_encoding *enc); + +/** + * Encodes the passed code point into a series of bytes. + * + * @param[in] code Code point. + * @param[in] enc Target encoding scheme. + * @exception rb_eRangeError `enc` does not glean `code`. + * @return An instance of ::rb_cString, of `enc` encoding, whose sole + * contents is `code` represented in `enc`. + * @note No way to encode code points bigger than UINT_MAX. + * + * @internal + * + * In other languages, APIs like this one could be seen as the primitive + * routines where encodings' "encode" feature are implemented. However in case + * of Ruby this is not the primitive one. We directly manipulate encoded + * strings. Encoding conversion routines transcode an encoded string directly + * to another one; not via a code point array. + */ +VALUE rb_enc_uint_chr(unsigned int code, rb_encoding *enc); + +/** + * Identical to rb_external_str_new(), except it additionally takes an + * encoding. However the whole point of rb_external_str_new() is to encode a + * string into default external encoding. Being able to specify arbitrary + * encoding just ruins the designed purpose the function meseems. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @param[in] enc Target encoding scheme. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString. In case encoding conversion from + * "default internal" to `enc` is fully defined over the given + * contents, then the return value is a string of `enc` encoding, + * whose contents are the converted ones. Otherwise the string is + * a junk. + * @warning It doesn't raise on a conversion failure and silently ends up in + * a corrupted output. You can know the failure by querying + * `valid_encoding?` of the result object. + * + * @internal + * + * @shyouhei has no idea why this one does not follow the naming convention + * that others obey. It seems to him that this should have been called + * `rb_enc_external_str_new`. + */ +VALUE rb_external_str_new_with_enc(const char *ptr, long len, rb_encoding *enc); + +/** + * Identical to rb_str_export(), except it additionally takes an encoding. + * + * @param[in] obj Target object. + * @param[in] enc Target encoding. + * @exception rb_eTypeError No implicit conversion to String. + * @return Converted ruby string of `enc` encoding. + */ +VALUE rb_str_export_to_enc(VALUE obj, rb_encoding *enc); + +/** + * Encoding conversion main routine. + * + * @param[in] str String to convert. + * @param[in] from Source encoding. + * @param[in] to Destination encoding. + * @return A copy of `str`, with conversion from `from` to `to` applied. + * @note `from` can be a null pointer. `str`'s encoding is taken then. + * @note `to` can be a null pointer. No-op then. + */ +VALUE rb_str_conv_enc(VALUE str, rb_encoding *from, rb_encoding *to); + +/** + * Identical to rb_str_conv_enc(), except it additionally takes IO encoder + * options. The extra arguments can be constructed using io_extract_modeenc() + * etc. + * + * @param[in] str String to convert. + * @param[in] from Source encoding. + * @param[in] to Destination encoding. + * @param[in] ecflags A set of enum ::ruby_econv_flag_type. + * @param[in] ecopts Optional hash. + * @return A copy of `str`, with conversion from `from` to `to` applied. + * @note `from` can be a null pointer. `str`'s encoding is taken then. + * @note `to` can be a null pointer. No-op then. + * @note `ecopts` can be ::RUBY_Qnil, which is equivalent to passing an + * empty hash. + */ +VALUE rb_str_conv_enc_opts(VALUE str, rb_encoding *from, rb_encoding *to, int ecflags, VALUE ecopts); + +/** + * Scans the passed string to collect its code range. Because a Ruby's string + * is mutable, its contents change from time to time; so does its code range. + * A long-lived string tends to fall back to ::RUBY_ENC_CODERANGE_UNKNOWN. + * This API scans it and re-assigns a fine-grained code range constant. + * + * @param[out] str A string. + * @return An enum ::ruby_coderange_type. + */ +int rb_enc_str_coderange(VALUE str); + +/** + * Scans the passed string until it finds something odd. Returns the number of + * bytes scanned. As the name implies this is suitable for repeated call. One + * of its application is `IO#readlines`. The method reads from its receiver's + * read buffer, maybe more than once, looking for newlines. But "newline" can + * be different among encodings. This API is used to detect broken contents to + * properly mark them as such. + * + * @param[in] str String to scan. + * @param[in] end End of `str`. + * @param[in] enc `str`'s encoding. + * @param[out] cr Return buffer. + * @return Distance between `str` and first such byte where broken. + * @post `cr` has the code range type. + */ +long rb_str_coderange_scan_restartable(const char *str, const char *end, rb_encoding *enc, int *cr); + +/** + * Queries if the passed string is "ASCII only". An ASCII only string is a + * string who doesn't have any non-ASCII characters at all. This doesn't + * necessarily mean the string is in ASCII encoding. For instance a String of + * CP932 encoding can quite much be ASCII only, depending on its contents. + * + * @param[in] str String in question. + * @retval 1 It doesn't have non-ASCII characters. + * @retval 0 It has characters that are out of ASCII. + */ +int rb_enc_str_asciionly_p(VALUE str); + +RBIMPL_ATTR_NONNULL(()) +/** + * Looks for the passed string in the passed buffer. + * + * @param[in] x Buffer that potentially includes `y`. + * @param[in] m Number of bytes of `x`. + * @param[in] y Query string. + * @param[in] n Number of bytes of `y`. + * @param[in] enc Encoding of both `x` and `y`. + * @retval -1 Not found. + * @retval otherwise Found index in `x`. + * @note This API can match at a non-character-boundary. + */ +long rb_memsearch(const void *x, long m, const void *y, long n, rb_encoding *enc); + +/** @cond INTERNAL_MACRO */ +RBIMPL_ATTR_NONNULL(()) +static inline VALUE +rbimpl_enc_str_new_cstr(const char *str, rb_encoding *enc) +{ + long len = rbimpl_strlen(str); + + return rb_enc_str_new_static(str, len, enc); +} + +#define rb_enc_str_new(str, len, enc) \ + ((RBIMPL_CONSTANT_P(str) && \ + RBIMPL_CONSTANT_P(len) ? \ + rb_enc_str_new_static: \ + rb_enc_str_new) ((str), (len), (enc))) + +#define rb_enc_str_new_cstr(str, enc) \ + ((RBIMPL_CONSTANT_P(str) ? \ + rbimpl_enc_str_new_cstr : \ + rb_enc_str_new_cstr) ((str), (enc))) + +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_INTERNAL_ENCODING_STRING_H */ diff --git a/libs/libruby/ruby/internal/encoding/symbol.h b/libs/libruby/ruby/internal/encoding/symbol.h new file mode 100644 index 0000000..9cd1b0d --- /dev/null +++ b/libs/libruby/ruby/internal/encoding/symbol.h @@ -0,0 +1,100 @@ +#ifndef RUBY_INTERNAL_ENCODING_SYMBOL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_INTERNAL_ENCODING_SYMBOL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Routines to manipulate encodings of symbols. + */ + +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/encoding/encoding.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Identical to rb_intern2(), except it additionally takes an encoding. + * + * @param[in] name The name of the id. + * @param[in] len Length of `name`. + * @param[in] enc `name`'s encoding. + * @exception rb_eRuntimeError Too many symbols. + * @return A (possibly new) id whose value is the given name. + * @note These days Ruby internally has two kinds of symbols + * (static/dynamic). Symbols created using this function would + * become static ones; i.e. would never be garbage collected. It + * is up to you to avoid memory leaks. Think twice before using + * it. + */ +ID rb_intern3(const char *name, long len, rb_encoding *enc); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_symname_p(), except it additionally takes an encoding. + * + * @param[in] str A C string to check. + * @param[in] enc `str`'s encoding. + * @retval 1 It is a valid symbol name. + * @retval 0 It is invalid as a symbol name. + */ +int rb_enc_symname_p(const char *str, rb_encoding *enc); + +/** + * Identical to rb_enc_symname_p(), except it additionally takes the passed + * string's length. This is needed for strings containing NUL bytes, like in + * case of UTF-32. + * + * @param[in] name A C string to check. + * @param[in] len Number of bytes of `str`. + * @param[in] enc `str`'s encoding. + * @retval 1 It is a valid symbol name. + * @retval 0 It is invalid as a symbol name. + */ +int rb_enc_symname2_p(const char *name, long len, rb_encoding *enc); + +/** + * Identical to rb_check_id(), except it takes a pointer to a memory region + * instead of Ruby's string. + * + * @param[in] ptr A pointer to a memory region. + * @param[in] len Number of bytes of `ptr`. + * @param[in] enc Encoding of `ptr`. + * @exception rb_eEncodingError `ptr` contains non-ASCII according to `enc`. + * @retval 0 No such id ever existed in the history. + * @retval otherwise The id that represents the given name. + */ +ID rb_check_id_cstr(const char *ptr, long len, rb_encoding *enc); + +/** + * Identical to rb_check_id_cstr(), except for the return type. It can also be + * seen as a routine identical to rb_check_symbol(), except it takes a pointer + * to a memory region instead of Ruby's string. + * + * @param[in] ptr A pointer to a memory region. + * @param[in] len Number of bytes of `ptr`. + * @param[in] enc Encoding of `ptr`. + * @exception rb_eEncodingError `ptr` contains non-ASCII according to `enc`. + * @retval RUBY_Qnil No such id ever existed in the history. + * @retval otherwise The id that represents the given name. + */ +VALUE rb_check_symbol_cstr(const char *ptr, long len, rb_encoding *enc); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_INTERNAL_ENCODING_SYMBOL_H */ diff --git a/libs/libruby/ruby/internal/encoding/transcode.h b/libs/libruby/ruby/internal/encoding/transcode.h new file mode 100644 index 0000000..7f26d2e --- /dev/null +++ b/libs/libruby/ruby/internal/encoding/transcode.h @@ -0,0 +1,562 @@ +#ifndef RUBY_INTERNAL_ENCODING_TRANSCODE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_INTERNAL_ENCODING_TRANSCODE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief econv stuff + */ + +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** return value of rb_econv_convert() */ +typedef enum { + + /** + * The conversion stopped when it found an invalid sequence. + */ + econv_invalid_byte_sequence, + + /** + * The conversion stopped when it found a character in the input which + * cannot be representable in the output. + */ + econv_undefined_conversion, + + /** + * The conversion stopped because there is no destination. + */ + econv_destination_buffer_full, + + /** + * The conversion stopped because there is no input. + */ + econv_source_buffer_empty, + + /** + * The conversion stopped after converting everything. This is arguably + * the expected normal end of conversion. + */ + econv_finished, + + /** + * The conversion stopped after writing something to somewhere, before + * reading everything. + */ + econv_after_output, + + /** + * The conversion stopped in middle of reading a character, possibly due to + * a partial read of a socket etc. + */ + econv_incomplete_input +} rb_econv_result_t; + +/** An opaque struct that represents a lowest level of encoding conversion. */ +typedef struct rb_econv_t rb_econv_t; + +/** + * Converts the contents of the passed string from its encoding to the passed + * one. + * + * @param[in] str Target string. + * @param[in] to Destination encoding. + * @param[in] ecflags A set of enum + * ::ruby_econv_flag_type. + * @param[in] ecopts A keyword hash, like + * ::rb_io_t::rb_io_enc_t::ecopts. + * @exception rb_eArgError Not fully converted. + * @exception rb_eInvalidByteSequenceError `str` is malformed. + * @exception rb_eUndefinedConversionError `str` has a character not + * representable using `to`. + * @exception rb_eConversionNotFoundError There is no known conversion from + * `str`'s encoding to `to`. + * @return A string whose encoding is `to`, and whose contents is converted + * contents of `str`. + * @note Use rb_econv_prepare_options() to generate `ecopts`. + */ +VALUE rb_str_encode(VALUE str, VALUE to, int ecflags, VALUE ecopts); + +/** + * Queries if there is more than one way to convert between the passed two + * encodings. Encoding conversion are has_and_belongs_to_many relationships. + * There could be no direct conversion defined for the passed pair. Ruby tries + * to find an indirect way to do so then. For instance ISO-8859-1 has no + * direct conversion to ISO-2022-JP. But there is ISO-8859-1 to UTF-8 + * conversion; then there is UTF-8 to EUC-JP conversion; finally there also is + * EUC-JP to ISO-2022-JP conversion. So in short ISO-8859-1 can be converted + * to ISO-2022-JP using that path. This function returns true. Obviously not + * everything that can be represented using UTF-8 can also be represented using + * EUC-JP. Conversions in practice can fail depending on the actual input, and + * that renders exceptions in case of rb_str_encode(). + * + * @param[in] from_encoding One encoding. + * @param[in] to_encoding Another encoding. + * @retval 0 No way to convert the two. + * @retval 1 At least one way to convert the two. + * + * @internal + * + * Practically @shyouhei knows no way for this function to return 0. It seems + * everything can eventually be converted to/from UTF-8, which connects + * everything. + */ +int rb_econv_has_convpath_p(const char* from_encoding, const char* to_encoding); + +/** + * Identical to rb_econv_prepare_opts(), except it additionally takes the + * initial value of flags. The extra bits are bitwise-ORed to the return + * value. + * + * @param[in] opthash Keyword arguments. + * @param[out] ecopts Return buffer. + * @param[in] ecflags Default set of enum ::ruby_econv_flag_type. + * @exception rb_eArgError Unknown/Broken values passed. + * @return Calculated set of enum ::ruby_econv_flag_type. + * @post `ecopts` holds a hash object suitable for + * ::rb_io_t::rb_io_enc_t::ecopts. + */ +int rb_econv_prepare_options(VALUE opthash, VALUE *ecopts, int ecflags); + +/** + * Splits a keyword arguments hash (that for instance `String#encode` took) + * into a set of enum ::ruby_econv_flag_type and a hash storing replacement + * characters etc. + * + * @param[in] opthash Keyword arguments. + * @param[out] ecopts Return buffer. + * @exception rb_eArgError Unknown/Broken values passed. + * @return Calculated set of enum ::ruby_econv_flag_type. + * @post `ecopts` holds a hash object suitable for + * ::rb_io_t::rb_io_enc_t::ecopts. + */ +int rb_econv_prepare_opts(VALUE opthash, VALUE *ecopts); + +/** + * Creates a new instance of struct ::rb_econv_t. + * + * @param[in] source_encoding Name of an encoding. + * @param[in] destination_encoding Name of another encoding. + * @param[in] ecflags A set of enum ::ruby_econv_flag_type. + * @exception rb_eArgError No such encoding. + * @retval NULL Failed to create a struct ::rb_econv_t. + * @retval otherwise Allocated struct ::rb_econv_t. + * @warning Return value must be passed to rb_econv_close() exactly once. + */ +rb_econv_t *rb_econv_open(const char *source_encoding, const char *destination_encoding, int ecflags); + +/** + * Identical to rb_econv_open(), except it additionally takes a hash of + * optional strings. + * + * + * @param[in] source_encoding Name of an encoding. + * @param[in] destination_encoding Name of another encoding. + * @param[in] ecflags A set of enum ::ruby_econv_flag_type. + * @param[in] ecopts Optional set of strings. + * @exception rb_eArgError No such encoding. + * @retval NULL Failed to create a struct ::rb_econv_t. + * @retval otherwise Allocated struct ::rb_econv_t. + * @warning Return value must be passed to rb_econv_close() exactly once. + */ +rb_econv_t *rb_econv_open_opts(const char *source_encoding, const char *destination_encoding, int ecflags, VALUE ecopts); + +/** + * Converts a string from an encoding to another. + * + * Possible flags are either ::RUBY_ECONV_PARTIAL_INPUT (means the source + * buffer is a part of much larger one), ::RUBY_ECONV_AFTER_OUTPUT (instructs + * the converter to stop after output before input), or both of them. + * + * @param[in,out] ec Conversion specification/state etc. + * @param[in] source_buffer_ptr Target string. + * @param[in] source_buffer_end End of target string. + * @param[out] destination_buffer_ptr Return buffer. + * @param[out] destination_buffer_end End of return buffer. + * @param[in] flags Flags (see above). + * @return The status of the conversion. + * @post `destination_buffer_ptr` holds conversion results. + */ +rb_econv_result_t rb_econv_convert(rb_econv_t *ec, + const unsigned char **source_buffer_ptr, const unsigned char *source_buffer_end, + unsigned char **destination_buffer_ptr, unsigned char *destination_buffer_end, + int flags); + +/** + * Destructs a converter. Note that a converter can have a buffer, and can be + * non-empty. Calling this would lose your data then. + * + * @param[out] ec The converter to destroy. + * @post `ec` is no longer a valid pointer. + */ +void rb_econv_close(rb_econv_t *ec); + +/** + * Assigns the replacement string. The string passed here would appear in + * converted string when it cannot represent its source counterpart. This can + * happen for instance you convert an emoji to ISO-8859-1. + * + * @param[out] ec Target converter. + * @param[in] str Replacement string. + * @param[in] len Number of bytes of `str`. + * @param[in] encname Name of encoding of `str`. + * @retval 0 Success. + * @retval -1 Failure (ENOMEM etc.). + * @post `ec`'s replacement string is set to `str`. + */ +int rb_econv_set_replacement(rb_econv_t *ec, const unsigned char *str, size_t len, const char *encname); + +/** + * "Decorate"s a converter. There are special kind of converters that + * transforms the contents, like replacing CR into CRLF. You can add such + * decorators to a converter using this API. By using this function a + * decorator is prepended at the beginning of a conversion sequence: in case of + * CRLF conversion, newlines are converted before encodings are converted. + * + * @param[out] ec Target converter to decorate. + * @param[in] decorator_name Name of decorator to prepend. + * @retval 0 Success. + * @retval -1 Failure (no such decorator etc.). + * @post Decorator works before encoding conversion happens. + * + * @internal + * + * What is the possible value of the `decorator_name` is not public. You have + * to read through `transcode.c` carefully. + */ +int rb_econv_decorate_at_first(rb_econv_t *ec, const char *decorator_name); + +/** + * Identical to rb_econv_decorate_at_first(), except it adds to the opposite + * direction. For instance CRLF conversion would run _after_ encodings are + * converted. + * + * @param[out] ec Target converter to decorate. + * @param[in] decorator_name Name of decorator to prepend. + * @retval 0 Success. + * @retval -1 Failure (no such decorator etc.). + * @post Decorator works after encoding conversion happens. + */ +int rb_econv_decorate_at_last(rb_econv_t *ec, const char *decorator_name); + +/** + * Creates a `rb_eConverterNotFoundError` exception object (but does not + * raise). + * + * @param[in] senc Name of source encoding. + * @param[in] denc Name of destination encoding. + * @param[in] ecflags A set of enum ::ruby_econv_flag_type. + * @return An instance of `rb_eConverterNotFoundError`. + */ +VALUE rb_econv_open_exc(const char *senc, const char *denc, int ecflags); + +/** + * Appends the passed string to the passed converter's output buffer. This can + * be handy when an encoding needs bytes out of thin air; for instance + * ISO-2022-JP has "shift function" which does not correspond to any + * characters. + * + * @param[out] ec Target converter. + * @param[in] str String to insert. + * @param[in] len Number of bytes of `str`. + * @param[in] str_encoding Encoding of `str`. + * @retval 0 Success. + * @retval -1 Failure (conversion error etc.). + * @note `str_encoding` can be anything, and `str` itself is converted + * when necessary. + */ +int rb_econv_insert_output(rb_econv_t *ec, + const unsigned char *str, size_t len, const char *str_encoding); + +/** + * Queries an encoding name which best suits for rb_econv_insert_output()'s + * last parameter. Strings in this encoding need no conversion when inserted; + * can be both time/space efficient. + * + * @param[in] ec Target converter. + * @return Its encoding for insertion. + */ +const char *rb_econv_encoding_to_insert_output(rb_econv_t *ec); + +/** + * This is a rb_econv_make_exception() + rb_exc_raise() combo. + * + * @param[in] ec (Possibly failed) conversion. + * @exception rb_eInvalidByteSequenceError Invalid byte sequence. + * @exception rb_eUndefinedConversionError Conversion undefined. + * @note This function can return when no error. + */ +void rb_econv_check_error(rb_econv_t *ec); + +/** + * This function makes sense right after rb_econv_convert() returns. As listed + * in ::rb_econv_result_t, rb_econv_convert() can bail out for various reasons. + * This function checks the passed converter's internal state and convert it to + * an appropriate exception object. + * + * @param[in] ec Target converter. + * @retval RUBY_Qnil The converter has no error. + * @retval otherwise Conversion error turned into an exception. + */ +VALUE rb_econv_make_exception(rb_econv_t *ec); + +/** + * Queries if rb_econv_putback() makes sense, i.e. there are invalid byte + * sequences remain in the buffer. + * + * @param[in] ec Target converter. + * @return Number of bytes that can be pushed back. + */ +int rb_econv_putbackable(rb_econv_t *ec); + +/** + * Puts back the bytes. In case of ::econv_invalid_byte_sequence, some of + * those invalid bytes are discarded and the others are buffered to be + * converted later. The latter bytes can be put back using this API. + * + * @param[out] ec Target converter (invalid byte sequence). + * @param[out] p Return buffer. + * @param[in] n Max number of bytes to put back. + * @post At most `n` bytes of what was put back is written to `p`. + */ +void rb_econv_putback(rb_econv_t *ec, unsigned char *p, int n); + +/** + * Queries the passed encoding's corresponding ASCII compatible encoding. "The + * corresponding ASCII compatible encoding" in this context is an ASCII + * compatible encoding which can represent exactly the same character sets as + * the given ASCII incompatible encoding. For instance that of UTF-16LE is + * UTF-8. + * + * @param[in] encname Name of an ASCII incompatible encoding. + * @retval NULL `encname` is already ASCII compatible. + * @retval otherwise The corresponding ASCII compatible encoding. + */ +const char *rb_econv_asciicompat_encoding(const char *encname); + +/** + * Identical to rb_econv_convert(), except it takes Ruby's string instead of + * C's pointer. + * + * @param[in,out] ec Target converter. + * @param[in] src Source string. + * @param[in] flags Flags (see rb_econv_convert). + * @exception rb_eArgError Converted string is too long. + * @exception rb_eInvalidByteSequenceError Invalid byte sequence. + * @exception rb_eUndefinedConversionError Conversion undefined. + * @return The conversion result. + */ +VALUE rb_econv_str_convert(rb_econv_t *ec, VALUE src, int flags); + +/** + * Identical to rb_econv_str_convert(), except it converts only a part of the + * passed string. Can be handy when you for instance want to do line-buffered + * conversion. + * + * @param[in,out] ec Target converter. + * @param[in] src Source string. + * @param[in] byteoff Number of bytes to seek. + * @param[in] bytesize Number of bytes to read. + * @param[in] flags Flags (see rb_econv_convert). + * @exception rb_eArgError Converted string is too long. + * @exception rb_eInvalidByteSequenceError Invalid byte sequence. + * @exception rb_eUndefinedConversionError Conversion undefined. + * @return The conversion result. + */ +VALUE rb_econv_substr_convert(rb_econv_t *ec, VALUE src, long byteoff, long bytesize, int flags); + +/** + * Identical to rb_econv_str_convert(), except it appends the conversion result + * to the additionally passed string instead of creating a new string. It can + * also be seen as a routine identical to rb_econv_append(), except it takes a + * Ruby's string instead of C's pointer. + * + * @param[in,out] ec Target converter. + * @param[in] src Source string. + * @param[in] dst Return buffer. + * @param[in] flags Flags (see rb_econv_convert). + * @exception rb_eArgError Converted string is too long. + * @exception rb_eInvalidByteSequenceError Invalid byte sequence. + * @exception rb_eUndefinedConversionError Conversion undefined. + * @return The conversion result. + */ +VALUE rb_econv_str_append(rb_econv_t *ec, VALUE src, VALUE dst, int flags); + +/** + * Identical to rb_econv_str_append(), except it appends only a part of the + * passed string with conversion. It can also be seen as a routine identical + * to rb_econv_substr_convert(), except it appends the conversion result to the + * additionally passed string instead of creating a new string. + * + * @param[in,out] ec Target converter. + * @param[in] src Source string. + * @param[in] byteoff Number of bytes to seek. + * @param[in] bytesize Number of bytes to read. + * @param[in] dst Return buffer. + * @param[in] flags Flags (see rb_econv_convert). + * @exception rb_eArgError Converted string is too long. + * @exception rb_eInvalidByteSequenceError Invalid byte sequence. + * @exception rb_eUndefinedConversionError Conversion undefined. + * @return The conversion result. + */ +VALUE rb_econv_substr_append(rb_econv_t *ec, VALUE src, long byteoff, long bytesize, VALUE dst, int flags); + +/** + * Converts the passed C's pointer according to the passed converter, then + * append the conversion result to the passed Ruby's string. This way buffer + * overflow is properly avoided to resize the destination properly. + * + * @param[in,out] ec Target converter. + * @param[in] bytesrc Target string. + * @param[in] bytesize Number of bytes of `bytesrc`. + * @param[in] dst Return buffer. + * @param[in] flags Flags (see rb_econv_convert). + * @exception rb_eArgError Converted string is too long. + * @exception rb_eInvalidByteSequenceError Invalid byte sequence. + * @exception rb_eUndefinedConversionError Conversion undefined. + * @return The conversion result. + */ +VALUE rb_econv_append(rb_econv_t *ec, const char *bytesrc, long bytesize, VALUE dst, int flags); + +/** + * This badly named function does not set the destination encoding to binary, + * but instead just nullifies newline conversion decorators if any. Other + * ordinal character conversions still happen after this; something non-binary + * would still be generated. + * + * @param[out] ec Target converter to modify. + * @post Any newline conversions, if any, would be killed. + */ +void rb_econv_binmode(rb_econv_t *ec); + +/** + * This enum is kind of omnibus. Gathers various constants. + */ +enum ruby_econv_flag_type { + + /** + * @name Flags for rb_econv_open() + * + * @{ + */ + + /** Mask for error handling related bits. */ + RUBY_ECONV_ERROR_HANDLER_MASK = 0x000000ff, + + /** Special handling of invalid sequences are there. */ + RUBY_ECONV_INVALID_MASK = 0x0000000f, + + /** Invalid sequences shall be replaced. */ + RUBY_ECONV_INVALID_REPLACE = 0x00000002, + + /** Special handling of undefined conversion are there. */ + RUBY_ECONV_UNDEF_MASK = 0x000000f0, + + /** Undefined characters shall be replaced. */ + RUBY_ECONV_UNDEF_REPLACE = 0x00000020, + + /** Undefined characters shall be escaped. */ + RUBY_ECONV_UNDEF_HEX_CHARREF = 0x00000030, + + /** Decorators are there. */ + RUBY_ECONV_DECORATOR_MASK = 0x0001ff00, + + /** Newline converters are there. */ + RUBY_ECONV_NEWLINE_DECORATOR_MASK = 0x00007f00, + + /** (Unclear; seems unused). */ + RUBY_ECONV_NEWLINE_DECORATOR_READ_MASK = 0x00000f00, + + /** (Unclear; seems unused). */ + RUBY_ECONV_NEWLINE_DECORATOR_WRITE_MASK = 0x00007000, + + /** Universal newline mode. */ + RUBY_ECONV_UNIVERSAL_NEWLINE_DECORATOR = 0x00000100, + + /** CR to CRLF conversion shall happen. */ + RUBY_ECONV_CRLF_NEWLINE_DECORATOR = 0x00001000, + + /** CRLF to CR conversion shall happen. */ + RUBY_ECONV_CR_NEWLINE_DECORATOR = 0x00002000, + + /** CRLF to LF conversion shall happen. */ + RUBY_ECONV_LF_NEWLINE_DECORATOR = 0x00004000, + + /** Texts shall be XML-escaped. */ + RUBY_ECONV_XML_TEXT_DECORATOR = 0x00008000, + + /** Texts shall be AttrValue escaped */ + RUBY_ECONV_XML_ATTR_CONTENT_DECORATOR = 0x00010000, + + /** (Unclear; seems unused). */ + RUBY_ECONV_STATEFUL_DECORATOR_MASK = 0x00f00000, + + /** Texts shall be AttrValue escaped. */ + RUBY_ECONV_XML_ATTR_QUOTE_DECORATOR = 0x00100000, + + /** Newline decorator's default. */ + RUBY_ECONV_DEFAULT_NEWLINE_DECORATOR = +#if defined(RUBY_TEST_CRLF_ENVIRONMENT) || defined(_WIN32) + RUBY_ECONV_CRLF_NEWLINE_DECORATOR, +#else + 0, +#endif + +#define ECONV_ERROR_HANDLER_MASK RUBY_ECONV_ERROR_HANDLER_MASK /**< @old{RUBY_ECONV_ERROR_HANDLER_MASK} */ +#define ECONV_INVALID_MASK RUBY_ECONV_INVALID_MASK /**< @old{RUBY_ECONV_INVALID_MASK} */ +#define ECONV_INVALID_REPLACE RUBY_ECONV_INVALID_REPLACE /**< @old{RUBY_ECONV_INVALID_REPLACE} */ +#define ECONV_UNDEF_MASK RUBY_ECONV_UNDEF_MASK /**< @old{RUBY_ECONV_UNDEF_MASK} */ +#define ECONV_UNDEF_REPLACE RUBY_ECONV_UNDEF_REPLACE /**< @old{RUBY_ECONV_UNDEF_REPLACE} */ +#define ECONV_UNDEF_HEX_CHARREF RUBY_ECONV_UNDEF_HEX_CHARREF /**< @old{RUBY_ECONV_UNDEF_HEX_CHARREF} */ +#define ECONV_DECORATOR_MASK RUBY_ECONV_DECORATOR_MASK /**< @old{RUBY_ECONV_DECORATOR_MASK} */ +#define ECONV_NEWLINE_DECORATOR_MASK RUBY_ECONV_NEWLINE_DECORATOR_MASK /**< @old{RUBY_ECONV_NEWLINE_DECORATOR_MASK} */ +#define ECONV_NEWLINE_DECORATOR_READ_MASK RUBY_ECONV_NEWLINE_DECORATOR_READ_MASK /**< @old{RUBY_ECONV_NEWLINE_DECORATOR_READ_MASK} */ +#define ECONV_NEWLINE_DECORATOR_WRITE_MASK RUBY_ECONV_NEWLINE_DECORATOR_WRITE_MASK /**< @old{RUBY_ECONV_NEWLINE_DECORATOR_WRITE_MASK} */ +#define ECONV_UNIVERSAL_NEWLINE_DECORATOR RUBY_ECONV_UNIVERSAL_NEWLINE_DECORATOR /**< @old{RUBY_ECONV_UNIVERSAL_NEWLINE_DECORATOR} */ +#define ECONV_CRLF_NEWLINE_DECORATOR RUBY_ECONV_CRLF_NEWLINE_DECORATOR /**< @old{RUBY_ECONV_CRLF_NEWLINE_DECORATOR} */ +#define ECONV_CR_NEWLINE_DECORATOR RUBY_ECONV_CR_NEWLINE_DECORATOR /**< @old{RUBY_ECONV_CR_NEWLINE_DECORATOR} */ +#define ECONV_LF_NEWLINE_DECORATOR RUBY_ECONV_LF_NEWLINE_DECORATOR /**< @old{RUBY_ECONV_LF_NEWLINE_DECORATOR} */ +#define ECONV_XML_TEXT_DECORATOR RUBY_ECONV_XML_TEXT_DECORATOR /**< @old{RUBY_ECONV_XML_TEXT_DECORATOR} */ +#define ECONV_XML_ATTR_CONTENT_DECORATOR RUBY_ECONV_XML_ATTR_CONTENT_DECORATOR /**< @old{RUBY_ECONV_XML_ATTR_CONTENT_DECORATOR} */ +#define ECONV_STATEFUL_DECORATOR_MASK RUBY_ECONV_STATEFUL_DECORATOR_MASK /**< @old{RUBY_ECONV_STATEFUL_DECORATOR_MASK} */ +#define ECONV_XML_ATTR_QUOTE_DECORATOR RUBY_ECONV_XML_ATTR_QUOTE_DECORATOR /**< @old{RUBY_ECONV_XML_ATTR_QUOTE_DECORATOR} */ +#define ECONV_DEFAULT_NEWLINE_DECORATOR RUBY_ECONV_DEFAULT_NEWLINE_DECORATOR /**< @old{RUBY_ECONV_DEFAULT_NEWLINE_DECORATOR} */ + /** @} */ + + /** + * @name Flags for rb_econv_convert() + * + * @{ + */ + + /** Indicates the input is a part of much larger one. */ + RUBY_ECONV_PARTIAL_INPUT = 0x00020000, + + /** Instructs the converter to stop after output. */ + RUBY_ECONV_AFTER_OUTPUT = 0x00040000, +#define ECONV_PARTIAL_INPUT RUBY_ECONV_PARTIAL_INPUT /**< @old{RUBY_ECONV_PARTIAL_INPUT} */ +#define ECONV_AFTER_OUTPUT RUBY_ECONV_AFTER_OUTPUT /**< @old{RUBY_ECONV_AFTER_OUTPUT} */ + + RUBY_ECONV_FLAGS_PLACEHOLDER /**< Placeholder (not used) */ +}; + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_INTERNAL_ENCODING_TRANSCODE_H */ diff --git a/libs/libruby/ruby/internal/error.h b/libs/libruby/ruby/internal/error.h new file mode 100644 index 0000000..49e2276 --- /dev/null +++ b/libs/libruby/ruby/internal/error.h @@ -0,0 +1,582 @@ +#ifndef RBIMPL_ERROR_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ERROR_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Declares ::rb_raise(). + */ +#include "ruby/internal/attr/cold.h" +#include "ruby/internal/attr/format.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +/** + * @defgroup exception Exception handlings + * @{ + */ + +/** + * Warning categories. A warning issued using this API can be selectively + * requested / suppressed by the end-users. For instance passing + * `-W:no-deprecated` to the ruby process would suppress those warnings in + * deprecated category. + * + * @warning There is no way to declare a new category (for now). + */ +typedef enum { + /** Category unspecified. */ + RB_WARN_CATEGORY_NONE, + + /** Warning is for deprecated features. */ + RB_WARN_CATEGORY_DEPRECATED, + + /** Warning is for experimental features. */ + RB_WARN_CATEGORY_EXPERIMENTAL, + + RB_WARN_CATEGORY_ALL_BITS = 0x6 /* no RB_WARN_CATEGORY_NONE bit */ +} rb_warning_category_t; + +/** for rb_readwrite_sys_fail first argument */ +enum rb_io_wait_readwrite {RB_IO_WAIT_READABLE, RB_IO_WAIT_WRITABLE}; +/** @cond INTERNAL_MACRO */ +#define RB_IO_WAIT_READABLE RB_IO_WAIT_READABLE +#define RB_IO_WAIT_WRITABLE RB_IO_WAIT_WRITABLE +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * This is the same as `$!` in Ruby. + * + * @retval RUBY_Qnil Not handling exceptions at the moment. + * @retval otherwise The current exception in the current thread. + * @ingroup exception + */ +VALUE rb_errinfo(void); + +/** + * Sets the current exception (`$!`) to the given value. + * + * @param[in] err An instance of ::rb_eException, or ::RUBY_Qnil. + * @exception rb_eTypeError What is given was neither ::rb_eException nor + * ::RUBY_Qnil. + * @note Use rb_raise() instead to raise `err`. This function just + * assigns the given object to the global variable. + * @ingroup exception + */ +void rb_set_errinfo(VALUE err); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) +/** + * Exception entry point. By calling this function the execution of your + * program gets interrupted to "raise" an exception up to the callee entities. + * Programs could "rescue" that exception, or could "ensure" some part of them. + * If nobody cares about such things, the raised exception reaches at the top + * of execution. This yields abnormal end of the process. + * + * @param[in] exc A subclass of ::rb_eException. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + * @exception exc The specified exception. + * @note It never returns. + */ +void rb_raise(VALUE exc, const char *fmt, ...); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL((1)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2) +/** + * Raises the unsung "fatal" exception. This is considered severe. Nobody can + * rescue the exception. Once raised, process termination is inevitable. + * However ensure clauses still run, so that resources are properly cleaned up. + * + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + * @exception rb_eFatal An exception that you cannot rescue. + * @note It never returns. + */ +void rb_fatal(const char *fmt, ...); + +RBIMPL_ATTR_COLD() +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL((1)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2) +/** + * Interpreter panic switch. Immediate process termination without any + * synchronisations shall occur. LOTS of internal states, stack traces, and + * even machine registers are displayed if possible for debugging purposes + * then. + * + * @warning Do not use this API. + * @warning You are not expected to use this API. + * @warning Why not just fix your code instead of calling this API? + * @warning It was a bad idea to expose this API to extension libraries at + * the first place. We just cannot delete it at this point for + * backwards compatibility. That doesn't mean everyone are + * welcomed to call this function at will. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + * @note It never returns. + */ +void rb_bug(const char *fmt, ...); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL(()) +/** + * This is a wrapper of rb_bug() which automatically constructs appropriate + * message from the passed errno. + * + * @param[in] msg Additional message to display. + * @exception err C level errno. + * @note It never returns. + */ +void rb_bug_errno(const char *msg, int err); + +RBIMPL_ATTR_NORETURN() +/** + * Converts a C errno into a Ruby exception, then raises it. For instance: + * + * ```CXX + * static VALUE + * foo(VALUE argv) + * { + * const auto cmd = StringValueCStr(argv); + * const auto waitr = system(cmd); + * if (waitr == -1) { + * rb_sys_fail("system(3posix)"); // <-------------- this + * } + * else { + * return INT2FIX(fd); + * } + * } + * ``` + * + * @param[in] msg Additional message to raise. + * @exception rb_eSystemCallError An exception representing errno. + * @note It never returns. + */ +void rb_sys_fail(const char *msg); + +RBIMPL_ATTR_NORETURN() +/** + * Identical to rb_sys_fail(), except it takes the message in Ruby's String + * instead of C's. + * + * @param[in] msg Additional message to raise. + * @exception rb_eSystemCallError An exception representing errno. + * @note It never returns. + */ +void rb_sys_fail_str(VALUE msg); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL((2)) +/** + * Identical to rb_sys_fail(), except it takes additional module to extend the + * exception object before raising. + * + * @param[in] mod A ::rb_cModule instance. + * @param[in] msg Additional message to raise. + * @exception rb_eSystemCallError An exception representing errno. + * @note It never returns. + * + * @internal + * + * Does anybody use it? + */ +void rb_mod_sys_fail(VALUE mod, const char *msg); + +RBIMPL_ATTR_NORETURN() +/** + * Identical to rb_mod_sys_fail(), except it takes the message in Ruby's String + * instead of C's. + * + * @param[in] mod A ::rb_cModule instance. + * @param[in] msg Additional message to raise. + * @exception rb_eSystemCallError An exception representing errno. + * @note It never returns. + */ +void rb_mod_sys_fail_str(VALUE mod, VALUE msg); + +RBIMPL_ATTR_NORETURN() +/** + * Raises appropriate exception using the parameters. + * + * In Ruby level there are rb_eEAGAINWaitReadable etc. This function maps the + * given parameter to an appropriate exception class, then raises it. + * + * @param[in] waiting Reason for the IO to wait. + * @param[in] msg Additional message to raise. + * @exception rb_eEAGAINWaitWritable + * @exception rb_eEWOULDBLOCKWaitWritable + * @exception rb_eEINPROGRESSWaitWritable + * @exception rb_eEAGAINWaitReadable + * @exception rb_eEWOULDBLOCKWaitReadable + * @exception rb_eEINPROGRESSWaitReadable + * @exception rb_eSystemCallError + * @note It never returns. + */ +void rb_readwrite_sys_fail(enum rb_io_wait_readwrite waiting, const char *msg); + +RBIMPL_ATTR_NORETURN() +/** + * Breaks from a block. Because you are using a CAPI this is not as intuitive + * as it sounds. In order for this function to properly work, make a + * ::rb_block_call_func_t function that calls it internally, and pass that + * function to rb_block_call(). + * + * @exception rb_eLocalJumpError Called from outside of a block. + * @note It never returns. + */ +void rb_iter_break(void); + +RBIMPL_ATTR_NORETURN() +/** + * Identical to rb_iter_break(), except it additionally takes the "value" of + * this breakage. It will be the evaluation result of the iterator. This is + * kind of complicated; you cannot see this as a "return from a block" + * behaviour. Take a look at this example: + * + * ```ruby + * def foo(q) + * puts(w = yield(q)) + * puts(e = yield(w)) + * puts(r = yield(e)) + * puts(t = yield(r)) + * puts(y = yield(t)) + * return "howdy!" + * end + * + * x = foo(0) {|i| + * if i > 2 + * break "hello!" + * else + * next i + 1 + * end + * } + * + * puts x + * ``` + * + * This script outputs 1, 2, 3, and hello. Note that the value passed to break + * becomes the return value of foo method, not the value of yield. This is + * confusing, but can be handy on occasions e.g. when you want to bring a + * local variable out of a block. + * + * @param[in] val The value of the iterator. + * @exception rb_eLocalJumpError Called from outside of a block. + * @note It never returns. + */ +void rb_iter_break_value(VALUE val); + +RBIMPL_ATTR_NORETURN() +/** + * Terminates the current execution context. This API is the entry point of a + * "well-mannered" termination sequence. When called from an extension + * library, it raises ::rb_eSystemExit exception. Programs could rescue that + * exception. Can cancel process exit then. Otherwise, that exception results + * in a process termination with the status passed to this function. + * + * @param[in] status Exit status, see also exit(3). + * @exception rb_eSystemExit Exception representing the exit status. + * @note It never returns. + * + * @internal + * + * "When called from an extension library"? You might wonder. In fact there + * are chances for this function to be called from outside of it, for instance + * when dlopen(3) failed. In case it is not possible for this function to + * raise an exception, it does not (silently enters to process cleanup). But + * that is a kind of implementation detail which extension library authors + * should not bother. + */ +void rb_exit(int status); + +RBIMPL_ATTR_NORETURN() +/** + * @exception rb_eNotImpError + * @note It never returns. + */ +void rb_notimplement(void); + +/** + * Creates an exception object that represents the given C errno. + * + * @param[in] err C level errno. + * @param[in] msg Additional message. + * @retval rb_eSystemCallError An exception for the errno. + */ +VALUE rb_syserr_new(int err, const char * msg); + +/** + * Identical to rb_syserr_new(), except it takes the message in Ruby's String + * instead of C's. + * + * @param[in] n C level errno. + * @param[in] arg Additional message. + * @retval rb_eSystemCallError An exception for the errno. + */ +VALUE rb_syserr_new_str(int n, VALUE arg); + +RBIMPL_ATTR_NORETURN() +/** + * Raises appropriate exception that represents a C errno. + * + * @param[in] err C level errno. + * @param[in] msg Additional message to raise. + * @exception rb_eSystemCallError An exception representing `err`. + * @note It never returns. + */ +void rb_syserr_fail(int err, const char *msg); + +RBIMPL_ATTR_NORETURN() +/** + * Identical to rb_syserr_fail(), except it takes the message in Ruby's String + * instead of C's. + * + * @param[in] err C level errno. + * @param[in] msg Additional message to raise. + * @exception rb_eSystemCallError An exception representing `err`. + * @note It never returns. + */ +void rb_syserr_fail_str(int err, VALUE msg); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_mod_sys_fail(), except it does not depend on C global + * variable errno. Pass it explicitly. + * + * @param[in] mod A ::rb_cModule instance. + * @param[in] err C level errno. + * @param[in] msg Additional message to raise. + * @exception rb_eSystemCallError An exception representing `err`. + * @note It never returns. + */ +void rb_mod_syserr_fail(VALUE mod, int err, const char *msg); + +RBIMPL_ATTR_NORETURN() +/** + * Identical to rb_mod_syserr_fail(), except it takes the message in Ruby's + * String instead of C's. + * + * @param[in] mod A ::rb_cModule instance. + * @param[in] err C level errno. + * @param[in] msg Additional message to raise. + * @exception rb_eSystemCallError An exception representing `err`. + * @note It never returns. + */ +void rb_mod_syserr_fail_str(VALUE mod, int err, VALUE msg); + +RBIMPL_ATTR_NORETURN() +/** + * Identical to rb_readwrite_sys_fail(), except it does not depend on C global + * variable errno. Pass it explicitly. + * + * @param[in] waiting Reason for the IO to wait. + * @param[in] err C level errno. + * @param[in] msg Additional message to raise. + * @exception rb_eEAGAINWaitWritable + * @exception rb_eEWOULDBLOCKWaitWritable + * @exception rb_eEINPROGRESSWaitWritable + * @exception rb_eEAGAINWaitReadable + * @exception rb_eEWOULDBLOCKWaitReadable + * @exception rb_eEINPROGRESSWaitReadable + * @exception rb_eSystemCallError + * @note It never returns. + */ +void rb_readwrite_syserr_fail(enum rb_io_wait_readwrite waiting, int err, const char *msg); + +RBIMPL_ATTR_COLD() +RBIMPL_ATTR_NORETURN() +/** + * Fails with the given object's type incompatibility to the type. + * + * It seems this function is visible from extension libraries only because + * RTYPEDDATA_TYPE() uses it on RUBY_DEBUG. So you can basically ignore it; + * use some other fine-grained method instead. + * + * @param[in] self The object in question. + * @param[in] t Expected type of the object. + * @exception rb_eTypeError `self` not in type `t`. + * @note It never returns. + * @note The second argument must have been an enum ::ruby_value_type, + * but for historical reasons it remains to be an int (in other + * words we see no benefits fixing this bug). + */ +void rb_unexpected_type(VALUE self, int t); + +/** + * @private + * + * This is an implementation detail of #ruby_verbose. Please don't use it + * directly. + * + * @retval Qnil Interpreter is quiet. + * @retval Qfalse Interpreter is kind of chatty. + * @retval otherwise Interpreter is very verbose. + */ +VALUE *rb_ruby_verbose_ptr(void); + +/** + * @private + * + * This is an implementation detail of #ruby_debug. Please don't use it + * directly. + * + * @retval Qnil Interpreter not in debug mode. + * @retval Qfalse Interpreter not in debug mode. + * @retval otherwise Interpreter is in debug mode. + */ +VALUE *rb_ruby_debug_ptr(void); + +/** + * This variable controls whether the interpreter is in debug mode. Setting + * this to some truthy value is equivalent to passing `-W` flag to the + * interpreter. Setting this to ::Qfalse is equivalent to passing `-W1` flag + * to the interpreter. Setting this to ::Qnil is equivalent to passing `-W0` + * flag to the interpreter. + * + * @retval Qnil Interpreter is quiet. + * @retval Qfalse Interpreter is kind of chatty. + * @retval otherwise Interpreter is very verbose. + */ +#define ruby_verbose (*rb_ruby_verbose_ptr()) + +/** + * This variable controls whether the interpreter is in debug mode. Setting + * this to some truthy value is equivalent to passing `-d` flag to the + * interpreter. + * + * @retval Qnil Interpreter not in debug mode. + * @retval Qfalse Interpreter not in debug mode. + * @retval otherwise Interpreter is in debug mode. + */ +#define ruby_debug (*rb_ruby_debug_ptr()) + +/* reports if `-W' specified */ +RBIMPL_ATTR_NONNULL((1)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2) +/** + * Issues a warning. + * + * In ruby, warnings these days are tightly coupled with the rb_mWarning + * constant and its `warn` singleton method. This CAPI is just a thin wrapper + * of it; everything passed are formatted like what rb_sprintf() does, then + * passed through to the method. Programs can have their own `def + * Warning.warn` at will to do whatever they want, from ignoring the warnings + * at all to sinking them to some BigQuery data set via a Fluentd cluster. By + * default, the method just emits its passed contents to ::rb_stderr using + * rb_io_write(). + * + * @note This function is affected by the `-W` flag. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +void rb_warning(const char *fmt, ...); + +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) +/** + * Identical to rb_warning(), except it takes additional "category" parameter. + * + * @param[in] cat Name of a known category. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + */ +void rb_category_warning(rb_warning_category_t cat, const char *fmt, ...); + +RBIMPL_ATTR_NONNULL((1, 3)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 3, 4) +/** + * Issues a compile-time warning that happens at `__file__:__line__`. Purpose + * of this function being exposed to CAPI is unclear. + * + * @note This function is affected by the `-W` flag. + * @param[in] file The path corresponding to Ruby level `__FILE__`. + * @param[in] line The number corresponding to Ruby level `__LINE__`. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + */ +void rb_compile_warning(const char *file, int line, const char *fmt, ...); + +RBIMPL_ATTR_NONNULL((1)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2) +/** + * Identical to rb_sys_fail(), except it does not raise an exception to render + * a warning instead. + * + * @note This function is affected by the `-W` flag. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + */ +void rb_sys_warning(const char *fmt, ...); + +/* reports always */ +RBIMPL_ATTR_COLD() +RBIMPL_ATTR_NONNULL((1)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2) +/** + * Identical to rb_warning(), except it reports always regardless of runtime + * `-W` flag. + * + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + */ +void rb_warn(const char *fmt, ...); + +RBIMPL_ATTR_COLD() +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) +/** + * Identical to rb_category_warning(), except it reports always regardless of + * runtime `-W` flag. + * + * @param[in] cat Category e.g. deprecated. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + */ +void rb_category_warn(rb_warning_category_t cat, const char *fmt, ...); + +RBIMPL_ATTR_NONNULL((1, 3)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 3, 4) +/** + * Identical to rb_compile_warning(), except it reports always regardless of + * runtime `-W` flag. + * + * @param[in] file The path corresponding to Ruby level `__FILE__`. + * @param[in] line The number corresponding to Ruby level `__LINE__`. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + */ +void rb_compile_warn(const char *file, int line, const char *fmt, ...); + +RBIMPL_ATTR_NONNULL((2, 4)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 4, 5) +/** + * Identical to rb_compile_warn(), except it also accepts category. + * + * @param[in] cat Category e.g. deprecated. + * @param[in] file The path corresponding to Ruby level `__FILE__`. + * @param[in] line The number corresponding to Ruby level `__LINE__`. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + */ +void rb_category_compile_warn(rb_warning_category_t cat, const char *file, int line, const char *fmt, ...); + +/** @} */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_ERROR_H */ diff --git a/libs/libruby/ruby/internal/eval.h b/libs/libruby/ruby/internal/eval.h new file mode 100644 index 0000000..5bcbb97 --- /dev/null +++ b/libs/libruby/ruby/internal/eval.h @@ -0,0 +1,400 @@ +#ifndef RBIMPL_EVAL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_EVAL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Declares ::rb_eval_string(). + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +RBIMPL_ATTR_NONNULL(()) +/** + * Evaluates the given string. + * + * In case it is called from within a C-backended method, the evaluation is + * done under the current binding. However there can be no method. On such + * situation this function evaluates in an isolated binding, like `require` + * runs in a separate one. + * + * `__FILE__` will be `"(eval)"`, and `__LINE__` starts from 1 in the + * evaluation. + * + * @param[in] str Ruby code to evaluate. + * @exception rb_eException Raises an exception on error. + * @return The evaluated result. + * + * @internal + * + * @shyouhei's old tale about the birth and growth of this function: + * + * At the beginning, there was no rb_eval_string(). @shyouhei heard that + * @shugo, author of Apache httpd's mod_ruby module, requested @matz for this + * API. He wanted a way so that mod_ruby can evaluate ruby scripts one by one, + * separately, in each different contexts. So this function was made. It was + * designed to be a global interpreter entry point like ruby_run_node(). + * + * The way it is implemented however allows extension libraries (not just + * programs like Apache httpd) to call this function. Because its name says + * nothing about the initial design, people started to think of it as an + * orthodox way to call ruby level `eval` method from their extension + * libraries. Even our `extension.rdoc` has had a description of this function + * basically according to this understanding. + * + * The old (mod_ruby like) usage still works. But over time, usages of this + * function from extension libraries got popular, while mod_ruby faded out; is + * no longer maintained now. Devs decided to actively support both. This + * function now auto-detects how it is called, and switches how it works + * depending on it. + * + * @see https://bugs.ruby-lang.org/issues/18780 + */ +VALUE rb_eval_string(const char *str); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Identical to rb_eval_string(), except it avoids potential global escapes. + * Such global escapes include exceptions, `throw`, `break`, for example. + * + * It first evaluates the given string as rb_eval_string() does. If no global + * escape occurred during the evaluation, it returns the result and `*state` is + * zero. Otherwise, it returns some undefined value and sets `*state` to + * nonzero. If state is `NULL`, it is not set in both cases. + * + * @param[in] str Ruby code to evaluate. + * @param[out] state State of execution. + * @return The evaluated result if succeeded, an undefined value if + * otherwise. + * @post `*state` is set to zero if succeeded. Nonzero otherwise. + * @warning You have to clear the error info with `rb_set_errinfo(Qnil)` if + * you decide to ignore the caught exception. + * @see rb_eval_string + * @see rb_protect + * + * @internal + * + * The "undefined value" described above is in fact ::RUBY_Qnil for now. But + * @shyouhei doesn't think that we would never change that. + * + * Though not a part of our public API, `state` is in fact an + * enum ruby_tag_type. You can see the potential "nonzero" values by looking + * at vm_core.h. + */ +VALUE rb_eval_string_protect(const char *str, int *state); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Identical to rb_eval_string_protect(), except it evaluates the given string + * under a module binding in an isolated binding. This is the same as a + * binding for loaded libraries on `rb_load(something, true)`. + * + * @param[in] str Ruby code to evaluate. + * @param[out] state State of execution. + * @return The evaluated result if succeeded, an undefined value if + * otherwise. + * @post `*state` is set to zero if succeeded. Nonzero otherwise. + * @warning You have to clear the error info with `rb_set_errinfo(Qnil)` if + * you decide to ignore the caught exception. + * @see rb_eval_string + */ +VALUE rb_eval_string_wrap(const char *str, int *state); + +/** + * Calls a method. Can call both public and private methods. + * + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] n Number of arguments that follow. + * @param[in] ... Arbitrary number of method arguments. + * @exception rb_eNoMethodError No such method. + * @exception rb_eException Any exceptions happen inside. + * @return What the method evaluates to. + */ +VALUE rb_funcall(VALUE recv, ID mid, int n, ...); + +/** + * Identical to rb_funcall(), except it takes the method arguments as a C + * array. + * + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @exception rb_eNoMethodError No such method. + * @exception rb_eException Any exceptions happen inside. + * @return What the method evaluates to. + */ +VALUE rb_funcallv(VALUE recv, ID mid, int argc, const VALUE *argv); + +/** + * Identical to rb_funcallv(), except you can specify how to handle the last + * element of the given array. + * + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eNoMethodError No such method. + * @exception rb_eException Any exceptions happen inside. + * @return What the method evaluates to. + */ +VALUE rb_funcallv_kw(VALUE recv, ID mid, int argc, const VALUE *argv, int kw_splat); + +/** + * Identical to rb_funcallv(), except it only takes public methods into + * account. This is roughly Ruby's `Object#public_send`. + * + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @exception rb_eNoMethodError No such method. + * @exception rb_eNoMethodError The method is private or protected. + * @exception rb_eException Any exceptions happen inside. + * @return What the method evaluates to. + */ +VALUE rb_funcallv_public(VALUE recv, ID mid, int argc, const VALUE *argv); + +/** + * Identical to rb_funcallv_public(), except you can specify how to handle the + * last element of the given array. It can also be seen as a routine identical + * to rb_funcallv_kw(), except it only takes public methods into account. + * + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eNoMethodError No such method. + * @exception rb_eNoMethodError The method is private or protected. + * @exception rb_eException Any exceptions happen inside. + * @return What the method evaluates to. + */ +VALUE rb_funcallv_public_kw(VALUE recv, ID mid, int argc, const VALUE *argv, int kw_splat); + +/** + * @deprecated This is an old name of rb_funcallv(). Provided here for + * backwards compatibility to 2.x programs (introduced in 2.1). + * It is not a good name. Please don't use it any longer. + */ +#define rb_funcall2 rb_funcallv + +/** + * @deprecated This is an old name of rb_funcallv_public(). Provided here + * for backwards compatibility to 2.x programs (introduced in + * 2.1). It is not a good name. Please don't use it any longer. + */ +#define rb_funcall3 rb_funcallv_public + +/** + * Identical to rb_funcallv_public(), except you can pass the passed block. + * + * Sometimes you want to "pass" a block parameter form one method to another. + * Suppose you have this Ruby method `foo`: + * + * ```ruby + * def foo(x, y, &z) + * x.open(y, &z) + * end + * ``` + * + * And suppose you want to translate this into C. Then + * rb_funcall_passing_block() function is usable in this situation. + * + * ```CXX + * VALUE + * foo_translated_into_C(VALUE self, VALUE x, VALUE y) + * { + * const auto open = rb_intern("open"); + * + * return rb_funcall_passing_block(x, open, 1, &y); + * } + * ``` + * + * @see rb_yield_block + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @exception rb_eNoMethodError No such method. + * @exception rb_eNoMethodError The method is private or protected. + * @exception rb_eException Any exceptions happen inside. + * @return What the method evaluates to. + */ +VALUE rb_funcall_passing_block(VALUE recv, ID mid, int argc, const VALUE *argv); + +/** + * Identical to rb_funcallv_passing_block(), except you can specify how to + * handle the last element of the given array. It can also be seen as a + * routine identical to rb_funcallv_public_kw(), except you can pass the passed + * block. + * + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eNoMethodError No such method. + * @exception rb_eNoMethodError The method is private or protected. + * @exception rb_eException Any exceptions happen inside. + * @return What the method evaluates to. + */ +VALUE rb_funcall_passing_block_kw(VALUE recv, ID mid, int argc, const VALUE *argv, int kw_splat); + +/** + * Identical to rb_funcallv_public(), except you can pass a block. A block + * here basically is an instance of ::rb_cProc. If you want to exercise + * `to_proc` conversion, do so before passing it here. However nil and symbols + * are special-case allowed. + * + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] procval An instance of Proc, Symbol, or NilClass. + * @exception rb_eNoMethodError No such method. + * @exception rb_eNoMethodError The method is private or protected. + * @exception rb_eException Any exceptions happen inside. + * @return What the method evaluates to. + * + * @internal + * + * Implementation-wise, `procval` is in fact a "block handler" object. You + * could also pass an IFUNC (block_handler_ifunc) here to say precise. --- But + * AFAIK there is no 3rd party way to even know that there are objects called + * IFUNC behind-the-scene. + */ +VALUE rb_funcall_with_block(VALUE recv, ID mid, int argc, const VALUE *argv, VALUE procval); + +/** + * Identical to rb_funcallv_with_block(), except you can specify how to handle + * the last element of the given array. It can also be seen as a routine + * identical to rb_funcallv_public_kw(), except you can pass a block. + * + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] procval An instance of Proc, Symbol, or NilClass. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eNoMethodError No such method. + * @exception rb_eNoMethodError The method is private or protected. + * @exception rb_eException Any exceptions happen inside. + * @return What the method evaluates to. + */ +VALUE rb_funcall_with_block_kw(VALUE recv, ID mid, int argc, const VALUE *argv, VALUE procval, int kw_splat); + +/** + * This resembles ruby's `super`. + * + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @exception rb_eNoMethodError No super method are there. + * @exception rb_eException Any exceptions happen inside. + * @return What the super method evaluates to. + */ +VALUE rb_call_super(int argc, const VALUE *argv); + +/** + * Identical to rb_call_super(), except you can specify how to handle the last + * element of the given array. + * + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eNoMethodError No super method are there. + * @exception rb_eException Any exceptions happen inside. + * @return What the super method evaluates to. + */ +VALUE rb_call_super_kw(int argc, const VALUE *argv, int kw_splat); + +/** + * This resembles ruby's `self`. + * + * @exception rb_eRuntimeError Called from outside of method context. + * @return Current receiver. + */ +VALUE rb_current_receiver(void); + +RBIMPL_ATTR_NONNULL((2)) +/** + * Keyword argument deconstructor. + * + * Retrieves argument values bound to keywords, which directed by `table` into + * `values`, deleting retrieved entries from `keyword_hash` along the way. + * First `required` number of IDs referred by `table` are mandatory, and + * succeeding `optional` (`-optional-1` if `optional` is negative) number of + * IDs are optional. If a mandatory key is not contained in `keyword_hash`, + * raises ::rb_eArgError. If an optional key is not present in `keyword_hash`, + * the corresponding element in `values` is set to ::RUBY_Qundef. If + * `optional` is negative, rest of `keyword_hash` are ignored, otherwise raises + * ::rb_eArgError. + * + * @warning Handling keyword arguments in the C API is less efficient than + * handling them in Ruby. Consider using a Ruby wrapper method + * around a non-keyword C function. + * @see https://bugs.ruby-lang.org/issues/11339 + * @param[out] keyword_hash Target hash to deconstruct. + * @param[in] table List of keywords that you are interested in. + * @param[in] required Number of mandatory keywords. + * @param[in] optional Number of optional keywords (can be negative). + * @param[out] values Buffer to be filled. + * @exception rb_eArgError Absence of a mandatory keyword. + * @exception rb_eArgError Found an unknown keyword. + * @return Number of found values that are stored into `values`. + */ +int rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values); + +RBIMPL_ATTR_NONNULL(()) +/** + * Splits a hash into two. + * + * Takes a hash of various keys, and split it into symbol-keyed parts and + * others. Symbol-keyed part becomes the return value. What remains are + * returned as a new hash object stored at the argument pointer. + * + * @param[in,out] orighash Pointer to a target hash to split. + * @return An extracted keyword hash. + * @post Upon successful return `orighash` points to another hash + * object, whose contents are the remainder of the operation. + * @note The argument hash object is not modified. + */ +VALUE rb_extract_keywords(VALUE *orighash); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_EVAL_H */ diff --git a/libs/libruby/ruby/internal/event.h b/libs/libruby/ruby/internal/event.h new file mode 100644 index 0000000..04b137a --- /dev/null +++ b/libs/libruby/ruby/internal/event.h @@ -0,0 +1,154 @@ +#ifndef RBIMPL_EVENT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_EVENT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Debugging and tracing APIs. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +/* These macros are not enums because they are wider than int.*/ + +/** + * @name Traditional set_trace_func events + * + * @{ + */ +#define RUBY_EVENT_NONE 0x0000 /**< No events. */ +#define RUBY_EVENT_LINE 0x0001 /**< Encountered a new line. */ +#define RUBY_EVENT_CLASS 0x0002 /**< Encountered a new class. */ +#define RUBY_EVENT_END 0x0004 /**< Encountered an end of a class clause. */ +#define RUBY_EVENT_CALL 0x0008 /**< A method, written in Ruby, is called. */ +#define RUBY_EVENT_RETURN 0x0010 /**< Encountered a `return` statement. */ +#define RUBY_EVENT_C_CALL 0x0020 /**< A method, written in C, is called. */ +#define RUBY_EVENT_C_RETURN 0x0040 /**< Return from a method, written in C. */ +#define RUBY_EVENT_RAISE 0x0080 /**< Encountered a `raise` statement. */ +#define RUBY_EVENT_ALL 0x00ff /**< Bitmask of traditional events. */ + +/** @} */ + +/** + * @name TracePoint extended events + * + * @{ + */ +#define RUBY_EVENT_B_CALL 0x0100 /**< Encountered an `yield` statement. */ +#define RUBY_EVENT_B_RETURN 0x0200 /**< Encountered a `next` statement. */ +#define RUBY_EVENT_THREAD_BEGIN 0x0400 /**< Encountered a new thread. */ +#define RUBY_EVENT_THREAD_END 0x0800 /**< Encountered an end of a thread. */ +#define RUBY_EVENT_FIBER_SWITCH 0x1000 /**< Encountered a `Fiber#yield`. */ +#define RUBY_EVENT_SCRIPT_COMPILED 0x2000 /**< Encountered an `eval`. */ +#define RUBY_EVENT_TRACEPOINT_ALL 0xffff /**< Bitmask of extended events. */ + +/** @} */ + +/** + * @name Special events + * + * @internal + * + * These bits are actually used internally. See vm_core.h if you are curious. + * + * @endinternal + * + * @{ + */ +#define RUBY_EVENT_RESERVED_FOR_INTERNAL_USE 0x030000 /**< Opaque bits. */ + +/** @} */ + +/** + * @name Internal events + * + * @shyouhei's understanding is that some of them are visible from extension + * libraries because of `ext/objspace`. But it seems that doesn't describe + * everything? The ultimate reason why they are here remains unclear. + * + * @{ + */ +#define RUBY_INTERNAL_EVENT_SWITCH 0x040000 /**< Thread switched. */ +#define RUBY_EVENT_SWITCH 0x040000 /**< @old{RUBY_INTERNAL_EVENT_SWITCH} */ + /* 0x080000 */ +#define RUBY_INTERNAL_EVENT_NEWOBJ 0x100000 /**< Object allocated. */ +#define RUBY_INTERNAL_EVENT_FREEOBJ 0x200000 /**< Object swept. */ +#define RUBY_INTERNAL_EVENT_GC_START 0x400000 /**< GC started. */ +#define RUBY_INTERNAL_EVENT_GC_END_MARK 0x800000 /**< GC ended mark phase. */ +#define RUBY_INTERNAL_EVENT_GC_END_SWEEP 0x1000000 /**< GC ended sweep phase. */ +#define RUBY_INTERNAL_EVENT_GC_ENTER 0x2000000 /**< `gc_enter()` is called. */ +#define RUBY_INTERNAL_EVENT_GC_EXIT 0x4000000 /**< `gc_exit()` is called. */ +#define RUBY_INTERNAL_EVENT_OBJSPACE_MASK 0x7f00000 /**< Bitmask of GC events. */ +#define RUBY_INTERNAL_EVENT_MASK 0xffff0000 /**< Bitmask of internal events. */ + +/** @} */ + +/** + * Represents event(s). As the name implies events are bit flags. + */ +typedef uint32_t rb_event_flag_t; + +/** + * Type of event hooks. When an event happens registered functions are kicked + * with appropriate parameters. + * + * @param[in] evflag The kind of event that happened. + * @param[in] data The `data` passed to rb_add_event_hook(). + * @param[in] self Current receiver. + * @param[in] mid Name of the current method. + * @param[in] klass Current class. + */ +typedef void (*rb_event_hook_func_t)(rb_event_flag_t evflag, VALUE data, VALUE self, ID mid, VALUE klass); + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define RB_EVENT_HOOKS_HAVE_CALLBACK_DATA 1 + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Registers an event hook function. + * + * @param[in] func A callback. + * @param[in] events A set of events that `func` should run. + * @param[in] data Passed as-is to `func`. + */ +void rb_add_event_hook(rb_event_hook_func_t func, rb_event_flag_t events, VALUE data); + +/** + * Removes the passed function from the list of event hooks. + * + * @param[in] func A callback. + * @return Number of deleted event hooks. + * @note As multiple events can share the same `func` it is quite + * possible for the return value to become more than one. + * + * @internal + * + * @shyouhei doesn't know if this is an Easter egg or an official feature, but + * you can pass 0 to the argument. That effectively swipes everything out from + * the hook list. + */ +int rb_remove_event_hook(rb_event_hook_func_t func); +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_EVENT_H */ diff --git a/libs/libruby/ruby/internal/fl_type.h b/libs/libruby/ruby/internal/fl_type.h new file mode 100644 index 0000000..7383426 --- /dev/null +++ b/libs/libruby/ruby/internal/fl_type.h @@ -0,0 +1,948 @@ +#ifndef RBIMPL_FL_TYPE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_FL_TYPE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines enum ::ruby_fl_type. + */ +#include "ruby/internal/config.h" /* for ENUM_OVER_INT */ +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/deprecated.h" +#include "ruby/internal/attr/flag_enum.h" +#include "ruby/internal/attr/forceinline.h" +#include "ruby/internal/attr/noalias.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/compiler_since.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/has/extension.h" +#include "ruby/internal/special_consts.h" +#include "ruby/internal/stdbool.h" +#include "ruby/internal/value.h" +#include "ruby/internal/value_type.h" +#include "ruby/assert.h" +#include "ruby/defines.h" + +/** @cond INTERNAL_MACRO */ +#if RBIMPL_HAS_EXTENSION(enumerator_attributes) +# define RBIMPL_HAVE_ENUM_ATTRIBUTE 1 +#elif RBIMPL_COMPILER_SINCE(GCC, 6, 0, 0) +# define RBIMPL_HAVE_ENUM_ATTRIBUTE 1 +#endif + +#ifdef ENUM_OVER_INT +# define RBIMPL_WIDER_ENUM 1 +#elif SIZEOF_INT * CHAR_BIT > 12+19+1 +# define RBIMPL_WIDER_ENUM 1 +#else +# define RBIMPL_WIDER_ENUM 0 +#endif +/** @endcond */ + +#define FL_SINGLETON RBIMPL_CAST((VALUE)RUBY_FL_SINGLETON) /**< @old{RUBY_FL_SINGLETON} */ +#define FL_WB_PROTECTED RBIMPL_CAST((VALUE)RUBY_FL_WB_PROTECTED) /**< @old{RUBY_FL_WB_PROTECTED} */ +#define FL_PROMOTED0 RBIMPL_CAST((VALUE)RUBY_FL_PROMOTED0) /**< @old{RUBY_FL_PROMOTED0} */ +#define FL_PROMOTED1 RBIMPL_CAST((VALUE)RUBY_FL_PROMOTED1) /**< @old{RUBY_FL_PROMOTED1} */ +#define FL_FINALIZE RBIMPL_CAST((VALUE)RUBY_FL_FINALIZE) /**< @old{RUBY_FL_FINALIZE} */ +#define FL_TAINT RBIMPL_CAST((VALUE)RUBY_FL_TAINT) /**< @old{RUBY_FL_TAINT} */ +#define FL_SHAREABLE RBIMPL_CAST((VALUE)RUBY_FL_SHAREABLE) /**< @old{RUBY_FL_SHAREABLE} */ +#define FL_UNTRUSTED RBIMPL_CAST((VALUE)RUBY_FL_UNTRUSTED) /**< @old{RUBY_FL_UNTRUSTED} */ +#define FL_SEEN_OBJ_ID RBIMPL_CAST((VALUE)RUBY_FL_SEEN_OBJ_ID) /**< @old{RUBY_FL_SEEN_OBJ_ID} */ +#define FL_EXIVAR RBIMPL_CAST((VALUE)RUBY_FL_EXIVAR) /**< @old{RUBY_FL_EXIVAR} */ +#define FL_FREEZE RBIMPL_CAST((VALUE)RUBY_FL_FREEZE) /**< @old{RUBY_FL_FREEZE} */ + +#define FL_USHIFT RBIMPL_CAST((VALUE)RUBY_FL_USHIFT) /**< @old{RUBY_FL_USHIFT} */ + +#define FL_USER0 RBIMPL_CAST((VALUE)RUBY_FL_USER0) /**< @old{RUBY_FL_USER0} */ +#define FL_USER1 RBIMPL_CAST((VALUE)RUBY_FL_USER1) /**< @old{RUBY_FL_USER1} */ +#define FL_USER2 RBIMPL_CAST((VALUE)RUBY_FL_USER2) /**< @old{RUBY_FL_USER2} */ +#define FL_USER3 RBIMPL_CAST((VALUE)RUBY_FL_USER3) /**< @old{RUBY_FL_USER3} */ +#define FL_USER4 RBIMPL_CAST((VALUE)RUBY_FL_USER4) /**< @old{RUBY_FL_USER4} */ +#define FL_USER5 RBIMPL_CAST((VALUE)RUBY_FL_USER5) /**< @old{RUBY_FL_USER5} */ +#define FL_USER6 RBIMPL_CAST((VALUE)RUBY_FL_USER6) /**< @old{RUBY_FL_USER6} */ +#define FL_USER7 RBIMPL_CAST((VALUE)RUBY_FL_USER7) /**< @old{RUBY_FL_USER7} */ +#define FL_USER8 RBIMPL_CAST((VALUE)RUBY_FL_USER8) /**< @old{RUBY_FL_USER8} */ +#define FL_USER9 RBIMPL_CAST((VALUE)RUBY_FL_USER9) /**< @old{RUBY_FL_USER9} */ +#define FL_USER10 RBIMPL_CAST((VALUE)RUBY_FL_USER10) /**< @old{RUBY_FL_USER10} */ +#define FL_USER11 RBIMPL_CAST((VALUE)RUBY_FL_USER11) /**< @old{RUBY_FL_USER11} */ +#define FL_USER12 RBIMPL_CAST((VALUE)RUBY_FL_USER12) /**< @old{RUBY_FL_USER12} */ +#define FL_USER13 RBIMPL_CAST((VALUE)RUBY_FL_USER13) /**< @old{RUBY_FL_USER13} */ +#define FL_USER14 RBIMPL_CAST((VALUE)RUBY_FL_USER14) /**< @old{RUBY_FL_USER14} */ +#define FL_USER15 RBIMPL_CAST((VALUE)RUBY_FL_USER15) /**< @old{RUBY_FL_USER15} */ +#define FL_USER16 RBIMPL_CAST((VALUE)RUBY_FL_USER16) /**< @old{RUBY_FL_USER16} */ +#define FL_USER17 RBIMPL_CAST((VALUE)RUBY_FL_USER17) /**< @old{RUBY_FL_USER17} */ +#define FL_USER18 RBIMPL_CAST((VALUE)RUBY_FL_USER18) /**< @old{RUBY_FL_USER18} */ +#define FL_USER19 RBIMPL_CAST((VALUE)(unsigned int)RUBY_FL_USER19) /**< @old{RUBY_FL_USER19} */ + +#define ELTS_SHARED RUBY_ELTS_SHARED /**< @old{RUBY_ELTS_SHARED} */ +#define RB_OBJ_FREEZE rb_obj_freeze_inline /**< @alias{rb_obj_freeze_inline} */ + +/** @cond INTERNAL_MACRO */ +#define RUBY_ELTS_SHARED RUBY_ELTS_SHARED +#define RB_FL_ABLE RB_FL_ABLE +#define RB_FL_ALL RB_FL_ALL +#define RB_FL_ALL_RAW RB_FL_ALL_RAW +#define RB_FL_ANY RB_FL_ANY +#define RB_FL_ANY_RAW RB_FL_ANY_RAW +#define RB_FL_REVERSE RB_FL_REVERSE +#define RB_FL_REVERSE_RAW RB_FL_REVERSE_RAW +#define RB_FL_SET RB_FL_SET +#define RB_FL_SET_RAW RB_FL_SET_RAW +#define RB_FL_TEST RB_FL_TEST +#define RB_FL_TEST_RAW RB_FL_TEST_RAW +#define RB_FL_UNSET RB_FL_UNSET +#define RB_FL_UNSET_RAW RB_FL_UNSET_RAW +#define RB_OBJ_FREEZE_RAW RB_OBJ_FREEZE_RAW +#define RB_OBJ_FROZEN RB_OBJ_FROZEN +#define RB_OBJ_FROZEN_RAW RB_OBJ_FROZEN_RAW +#define RB_OBJ_INFECT RB_OBJ_INFECT +#define RB_OBJ_INFECT_RAW RB_OBJ_INFECT_RAW +#define RB_OBJ_TAINT RB_OBJ_TAINT +#define RB_OBJ_TAINTABLE RB_OBJ_TAINTABLE +#define RB_OBJ_TAINTED RB_OBJ_TAINTED +#define RB_OBJ_TAINTED_RAW RB_OBJ_TAINTED_RAW +#define RB_OBJ_TAINT_RAW RB_OBJ_TAINT_RAW +#define RB_OBJ_UNTRUST RB_OBJ_TAINT +#define RB_OBJ_UNTRUSTED RB_OBJ_TAINTED +/** @endcond */ + +/** + * @defgroup deprecated_macros Deprecated macro APIs + * @{ + * These macros are deprecated. Prefer their `RB_`-prefixed versions. + */ +#define FL_ABLE RB_FL_ABLE /**< @old{RB_FL_ABLE} */ +#define FL_ALL RB_FL_ALL /**< @old{RB_FL_ALL} */ +#define FL_ALL_RAW RB_FL_ALL_RAW /**< @old{RB_FL_ALL_RAW} */ +#define FL_ANY RB_FL_ANY /**< @old{RB_FL_ANY} */ +#define FL_ANY_RAW RB_FL_ANY_RAW /**< @old{RB_FL_ANY_RAW} */ +#define FL_REVERSE RB_FL_REVERSE /**< @old{RB_FL_REVERSE} */ +#define FL_REVERSE_RAW RB_FL_REVERSE_RAW /**< @old{RB_FL_REVERSE_RAW} */ +#define FL_SET RB_FL_SET /**< @old{RB_FL_SET} */ +#define FL_SET_RAW RB_FL_SET_RAW /**< @old{RB_FL_SET_RAW} */ +#define FL_TEST RB_FL_TEST /**< @old{RB_FL_TEST} */ +#define FL_TEST_RAW RB_FL_TEST_RAW /**< @old{RB_FL_TEST_RAW} */ +#define FL_UNSET RB_FL_UNSET /**< @old{RB_FL_UNSET} */ +#define FL_UNSET_RAW RB_FL_UNSET_RAW /**< @old{RB_FL_UNSET_RAW} */ +#define OBJ_FREEZE RB_OBJ_FREEZE /**< @old{RB_OBJ_FREEZE} */ +#define OBJ_FREEZE_RAW RB_OBJ_FREEZE_RAW /**< @old{RB_OBJ_FREEZE_RAW} */ +#define OBJ_FROZEN RB_OBJ_FROZEN /**< @old{RB_OBJ_FROZEN} */ +#define OBJ_FROZEN_RAW RB_OBJ_FROZEN_RAW /**< @old{RB_OBJ_FROZEN_RAW} */ +#define OBJ_INFECT RB_OBJ_INFECT /**< @old{RB_OBJ_INFECT} */ +#define OBJ_INFECT_RAW RB_OBJ_INFECT_RAW /**< @old{RB_OBJ_INFECT_RAW} */ +#define OBJ_TAINT RB_OBJ_TAINT /**< @old{RB_OBJ_TAINT} */ +#define OBJ_TAINTABLE RB_OBJ_TAINTABLE /**< @old{RB_OBJ_TAINT_RAW} */ +#define OBJ_TAINTED RB_OBJ_TAINTED /**< @old{RB_OBJ_TAINTED} */ +#define OBJ_TAINTED_RAW RB_OBJ_TAINTED_RAW /**< @old{RB_OBJ_TAINTED_RAW} */ +#define OBJ_TAINT_RAW RB_OBJ_TAINT_RAW /**< @old{RB_OBJ_TAINT_RAW} */ +#define OBJ_UNTRUST RB_OBJ_UNTRUST /**< @old{RB_OBJ_TAINT} */ +#define OBJ_UNTRUSTED RB_OBJ_UNTRUSTED /**< @old{RB_OBJ_TAINTED} */ +/** @} */ + +/** + * This is an enum because GDB wants it (rather than a macro). People need not + * bother. + */ +enum ruby_fl_ushift { + /** + * Number of bits in ::ruby_fl_type that are _not_ open to users. This is + * an implementation detail. Please ignore. + */ + RUBY_FL_USHIFT = 12 +}; + +/* > The expression that defines the value of an enumeration constant shall be + * > an integer constant expression that has a value representable as an `int`. + * + * -- ISO/IEC 9899:2018 section 6.7.2.2 + * + * So ENUM_OVER_INT situation is an extension to the standard. Note however + * that we do not support 16 bit `int` environment. */ +RB_GNUC_EXTENSION +/** + * The flags. Each ruby objects have their own characteristics apart from + * their classes. For instance whether an object is frozen or not is not + * controlled by its class. This is the type that represents such properties. + * + * @note About the `FL_USER` terminology: the "user" here does not necessarily + * mean only you. For instance struct ::RString instances use these + * bits to cache their encodings etc. Devs discussed about this topic, + * reached their consensus that ::RUBY_T_DATA is the only valid data + * structure that can use these bits; other data structures including + * ::RUBY_T_OBJECT use these bits for their own purpose. See also + * https://bugs.ruby-lang.org/issues/18059 + */ +enum +RBIMPL_ATTR_FLAG_ENUM() +ruby_fl_type { + + /** + * @deprecated This flag once was a thing back in the old days, but makes + * no sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + * + * @internal + * + * The reality is our GC no longer remembers write barriers inside of each + * objects, to use dedicated bitmap instead. But this flag is still used + * internally. The current usages of this flag should be something + * different, which is unclear to @shyouhei. + */ + RUBY_FL_WB_PROTECTED = (1<<5), + + /** + * This flag has something to do with our garbage collector. These days + * ruby objects are "generational". There are those who are young and + * those who are old. Young objects are prone to die; monitored relatively + * extensively by the garbage collector. OTOH old objects tend to live + * longer. They are relatively rarely considered. This flag is set when a + * object experienced promotion i.e. survived a garbage collection. + * + * @internal + * + * But honestly, @shyouhei doesn't think this flag should be visible from + * 3rd parties. It must be an implementation detail that they should never + * know. Might better be hidden. + */ + RUBY_FL_PROMOTED0 = (1<<5), + + /** + * This flag has something to do with our garbage collector. These days + * ruby objects are "generational". There are those who are young and + * those who are old. Young objects are prone to die; monitored relatively + * extensively by the garbage collector. OTOH old objects tend to live + * longer. They are relatively rarely considered. This flag is set when a + * object experienced two promotions i.e. survived garbage collections + * twice. + * + * @internal + * + * But honestly, @shyouhei doesn't think this flag should be visible from + * 3rd parties. It must be an implementation detail that they should never + * know. Might better be hidden. + */ + RUBY_FL_PROMOTED1 = (1<<6), + + /** + * This flag has something to do with our garbage collector. These days + * ruby objects are "generational". There are those who are young and + * those who are old. Young objects are prone to die; monitored relatively + * extensively by the garbage collector. OTOH old objects tend to live + * longer. They are relatively rarely considered. This flag is set when a + * object experienced promotions i.e. survived more than one garbage + * collections. + * + * @internal + * + * But honestly, @shyouhei doesn't think this flag should be visible from + * 3rd parties. It must be an implementation detail that they should never + * know. Might better be hidden. + */ + RUBY_FL_PROMOTED = RUBY_FL_PROMOTED0 | RUBY_FL_PROMOTED1, + + /** + * This flag has something to do with finalisers. A ruby object can have + * its finaliser, which is another object that evaluates when the target + * object is about to die. This flag is used to denote that there is an + * attached finaliser. + * + * @internal + * + * But honestly, @shyouhei doesn't think this flag should be visible from + * 3rd parties. It must be an implementation detail that they should never + * know. Might better be hidden. + */ + RUBY_FL_FINALIZE = (1<<7), + + /** + * @deprecated This flag once was a thing back in the old days, but makes + * no sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + */ + RUBY_FL_TAINT + +#if defined(RBIMPL_HAVE_ENUM_ATTRIBUTE) + RBIMPL_ATTR_DEPRECATED(("taintedness turned out to be a wrong idea.")) +#elif defined(_MSC_VER) +# pragma deprecated(RUBY_FL_TAINT) +#endif + + = (1<<8), + + /** + * This flag has something to do with Ractor. Multiple Ractors run without + * protecting each other. Sharing an object among Ractors are basically + * dangerous, disabled by default. This flag is used to bypass that + * restriction. Of course, you have to manually prevent race conditions + * then. + * + * This flag needs deep understanding of multithreaded programming. You + * would better not use it. + */ + RUBY_FL_SHAREABLE = (1<<8), + + /** + * @deprecated This flag once was a thing back in the old days, but makes + * no sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + */ + RUBY_FL_UNTRUSTED + +#if defined(RBIMPL_HAVE_ENUM_ATTRIBUTE) + RBIMPL_ATTR_DEPRECATED(("trustedness turned out to be a wrong idea.")) +#elif defined(_MSC_VER) +# pragma deprecated(RUBY_FL_UNTRUSTED) +#endif + + = (1<<8), + + /** + * This flag has something to do with object IDs. Unlike in the old days, + * an object's object ID (that a user can query using `Object#object_id`) + * is no longer its physical address represented using Ruby level integers. + * It is now a monotonic-increasing integer unrelated to the underlying + * memory arrangement. Object IDs are assigned when necessary; objects are + * born without one, and will eventually have such property when queried. + * The interpreter has to manage which one is which. This is the flag that + * helps the management. Objects with this flag set are the ones with + * object IDs assigned. + * + * @internal + * + * But honestly, @shyouhei doesn't think this flag should be visible from + * 3rd parties. It must be an implementation detail that they should never + * know. Might better be hidden. + */ + RUBY_FL_SEEN_OBJ_ID = (1<<9), + + /** + * This flag has something to do with instance variables. 3rd parties need + * not know, but there are several ways to store an object's instance + * variables. Objects with this flag use so-called "generic" backend + * storage. This distinction is purely an implementation detail. People + * need not be aware of this working behind-the-scene. + * + * @internal + * + * As of writing everything except ::RObject and RModule use this scheme. + */ + RUBY_FL_EXIVAR = (1<<10), + + /** + * This flag has something to do with data immutability. When this flag is + * set an object is considered "frozen". No modification are expected to + * happen beyond that point for the particular object. Immutability is + * basically considered to be a good property these days. Library authors + * are expected to obey. Test this bit before you touch a data structure. + * + * @see rb_check_frozen() + */ + RUBY_FL_FREEZE = (1<<11), + +/** (@shyouhei doesn't know how to excude this macro from doxygen). */ +#define RBIMPL_FL_USER_N(n) RUBY_FL_USER##n = (1<<(RUBY_FL_USHIFT+n)) + RBIMPL_FL_USER_N(0), /**< User-defined flag. */ + RBIMPL_FL_USER_N(1), /**< User-defined flag. */ + RBIMPL_FL_USER_N(2), /**< User-defined flag. */ + RBIMPL_FL_USER_N(3), /**< User-defined flag. */ + RBIMPL_FL_USER_N(4), /**< User-defined flag. */ + RBIMPL_FL_USER_N(5), /**< User-defined flag. */ + RBIMPL_FL_USER_N(6), /**< User-defined flag. */ + RBIMPL_FL_USER_N(7), /**< User-defined flag. */ + RBIMPL_FL_USER_N(8), /**< User-defined flag. */ + RBIMPL_FL_USER_N(9), /**< User-defined flag. */ + RBIMPL_FL_USER_N(10), /**< User-defined flag. */ + RBIMPL_FL_USER_N(11), /**< User-defined flag. */ + RBIMPL_FL_USER_N(12), /**< User-defined flag. */ + RBIMPL_FL_USER_N(13), /**< User-defined flag. */ + RBIMPL_FL_USER_N(14), /**< User-defined flag. */ + RBIMPL_FL_USER_N(15), /**< User-defined flag. */ + RBIMPL_FL_USER_N(16), /**< User-defined flag. */ + RBIMPL_FL_USER_N(17), /**< User-defined flag. */ + RBIMPL_FL_USER_N(18), /**< User-defined flag. */ +#ifdef ENUM_OVER_INT + RBIMPL_FL_USER_N(19), /**< User-defined flag. */ +#else +# define RUBY_FL_USER19 (RBIMPL_VALUE_ONE<<(RUBY_FL_USHIFT+19)) +#endif +#undef RBIMPL_FL_USER_N +#undef RBIMPL_WIDER_ENUM + + /** + * This flag has something to do with data structures. Over time, ruby + * evolved to reduce memory footprints. One of such attempt is so-called + * copy-on-write, which delays duplication of resources until ultimately + * necessary. Some data structures share this scheme. For example + * multiple instances of struct ::RArray could point identical memory + * region in common, as long as they don't differ. As people favour + * immutable style of programming than before, this situation is getting + * more and more common. Because such "shared" memory regions have nuanced + * ownership by nature, each structures need special care for them. This + * flag is used to distinguish such shared constructs. + * + * @internal + * + * But honestly, @shyouhei doesn't think this flag should be visible from + * 3rd parties. It must be an implementation detail that they should never + * know. Might better be hidden. + */ + RUBY_ELTS_SHARED = RUBY_FL_USER2, + + /** + * This flag has something to do with an object's class. There are kind of + * classes called "singleton class", each of which have exactly one + * instance. What is interesting about singleton classes is that they are + * created _after_ their instance were instantiated, like this: + * + * ```ruby + * foo = Object.new # foo is an instance of Object... + * bar = foo.singleton_class # foo is now an instance of bar. + * ``` + * + * Here as you see `bar` is a singleton class of `foo`, which is injected + * into `foo`'s inheritance tree in a different statement (== distinct + * sequence point). In order to achieve this property singleton classes + * are special-cased in the interpreter. There is one bit flag that + * distinguishes if a class is a singleton class or not, and this is it. + * + * @internal + * + * But honestly, @shyouhei doesn't think this flag should be visible from + * 3rd parties. It must be an implementation detail that they should never + * know. Might better be hidden. + */ + RUBY_FL_SINGLETON = RUBY_FL_USER0, +}; + +enum { + /** + * @deprecated This flag once was a thing back in the old days, but makes + * no sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + */ + RUBY_FL_DUPPED + +#if defined(RBIMPL_HAVE_ENUM_ATTRIBUTE) + RBIMPL_ATTR_DEPRECATED(("It seems there is no actual usage of this enum.")) +#elif defined(_MSC_VER) +# pragma deprecated(RUBY_FL_DUPPED) +#endif + + = (int)RUBY_T_MASK | (int)RUBY_FL_EXIVAR +}; + +#undef RBIMPL_HAVE_ENUM_ATTRIBUTE + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * This is an implementation detail of #RB_OBJ_FREEZE(). People don't use it + * directly. + * + * @param[out] klass A singleton class. + * @post `klass` gets frozen. + */ +void rb_freeze_singleton_class(VALUE klass); +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_FORCEINLINE() +/** + * Checks if the object is flaggable. There are some special cases (most + * notably ::RUBY_Qfalse) where appending a flag to an object is not possible. + * This function can detect that. + * + * @param[in] obj Object in question + * @retval true It is flaggable. + * @retval false No it isn't. + */ +static bool +RB_FL_ABLE(VALUE obj) +{ + if (RB_SPECIAL_CONST_P(obj)) { + return false; + } + else if (RB_TYPE_P(obj, RUBY_T_NODE)) { + return false; + } + else { + return true; + } +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * This is an implenentation detail of RB_FL_TEST(). 3rd parties need not use + * this. Just always use RB_FL_TEST(). + * + * @param[in] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @pre The object must not be an enum ::ruby_special_consts. + * @return `obj`'s flags, masked by `flags`. + */ +static inline VALUE +RB_FL_TEST_RAW(VALUE obj, VALUE flags) +{ + RBIMPL_ASSERT_OR_ASSUME(RB_FL_ABLE(obj)); + return RBASIC(obj)->flags & flags; +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Tests if the given flag(s) are set or not. You can pass multiple flags at + * once: + * + * ```CXX + * auto obj = rb_eval_string("..."); + * if (RB_FL_TEST(obj, RUBY_FL_FREEZE | RUBY_FL_SHAREABLE)) { + * printf("Ractor ready!\n"); + * } + * ``` + * + * @param[in] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @return `obj`'s flags, masked by `flags`. + * @note It is intentional for this function to return ::VALUE. The + * return value could be passed to RB_FL_STE() etc. + */ +static inline VALUE +RB_FL_TEST(VALUE obj, VALUE flags) +{ + if (RB_FL_ABLE(obj)) { + return RB_FL_TEST_RAW(obj, flags); + } + else { + return RBIMPL_VALUE_NULL; + } +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * This is an implenentation detail of RB_FL_ANY(). 3rd parties need not use + * this. Just always use RB_FL_ANY(). + * + * @param[in] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @retval true The object has any of the flags set. + * @retval false No it doesn't at all. + * @pre The object must not be an enum ::ruby_special_consts. + */ +static inline bool +RB_FL_ANY_RAW(VALUE obj, VALUE flags) +{ + return RB_FL_TEST_RAW(obj, flags); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Identical to RB_FL_TEST(), except it returns bool. + * + * @param[in] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @retval true The object has any of the flags set. + * @retval false No it doesn't at all. + */ +static inline bool +RB_FL_ANY(VALUE obj, VALUE flags) +{ + return RB_FL_TEST(obj, flags); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * This is an implenentation detail of RB_FL_ALL(). 3rd parties need not use + * this. Just always use RB_FL_ALL(). + * + * @param[in] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @retval true The object has all of the flags set. + * @retval false The object lacks any of the flags. + * @pre The object must not be an enum ::ruby_special_consts. + */ +static inline bool +RB_FL_ALL_RAW(VALUE obj, VALUE flags) +{ + return RB_FL_TEST_RAW(obj, flags) == flags; +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Identical to RB_FL_ANY(), except it mandates all passed flags be set. + * + * @param[in] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @retval true The object has all of the flags set. + * @retval false The object lacks any of the flags. + */ +static inline bool +RB_FL_ALL(VALUE obj, VALUE flags) +{ + return RB_FL_TEST(obj, flags) == flags; +} + +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_ARTIFICIAL() +/** + * @private + * + * This is an implenentation detail of RB_FL_SET(). 3rd parties need not use + * this. Just always use RB_FL_SET(). + * + * @param[out] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @post `obj` has `flags` set. + * + * @internal + * + * This is function is here to annotate a part of RB_FL_SET_RAW() as + * `__declspec(noalias)`. + */ +static inline void +rbimpl_fl_set_raw_raw(struct RBasic *obj, VALUE flags) +{ + obj->flags |= flags; +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * This is an implenentation detail of RB_FL_SET(). 3rd parties need not use + * this. Just always use RB_FL_SET(). + * + * @param[out] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @post `obj` has `flags` set. + */ +static inline void +RB_FL_SET_RAW(VALUE obj, VALUE flags) +{ + RBIMPL_ASSERT_OR_ASSUME(RB_FL_ABLE(obj)); + rbimpl_fl_set_raw_raw(RBASIC(obj), flags); +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * Sets the given flag(s). + * + * ```CXX + * auto v = rb_eval_string("..."); + * RB_FL_SET(v, RUBY_FL_FREEZE); + * ``` + * + * @param[out] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @post `obj` has `flags` set. + */ +static inline void +RB_FL_SET(VALUE obj, VALUE flags) +{ + if (RB_FL_ABLE(obj)) { + RB_FL_SET_RAW(obj, flags); + } +} + +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_ARTIFICIAL() +/** + * @private + * + * This is an implenentation detail of RB_FL_UNSET(). 3rd parties need not use + * this. Just always use RB_FL_UNSET(). + * + * @param[out] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @post `obj` has `flags` cleared. + * + * @internal + * + * This is function is here to annotate a part of RB_FL_UNSET_RAW() as + * `__declspec(noalias)`. + */ +static inline void +rbimpl_fl_unset_raw_raw(struct RBasic *obj, VALUE flags) +{ + obj->flags &= ~flags; +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * This is an implenentation detail of RB_FL_UNSET(). 3rd parties need not use + * this. Just always use RB_FL_UNSET(). + * + * @param[out] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @post `obj` has `flags` cleared. + */ +static inline void +RB_FL_UNSET_RAW(VALUE obj, VALUE flags) +{ + RBIMPL_ASSERT_OR_ASSUME(RB_FL_ABLE(obj)); + rbimpl_fl_unset_raw_raw(RBASIC(obj), flags); +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * Clears the given flag(s). + * + * @param[out] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @post `obj` has `flags` cleard. + */ +static inline void +RB_FL_UNSET(VALUE obj, VALUE flags) +{ + if (RB_FL_ABLE(obj)) { + RB_FL_UNSET_RAW(obj, flags); + } +} + +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_ARTIFICIAL() +/** + * @private + * + * This is an implenentation detail of RB_FL_REVERSE(). 3rd parties need not + * use this. Just always use RB_FL_REVERSE(). + * + * @param[out] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @post `obj` has `flags` reversed. + * + * @internal + * + * This is function is here to annotate a part of RB_FL_REVERSE_RAW() as + * `__declspec(noalias)`. + */ +static inline void +rbimpl_fl_reverse_raw_raw(struct RBasic *obj, VALUE flags) +{ + obj->flags ^= flags; +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * This is an implenentation detail of RB_FL_REVERSE(). 3rd parties need not + * use this. Just always use RB_FL_REVERSE(). + * + * @param[out] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @post `obj` has `flags` cleared. + */ +static inline void +RB_FL_REVERSE_RAW(VALUE obj, VALUE flags) +{ + RBIMPL_ASSERT_OR_ASSUME(RB_FL_ABLE(obj)); + rbimpl_fl_reverse_raw_raw(RBASIC(obj), flags); +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * Reverses the flags. This function is here mainly for symmetry on set/unset. + * Rarely used in practice. + * + * @param[out] obj Object in question. + * @param[in] flags A set of enum ::ruby_fl_type. + * @post `obj` has `flags` reversed. + */ +static inline void +RB_FL_REVERSE(VALUE obj, VALUE flags) +{ + if (RB_FL_ABLE(obj)) { + RB_FL_REVERSE_RAW(obj, flags); + } +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_DEPRECATED(("taintedness turned out to be a wrong idea.")) +/** + * @deprecated This function once was a thing in the old days, but makes no + * sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + * + * @param[in] obj Object in question. + * @return false always. + */ +static inline bool +RB_OBJ_TAINTABLE(VALUE obj) +{ + return false; +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_DEPRECATED(("taintedness turned out to be a wrong idea.")) +/** + * @deprecated This function once was a thing in the old days, but makes no + * sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + * + * @param[in] obj Object in question. + * @return false always. + */ +static inline VALUE +RB_OBJ_TAINTED_RAW(VALUE obj) +{ + return false; +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_DEPRECATED(("taintedness turned out to be a wrong idea.")) +/** + * @deprecated This function once was a thing in the old days, but makes no + * sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + * + * @param[in] obj Object in question. + * @return false always. + */ +static inline bool +RB_OBJ_TAINTED(VALUE obj) +{ + return false; +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_DEPRECATED(("taintedness turned out to be a wrong idea.")) +/** + * @deprecated This function once was a thing in the old days, but makes no + * sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + * + * @param[in] obj Object in question. + */ +static inline void +RB_OBJ_TAINT_RAW(VALUE obj) +{ + return; +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_DEPRECATED(("taintedness turned out to be a wrong idea.")) +/** + * @deprecated This function once was a thing in the old days, but makes no + * sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + * + * @param[in] obj Object in question. + */ +static inline void +RB_OBJ_TAINT(VALUE obj) +{ + return; +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_DEPRECATED(("taintedness turned out to be a wrong idea.")) +/** + * @deprecated This function once was a thing in the old days, but makes no + * sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + * + * @param[in] dst Victim object. + * @param[in] src Infectant object. + */ +static inline void +RB_OBJ_INFECT_RAW(VALUE dst, VALUE src) +{ + return; +} + +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_DEPRECATED(("taintedness turned out to be a wrong idea.")) +/** + * @deprecated This function once was a thing in the old days, but makes no + * sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + * + * @param[in] dst Victim object. + * @param[in] src Infectant object. + */ +static inline void +RB_OBJ_INFECT(VALUE dst, VALUE src) +{ + return; +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * This is an implenentation detail of RB_OBJ_FROZEN(). 3rd parties need not + * use this. Just always use RB_OBJ_FROZEN(). + * + * @param[in] obj Object in question. + * @retval RUBY_FL_FREEZE Yes it is. + * @retval 0 No it isn't. + * + * @internal + * + * It is intentional not to return bool here. There is a place in ruby core + * (namely `class.c:singleton_class_of()`) where return value of this function + * is passed to RB_FL_SET_RAW(). + */ +static inline VALUE +RB_OBJ_FROZEN_RAW(VALUE obj) +{ + return RB_FL_TEST_RAW(obj, RUBY_FL_FREEZE); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Checks if an object is frozen. + * + * @param[in] obj Object in question. + * @retval true Yes it is. + * @retval false No it isn't. + */ +static inline bool +RB_OBJ_FROZEN(VALUE obj) +{ + if (! RB_FL_ABLE(obj)) { + return true; + } + else { + return RB_OBJ_FROZEN_RAW(obj); + } +} + +RBIMPL_ATTR_ARTIFICIAL() +/** + * This is an implenentation detail of RB_OBJ_FREEZE(). 3rd parties need not + * use this. Just always use RB_OBJ_FREEZE(). + * + * @param[out] obj Object in question. + */ +static inline void +RB_OBJ_FREEZE_RAW(VALUE obj) +{ + RB_FL_SET_RAW(obj, RUBY_FL_FREEZE); +} + +RUBY_SYMBOL_EXPORT_BEGIN +void rb_obj_freeze_inline(VALUE obj); +RUBY_SYMBOL_EXPORT_END + +#endif /* RBIMPL_FL_TYPE_H */ diff --git a/libs/libruby/ruby/internal/gc.h b/libs/libruby/ruby/internal/gc.h new file mode 100644 index 0000000..66fc14e --- /dev/null +++ b/libs/libruby/ruby/internal/gc.h @@ -0,0 +1,57 @@ +#ifndef RBIMPL_GC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_GC_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Registering values to the GC. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Inform the garbage collector that `valptr` points to a live Ruby object that + * should not be moved. Note that extensions should use this API on global + * constants instead of assuming constants defined in Ruby are always alive. + * Ruby code can remove global constants. + */ +void rb_gc_register_address(VALUE *valptr); + +/** + * An alias for `rb_gc_register_address()`. + */ +void rb_global_variable(VALUE *); + +/** + * Inform the garbage collector that a pointer previously passed to + * `rb_gc_register_address()` no longer points to a live Ruby object. + */ +void rb_gc_unregister_address(VALUE *valptr); + +/** + * Inform the garbage collector that `object` is a live Ruby object that should + * not be moved. + * + * See also: rb_gc_register_address() + */ +void rb_gc_register_mark_object(VALUE object); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_GC_H */ diff --git a/libs/libruby/ruby/internal/glob.h b/libs/libruby/ruby/internal/glob.h new file mode 100644 index 0000000..adbccbd --- /dev/null +++ b/libs/libruby/ruby/internal/glob.h @@ -0,0 +1,113 @@ +#ifndef RBIMPL_GLOB_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_GLOB_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Declares ::rb_glob(). + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Type of a glob callback function. Called every time glob scans a path. + * + * @param[in] path The path in question. + * @param[in] arg The argument passed to rb_glob(). + * @param[in] enc Encoding of the path. + * @retval -1 Not enough memory to do the operation. + * @retval 0 Operation successful. + * @retval otherwise Opaque exception state. + * @note You can use rb_protect() to generate the return value. + * + * @internal + * + * This is a wrong design. Type of `enc` should have been `rb_encoding*` + * instead of just `void*`. But we cannot change the API any longer. + * + * Though not a part of our public API, the "opaque exception state" is in fact + * an enum ruby_tag_type. You can see the potential "otherwise" values by + * looking at vm_core.h. + */ +typedef int ruby_glob_func(const char *path, VALUE arg, void *enc); + +RBIMPL_ATTR_NONNULL(()) +/** + * The "glob" operator. Expands the given pattern against the actual local + * filesystem, then iterates over the expanded filenames by calling the + * callback function. + * + * @param[in] pattern A glob pattern. + * @param[in] func Identical to ruby_glob_func, except it can raise + * exceptions instead of returning opaque state. + * @param[in] arg Extra argument passed to func. + * @exception rb_eException Can propagate what `func` raises. + * @note The language accepted as the pattern is not a regular + * expression. It resembles shell's glob. + */ +void rb_glob(const char *pattern, void (*func)(const char *path, VALUE arg, void *enc), VALUE arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_glob(), except it returns opaque exception states instead of + * raising exceptions. + * + * @param[in] pattern A glob pattern. + * @param[in] flags No, you are not allowed to use this. Just pass 0. + * @param[in] func A callback function. + * @param[in] arg Extra argument passed to func. + * @return Return value of `func`. + * + * @internal + * + * This function is completely broken by design... Not only is there no sane + * way to pass flags, but there also is no sane way to know what a return value + * is meant to be. + * + * Though not a part of our public API, and @shyouhei thinks it's a failure not + * to be a public API, the flags can be `FNM_EXTGLOB`, `FNM_DOTMATCH` etc. + * Look at dir.c for the list. + * + * Though not a part of our public API, the return value is in fact an + * enum ruby_tag_type. You can see the potential values by looking at + * vm_core.h. + */ +int ruby_glob(const char *pattern, int flags, ruby_glob_func *func, VALUE arg); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to ruby_glob(), @shyouhei currently suspects. Historically you + * had to call this function instead of ruby_glob() if the pattern included + * "{x,y,...}" syntax. However since commit 0f63d961169989a7f6dcf7c0487fe29da, + * ruby_glob() also supports that syntax. It seems as of writing these two + * functions provide basically the same functionality in a different + * implementation. Is this analysis right? Correct me! :FIXME: + * + * @param[in] pattern A glob pattern. + * @param[in] flags No, you are not allowed to use this. Just pass 0. + * @param[in] func A callback function. + * @param[in] arg Extra argument passed to func. + * @return Return value of `func`. + */ +int ruby_brace_glob(const char *pattern, int flags, ruby_glob_func *func, VALUE arg); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_GLOB_H */ diff --git a/libs/libruby/ruby/internal/globals.h b/libs/libruby/ruby/internal/globals.h new file mode 100644 index 0000000..5a414fc --- /dev/null +++ b/libs/libruby/ruby/internal/globals.h @@ -0,0 +1,209 @@ +#ifndef RBIMPL_GLOBALS_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_GLOBALS_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Ruby-level global variables / constants, visible from C. + */ +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/fl_type.h" +#include "ruby/internal/special_consts.h" +#include "ruby/internal/value.h" +#include "ruby/internal/value_type.h" + +/** + * @defgroup object Core objects and their operations + * + * @internal + * + * There are several questionable constants listed in this header file. They + * are intentionally left untouched for purely academic backwards compatibility + * concerns. But for instance do any one of 3rd party extension libraries even + * need to know that there is NameError::Message? + * + * @endinternal + * + * @{ + */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define RUBY_INTEGER_UNIFICATION 1 + +RUBY_EXTERN VALUE rb_mKernel; /**< `Kernel` module. */ +RUBY_EXTERN VALUE rb_mComparable; /**< `Comparable` module. */ +RUBY_EXTERN VALUE rb_mEnumerable; /**< `Enumerable` module. */ +RUBY_EXTERN VALUE rb_mErrno; /**< `Errno` module. */ +RUBY_EXTERN VALUE rb_mFileTest; /**< `FileTest` module. */ +RUBY_EXTERN VALUE rb_mGC; /**< `GC` module. */ +RUBY_EXTERN VALUE rb_mMath; /**< `Math` module. */ +RUBY_EXTERN VALUE rb_mProcess; /**< `Process` module. */ +RUBY_EXTERN VALUE rb_mWaitReadable; /**< `IO::WaitReadable` module. */ +RUBY_EXTERN VALUE rb_mWaitWritable; /**< `IO::WaitReadable` module. */ + +RUBY_EXTERN VALUE rb_cBasicObject; /**< `BasicObject` class. */ +RUBY_EXTERN VALUE rb_cObject; /**< `Object` class. */ +RUBY_EXTERN VALUE rb_cArray; /**< `Array` class. */ +RUBY_EXTERN VALUE rb_cBinding; /**< `Binding` class. */ +RUBY_EXTERN VALUE rb_cClass; /**< `Class` class. */ +RUBY_EXTERN VALUE rb_cDir; /**< `Dir` class. */ +RUBY_EXTERN VALUE rb_cEncoding; /**< `Encoding` class. */ +RUBY_EXTERN VALUE rb_cEnumerator; /**< `Enumerator` class. */ +RUBY_EXTERN VALUE rb_cFalseClass; /**< `FalseClass` class. */ +RUBY_EXTERN VALUE rb_cFile; /**< `File` class. */ +RUBY_EXTERN VALUE rb_cComplex; /**< `Complex` class. */ +RUBY_EXTERN VALUE rb_cFloat; /**< `Float` class. */ +RUBY_EXTERN VALUE rb_cHash; /**< `Hash` class. */ +RUBY_EXTERN VALUE rb_cIO; /**< `IO` class. */ +RUBY_EXTERN VALUE rb_cInteger; /**< `Module` class. */ +RUBY_EXTERN VALUE rb_cMatch; /**< `MatchData` class. */ +RUBY_EXTERN VALUE rb_cMethod; /**< `Method` class. */ +RUBY_EXTERN VALUE rb_cModule; /**< `Module` class. */ +RUBY_EXTERN VALUE rb_cRefinement; /**< `Refinement` class. */ +RUBY_EXTERN VALUE rb_cNameErrorMesg; /**< `NameError::Message` class. */ +RUBY_EXTERN VALUE rb_cNilClass; /**< `NilClass` class. */ +RUBY_EXTERN VALUE rb_cNumeric; /**< `Numeric` class. */ +RUBY_EXTERN VALUE rb_cProc; /**< `Proc` class. */ +RUBY_EXTERN VALUE rb_cRandom; /**< `Random` class. */ +RUBY_EXTERN VALUE rb_cRange; /**< `Range` class. */ +RUBY_EXTERN VALUE rb_cRational; /**< `Rational` class. */ +RUBY_EXTERN VALUE rb_cRegexp; /**< `Regexp` class. */ +RUBY_EXTERN VALUE rb_cStat; /**< `File::Stat` class. */ +RUBY_EXTERN VALUE rb_cString; /**< `String` class. */ +RUBY_EXTERN VALUE rb_cStruct; /**< `Struct` class. */ +RUBY_EXTERN VALUE rb_cSymbol; /**< `Sumbol` class. */ +RUBY_EXTERN VALUE rb_cThread; /**< `Thread` class. */ +RUBY_EXTERN VALUE rb_cTime; /**< `Time` class. */ +RUBY_EXTERN VALUE rb_cTrueClass; /**< `TrueClass` class. */ +RUBY_EXTERN VALUE rb_cUnboundMethod; /**< `UnboundMethod` class. */ + +/** + * @} + * @addtogroup exception + * @{ + */ + +RUBY_EXTERN VALUE rb_eException; /**< Mother of all exceptions. */ +RUBY_EXTERN VALUE rb_eStandardError; /**< `StandardError` exception. */ +RUBY_EXTERN VALUE rb_eSystemExit; /**< `SystemExit` exception. */ +RUBY_EXTERN VALUE rb_eInterrupt; /**< `Interrupt` exception. */ +RUBY_EXTERN VALUE rb_eSignal; /**< `SignalException` exception. */ +RUBY_EXTERN VALUE rb_eFatal; /**< `fatal` exception. */ +RUBY_EXTERN VALUE rb_eArgError; /**< `ArgumentError` exception. */ +RUBY_EXTERN VALUE rb_eEOFError; /**< `EOFError` exception. */ +RUBY_EXTERN VALUE rb_eIndexError; /**< `IndexError` exception. */ +RUBY_EXTERN VALUE rb_eStopIteration; /**< `StopIteration` exception. */ +RUBY_EXTERN VALUE rb_eKeyError; /**< `KeyError` exception. */ +RUBY_EXTERN VALUE rb_eRangeError; /**< `RangeError` exception. */ +RUBY_EXTERN VALUE rb_eIOError; /**< `IOError` exception. */ +RUBY_EXTERN VALUE rb_eRuntimeError; /**< `RuntimeError` exception. */ +RUBY_EXTERN VALUE rb_eFrozenError; /**< `FrozenError` exception. */ +RUBY_EXTERN VALUE rb_eSecurityError; /**< `SecurityError` exception. */ +RUBY_EXTERN VALUE rb_eSystemCallError; /**< `SystemCallError` exception. */ +RUBY_EXTERN VALUE rb_eThreadError; /**< `ThreadError` exception. */ +RUBY_EXTERN VALUE rb_eTypeError; /**< `TypeError` exception. */ +RUBY_EXTERN VALUE rb_eZeroDivError; /**< `ZeroDivisionError` exception. */ +RUBY_EXTERN VALUE rb_eNotImpError; /**< `NotImplementedError` exception. */ +RUBY_EXTERN VALUE rb_eNoMemError; /**< `NoMemoryError` exception. */ +RUBY_EXTERN VALUE rb_eNoMethodError; /**< `NoMethodError` exception. */ +RUBY_EXTERN VALUE rb_eFloatDomainError; /**< `FloatDomainError` exception. */ +RUBY_EXTERN VALUE rb_eLocalJumpError; /**< `LocalJumpError` exception. */ +RUBY_EXTERN VALUE rb_eSysStackError; /**< `SystemStackError` exception. */ +RUBY_EXTERN VALUE rb_eRegexpError; /**< `RegexpError` exception. */ +RUBY_EXTERN VALUE rb_eEncodingError; /**< `EncodingError` exception. */ +RUBY_EXTERN VALUE rb_eEncCompatError; /**< `Encoding::CompatibilityError` exception. */ +RUBY_EXTERN VALUE rb_eNoMatchingPatternError; /**< `NoMatchingPatternError` exception. */ +RUBY_EXTERN VALUE rb_eNoMatchingPatternKeyError; /**< `NoMatchingPatternKeyError` exception. */ + +RUBY_EXTERN VALUE rb_eScriptError; /**< `ScriptError` exception. */ +RUBY_EXTERN VALUE rb_eNameError; /**< `NameError` exception. */ +RUBY_EXTERN VALUE rb_eSyntaxError; /**< `SyntaxError` exception. */ +RUBY_EXTERN VALUE rb_eLoadError; /**< `LoadError` exception. */ + +RUBY_EXTERN VALUE rb_eMathDomainError; /**< `Math::DomainError` exception. */ + +/** + * @} + * @addtogroup object + * @{ + */ + +RUBY_EXTERN VALUE rb_stdin; /**< `STDIN` constant. */ +RUBY_EXTERN VALUE rb_stdout; /**< `STDOUT` constant. */ +RUBY_EXTERN VALUE rb_stderr; /**< `STDERR` constant. */ + +RBIMPL_ATTR_PURE() +/** + * Object to class mapping function. Every object have its class. This + * function obtains that. + * + * @param[in] obj Target object to query. + * @return The class of the given object. + * + * @internal + * + * This function is a super-duper hot path. Optimised targeting modern C + * compilers and x86_64 architecture. + */ +static inline VALUE +rb_class_of(VALUE obj) +{ + if (! RB_SPECIAL_CONST_P(obj)) { + return RBASIC_CLASS(obj); + } + else if (obj == RUBY_Qfalse) { + return rb_cFalseClass; + } + else if (obj == RUBY_Qnil) { + return rb_cNilClass; + } + else if (obj == RUBY_Qtrue) { + return rb_cTrueClass; + } + else if (RB_FIXNUM_P(obj)) { + return rb_cInteger; + } + else if (RB_STATIC_SYM_P(obj)) { + return rb_cSymbol; + } + else if (RB_FLONUM_P(obj)) { + return rb_cFloat; + } + +#if !RUBY_DEBUG + RBIMPL_UNREACHABLE_RETURN(Qfalse); +#else + RUBY_ASSERT_FAIL("unexpected type"); +#endif +} + +#define CLASS_OF rb_class_of /**< @old{rb_class_of} */ + +RBIMPL_SYMBOL_EXPORT_END() + +/** @} */ + +#endif /* RBIMPL_GLOBALS_H */ diff --git a/libs/libruby/ruby/internal/has/attribute.h b/libs/libruby/ruby/internal/has/attribute.h new file mode 100644 index 0000000..f068a65 --- /dev/null +++ b/libs/libruby/ruby/internal/has/attribute.h @@ -0,0 +1,163 @@ +#ifndef RBIMPL_HAS_ATTRIBUTE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_HAS_ATTRIBUTE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_HAS_ATTRIBUTE. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/compiler_since.h" + +#if defined(__has_attribute) +# if __has_attribute(pure) || RBIMPL_COMPILER_IS(GCC) +# /* FreeBSD's defines its own *broken* version of +# * __has_attribute. Cygwin copied that content to be a victim of the +# * broken-ness. We don't take them into account. */ +# define RBIMPL_HAVE___HAS_ATTRIBUTE 1 +# endif +#endif + +/** Wraps (or simulates) `__has_attribute`. */ +#if defined(RBIMPL_HAVE___HAS_ATTRIBUTE) +# define RBIMPL_HAS_ATTRIBUTE(_) __has_attribute(_) + +#elif RBIMPL_COMPILER_IS(GCC) +# /* GCC <= 4 lack __has_attribute predefined macro, while have attributes +# * themselves. We can simulate the macro like the following: */ +# define RBIMPL_HAS_ATTRIBUTE(_) (RBIMPL_HAS_ATTRIBUTE_ ## _) +# define RBIMPL_HAS_ATTRIBUTE_aligned RBIMPL_COMPILER_SINCE(GCC, 0, 0, 0) +# define RBIMPL_HAS_ATTRIBUTE_alloc_size RBIMPL_COMPILER_SINCE(GCC, 4, 3, 0) +# define RBIMPL_HAS_ATTRIBUTE_artificial RBIMPL_COMPILER_SINCE(GCC, 4, 3, 0) +# define RBIMPL_HAS_ATTRIBUTE_always_inline RBIMPL_COMPILER_SINCE(GCC, 3, 1, 0) +# define RBIMPL_HAS_ATTRIBUTE_cdecl RBIMPL_COMPILER_SINCE(GCC, 0, 0, 0) +# define RBIMPL_HAS_ATTRIBUTE_cold RBIMPL_COMPILER_SINCE(GCC, 4, 3, 0) +# define RBIMPL_HAS_ATTRIBUTE_const RBIMPL_COMPILER_SINCE(GCC, 2, 6, 0) +# define RBIMPL_HAS_ATTRIBUTE_deprecated RBIMPL_COMPILER_SINCE(GCC, 3, 1, 0) +# define RBIMPL_HAS_ATTRIBUTE_dllexport RBIMPL_COMPILER_SINCE(GCC, 0, 0, 0) +# define RBIMPL_HAS_ATTRIBUTE_dllimport RBIMPL_COMPILER_SINCE(GCC, 0, 0, 0) +# define RBIMPL_HAS_ATTRIBUTE_error RBIMPL_COMPILER_SINCE(GCC, 4, 3, 0) +# define RBIMPL_HAS_ATTRIBUTE_format RBIMPL_COMPILER_SINCE(GCC, 0, 0, 0) +# define RBIMPL_HAS_ATTRIBUTE_hot RBIMPL_COMPILER_SINCE(GCC, 4, 3, 0) +# define RBIMPL_HAS_ATTRIBUTE_leaf RBIMPL_COMPILER_SINCE(GCC, 4, 6, 0) +# define RBIMPL_HAS_ATTRIBUTE_malloc RBIMPL_COMPILER_SINCE(GCC, 3, 0, 0) +# define RBIMPL_HAS_ATTRIBUTE_no_address_safety_analysis RBIMPL_COMPILER_SINCE(GCC, 4, 8, 0) +# define RBIMPL_HAS_ATTRIBUTE_no_sanitize_address RBIMPL_COMPILER_SINCE(GCC, 4, 8, 0) +# define RBIMPL_HAS_ATTRIBUTE_no_sanitize_undefined RBIMPL_COMPILER_SINCE(GCC, 4, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_noinline RBIMPL_COMPILER_SINCE(GCC, 3, 1, 0) +# define RBIMPL_HAS_ATTRIBUTE_nonnull RBIMPL_COMPILER_SINCE(GCC, 3, 3, 0) +# define RBIMPL_HAS_ATTRIBUTE_noreturn RBIMPL_COMPILER_SINCE(GCC, 2, 5, 0) +# define RBIMPL_HAS_ATTRIBUTE_nothrow RBIMPL_COMPILER_SINCE(GCC, 3, 3, 0) +# define RBIMPL_HAS_ATTRIBUTE_pure RBIMPL_COMPILER_SINCE(GCC, 2,96, 0) +# define RBIMPL_HAS_ATTRIBUTE_returns_nonnull RBIMPL_COMPILER_SINCE(GCC, 4, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_returns_twice RBIMPL_COMPILER_SINCE(GCC, 4, 1, 0) +# define RBIMPL_HAS_ATTRIBUTE_stdcall RBIMPL_COMPILER_SINCE(GCC, 0, 0, 0) +# define RBIMPL_HAS_ATTRIBUTE_unused RBIMPL_COMPILER_SINCE(GCC, 0, 0, 0) +# define RBIMPL_HAS_ATTRIBUTE_visibility RBIMPL_COMPILER_SINCE(GCC, 3, 3, 0) +# define RBIMPL_HAS_ATTRIBUTE_warn_unused_result RBIMPL_COMPILER_SINCE(GCC, 3, 4, 0) +# define RBIMPL_HAS_ATTRIBUTE_warning RBIMPL_COMPILER_SINCE(GCC, 4, 3, 0) +# define RBIMPL_HAS_ATTRIBUTE_weak RBIMPL_COMPILER_SINCE(GCC, 0, 0, 0) +# /* Note that "0, 0, 0" might be inaccurate. */ + +#elif RBIMPL_COMPILER_IS(SunPro) +# /* Oracle Solaris Studio 12.4 (cc version 5.11) introduced __has_attribute. +# * Before that, following attributes were available. */ +# /* See https://docs.oracle.com/cd/F24633_01/index.html */ +# define RBIMPL_HAS_ATTRIBUTE(_) (RBIMPL_HAS_ATTRIBUTE_ ## _) +# define RBIMPL_HAS_ATTRIBUTE_alias RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_aligned RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_always_inline RBIMPL_COMPILER_SINCE(SunPro, 5, 10, 0) +# define RBIMPL_HAS_ATTRIBUTE_const RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_constructor RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_destructor RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_malloc RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_noinline RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_noreturn RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_packed RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_pure RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_returns_twice RBIMPL_COMPILER_SINCE(SunPro, 5, 10, 0) +# define RBIMPL_HAS_ATTRIBUTE_vector_size RBIMPL_COMPILER_SINCE(SunPro, 5, 10, 0) +# define RBIMPL_HAS_ATTRIBUTE_visibility RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) +# define RBIMPL_HAS_ATTRIBUTE_weak RBIMPL_COMPILER_SINCE(SunPro, 5, 9, 0) + +#elif defined (_MSC_VER) +# define RBIMPL_HAS_ATTRIBUTE(_) 0 +# /* Fallback below doesn't work: see win32/Makefile.sub */ + +#else +# /* Take config.h definition when available. */ +# define RBIMPL_HAS_ATTRIBUTE(_) ((RBIMPL_HAS_ATTRIBUTE_ ## _)+0) +# ifdef ALWAYS_INLINE +# define RBIMPL_HAS_ATTRIBUTE_always_inline 1 +# endif +# ifdef FUNC_CDECL +# define RBIMPL_HAS_ATTRIBUTE_cdecl 1 +# endif +# ifdef CONSTFUNC +# define RBIMPL_HAS_ATTRIBUTE_const 1 +# endif +# ifdef DEPRECATED +# define RBIMPL_HAS_ATTRIBUTE_deprecated 1 +# endif +# ifdef ERRORFUNC +# define RBIMPL_HAS_ATTRIBUTE_error 1 +# endif +# ifdef FUNC_FASTCALL +# define RBIMPL_HAS_ATTRIBUTE_fastcall 1 +# endif +# ifdef PUREFUNC +# define RBIMPL_HAS_ATTRIBUTE_pure 1 +# endif +# ifdef NO_ADDRESS_SAFETY_ANALYSIS +# define RBIMPL_HAS_ATTRIBUTE_no_address_safety_analysis 1 +# endif +# ifdef NO_SANITIZE +# define RBIMPL_HAS_ATTRIBUTE_no_sanitize 1 +# endif +# ifdef NO_SANITIZE_ADDRESS +# define RBIMPL_HAS_ATTRIBUTE_no_sanitize_address 1 +# endif +# ifdef NOINLINE +# define RBIMPL_HAS_ATTRIBUTE_noinline 1 +# endif +# ifdef RBIMPL_FUNC_NONNULL +# define RBIMPL_HAS_ATTRIBUTE_nonnull 1 +# endif +# ifdef NORETURN +# define RBIMPL_HAS_ATTRIBUTE_noreturn 1 +# endif +# ifdef FUNC_OPTIMIZED +# define RBIMPL_HAS_ATTRIBUTE_optimize 1 +# endif +# ifdef FUNC_STDCALL +# define RBIMPL_HAS_ATTRIBUTE_stdcall 1 +# endif +# ifdef MAYBE_UNUSED +# define RBIMPL_HAS_ATTRIBUTE_unused 1 +# endif +# ifdef WARN_UNUSED_RESULT +# define RBIMPL_HAS_ATTRIBUTE_warn_unused_result 1 +# endif +# ifdef WARNINGFUNC +# define RBIMPL_HAS_ATTRIBUTE_warning 1 +# endif +# ifdef WEAK +# define RBIMPL_HAS_ATTRIBUTE_weak 1 +# endif +#endif + +#endif /* RBIMPL_HAS_ATTRIBUTE_H */ diff --git a/libs/libruby/ruby/internal/has/builtin.h b/libs/libruby/ruby/internal/has/builtin.h new file mode 100644 index 0000000..243ba2a --- /dev/null +++ b/libs/libruby/ruby/internal/has/builtin.h @@ -0,0 +1,117 @@ +#ifndef RBIMPL_HAS_BUILTIN_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_HAS_BUILTIN_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_HAS_BUILTIN. + */ +#include "ruby/internal/config.h" +#include "ruby/internal/compiler_since.h" + +#if defined(__has_builtin) +# if RBIMPL_COMPILER_IS(Intel) +# /* :TODO: Intel C Compiler has __has_builtin (since 19.1 maybe?), and is +# * reportedly broken. We have to skip them. However the situation can +# * change. They might improve someday. We need to revisit here later. */ +# elif RBIMPL_COMPILER_IS(GCC) && ! __has_builtin(__builtin_alloca) +# /* FreeBSD's defines its own *broken* version of +# * __has_builtin. Cygwin copied that content to be a victim of the +# * broken-ness. We don't take them into account. */ +# else +# define RBIMPL_HAVE___HAS_BUILTIN 1 +# endif +#endif + +/** Wraps (or simulates) `__has_builtin`. */ +#if defined(RBIMPL_HAVE___HAS_BUILTIN) +# define RBIMPL_HAS_BUILTIN(_) __has_builtin(_) + +#elif RBIMPL_COMPILER_IS(GCC) +# /* :FIXME: Historically GCC has had tons of builtins, but it implemented +# * __has_builtin only since GCC 10. This section can be made more +# * granular. */ +# /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66970 */ +# define RBIMPL_HAS_BUILTIN(_) (RBIMPL_HAS_BUILTIN_ ## _) +# define RBIMPL_HAS_BUILTIN___builtin_add_overflow RBIMPL_COMPILER_SINCE(GCC, 5, 1, 0) +# define RBIMPL_HAS_BUILTIN___builtin_alloca RBIMPL_COMPILER_SINCE(GCC, 0, 0, 0) +# define RBIMPL_HAS_BUILTIN___builtin_alloca_with_align RBIMPL_COMPILER_SINCE(GCC, 6, 1, 0) +# define RBIMPL_HAS_BUILTIN___builtin_assume 0 +# /* See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52624 for bswap16. */ +# define RBIMPL_HAS_BUILTIN___builtin_bswap16 RBIMPL_COMPILER_SINCE(GCC, 4, 8, 0) +#ifndef __OpenBSD__ +# define RBIMPL_HAS_BUILTIN___builtin_bswap32 RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +# define RBIMPL_HAS_BUILTIN___builtin_bswap64 RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +#endif +# define RBIMPL_HAS_BUILTIN___builtin_clz RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +# define RBIMPL_HAS_BUILTIN___builtin_clzl RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +# define RBIMPL_HAS_BUILTIN___builtin_clzll RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +# define RBIMPL_HAS_BUILTIN___builtin_constant_p RBIMPL_COMPILER_SINCE(GCC, 2,95, 3) +# define RBIMPL_HAS_BUILTIN___builtin_ctz RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +# define RBIMPL_HAS_BUILTIN___builtin_ctzl RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +# define RBIMPL_HAS_BUILTIN___builtin_ctzll RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +# define RBIMPL_HAS_BUILTIN___builtin_expect RBIMPL_COMPILER_SINCE(GCC, 3, 0, 0) +# define RBIMPL_HAS_BUILTIN___builtin_mul_overflow RBIMPL_COMPILER_SINCE(GCC, 5, 1, 0) +# define RBIMPL_HAS_BUILTIN___builtin_mul_overflow_p RBIMPL_COMPILER_SINCE(GCC, 7, 0, 0) +# define RBIMPL_HAS_BUILTIN___builtin_popcount RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +# define RBIMPL_HAS_BUILTIN___builtin_popcountl RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +# define RBIMPL_HAS_BUILTIN___builtin_popcountll RBIMPL_COMPILER_SINCE(GCC, 3, 6, 0) +# define RBIMPL_HAS_BUILTIN___builtin_rotateleft32 0 +# define RBIMPL_HAS_BUILTIN___builtin_rotateleft64 0 +# define RBIMPL_HAS_BUILTIN___builtin_rotateright32 0 +# define RBIMPL_HAS_BUILTIN___builtin_rotateright64 0 +# define RBIMPL_HAS_BUILTIN___builtin_sub_overflow RBIMPL_COMPILER_SINCE(GCC, 5, 1, 0) +# define RBIMPL_HAS_BUILTIN___builtin_unreachable RBIMPL_COMPILER_SINCE(GCC, 4, 5, 0) +# /* Note that "0, 0, 0" might be inaccurate. */ + +#else +# /* Take config.h definition when available */ +# define RBIMPL_HAS_BUILTIN(_) ((RBIMPL_HAS_BUILTIN_ ## _)+0) +# define RBIMPL_HAS_BUILTIN___builtin_add_overflow HAVE_BUILTIN___BUILTIN_ADD_OVERFLOW +# define RBIMPL_HAS_BUILTIN___builtin_alloca 0 +# define RBIMPL_HAS_BUILTIN___builtin_alloca_with_align HAVE_BUILTIN___BUILTIN_ALLOCA_WITH_ALIGN +# define RBIMPL_HAS_BUILTIN___builtin_assume 0 +# define RBIMPL_HAS_BUILTIN___builtin_assume_aligned HAVE_BUILTIN___BUILTIN_ASSUME_ALIGNED +# define RBIMPL_HAS_BUILTIN___builtin_bswap16 HAVE_BUILTIN___BUILTIN_BSWAP16 +# define RBIMPL_HAS_BUILTIN___builtin_bswap32 HAVE_BUILTIN___BUILTIN_BSWAP32 +# define RBIMPL_HAS_BUILTIN___builtin_bswap64 HAVE_BUILTIN___BUILTIN_BSWAP64 +# define RBIMPL_HAS_BUILTIN___builtin_clz HAVE_BUILTIN___BUILTIN_CLZ +# define RBIMPL_HAS_BUILTIN___builtin_clzl HAVE_BUILTIN___BUILTIN_CLZL +# define RBIMPL_HAS_BUILTIN___builtin_clzll HAVE_BUILTIN___BUILTIN_CLZLL +# define RBIMPL_HAS_BUILTIN___builtin_constant_p HAVE_BUILTIN___BUILTIN_CONSTANT_P +# define RBIMPL_HAS_BUILTIN___builtin_ctz HAVE_BUILTIN___BUILTIN_CTZ +# define RBIMPL_HAS_BUILTIN___builtin_ctzl 0 +# define RBIMPL_HAS_BUILTIN___builtin_ctzll HAVE_BUILTIN___BUILTIN_CTZLL +# define RBIMPL_HAS_BUILTIN___builtin_expect HAVE_BUILTIN___BUILTIN_EXPECT +# define RBIMPL_HAS_BUILTIN___builtin_mul_overflow HAVE_BUILTIN___BUILTIN_MUL_OVERFLOW +# define RBIMPL_HAS_BUILTIN___builtin_mul_overflow_p HAVE_BUILTIN___BUILTIN_MUL_OVERFLOW_P +# define RBIMPL_HAS_BUILTIN___builtin_popcount HAVE_BUILTIN___BUILTIN_POPCOUNT +# define RBIMPL_HAS_BUILTIN___builtin_popcountl 0 +# define RBIMPL_HAS_BUILTIN___builtin_rotateleft32 0 +# define RBIMPL_HAS_BUILTIN___builtin_rotateleft64 0 +# define RBIMPL_HAS_BUILTIN___builtin_rotateright32 0 +# define RBIMPL_HAS_BUILTIN___builtin_rotateright64 0 +# define RBIMPL_HAS_BUILTIN___builtin_popcountll HAVE_BUILTIN___BUILTIN_POPCOUNTLL +# define RBIMPL_HAS_BUILTIN___builtin_sub_overflow HAVE_BUILTIN___BUILTIN_SUB_OVERFLOW +# if defined(HAVE___BUILTIN_UNREACHABLE) +# define RBIMPL_HAS_BUILTIN___builtin_unreachable 1 +# else +# define RBIMPL_HAS_BUILTIN___builtin_unreachable 0 +# endif +#endif + +#endif /* RBIMPL_HAS_BUILTIN_H */ diff --git a/libs/libruby/ruby/internal/has/c_attribute.h b/libs/libruby/ruby/internal/has/c_attribute.h new file mode 100644 index 0000000..c5c4886 --- /dev/null +++ b/libs/libruby/ruby/internal/has/c_attribute.h @@ -0,0 +1,38 @@ +#ifndef RBIMPL_HAS_C_ATTRIBUTE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_HAS_C_ATTRIBUTE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_HAS_C_ATTRIBUTE. + */ + +/** Wraps (or simulates) `__has_c_attribute`. */ +#if defined(__cplusplus) +# /* Makes no sense. */ +# define RBIMPL_HAS_C_ATTRIBUTE(_) 0 + +#elif defined(__has_c_attribute) +# define RBIMPL_HAS_C_ATTRIBUTE(_) __has_c_attribute(_) + +#else +# /* As of writing everything that lacks __has_c_attribute also completely +# * lacks C2x attributes as well. Might change in future? */ +# define RBIMPL_HAS_C_ATTRIBUTE(_) 0 +#endif + +#endif /* RBIMPL_HAS_C_ATTRIBUTE_H */ diff --git a/libs/libruby/ruby/internal/has/cpp_attribute.h b/libs/libruby/ruby/internal/has/cpp_attribute.h new file mode 100644 index 0000000..6a393b1 --- /dev/null +++ b/libs/libruby/ruby/internal/has/cpp_attribute.h @@ -0,0 +1,86 @@ +#ifndef RBIMPL_HAS_CPP_ATTRIBUTE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_HAS_CPP_ATTRIBUTE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_HAS_CPP_ATTRIBUTE. + */ +#include "ruby/internal/compiler_is.h" +#include "ruby/internal/compiler_since.h" + +/** @cond INTERNAL_MACRO */ +#if RBIMPL_COMPILER_IS(SunPro) +# /* Oracle Developer Studio 12.5's C++ preprocessor is reportedly broken. We +# * could simulate __has_cpp_attribute like below, but don't know the exact +# * list of which version supported which attribute. Just kill everything for +# * now. If you can please :FIXME: */ +# /* https://unicode-org.atlassian.net/browse/ICU-12893 */ +# /* https://github.com/boostorg/config/pull/95 */ +# define RBIMPL_HAS_CPP_ATTRIBUTE0(_) 0 + +#elif defined(__has_cpp_attribute) +# define RBIMPL_HAS_CPP_ATTRIBUTE0(_) __has_cpp_attribute(_) + +#elif RBIMPL_COMPILER_IS(MSVC) +# /* MSVC has never updated its __cplusplus since forever (unless specified +# * explicitly by a compiler flag). They also lack __has_cpp_attribute until +# * 2019. However, they do have attributes since 2015 or so. */ +# /* https://docs.microsoft.com/en-us/cpp/overview/visual-cpp-language-conformance */ +# define RBIMPL_HAS_CPP_ATTRIBUTE0(_) (RBIMPL_HAS_CPP_ATTRIBUTE_ ## _) +# define RBIMPL_HAS_CPP_ATTRIBUTE_noreturn 200809 * RBIMPL_COMPILER_SINCE(MSVC, 19, 00, 0) +# define RBIMPL_HAS_CPP_ATTRIBUTE_carries_dependency 200809 * RBIMPL_COMPILER_SINCE(MSVC, 19, 00, 0) +# define RBIMPL_HAS_CPP_ATTRIBUTE_deprecated 201309 * RBIMPL_COMPILER_SINCE(MSVC, 19, 10, 0) +# define RBIMPL_HAS_CPP_ATTRIBUTE_fallthrough 201603 * RBIMPL_COMPILER_SINCE(MSVC, 19, 10, 0) +# define RBIMPL_HAS_CPP_ATTRIBUTE_maybe_unused 201603 * RBIMPL_COMPILER_SINCE(MSVC, 19, 11, 0) +# define RBIMPL_HAS_CPP_ATTRIBUTE_nodiscard 201603 * RBIMPL_COMPILER_SINCE(MSVC, 19, 11, 0) + +#elif RBIMPL_COMPILER_BEFORE(Clang, 3, 6, 0) +# /* Clang 3.6.0 introduced __has_cpp_attribute. Prior to that following +# * attributes were already there. */ +# /* https://clang.llvm.org/cxx_status.html */ +# define RBIMPL_HAS_CPP_ATTRIBUTE0(_) (RBIMPL_HAS_CPP_ATTRIBUTE_ ## _) +# define RBIMPL_HAS_CPP_ATTRIBUTE_noreturn 200809 * RBIMPL_COMPILER_SINCE(Clang, 3, 3, 0) +# define RBIMPL_HAS_CPP_ATTRIBUTE_deprecated 201309 * RBIMPL_COMPILER_SINCE(Clang, 3, 4, 0) + +#elif RBIMPL_COMPILER_BEFORE(GCC, 5, 0, 0) +# /* GCC 5+ have __has_cpp_attribute, while 4.x had following attributes. */ +# /* https://gcc.gnu.org/projects/cxx-status.html */ +# define RBIMPL_HAS_CPP_ATTRIBUTE0(_) (RBIMPL_HAS_CPP_ATTRIBUTE_ ## _) +# define RBIMPL_HAS_CPP_ATTRIBUTE_noreturn 200809 * RBIMPL_COMPILER_SINCE(GCC, 4, 8, 0) +# define RBIMPL_HAS_CPP_ATTRIBUTE_deprecated 201309 * RBIMPL_COMPILER_SINCE(GCC, 4, 9, 0) + +#else +# /* :FIXME: +# * Candidate compilers to list here: +# * - icpc: They have __INTEL_CXX11_MODE__. +# */ +# define RBIMPL_HAS_CPP_ATTRIBUTE0(_) 0 +#endif +/** @endcond */ + +/** Wraps (or simulates) `__has_cpp_attribute`. */ +#if ! defined(__cplusplus) +# /* Makes no sense. */ +# define RBIMPL_HAS_CPP_ATTRIBUTE(_) 0 +#else +# /* GCC needs workarounds. See https://gcc.godbolt.org/z/jdz3pa */ +# define RBIMPL_HAS_CPP_ATTRIBUTE(_) \ + ((RBIMPL_HAS_CPP_ATTRIBUTE0(_) <= __cplusplus) ? RBIMPL_HAS_CPP_ATTRIBUTE0(_) : 0) +#endif + +#endif /* RBIMPL_HAS_CPP_ATTRIBUTE_H */ diff --git a/libs/libruby/ruby/internal/has/declspec_attribute.h b/libs/libruby/ruby/internal/has/declspec_attribute.h new file mode 100644 index 0000000..1c526da --- /dev/null +++ b/libs/libruby/ruby/internal/has/declspec_attribute.h @@ -0,0 +1,47 @@ +#ifndef RBIMPL_HAS_DECLSPEC_ATTRIBUTE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_HAS_DECLSPEC_ATTRIBUTE. + */ +#include "ruby/internal/compiler_since.h" + +/** Wraps (or simulates) `__has_declspec_attribute`. */ +#if defined(__has_declspec_attribute) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE(_) __has_declspec_attribute(_) +#else +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE(_) (RBIMPL_HAS_DECLSPEC_ATTRIBUTE_ ## _) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_align RBIMPL_COMPILER_SINCE(MSVC, 8, 0, 0) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_deprecated RBIMPL_COMPILER_SINCE(MSVC,13, 0, 0) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_dllexport RBIMPL_COMPILER_SINCE(MSVC, 8, 0, 0) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_dllimport RBIMPL_COMPILER_SINCE(MSVC, 8, 0, 0) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_empty_bases RBIMPL_COMPILER_SINCE(MSVC,19, 0, 23918) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_noalias RBIMPL_COMPILER_SINCE(MSVC, 8, 0, 0) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_noinline RBIMPL_COMPILER_SINCE(MSVC,13, 0, 0) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_noreturn RBIMPL_COMPILER_SINCE(MSVC,11, 0, 0) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_nothrow RBIMPL_COMPILER_SINCE(MSVC, 8, 0, 0) +# define RBIMPL_HAS_DECLSPEC_ATTRIBUTE_restrict RBIMPL_COMPILER_SINCE(MSVC,14, 0, 0) +# /* Note that "8, 0, 0" might be inaccurate. */ +# if ! defined(__cplusplus) +# /* Clang has this in both C/C++, but MSVC has this in C++ only.*/ +# undef RBIMPL_HAS_DECLSPEC_ATTRIBUTE_nothrow +# endif +#endif + +#endif /* RBIMPL_HAS_DECLSPEC_ATTRIBUTE_H */ diff --git a/libs/libruby/ruby/internal/has/extension.h b/libs/libruby/ruby/internal/has/extension.h new file mode 100644 index 0000000..da8c0d3 --- /dev/null +++ b/libs/libruby/ruby/internal/has/extension.h @@ -0,0 +1,33 @@ +#ifndef RBIMPL_HAS_EXTENSION_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_HAS_EXTENSION_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_HAS_EXTENSION. + */ +#include "ruby/internal/has/feature.h" + +/** Wraps (or simulates) `__has_extension`. */ +#if defined(__has_extension) +# define RBIMPL_HAS_EXTENSION(_) __has_extension(_) +#else +# /* Pre-3.0 clang had __has_feature but not __has_extension. */ +# define RBIMPL_HAS_EXTENSION(_) RBIMPL_HAS_FEATURE(_) +#endif + +#endif /* RBIMPL_HAS_EXTENSION_H */ diff --git a/libs/libruby/ruby/internal/has/feature.h b/libs/libruby/ruby/internal/has/feature.h new file mode 100644 index 0000000..7be8d27 --- /dev/null +++ b/libs/libruby/ruby/internal/has/feature.h @@ -0,0 +1,31 @@ +#ifndef RBIMPL_HAS_FEATURE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_HAS_FEATURE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_HAS_FEATURE. + */ + +/** Wraps (or simulates) `__has_feature`. */ +#if defined(__has_feature) +# define RBIMPL_HAS_FEATURE(_) __has_feature(_) +#else +# define RBIMPL_HAS_FEATURE(_) 0 +#endif + +#endif /* RBIMPL_HAS_FEATURE_H */ diff --git a/libs/libruby/ruby/internal/has/warning.h b/libs/libruby/ruby/internal/has/warning.h new file mode 100644 index 0000000..12d7db1 --- /dev/null +++ b/libs/libruby/ruby/internal/has/warning.h @@ -0,0 +1,31 @@ +#ifndef RBIMPL_HAS_WARNING_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_HAS_WARNING_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_HAS_WARNING. + */ + +/** Wraps (or simulates) `__has_warning`. */ +#if defined(__has_warning) +# define RBIMPL_HAS_WARNING(_) __has_warning(_) +#else +# define RBIMPL_HAS_WARNING(_) 0 +#endif + +#endif /* RBIMPL_HAS_WARNING_H */ diff --git a/libs/libruby/ruby/internal/intern/array.h b/libs/libruby/ruby/internal/intern/array.h new file mode 100644 index 0000000..2262c6f --- /dev/null +++ b/libs/libruby/ruby/internal/intern/array.h @@ -0,0 +1,657 @@ +#ifndef RBIMPL_INTERN_ARRAY_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_ARRAY_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cArray. + */ +#include "ruby/internal/attr/noalias.h" +#include "ruby/internal/attr/noexcept.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* array.c */ + +RBIMPL_ATTR_NONNULL(()) +RBIMPL_ATTR_NOALIAS() +/** + * Fills the memory region with a series of ::RUBY_Qnil. + * + * @param[out] buf Buffer to squash. + * @param[in] len Number of objects of `buf`. + * @post `buf` is filled with ::RUBY_Qnil. + */ +void rb_mem_clear(VALUE *buf, long len) + RBIMPL_ATTR_NOEXCEPT(true) + ; + +/** + * Identical to rb_ary_new_from_values(), except it expects exactly two + * parameters. + * + * @param[in] car Arbitrary ruby object. + * @param[in] cdr Arbitrary ruby object. + * @return An allocated new array, of length 2, whose contents are the + * passed objects. + */ +VALUE rb_assoc_new(VALUE car, VALUE cdr); + +/** + * Try converting an object to its array representation using its `to_ary` + * method, if any. If there is no such thing, returns ::RUBY_Qnil. + * + * @param[in] obj Arbitrary ruby object to convert. + * @exception rb_eTypeError `obj.to_ary` returned something non-Array. + * @retval RUBY_Qnil No conversion from `obj` to array defined. + * @retval otherwise Converted array representation of `obj`. + * @see rb_io_check_io + * @see rb_check_string_type + * @see rb_check_hash_type + */ +VALUE rb_check_array_type(VALUE obj); + +/** + * Allocates a new, empty array. + * + * @return An allocated new array, whose length is 0. + */ +VALUE rb_ary_new(void); + +/** + * Identical to rb_ary_new(), except it additionally specifies how many rooms + * of objects it should allocate. This way you can create an array whose + * capacity is bigger than the length of it. If you can say that an array + * grows to a specific amount, this could be effective than resizing an array + * over and over again and again. + * + * @param[in] capa Designed capacity of the generating array. + * @return An empty array, whose capacity is `capa`. + */ +VALUE rb_ary_new_capa(long capa); + +/** + * Constructs an array from the passed objects. + * + * @param[in] n Number of passed objects. + * @param[in] ... Arbitrary ruby objects, filled into the returning array. + * @return An array of size `n`, whose contents are the passed objects. + */ +VALUE rb_ary_new_from_args(long n, ...); + +/** + * Identical to rb_ary_new_from_args(), except how objects are passed. + * + * @param[in] n Number of objects of `elts`. + * @param[in] elts Arbitrary ruby objects, filled into the returning array. + * @return An array of size `n`, whose contents are the passed objects. + */ +VALUE rb_ary_new_from_values(long n, const VALUE *elts); + +/** + * Allocates a hidden (no class) empty array. + * + * @param[in] capa Designed capacity of the array. + * @return A hidden, empty array. + * @see rb_obj_hide() + */ +VALUE rb_ary_hidden_new(long capa); +#define rb_ary_tmp_new rb_ary_hidden_new + +/** + * Destroys the given array for no reason. + * + * @warning DO NOT USE IT. + * @warning Leave this task to our GC. + * @warning It was a wrong indea at the first place to let you know about it. + * + * @param[out] ary The array to be executed. + * @post The given array no longer exists. + * @note Maybe `Array#clear` could be what you want. + * + * @internal + * + * Should have moved this to `internal/array.h`. + */ +void rb_ary_free(VALUE ary); + +/** + * Declares that the array is about to be modified. This for instance let the + * array have a dedicated backend storage. + * + * @param[out] ary Array about to be modified. + * @exception rb_eFrozenError `ary` is frozen. + * @post Upon successful return the passed array is eligible to be + * modified. + */ +void rb_ary_modify(VALUE ary); + +/** @alias{rb_obj_freeze} */ +VALUE rb_ary_freeze(VALUE obj); + +RBIMPL_ATTR_PURE() +/** + * Queries if the passed two arrays share the same backend storage. A use-case + * for knowing such property is to take a snapshot of an array (using + * e.g. rb_ary_replace()), then check later if that snapshot still shares the + * storage with the original. Taking a snapshot is ultra-cheap. If nothing + * happens the impact shall be minimal. But if someone modifies the original, + * that entity shall pay the cost of copy-on-write. You can detect that using + * this API. + * + * @param[in] lhs Comparison LHS. + * @param[in] rhs Comparison RHS. + * @retval RUBY_Qtrue They share the same backend storage. + * @retval RUBY_Qfalse They are distinct. + * @pre Both arguments must be of ::RUBY_T_ARRAY. + */ +VALUE rb_ary_shared_with_p(VALUE lhs, VALUE rhs); + +/** + * Queries element(s) of an array. This is complicated! Refer `Array#slice` + * document for the complete description of how it behaves. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Up to 2 objects. + * @param[in] ary Target array. + * @exception rb_eTypeError `argv` (or its part) includes non-Integer. + * @exception rb_eRangeError rb_cArithSeq is passed, and is OOB. + * @return An element (if requested), or an array of elements (if + * requested), or ::RUBY_Qnil (if index OOB). + * + * @internal + * + * ```rbs + * # "int" is ::Integer or `#to_int`, defined in builtin.rbs + * + * class ::Array[unchecked out T] + * def slice + * : (int i) -> T? + * | (int beg, int len) -> ::Array[T]? + * | (Range[int] r) -> ::Array[T]? + * | (ArithmeticSequence as) -> ::Array[T]? # This also raises RagneError. + * end + * ``` + */ +VALUE rb_ary_aref(int argc, const VALUE *argv, VALUE ary); + +/** + * Obtains a part of the passed array. + * + * @param[in] ary Target array. + * @param[in] beg Subpart index. + * @param[in] len Requested length of returning array. + * @retval RUBY_Qnil Requested range out of bounds of `ary`. + * @retval otherwise An allocated new array whose contents are `ary`'s + * `beg` to `len`. + * @note Return array can be shorter than `len` when for instance + * `[0, 1, 2, 3]`'s 4th to 1,000,000,000th is requested. + */ +VALUE rb_ary_subseq(VALUE ary, long beg, long len); + +/** + * Destructively stores the passed value to the passed array's passed index. + * It also resizes the array's backend storage so that the requested index is + * not out of bounds. + * + * @param[out] ary Target array to modify. + * @param[in] key Where to store `val`. + * @param[in] val What to store at `key`. + * @exception rb_eFrozenError `ary` is frozen. + * @exception rb_eIndexError `key` is negative. + * @post `ary`'s `key`th position is occupied with `val`. + * @post Depending on `key` and previous length of `ary` this operation + * can also create a series of "hole" positions inside of the + * backend storage. They are filled with ::RUBY_Qnil. + */ +void rb_ary_store(VALUE ary, long key, VALUE val); + +/** + * Duplicates an array. + * + * @param[in] ary Target to duplicate. + * @return An allocated new array whose contents are identical to `ary`. + * + * @internal + * + * Not sure why this has to be something different from `ary_make_shared_copy`, + * which seems much efficient. + */ +VALUE rb_ary_dup(VALUE ary); + +/** + * I guess there is no use case of this function in extension libraries, but + * this is a routine identical to rb_ary_dup(). This makes the most sense when + * the passed array is formerly hidden by rb_obj_hide(). + * + * @param[in] ary An array, possibly hidden. + * @return A duplicated new instance of ::rb_cArray. + */ +VALUE rb_ary_resurrect(VALUE ary); + +/** + * Force converts an object to an array. It first tries its `#to_ary` method. + * Takes the result if any. Otherwise creates an array of size 1 whose sole + * element is the passed object. + * + * @param[in] obj Arbitrary ruby object. + * @return An array representation of `obj`. + * @note Unlike rb_str_to_str() which is a variant of + * rb_check_string_type(), rb_ary_to_ary() is not a variant of + * rb_check_array_type(). + */ +VALUE rb_ary_to_ary(VALUE obj); + +/** + * Converts an array into a human-readable string. Historically its behaviour + * changed over time. Currently it is identical to calling `inspect` method. + * This behaviour is from that of python (!!) circa 2006. + * + * @param[in] ary Array to inspect. + * @return Recursively inspected representation of `ary`. + * @see `[ruby-dev:29520]` + */ +VALUE rb_ary_to_s(VALUE ary); + +/** + * Destructively appends multiple elements at the end of the array. + * + * @param[out] ary Where to push `train`. + * @param[in] train Arbitrary ruby objects to push to `ary`. + * @param[in] len Number of objects of `train`. + * @exception rb_eIndexError `len` too large. + * @exception rb_eFrozenError `ary` is frozen. + * @return The passed `ary`. + * @post `ary` has contents from `train` appended at its end. + */ +VALUE rb_ary_cat(VALUE ary, const VALUE *train, long len); + +/** + * Special case of rb_ary_cat() that it adds only one element. + * + * @param[out] ary Where to push `elem`. + * @param[in] elem Arbitrary ruby object to push. + * @exception rb_eFrozenError `ary` is frozen. + * @return The passed `ary`. + * @post `ary` has `elem` appended at its end. + */ +VALUE rb_ary_push(VALUE ary, VALUE elem); + +/** + * Destructively deletes an element from the end of the passed array and + * returns what was deleted. + * + * @param[out] ary Target array to modify. + * @exception rb_eFrozenError `ary` is frozen. + * @return What was at the end of `ary`, or ::RUBY_Qnil if there is + * nothing to remove. + * @post `ary`'s last element, if any, is removed. + * @note There is no way to distinguish whether `ary` was an 1-element + * array whose content was ::RUBY_Qnil, or was empty. + */ +VALUE rb_ary_pop(VALUE ary); + +/** + * Destructively deletes an element from the beginning of the passed array and + * returns what was deleted. It can also be seen as a routine identical to + * rb_ary_pop(), except which side of the array to scrub. + * + * @param[out] ary Target array to modify. + * @exception rb_eFrozenError `ary` is frozen. + * @return What was at the beginning of `ary`, or ::RUBY_Qnil if there is + * nothing to remove. + * @post `ary`'s first element, if any, is removed. As the name implies + * everything else remaining in `ary` gets moved towards `ary`'s + * beginning. + * @note There is no way to distinguish whether `ary` was an 1-element + * array whose content was ::RUBY_Qnil, or was empty. + */ +VALUE rb_ary_shift(VALUE ary); + +/** + * Destructively prepends the passed item at the beginning of the passed array. + * It can also be seen as a routine identical to rb_ary_push(), except which + * side of the array to modify. + * + * @param[out] ary Target array to modify. + * @param[in] elem Arbitrary ruby object to unshift. + * @exception rb_eFrozenError `ary` is frozen. + * @return The passed `ary`. + * @post `ary` has `elem` prepended at this beginning. + */ +VALUE rb_ary_unshift(VALUE ary, VALUE elem); + +RBIMPL_ATTR_PURE() +/** + * Queries an element of an array. When passed offset is negative it counts + * backwards. + * + * @param[in] ary An array to look into. + * @param[in] off Offset (can be negative). + * @return ::RUBY_Qnil when `off` is out of bounds of `ary`. Otherwise + * what is stored at `off`-th position of `ary`. + * @note `ary`'s `off`-th element can happen to be ::RUBY_Qnil. + */ +VALUE rb_ary_entry(VALUE ary, long off); + +/** + * Iteratively yields each element of the passed array to the implicitly passed + * block if any. In case there is no block given, an enumerator that does the + * thing is generated instead. + * + * @param[in] ary Array to iterate over. + * @retval ary Passed block was evaluated. + * @retval otherwise An instance of ::rb_cEnumerator for `Array#each`. + */ +VALUE rb_ary_each(VALUE ary); + +/** + * Recursively stringises the elements of the passed array, flattens that + * result, then joins the sequence using the passed separator. + * + * @param[in] ary Target array to convert. + * @param[in] sep Separator. Either a string, or ::RUBY_Qnil + * if you want no separator. + * @exception rb_eArgError Infinite recursion in `ary`. + * @exception rb_eTypeError `sep` is not a string. + * @exception rb_eEncCompatError Strings do not agree with their encodings. + * @return An instance of ::rb_cString which concatenates stringised + * contents of `ary`, using `sep` as separator. + */ +VALUE rb_ary_join(VALUE ary, VALUE sep); + +/** + * _Destructively_ reverses the passed array in-place. + * + * @warning This is `Array#reverse!`, not `Array#reverse`. + * @param[out] ary Target array to modify. + * @exception rb_eFrozenError `ary` is frozen. + * @return Passed `ary`. + * @post `ary` is reversed. + */ +VALUE rb_ary_reverse(VALUE ary); + +/** + * _Destructively_ rotates the passed array in-place to towards its end. The + * amount can be negative. Would rotate to the opposite direction then. + * + * @warning This is `Array#rotate!`, not `Array#rotate`. + * @param[out] ary Target array to modify. + * @param[in] rot Amount of rotation. + * @exception rb_eFrozenError `ary` is frozen. + * @retval RUBY_Qnil Not rotated. + * @retval ary Rotated. + * @post `ary` is rotated. + */ +VALUE rb_ary_rotate(VALUE ary, long rot); + +/** + * Creates a copy of the passed array, whose elements are sorted according to + * their `<=>` result. + * + * @param[in] ary Array to sort. + * @exception rb_eArgError Comparison not defined among elements. + * @exception rb_eRuntimeError Infinite recursion in `<=>`. + * @return A copy of `ary`, sorted. + * @note As of writing this function uses `qsort` as backend algorithm, + * which means the result is unstable (in terms of sort stability). + */ +VALUE rb_ary_sort(VALUE ary); + +/** + * Destructively sorts the passed array in-place, according to each elements' + * `<=>` result. + * + * @param[in] ary Target array to modify. + * @exception rb_eArgError Comparison not defined among elements. + * @exception rb_eRuntimeError Infinite recursion in `<=>`. + * @return Passed `ary`. + * @post `ary` is sorted. + * @note As of writing this function uses `qsort` as backend algorithm, + * which means the result is unstable (in terms of sort stability). + */ +VALUE rb_ary_sort_bang(VALUE ary); + +/** + * Destructively removes elements from the passed array, so that there would be + * no elements inside that satisfy `==` relationship with the passed object. + * Returns the last deleted element if any. But in case there was nothing to + * delete it gets complicated. It checks for the implicitly passed block. If + * there is a block the return value would be what the block evaluates to. + * Otherwise it resorts to ::RUBY_Qnil. + * + * @param[out] ary Target array to modify. + * @param[in] elem Template object to match against each element. + * @exception rb_eFrozenError `ary` is frozen. + * @return What was deleted, or what was the block returned, or + * ::RUBY_Qnil (see above). + * @post All elements that have `==` relationship with `elem` are purged + * from `ary`. Elements shift their positions so that `ary` gets + * compact. + * + * @internal + * + * Internally there also is `rb_ary_delete_same`, which compares by identity. + */ +VALUE rb_ary_delete(VALUE ary, VALUE elem); + +/** + * Destructively removes an element which resides at the specific index of the + * passed array. Unlike rb_ary_stre() the index can be negative, which means + * the index counts backwards from the array's tail. + * + * @param[out] ary Target array to modify. + * @param[in] pos Position (can be negative). + * @exception rb_eFrozenError `ary` is frozen. + * @return What was deleted, or ::RUBY_Qnil in case of OOB. + * @post `ary`'s `pos`-th element is deleted if any. + * @note There is no way to distinguish whether `pos` is out of bound, + * or `pos` did exist but stored ::RUBY_Qnil as an ordinal value. + */ +VALUE rb_ary_delete_at(VALUE ary, long pos); + +/** + * Destructively removes everything form an array. + * + * @param[out] ary Target array to modify. + * @exception rb_eFrozenError `ary` is frozen. + * @return The passed `ary`. + * @post `ary` is an empty array. + */ +VALUE rb_ary_clear(VALUE ary); + +/** + * Creates a new array, concatenating the former to the latter. + * + * @param[in] lhs Source array #1. + * @param[in] rhs Source array #2. + * @exception rb_eIndexError Result array too big. + * @return A new array containing `rhs` concatenated to `lhs`. + * @note This operation doesn't commute. Don't get confused by the + * "plus" terminology. For historical reasons there are some + * noncommutative `+`s in Ruby. This is one of such things. There + * has been a long discussion around `+`s in programming languages. + * + * @internal + * + * rb_ary_concat() is not a destructive version of rb_ary_plus(). They raise + * different exceptions. Don't know why though. + */ +VALUE rb_ary_plus(VALUE lhs, VALUE rhs); + +/** + * Destructively appends the contents of latter into the end of former. + * + * @param[out] lhs Destination array. + * @param[in] rhs Source array. + * @exception rb_eFrozenError `lhs` is frozen. + * @exception rb_eIndexError Result array too big. + * @exception rb_eTypeError `rhs` doesn't respond to `#to_ary`. + * @return The passed `lhs`. + * @post `lhs` has contents of `rhs` appended to its end. + */ +VALUE rb_ary_concat(VALUE lhs, VALUE rhs); + +/** + * Looks up the passed key, assuming the passed array is an alist. An "alist" + * here is a list of "association"s, much like that of Emacs. Emacs has + * `assoc` function that behaves exactly the same as this one. + * + * ```ruby + * # This is an example of aliist. + * auto_mode_alist = [ + * [ /\.[ch]\z/, :"c-mode" ], + * [ /\.[ch]pp\z/, :"c++-mode" ], + * [ /\.awk\z/, :"awk-mode" ], + * [ /\.cs\z/, :"csharp-mode" ], + * [ /\.go\z/, :"go-mode" ], + * [ /\.java\z/, :"java-mode" ], + * [ /\.pas\z/, :"pascal-mode" ], + * [ /\.rs\z/, :"rust-mode" ], + * [ /\.txt\z/, :"text-mode" ], + * ] + * ``` + * + * This function scans the passed array looking for an element, which itself is + * an array, whose first element is the passed key. If no such element is + * found, returns ::RUBY_Qnil. + * + * Although this function expects the passed array be an array of arrays, it + * can happily accept non-array elements; it just ignores such things. + * + * @param[in] alist An array of arrays. + * @param[in] key Needle. + * @retval RUBY_Qnil Nothing was found. + * @retval otherwise An element in `alist` whose first element is in `==` + * relationship with `key`. + */ +VALUE rb_ary_assoc(VALUE alist, VALUE key); + +/** + * Identical to rb_ary_assoc(), except it scans the passed array from the + * opposite direction. + * + * @param[in] alist An array of arrays. + * @param[in] key Needle. + * @retval RUBY_Qnil Nothing was found. + * @retval otherwise An element in `alist` whose first element is in `==` + * relationship with `key`. + */ +VALUE rb_ary_rassoc(VALUE alist, VALUE key); + +/** + * Queries if the passed array has the passed entry. + * + * @param[in] ary Target array to scan. + * @param[in] elem Target array to find. + * @retval RUBY_Qfalse No element in `ary` is in `==` relationship with + * `elem`. + * @retval RUBY_Qtrue There is at least one element in `ary` which is in + * `==` relationship with `elem`. + * + * @internal + * + * This is the only function in the entire C API that is named using third + * person singular form of a verb (except #ISASCII etc., which are not our + * naming). The counterpart Ruby API of this function is `Array#include?`. + */ +VALUE rb_ary_includes(VALUE ary, VALUE elem); + +/** + * Recursively compares each elements of the two arrays one-by-one using `<=>`. + * + * @param[in] lhs Comparison LHS. + * @param[in] rhs Comparison RHS. + * @retval RUBY_Qnil `lhs` and `rhs` are not comparable. + * @retval -1 `lhs` is less than `rhs`. + * @retval 0 They are equal. + * @retval 1 `rhs` is less then `lhs`. + */ +VALUE rb_ary_cmp(VALUE lhs, VALUE rhs); + +/** + * Replaces the contents of the former object with the contents of the latter. + * + * @param[out] copy Destination object. + * @param[in] orig Source object. + * @exception rb_eTypeError `orig` has no implicit conversion to Array. + * @exception rb_eFrozenError `copy` is frozen. + * @return The passed `copy`. + * @post `copy`'s former components are abandoned. It now has the + * identical length and contents to `orig`. + */ +VALUE rb_ary_replace(VALUE copy, VALUE orig); + +/** + * This _was_ a generalisation of `Array#values_at`, `Struct#values_at`, and + * `MatchData#values_at`. It begun its life as a refactoring effort. However + * as Ruby evolves over time, as of writing none of aforementioned methods + * share their implementations at all. This function is not deprecated; still + * works as it has been. But it is now kind of like a rudimentum. + * + * This function takes an object, which is a receiver, and a series of + * "indices", which are either integers, or ranges of integers. Calls the + * passed callback for each of those indices, along with the receiver. This + * callback is expected to do something like rb_ary_aref(), rb_struct_aref(), + * etc. In case of a range index rb_range_beg_len() expands the range. + * Finally return values of the callback are gathered as an array, then + * returned. + * + * @param[in] obj Arbitrary ruby object. + * @param[in] olen "Length" of `obj`. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv List of "indices", described above. + * @param[in] func Callback function. + * @return A new instance of ::rb_cArray gathering `func`outputs. + * + * @internal + * + * `Array#values_at` no longer uses this function. There is no reason apart + * from historical ones to list this function here. + */ +VALUE rb_get_values_at(VALUE obj, long olen, int argc, const VALUE *argv, VALUE (*func)(VALUE obj, long oidx)); + +/** + * Expands or shrinks the passed array to the passed length. + * + * @param[out] ary An array to modify. + * @param[in] len Desired length of `ary`. + * @exception rb_eFrozenError `ary` is frozen. + * @exception rb_eIndexError `len` too long. + * @return The passed `ary`. + * @post `ary`'s length is `len`. + * @post Depending on `len` and previous length of `ary` this operation + * can also create a series of "hole" positions inside of the + * backend storage. They are filled with ::RUBY_Qnil. + * + * @internal + * + * `len` is signed. Intentional or...? + */ +VALUE rb_ary_resize(VALUE ary, long len); + +#define rb_ary_new2 rb_ary_new_capa /**< @old{rb_ary_new_capa} */ +#define rb_ary_new3 rb_ary_new_from_args /**< @old{rb_ary_new_from_args} */ +#define rb_ary_new4 rb_ary_new_from_values /**< @old{rb_ary_new_from_values} */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_ARRAY_H */ diff --git a/libs/libruby/ruby/internal/intern/bignum.h b/libs/libruby/ruby/internal/intern/bignum.h new file mode 100644 index 0000000..43d6801 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/bignum.h @@ -0,0 +1,846 @@ +#ifndef RBIMPL_INTERN_BIGNUM_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_BIGNUM_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to so-called rb_cBignum. + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/backward/2/long_long.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* bignum.c */ + +/** + * Allocates a bignum object. + * + * @param[in] len Length of the bignum's backend storage, in words. + * @param[in] sign Sign of the bignum. + * @return An allocated new bignum instance. + * @note This only allocates an object, doesn't fill its value in. + * + * @internal + * + * @shyouhei finds it hard to use from extension libraries. `len` is per + * `BDIGIT` but its definition is hidden. + */ +VALUE rb_big_new(size_t len, int sign); + +/** + * Queries if the passed bignum instance is a "bigzro". What is a bigzero? + * Well, bignums are for very big integers, but can also represent tiny ones + * like -1, 0, 1. Bigzero are instances of bignums whose values are zero. + * Knowing if a bignum is bigzero can be handy on occasions, like for instance + * detecting division by zero situation. + * + * @param[in] x A bignum. + * @retval 1 It is a bigzero. + * @retval 0 Otherwise. + */ +int rb_bigzero_p(VALUE x); + +/** + * Duplicates the given bignum. + * + * @param[in] num A bignum. + * @return An allocated bignum, who is equivalent to `num`. + */ +VALUE rb_big_clone(VALUE num); + +/** + * Destructively modify the passed bignum into 2's complement representation. + * + * @note By default bignums are in signed magnitude system. + * + * @param[out] num A bignum to modify. + */ +void rb_big_2comp(VALUE num); + +/** + * Normalises the passed bignum. It for instance returns a fixnum of the same + * value if fixnum can represent that number. + * + * @param[out] x Target bignum (can be destructively modified). + * @return An integer of the identical value (can be `x` itself). + */ +VALUE rb_big_norm(VALUE x); + +/** + * Destructively resizes the backend storage of the passed bignum. + * + * @param[out] big A bignum. + * @param[in] len New length of `big`'s backend, in words. + */ +void rb_big_resize(VALUE big, size_t len); + +RBIMPL_ATTR_NONNULL(()) +/** + * Parses C's string to convert into a Ruby's integer. It understands prefixes + * (e.g. `0x`) and underscores. + * + * @param[in] str Stringised representation of the return value. + * @param[in] base Base of conversion. Must be `-36..36` inclusive, + * except `1`. `2..36` means the conversion is done + * according to it, with unmatched prefix understood + * as a part of the result. `-36..-2` means the + * conversion honours prefix when present, or use + * `-base` when absent. `0` is equivalent to `-10`. + * `-1` mandates a prefix. `1` is an error. + * @param[in] badcheck Whether to raise ::rb_eArgError on failure. If + * `0` is passed here this function can return + * `INT2FIX(0)` for parse errors. + * @exception rb_eArgError Failed to parse (and `badcheck` is truthy). + * @return An instance of ::rb_cInteger, which is a numeric interpretation + * of what is written in `str`. + * + * @internal + * + * Not sure if it intentionally accepts `base == -1` or is just buggy. Nobody + * practically uses negative bases these days. + */ +VALUE rb_cstr_to_inum(const char *str, int base, int badcheck); + +/** + * Identical to rb_cstr2inum(), except it takes Ruby's strings instead of C's. + * + * @param[in] str Stringised representation of the return + * value. + * @param[in] base Base of conversion. Must be `-36..36` + * inclusive, except `1`. `2..36` means the + * conversion is done according to it, with + * unmatched prefix understood as a part of the + * result. `-36..-2` means the conversion + * honours prefix when present, or use `-base` + * when absent. `0` is equivalent to `-10`. + * `-1` mandates a prefix. `1` is an error. + * @param[in] badcheck Whether to raise ::rb_eArgError on failure. + * If `0` is passed here this function can + * return `INT2FIX(0)` for parse errors. + * @exception rb_eArgError Failed to parse (and `badcheck` is truthy). + * @exception rb_eTypeError `str` is not a string. + * @exception rb_eEncCompatError `str` is not ASCII compatible. + * @return An instance of ::rb_cInteger, which is a numeric interpretation + * of what is written in `str`. + */ +VALUE rb_str_to_inum(VALUE str, int base, int badcheck); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_cstr_to_inum(), except the second argument controls the base + * and badcheck at once. It basically doesn't raise for parse errors, unless + * the base is zero. + * + * This is an older API. New codes might prefer rb_cstr_to_inum(). + * + * @param[in] str Stringised representation of the return value. + * @param[in] base Base of conversion. Must be `-36..36` inclusive, + * except `1`. `2..36` means the conversion is done + * according to it, with unmatched prefix understood + * as a part of the result. `-36..-2` means the + * conversion honours prefix when present, or use + * `-base` when absent. `0` is equivalent to `-10`. + * `-1` mandates a prefix. `1` is an error. + * @exception rb_eArgError Failed to parse (and `base` is zero). + * @return An instance of ::rb_cInteger, which is a numeric interpretation + * of what is written in `str`. + */ +VALUE rb_cstr2inum(const char *str, int base); + +/** + * Identical to rb_str_to_inum(), except the second argument controls the base + * and badcheck at once. It can also be seen as a routine identical to + * rb_cstr2inum(), except it takes Ruby's strings instead of C's. + * + * This is an older API. New codes might prefer rb_cstr_to_inum(). + * + * @param[in] str Stringised representation of the return + * value. + * @param[in] base Base of conversion. Must be `-36..36` + * inclusive, except `1`. `2..36` means the + * conversion is done according to it, with + * unmatched prefix understood as a part of the + * result. `-36..-2` means the conversion + * honours prefix when present, or use `-base` + * when absent. `0` is equivalent to `-10`. + * `-1` mandates a prefix. `1` is an error. + * @exception rb_eArgError Failed to parse (and `base` is zero). + * @exception rb_eTypeError `str` is not a string. + * @exception rb_eEncCompatError `str` is not ASCII compatible. + * @return An instance of ::rb_cInteger, which is a numeric interpretation + * of what is written in `str`. + */ +VALUE rb_str2inum(VALUE str, int base); + +/** + * Generates a place-value representation of the passed integer. + * + * @param[in] x An integer to stringify. + * @param[in] base `2` to `36` inclusive for each radix. + * @exception rb_eArgError `base` is out of range. + * @exception rb_eRangeError `x` is too big, cannot represent in string. + * @return An instance of ::rb_cString which represents `x`. + */ +VALUE rb_big2str(VALUE x, int base); + +/** + * Converts a bignum into C's `long`. + * + * @param[in] x A bignum. + * @exception rb_eRangeError `x` is out of range of `long`. + * @return The passed value converted into C's `long`. + */ +long rb_big2long(VALUE x); + +/** @alias{rb_big2long} */ +#define rb_big2int(x) rb_big2long(x) + +/** + * Converts a bignum into C's `unsigned long`. + * + * @param[in] x A bignum. + * @exception rb_eRangeError `x` is out of range of `unsigned long`. + * @return The passed value converted into C's `unsigned long`. + * + * @internal + * + * This function can generate a very large positive integer for a negative + * input. For instance applying Ruby's -4,611,686,018,427,387,905 to this + * function yields C's 13,835,058,055,282,163,711 on my machine. This is how + * it has been. Cannot change any longer. + */ +unsigned long rb_big2ulong(VALUE x); + +/** @alias{rb_big2long} */ +#define rb_big2uint(x) rb_big2ulong(x) + +#if HAVE_LONG_LONG +/** + * Converts a bignum into C's `long long`. + * + * @param[in] x A bignum. + * @exception rb_eRangeError `x` is out of range of `long long`. + * @return The passed value converted into C's `long long`. + */ +LONG_LONG rb_big2ll(VALUE); + +/** + * Converts a bignum into C's `unsigned long long`. + * + * @param[in] x A bignum. + * @exception rb_eRangeError `x` is out of range of `unsigned long long`. + * @return The passed value converted into C's `unsigned long long`. + * + * @internal + * + * This function can generate a very large positive integer for a negative + * input. For instance applying Ruby's -4,611,686,018,427,387,905 to this + * function yields C's 13,835,058,055,282,163,711 on my machine. This is how + * it has been. Cannot change any longer. + */ +unsigned LONG_LONG rb_big2ull(VALUE); + +#endif /* HAVE_LONG_LONG */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Converts a bignum into a series of its parts. + * + * @param[in] val An integer. + * @param[out] buf Return buffer. + * @param[in] num_longs Number of words of `buf`. + * @exception rb_eTypeError `val` doesn't respond to `#to_int`. + * @post `buf` is filled with `val`'s 2's complement representation, in + * the host CPU's native byte order, from least significant word + * towards the most significant one, for `num_longs` words. + * @note The "pack" terminology comes from `Array#pack`. + */ +void rb_big_pack(VALUE val, unsigned long *buf, long num_longs); + +RBIMPL_ATTR_NONNULL(()) +/** + * Constructs a (possibly very big) bignum from a series of integers. `buf[0]` + * would be the return value's least significant word; `buf[num_longs-1]` would + * be that of most significant. + * + * @param[in] buf A series of integers. + * @param[in] num_longs Number of words of `buf`. + * @exception rb_eArgError Result would be too big. + * @return An instance of ::rb_cInteger which is an "unpack"-ed value of + * the parameters. + * @note The "unpack" terminology comes from `String#pack`. + */ +VALUE rb_big_unpack(unsigned long *buf, long num_longs); + +/* pack.c */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Encodes a Unicode codepoint into its UTF-8 representation. + * + * @param[out] buf Return buffer, must at least be 6 bytes width. + * @param[in] uv An Unicode codepoint. + * @exception rb_eRangeError `uv` is out of Unicode. + * @return Number of bytes written to `buf` + * @post `buf` holds a UTF-8 representation of `uv`. + */ +int rb_uv_to_utf8(char buf[6], unsigned long uv); + +/* bignum.c */ + +/** + * Converts a C's `double` into a bignum. + * + * @param[in] d A value to convert. + * @exception rb_eFloatDomainError `d` is Inf/NaN. + * @return An instance of ::rb_cInteger whose value is approximately `d`. + * + * @internal + * + * @shyouhei is not sure if the result is guaranteed to be the nearest integer + * of `d`. + */ +VALUE rb_dbl2big(double d); + +/** + * Converts a bignum into C's `double`. + * + * @param[in] x A bignum. + * @return The passed value converted into C's `double`. + * + * @internal + * + * @shyouhei is not sure if the result is guaranteed to be `x`'s nearest value + * that a `double` can represent. + */ +double rb_big2dbl(VALUE x); + +/** + * Compares the passed two bignums. + * + * @param[in] lhs Comparison LHS. + * @param[in] rhs Comparison RHS. + * @retval -1 `rhs` is bigger than `lhs`. + * @retval 0 They are identical. + * @retval 1 `lhs` is bigger than `rhs`. + * @see rb_num_coerce_cmp() + */ +VALUE rb_big_cmp(VALUE lhs, VALUE rhs); + +/** + * Equality, in terms of `==`. This checks if the _value_ is the same, not the + * identity. For instance `1 == 1.0` must hold. + * + * @param[in] lhs Comparison LHS. + * @param[in] rhs Comparison RHS. + * @retval RUBY_Qtrue They are the same. + * @retval RUBY_Qfalse They are different. + */ +VALUE rb_big_eq(VALUE lhs, VALUE rhs); + +/** + * Equality, in terms of `eql?`. Unlike rb_big_eq() it does not convert + * ::rb_cFloat etc. This function returns ::RUBY_Qtrue if and only if both + * parameters are bignums, which represent the identical numerical value. + * + * @param[in] lhs Comparison LHS. + * @param[in] rhs Comparison RHS. + * @retval RUBY_Qtrue They are identical. + * @retval RUBY_Qfalse They are distinct. + */ +VALUE rb_big_eql(VALUE lhs, VALUE rhs); + +/** + * Performs addition of the passed two objects. + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x + y` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_big_plus(VALUE x, VALUE y); + +/** + * Performs subtraction of the passed two objects. + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x - y` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_big_minus(VALUE x, VALUE y); + +/** + * Performs multiplication of the passed two objects. + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x * y` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_big_mul(VALUE x, VALUE y); + +/** + * Performs division of the passed two objects. + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x / y` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_big_div(VALUE x, VALUE y); + +/** + * Performs "integer division". This is different from rb_big_div(). + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x.div y` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_big_idiv(VALUE x, VALUE y); + +/** + * Performs modulo of the passed two objects. + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x % y` evaluates to. + * @see rb_num_coerce_bin() + * + * @internal + * + * There also is `rb_big_remainder()` internally, which is different from this + * one. + */ +VALUE rb_big_modulo(VALUE x, VALUE y); + +/** + * Performs "divmod" operation. The operation in bignum's context is that it + * calculates rb_big_idiv() and rb_big_modulo() at once. + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x.divmod y` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_big_divmod(VALUE x, VALUE y); + +/** + * Raises `x` to the powerof `y`. + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x ** y` evaluates to. + * @see rb_num_coerce_bin() + * @note This can return an instance of ::rb_cFloat, even when both `x` + * and `y` are bignums. Or an instance of ::rb_cRational, when for + * instance `y` is negative. + */ +VALUE rb_big_pow(VALUE x, VALUE y); + +/** + * Performs bitwise and of the passed two objects. + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x & y` evaluates to. + * @see rb_num_coerce_bit() + */ +VALUE rb_big_and(VALUE x, VALUE y); + +/** + * Performs bitwise or of the passed two objects. + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x | y` evaluates to. + * @see rb_num_coerce_bit() + */ +VALUE rb_big_or(VALUE x, VALUE y); + +/** + * Performs exclusive or of the passed two objects. + * + * @param[in] x A bignum. + * @param[in] y Arbitrary ruby object. + * @return What `x ^ y` evaluates to. + * @see rb_num_coerce_bit() + */ +VALUE rb_big_xor(VALUE x, VALUE y); + +/** + * Performs shift left. + * + * @param[in] x A bignum. + * @param[in] y Shift amount. + * @exception rb_eTypeError `y` is not an integer. + * @exception rb_eArgError `y` is too big. + * @return `x` shifted left to `y` bits. + * @note `y` can be negative. Shifts right then. + */ +VALUE rb_big_lshift(VALUE x, VALUE y); + +/** + * Performs shift right. + * + * @param[in] x A bignum. + * @param[in] y Shift amount. + * @exception rb_eTypeError `y` is not an integer. + * @return `x` shifted right to `y` bits. + * @note This is arithmetic. Because bignums are not bitfields there is + * no shift right logical operator. + */ +VALUE rb_big_rshift(VALUE x, VALUE y); + +/** + * @name Flags for rb_integer_pack()/rb_integer_unpack() + * @{ + */ + +/** Stores/interprets the most significant word as the first word. */ +#define INTEGER_PACK_MSWORD_FIRST 0x01 + +/** Stores/interprets the least significant word as the first word. */ +#define INTEGER_PACK_LSWORD_FIRST 0x02 + +/** + * Stores/interprets the most significant byte in a word as the first byte in + * the word. + */ +#define INTEGER_PACK_MSBYTE_FIRST 0x10 + +/** + * Stores/interprets the least significant byte in a word as the first byte in + * the word. + */ +#define INTEGER_PACK_LSBYTE_FIRST 0x20 + +/** + * Means either #INTEGER_PACK_MSBYTE_FIRST or #INTEGER_PACK_LSBYTE_FIRST, + * depending on the host processor's endian. + */ +#define INTEGER_PACK_NATIVE_BYTE_ORDER 0x40 + +/** Uses 2's complement representation. */ +#define INTEGER_PACK_2COMP 0x80 + +/** Uses "generic" implementation (handy on test). */ +#define INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION 0x400 + +/** + * Always generates a bignum object even if the integer can be representable + * using fixnum scheme (unpack only) + */ +#define INTEGER_PACK_FORCE_BIGNUM 0x100 + +/** + * Interprets the input as a signed negative number (unpack only). If not + * specified returns a positive number. + */ +#define INTEGER_PACK_NEGATIVE 0x200 + +/** Little endian combination. */ +#define INTEGER_PACK_LITTLE_ENDIAN \ + (INTEGER_PACK_LSWORD_FIRST | \ + INTEGER_PACK_LSBYTE_FIRST) + +/** Big endian combination */ +#define INTEGER_PACK_BIG_ENDIAN \ + (INTEGER_PACK_MSWORD_FIRST | \ + INTEGER_PACK_MSBYTE_FIRST) + +/** @} */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Exports an integer into a buffer. This function fills the buffer specified + * by `words` and `numwords` as `val` in the format specified by `wordsize`, + * `nails` and `flags`. + * + * @param[in] val Integer or integer-like object which has + * `#to_int` method. + * @param[out] words Return buffer. + * @param[in] numwords Number of words of `words`. + * @param[in] wordsize Number of bytes per word. + * @param[in] nails Number of padding bits in a word. Most + * significant nails bits of each word are filled + * by zero. + * @param[in] flags Bitwise or of constants whose name starts + * "INTEGER_PACK_". + * @exception rb_eTypeError `val` doesn't respond to `#to_int`. + * + * Possible flags are: + * + * - #INTEGER_PACK_MSWORD_FIRST: + * Stores the most significant word as the first word. + * + * - #INTEGER_PACK_LSWORD_FIRST: + * Stores the least significant word as the first word. + * + * - #INTEGER_PACK_MSBYTE_FIRST: + * Stores the most significant byte in a word as the first byte in the + * word. + * + * - #INTEGER_PACK_LSBYTE_FIRST: + * Stores the least significant byte in a word as the first byte in the + * word. + * + * - #INTEGER_PACK_NATIVE_BYTE_ORDER: + * Either #INTEGER_PACK_MSBYTE_FIRST or #INTEGER_PACK_LSBYTE_FIRST + * corresponding to the host's endian. + * + * - #INTEGER_PACK_2COMP: + * Uses 2's complement representation. + * + * - #INTEGER_PACK_LITTLE_ENDIAN: Shorthand of + * `INTEGER_PACK_LSWORD_FIRST|INTEGER_PACK_LSBYTE_FIRST`. + * + * - #INTEGER_PACK_BIG_ENDIAN: Shorthand of + * `INTEGER_PACK_MSWORD_FIRST|INTEGER_PACK_MSBYTE_FIRST`. + * + * - #INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION: + * Uses generic implementation (for test and debug). + * + * This function fills the buffer specified by `words` as `val`'s 2's + * complement representation if #INTEGER_PACK_2COMP is specified in `flags`. + * Otherwise it fills `words` as `abs(val)` and signedness is returned via the + * return value. + * + * @return The signedness and overflow condition. The overflow condition + * depends on #INTEGER_PACK_2COMP. + * + * When #INTEGER_PACK_2COMP is not specified: + * + * - `-2` : + * Negative overflow. `val <= -2**(numwords*(wordsize*CHAR_BIT-nails))` + * + * - `-1` : + * Negative without overflow. + * `-2**(numwords*(wordsize*CHAR_BIT-nails)) < val < 0` + * + * - `0` : zero. `val == 0` + * + * - `1` : + * Positive without overflow. + * `0 < val < 2**(numwords*(wordsize*CHAR_BIT-nails))` + * + * - `2` : + * Positive overflow. `2**(numwords*(wordsize*CHAR_BIT-nails)) <= val` + * + * When #INTEGER_PACK_2COMP is specified: + * + * - `-2` : + * Negative overflow. `val < -2**(numwords*(wordsize*CHAR_BIT-nails))` + * + * - `-1` : + * Negative without overflow. + * `-2**(numwords*(wordsize*CHAR_BIT-nails)) <= val < 0` + * + * - `0` : zero. `val == 0` + * + * - `1` : + * Positive without overflow. + * `0 < val < 2**(numwords*(wordsize*CHAR_BIT-nails))` + * + * - `2` : + * Positive overflow. `2**(numwords*(wordsize*CHAR_BIT-nails)) <= val` + * + * The value, `-2**(numwords*(wordsize*CHAR_BIT-nails))`, is representable in + * 2's complement representation but not representable in absolute value. So + * `-1` is returned for the value if #INTEGER_PACK_2COMP is specified but + * returns `-2` if #INTEGER_PACK_2COMP is not specified. + * + * The least significant words are filled in the buffer when overflow occur. + */ +int rb_integer_pack(VALUE val, void *words, size_t numwords, size_t wordsize, size_t nails, int flags); + +RBIMPL_ATTR_NONNULL(()) +/** + * Import an integer from a buffer. + * + * @param[in] words Buffer to import. + * @param[in] numwords Number of words of `words`. + * @param[in] wordsize Number of bytes per word. + * @param[in] nails Number of padding bits in a word. Most + * significant nails bits of each word are ignored. + * @param[in] flags Bitwise or of constants whose name starts + * "INTEGER_PACK_". + * @exception rb_eArgError `numwords * wordsize` too big. + * + * Possible flags are: + * + * - #INTEGER_PACK_MSWORD_FIRST: + * Interpret the first word as the most significant word. + * + * - #INTEGER_PACK_LSWORD_FIRST: + * Interpret the first word as the least significant word. + * + * - #INTEGER_PACK_MSBYTE_FIRST: + * Interpret the first byte in a word as the most significant byte in the + * word. + * + * - #INTEGER_PACK_LSBYTE_FIRST: + * Interpret the first byte in a word as the least significant byte in + * the word. + * + * - #INTEGER_PACK_NATIVE_BYTE_ORDER: + * Either #INTEGER_PACK_MSBYTE_FIRST or #INTEGER_PACK_LSBYTE_FIRST + * corresponding to the host's endian. + * + * - #INTEGER_PACK_2COMP: + * Uses 2's complement representation. + * + * - #INTEGER_PACK_LITTLE_ENDIAN: Shorthand of + * `INTEGER_PACK_LSWORD_FIRST|INTEGER_PACK_LSBYTE_FIRST` + * + * - #INTEGER_PACK_BIG_ENDIAN: Shorthand of + * `INTEGER_PACK_MSWORD_FIRST|INTEGER_PACK_MSBYTE_FIRST` + * + * - #INTEGER_PACK_FORCE_BIGNUM: + * Returns a bignum even if its value is representable as a fixnum. + * + * - #INTEGER_PACK_NEGATIVE: + * Returns a non-positive value. (Returns a non-negative value if not + * specified.) + * + * - #INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION: + * Uses generic implementation (for test and debug). + * + * @return An instance of ::rb_cInteger whose value is the interpreted + * `words`. The range of the result value depends on + * #INTEGER_PACK_2COMP and #INTEGER_PACK_NEGATIVE. + * + * When #INTEGER_PACK_2COMP is not set: + * + * - `0 <= val < 2**(numwords*(wordsize*CHAR_BIT-nails))` if + * `!INTEGER_PACK_NEGATIVE` + * + * - `-2**(numwords*(wordsize*CHAR_BIT-nails)) < val <= 0` if + * `INTEGER_PACK_NEGATIVE` + * + * When #INTEGER_PACK_2COMP is set: + * + * - `-2**(numwords*(wordsize*CHAR_BIT-nails)-1)` `<= val <=` + * `2**(numwords*(wordsize*CHAR_BIT-nails)-1)-1` if + * `!INTEGER_PACK_NEGATIVE` + * + * - `-2**(numwords*(wordsize*CHAR_BIT-nails)) <= val <= -1` if + * `INTEGER_PACK_NEGATIVE` + * + * Passing #INTEGER_PACK_2COMP without #INTEGER_PACK_NEGATIVE means sign + * extension. #INTEGER_PACK_2COMP with #INTEGER_PACK_NEGATIVE means assuming + * the higher bits are `1`. + * + * Note that this function returns 0 when `numwords` is zero and + * #INTEGER_PACK_2COMP is set but #INTEGER_PACK_NEGATIVE is not set. + */ +VALUE rb_integer_unpack(const void *words, size_t numwords, size_t wordsize, size_t nails, int flags); + +/** + * Calculates the number of bytes needed to represent the absolute value of the + * passed integer. + * + * @param[in] val Integer or integer-like object which has + * `#to_int` method. + * @param[out] nlz_bits_ret Number of leading zero bits in the most + * significant byte is returned if not `NULL`. + * @exception rb_eTypeError `val` doesn't respond to `#to_int`. + * @return `((val_numbits * CHAR_BIT + CHAR_BIT - 1) / CHAR_BIT)`, where + * val_numbits is the number of bits of `abs(val)`. + * @post If `nlz_bits_ret` is not `NULL`, + * `(return_value * CHAR_BIT - val_numbits)` is stored in + * `*nlz_bits_ret`. In this case, + * `0 <= *nlz_bits_ret < CHAR_BIT`. + * + * This function should not overflow. + */ +size_t rb_absint_size(VALUE val, int *nlz_bits_ret); + +/** + * Calculates the number of words needed represent the absolute value of the + * passed integer. Unlike rb_absint_size() this function can overflow. It + * returns `(size_t)-1` then. + * + * @param[in] val Integer or integer-like object which has + * `#to_int` method. + * @param[in] word_numbits Number of bits per word. + * @param[out] nlz_bits_ret Number of leading zero bits in the most + * significant word is returned if not `NULL`. + * @exception rb_eTypeError `val` doesn't respond to `#to_int`. + * @retval (size_t)-1 Overflowed. + * @retval otherwise + `((val_numbits * CHAR_BIT + word_numbits - 1) / word_numbits)`, + * where val_numbits is the number of bits of `abs(val)`. + * @post If `nlz_bits_ret` is not `NULL` and there is no overflow, + * `(return_value * word_numbits - val_numbits)` is stored in + * `*nlz_bits_ret`. In this case, + * `0 <= *nlz_bits_ret < word_numbits.` + * + */ +size_t rb_absint_numwords(VALUE val, size_t word_numbits, size_t *nlz_bits_ret); + +/** + * Tests `abs(val)` consists only of a bit or not. + * + * @param[in] val Integer or integer-like object which has + * `#to_int` method. + * @exception rb_eTypeError `val` doesn't respond to `#to_int`. + * @retval 1 `abs(val) == 1 << n` for some `n >= 0`. + * @retval 0 Otherwise. + * + * rb_absint_singlebit_p() can be used to determine required buffer size for + * rb_integer_pack() used with #INTEGER_PACK_2COMP (two's complement). + * + * Following example calculates number of bits required to represent val in + * two's complement number, without sign bit. + * + * ```CXX + * size_t size; + * int neg = FIXNUM_P(val) ? FIX2LONG(val) < 0 : BIGNUM_NEGATIVE_P(val); + * size = rb_absint_numwords(val, 1, NULL) + * if (size == (size_t)-1) ...overflow... + * if (neg && rb_absint_singlebit_p(val)) + * size--; + * ``` + * + * Following example calculates number of bytes required to represent val in + * two's complement number, with sign bit. + * + * ```CXX + * size_t size; + * int neg = FIXNUM_P(val) ? FIX2LONG(val) < 0 : BIGNUM_NEGATIVE_P(val); + * int nlz_bits; + * size = rb_absint_size(val, &nlz_bits); + * if (nlz_bits == 0 && !(neg && rb_absint_singlebit_p(val))) + * size++; + * ``` + */ +int rb_absint_singlebit_p(VALUE val); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_BIGNUM_H */ diff --git a/libs/libruby/ruby/internal/intern/class.h b/libs/libruby/ruby/internal/intern/class.h new file mode 100644 index 0000000..0fb2d00 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/class.h @@ -0,0 +1,394 @@ +#ifndef RBIMPL_INTERN_CLASS_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_CLASS_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cClass/::rb_cModule. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/backward/2/stdarg.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* class.c */ + +/** + * Creates a new, anonymous class. + * + * @param[in] super What would become a parent class. + * @exception rb_eTypeError `super` is not something inheritable. + * @return An anonymous class that inherits `super`. + */ +VALUE rb_class_new(VALUE super); + +/** + * The comment that comes with this function says `:nodoc:`. Not sure what + * that means though. + * + * @param[out] clone Destination object. + * @param[in] orig Source object. + * @exception rb_eTypeError Cannot copy `orig`. + * @return The passed `clone`. + */ +VALUE rb_mod_init_copy(VALUE clone, VALUE orig); + +/** + * Asserts that the given class can derive a child class. A class might or + * might not be able to do so; for instance a singleton class cannot. + * + * @param[in] super Possible super class. + * @exception rb_eTypeError No it cannot. + * @post Upon successful return `super` can derive. + */ +void rb_check_inheritable(VALUE super); + +/** + * This is a very badly designed API that creates an anonymous class. + * + * @param[in] id Discarded for no reason (why...). + * @param[in] super What would become a parent class. 0 means + * ::rb_cObject. + * @exception rb_eTypeError `super` is not something inheritable. + * @return An anonymous class that inherits `super`. + * @warning You must explicitly name the return value. + */ +VALUE rb_define_class_id(ID id, VALUE super); + +/** + * Identical to rb_define_class_under(), except it takes the name in ::ID + * instead of C's string. + * + * @param[out] outer A class which contains the new class. + * @param[in] id Name of the new class + * @param[in] super A class from which the new class will derive. + * 0 means ::rb_cObject. + * @exception rb_eTypeError The constant name `id` is already taken but the + * constant is not a class. + * @exception rb_eTypeError The class is already defined but the class can + * not be reopened because its superclass is not + * `super`. + * @exception rb_eArgError `super` is NULL. + * @return The created class. + * @post `outer::id` refers the returned class. + * @note If a class named `id` is already defined and its superclass is + * `super`, the function just returns the defined class. + * @note The compaction GC does not move classes returned by this + * function. + */ +VALUE rb_define_class_id_under(VALUE outer, ID id, VALUE super); + +/** + * Creates a new, anonymous module. + * + * @return An anonymous module. + */ +VALUE rb_module_new(void); + + +/** + * Creates a new, anonymous refinement. + * + * @return An anonymous refinement. + */ +VALUE rb_refinement_new(void); + +/** + * This is a very badly designed API that creates an anonymous module. + * + * @param[in] id Discarded for no reason (why...). + * @return An anonymous module. + * @warning You must explicitly name the return value. + */ +VALUE rb_define_module_id(ID id); + +/** + * Identical to rb_define_module_under(), except it takes the name in ::ID + * instead of C's string. + * + * @param[out] outer A class which contains the new module. + * @param[in] id Name of the new module + * @exception rb_eTypeError The constant name `id` is already taken but the + * constant is not a module. + * @return The created module. + * @post `outer::id` refers the returned module. + * @note The compaction GC does not move classes returned by this + * function. + */ +VALUE rb_define_module_id_under(VALUE outer, ID id); + +/** + * Queries the list of included modules. It can also be seen as a routine to + * first call rb_mod_ancestors(), then rejects non-modules from the return + * value. + * + * @param[in] mod Class or Module. + * @return An array of modules that are either included or prepended in any + * of `mod`'s ancestry tree (including itself). + */ +VALUE rb_mod_included_modules(VALUE mod); + +/** + * Queries if the passed module is included by the module. It can also be seen + * as a routine to first call rb_mod_included_modules(), then see if the return + * value contains the passed module. + * + * @param[in] child A Module. + * @param[in] parent Another Module. + * @exception rb_eTypeError `child` is not an instance of ::rb_cModule. + * @retval RUBY_Qtrue `parent` is either included or prepended in any + * of `child`'s ancestry tree (including itself). + * @return RUBY_Qfalse Otherwise. + */ +VALUE rb_mod_include_p(VALUE child, VALUE parent); + +/** + * Queries the module's ancestors. This routine gathers classes and modules + * that the passed module either inherits, includes, or prepends, then + * recursively applies that routine again and again to the collected entries + * until the list doesn't grow up. + * + * @param[in] mod A module or a class. + * @return An array of classes or modules that `mod` possibly recursively + * inherits, includes, or prepends. + * + * @internal + * + * Above description is written in a recursive language but in practice it + * computes the return value iteratively. + */ +VALUE rb_mod_ancestors(VALUE mod); + +/** + * Queries the class's descendants. This routine gathers classes that are + * subclasses of the given class (or subclasses of those subclasses, etc.), + * returning an array of classes that have the given class as an ancestor. + * The returned array does not include the given class or singleton classes. + * + * @param[in] klass A class. + * @return An array of classes where `klass` is an ancestor. + * + * @internal + */ +VALUE rb_class_descendants(VALUE klass); + +/** + * Queries the class's direct descendants. This routine gathers classes that are + * direct subclasses of the given class, + * returning an array of classes that have the given class as a superclass. + * The returned array does not include singleton classes. + * + * @param[in] klass A class. + * @return An array of classes where `klass` is the `superclass`. + * + * @internal + */ +VALUE rb_class_subclasses(VALUE klass); + + +/** + * Returns the attached object for a singleton class. + * If the given class is not a singleton class, raises a TypeError. + * + * @param[in] klass A class. + * @return The object which has the singleton class `klass`. + * + * @internal + */ +VALUE rb_class_attached_object(VALUE klass); + +/** + * Generates an array of symbols, which are the list of method names defined in + * the passed class. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Array of at most one object, which controls (if + * any) whether the return array includes the names + * of methods defined in ancestors or not. + * @param[in] mod A module or a class. + * @exception rb_eArgError `argc` out of range. + * @return An array of symbols collecting names of instance methods that + * are not private, defined at `mod`. + */ +VALUE rb_class_instance_methods(int argc, const VALUE *argv, VALUE mod); + +/** + * Identical to rb_class_instance_methods(), except it returns names of methods + * that are public only. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Array of at most one object, which controls (if + * any) whether the return array includes the names + * of methods defined in ancestors or not. + * @param[in] mod A module or a class. + * @exception rb_eArgError `argc` out of range. + * @return An array of symbols collecting names of instance methods that + * are public, defined at `mod`. + */ +VALUE rb_class_public_instance_methods(int argc, const VALUE *argv, VALUE mod); + +/** + * Identical to rb_class_instance_methods(), except it returns names of methods + * that are protected only. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Array of at most one object, which controls (if + * any) whether the return array includes the names + * of methods defined in ancestors or not. + * @param[in] mod A module or a class. + * @exception rb_eArgError `argc` out of range. + * @return An array of symbols collecting names of instance methods that + * are protected, defined at `mod`. + */ +VALUE rb_class_protected_instance_methods(int argc, const VALUE *argv, VALUE mod); + +/** + * Identical to rb_class_instance_methods(), except it returns names of methods + * that are private only. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Array of at most one object, which controls (if + * any) whether the return array includes the names + * of methods defined in ancestors or not. + * @param[in] mod A module or a class. + * @exception rb_eArgError `argc` out of range. + * @return An array of symbols collecting names of instance methods that + * are protected, defined at `mod`. + */ +VALUE rb_class_private_instance_methods(int argc, const VALUE *argv, VALUE mod); + +/** + * Identical to rb_class_instance_methods(), except it returns names of + * singleton methods instead of instance methods. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Array of at most one object, which controls (if + * any) whether the return array includes the names + * of methods defined in ancestors or not. + * @param[in] obj Arbitrary ruby object. + * @exception rb_eArgError `argc` out of range. + * @return An array of symbols collecting names of instance methods that + * are not private, defined at the singleton class of `obj`. + */ +VALUE rb_obj_singleton_methods(int argc, const VALUE *argv, VALUE obj); + +/** + * Identical to rb_define_method(), except it takes the name of the method in + * ::ID instead of C's string. + * + * @param[out] klass A module or a class. + * @param[in] mid Name of the function. + * @param[in] func The method body. + * @param[in] arity The number of parameters. See @ref defmethod. + * @note There are in fact 18 different prototypes for func. + * @see ::ruby::backward::cxxanyargs::define_method::rb_define_method_id + */ +void rb_define_method_id(VALUE klass, ID mid, VALUE (*func)(ANYARGS), int arity); + +/* vm_method.c */ + +/** + * Inserts a method entry that hides previous method definition of the given + * name. This is not a deletion of a method. Method of the same name defined + * in a parent class is kept invisible in this way. + * + * @param[out] mod The module to insert an undef. + * @param[in] mid Name of the undef. + * @exception rb_eTypeError `klass` is a non-module. + * @exception rb_eFrozenError `klass` is frozen. + * @exception rb_eNameError No such method named `klass#name`. + * @post `klass#name` is undefined. + * @see rb_undef_method + * + * @internal + * + * @shyouhei doesn't understand why this is not the ::ID -taking variant of + * rb_undef_method(), given rb_remove_method() has its ::ID -taking counterpart + * named rb_remove_method_id(). + */ +void rb_undef(VALUE mod, ID mid); + +/* class.c */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_define_method(), except it defines a protected method. + * + * @param[out] klass A module or a class. + * @param[in] mid Name of the function. + * @param[in] func The method body. + * @param[in] arity The number of parameters. See @ref defmethod. + * @note There are in fact 18 different prototypes for func. + * @see ::ruby::backward::cxxanyargs::define_method::rb_define_protected_method + */ +void rb_define_protected_method(VALUE klass, const char *mid, VALUE (*func)(ANYARGS), int arity); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_define_method(), except it defines a private method. + * + * @param[out] klass A module or a class. + * @param[in] mid Name of the function. + * @param[in] func The method body. + * @param[in] arity The number of parameters. See @ref defmethod. + * @note There are in fact 18 different prototypes for func. + * @see ::ruby::backward::cxxanyargs::define_method::rb_define_protected_method + */ +void rb_define_private_method(VALUE klass, const char *mid, VALUE (*func)(ANYARGS), int arity); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_define_method(), except it defines a singleton method. + * + * @param[out] obj Arbitrary ruby object. + * @param[in] mid Name of the function. + * @param[in] func The method body. + * @param[in] arity The number of parameters. See @ref defmethod. + * @note There are in fact 18 different prototypes for func. + * @see ::ruby::backward::cxxanyargs::define_method::rb_define_singleton_method + */ +void rb_define_singleton_method(VALUE obj, const char *mid, VALUE(*func)(ANYARGS), int arity); + +/** + * Finds or creates the singleton class of the passed object. + * + * @param[out] obj Arbitrary ruby object. + * @exception rb_eTypeError `obj` cannot have its singleton class. + * @return A (possibly newly allocated) instance of ::rb_cClass. + * @post `obj` has its singleton class, which is the return value. + * @post In case `obj` is a class, the returned singleton class also has + * its own singleton class in order to keep consistency of the + * inheritance structure of metaclasses. + * @note A new singleton class will be created if `obj` did not have + * one. + * @note The singleton classes for ::RUBY_Qnil, ::RUBY_Qtrue, and + * ::RUBY_Qfalse are ::rb_cNilClass, ::rb_cTrueClass, and + * ::rb_cFalseClass respectively. + * + * @internal + * + * You can _create_ a singleton class of a frozen object. Intentional or ...? + * + * Nowadays there are wider range of objects who cannot have singleton classes + * than before. For instance some string instances cannot for some reason. + */ +VALUE rb_singleton_class(VALUE obj); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_CLASS_H */ diff --git a/libs/libruby/ruby/internal/intern/compar.h b/libs/libruby/ruby/internal/intern/compar.h new file mode 100644 index 0000000..dc3b377 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/compar.h @@ -0,0 +1,62 @@ +#ifndef RBIMPL_INTERN_COMPAR_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_COMPAR_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_mComparable. + */ +#include "ruby/internal/attr/cold.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* bignum.c */ + +/** + * Canonicalises the passed `val`, which is the return value of `a <=> b`, into + * C's `{-1, 0, 1}`. This can be handy when you implement a callback function + * to pass to `qsort(3)` etc. + * + * @param[in] val Return value of a space ship operator. + * @param[in] a Comparison LHS. + * @param[in] b Comparison RHS. + * @exception rb_eArgError `a` and `b` are not comparable each other. + * @retval -1 `val` is less than zero. + * @retval 0 `val` is equal to zero. + * @retval 1 `val` is greater than zero. + */ +int rb_cmpint(VALUE val, VALUE a, VALUE b); + +/* compar.c */ + +RBIMPL_ATTR_COLD() +RBIMPL_ATTR_NORETURN() +/** + * Raises "comparison failed" error. + * + * @param[in] a Comparison LHS. + * @param[in] b Comparison RHS. + * @exception rb_eArgError `a` and `b` are not comparable each other. + */ +void rb_cmperr(VALUE a, VALUE b); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_COMPAR_H */ diff --git a/libs/libruby/ruby/internal/intern/complex.h b/libs/libruby/ruby/internal/intern/complex.h new file mode 100644 index 0000000..e111bd8 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/complex.h @@ -0,0 +1,253 @@ +#ifndef RBIMPL_INTERN_COMPLEX_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_COMPLEX_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cComplex. + */ +#include "ruby/internal/attr/deprecated.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/arithmetic/long.h" /* INT2FIX is here. */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* complex.c */ + +/** + * Identical to rb_complex_new(), except it assumes both arguments are not + * instances of ::rb_cComplex. It is thus dangerous for extension libraries. + * + * @param[in] real Real part, in any numeric except Complex. + * @param[in] imag Imaginary part, in any numeric except Complex. + * @return An instance of ::rb_cComplex whose value is `real + (imag)i`. + */ +VALUE rb_complex_raw(VALUE real, VALUE imag); + +/** + * Shorthand of `x+0i`. It practically converts `x` into a Complex of the + * identical value. + * + * @param[in] x Any numeric except Complex. + * @return An instance of ::rb_cComplex, whose value is `x + 0i`. + */ +#define rb_complex_raw1(x) rb_complex_raw((x), INT2FIX(0)) + +/** @alias{rb_complex_raw} */ +#define rb_complex_raw2(x,y) rb_complex_raw((x), (y)) + +/** + * Constructs a Complex, by first multiplying the imaginary part with `1i` then + * adds it to the real part. This definition doesn't need both arguments be + * real numbers. It can happily combine two instances of ::rb_cComplex (with + * rotating the latter one). + * + * @param[in] real An instance of ::rb_cNumeric. + * @param[in] imag Another instance of ::rb_cNumeric. + * @return An instance of ::rb_cComplex whose value is `imag * 1i + real`. + */ +VALUE rb_complex_new(VALUE real, VALUE imag); + +/** + * Shorthand of `x+0i`. It practically converts `x` into a Complex of the + * identical value. + * + * @param[in] x Any numeric value. + * @return An instance of ::rb_cComplex, whose value is `x + 0i`. + */ +#define rb_complex_new1(x) rb_complex_new((x), INT2FIX(0)) + +/** @alias{rb_complex_new} */ +#define rb_complex_new2(x,y) rb_complex_new((x), (y)) + +/** + * Constructs a Complex using polar representations. Unlike rb_complex_new() + * it makes no sense to pass non-real instances to this function. + * + * @param[in] abs Magnitude, in any numeric except Complex. + * @param[in] arg Angle, in radians, in any numeric except Complex. + * @return An instance of ::rb_cComplex which denotes the given polar + * coordinates. + */ +VALUE rb_complex_new_polar(VALUE abs, VALUE arg); + +RBIMPL_ATTR_DEPRECATED(("by: rb_complex_new_polar")) +/** @old{rb_complex_new_polar} */ +VALUE rb_complex_polar(VALUE abs, VALUE arg); + +RBIMPL_ATTR_PURE() +/** + * Queries the real part of the passed Complex. + * + * @param[in] z An instance of ::rb_cComplex. + * @return Its real part, which is an instance of ::rb_cNumeric. + */ +VALUE rb_complex_real(VALUE z); + +RBIMPL_ATTR_PURE() +/** + * Queries the imaginary part of the passed Complex. + * + * @param[in] z An instance of ::rb_cComplex. + * @return Its imaginary part, which is an instance of ::rb_cNumeric. + */ +VALUE rb_complex_imag(VALUE z); + +/** + * Performs addition of the passed two objects. + * + * @param[in] x An instance of ::rb_cComplex. + * @param[in] y Arbitrary ruby object. + * @return What `x + y` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_complex_plus(VALUE x, VALUE y); + +/** + * Performs subtraction of the passed two objects. + * + * @param[in] x An instance of ::rb_cComplex. + * @param[in] y Arbitrary ruby object. + * @return What `x - y` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_complex_minus(VALUE x, VALUE y); + +/** + * Performs multiplication of the passed two objects. + * + * @param[in] x An instance of ::rb_cComplex. + * @param[in] y Arbitrary ruby object. + * @return What `x * y` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_complex_mul(VALUE x, VALUE y); + +/** + * Performs division of the passed two objects. + * + * @param[in] x An instance of ::rb_cComplex. + * @param[in] y Arbitrary ruby object. + * @return What `x / y` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_complex_div(VALUE x, VALUE y); + +/** + * Performs negation of the passed object. + * + * @param[in] z An instance of ::rb_cComplex. + * @return What `-z` evaluates to. + */ +VALUE rb_complex_uminus(VALUE z); + +/** + * Performs complex conjugation of the passed object. + * + * @param[in] z An instance of ::rb_cComplex. + * @return Its complex conjugate, in ::rb_cComplex. + */ +VALUE rb_complex_conjugate(VALUE z); + +/** + * Queries the absolute (or the magnitude) of the passed object. + * + * @param[in] z An instance of ::rb_cComplex. + * @return Its magnitude, in ::rb_cFloat. + */ +VALUE rb_complex_abs(VALUE z); + +/** + * Queries the argument (or the angle) of the passed object. + * + * @param[in] z An instance of ::rb_cComplex. + * @return Its magnitude, in ::rb_cFloat. + */ +VALUE rb_complex_arg(VALUE z); + +/** + * Performs exponentiation of the passed two objects. + * + * @param[in] base An instance of ::rb_cComplex. + * @param[in] exp Arbitrary ruby object. + * @return What `base ** exp` evaluates to. + * @see rb_num_coerce_bin() + */ +VALUE rb_complex_pow(VALUE base, VALUE exp); + +/** + * Identical to rb_complex_new(), except it takes the arguments as C's double + * instead of Ruby's object. + * + * @param[in] real Real part. + * @param[in] imag Imaginary part. + * @return An instance of ::rb_cComplex whose value is `real + (imag)i`. + */ +VALUE rb_dbl_complex_new(double real, double imag); + +/** @alias{rb_complex_plus} */ +#define rb_complex_add rb_complex_plus + +/** @alias{rb_complex_minus} */ +#define rb_complex_sub rb_complex_minus + +/** @alias{rb_complex_uminus} */ +#define rb_complex_nagate rb_complex_uminus + +/** + * Converts various values into a Complex. This function accepts: + * + * - Instances of ::rb_cComplex (taken as-is), + * - Instances of ::rb_cNumeric (adds `0i`), + * - Instances of ::rb_cString (parses), + * - Other objects that respond to `#to_c`. + * + * It (possibly recursively) applies `#to_c` until both sides become a Complex + * value, then computes `imag * 1i + real`. + * + * As a special case, passing ::RUBY_Qundef to `imag` is the same as passing + * `RB_INT2NUM(0)`. + * + * @param[in] real Real part (see above). + * @param[in] imag Imaginary part (see above). + * @exception rb_eTypeError Passed something not described above. + * @return An instance of ::rb_cComplex whose value is `1i * imag + real`. + * + * @internal + * + * This was the implementation of `Kernel#Complex` before, but they diverged. + */ +VALUE rb_Complex(VALUE real, VALUE imag); + +/** + * Shorthand of `x+0i`. It practically converts `x` into a Complex of the + * identical value. + * + * @param[in] x ::rb_cNumeric, ::rb_cString, or something that responds to + * `#to_c`. + * @return An instance of ::rb_cComplex, whose value is `x + 0i`. + */ +#define rb_Complex1(x) rb_Complex((x), INT2FIX(0)) + +/** @alias{rb_Complex} */ +#define rb_Complex2(x,y) rb_Complex((x), (y)) + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_COMPLEX_H */ diff --git a/libs/libruby/ruby/internal/intern/cont.h b/libs/libruby/ruby/internal/intern/cont.h new file mode 100644 index 0000000..32647f4 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/cont.h @@ -0,0 +1,282 @@ +#ifndef RBIMPL_INTERN_CONT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_CONT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to rb_cFiber. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/iterator.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* cont.c */ + +/** + * Creates a Fiber instance from a C-backended block. + * + * @param[in] func A function, to become the fiber's body. + * @param[in] callback_obj Passed as-is to `func`. + * @return An allocated new instance of rb_cFiber, which is ready to be + * "resume"d. + */ +VALUE rb_fiber_new(rb_block_call_func_t func, VALUE callback_obj); + +/** + * Creates a Fiber instance from a C-backended block with the specified + * storage. + * + * If the given storage is Qundef or Qtrue, this function is equivalent to + * rb_fiber_new() which inherits storage from the current fiber. + * + * Specifying Qtrue is experimental and may be changed in the future. + * + * If the given storage is Qnil, this function will lazy initialize the + * internal storage which starts of empty (without any inheritance). + * + * Otherwise, the given storage is used as the internal storage. + * + * @param[in] func A function, to become the fiber's body. + * @param[in] callback_obj Passed as-is to `func`. + * @param[in] storage The way to set up the storage for the fiber. + * @return An allocated new instance of rb_cFiber, which is ready to be + * "resume"d. + */ +VALUE rb_fiber_new_storage(rb_block_call_func_t func, VALUE callback_obj, VALUE storage); + +/** + * Queries the fiber which is calling this function. Any ruby execution + * context has its fiber, either explicitly or implicitly. + * + * @return The current fiber. + */ +VALUE rb_fiber_current(void); + +/** + * Queries the liveness of the passed fiber. "Alive" in this context means + * that the fiber can still be resumed. Once it reaches is its end of + * execution, this function returns ::RUBY_Qfalse. + * + * @param[in] fiber A target fiber. + * @retval RUBY_Qtrue It is. + * @retval RUBY_Qfalse It isn't. + */ +VALUE rb_fiber_alive_p(VALUE fiber); + +/** + * Queries if an object is a fiber. + * + * @param[in] obj Arbitrary ruby object. + * @retval RUBY_Qtrue It is. + * @retval RUBY_Qfalse It isn't. + */ +VALUE rb_obj_is_fiber(VALUE obj); + +/** + * Resumes the execution of the passed fiber, either from the point at which + * the last rb_fiber_yield() was called if any, or at the beginning of the + * fiber body if it is the first call to this function. + * + * Other arguments are passed into the fiber's body, either as return values of + * rb_fiber_yield() in case it switches to there, or as the block parameter of + * the fiber body if it switches to the beginning of the fiber. + * + * The return value of this function is either the value passed to previous + * rb_fiber_yield() call, or the ultimate evaluated value of the entire fiber + * body if the execution reaches the end of it. + * + * When an exception happens inside of a fiber it propagates to this function. + * + * ```ruby + * f = Fiber.new do |i| + * puts " =>> #{i}" + * puts " <-- #{i + 1}" + * j = Fiber.yield(i + 1) + * puts " =>> #{j}" + * puts " <-- #{j + 1}" + * next j + 1 + * end + * + * puts "[a] <-- 1" + * p = f.resume(1) + * puts "[b] =>> #{p}" + * puts "[c] <-- #{p + 1}" + * q = f.resume(p + 1) + * puts "[d] =>> #{q}" + * ``` + * + * Above program executes in `[a] [b] [c] [d]`. + * + * @param[out] fiber The fiber to resume. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Passed (somehow) to `fiber`. + * @exception rb_eFiberError `fib` is terminated etc. + * @exception rb_eException Any exceptions happen in `fiber`. + * @return (See above) + * @note This function _does_ return. + * + * @internal + * + * @shyouhei expected this function to raise ::rb_eFrozenError for frozen + * fibers but it doesn't in practice. Intentional or ...? + */ +VALUE rb_fiber_resume(VALUE fiber, int argc, const VALUE *argv); + +/** + * Identical to rb_fiber_resume(), except you can specify how to handle the + * last element of the given array. + * + * @param[out] fiber The fiber to resume. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Passed (somehow) to `fiber`. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eFiberError `fiber` is terminated etc. + * @exception rb_eException Any exceptions happen in `fiber`. + * @return Either what was yielded or the last value of the fiber body. + */ +VALUE rb_fiber_resume_kw(VALUE fiber, int argc, const VALUE *argv, int kw_splat); + +/** + * Yields the control back to the point where the current fiber was resumed. + * The passed objects would be the return value of rb_fiber_resume(). This + * fiber then suspends its execution until next time it is resumed. + * + * This function can also raise arbitrary exceptions injected from outside of + * the fiber using rb_fiber_raise(). + * + * ```ruby + * exc = Class.new Exception + * + * f = Fiber.new do + * Fiber.yield + * rescue exc => e + * puts e.message + * end + * + * f.resume + * f.raise exc, "Hi!" + * ``` + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Passed to rb_fiber_resume(). + * @exception rb_eException (See above) + * @return (See rb_fiber_resume() for details) + */ +VALUE rb_fiber_yield(int argc, const VALUE *argv); + +/** + * Identical to rb_fiber_yield(), except you can specify how to handle the last + * element of the given array. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Passed to rb_fiber_resume(). + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eException What was raised using `Fiber#raise`. + * @return (See rb_fiber_resume() for details) + */ +VALUE rb_fiber_yield_kw(int argc, const VALUE *argv, int kw_splat); + +/** + * Transfers control to another fiber, resuming it from where it last stopped + * or starting it if it was not resumed before. The calling fiber will be + * suspended much like in a call to rb_fiber_yield(). + * + * The fiber which receives the transfer call treats it much like a resume + * call. Arguments passed to transfer are treated like those passed to resume. + * + * The two style of control passing to and from fiber (one is rb_fiber_resume() + * and rb_fiber_yield(), another is rb_fiber_transfer() to and from fiber) + * can't be freely mixed. + * + * - If the Fiber's lifecycle had started with transfer, it will never be + * able to yield or be resumed control passing, only finish or transfer + * back. (It still can resume other fibers that are allowed to be + * resumed.) + * + * - If the Fiber's lifecycle had started with resume, it can yield or + * transfer to another Fiber, but can receive control back only the way + * compatible with the way it was given away: if it had transferred, it + * only can be transferred back, and if it had yielded, it only can be + * resumed back. After that, it again can transfer or yield. + * + * If those rules are broken, rb_eFiberError is raised. + * + * For an individual Fiber design, yield/resume is easier to use (the Fiber + * just gives away control, it doesn't need to think about who the control is + * given to), while transfer is more flexible for complex cases, allowing to + * build arbitrary graphs of Fibers dependent on each other. + * + * @param[out] fiber Explicit control destination. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Passed to rb_fiber_resume(). + * @exception rb_eFiberError (See above) + * @exception rb_eException What was raised using `Fiber#raise`. + * @return (See rb_fiber_resume() for details) + */ +VALUE rb_fiber_transfer(VALUE fiber, int argc, const VALUE *argv); + +/** + * Identical to rb_fiber_transfer(), except you can specify how to handle the + * last element of the given array. + * + * @param[out] fiber Explicit control destination. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Passed to rb_fiber_resume(). + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eFiberError (See above) + * @exception rb_eException What was raised using `Fiber#raise`. + * @return (See rb_fiber_resume() for details) + */ +VALUE rb_fiber_transfer_kw(VALUE fiber, int argc, const VALUE *argv, int kw_splat); + +/** + * Identical to rb_fiber_resume() but instead of resuming normal execution of + * the passed fiber, it raises the given exception in it. From inside of the + * fiber this would be seen as if rb_fiber_yield() raised. + * + * This function does return in case the passed fiber gracefully handled the + * passed exception. But if it does not, the raised exception propagates out + * of the passed fiber; this function then does not return. + * + * Parameters are passed to rb_make_exception() to create an exception object. + * See its document for what are allowed here. + * + * It is a failure to call this function against a fiber which is resuming, + * have never run yet, or has already finished running. + * + * @param[out] fiber Where exception is raised. + * @param[in] argc Passed as-is to rb_make_exception(). + * @param[in] argv Passed as-is to rb_make_exception(). + * @exception rb_eFiberError `fiber` is terminated etc. + * @return (See rb_fiber_resume() for details) + */ +VALUE rb_fiber_raise(VALUE fiber, int argc, const VALUE *argv); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_CONT_H */ diff --git a/libs/libruby/ruby/internal/intern/dir.h b/libs/libruby/ruby/internal/intern/dir.h new file mode 100644 index 0000000..da1873e --- /dev/null +++ b/libs/libruby/ruby/internal/intern/dir.h @@ -0,0 +1,42 @@ +#ifndef RBIMPL_INTERN_DIR_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_DIR_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cDir. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* dir.c */ + +/** + * Queries the path of the current working directory of the current process. + * + * @return An instance of ::rb_cString that holds the working directory. + * @note The returned string is in "filesystem" encoding. Most notably on + * Linux this is an alias of default external encoding. Most notably + * on Windows it can be an alias of OS codepage. + */ +VALUE rb_dir_getwd(void); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_DIR_H */ diff --git a/libs/libruby/ruby/internal/intern/enum.h b/libs/libruby/ruby/internal/intern/enum.h new file mode 100644 index 0000000..215ad82 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/enum.h @@ -0,0 +1,73 @@ +#ifndef RBIMPL_INTERN_ENUM_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_ENUM_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_mEnumerable. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* enum.c */ + +/** + * Basically identical to rb_ary_new_form_values(), except it returns something + * different when `argc` < 2. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arbitrary objects. + * @retval RUBY_Qnil `argc` is zero. + * @retval argv[0] `argc` is one. + * @retval otherwise Otherwise. + * + * @internal + * + * What is this business? Well, this function is about `yield`'s taking + * multiple values. Consider following user-defined class: + * + * ```ruby + * class Foo + * include Enumerable + * + * def each + * yield :q, :w, :e, :r + * end + * end + * + * Foo.new.each_with_object([]) do |i, j| + * j << i # ^^^ <- What to expect for `i`? + * end + * ``` + * + * Here, `Foo#each_with_object` is in fact `Enumerable#each_with_object`, which + * doesn't know what would be yielded. Yet, it has to take a block of arity 2. + * This function is used here, to "pack" arbitrary number of yielded objects + * into one. + * + * If people want to implement their own `Enumerable#each_with_object` this API + * can be handy. Though @shyouhei suspects it is relatively rare for 3rd party + * extension libraries to have such things. Also `Enumerable#each_entry` is + * basically this function exposed as a Ruby method. + */ +VALUE rb_enum_values_pack(int argc, const VALUE *argv); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_ENUM_H */ diff --git a/libs/libruby/ruby/internal/intern/enumerator.h b/libs/libruby/ruby/internal/intern/enumerator.h new file mode 100644 index 0000000..20e5d7c --- /dev/null +++ b/libs/libruby/ruby/internal/intern/enumerator.h @@ -0,0 +1,259 @@ +#ifndef RBIMPL_INTERN_ENUMERATOR_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_ENUMERATOR_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cEnumerator. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/intern/eval.h" /* rb_frame_this_func */ +#include "ruby/internal/iterator.h" /* rb_block_given_p */ +#include "ruby/internal/symbol.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * This is the type of functions that rb_enumeratorize_with_size() expects. In + * theory an enumerator can have indefinite number of elements, but in practice + * it often is the case we can compute the size of an enumerator beforehand. + * If your enumerator has such property, supply a function that calculates such + * values. + * + * @param[in] recv The original receiver of the enumerator. + * @param[in] argv Arguments passed to `Object#enum_for` etc. + * @param[in] eobj The enumerator object. + * @return The size of `eobj`, in ::rb_cNumeric, or ::RUBY_Qnil if the size + * is not known until we actually iterate. + */ +typedef VALUE rb_enumerator_size_func(VALUE recv, VALUE argv, VALUE eobj); + +/** + * Decomposed `Enumerator::ArithmeicSequence`. This is a subclass of + * ::rb_cEnumerator, which represents a sequence of numbers with common + * difference. Internal data structure of the class is opaque to users, but + * you can obtain a decomposed one using rb_arithmetic_sequence_extract(). + */ +typedef struct { + VALUE begin; /**< "Left" or "lowest" endpoint of the sequence. */ + VALUE end; /**< "Right" or "highest" endpoint of the sequence.*/ + VALUE step; /**< Step between a sequence. */ + int exclude_end; /**< Whether the endpoint is open or closed. */ +} rb_arithmetic_sequence_components_t; + +/* enumerator.c */ + +/** + * Constructs an enumerator. This roughly resembles `Object#enum_for`. + * + * @param[in] recv A receiver of `meth`. + * @param[in] meth Method ID in a symbol object. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arguments passed to `meth`. + * @exception rb_eTypeError `meth` is not an instance of ::rb_cSymbol. + * @return A new instance of ::rb_cEnumerator which, when yielded, + * enumerates by calling `meth` on `recv` with `argv`. + */ +VALUE rb_enumeratorize(VALUE recv, VALUE meth, int argc, const VALUE *argv); + +/** + * Identical to rb_enumeratorize(), except you can additionally specify the + * size function of return value. + * + * @param[in] recv A receiver of `meth`. + * @param[in] meth Method ID in a symbol object. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arguments passed to `meth`. + * @param[in] func Size calculator. + * @exception rb_eTypeError `meth` is not an instance of ::rb_cSymbol. + * @return A new instance of ::rb_cEnumerator which, when yielded, + * enumerates by calling `meth` on `recv` with `argv`. + * @note `func` can be zero, which means the size is unknown. + */ +VALUE rb_enumeratorize_with_size(VALUE recv, VALUE meth, int argc, const VALUE *argv, rb_enumerator_size_func *func); + +/** + * Identical to rb_enumeratorize_with_func(), except you can specify how to + * handle the last element of the given array. + * + * @param[in] recv A receiver of `meth`. + * @param[in] meth Method ID in a symbol object. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arguments passed to `meth`. + * @param[in] func Size calculator. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eTypeError `meth` is not an instance of ::rb_cSymbol. + * @return A new instance of ::rb_cEnumerator which, when yielded, + * enumerates by calling `meth` on `recv` with `argv`. + * @note `func` can be zero, which means the size is unknown. + */ +VALUE rb_enumeratorize_with_size_kw(VALUE recv, VALUE meth, int argc, const VALUE *argv, rb_enumerator_size_func *func, int kw_splat); + +RBIMPL_ATTR_NONNULL(()) +/** + * Extracts components of the passed arithmetic sequence. This can be seen as + * an extended version of rb_range_values(). + * + * @param[in] as Target instance of `Enumerator::ArithmericSequence`. + * @param[out] buf Decomposed results buffer. + * @return 0 `as` is not `Enumerator::ArithmericSequence`. + * @return 1 Success. + * @post `buf` is filled. + */ +int rb_arithmetic_sequence_extract(VALUE as, rb_arithmetic_sequence_components_t *buf); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_range_beg_len(), except it takes an instance of + * `Enumerator::ArithmericSequence`. + * + * @param[in] as An `Enumerator::ArithmericSequence` instance. + * @param[out] begp Return value buffer. + * @param[out] lenp Return value buffer. + * @param[out] stepp Return value buffer. + * @param[in] len Updated length. + * @param[in] err In case `len` is out of range... + * - `0`: returns ::RUBY_Qnil. + * - `1`: raises ::rb_eRangeError. + * - `2`: `beg` and `len` expanded accordingly. + * @exception rb_eRangeError `as` cannot fit into `long`. + * @retval RUBY_Qfalse `as` is not `Enumerator::ArithmericSequence`. + * @retval RUBY_Qnil `len` is out of `as` but `err` is zero. + * @retval RUBY_Qtrue Otherwise. + * @post `beg` is the (possibly updated) left endpoint. + * @post `len` is the (possibly updated) length of the range. + * + * @internal + * + * Currently no 3rd party applications of this function is found. But that can + * be because this function is relatively new. + */ +VALUE rb_arithmetic_sequence_beg_len_step(VALUE as, long *begp, long *lenp, long *stepp, long len, int err); + +RBIMPL_SYMBOL_EXPORT_END() + +/** @cond INTERNAL_MACRO */ +#ifndef RUBY_EXPORT +# define rb_enumeratorize_with_size(obj, id, argc, argv, size_fn) \ + rb_enumeratorize_with_size(obj, id, argc, argv, (rb_enumerator_size_func *)(size_fn)) +# define rb_enumeratorize_with_size_kw(obj, id, argc, argv, size_fn, kw_splat) \ + rb_enumeratorize_with_size_kw(obj, id, argc, argv, (rb_enumerator_size_func *)(size_fn), kw_splat) +#endif +/** @endcond */ + +/** + * This is an implementation detail of #RETURN_SIZED_ENUMERATOR(). You could + * use it directly, but can hardly be handy. + * + * @param[in] obj A receiver. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arguments passed to the current method. + * @param[in] size_fn Size calculator. + * @return A new instance of ::rb_cEnumerator which, when yielded, + * enumerates by calling the current method on `recv` with `argv`. + */ +#define SIZED_ENUMERATOR(obj, argc, argv, size_fn) \ + rb_enumeratorize_with_size((obj), ID2SYM(rb_frame_this_func()), \ + (argc), (argv), (size_fn)) + +/** + * This is an implementation detail of #RETURN_SIZED_ENUMERATOR_KW(). You + * could use it directly, but can hardly be handy. + * + * @param[in] obj A receiver. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arguments passed to the current method. + * @param[in] size_fn Size calculator. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @return A new instance of ::rb_cEnumerator which, when yielded, + * enumerates by calling the current method on `recv` with `argv`. + */ +#define SIZED_ENUMERATOR_KW(obj, argc, argv, size_fn, kw_splat) \ + rb_enumeratorize_with_size_kw((obj), ID2SYM(rb_frame_this_func()), \ + (argc), (argv), (size_fn), (kw_splat)) + +/** + * This roughly resembles `return enum_for(__callee__) unless block_given?`. + * + * @param[in] obj A receiver. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arguments passed to the current method. + * @param[in] size_fn Size calculator. + * @note This macro may return inside. + */ +#define RETURN_SIZED_ENUMERATOR(obj, argc, argv, size_fn) do { \ + if (!rb_block_given_p()) \ + return SIZED_ENUMERATOR(obj, argc, argv, size_fn); \ + } while (0) + + +/** + * Identical to #RETURN_SIZED_ENUMERATOR(), except you can specify how to + * handle the last element of the given array. + * + * @param[in] obj A receiver. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arguments passed to the current method. + * @param[in] size_fn Size calculator. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @note This macro may return inside. + */ +#define RETURN_SIZED_ENUMERATOR_KW(obj, argc, argv, size_fn, kw_splat) do { \ + if (!rb_block_given_p()) \ + return SIZED_ENUMERATOR_KW(obj, argc, argv, size_fn, kw_splat); \ + } while (0) + +/** + * Identical to #RETURN_SIZED_ENUMERATOR(), except its size is unknown. + * + * @param[in] obj A receiver. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arguments passed to the current method. + * @note This macro may return inside. + */ +#define RETURN_ENUMERATOR(obj, argc, argv) \ + RETURN_SIZED_ENUMERATOR(obj, argc, argv, 0) + +/** + * Identical to #RETURN_SIZED_ENUMERATOR_KW(), except its size is unknown. It + * can also be seen as a routine identical to #RETURN_ENUMERATOR(), except you + * can specify how to handle the last element of the given array. + * + * @param[in] obj A receiver. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arguments passed to the current method. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @note This macro may return inside. + */ +#define RETURN_ENUMERATOR_KW(obj, argc, argv, kw_splat) \ + RETURN_SIZED_ENUMERATOR_KW(obj, argc, argv, 0, kw_splat) + +#endif /* RBIMPL_INTERN_ENUMERATOR_H */ diff --git a/libs/libruby/ruby/internal/intern/error.h b/libs/libruby/ruby/internal/intern/error.h new file mode 100644 index 0000000..9c153cb --- /dev/null +++ b/libs/libruby/ruby/internal/intern/error.h @@ -0,0 +1,287 @@ +#ifndef RBIMPL_INTERN_ERROR_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_ERROR_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_eException. + */ +#include "ruby/internal/attr/format.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/fl_type.h" +#include "ruby/backward/2/assume.h" + +/** + * This macro is used in conjunction with rb_check_arity(). If you pass it to + * the function's last (max) argument, that means the function does not check + * upper limit. + */ +#define UNLIMITED_ARGUMENTS (-1) + +#define rb_exc_new2 rb_exc_new_cstr /**< @old{rb_exc_new_cstr} */ +#define rb_exc_new3 rb_exc_new_str /**< @old{rb_exc_new_str} */ + +/** @cond INTERNAL_MACRO */ +#define rb_check_arity rb_check_arity +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* error.c */ + +/** + * Creates an instance of the passed exception class. + * + * @param[in] etype A subclass of ::rb_eException. + * @param[in] ptr Buffer contains error message. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @exception rb_eTypeError `etype` is not a class. + * @exception rb_eArgError `len` is negative. + * @return An instance of `etype`. + * @pre At least `len` bytes of continuous memory region shall be + * accessible via `ptr`. + * + * @internal + * + * This function works for non-exception classes as well, as long as they take + * one string argument. + */ +VALUE rb_exc_new(VALUE etype, const char *ptr, long len); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_exc_new(), except it assumes the passed pointer is a pointer + * to a C string. + * + * @param[in] etype A subclass of ::rb_eException. + * @param[in] str A C string (becomes an error message). + * @exception rb_eTypeError `etype` is not a class. + * @return An instance of `etype`. + */ +VALUE rb_exc_new_cstr(VALUE etype, const char *str); + +/** + * Identical to rb_exc_new_cstr(), except it takes a Ruby's string instead of + * C's. + * + * @param[in] etype A subclass of ::rb_eException. + * @param[in] str An instance of ::rb_cString. + * @exception rb_eTypeError `etype` is not a class. + * @return An instance of `etype`. + */ +VALUE rb_exc_new_str(VALUE etype, VALUE str); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL((1)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2) +/** + * Raises an instance of ::rb_eLoadError. + * + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + * @exception rb_eLoadError Always raises this. + * @note It never returns. + * + * @internal + * + * Who needs this? Except ruby itself? + */ +void rb_loaderror(const char *fmt, ...); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) +/** + * Identical to rb_loaderror(), except it additionally takes which file is + * unable to load. The path can be obtained later using `LoadError#path` of + * the raising exception. + * + * @param[in] path What failed. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + * @exception rb_eLoadError Always raises this. + * @note It never returns. + */ +void rb_loaderror_with_path(VALUE path, const char *fmt, ...); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) +/** + * Raises an instance of ::rb_eNameError. The name can be obtained later using + * `NameError#name` of the raising exception. + * + * @param[in] name What failed. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + * @exception rb_eNameError Always raises this. + * @note It never returns. + */ +void rb_name_error(ID name, const char *fmt, ...); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) +/** + * Identical to rb_name_error(), except it takes a ::VALUE instead of ::ID. + * + * @param[in] name What failed. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + * @exception rb_eNameError Always raises this. + * @note It never returns. + */ +void rb_name_error_str(VALUE name, const char *fmt, ...); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) +/** + * Raises an instance of ::rb_eFrozenError. The object can be obtained later + * using `FrozenError#receiver` of the raising exception. + * + * @param[in] recv What is frozen. + * @param[in] fmt Format specifier string compatible with rb_sprintf(). + * @exception rb_eFrozenError Always raises this. + * @note It never returns. + * + * @internal + * + * Note however, that it is often not possible to inspect a frozen object, + * because the inspection itself could be forbidden by the frozen-ness. + */ +void rb_frozen_error_raise(VALUE recv, const char *fmt, ...); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL(()) +/** + * Honestly I don't understand the name, but it raises an instance of + * ::rb_eArgError. + * + * @param[in] str A message. + * @param[in] type Another message. + * @exception rb_eArgError Always raises this. + * @note It never returns. + */ +void rb_invalid_str(const char *str, const char *type); + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_frozen_error_raise(), except its raising exception has a + * message like "can't modify frozen /what/". + * + * @param[in] what What was frozen. + * @exception rb_eFrozenError Always raises this. + * @note It never returns. + */ +void rb_error_frozen(const char *what); + +RBIMPL_ATTR_NORETURN() +/** + * Identical to rb_error_frozen(), except it takes arbitrary Ruby object + * instead of C's string. + * + * @param[in] what What was frozen. + * @exception rb_eFrozenError Always raises this. + * @note It never returns. + */ +void rb_error_frozen_object(VALUE what); + +/** + * Queries if the passed object is frozen. + * + * @param[in] obj Target object to test frozen-ness. + * @exception rb_eFrozenError It is frozen. + * @post Upon successful return it is guaranteed _not_ frozen. + */ +void rb_check_frozen(VALUE obj); + +/** + * Ensures that the passed object can be `initialize_copy` relationship. When + * you implement your own one you would better call this at the right beginning + * of your implementation. + * + * @param[in] obj Destination object. + * @param[in] orig Source object. + * @exception rb_eFrozenError `obj` is frozen. + * @post Upon successful return obj is guaranteed safe to copy orig. + */ +void rb_check_copyable(VALUE obj, VALUE orig); + +RBIMPL_ATTR_NORETURN() +/** + * @private + * + * This is an implementation detail of rb_scan_args(). You don't have to + * bother. + * + * @pre `argc` is out of range of `min`..`max`, both inclusive. + * @param[in] argc Arbitrary integer. + * @param[in] min Minimum allowed `argc`. + * @param[in] max Maximum allowed `argc`. + * @exception rb_eArgError Always. + */ +MJIT_STATIC void rb_error_arity(int argc, int min, int max); + +RBIMPL_SYMBOL_EXPORT_END() + +/** + * @deprecated + * + * Does anyone use this? Remain not deleted for compatibility. + */ +#define rb_check_frozen_internal(obj) do { \ + VALUE frozen_obj = (obj); \ + if (RB_UNLIKELY(RB_OBJ_FROZEN(frozen_obj))) { \ + rb_error_frozen_object(frozen_obj); \ + } \ + } while (0) + +/** @alias{rb_check_frozen} */ +static inline void +rb_check_frozen_inline(VALUE obj) +{ + if (RB_UNLIKELY(RB_OBJ_FROZEN(obj))) { + rb_error_frozen_object(obj); + } +} + +/** @alias{rb_check_frozen} */ +#define rb_check_frozen rb_check_frozen_inline + +/** + * Ensures that the passed integer is in the passed range. When you can use + * rb_scan_args() that is preferred over this one (powerful, descriptive). But + * it can have its own application area. + * + * @param[in] argc Arbitrary integer. + * @param[in] min Minimum allowed `argv`. + * @param[in] max Maximum allowed `argv`, or `UNLIMITED_ARGUMENTS`. + * @exception rb_eArgError `argc` out of range. + * @return The passed `argc`. + * @post Upon successful return `argc` is in range of `min`..`max`, both + * inclusive. + */ +static inline int +rb_check_arity(int argc, int min, int max) +{ + if ((argc < min) || (max != UNLIMITED_ARGUMENTS && argc > max)) + rb_error_arity(argc, min, max); + return argc; +} + +#endif /* RBIMPL_INTERN_ERROR_H */ diff --git a/libs/libruby/ruby/internal/intern/eval.h b/libs/libruby/ruby/internal/intern/eval.h new file mode 100644 index 0000000..2230f7a --- /dev/null +++ b/libs/libruby/ruby/internal/intern/eval.h @@ -0,0 +1,222 @@ +#ifndef RBIMPL_INTERN_EVAL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_EVAL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Pre-1.9 era evaluator APIs (now considered miscellaneous). + */ +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* eval.c */ +RBIMPL_ATTR_NORETURN() +/** + * Identical to rb_raise(), except it raises the passed exception instance as- + * is instead of creating new one. + * + * @param[in] exc An instance of a subclass of ::rb_eException. + * @exception exc What is passed. + * @exception rb_eTypeError `exc` is not an exception. + * @note It never returns. + * + * @internal + * + * Wellll actually, it can take more than what is described above. This + * function tries to call `exception` method of the passed object. If that + * function returns an exception object that is used instead. + */ +void rb_exc_raise(VALUE exc); + +RBIMPL_ATTR_NORETURN() +/** + * Identical to rb_fatal(), except it raises the passed exception instance as- + * is instead of creating new one. + * + * @param[in] exc An instance of a subclass of ::rb_eException. + * @exception exc What is passed. + * @note It never returns. + * + * @internal + * + * You know what...? Using this API you can make arbitrary exceptions, like + * `RuntimeError`, that doesn't interface with `rescue` clause. This is very + * confusing. + */ +void rb_exc_fatal(VALUE exc); + +/* process.c */ + +RBIMPL_ATTR_NORETURN() +/** + * Identical to rb_exit(), except how arguments are passed. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Contains at most one of the following: + * - ::RUBY_Qtrue - means `EXIT_SUCCESS`. + * - ::RUBY_Qfalse - means `EXIT_FAILURE`. + * - Numerical value - takes that value. + * @exception rb_eArgError Wrong `argc`. + * @exception rb_eSystemExit Exception representing the exit status. + * @note It never returns. + */ +VALUE rb_f_exit(int argc, const VALUE *argv); + +RBIMPL_ATTR_NORETURN() +/** + * This is similar to rb_f_exit(). In fact on some situation it internally + * calls rb_exit(). But can be very esoteric on occasions. + * + * It takes up to one argument. If an argument is passed, it tries to display + * that. Otherwise if there is `$!`, displays that exception instead. It + * finally raise ::rb_eSystemExit in both cases. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Contains at most one string-ish object. + * @exception rb_eArgError Wrong `argc`. + * @exception rb_eTypeError No conversion from `argv[0]` to String. + * @exception rb_eSystemExit Exception representing `EXIT_FAILURE`. + * @note It never returns. + */ +VALUE rb_f_abort(int argc, const VALUE *argv); + +/* eval.c*/ + +RBIMPL_ATTR_NORETURN() +/** + * Raises an instance of ::rb_eInterrupt. + * + * @exception rb_eInterrupt Always raises this exception. + * @note It never returns. + */ +void rb_interrupt(void); + +/** + * Queries the name of the Ruby level method that is calling this function. + * The "name" in this context is the one assigned to the function for the first + * time (note that methods can have multiple names via aliases). + * + * @retval 0 There is no method (e.g. toplevel context). + * @retval otherwise The name of the current method. + */ +ID rb_frame_this_func(void); + +RBIMPL_ATTR_NORETURN() +/** + * This function is to re-throw global escapes. Such global escapes include + * exceptions, `throw`, `break`, for example. + * + * It makes sense only when used in conjunction with "protect" series APIs + * e.g. rb_protect(), rb_load_protect(), rb_eval_string_protect(), etc. In + * case these functions experience global escapes, they fill their opaque + * `state` return buffer. You can ignore such escapes. But if you decide + * otherwise, you have to somehow escape globally again. This function is used + * for that purpose. + * + * @param[in] state Opaque state of execution. + * @note It never returns. + * + * @internal + * + * Though not a part of our public API, `state` is in fact an enum + * ruby_tag_type. You can see the potential values by looking at vm_core.h. + */ +void rb_jump_tag(int state); + +/** + * Calls `initialize` method of the passed object with the passed arguments. + * It also forwards the implicitly passed block to the method. + * + * @param[in] obj Receiver object. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Passed as-is to `obj.initialize`. + * @exception rb_eException Any exceptions happen inside. + */ +void rb_obj_call_init(VALUE obj, int argc, const VALUE *argv); + +/** + * Identical to rb_obj_call_init(), except you can specify how to handle the + * last element of the given array. + * + * @param[in] obj Receiver object. + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Passed as-is to `obj.initialize`. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eNoMethodError No such method. + * @exception rb_eException Any exceptions happen inside. + */ +void rb_obj_call_init_kw(VALUE, int, const VALUE*, int); + +/** + * Identical to rb_frame_this_func(), except it returns the named used to call + * the method. + * + * @retval 0 There is no method (e.g. toplevel context). + * @retval otherwise The name of the current method. + */ +ID rb_frame_callee(void); + +/** + * Constructs an exception object from the list of arguments, in a manner + * similar to Ruby's `raise`. This function can take: + * + * - No arguments at all, i.e. `argc == 0`. This is not a failure. It + * returns ::RUBY_Qnil then. + * + * - An object, which is an instance of ::rb_cString. In this case an + * instance of ::rb_eRuntimeError whose message is the passed string is + * created then returned. + * + * - An object, which responds to `exception` method, and optionally its + * argument, and optionally its backtrace. For example instances of + * subclasses of ::rb_eException have this method. What is returned from + * the method is returned. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv 0 up to 3 objects. + * @exception rb_eArgError Wrong `argc`. + * @exception rb_eTypeError `argv[0].exception` returned non-exception. + * @return An instance of a subclass of ::rb_eException. + * + * @internal + * + * Historically this was _the_ way `raise` converted its arguments to an + * exception. However they diverged. + */ +VALUE rb_make_exception(int argc, const VALUE *argv); + +/* eval_jump.c */ + +/** + * Registers a function that shall run on process exit. Registered functions + * run in reverse-chronological order, mixed with syntactic `END` block and + * `Kernel#at_exit`. + * + * @param[in] func Function to run at process exit. + * @param[in] arg Passed as-is to `func`. + */ +void rb_set_end_proc(void (*func)(VALUE arg), VALUE arg); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_EVAL_H */ diff --git a/libs/libruby/ruby/internal/intern/file.h b/libs/libruby/ruby/internal/intern/file.h new file mode 100644 index 0000000..79820fd --- /dev/null +++ b/libs/libruby/ruby/internal/intern/file.h @@ -0,0 +1,213 @@ +#ifndef RBIMPL_INTERN_FILE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_FILE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cFile. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* file.c */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_file_expand_path(), except how arguments are passed. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Filename, and base directory, in that order. + * @exception rb_eArgError Wrong `argc`. + * @exception rb_eTypeError Non-string passed. + * @exception rb_eEncCompatError No conversion from arguments to a path. + * @return Expanded path. + * + * @internal + * + * It seems nobody actually uses this function right now. Maybe delete it? + */ +VALUE rb_file_s_expand_path(int argc, const VALUE *argv); + +/** + * Identical to rb_file_absolute_path(), except it additionally understands + * `~`. If a given pathname starts with `~someone/`, that part expands to the + * user's home directory (or that of current process' owner's in case of `~/`). + * + * @param[in] fname Relative file name. + * @param[in] dname Lookup base directory name, or in case + * ::RUBY_Qnil is passed the process' current + * working directory is assumed. + * @exception rb_eArgError Home directory is not absolute. + * @exception rb_eTypeError Non-string passed. + * @exception rb_eEncCompatError No conversion from arguments to a path. + * @return Expanded path. + */ +VALUE rb_file_expand_path(VALUE fname, VALUE dname); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_file_absolute_path(), except how arguments are passed. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Filename, and base directory, in that order. + * @exception rb_eArgError Wrong `argc`. + * @exception rb_eTypeError Non-string passed. + * @exception rb_eEncCompatError No conversion from arguments to a path. + * @return Expanded path. + * + * @internal + * + * It seems nobody actually uses this function right now. Maybe delete it? + */ +VALUE rb_file_s_absolute_path(int argc, const VALUE *argv); + +/** + * Maps a relative path to its absolute representation. Relative paths are + * referenced from the passed directory name, or from the process' current + * working directory in case ::RUBY_Qnil is passed. + * + * @param[in] fname Relative file name. + * @param[in] dname Lookup base directory name, or in case + * ::RUBY_Qnil is passed the process' current + * working directory is assumed. + * @exception rb_eArgError Strings contain NUL bytes. + * @exception rb_eTypeError Non-string passed. + * @exception rb_eEncCompatError No conversion from arguments to a path. + * @return Expanded path. + */ +VALUE rb_file_absolute_path(VALUE fname, VALUE dname); + +/** + * Strips a file path's last component (and trailing separators if any). This + * function is relatively simple on POSIX environments; just splits the input + * with `/`, strips the last one, if something remains joins them again, + * otherwise the return value is `"."`. However when it comes to Windows this + * function is quite very much complicated. We have to take UNC etc. into + * account. So for instance `"C:foo"`'s dirname is `"C:."`. + * + * @param[in] fname File name to strip. + * @exception rb_eTypeError `fname` is not a String. + * @exception rb_eArgError `fname` contains NUL bytes. + * @exception rb_eEncCompatError `fname`'s encoding is not path-compat. + * @return A dirname of `fname`. + * @note This is a "pure" operation; it computes the return value solely + * from the passed object and never does any file IO. + */ +VALUE rb_file_dirname(VALUE fname); + +RBIMPL_ATTR_NONNULL(()) +/** + * Resolves a feature's path. This function takes for instance `"json"` and + * `[".so", ".rb"]`, and iterates over the `$LOAD_PATH` to see if there is + * either `json.so` or `json.rb` in the directory. + * + * This is not what everything `require` does, but at least `require` is built + * on top of it. + * + * @param[in,out] feature File to search, and return buffer. + * @param[in] exts List of file extensions. + * @exception rb_eTypeError `feature` is not a String. + * @exception rb_eArgError `feature` contains NUL bytes. + * @exception rb_eEncCompatError `feature`'s encoding is not path-compat. + * @retval 0 Not found + * @retval otherwise Found index in `ext`, plus one. + * @post `*feature` is a resolved path. + */ +int rb_find_file_ext(VALUE *feature, const char *const *exts); + +/** + * Identical to rb_find_file_ext(), except it takes a feature name and is + * extension at once, e.g. `"json.rb"`. This difference is much like how + * `require` and `load` are different. + * + * @param[in] path A path relative to `$LOAD_PATH`. + * @exception rb_eTypeError `path` is not a String. + * @exception rb_eArgError `path` contains NUL bytes. + * @exception rb_eEncCompatError `path`'s encoding is not path-compat. + * @return Expanded path. + */ +VALUE rb_find_file(VALUE path); + +/** + * Queries if the given path is either a directory, or a symlink that + * (potentially recursively) points to such thing. + * + * @param[in] _ Ignored (why...?) + * @param[in] path String, or IO. In case of IO it issues + * `fstat(2)` instead of `stat(2)`. + * @exception rb_eFrozenError `path` is a frozen IO (why...?) + * @exception rb_eTypeError `path` is neither String nor IO. + * @exception rb_eArgError `path` contains NUL bytes. + * @exception rb_eEncCompatError `path`'s encoding is not path-compat. + * @retval RUBY_Qtrue `path` is a directory. + * @retval RUBY_Qfalse Otherwise. + */ +VALUE rb_file_directory_p(VALUE _, VALUE path); + +/** + * Converts a string into an "OS Path" encoding, if any. In most operating + * systems there are no such things like per-OS default encoding of filename. + * For them this function is no-op. However most notably on MacOS, pathnames + * are UTF-8 encoded. It converts the given string into such encoding. + * + * @param[in] path An instance of ::rb_cString. + * @exception rb_eEncCompatError `path`'s encoding is not path-compat. + * @return `path`'s contents converted to the OS' path encoding. + */ +VALUE rb_str_encode_ospath(VALUE path); + +RBIMPL_ATTR_NONNULL(()) +RBIMPL_ATTR_PURE() +/** + * Queries if the given path is an absolute path. On POSIX environments it is + * as easy as `path[0] == '/'`. However on Windows, drive letters and UNC + * paths are also taken into account. + * + * @param[in] path A possibly relative path string. + * @retval 1 `path` is absolute. + * @retval 0 `path` is relative. + */ +int rb_is_absolute_path(const char *path); + +/** + * Queries the file size of the given file. Because this function calls + * `fstat(2)` internally, it is a failure to pass a closed file to this + * function. + * + * This function flushes the passed file's buffer if any. Can take time. + * + * @param[in] file A file object. + * @exception rb_eFrozenError `file` is frozen. + * @exception rb_eIOError `file` is closed. + * @exception rb_eSystemCallError Permission denied etc. + * @exception rb_eNoMethodError The given non-file object doesn't respond + * to `#size`. + * @return The size of the passed file. + * @note Passing a non-regular file such as a UNIX domain socket to this + * function is not a failure. But the return value is + * unpredictable. POSIX's `` states that "the use of + * this field is unspecified" then. + */ +rb_off_t rb_file_size(VALUE file); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_FILE_H */ diff --git a/libs/libruby/ruby/internal/intern/gc.h b/libs/libruby/ruby/internal/intern/gc.h new file mode 100644 index 0000000..2ee1d25 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/gc.h @@ -0,0 +1,392 @@ +#ifndef RBIMPL_INTERN_GC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_GC_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_mGC. + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include /* size_t */ +#endif + +#ifdef HAVE_SYS_TYPES_H +# include /* ssize_t */ +#endif + +#include "ruby/internal/attr/cold.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* gc.c */ + +RBIMPL_ATTR_COLD() +RBIMPL_ATTR_NORETURN() +/** + * Triggers out-of-memory error. If possible it raises ::rb_eNoMemError. But + * because we are running out of memory that is not always doable. This + * function tries hard to show something, but ultimately can die silently. + * + * @exception rb_eNoMemError Raises it if possible. + */ +void rb_memerror(void); + +RBIMPL_ATTR_PURE() +/** + * Queries if the GC is busy. + * + * @retval 0 It isn't. + * @retval 1 It is. + */ +int rb_during_gc(void); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Marks objects between the two pointers. This is one of the GC utility + * functions that you can call when you design your own + * ::rb_data_type_struct::dmark. + * + * @pre Continuous memory region from `start` to `end` shall be fully + * addressable. + * @param[out] start Pointer to an array of objects. + * @param[out] end Pointer that terminates the array of objects. + * @post Objects from `start` (included) to `end` (excluded) are marked. + * + * @internal + * + * `end` can be NULL... But that just results in no-op. + */ +void rb_gc_mark_locations(const VALUE *start, const VALUE *end); + +/** + * Identical to rb_mark_hash(), except it marks only values of the table and + * leave their associated keys unmarked. This is one of the GC utility + * functions that you can call when you design your own + * ::rb_data_type_struct::dmark. + * + * @warning Of course it can break GC. Leave it unused if unsure. + * @param[in] tbl A table to mark. + * @post Values stored in `tbl` are marked. + */ +void rb_mark_tbl(struct st_table *tbl); + +/** + * Identical to rb_mark_tbl(), except it marks objects using + * rb_gc_mark_movable(). This is one of the GC utility functions that you can + * call when you design your own ::rb_data_type_struct::dmark. + * + * @warning Of course it can break GC. Leave it unused if unsure. + * @param[in] tbl A table to mark. + * @post Values stored in `tbl` are marked. + */ +void rb_mark_tbl_no_pin(struct st_table *tbl); + +/** + * Identical to rb_mark_hash(), except it marks only keys of the table and + * leave their associated values unmarked. This is one of the GC utility + * functions that you can call when you design your own + * ::rb_data_type_struct::dmark. + * + * @warning Of course it can break GC. Leave it unused if unsure. + * @param[in] tbl A table to mark. + * @post Keys stored in `tbl` are marked. + */ +void rb_mark_set(struct st_table *tbl); + +/** + * Marks keys and values associated inside of the given table. This is one of + * the GC utility functions that you can call when you design your own + * ::rb_data_type_struct::dmark. + * + * @param[in] tbl A table to mark. + * @post Objects stored in `tbl` are marked. + */ +void rb_mark_hash(struct st_table *tbl); + +/** + * Updates references inside of tables. After you marked values using + * rb_mark_tbl_no_pin(), the objects inside of the table could of course be + * moved. This function is to fixup those references. You can call this from + * your ::rb_data_type_struct::dcompact. + * + * @param[out] ptr A table that potentially includes moved references. + * @post Moved references, if any, are corrected. + */ +void rb_gc_update_tbl_refs(st_table *ptr); + +/** + * Identical to rb_gc_mark(), except it allows the passed value be a + * non-object. For instance pointers to different type of memory regions are + * allowed here. Such values are silently ignored. This is one of the GC + * utility functions that you can call when you design your own + * ::rb_data_type_struct::dmark. + * + * @param[out] obj A possible object. + * @post `obj` is marked, if possible. + */ +void rb_gc_mark_maybe(VALUE obj); + +/** + * Marks an object. This is one of the GC utility functions that you can call + * when you design your own ::rb_data_type_struct::dmark. + * + * @param[out] obj Arbitrary Ruby object. + * @post `obj` is marked. + */ +void rb_gc_mark(VALUE obj); + +/** + * Maybe this is the only function provided for C extensions to control the + * pinning of objects, so let us describe it in detail. These days Ruby's GC + * is copying. As far as an object's physical address is guaranteed unused, it + * can move around the object space. Our GC engine rearranges these objects + * after it reclaims unreachable objects from our object space, so that the + * space is compact (improves memory locality). This is called the + * "compaction" phase, and works well most of the time... as far as there are + * no C extensions. C extensions complicate the scenario because Ruby core + * cannot detect any use of the physical address of an object inside of C + * functions. In order to prevent memory corruptions, objects observable from + * C extensions are "pinned"; they stick to where they are born until they die, + * just in case any C extensions touch their raw pointers. This variant of + * scheme is called "Mostly-Copying" garbage collector. Authors of C + * extensions, however, can extremely carefully write them to become + * compaction-aware. To do so avoid referring to a Ruby object from inside of + * your struct in the first place. But if that is not possible, use this + * function from your ::rb_data_type_struct::dmark then. This way objects + * marked using it are considered movable. If you chose this way you have to + * manually fix up locations of such moved pointers using rb_gc_location(). + * + * @see Bartlett, Joel F., "Compacting Garbage Collection with Ambiguous + * Roots", ACM SIGPLAN Lisp Pointers Volume 1 Issue 6 pp. 3-12, + * April-May-June, 1988. https://doi.org/10.1145/1317224.1317225 + * + * @param[in] obj Object that is movable. + * @post Values stored in `tbl` are marked. + */ +void rb_gc_mark_movable(VALUE obj); + +/** + * Finds a new "location" of an object. An object can be moved on compaction. + * This function projects its new abode, or just returns the passed object if + * not moved. This is one of the GC utility functions that you can call when + * you design your own ::rb_data_type_struct::dcompact. + * + * @param[in] obj An object, possibly already moved to somewhere else. + * @return An object, which holds the current contents of former `obj`. + */ +VALUE rb_gc_location(VALUE obj); + +/** + * Asserts that the passed object is no longer needed. Such objects are + * reclaimed sooner or later so this function is not mandatory. But sometimes + * you can know from your application knowledge that an object is surely dead + * at some point. Calling this as a hint can be a polite way. + * + * @param[out] obj Object, dead. + * @pre `obj` have never been passed to this function before. + * @post `obj` could be invalidated. + * @warning It is a failure to pass an object multiple times to this + * function. + * @deprecated This is now a no-op function. + */ +RBIMPL_ATTR_DEPRECATED(("this is now a no-op function")) +void rb_gc_force_recycle(VALUE obj); + +/** + * Triggers a GC process. This was the only GC entry point that we had at the + * beginning. Over time our GC evolved. Now what this function does is just a + * very simplified variation of the entire GC algorithms. A series of + * procedures kicked by this API is called a "full" GC. + * + * - It immediately scans the entire object space to sort the dead. + * - It immediately reclaims any single dead bodies to reuse later. + * + * It is worth noting that the procedures above do not include evaluations of + * finalisers. They run later. + * + * @internal + * + * Finalisers are deferred until we can handle interrupts. See + * `rb_postponed_job_flush` in vm_trace.c. + * + * Of course there are GC that are not "full". For instance this one and the + * GC which runs when we are running out of memory are different. See + * `gc_profile_record_flag` defined in gc.c for the kinds of GC. + * + * In spite of the name this is not what everything that a GC can trigger. As + * of writing it seems this function does not trigger compaction. But this + * might change in future. + */ +void rb_gc(void); + +/** + * Copy&paste an object's finaliser to another. This is one of the GC utility + * functions that you can call when you design your own `initialize_copy`, + * `initialize_dup`, `initialize_clone`. + * + * @param[out] dst Destination object. + * @param[in] src Source object. + * @post `dst` and `src` share the same finaliser. + * + * @internal + * + * But isn't it easier for you to call super, and let `Object#initialize_copy` + * call this function instead? + */ +void rb_gc_copy_finalizer(VALUE dst, VALUE src); + +/** + * (Re-) enables GC. This makes sense only after you called rb_gc_disable(). + * + * @retval RUBY_Qtrue GC was disabled before. + * @retval RUBY_Qfalse GC was enabled before. + * @post GC is enabled. + * + * @internal + * + * This is one of such exceptional functions that does not raise both Ruby + * exceptions and C++ exceptions. + */ +VALUE rb_gc_enable(void); + +/** + * Disables GC. This prevents automatic GC runs when the process is running + * out of memory. Such situations shall result in rb_memerror(). However this + * does not prevent users from manually invoking rb_gc(). That should work. + * People abused this by disabling GC at the beginning of an event loop, + * process events without GC overheads, then manually force reclaiming garbage + * at the bottom of the loop. However because our GC is now much smarter than + * just calling rb_gc(), this technique is proven to be sub-optimal these days. + * It is believed that there is currently practically no needs of this + * function. + * + * @retval RUBY_Qtrue GC was disabled before. + * @retval RUBY_Qfalse GC was enabled before. + * @post GC is disabled. + */ +VALUE rb_gc_disable(void); + +/** + * Identical to rb_gc(), except the return value. + * + * @return Always returns ::RUBY_Qnil. + */ +VALUE rb_gc_start(void); + +/** + * Assigns a finaliser for an object. Each objects can have objects (typically + * blocks) that run immediately after that object dies. They are called + * finalisers of an object. This function associates a finaliser object with a + * target object. + * + * @note Note that finalisers run _after_ the object they finalise dies. You + * cannot for instance call its methods. + * @note If your finaliser references the object it finalises that object + * loses any chance to become a garbage; effectively leaks memory until + * the end of the process. + * + * @param[in] obj Target to finalise. + * @param[in] block Something `call`able. + * @exception rb_eRuntimeError Somehow `obj` cannot have finalisers. + * @exception rb_eFrozenError `obj` is frozen. + * @exception rb_eArgError `block` doesn't respond to `call`. + * @return The passed `block`. + * @post `block` runs after `obj` dies. + */ +VALUE rb_define_finalizer(VALUE obj, VALUE block); + +/** + * Modifies the object so that it has no finalisers at all. This function is + * mainly provided for symmetry. No practical usages can be thought of. + * + * @param[out] obj Object to clear its finalisers. + * @exception rb_eFrozenError `obj` is frozen. + * @return The passed `obj`. + * @post `obj` has no finalisers. + * @note There is no way to undefine a specific part of many finalisers + * that `obj` could have. All you can do is to clear them all. + */ +VALUE rb_undefine_finalizer(VALUE obj); + +/** + * Identical to rb_gc_stat(), with "count" parameter. + * + * @return Lifetime total number of runs of GC. + */ +size_t rb_gc_count(void); + +/** + * Obtains various GC related profiles. The parameter can be either a Symbol + * or a Hash. If a Hash is passed, it is filled with everything currently + * available. If a Symbol is passed just that portion is returned. + * + * Possible variations of keys you can pass here change from version to + * version. You can get the list of known keys by passing an empty hash and + * let it be filled. + * + * @param[in,out] key_or_buf A Symbol, or a Hash. + * @exception rb_eTypeError Neither Symbol nor Hash. + * @exception rb_eFrozenError Frozen hash is passed. + * @return In case a Hash is passed it returns 0. Otherwise the + * profile value associated with the given key is returned. + * @post In case a Hash is passed it is filled with values. + */ +size_t rb_gc_stat(VALUE key_or_buf); + +/** + * Obtains various info regarding the most recent GC run. This includes for + * instance the reason of the GC. The parameter can be either a Symbol or a + * Hash. If a Hash is passed, it is filled with everything currently + * available. If a Symbol is passed just that portion is returned. + * + * Possible variations of keys you can pass here change from version to + * version. You can get the list of known keys by passing an empty hash and + * let it be filled. + * + * @param[in,out] key_or_buf A Symbol, or a Hash. + * @exception rb_eTypeError Neither Symbol nor Hash. + * @exception rb_eFrozenError Frozen hash is passed. + * @return In case a Hash is passed it returns that hash. Otherwise + * the profile value associated with the given key is returned. + * @post In case a Hash is passed it is filled with values. + */ +VALUE rb_gc_latest_gc_info(VALUE key_or_buf); + +/** + * Informs that there are external memory usages. Our GC runs when we are + * running out of memory. The amount of memory, however, can increase/decrease + * behind-the-scene. For instance DLLs can allocate memories using `mmap(2)` + * etc, which are opaque to us. Registering such external allocations using + * this function enables proper detection of how much memories an object used + * as a whole. That will trigger GCs more often than it would otherwise. You + * can also pass negative numbers here, to indicate that such external + * allocations are gone. + * + * @param[in] diff Amount of memory increased(+)/decreased(-). + */ +void rb_gc_adjust_memory_usage(ssize_t diff); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_GC_H */ diff --git a/libs/libruby/ruby/internal/intern/hash.h b/libs/libruby/ruby/internal/intern/hash.h new file mode 100644 index 0000000..af8dfd5 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/hash.h @@ -0,0 +1,320 @@ +#ifndef RBIMPL_INTERN_HASH_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_HASH_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cHash. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/st.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* hash.c */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_st_foreach(), except it raises exceptions when the callback + * function tampers the table during iterating over it. + * + * @param[in] st Table to iterate over. + * @param[in] func Callback function to apply. + * @param[in] arg Passed as-is to `func`. + * @exception rb_eRuntimeError `st` was tampered during iterating. + * + * @internal + * + * This is declared here because exceptions are Ruby level concept. + * + * This is in fact a very thin wrapper of rb_st_foreach_check(). + */ +void rb_st_foreach_safe(struct st_table *st, st_foreach_callback_func *func, st_data_t arg); + +/** @alias{rb_st_foreach_safe} */ +#define st_foreach_safe rb_st_foreach_safe + +/** + * Try converting an object to its hash representation using its `to_hash` + * method, if any. If there is no such thing, returns ::RUBY_Qnil. + * + * @param[in] obj Arbitrary ruby object to convert. + * @exception rb_eTypeError `obj.to_hash` returned something non-Hash. + * @retval RUBY_Qnil No conversion from `obj` to hash defined. + * @retval otherwise Converted hash representation of `obj`. + * @see rb_io_check_io + * @see rb_check_array_type + * @see rb_check_string_type + * + * @internal + * + * There is no rb_hash_to_hash() that analogous to rb_str_to_str(). + * Intentional or ...? + */ +VALUE rb_check_hash_type(VALUE obj); + +RBIMPL_ATTR_NONNULL(()) +/** + * Iterates over a hash. This basically does the same thing as + * rb_st_foreach(). But because the passed hash is a Ruby object, its keys and + * values are both Ruby objects. + * + * @param[in] hash An instance of ::rb_cHash to iterate over. + * @param[in] func Callback function to yield. + * @param[in] arg Passed as-is to `func`. + * @exception rb_eRuntimeError `hash` was tampered during iterating. + */ +void rb_hash_foreach(VALUE hash, int (*func)(VALUE key, VALUE val, VALUE arg), VALUE arg); + +/** + * Calculates a message authentication code of the passed object. The return + * value is a very small integer used as an index of a key of a table. In + * order to calculate the value this function calls `#hash` method of the + * passed object. Ruby provides you a default implementation. But if you + * implement your class in C, that default implementation cannot know the + * underlying data structure. You must implement your own `#hash` method then, + * which must return an integer of uniform distribution in a sufficiently + * instant manner. + * + * @param[in] obj Arbitrary Ruby object. + * @exception rb_eTypeError `obj.hash` returned something non-Integer. + * @return A small integer. + * @note `#hash` can return very big integers, but they get truncated. + */ +VALUE rb_hash(VALUE obj); + +/** + * Creates a new, empty hash object. + * + * @return An allocated new instance of ::rb_cHash. + */ +VALUE rb_hash_new(void); + +/** + * Identical to rb_hash_new(), except it additionally specifies how many keys + * it is expected to contain. This way you can create a hash that is large enough + * for your need. For large hashes it means it won't need to be reallocated and + * rehashed as much, improving performance. + * + * @param[in] capa Designed capacity of the hash. + * @return An empty Hash, whose capacity is `capa`. + */ +VALUE rb_hash_new_capa(long capa); + +/** + * Duplicates a hash. + * + * @param[in] hash An instance of ::rb_cHash. + * @return An allocated new instance of ::rb_cHash, whose contents are + * a verbatim copy of from `hash`. + */ +VALUE rb_hash_dup(VALUE hash); + +/** @alias{rb_obj_freeze} */ +VALUE rb_hash_freeze(VALUE obj); + +/** + * Queries the given key in the given hash table. If there is the key in the + * hash, returns the value associated with the key. Otherwise it returns the + * "default" value (defined per hash table). + * + * @param[in] hash Hash table to look into. + * @param[in] key Hash key to look for. + * @return Either the value associated with the key, or the default one if + * absent. + */ +VALUE rb_hash_aref(VALUE hash, VALUE key); + +/** + * Identical to rb_hash_aref(), except it always returns ::RUBY_Qnil for + * misshits. + * + * @param[in] hash Hash table to look into. + * @param[in] key Hash key to look for. + * @return Either the value associated with the key, or ::RUBY_Qnil if + * absent. + * @note A hash can store ::RUBY_Qnil as an ordinary value. You cannot + * distinguish whether the key is missing, or just its associated + * value happens to be ::RUBY_Qnil, as far as you use this API. + */ +VALUE rb_hash_lookup(VALUE hash, VALUE key); + +/** + * Identical to rb_hash_lookup(), except you can specify what to return on + * misshits. This is much like 2-arguments version of `Hash#fetch`. + * + * ```CXX + * VALUE hash; + * VALUE key; + * VALUE tmp = rb_obj_alloc(rb_cObject); + * VALUE val = rb_hash_lookup2(hash, key, tmp); + * if (val == tmp) { + * printf("misshit"); + * } + * else { + * printf("hit"); + * } + * ``` + * + * @param[in] hash Hash table to look into. + * @param[in] key Hash key to look for. + * @param[in] def Default value. + * @retval def `hash` does not have `key`. + * @retval otherwise The value associated with `key`. + */ +VALUE rb_hash_lookup2(VALUE hash, VALUE key, VALUE def); + +/** + * Identical to rb_hash_lookup(), except it yields the (implicitly) passed + * block instead of returning ::RUBY_Qnil. + * + * @param[in] hash Hash table to look into. + * @param[in] key Hash key to look for. + * @exception rb_eKeyError No block given. + * @return Either the value associated with the key, or what the block + * evaluates to if absent. + */ +VALUE rb_hash_fetch(VALUE hash, VALUE key); + +/** + * Inserts or replaces ("upsert"s) the objects into the given hash table. This + * basically associates the given value with the given key. On duplicate key + * this function updates its associated value with the given one. Otherwise it + * inserts the association at the end of the table. + * + * @param[out] hash Target hash table to modify. + * @param[in] key Arbitrary Ruby object. + * @param[in] val A value to be associated with `key`. + * @exception rb_eFrozenError `hash` is frozen. + * @return The passed `val` + * @post `val` is associated with `key` in `hash`. + */ +VALUE rb_hash_aset(VALUE hash, VALUE key, VALUE val); + +/** + * Swipes everything out of the passed hash table. + * + * @param[out] hash Target to clear. + * @exception rb_eFrozenError `hash`is frozen. + * @return The passed `hash` + * @post `hash` has no contents. + */ +VALUE rb_hash_clear(VALUE hash); + +/** + * Deletes each entry for which the block returns a truthy value. If there is + * no block given, it returns an enumerator that does the thing. + * + * @param[out] hash Target hash to modify. + * @exception rb_eFrozenError `hash` is frozen. + * @retval hash The hash is modified. + * @retval otherwise An instance of ::rb_cEnumerator that does it. + */ +VALUE rb_hash_delete_if(VALUE hash); + +/** + * Deletes the passed key from the passed hash table, if any. + * + * @param[out] hash Target hash to modify. + * @param[in] key Key to delete. + * @retval RUBY_Qnil `hash` has no such key as `key`. + * @retval otherwise What was associated with `key`. + * @post `hash` has no such key as `key`. + */ +VALUE rb_hash_delete(VALUE hash, VALUE key); + +/** + * Inserts a list of key-value pairs into a hash table at once. It is + * semantically identical to repeatedly calling rb_hash_aset(), but can be + * faster than that. + * + * @param[in] argc Length of `argv`, must be even. + * @param[in] argv A list of key, value, key, value, ... + * @param[out] hash Target hash table to modify. + * @post `hash` has contents from `argv`. + * @note `argv` is allowed to be NULL as long as `argc` is zero. + * + * @internal + * + * What happens for duplicated keys? Well it silently discards older ones to + * accept the newest (rightmost) one. This behaviour also mimics repeated call + * of rb_hash_aset(). + */ +void rb_hash_bulk_insert(long argc, const VALUE *argv, VALUE hash); + +/** + * Type of callback functions to pass to rb_hash_update_by(). + * + * @param[in] newkey A key of the table. + * @param[in] oldkey Value associated with `key` in hash1. + * @param[in] value Value associated with `key` in hash2. + * @return Either one of the passed values to take. + */ +typedef VALUE rb_hash_update_func(VALUE newkey, VALUE oldkey, VALUE value); + +/** + * Destructively merges two hash tables into one. It resolves key conflicts by + * calling the passed function and take its return value. + * + * @param[out] hash1 Target hash to be modified. + * @param[in] hash2 A hash to merge into `hash1`. + * @param[in] func Conflict reconciler. + * @exception rb_eFrozenError `hash1` is frozen. + * @exception rb_eRuntimeError `hash2` is updated instead. + * @return The passed `hash1`. + * @post Contents of `hash2` is merged into `hash1`. + * @note You can pass zero to `func`. This means values from `hash2` + * are always taken. + */ +VALUE rb_hash_update_by(VALUE hash1, VALUE hash2, rb_hash_update_func *func); + +/* file.c */ + +/** + * This function is mysterious. What it does is not immediately obvious. Also + * what it does seems platform dependent. + * + * @param[in] path A local path. + * @retval 0 The "check" succeeded. + * @retval otherwise The "check" failed. + */ +int rb_path_check(const char *path); + +/* hash.c */ + +/** + * Destructively removes every environment variables of the running process. + * + * @return The `ENV` object. + * @post The process has no environment variables. + */ +VALUE rb_env_clear(void); + +/** + * Identical to #RHASH_SIZE(), except it returns the size in Ruby's integer + * instead of C's. + * + * @param[in] hash A hash object. + * @return The size of the hash. + */ +VALUE rb_hash_size(VALUE hash); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_HASH_H */ diff --git a/libs/libruby/ruby/internal/intern/io.h b/libs/libruby/ruby/internal/intern/io.h new file mode 100644 index 0000000..02c2497 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/io.h @@ -0,0 +1,661 @@ +#ifndef RBIMPL_INTERN_IO_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_IO_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cIO. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* io.c */ + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define rb_defout rb_stdout + +/* string.c */ /* ...why? moved in commit de7161526014b781468cea5d84411e23be */ + +/** + * The field separator character for inputs, or the `$;`. This affects how + * `String#split` works. You can set this via the `-F` command line option. + * You can also assign arbitrary ruby objects programmatically, but it makes + * best sense for you to assign a regular expression here. + * + * @internal + * + * Tidbit: "fs" comes from AWK's `FS` variable. + */ +RUBY_EXTERN VALUE rb_fs; + +/* io.c */ /* ...why? given rb_fs is in string.c? */ + +/** + * The field separator character for outputs, or the `$,`. This affects how + * `Array#join` works. + * + * @deprecated Assigning anything other than ::RUBY_Qnil to this variable is + * deprecated. + */ +RUBY_EXTERN VALUE rb_output_fs; + +/** + * The record separator character for inputs, or the `$/`. This affects how + * `IO#gets` works. You can set this via the `-0` command line option. + * + * @deprecated Assigning anything other than ::RUBY_Qnil to this variable is + * deprecated. + * + * @internal + * + * Tidbit: "rs" comes from AWK's `RS` variable. + */ +RUBY_EXTERN VALUE rb_rs; + +/** + * This is the default value of ::rb_rs, i.e. `"\n"`. It seems it has always + * been just a newline string since the beginning. Not sure why C codes has to + * use this, given there is no way for ruby programs to interface. + * + * Also it has not been deprecated for unknown reasons. + */ +RUBY_EXTERN VALUE rb_default_rs; + +/** + * The record separator character for outputs, or the `$\`. This affects how + * `IO#print` works. + * + * @deprecated Assigning anything other than ::RUBY_Qnil to this variable is + * deprecated. + */ +RUBY_EXTERN VALUE rb_output_rs; + +/** + * Writes the given string to the given IO. + * + * @param[out] io An IO, opened for writing. + * @param[in] str A String-like object to write to `io`. + * @exception rb_eIOError `io` isn't opened for writing. + * @exception rb_eFrozenError `io` is frozen. + * @exception rb_eTypeError No conversion from `str` to String. + * @exception rb_eSystemCallError `write(2)` failed for some reason. + * @return The number of bytes written to the `io`. + * @post `str` (up to the length of return value) is written to `io`. + * @note This function blocks. + * @note Partial write is a thing. It must be at least questionable not + * to check the return value. + * + * @internal + * + * Above description is in fact inaccurate. This function can take arbitrary + * objects, and calls their `write` method. What is written above in fact + * describes how `IO#write` works. You can pass StringIO etc. here, and would + * work completely differently. + */ +VALUE rb_io_write(VALUE io, VALUE str); + +/** + * Reads a "line" from the given IO. A line here means a chunk of characters + * which is terminated by either `"\n"` or an EOF. + * + * @param[in,out] io An IO, opened for reading. + * @exception rb_eIOError `io` isn't opened for reading. + * @exception rb_eFrozenError `io` is frozen. + * @retval RUBY_Qnil `io` is at EOF. + * @retval otherwise An instance of ::rb_cString. + * @post `io` is read. + * @note Unlike `IO#gets` it doesn't set `$_`. + * @note Unlike `IO#gets` it doesn't consider `$/`. + */ +VALUE rb_io_gets(VALUE io); + +/** + * Reads a byte from the given IO. + * + * @note In Ruby a "byte" always means an 8 bit integer ranging from + * 0 to 255 inclusive. + * @param[in,out] io An IO, opened for reading. + * @exception rb_eIOError `io` is not opened for reading. + * @exception rb_eFrozenError `io` is frozen. + * @retval RUBY_Qnil `io` is at EOF. + * @retval otherwise An instance of ::rb_cInteger. + * @post `io` is read. + * + * @internal + * + * Of course there was a function called `rb_io_getc()`. It was removed in + * commit a25fbe3b3e531bbe479f344af24eaf9d2eeae6ea. + */ +VALUE rb_io_getbyte(VALUE io); + +/** + * "Unget"s a string. This function pushes back the passed string onto the + * passed IO, such that a subsequent buffered read will return it. If the + * passed content is in fact an integer, a single character string of that + * codepoint of the encoding of the IO will be pushed back instead. + * + * It might be counter-intuitive but this function can push back multiple + * characters at once. Also this function can be called multiple times on a + * same IO. Also a "character" can be wider than a byte, depending on the + * encoding of the IO. + * + * @param[out] io An IO, opened for reading. + * @param[in] c Either a String, or an Integer. + * @exception rb_eIOError `io` is not opened for reading. + * @exception rb_eFrozenError `io` is frozen. + * @exception rb_eTypeError No conversion from `c` to ::rb_cString. + * @return Always returns ::RUBY_Qnil. + * + * @internal + * + * Why there is ungetc, given there is no getc? + */ +VALUE rb_io_ungetc(VALUE io, VALUE c); + +/** + * Identical to rb_io_ungetc(), except it doesn't take the encoding of the + * passed IO into account. When an integer is passed, it just casts that value + * to C's `unsigned char`, and pushes that back. + * + * @param[out] io An IO, opened for reading. + * @param[in] b Either a String, or an Integer. + * @exception rb_eIOError `io` is not opened for reading. + * @exception rb_eFrozenError `io` is frozen. + * @exception rb_eTypeError No conversion from `b` to ::rb_cString. + * @return Always returns ::RUBY_Qnil. + */ +VALUE rb_io_ungetbyte(VALUE io, VALUE b); + +/** + * Closes the IO. Any buffered contents are flushed to the operating system. + * Any future operations against the IO would raise ::rb_eIOError. In case the + * io was created using `IO.popen`, it also sets the `$?`. + * + * @param[out] io Target IO to close. + * @return Always returns ::RUBY_Qnil. + * @post `$?` is set in case IO is a pipe. + * @post No operations are possible against `io` any further. + * @note This can block to flush the contents. + * @note This can wake other threads up, especially those who are + * `select()`-ing the passed IO. + * @note Multiple invocations of this function over the same IO again + * and again is not an error, since Ruby 2.3. + * + * @internal + * + * You can close a frozen IO... Is this intentional? + */ +VALUE rb_io_close(VALUE io); + +/** + * Flushes any buffered data within the passed IO to the underlying operating + * system. + * + * @param[out] io Target IO to flush. + * @exception rb_eIOError `io` is closed. + * @exception rb_eFrozenError `io` is frozen. + * @exception rb_eSystemCallError `write(2)` failed for some reason. + * @return The passed `io`. + * @post `io`'s buffers are empty. + * @note This operation also discards the read buffer. Should basically + * be harmless, but in an esoteric situation like when user pushed + * something different from what was read using `ungetc`, this + * operation in fact changes the behaviour of the `io`. + * @note Buffering is difficult. This operation flushes the data from + * our userspace to the kernel, but that doesn't always mean you + * can expect them stored persistently onto your hard drive. + */ +VALUE rb_io_flush(VALUE io); + +/** + * Queries if the passed IO is at the end of file. "The end of file" here mans + * that there are no more data to read. This function blocks until the read + * buffer is filled in, and if that operation reached the end of file, it still + * returns ::RUBY_Qfalse (because there are data yet in that buffer). It + * returns ::RUBY_Qtrue once after the buffer is cleared. + * + * @param[in,out] io Target io to query. + * @exception rb_eIOError `io` is not opened for reading. + * @exception rb_eFrozenError `io` is frozen. + * @retval RUBY_Qfalse There are things yet to be read. + * @retval RUBY_Qtrue "The end of file" situation. + */ +VALUE rb_io_eof(VALUE io); + +/** + * Sets the binmode. This operation nullifies the effect of textmode (newline + * conversion from `"\r\n"` to `"\n"` or vice versa). Note that it doesn't + * stop character encodings conversions. For instance an IO created using: + * + * ```ruby + * File.open( + * "/dev/urandom", + * textmode: true, + * external_encoding: Encoding::GB18030, + * internal_encoding: Encoding::Windows_31J) + * ``` + * + * has both newline and character conversions. If you pass such IO to this + * function, only the `textmode:true` part is cancelled. Texts read through + * the IO would still be encoded in Windows-31J; texts written to the IO will + * be encoded in GB18030. + * + * @param[out] io Target IO to modify. + * @exception rb_eFrozenError `io` is frozen. + * @return The passed `io`. + * @post `io` is in binmode. + * @note There is no equivalent operation in Ruby. You can do this only + * in C. + */ +VALUE rb_io_binmode(VALUE io); + +/** + * Forces no conversions be applied to the passed IO. Unlike rb_io_binmode(), + * this cancels any newline conversions as well as encoding conversions. Any + * texts read/written through the IO will be the verbatim binary contents. + * + * @param[out] io Target IO to modify. + * @exception rb_eFrozenError `io` is frozen. + * @return The passed `io`. + * @post `io` is in binmode. Both external/internal encoding are set to + * rb_ascii8bit_encoding(). + * @note This is the implementation of `IO#binmode`. + */ +VALUE rb_io_ascii8bit_binmode(VALUE io); + +/** + * Identical to rb_io_write(), except it always returns the passed IO. + * + * @param[out] io An IO, opened for writing. + * @param[in] str A String-like object to write to `io`. + * @exception rb_eIOError `io` isn't opened for writing. + * @exception rb_eFrozenError `io` is frozen. + * @exception rb_eTypeError No conversion from `str` to String. + * @exception rb_eSystemCallError `write(2)` failed. + * @return The passed `io`. + * @post `str` is written to `io`. + * @note This function blocks. + * + * @internal + * + * As rb_io_write(), above description is a fake. + */ +VALUE rb_io_addstr(VALUE io, VALUE str); + +/** + * This is a rb_f_sprintf() + rb_io_write() combo. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv A format string followed by its arguments. + * @param[out] io An IO, opened for writing. + * @exception rb_eIOError `io` isn't opened for writing. + * @exception rb_eFrozenError `io` is frozen. + * @exception rb_eTypeError No conversion from `str` to String. + * @exception rb_eSystemCallError `write(2)` failed. + * @return Always returns ::RUBY_Qnil. + * @post `argv` is formatted, then written to `io`. + * @note This function blocks. + * + * @internal + * + * As rb_io_write(), above descriptions include fakes. + */ +VALUE rb_io_printf(int argc, const VALUE *argv, VALUE io); + +/** + * Iterates over the passed array to apply rb_io_write() individually. If + * there is `$,`, this function inserts the string in middle of each + * iterations. If there is `$\`, this function appends the string at the end. + * If the array is empty, this function outputs `$_`. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv An array of strings to display. + * @param[out] io An IO, opened for writing. + * @exception rb_eIOError `io` isn't opened for writing. + * @exception rb_eFrozenError `io` is frozen. + * @exception rb_eTypeError No conversion from `str` to String. + * @exception rb_eSystemCallError `write(2)` failed. + * @return Always returns ::RUBY_Qnil. + * @post `argv` is written to `io`. + * @note This function blocks. + * @note This function calls rb_io_write() multiple times. Which means, + * it is not an atomic operation. Outputs from multiple threads + * can interleave. + * + * @internal + * + * As rb_io_write(), above descriptions include fakes. + */ +VALUE rb_io_print(int argc, const VALUE *argv, VALUE io); + +/** + * Iterates over the passed array to apply rb_io_write() individually. Unlike + * rb_io_print(), this function prints a newline per each element. It also + * flattens the passed array (OTOH rb_io_print() just resorts to + * rb_ary_to_s()). + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv An array of strings to display. + * @param[out] io An IO, opened for writing. + * @exception rb_eIOError `io` isn't opened for writing. + * @exception rb_eFrozenError `io` is frozen. + * @exception rb_eTypeError No conversion from `str` to String. + * @exception rb_eSystemCallError `write(2)` failed. + * @return Always returns ::RUBY_Qnil. + * @post `argv` is written to `io`. + * @note This function blocks. + * @note This function calls rb_io_write() multiple times. Which means, + * it is not an atomic operation. Outputs from multiple threads + * can interleave. + * + * @internal + * + * As rb_io_write(), above descriptions include fakes. + */ +VALUE rb_io_puts(int argc, const VALUE *argv, VALUE io); + +/** + * Creates an IO instance whose backend is the given file descriptor. C + * extension libraries sometimes have file descriptors created elsewhere (maybe + * deep inside of another shared library), which they want ruby programs to + * handle. This function is handy for such situations. + * + * @param[in] fd Target file descriptor. + * @param[in] flags Flags, e.g. `O_CREAT|O_EXCL` + * @param[in] path The path of the file that backs `fd`, for diagnostics. + * @return An allocated instance of ::rb_cIO. + * @note Leave `path` NULL if you don't know. + */ +VALUE rb_io_fdopen(int fd, int flags, const char *path); + +RBIMPL_ATTR_NONNULL(()) +/** + * Opens a file located at the given path. + * + * `fmode` is a C string that represents the open mode. It can be one of: + * + * - `r` (means `O_RDONLY`), + * - `w` (means `O_WRONLY | O_TRUNC | O_CREAT`), + * - `a` (means `O_WRONLY | O_APPEND | O_CREAT`), + * + * Followed by zero or more combinations of: + * + * - `b` (means `_O_BINARY`), + * - `t` (means `_O_TEXT`), + * - `+` (means `O_RDWR`), + * - `x` (means `O_TRUNC`), or + * - `:[BOM|]enc[:enc]` (see below). + * + * This last one specifies external (and internal if any) encodings, + * respectively. If optional `BOM|` is specified and the specified external + * encoding is capable of expressing BOMs, opening file's contents' byte order + * is auto-detected using the mechanism. + * + * So for instance, fmode of `"rt|BOM:utf-16le:utf-8"` specifies that... + * + * - the physical representation of the contents of the file is in UTF-16; + * - honours its BOM but assumes little endian if absent; + * - opens the file for reading; + * - what is read is converted into UTF-8; + * - with newlines cannibalised to `\n`. + * + * @param[in] fname Path to open. + * @param[in] fmode Mode specifier much like `fopen(3)`. + * @exception rb_eArgError `fmode` contradicted (e.g. `"bt"`). + * @exception rb_eSystemCallError `open(2)` failed for some reason. + * @return An instance of ::rb_cIO. + */ +VALUE rb_file_open(const char *fname, const char *fmode); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_file_open(), except it takes the pathname as a Ruby's string + * instead of C's. In case the passed Ruby object is a non-String it tries to + * call `#to_path`. + * + * @param[in] fname Path to open. + * @param[in] fmode Mode specifier much like `fopen(3)`. + * @exception rb_eTypeError `fname` is not a String. + * @exception rb_eEncCompatError `fname` is not ASCII-compatible. + * @exception rb_eArgError `fmode` contradicted (e.g. `"bt"`). + * @exception rb_eSystemCallError `open(2)` failed for some reason. + * @return An instance of ::rb_cIO. + */ +VALUE rb_file_open_str(VALUE fname, const char *fmode); + +/** + * Much like rb_io_gets(), but it reads from the mysterious ARGF object. ARGF + * in this context can be seen as a virtual IO which concatenates contents of + * the files passed to the process via the ARGV, or just STDIN if there are no + * such files. + * + * Unlike rb_io_gets() this function sets `$_`. + * + * @exception rb_eFrozenError ARGF resorts to STDIN but it is frozen. + * @retval RUBY_Qnil ARGF is at EOF. + * @retval otherwise An instance of ::rb_cString. + * @post ARGF is read. + * @post `$_` is set. + * + * @internal + * + * In reality, this function can call `ARGF.gets`. Its redefinition can affect + * the behaviour. + * + * Also, you can tamper ARGV on-the-fly in middle of ARGF usages: + * + * ``` + * gets # Reads the first file. + * ARGV << '/proc/self/limits' # Adds a file. + * gets # Can read from /proc/self/limits. + * ``` + */ +VALUE rb_gets(void); + +RBIMPL_ATTR_NONNULL(()) +/** + * Writes the given error message to somewhere applicable. On Windows it goes + * to the console. On POSIX environments it goes to the standard error. + * + * @warning IT IS A BAD IDEA to use this function form your C extensions. + * It is often annoying when GUI applications write to consoles; + * users don't want to look at there. Programmers also want to + * control the cause of the message itself, like by rescuing an + * exception. Just let ruby handle errors. That must be better than + * going your own way. + * + * @param[in] str Error message to display. + * @post `str` is written to somewhere. + * + * @internal + * + * AFAIK this function is listed here without marked deprecated because there + * are usages of this function in the wild. + */ +void rb_write_error(const char *str); + +/** + * Identical to rb_write_error(), except it additionally takes the message's + * length. Necessary when you want to handle wide characters. + * + * @param[in] str Error message to display. + * @param[in] len Length of `str`, in bytes. + * @post `str` is written to somewhere. + */ +void rb_write_error2(const char *str, long len); + +/** + * Closes everything. In case of POSIX environments, a child process inherits + * its parent's opened file descriptors. Which is nowadays considered as one + * of the UNIX mistakes. This function closes such inherited file descriptors. + * When your C extension needs to have a child process, don't forget to call + * this from your child process right before exec. + * + * @param[in] lowfd Lower bound of FDs (you want STDIN to remain, no?). + * @param[in] maxhint Hint of max FDs. + * @param[in] noclose_fds A hash, whose keys are an allowlist. + * + * @internal + * + * As of writing, in spite of the name, this function does not actually close + * anything. It just sets `FD_CLOEXEC` for everything and let `execve(2)` to + * atomically close them at once. This is because as far as we know there are + * no such platform that has `fork(2)` but lacks `FD_CLOEXEC`. + * + * Because this function is expected to run on a forked process it is entirely + * async-signal-safe. + */ +void rb_close_before_exec(int lowfd, int maxhint, VALUE noclose_fds); + +RBIMPL_ATTR_NONNULL(()) +/** + * This is an rb_cloexec_pipe() + rb_update_max_fd() combo. + * + * @param[out] pipes Return buffer. Must at least hold 2 elements. + * @retval 0 Successful creation of a pipe. + * @retval -1 Failure in underlying system call(s). + * @post `pipes` is filled with file descriptors. + * @post `errno` is set on failure. + */ +int rb_pipe(int *pipes); + +/** + * Queries if the given FD is reserved or not. Occasionally Ruby interpreter + * opens files for its own purposes. Use this function to prevent touching + * such behind-the-scene descriptors. + * + * @param[in] fd Target file descriptor. + * @retval 1 `fd` is reserved. + * @retval 0 Otherwise. + */ +int rb_reserved_fd_p(int fd); + +/** @alias{rb_reserved_fd_p} */ +#define RB_RESERVED_FD_P(fd) rb_reserved_fd_p(fd) + +/** + * Opens a file that closes on exec. In case of POSIX environments, a child + * process inherits its parent's opened file descriptors. Which is nowadays + * considered as one of the UNIX mistakes. This function opens a file + * descriptor as `open(2)` does, but additionally instructs the operating + * system that we don't want it be seen from child processes. + * + * @param[in] pathname File path to open. + * @param[in] flags Open mode, as in `open(2)`. + * @param[in] mode File mode, in case of `O_CREAT`. + * @retval -1 `open(2)` failed for some reason. + * @retval otherwise An allocated new file descriptor. + * @note This function does not raise. + * + * @internal + * + * Whether this function can take NULL or not depends on the underlying open(2) + * system call implementation but @shyouhei doesn't think it's worth trying. + */ +int rb_cloexec_open(const char *pathname, int flags, mode_t mode); + +/** + * Identical to rb_cloexec_fcntl_dupfd(), except it implies minfd is 3. + * + * @param[in] oldfd File descriptor to duplicate. + * @retval -1 `dup2(2)` failed for some reason. + * @retval otherwise An allocated new file descriptor. + * @note This function does not raise. + */ +int rb_cloexec_dup(int oldfd); + +/** + * Identical to rb_cloexec_dup(), except you can specify the destination file + * descriptor. If the destination is already squatted by another file + * descriptor that gets silently closed without any warnings. (This is a spec + * requested by POSIX.) + * + * @param[in] oldfd File descriptor to duplicate. + * @param[in] newfd Return value destination. + * @retval -1 `dup2(2)` failed for some reason. + * @retval newfd An allocated new file descriptor. + * @post Whatever sat at `newfd` gets closed with no notifications. + * @post In case return value is -1 `newfd` is untouched. + * @note This function does not raise. + */ +int rb_cloexec_dup2(int oldfd, int newfd); + +RBIMPL_ATTR_NONNULL(()) +/** + * Opens a pipe with closing on exec. In case of POSIX environments, a child + * process inherits its parent's opened file descriptors. Which is nowadays + * considered as one of the UNIX mistakes. This function opens a pipe as + * `pipe(2)` does, but additionally instructs the operating system that we + * don't want the duplicated FDs be seen from child processes. + * + * @param[out] fildes Return buffer. Must at least hold 2 elements. + * @retval 0 Successful creation of a pipe. + * @retval -1 Failure in underlying system call(s). + * @post `pipes` is filled with file descriptors. + * @post `errno` is set on failure. + */ +int rb_cloexec_pipe(int fildes[2]); + +/** + * Duplicates a file descriptor with closing on exec. In case of POSIX + * environments, a child process inherits its parent's opened file descriptors. + * Which is nowadays considered as one of the UNIX mistakes. This function + * duplicates a file descriptor as `dup(2)` does, but additionally instructs + * the operating system that we don't want the duplicated FD be seen from child + * processes. + * + * @param[in] fd File descriptor to duplicate. + * @param[in] minfd Minimum allowed FD to return. + * @retval -1 `dup(2)` failed for some reason. + * @retval otherwise An allocated new file descriptor. + * @note This function does not raise. + * + * `minfd` is handy when for instance STDERR is closed but you don't want to + * use fd 2. + */ +int rb_cloexec_fcntl_dupfd(int fd, int minfd); + +/** + * Informs the interpreter that the passed fd can be the max. This information + * is used from rb_close_before_exec(). + * + * @param[in] fd An open FD, which can be large. + */ +void rb_update_max_fd(int fd); + +/** + * Sets or clears the close-on-exec flag of the passed file descriptor to the + * desired state. STDIN, STDOUT, STDERR are the exceptional file descriptors + * that shall remain open. All others are to be closed on exec. When a C + * extension library opens a file descriptor using anything other than + * rb_cloexec_open() etc., that file descriptor shall experience this function. + * + * @param[in] fd An open file descriptor. + */ +void rb_fd_fix_cloexec(int fd); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_IO_H */ diff --git a/libs/libruby/ruby/internal/intern/load.h b/libs/libruby/ruby/internal/intern/load.h new file mode 100644 index 0000000..288a16c --- /dev/null +++ b/libs/libruby/ruby/internal/intern/load.h @@ -0,0 +1,218 @@ +#ifndef RBIMPL_INTERN_LOAD_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_LOAD_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_f_require(). + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* load.c */ + +/** + * Loads and executes the Ruby program in the given file. + * + * If the path is an absolute path (e.g. starts with `'/'`), the file will be + * loaded directly using the absolute path. If the path is an explicit + * relative path (e.g. starts with `'./'` or `'../'`), the file will be loaded + * using the relative path from the current directory. Otherwise, the file + * will be searched for in the library directories listed in the `$LOAD_PATH`. + * If the file is found in a directory, this function will attempt to load the + * file relative to that directory. If the file is not found in any of the + * directories in the `$LOAD_PATH`, the file will be loaded using the relative + * path from the current directory. + * + * If the file doesn't exist when there is an attempt to load it, a LoadError + * will be raised. + * + * If the `wrap` parameter is true, the loaded script will be executed under an + * anonymous module, protecting the calling program's global namespace. In no + * circumstance will any local variables in the loaded file be propagated to + * the loading environment. + * + * @param[in] path Pathname of a file to load. + * @param[in] wrap Either to load under an anonymous module. + * @exception rb_eTypeError `path` is not a string. + * @exception rb_eArgError `path` is broken as a pathname. + * @exception rb_eEncCompatError `path` is incompatible with pathnames. + * @exception rb_eLoadError `path` not found. + * @exception rb_eException Any exceptions while loading the contents. + * + * @internal + * + * It seems this function is under the rule of bootsnap's regime? + */ +void rb_load(VALUE path, int wrap); + +/** + * Identical to rb_load(), except it avoids potential global escapes. Such + * global escapes include exceptions, `throw`, `break`, for example. + * + * It first evaluates the given file as rb_load() does. If no global escape + * occurred during the evaluation, it `*state` is set to zero on return. + * Otherwise, it sets `*state` to nonzero. If state is `NULL`, it is not set + * in both cases. + * + * @param[in] path Pathname of a file to load. + * @param[in] wrap Either to load under an anonymous module. + * @param[out] state State of execution. + * @post `*state` is set to zero if succeeded. Nonzero otherwise. + * @warning You have to clear the error info with `rb_set_errinfo(Qnil)` if + * you decide to ignore the caught exception. + * @see rb_load + * @see rb_protect + * + * @internal + * + * Though not a part of our public API, `state` is in fact an + * enum ruby_tag_type. You can see the potential "nonzero" values by looking + * at vm_core.h. + */ +void rb_load_protect(VALUE path, int wrap, int *state); + +RBIMPL_ATTR_NONNULL(()) +/** + * Queries if the given feature has already been loaded into the execution + * context. The "feature" head are things like `"json"` or `"socket"`. + * + * @param[in] feature Name of a library you want to know about. + * @retval 1 Yes there is. + * @retval 0 Not yet. + */ +int rb_provided(const char *feature); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Identical to rb_provided(), except it additionally returns the "canonical" + * name of the loaded feature. This can be handy when for instance you want to + * know the actually loaded library is either `foo.rb` or `foo.so`. + * + * @param[in] feature Name of a library you want to know about. + * @param[out] loading Return buffer. + * @retval 1 Yes there is. + * @retval 0 Not yet. + */ +int rb_feature_provided(const char *feature, const char **loading); + +RBIMPL_ATTR_NONNULL(()) +/** + * Declares that the given feature is already provided by someone else. This + * API can be handy when you have an extension called `foo.so` which, when + * required, also provides functionality of `bar.so`. + * + * @param[in] feature Name of a library which had already been provided. + * @post No further `require` would search `feature`. + */ +void rb_provide(const char *feature); + +/** + * Identical to rb_require_string(), except it ignores the first argument for + * no reason. There seems to be no reason for 3rd party extension libraries to + * use it. + * + * @param[in] self Ignored. Can be anything. + * @param[in] feature Name of a feature, e.g. `"json"`. + * @exception rb_eLoadError No such feature. + * @exception rb_eRuntimeError `$"` is frozen; unable to push. + * @retval RUBY_Qtrue The feature is loaded for the first time. + * @retval RUBY_Qfalse The feature has already been loaded. + * @post `$"` is updated. + */ +VALUE rb_f_require(VALUE self, VALUE feature); + +/** + * Finds and loads the given feature, if absent. + * + * If the feature is an absolute path (e.g. starts with `'/'`), the feature + * will be loaded directly using the absolute path. If the feature is an + * explicit relative path (e.g. starts with `'./'` or `'../'`), the feature + * will be loaded using the relative path from the current directory. + * Otherwise, the feature will be searched for in the library directories + * listed in the `$LOAD_PATH`. + * + * If the feature has the extension `".rb"`, it is loaded as a source file; if + * the extension is `".so"`, `".o"`, or `".dll"`, or the default shared library + * extension on the current platform, Ruby loads the shared library as a Ruby + * extension. Otherwise, Ruby tries adding `".rb"`, `".so"`, and so on to the + * name until found. If the file named cannot be found, a LoadError will be + * raised. + * + * For extension libraries the given feature may use any shared library + * extension. For example, on Linux you can require `"socket.dll"` to actually + * load `socket.so`. + * + * The absolute path of the loaded file is added to `$LOADED_FEATURES`. A file + * will not be loaded again if its path already appears in there. + * + * Any constants or globals within the loaded source file will be available in + * the calling program's global namespace. However, local variables will not + * be propagated to the loading environment. + * + * @param[in] feature Name of a feature, e.g. `"json"`. + * @exception rb_eLoadError No such feature. + * @exception rb_eRuntimeError `$"` is frozen; unable to push. + * @retval RUBY_Qtrue The feature is loaded for the first time. + * @retval RUBY_Qfalse The feature has already been loaded. + * @post `$"` is updated. + */ +VALUE rb_require_string(VALUE feature); + +/** + * @name extension configuration + * @{ + */ + +/** + * Asserts that the extension library that calls this function is aware of + * Ractor. Multiple Ractors run without protecting each other. This doesn't + * interface well with C programs, unless designed with an in-depth + * understanding of how Ractors work. Extension libraries are shut out from + * Ractors by default. This API is to bypass that restriction. Once after it + * was called, successive calls to rb_define_method() etc. become definitions + * of methods that are aware of Ractors. The amendment would be in effect + * until the end of rb_require_string() etc. + * + * @param[in] flag Either the library is aware of Ractors or not. + * @post Methods would be callable form Ractors, if `flag` is true. + */ +void rb_ext_ractor_safe(bool flag); + +/** @alias{rb_ext_ractor_safe} */ +#define RB_EXT_RACTOR_SAFE(f) rb_ext_ractor_safe(f) + +/** + * This macro is to provide backwards compatibility. It must be safe to do + * something like: + * + * ```CXX + * #ifdef HAVE_RB_EXT_RACTOR_SAFE + * rb_ext_ractor_safe(true); + * #endif + * ``` + */ +#define HAVE_RB_EXT_RACTOR_SAFE 1 + +/** @} */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_LOAD_H */ diff --git a/libs/libruby/ruby/internal/intern/marshal.h b/libs/libruby/ruby/internal/intern/marshal.h new file mode 100644 index 0000000..118d78a --- /dev/null +++ b/libs/libruby/ruby/internal/intern/marshal.h @@ -0,0 +1,112 @@ +#ifndef RBIMPL_INTERN_MARSHAL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_MARSHAL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to rb_mMarshal. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* marshal.c */ + +/** + * Serialises the given object and all its referring objects, to write them + * down to the passed port. + * + * @param[in] obj Target object to dump. + * @param[out] port IO-like destination buffer. + * @exception rb_eTypeError `obj` cannot be dumped for some reason. + * @exception rb_eRuntimeError `obj` was tampered during dumping. + * @exception rb_eArgError Traversal too deep. + * @return The passed `port` as-is. + * @post Serialised representation of `obj` is written to `port`. + * @note `port` is basically an IO but StringIO is also possible. + */ +VALUE rb_marshal_dump(VALUE obj, VALUE port); + +/** + * Deserialises a previous output of rb_marshal_dump() into a network of + * objects. + * + * @param[in,out] port Either IO or String. + * @exception rb_eTypeError `port` is in unexpected type. + * @exception rb_eArgError Contents of `port` is broken. + * @return Object(s) rebuilt using the info from `port`. + * + * SECURITY CONSIDERATIONS + * ======================== + * + * @warning By design, rb_marshal_load() can deserialise almost any + * class loaded into the Ruby process. In many cases this can + * lead to remote code execution if the Marshal data is loaded + * from an untrusted source. + * @warning As a result, rb_marshal_load() is not suitable as a general + * purpose serialisation format and you should never unmarshal + * user supplied input or other untrusted data. + * @warning If you need to deserialise untrusted data, use JSON or + * another serialisation format that is only able to load + * simple, 'primitive' types such as String, Array, Hash, etc. + * Never allow user input to specify arbitrary types to + * deserialise into. + */ +VALUE rb_marshal_load(VALUE port); + +/** + * Marshal format compatibility layer. Over time, classes evolve, so that + * their internal data structure change drastically. For instance an instance + * of ::rb_cRange was made of ::RUBY_T_OBJECT in 1.x., but in 3.x it is a + * ::RUBY_T_STRUCT now. In order to keep binary compatibility, we "fake" the + * marshalled representation to stick to old types. This is the API to enable + * that manoeuvre. Here is how: + * + * First, because you are going to keep backwards compatibility, you need to + * retain the old implementation of your class. Rename it, and keep the class + * somewhere (for instance rb_register_global_address() could help). Next + * create your new class. Do whatever you want. + * + * Then, this is the key point. Create two new "bridge" functions that convert + * the structs back and forth: + * + * - the "dumper" function that takes an instance of the new class, and + * returns an instance of the old one. This is called from + * rb_marshal_dump(), to keep it possible for old programs to read your new + * data. + * + * - the "loader" function that takes two arguments, new one and old one, in + * that order. rb_marshal_load() calls this function when it finds a + * representation of the retained old class. The old one passed to this + * function is the reconstructed instance of the old class. + * Reverse-engineer that to modify the new one, to have the identical + * contents. + * + * Finally, connect all of them using this function. + * + * @param[in] newclass The class that needs conversion. + * @param[in] oldclass Old implementation of `newclass`. + * @param[in] dumper Function that converts `newclass` to `oldclass`. + * @param[in] loader Function that converts `oldclass` to `newclass`. + * @exception rb_eTypeError `newclass` has no allocator. + */ +void rb_marshal_define_compat(VALUE newclass, VALUE oldclass, VALUE (*dumper)(VALUE), VALUE (*loader)(VALUE, VALUE)); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_MARSHAL_H */ diff --git a/libs/libruby/ruby/internal/intern/numeric.h b/libs/libruby/ruby/internal/intern/numeric.h new file mode 100644 index 0000000..30863fb --- /dev/null +++ b/libs/libruby/ruby/internal/intern/numeric.h @@ -0,0 +1,208 @@ +#ifndef RBIMPL_INTERN_NUMERIC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_NUMERIC_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cNumeric. + */ +#include "ruby/internal/attr/cold.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define RB_NUM_COERCE_FUNCS_NEED_OPID 1 + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* numeric.c */ + +RBIMPL_ATTR_NORETURN() +RBIMPL_ATTR_COLD() +/** + * Just always raises an exception. + * + * @exception rb_eZeroDivError Division by zero error. + */ +void rb_num_zerodiv(void); + +/** + * @name Coercion operators. + * + * What is a coercion? Well Ruby is basically an OOPL but it also has + * arithmetic operators. They are implemented in OO manners. For instance + * `a+b` is a binary operation `+`, whose receiver is `a`, and whose (sole) + * argument is `b`. + * + * The problem is, you often want `a+b == b+a` to hold. That is easy if both + * `a` and `b` belongs to the same class... Ensuring `1 + 2 == 2 + 1` is kind + * of intuitive. But if you want `1.0 + 2 == 2 + 1.0`, things start getting + * complicated. `1.0+2` is `Float#+`, while `2+1.0` is `Integer#+`. In order + * to achieve the equality Float's and Integer's methods must agree with their + * behaviours. + * + * Now. Floats versus Integers situation is still controllable because they + * are both built-in. But in Ruby you can define your own numeric classes. + * BigDecimal, which is a rubygems gem distributed along with the interpreter, + * is one of such examples. Rational was another such example before. In + * short you cannot create list of all possible combination of the classes that + * could be the operand of `+` operator. Then how do we achieve the + * commutativity? + * + * Here comes the concept of coercion. If a definition of an operator + * encounters an object which is unknown to the author, just assumes that the + * unknown object knows how to handle the situation. So for instance when + * `1+x` has unknown `x`, it lets the `x` handle this. + * + * ```ruby + * class Foo + * def +(x) + * if we_know_what_is_x? then + * ... # handle here + * else + * y, z = x.coerce self + * return y + z + * end + * end + * end + * ``` + * + * The `x.coerce` method returns a 2-element array which are "casted" versions + * of `x` and `self`. + * + * @{ + */ + +/** + * Coerced binary operation. This function first coerces the two objects, then + * applies the operation. + * + * @param[in] lhs LHS operand. + * @param[in] rhs RHS operand. + * @param[in] op Operator method name. + * @exception rb_eTypeError Coercion failed for some reason. + * @return `lhs op rhs`, in a coerced way. + */ +VALUE rb_num_coerce_bin(VALUE lhs, VALUE rhs, ID op); + +/** + * Identical to rb_num_coerce_bin(), except for return values. This function + * best suits for comparison operators e.g. `<=>`. + * + * @param[in] lhs LHS operand. + * @param[in] rhs RHS operand. + * @param[in] op Operator method name. + * @retval RUBY_Qnil Coercion failed for some reason. + * @retval otherwise `lhs op rhs`, in a coerced way. + */ +VALUE rb_num_coerce_cmp(VALUE lhs, VALUE rhs, ID op); + +/** + * Identical to rb_num_coerce_cmp(), except for return values. This function + * best suits for relationship operators e.g. `<=`. + * + * @param[in] lhs LHS operand. + * @param[in] rhs RHS operand. + * @param[in] op Operator method name. + * @exception rb_eArgError Coercion failed for some reason. + * @return `lhs op rhs`, in a coerced way. + */ +VALUE rb_num_coerce_relop(VALUE lhs, VALUE rhs, ID op); + +/** + * This one is optimised for bitwise operations, but the API is identical to + * rb_num_coerce_bin(). + * + * @param[in] lhs LHS operand. + * @param[in] rhs RHS operand. + * @param[in] op Operator method name. + * @exception rb_eArgError Coercion failed for some reason. + * @return `lhs op rhs`, in a coerced way. + */ +VALUE rb_num_coerce_bit(VALUE lhs, VALUE rhs, ID op); + +/** @} */ + +/** + * Converts a numeric value into a Fixnum. This is not a preserving + * conversion; for instance 1.5 would be converted into 1. + * + * @param[in] val A numeric object. + * @exception rb_eTypeError No conversion from `val` to Integer. + * @exception rb_eRangeError `val` out of range. + * @return A fixnum converted from `val`. + * + * @internal + * + * This seems used from nowhere? + */ +VALUE rb_num2fix(VALUE val); + +/** + * Generates a place-value representation of the given Fixnum, with given + * radix. + * + * @param[in] val A fixnum to stringify. + * @param[in] base `2` to `36` inclusive for each radix. + * @exception rb_eArgError `base` is out of range. + * @return An instance of ::rb_cString representing `val`. + * @pre `val` must be a Fixnum (no checks performed). + */ +VALUE rb_fix2str(VALUE val, int base); + +RBIMPL_ATTR_CONST() +/** + * Compares two `double`s. Handy when implementing a spaceship operator. + * + * @param[in] lhs A value. + * @param[in] rhs Another value. + * @retval RB_INT2FIX(-1) `lhs` is "bigger than" `rhs`. + * @retval RB_INT2FIX(1) `rhs` is "bigger than" `lhs`. + * @retval RB_INT2FIX(0) They are equal. + * @retval RUBY_Qnil Not comparable, e.g. NaN. + */ +VALUE rb_dbl_cmp(double lhs, double rhs); + +/** + * Raises the passed `x` to the power of `y`. + * + * @note The return value can be really big. + * @note Also the return value can be really small, in case `x` is a + * negative number. + * @param[in] x A number. + * @param[in] y Another number. + * @retval Inf Cannot express the result. + * @retval 1 Either `y` is 0 or `x` is 1. + * @retval otherwise An instance of ::rb_cInteger whose value is `x ** y`. + * + * @internal + * + * This function returns Infinity when `y` is big enough not to fit into a + * Fixnum. Warning is issued then. + */ +RUBY_EXTERN VALUE rb_int_positive_pow(long x, unsigned long y); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_NUMERIC_H */ diff --git a/libs/libruby/ruby/internal/intern/object.h b/libs/libruby/ruby/internal/intern/object.h new file mode 100644 index 0000000..b9ffa57 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/object.h @@ -0,0 +1,501 @@ +#ifndef RBIMPL_INTERN_OBJECT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_OBJECT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cObject. + */ +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/deprecated.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * This macro is (used but) mysterious. Why on earth do we need this? + * + * - `obj != orig` check is done anyways inside of rb_obj_init_copy(). + * - rb_obj_init_copy() returns something. No need are there to add `, 1`. + */ +#define RB_OBJ_INIT_COPY(obj, orig) \ + ((obj) != (orig) && (rb_obj_init_copy((obj), (orig)), 1)) +/** @old{RB_OBJ_INIT_COPY} */ +#define OBJ_INIT_COPY(obj, orig) RB_OBJ_INIT_COPY(obj, orig) + +/* object.c */ + +/** + * Identical to rb_class_new_instance(), except it passes the passed keywords + * if any to the `#initialize` method. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] klass An instance of ::rb_cClass. + * @exception rb_eTypeError `klass`'s allocator is undefined. + * @exception rb_eException Any exceptions can happen inside. + * @return An allocated new instance of `klass`. + * @note This is _the_ implementation of `Object.new`. + */ +VALUE rb_class_new_instance_pass_kw(int argc, const VALUE *argv, VALUE klass); + +/** + * Allocates, then initialises an instance of the given class. It first calls + * the passed class' allocator to obtain an uninitialised object, then calls + * its initialiser with the remaining arguments. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arguments passed to `#initialize`. + * @param[in] klass An instance of ::rb_cClass. + * @exception rb_eTypeError `klass`'s allocator is undefined. + * @exception rb_eException Any exceptions can happen inside. + * @return An allocated new instance of `klass`. + */ +VALUE rb_class_new_instance(int argc, const VALUE *argv, VALUE klass); + +/** + * Identical to rb_class_new_instance(), except you can specify how to handle + * the last element of the given array. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] klass An instance of ::rb_cClass. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eTypeError `klass`'s allocator is undefined. + * @exception rb_eException Any exceptions can happen inside. + * @return An allocated new instance of `klass`. + */ +VALUE rb_class_new_instance_kw(int argc, const VALUE *argv, VALUE klass, int kw_splat); + +/** + * Checks for equality of the passed objects, in terms of `Object#eql?`. + * + * @param[in] lhs Comparison left hand side. + * @param[in] rhs Comparison right hand side. + * @retval non-zero They are equal. + * @retval 0 Otherwise. + * @note This function actually calls `lhs.eql?(rhs)` so you cannot + * implement your class' `#eql?` method using it. + */ +int rb_eql(VALUE lhs, VALUE rhs); + +/** + * Generates a textual representation of the given object. + * + * @param[in] obj Arbitrary ruby object. + * @return An instance of ::rb_cString that represents `obj`. + * @note This is the default implementation of `Object#to_s` that each + * subclasses want to override. + */ +VALUE rb_any_to_s(VALUE obj); + +/** + * Generates a human-readable textual representation of the given object. This + * is largely similar to Ruby level `Object#inspect` but not the same; it + * additionally escapes the inspection result so that the string be compatible + * with that of default internal (or default external, if absent). + * + * @param[in] obj Arbitrary ruby object. + * @return An instance of ::rb_cString that represents `obj`. + */ +VALUE rb_inspect(VALUE obj); + +/** + * Queries if the given object is a direct instance of the given class. + * + * @param[in] obj Arbitrary ruby object. + * @param[in] klass An instance of ::rb_cModule. + * @exception rb_eTypeError `klass` is neither module nor class. + * @retval RUBY_Qtrue `obj` is an instance of `klass`. + * @retval RUBY_Qfalse Otherwise. + */ +VALUE rb_obj_is_instance_of(VALUE obj, VALUE klass); + +/** + * Queries if the given object is an instance (of possibly descendants) of the + * given class. + * + * @param[in] obj Arbitrary ruby object. + * @param[in] klass An instance of ::rb_cModule. + * @exception rb_eTypeError `klass` is neither module nor class. + * @retval RUBY_Qtrue `obj` is a `klass`. + * @retval RUBY_Qfalse Otherwise. + */ +VALUE rb_obj_is_kind_of(VALUE obj, VALUE klass); + +/** + * Allocates an instance of the given class. + * + * @param[in] klass A class to instantiate. + * @exception rb_eTypeError `klass` is not a class. + * @return An allocated, not yet initialised instance of `klass`. + * @note It calls the allocator defined by rb_define_alloc_func(). You + * cannot use this function to define an allocator. Use + * rb_newobj_of(), #TypedData_Make_Struct or others, instead. + * @note Usually prefer rb_class_new_instance() to rb_obj_alloc() and + * rb_obj_call_init(). + * @see rb_class_new_instance() + * @see rb_obj_call_init() + * @see rb_define_alloc_func() + * @see rb_newobj_of() + * @see #TypedData_Make_Struct + */ +VALUE rb_obj_alloc(VALUE klass); + +/** + * Produces a shallow copy of the given object. Its list of instance variables + * are copied, but not the objects they reference. It also copies the frozen + * value state. + * + * @param[in] obj Arbitrary ruby object. + * @exception rb_eException `#initialize_copy` can raise anything. + * @return A "clone" of `obj`. + * + * @internal + * + * Unlike ruby-level `Object#clone`, there is no way to control the frozen-ness + * of the return value. + */ +VALUE rb_obj_clone(VALUE obj); + +/** + * Duplicates the given object. This does almost the same thing as + * rb_obj_clone() do. However it does not copy the singleton class (if any). + * It also doesn't copy frozen-ness. + * + * @param[in] obj Arbitrary ruby object. + * @exception rb_eException `#initialize_copy` can raise anything. + * @return A shallow copy of `obj`. + */ +VALUE rb_obj_dup(VALUE obj); + +/** + * Default implementation of `#initialize_copy`, `#initialize_dup` and + * `#initialize_clone`. It does almost nothing. Just raises exceptions for + * checks. + * + * @param[in] dst The destination object. + * @param[in] src The source object. + * @exception rb_eFrozenError `dst` is frozen. + * @exception rb_eTypeError `dst` and `src` have different classes. + * @return Always returns `dst`. + */ +VALUE rb_obj_init_copy(VALUE src, VALUE dst); + +/** + * Just calls rb_obj_freeze_inline() inside. Does this make any sens to + * extension libraries? + * + * @param[out] obj Object to freeze. + * @return Verbatim `obj`. + */ +VALUE rb_obj_freeze(VALUE obj); + +RBIMPL_ATTR_PURE() +/** + * Just calls RB_OBJ_FROZEN() inside. Does this make any sens to extension + * libraries? + * + * @param[in] obj Object in question. + * @retval RUBY_Qtrue Yes it is. + * @retval RUBY_Qfalse No it isn't. + */ +VALUE rb_obj_frozen_p(VALUE obj); + +/* gc.c */ + +/** + * Finds or creates an integer primary key of the given object. In the old + * days this function was a purely arithmetic operation that maps the + * underlying memory address where the object resides into a Ruby's integer. + * Some time around 2.x this changed. It no longer relates its return values + * to C level pointers. This function assigns some random number to the given + * object if absent. The same number will be returned on all subsequent + * requests. No two active objects share a number. + * + * @param[in] obj Arbitrary ruby object. + * @return An instance of ::rb_cInteger which is an "identifier" of `obj`. + * + * @internal + * + * The "some random number" is in fact a monotonic-increasing process-global + * unique integer, much like an `INTEGER AUTO_INCREMENT PRIMARY KEY` column in + * a MySQL table. + */ +VALUE rb_obj_id(VALUE obj); + +RBIMPL_ATTR_CONST() +/** + * Identical to rb_obj_id(), except it hesitates from allocating a new instance + * of ::rb_cInteger. rb_obj_id() could allocate ::RUBY_T_BIGNUM objects. That + * allocation might perhaps impact negatively. On such situations, this + * function instead returns one-shot temporary small integers that need no + * allocations at all. The values are guaranteed unique at the moment, but no + * future promise is made; could be reused. Use of this API should be very + * instant. It is a failure to store the returned integer to somewhere else. + * + * In short it is difficult to use. + * + * @param[in] obj Arbitrary ruby object. + * @return An instance of ::rb_cInteger unique at the moment. + * + * @internal + * + * This is roughly the old behaviour of rb_obj_id(). + */ +VALUE rb_memory_id(VALUE obj); + +/* object.c */ + +RBIMPL_ATTR_PURE() +/** + * Finds a "real" class. As the name implies there are class objects that are + * surreal. This function takes a class, traverses its ancestry tree, and + * returns its nearest ancestor which is neither a module nor a singleton + * class. + * + * @param[in] klass An instance of ::rb_cClass. + * @retval RUBY_Qfalse No real class in `klass`' ancestry tree. + * @retval klass `klass` itself is a real class. + * @retval otherwise Nearest ancestor of `klass` who is real. + */ +VALUE rb_class_real(VALUE klass); + +RBIMPL_ATTR_PURE() +/** + * Determines if the given two modules are relatives. + * + * @param[in] scion Possible subclass. + * @param[in] ascendant Possible superclass. + * @exception rb_eTypeError `ascendant` is not a module. + * @retval RUBY_Qtrue `scion` inherits, or is equal to `ascendant`. + * @retval RUBY_Qfalse `ascendant` inherits `scion`. + * @retval RUBY_Qnil They are not relatives. + */ +VALUE rb_class_inherited_p(VALUE scion, VALUE ascendant); + +RBIMPL_ATTR_PURE() +/** + * Queries the parent of the given class. + * + * @param[in] klass A child class. + * @exception rb_eTypeError `klass` is a `Class.allocate`. + * @retval RUBY_Qfalse `klass` has no superclass. + * @retval otherwise `klass`' superclass. + * + * @internal + * + * Is there any class except ::rb_cBasicObject, that has no superclass? + */ +VALUE rb_class_superclass(VALUE klass); + +RBIMPL_ATTR_NONNULL(()) +/** + * Converts an object into another type. Calls the specified conversion method + * if necessary. + * + * @param[in] val An object to convert. + * @param[in] type A value of enum ::ruby_value_type. + * @param[in] name Name to display on error (e.g. "Array"). + * @param[in] mid Conversion method (e.g. "to_ary"). + * @exception rb_eTypeError Failed to convert. + * @return An object of the specified type. + */ +VALUE rb_convert_type(VALUE val, int type, const char *name, const char *mid); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_convert_type(), except it returns ::RUBY_Qnil instead of + * raising exceptions, in case of conversion failure. It still raises + * exceptions for various reasons, like when the conversion method itself + * raises, though. + * + * @param[in] val An object to convert. + * @param[in] type A value of enum ::ruby_value_type. + * @param[in] name Name to display on error (e.g. "Array"). + * @param[in] mid Conversion method (e.g. "to_ary"). + * @exception rb_eTypeError The `mid` does not generate `type`. + * @retval RUBY_Qnil No conversion defined. + * @retval otherwise An object of the specified type. + */ +VALUE rb_check_convert_type(VALUE val, int type, const char *name, const char *mid); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_check_convert_type(), except the return value type is fixed + * to ::rb_cInteger. + * + * @param[in] val An object to convert. + * @param[in] mid Conversion method (e.g. "to_ary"). + * @exception rb_eTypeError The `mid` does not generate an integer. + * @retval RUBY_Qnil No conversion defined. + * @retval otherwise An instance of ::rb_cInteger. + */ +VALUE rb_check_to_integer(VALUE val, const char *mid); + +/** + * This is complicated. + * + * - When the passed object is already an instance of ::rb_cFloat, just + * returns it as-is. + * + * - When the passed object is something numeric, the function tries to + * convert it using `#to_f` method. + * + * - If that conversion fails (this happens for instance when the numeric + * is a complex) it returns ::RUBY_Qnil. + * + * - Otherwise returns the conversion result. + * + * - Otherwise it also returns ::RUBY_Qnil. + * + * @param[in] val An object to convert. + * @retval RUBY_Qnil Conversion from `val` to float is undefined. + * @retval otherwise Converted result. + */ +VALUE rb_check_to_float(VALUE val); + +/** + * Identical to rb_check_to_int(), except it raises in case of conversion + * mismatch. + * + * @param[in] val An object to convert. + * @exception rb_eTypeError `#to_int` does not generate an integer. + * @return An instance of ::rb_cInteger. + */ +VALUE rb_to_int(VALUE val); + +/** + * Identical to rb_check_to_integer(), except it uses `#to_int` for conversion. + * + * @param[in] val An object to convert. + * @exception rb_eTypeError `#to_int` does not return an integer. + * @retval RUBY_Qnil No conversion defined. + * @retval otherwise An instance of ::rb_cInteger. + */ +VALUE rb_check_to_int(VALUE val); + +/** + * This is the logic behind `Kernel#Integer`. Numeric types are converted + * directly, with floating point numbers being truncated. Strings are + * interpreted strictly; only leading/trailing whitespaces, plus/minus sign, + * radix indicators such as `0x`, digits, and underscores are allowed. + * Anything else are converted by first trying `#to_int`, then `#to_i`. + * + * This is slightly stricter than `String#to_i`. + * + * @param[in] val An object to convert. + * @exception rb_eArgError Malformed `val` passed. + * @exception rb_eTypeError No conversion defined. + * @return An instance of ::rb_cInteger. + */ +VALUE rb_Integer(VALUE val); + +/** + * Identical to rb_check_to_float(), except it raises on error. + * + * @param[in] val An object to convert. + * @exception rb_eTypeError No conversion defined. + * @return An instance of ::rb_cFloat. + */ +VALUE rb_to_float(VALUE val); + +/** + * This is the logic behind `Kernel#Float`. Numeric types are converted + * directly to the nearest value that a Float can represent. Strings are + * interpreted strictly; only leading/trailing whitespaces are allowed except + * what `strtod` understands. Anything else are converted using `#to_f`. + * + * This is slightly stricter than `String#to_f`. + * + * @param[in] val An object to convert. + * @exception rb_eArgError Malformed `val` passed. + * @exception rb_eTypeError No conversion defined. + * @return An instance of ::rb_cFloat. + */ +VALUE rb_Float(VALUE val); + +/** + * This is the logic behind `Kernel#String`. Arguments are converted by first + * trying `#to_str`, then `#to_s`. + * + * @param[in] val An object to convert. + * @exception rb_eTypeError No conversion defined. + * @return An instance of ::rb_cString. + */ +VALUE rb_String(VALUE val); + +/** + * This is the logic behind `Kernel#Array`. Arguments are converted by first + * trying `#to_ary`, then `#to_a`, and if both failed, returns an array of + * length 1 that contains the passed argument as the sole contents. + * + * @param[in] val An object to convert. + * @return An instance of ::rb_cArray. + */ +VALUE rb_Array(VALUE val); + +/** + * This is the logic behind `Kernel#Hash`. Arguments are converted by first + * trying `#to_hash`. if it failed, and the argument is either ::RUBY_Qnil or + * an empty array, returns an empty hash. Otherwise an exception is raised. + * + * @param[in] val An object to convert. + * @exception rb_eTypeError No conversion defined. + * @return An instance of ::rb_cHash. + */ +VALUE rb_Hash(VALUE val); + +RBIMPL_ATTR_NONNULL(()) +/** + * Converts a textual representation of a real number into a numeric, which is + * the nearest value that the return type can represent, of the value that the + * argument represents. This is in fact a 2-in-1 function whose behaviour can + * be controlled using the second (mode) argument. If the mode is zero, this + * function is in "historical" mode which only understands "floating-constant" + * defined at ISO/IEC 9899:1990 section 6.1.3.1. If the mode is nonzero, it is + * in "extended" mode, which also accepts "hexadecimal-floating-constant" + * defined at ISO/IEC 9899:2018 section 6.4.4.2. + * + * @param[in] str A textual representation of a real number. + * @param[in] mode Conversion mode, as described above. + * @exception rb_eArgError Malformed `str` passed. + * @see https://bugs.ruby-lang.org/issues/2969 + * @note Null pointers are allowed, and it returns 0.0 then. + */ +double rb_cstr_to_dbl(const char *str, int mode); + +/** + * Identical to rb_cstr_to_dbl(), except it accepts a Ruby's string instead of + * C's. + * + * @param[in] str A textual representation of a real number. + * @param[in] mode Conversion mode, as described in rb_cstr_to_dbl(). + * @exception rb_eArgError Malformed `str` passed. + * @see https://bugs.ruby-lang.org/issues/2969 + */ +double rb_str_to_dbl(VALUE str, int mode); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_OBJECT_H */ diff --git a/libs/libruby/ruby/internal/intern/parse.h b/libs/libruby/ruby/internal/intern/parse.h new file mode 100644 index 0000000..7c4e992 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/parse.h @@ -0,0 +1,194 @@ +#ifndef RBIMPL_INTERN_PARSE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_PARSE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cSymbol. + */ +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* symbol.c */ + +/** + * Calculates an ID of attribute writer. For instance it returns `:foo=` when + * passed `:foo`. + * + * @param[in] id An id. + * @exception rb_eNameError `id` is not for attributes (e.g. operator). + * @return Calculated name of attribute writer. + */ +ID rb_id_attrset(ID id); + +RBIMPL_ATTR_CONST() +/** + * Classifies the given ID, then sees if it is a constant. In case an ID is in + * Unicode (likely), its "constant"-ness is determined if its first character + * is either upper case or title case. Otherwise it is detected if case- + * folding the first character changes its case or not. + * + * @param[in] id An id to classify. + * @retval 1 It is a constant. + * @retval 0 It isn't. + */ +int rb_is_const_id(ID id); + +RBIMPL_ATTR_CONST() +/** + * Classifies the given ID, then sees if it is a global variable. A global + * variable must start with `$`. + * + * @param[in] id An id to classify. + * @retval 1 It is a global variable. + * @retval 0 It isn't. + */ +int rb_is_global_id(ID id); + +RBIMPL_ATTR_CONST() +/** + * Classifies the given ID, then sees if it is an instance variable. An + * instance variable must start with `@`, but not `@@`. + * + * @param[in] id An id to classify. + * @retval 1 It is an instance variable. + * @retval 0 It isn't. + */ +int rb_is_instance_id(ID id); + +RBIMPL_ATTR_CONST() +/** + * Classifies the given ID, then sees if it is an attribute writer. An + * attribute writer is otherwise a local variable, except it ends with `=`. + * + * @param[in] id An id to classify. + * @retval 1 It is an attribute writer. + * @retval 0 It isn't. + */ +int rb_is_attrset_id(ID id); + +RBIMPL_ATTR_CONST() +/** + * Classifies the given ID, then sees if it is a class variable. A class + * variable is must start with `@@`. + * + * @param[in] id An id to classify. + * @retval 1 It is a class variable. + * @retval 0 It isn't. + */ +int rb_is_class_id(ID id); + +RBIMPL_ATTR_CONST() +/** + * Classifies the given ID, then sees if it is a local variable. A local + * variable starts with a lowercase character, followed by some alphanumeric + * characters or `_`, then ends with anything other than `!`, `?`, or `=`. + * + * @param[in] id An id to classify. + * @retval 1 It is a local variable. + * @retval 0 It isn't. + */ +int rb_is_local_id(ID id); + +RBIMPL_ATTR_CONST() +/** + * Classifies the given ID, then sees if it is a junk ID. An ID with no + * special syntactic structure is considered junk. This category includes for + * instance punctuation. + * + * @param[in] id An id to classify. + * @retval 1 It is a junk. + * @retval 0 It isn't. + */ +int rb_is_junk_id(ID); + +RBIMPL_ATTR_NONNULL(()) +/** + * Sees if the passed C string constructs a valid syntactic symbol. Invalid + * ones for instance includes whitespaces. + * + * @param[in] str A C string to check. + * @retval 1 It is a valid symbol name. + * @retval 0 It is invalid as a symbol name. + */ +int rb_symname_p(const char *str); + +/* vm.c */ + +/** + * Queries the last match, or `Regexp.last_match`, or the `$~`. You don't have + * to use it, because in reality you can get `$~` using rb_gv_get() as usual. + * + * @retval RUBY_Qnil The method has not ran a regular expression. + * @retval otherwise An instance of ::rb_cMatch. + */ +VALUE rb_backref_get(void); + +/** + * Updates `$~`. You don't have to use it, because in reality you can set `$~` + * using rb_gv_set() as usual. + * + * @param[in] md Arbitrary Ruby object. + * @post The passed object is assigned to `$~`. + * + * @internal + * + * Yes, this function bypasses the Check_Type() that would normally prevent + * evil souls from assigning evil objects to `$~`. Use of this function is a + * really bad smell. + */ +void rb_backref_set(VALUE md); + +/** + * Queries the last line, or the `$_`. You don't have to use it, because in + * reality you can get `$_` using rb_gv_get() as usual. + * + * @retval RUBY_Qnil There has never been a "line" yet. + * @retval otherwise The last set `$_` value. + */ +VALUE rb_lastline_get(void); + +/** + * Updates `$_`. You don't have to use it, because in reality you can set `$_` + * using rb_gv_set() as usual. + * + * @param[in] str Arbitrary Ruby object. + * @post The passed object is assigned to `$_`. + * + * @internal + * + * Unlike `$~`, you can assign non-strings to `$_`, even from ruby scripts. + */ +void rb_lastline_set(VALUE str); + +/* symbol.c */ + +/** + * Collects every single bits of symbols that have ever interned in the entire + * history of the current process. + * + * @return An array that contains all symbols that have ever existed. + */ +VALUE rb_sym_all_symbols(void); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_PARSE_H */ diff --git a/libs/libruby/ruby/internal/intern/proc.h b/libs/libruby/ruby/internal/intern/proc.h new file mode 100644 index 0000000..b8c3c5e --- /dev/null +++ b/libs/libruby/ruby/internal/intern/proc.h @@ -0,0 +1,353 @@ +#ifndef RBIMPL_INTERN_PROC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_PROC_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cProc. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/iterator.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* proc.c */ + +/** + * Constructs a Proc object from implicitly passed components. When a ruby + * method is called with a block, that block is not explicitly passed around + * using C level function parameters. This function gathers all the necessary + * info to turn them into a Ruby level instance of ::rb_cProc. + * + * @exception rb_eArgError There is no passed block. + * @return An instance of ::rb_cProc. + */ +VALUE rb_block_proc(void); + +/** + * Identical to rb_proc_new(), except it returns a lambda. + * + * @exception rb_eArgError There is no passed block. + * @return An instance of ::rb_cProc. + */ +VALUE rb_block_lambda(void); + +/** + * This is an rb_iterate() + rb_block_proc() combo. + * + * ```CXX + * VALUE + * my_own_iterator(RB_BLOCK_CALL_FUNC_ARGLIST(y, c)) + * { + * const auto plus = rb_intern("+"); + * return rb_funcall(c, plus, 1, y); + * } + * + * VALUE + * my_own_method(VALUE self) + * { + * return rb_proc_new(my_own_iterator, self); + * } + * ``` + * + * @param[in] func A backend function of a proc. + * @param[in] callback_arg Passed to `func`'s callback_arg. + * @return A C-backended proc object. + * + */ +VALUE rb_proc_new(rb_block_call_func_t func, VALUE callback_arg); + +/** + * Queries if the given object is a proc. + * + * @note This is about the object's data structure, not its class etc. + * @param[in] recv Object in question. + * @retval RUBY_Qtrue It is a proc. + * @retval RUBY_Qfalse Otherwise. + */ +VALUE rb_obj_is_proc(VALUE recv); + +/** + * Evaluates the passed proc with the passed arguments. + * + * @param[in] recv The proc to call. + * @param[in] args An instance of ::RArray which is the arguments. + * @exception rb_eException Any exceptions happen inside. + * @return What the proc evaluates to. + */ +VALUE rb_proc_call(VALUE recv, VALUE args); + +/** + * Identical to rb_proc_call(), except you can specify how to handle the last + * element of the given array. + * + * @param[in] recv The proc to call. + * @param[in] args An instance of ::RArray which is the arguments. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `args`' last is not a keyword argument. + * - RB_PASS_KEYWORDS `args`' last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eException Any exceptions happen inside. + * @return What the proc evaluates to. + */ +VALUE rb_proc_call_kw(VALUE recv, VALUE args, int kw_splat); + +/** + * Identical to rb_proc_call(), except you can additionally pass another proc + * object, as a block. Nowadays procs can take blocks: + * + * ```ruby + * l = -> (positional, optional=nil, *rest, kwarg:, **kwrest, &block) { + * # ... how can we pass this `&block`? ^^^^^^ + * } + * ``` + * + * And this function is to pass one to such procs. + * + * @param[in] recv The proc to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of proc arguments. + * @param[in] proc Proc as a passed block. + * @exception rb_eException Any exceptions happen inside. + * @return What the proc evaluates to. + */ +VALUE rb_proc_call_with_block(VALUE recv, int argc, const VALUE *argv, VALUE proc); + +/** + * Identical to rb_proc_call_with_block(), except you can specify how to handle + * the last element of the given array. It can also be seen as a routine + * identical to rb_proc_call_kw(), except you can additionally pass another + * proc object as a block. + * + * @param[in] recv The proc to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of proc arguments. + * @param[in] proc Proc as a passed block. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `args`' last is not a keyword argument. + * - RB_PASS_KEYWORDS `args`' last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eException Any exceptions happen inside. + * @return What the proc evaluates to. + */ +VALUE rb_proc_call_with_block_kw(VALUE recv, int argc, const VALUE *argv, VALUE proc, int kw_splat); + +/** + * Queries the number of mandatory arguments of the given Proc. If its block + * is declared to take no arguments, returns `0`. If the block is known to + * take exactly `n` arguments, returns `n`. If the block has optional + * arguments, returns `-n-1`, where `n` is the number of mandatory arguments, + * with the exception for blocks that are not lambdas and have only a finite + * number of optional arguments; in this latter case, returns `n`. Keyword + * arguments will be considered as a single additional argument, that argument + * being mandatory if any keyword argument is mandatory. + * + * @param[in] recv Target Proc object. + * @retval 0 It takes no arguments. + * @retval >0 It takes exactly this number of arguments. + * @retval <0 It takes optional arguments. + */ +int rb_proc_arity(VALUE recv); + +/** + * Queries if the given object is a lambda. Instances of ::rb_cProc are either + * lambda or proc. They differ in several points. This function can + * distinguish them without actually evaluating their contents. + * + * @param[in] recv Target proc object. + * @retval RUBY_Qtrue It is a lambda. + * @retval RUBY_Qfalse Otherwise. + */ +VALUE rb_proc_lambda_p(VALUE recv); + +/** + * Snapshots the current execution context and turn it into an instance of + * ::rb_cBinding. + * + * @return An instance of ::rb_cBinding. + */ +VALUE rb_binding_new(void); + +/** + * Creates a method object. A method object is a proc-like object that you can + * "call". Note that a method object snapshots the method at the time the + * object is created: + * + * ```ruby + * class Foo + * def foo + * return 1 + * end + * end + * + * obj = Foo.new.method(:foo) + * + * class Foo + * def foo + * return 2 + * end + * end + * + * obj.call # => 1, not 2. + * ``` + * + * @param[in] recv Receiver of the method. + * @param[in] mid Method name, in either String or Symbol. + * @exception rb_eNoMethodError No such method. + * @return An instance of ::rb_cMethod. + */ +VALUE rb_obj_method(VALUE recv, VALUE mid); + +/** + * Queries if the given object is a method. + * + * @note This is about the object's data structure, not its class etc. + * @param[in] recv Object in question. + * @retval RUBY_Qtrue It is a method. + * @retval RUBY_Qfalse Otherwise. + */ +VALUE rb_obj_is_method(VALUE recv); + +/** + * Evaluates the passed method with the passed arguments. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] recv The method object to call. + * @exception rb_eTypeError `recv` is not a method. + * @exception rb_eException Any exceptions happen inside. + * @return What the method returns. + */ +VALUE rb_method_call(int argc, const VALUE *argv, VALUE recv); + +/** + * Identical to rb_method_call(), except you can specify how to handle the last + * element of the given array. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] recv The method object to call. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `args`' last is not a keyword argument. + * - RB_PASS_KEYWORDS `args`' last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eTypeError `recv` is not a method. + * @exception rb_eException Any exceptions happen inside. + * @return What the method returns. + */ +VALUE rb_method_call_kw(int argc, const VALUE *argv, VALUE recv, int kw_splat); + +/** + * Identical to rb_proc_call(), except you can additionally pass a proc as a + * block. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] recv The method object to call. + * @param[in] proc Proc as a passed block. + * @exception rb_eTypeError `recv` is not a method. + * @exception rb_eException Any exceptions happen inside. + * @return What the method returns. + */ +VALUE rb_method_call_with_block(int argc, const VALUE *argv, VALUE recv, VALUE proc); + +/** + * Identical to rb_method_call_with_block(), except you can specify how to + * handle the last element of the given array. It can also be seen as a + * routine identical to rb_method_call_kw(), except you can additionally pass + * another proc object as a block. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] recv The method object to call. + * @param[in] proc Proc as a passed block. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `args`' last is not a keyword argument. + * - RB_PASS_KEYWORDS `args`' last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @exception rb_eTypeError `recv` is not a method. + * @exception rb_eException Any exceptions happen inside. + * @return What the method returns. + */ +VALUE rb_method_call_with_block_kw(int argc, const VALUE *argv, VALUE recv, VALUE proc, int kw_splat); + +/** + * Queries the number of mandatory arguments of the method defined in the given + * module. If it is declared to take no arguments, returns `0`. If it takes + * exactly `n` arguments, returns `n`. If it has optional arguments, returns + * `-n-1`, where `n` is the number of mandatory arguments. Keyword arguments + * will be considered as a single additional argument, that argument being + * mandatory if any keyword argument is mandatory. + * + * @param[in] mod Namespace to search a method for. + * @param[in] mid Method id. + * @retval 0 It takes no arguments. + * @retval >0 It takes exactly this number of arguments. + * @retval <0 It takes optional arguments. + */ +int rb_mod_method_arity(VALUE mod, ID mid); + +/** + * Identical to rb_mod_method_arity(), except it searches for singleton methods + * rather than instance methods. + * + * @param[in] obj Object to search for a singleton method. + * @param[in] mid Method id. + * @retval 0 It takes no arguments. + * @retval >0 It takes exactly this number of arguments. + * @retval <0 It takes optional arguments. + */ +int rb_obj_method_arity(VALUE obj, ID mid); + +/* eval.c */ + +RBIMPL_ATTR_NONNULL((1)) +/** + * Protects a function call from potential global escapes from the function. + * Such global escapes include exceptions, `throw`, `break`, for example. + * + * It first calls the function func with `args` as the argument. If no global + * escape occurred during the function, it returns the result and `*state` is + * zero. Otherwise, it returns ::RUBY_Qnil and sets `*state` to nonzero. If + * `state` is `NULL`, it is not set in both cases. + * + * @param[in] func A function that potentially escapes globally. + * @param[in] args Passed as-is to `func`. + * @param[out] state State of execution. + * @return What `func` returns, or an undefined value when it did not + * return. + * @post `*state` is set to zero if succeeded. Nonzero otherwise. + * @warning You have to clear the error info with `rb_set_errinfo(Qnil)` if + * you decide to ignore the caught exception. + * @see rb_eval_string_protect() + * @see rb_load_protect() + * + * @internal + * + * The "undefined value" described above is in fact ::RUBY_Qnil for now. But + * @shyouhei doesn't think that we would never change that. + * + * Though not a part of our public API, `state` is in fact an + * enum ruby_tag_type. You can see the potential "nonzero" values by looking + * at vm_core.h. + */ +VALUE rb_protect(VALUE (*func)(VALUE args), VALUE args, int *state); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_PROC_H */ diff --git a/libs/libruby/ruby/internal/intern/process.h b/libs/libruby/ruby/internal/intern/process.h new file mode 100644 index 0000000..7a7b24e --- /dev/null +++ b/libs/libruby/ruby/internal/intern/process.h @@ -0,0 +1,273 @@ +#ifndef RBIMPL_INTERN_PROCESS_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_PROCESS_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_mProcess. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/config.h" /* rb_pid_t is defined here. */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* process.c */ + +/** + * Sets the "last status", or the `$?`. + * + * @param[in] status The termination status, as defined in `waitpid(3posix)`. + * @param[in] pid The last child of the current process. + * @post `$?` is updated. + */ +void rb_last_status_set(int status, rb_pid_t pid); + +/** + * Queries the "last status", or the `$?`. + * + * @retval RUBY_Qnil The current thread has no dead children. + * @retval otherwise An instance of Process::Status describing the status of + * the child that was most recently `wait`-ed. + */ +VALUE rb_last_status_get(void); + +RBIMPL_ATTR_NONNULL(()) +/** + * Executes a shell command. + * + * @warning THIS FUNCTION RETURNS on error! + * @param[in] cmd Passed to the shell. + * @retval -1 Something prevented the command execution. + * @post Upon successful execution this function doesn't return. + * @post In case it returns the `errno` is set properly. + */ +int rb_proc_exec(const char *cmd); + +RBIMPL_ATTR_NORETURN() +/** + * Replaces the current process by running the given external command. This is + * the implementation of `Kernel#exec`. + * + * @param[in] argc Number of objects in `argv`. + * @param[in] argv Command and its options to execute. + * @exception rb_eTypeError Invalid options e.g. non-String argv. + * @exception rb_eArgError Invalid options e.g. redirection cycle. + * @exception rb_eNotImpError Not implemented e.g. no `setuid(2)`. + * @exception rb_eRuntimeError `Process::UID.switch` in operation. + * @exception rb_eSystemCallError `execve(2)` failed. + * @warning This function doesn't return. + * @warning On failure it raises. On success the process is replaced. + * + * @internal + * + * @shyouhei have to say that the rdoc for `Kernel#exec` is fairly incomplete. + * AFAIK this function ultimately takes the following signature: + * + * ```rbs + * type boolx = bool | nil # != `boolish` + * + * type rlim_t = Integer # rlim_cur + * | [ Integer, Integer ] # rlim_cur, rlim_max + * + * type uid_t = String # e.g. "root" + * | Integer # e.g. 0 + * + * type gid_t = String # e.g. "wheel" + * | Integer # e.g. 0 + * + * type fmode = String # e.g. "rb" + * | Integer # e.g. O_RDONLY | O_BINARY + * + * type mode_t = Integer # e.g. 0644 + * + * type pgrp = true # Creates a dedicated pgroup + * | 0 # ditto + * | nil # Uses the current one + * | Integer # Uses this specific pgroup + * + * type fd = :in # STDIN + * | :out # STDOUT + * | :err # STDERR + * | IO # This specific IO + * | Integer # A file descriptor of this # + * + * type src = fd | [ fd ] + * type dst = :close # Intuitive + * | fd # Intuitive + * | String # Open a file at this path + * | [ String ] # ... using O_RDONLY + * | [ String, fmode ] # ... using this mode + * | [ String, fmode, mode_t ] # ... with a permission + * | [ :child, fd ] # fd of child side + * + * type redir = Hash[ src, dst ] + * + * # ---- + * + * # Key-value pair of environment variables + * type envp = Hash[ String, String ] + * + * # Actual name (and the name passed to the subprocess if any) + * type arg0 = String | [ String, String ] + * + * # Arbitrary string parameters + * type argv = String + * + * # Exec options: + * type argh = redir | { + * chdir: String, # Working directory + * close_others: boolx, # O_CLOEXEC like behaviour + * gid: gid_t, # setegid(2) + * pgrooup: pgrp, # setpgrp(2) + * rlimit_as: rlim_t, # setrlimit(2) + * rlimit_core: rlim_t, # ditto + * rlimit_cpu: rlim_t, # ditto + * rlimit_data: rlim_t, # ditto + * rlimit_fsize: rlim_t, # ditto + * rlimit_memlock: rlim_t, # ditto + * rlimit_msgqueue: rlim_t, # ditto + * rlimit_nice: rlim_t, # ditto + * rlimit_nofile: rlim_t, # ditto + * rlimit_nproc: rlim_t, # ditto + * rlimit_rss: rlim_t, # ditto + * rlimit_rtprio: rlim_t, # ditto + * rlimit_rttime: rlim_t, # ditto + * rlimit_sbsize: rlim_t, # ditto + * rlimit_sigpending: rlim_t, # ditto + * rlimit_stack: rlim_t, # ditto + * uid: uid_t, # seteuid(2) + * umask: mode_t, # umask(2) + * unsetenv_others: boolx # Unset everything except the passed envp + * } + * + * # ==== + * + * class Kernel + * def self?.exec + * : ( arg0 cmd, *argv args ) -> void + * | ( arg0 cmd, *argv args, argh opts) -> void + * | (envp env, arg0 cmd, *argv args ) -> void + * | (envp env, arg0 cmd, *argv args, argh opts) -> void + * end + * ``` + */ +VALUE rb_f_exec(int argc, const VALUE *argv); + +/** + * Waits for a process, with releasing GVL. + * + * @param[in] pid Process ID. + * @param[out] status The wait status is filled back. + * @param[in] flags Wait options. + * @retval -1 System call failed, errno set. + * @retval 0 WNOHANG but no waitable children. + * @retval otherwise A process ID that was `wait()`-ed. + * @post Upon successful return `status` is updated to have the process' + * status. + * @note `status` can be NULL. + * @note The arguments are passed through to underlying system call(s). + * Can have special meanings. For instance passing `(rb_pid_t)-1` + * to `pid` means it waits for any processes, under + * POSIX-compliant situations. + */ +rb_pid_t rb_waitpid(rb_pid_t pid, int *status, int flags); + +/** + * This is a shorthand of rb_waitpid without status and flags. It has been + * like this since the very beginning. The initial revision already did the + * same thing. Not sure why, then, it has been named `syswait`. AFAIK this is + * different from how `wait(3posix)` works. + * + * @param[in] pid Passed to rb_waitpid(). + */ +void rb_syswait(rb_pid_t pid); + +/** + * Identical to rb_f_exec(), except it spawns a child process instead of + * replacing the current one. + * + * @param[in] argc Number of objects in `argv`. + * @param[in] argv Command and its options to execute. + * @exception rb_eTypeError Invalid options e.g. non-String argv. + * @exception rb_eArgError Invalid options e.g. redirection cycle. + * @exception rb_eNotImpError Not implemented e.g. no `setuid(2)`. + * @exception rb_eRuntimeError `Process::UID.switch` in operation. + * @retval -1 Child process died for some reason. + * @retval otherwise The ID of the born child. + * + * @internal + * + * This is _really_ identical to rb_f_exec() until ultimately calling the + * system call. Almost everything are shared among these two (and + * rb_f_system()). + */ +rb_pid_t rb_spawn(int argc, const VALUE *argv); + +/** + * Identical to rb_spawn(), except you can additionally know the detailed + * situation in case of abnormal parturitions. + * + * @param[in] argc Number of objects in `argv`. + * @param[in] argv Command and its options to execute. + * @param[out] errbuf Error description write-back buffer. + * @param[in] buflen Number of bytes of `errbuf`, including NUL. + * @exception rb_eTypeError Invalid options e.g. non-String argv. + * @exception rb_eArgError Invalid options e.g. redirection cycle. + * @exception rb_eNotImpError Not implemented e.g. no `setuid(2)`. + * @exception rb_eRuntimeError `Process::UID.switch` in operation. + * @retval -1 Child process died for some reason. + * @retval otherwise The ID of the born child. + * @post In case of `-1`, at most `buflen` bytes of the reason why is + * written back to `errbuf`. + */ +rb_pid_t rb_spawn_err(int argc, const VALUE *argv, char *errbuf, size_t buflen); + +/** + * Gathers info about resources consumed by the current process. + * + * @param[in] _ Not used. Pass anything. + * @return An instance of `Process::Tms`. + * + * @internal + * + * This function might or might not exist depending on `./confiugre` result. + * It must be a portability hell. Better not use. + */ +VALUE rb_proc_times(VALUE _); + +/** + * "Detaches" a subprocess. In POSIX systems every child processes that a + * process creates must be `wait(2)`-ed. A child process that died yet has not + * been waited so far is called a "zombie", which more or less consumes + * resources. This function automates reclamation of such processes. Once + * after this function successfully returns you can basically forget about the + * child process. + * + * @param[in] pid Process to wait. + * @return An instance of ::rb_cThread which is `waitpid(2)`-ing `pid`. + * @post You can just forget about the return value. GC reclaims it. + * @post You can know the exit status by querying `#value` of the + * return value (which is a blocking operation). + */ +VALUE rb_detach_process(rb_pid_t pid); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_PROCESS_H */ diff --git a/libs/libruby/ruby/internal/intern/random.h b/libs/libruby/ruby/internal/intern/random.h new file mode 100644 index 0000000..5577f53 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/random.h @@ -0,0 +1,116 @@ +#ifndef RBIMPL_INTERN_RANDOM_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_RANDOM_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief MT19937 backended pseudo random number generator. + * @see Matsumoto, M., Nishimura, T., "Mersenne Twister: A 623- + * dimensionally equidistributed uniform pseudorandom number + * generator", ACM Trans. on Modeling and Computer Simulation, 8 + * (1): pp 3-30, 1998. https://doi.org/10.1145/272991.272995 + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* random.c */ + +/** + * Generates a 32 bit random number. + * + * @return A random number. + * @note Now that we have ractors, the RNG behind this function is + * per-ractor. + */ +unsigned int rb_genrand_int32(void); + +/** + * Generates a `double` random number. + * + * @return A random number. + * @note This function shares the RNG with rb_genrand_int32(). + */ +double rb_genrand_real(void); + +/** + * Resets the RNG behind rb_genrand_int32()/rb_genrand_real(). + * + * @post The (now per-ractor) default RNG's internal state is cleared. + */ +void rb_reset_random_seed(void); + +/** + * Generates a String of random bytes. + * + * @param[in,out] rnd An instance of ::rb_cRandom. + * @param[in] n Requested number of bytes. + * @return An instance of ::rb_cString, of binary, of `n` bytes length, + * whose contents are random bits. + * + * @internal + * + * @shyouhei doesn't know if this is an Easter egg or an official feature, but + * this function can take a wider range of objects, such as `Socket::Ifaddr`. + * The arguments are just silently ignored and the default RNG is used instead, + * if they are non-RNG. + */ +VALUE rb_random_bytes(VALUE rnd, long n); + +/** + * Identical to rb_genrand_int32(), except it generates using the passed RNG. + * + * @param[in,out] rnd An instance of ::rb_cRandom. + * @return A random number. + */ +unsigned int rb_random_int32(VALUE rnd); + +/** + * Identical to rb_genrand_real(), except it generates using the passed RNG. + * + * @param[in,out] rnd An instance of ::rb_cRandom. + * @return A random number. + */ +double rb_random_real(VALUE rnd); + +/** + * Identical to rb_genrand_ulong_limited(), except it generates using the + * passed RNG. + * + * @param[in,out] rnd An instance of ::rb_cRandom. + * @param[in] limit Max possible return value. + * @return A random number, distributed in `[0, limit]` interval. + * @note Note it can return `limit`. + * @note Whether the return value distributes uniformly in the + * interval or not depends on how the argument RNG behaves; at + * least in case of MT19937 it does. + */ +unsigned long rb_random_ulong_limited(VALUE rnd, unsigned long limit); + +/** + * Generates a random number whose upper limit is `i`. + * + * @param[in] i Max possible return value. + * @return A random number, uniformly distributed in `[0, limit]` interval. + * @note Note it can return `i`. + */ +unsigned long rb_genrand_ulong_limited(unsigned long i); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_RANDOM_H */ diff --git a/libs/libruby/ruby/internal/intern/range.h b/libs/libruby/ruby/internal/intern/range.h new file mode 100644 index 0000000..1f7d7c3 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/range.h @@ -0,0 +1,89 @@ +#ifndef RBIMPL_INTERN_RANGE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_RANGE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cRange. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* range.c */ + +/** + * Creates a new Range. + * + * @param[in] beg "Left" or "lowest" endpoint of the range. + * @param[in] end "Right" or "highest" endpoint of the range. + * @param[in] excl Whether the range is open-ended. + * @exception rb_eArgError `beg` and `end` are not comparable. + * @note These days both endpoints can be ::RUBY_Qnil, which means that + * endpoint is unbound. + */ +VALUE rb_range_new(VALUE beg, VALUE end, int excl); + +RBIMPL_ATTR_NONNULL(()) +/** + * Deconstructs a numerical range. As the arguments are `long` based, it + * expects everything are in the `long` domain. + * + * @param[in] range A range of numerical endpoints. + * @param[out] begp Return value buffer. + * @param[out] lenp Return value buffer. + * @param[in] len Updated length. + * @param[in] err In case `len` is out of range... + * - `0`: returns ::RUBY_Qnil. + * - `1`: raises ::rb_eRangeError. + * - `2`: `beg` and `len` expanded accordingly. + * @exception rb_eTypeError `range` is not a numerical range. + * @exception rb_eRangeError `range` cannot fit into `long`. + * @retval RUBY_Qfalse `range` is not an ::rb_cRange. + * @retval RUBY_Qnil `len` is out of `range` but `err` is zero. + * @retval RUBY_Qtrue Otherwise. + * @post `beg` is the (possibly updated) left endpoint. + * @post `len` is the (possibly updated) length of the range. + * + * @internal + * + * The complex error handling switch reflects the fact that `Array#[]=` and + * `String#[]=` behave differently when they take ranges. + */ +VALUE rb_range_beg_len(VALUE range, long *begp, long *lenp, long len, int err); + +RBIMPL_ATTR_NONNULL(()) +/** + * Deconstructs a range into its components. + * + * @param[in] range Range or range-ish object. + * @param[out] begp Return value buffer. + * @param[out] endp Return value buffer. + * @param[out] exclp Return value buffer. + * @retval RUBY_Qfalse `range` is not an instance of ::rb_cRange. + * @retval RUBY_Qtrue Argument pointers are updated. + * @post `*begp` is the left endpoint of the range. + * @post `*endp` is the right endpoint of the range. + * @post `*exclp` is whether the range is open-ended or not. + */ +int rb_range_values(VALUE range, VALUE *begp, VALUE *endp, int *exclp); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_RANGE_H */ diff --git a/libs/libruby/ruby/internal/intern/rational.h b/libs/libruby/ruby/internal/intern/rational.h new file mode 100644 index 0000000..ff4beca --- /dev/null +++ b/libs/libruby/ruby/internal/intern/rational.h @@ -0,0 +1,172 @@ +#ifndef RBIMPL_INTERN_RATIONAL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_RATIONAL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cRational. + */ +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/arithmetic/long.h" /* INT2FIX is here. */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* rational.c */ + +/** + * Identical to rb_rational_new(), except it skips argument validations. It is + * thus dangerous for extension libraries. For instance `1/0r` could be + * constructed using this. + * + * @param[in] num Numerator, an instance of ::rb_cInteger. + * @param[in] den Denominator, an instance of ::rb_cInteger. + * @exception rb_eTypeError Either argument is not an Integer. + * @return An instance of ::rb_cRational whose value is `(num/den)r`. + */ +VALUE rb_rational_raw(VALUE num, VALUE den); + +/** + * Shorthand of `(x/1)r`. As `x` is already an Integer, it practically + * converts it into a Rational of the identical value. + * + * @param[in] x An instance of ::rb_cInteger. + * @return An instance of ::rb_cRational, whose value is `(x/1)r`. + */ +#define rb_rational_raw1(x) rb_rational_raw((x), INT2FIX(1)) + +/** @alias{rb_rational_raw} */ +#define rb_rational_raw2(x,y) rb_rational_raw((x), (y)) + +/** + * Constructs a Rational, with reduction. This returns for instance `(2/3)r` + * for `rb_rational_new(INT2NUM(-384), INT2NUM(-576))`. + * + * @param[in] num Numerator, an instance of ::rb_cInteger. + * @param[in] den Denominator, an instance of ::rb_cInteger. + * @exception rb_eZeroDivError `den` is zero. + * @return An instance of ::rb_cRational whose value is `(num/den)r`. + */ +VALUE rb_rational_new(VALUE num, VALUE den); + +/** + * Shorthand of `(x/1)r`. As `x` is already an Integer, it practically + * converts it into a Rational of the identical value. + * + * @param[in] x An instance of ::rb_cInteger. + * @return An instance of ::rb_cRational, whose value is `(x/1)r`. + */ +#define rb_rational_new1(x) rb_rational_new((x), INT2FIX(1)) + +/** @alias{rb_rational_new} */ +#define rb_rational_new2(x,y) rb_rational_new((x), (y)) + +/** + * Converts various values into a Rational. This function accepts: + * + * - Instances of ::rb_cInteger (taken as-is), + * - Instances of ::rb_cRational (taken as-is), + * - Instances of ::rb_cFloat (applies `#to_r`), + * - Instances of ::rb_cComplex (applies `#to_r`), + * - Instances of ::rb_cString (applies `#to_r`), + * - Other objects that respond to `#to_r`. + * + * It (possibly recursively) applies `#to_r` until both sides become either + * Integer or Rational, then divides them. + * + * As a special case, passing ::RUBY_Qundef to `den` is the same as passing + * `RB_INT2NUM(1)`. + * + * @param[in] num Numerator (see above). + * @param[in] den Denominator (see above). + * @exception rb_eTypeError Passed something not described above. + * @exception rb_eFloatDomainError `#to_r` produced Nan/Inf. + * @exception rb_eZeroDivError `#to_r` produced zero for `den`. + * @return An instance of ::rb_cRational whose value is `(num/den)r`. + * + * @internal + * + * This was the implementation of `Kernel#Rational` before, but they diverged. + */ +VALUE rb_Rational(VALUE num, VALUE den); + +/** + * Shorthand of `(x/1)r`. It practically converts it into a Rational of the + * identical value. + * + * @param[in] x ::rb_cInteger, ::rb_cRational, or something that responds to + * `#to_r`. + * @return An instance of ::rb_cRational, whose value is `(x/1)r`. + */ +#define rb_Rational1(x) rb_Rational((x), INT2FIX(1)) + +/** @alias{rb_Rational} */ +#define rb_Rational2(x,y) rb_Rational((x), (y)) + +RBIMPL_ATTR_PURE() +/** + * Queries the numerator of the passed Rational. + * + * @param[in] rat An instance of ::rb_cRational. + * @return Its numerator part, which is an instance of ::rb_cInteger. + */ +VALUE rb_rational_num(VALUE rat); + +RBIMPL_ATTR_PURE() +/** + * Queries the denominator of the passed Rational. + * + * @param[in] rat An instance of ::rb_cRational. + * @return Its denominator part, which is an instance of ::rb_cInteger + * greater than or equal to one.. + */ +VALUE rb_rational_den(VALUE rat); + +/** + * Simplified approximation of a float. It returns a rational `rat` which + * satisfies: + * + * ``` + * flt - |prec| <= rat <= flt + |prec| + * ``` + * + * ```ruby + * 3.141592.rationalize(0.001) # => (201/64)r + * 3.141592.rationalize(0.01)' # => (22/7)r + * 3.141592.rationalize(0.1)' # => (16/5)r + * 3.141592.rationalize(1)' # => (3/1)r + * ``` + * + * @param[in] flt An instance of ::rb_cFloat to rationalise. + * @param[in] prec Another ::rb_cFloat, which is the "precision". + * @return Approximation of `flt`, in ::rb_cRational. + */ +VALUE rb_flt_rationalize_with_prec(VALUE flt, VALUE prec); + +/** + * Identical to rb_flt_rationalize_with_prec(), except it auto-detects + * appropriate precision depending on the passed value. + * + * @param[in] flt An instance of ::rb_cFloat to rationalise. + * @return Approximation of `flt`, in ::rb_cRational. + */ +VALUE rb_flt_rationalize(VALUE flt); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_RATIONAL_H */ diff --git a/libs/libruby/ruby/internal/intern/re.h b/libs/libruby/ruby/internal/intern/re.h new file mode 100644 index 0000000..31f5593 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/re.h @@ -0,0 +1,249 @@ +#ifndef RBIMPL_INTERN_RE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_RE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cRegexp. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* re.c */ + +/** + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + * + * @internal + * + * This was a function that switched between memcmp and rb_memcicmp depending + * on then-called `ruby_ignorecase`, or the `$=` global variable. That feature + * was abandoned in sometime around version 1.9.0. + */ +#define rb_memcmp memcmp + +/** + * Identical to st_locale_insensitive_strcasecmp(), except it is timing safe + * and returns something different. + * + * @param[in] s1 Comparison LHS. + * @param[in] s2 Comparison RHS. + * @param[in] n Comparison shall stop after first `n` bytes are scanned. + * @retval <0 `s1` is "less" than `s2`. + * @retval 0 Both sides converted into lowercase would be identical. + * @retval >0 `s1` is "greater" than `s2`. + * @note The "case" here means that of the POSIX Locale. + * + * @internal + * + * Can accept NULLs as long as n is also 0, and returns 0. + */ +int rb_memcicmp(const void *s1,const void *s2, long n); + +/** + * Asserts that the given MatchData is "occupied". MatchData shares its + * backend storages with its Regexp object. But programs can destructively + * tamper its contents. Calling this function beforehand shall prevent such + * modifications to spill over into other objects. + * + * @param[out] md Target instance of ::rb_cMatch. + * @post The object is "busy". + * + * @internal + * + * There is rb_match_unbusy internally, but extension libraries are left unable + * to do so. + */ +void rb_match_busy(VALUE md); + +/** + * Identical to rb_reg_nth_match(), except it just returns Boolean. This could + * skip allocating a returning string, resulting in reduced memory footprints + * if applicable. + * + * @param[in] n Match index. + * @param[in] md An instance of ::rb_cMatch. + * @exception rb_eTypeError `md` is not initialised. + * @retval RUBY_Qnil There is no `n`-th capture. + * @retval RUBY_Qfalse There is a `n`-th capture and is empty. + * @retval RUBY_Qtrue There is a `n`-th capture that has something. + * + * @internal + * + * @shyouhei wonders: why there are both rb_reg_match_defined() and + * rb_match_nth_defined, which are largely the same things, but do not share + * their implementations at all? + */ +VALUE rb_reg_nth_defined(int n, VALUE md); + +/** + * Queries the nth captured substring. + * + * @param[in] n Match index. + * @param[in] md An instance of ::rb_cMatch. + * @exception rb_eTypeError `md` is not initialised. + * @retval RUBY_Qnil There is no `n`-th capture. + * @retval otherwise An allocated instance of ::rb_cString containing + * the contents captured. + */ +VALUE rb_reg_nth_match(int n, VALUE md); + +/** + * Queries the index of the given named capture. Captures could be named. But + * that doesn't mean named ones are not indexed. A regular expression can mix + * named and non-named captures, and they are all indexed. This function + * converts from a name to its index. + * + * @param[in] match An instance of ::rb_cMatch. + * @param[in] backref Capture name, in String, Symbol, or Numeric. + * @exception rb_eIndexError No such named capture. + * @return The index of the given name. + */ +int rb_reg_backref_number(VALUE match, VALUE backref); + +/** + * This just returns the argument, stringified. What a poor name. + * + * @param[in] md An instance of ::rb_cMatch. + * @return Its 0th capture (i.e. entire matched string). + */ +VALUE rb_reg_last_match(VALUE md); + +/** + * The portion of the original string before the given match. + * + * @param[in] md An instance of ::rb_cMatch. + * @return Its "prematch". This is perl's ``$```. + */ +VALUE rb_reg_match_pre(VALUE md); + +/** + * The portion of the original string after the given match. + * + * @param[in] md An instance of ::rb_cMatch. + * @return Its "postmatch". This is perl's `$'`. + */ +VALUE rb_reg_match_post(VALUE md); + +/** + * The portion of the original string that captured at the very last. + * + * @param[in] md An instance of ::rb_cMatch. + * @return Its "lastmatch". This is perl's `$+`. + */ +VALUE rb_reg_match_last(VALUE md); + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define HAVE_RB_REG_NEW_STR 1 + +/** + * Identical to rb_reg_new(), except it takes the expression in Ruby's string + * instead of C's. + * + * @param[in] src Source code in String. + * @param[in] opts Options e.g. ONIG_OPTION_MULTILINE. + * @exception rb_eRegexpError `src` and `opts` do not interface. + * @return Allocated new instance of ::rb_cRegexp. + */ +VALUE rb_reg_new_str(VALUE src, int opts); + +RBIMPL_ATTR_NONNULL(()) +/** + * Creates a new Regular expression. + * + * @param[in] src Source code. + * @param[in] len `strlen(src)`. + * @param[in] opts Options e.g. ONIG_OPTION_MULTILINE. + * @return Allocated new instance of ::rb_cRegexp. + */ +VALUE rb_reg_new(const char *src, long len, int opts); + +/** + * Allocates an instance of ::rb_cRegexp. + * + * @private + * + * Nobody should call this function. Regular expressions that are not + * initialised must not exist in the wild. + */ +VALUE rb_reg_alloc(void); + +/** + * Initialises an instance of ::rb_cRegexp. + * + * @private + * + * This just raises for ordinal regexp objects. Extension libraries must not + * use. + */ +VALUE rb_reg_init_str(VALUE re, VALUE s, int options); + +/** + * This is the match operator. + * + * @param[in] re An instance of ::rb_cRegexp. + * @param[in] str An instance of ::rb_cString. + * @exception rb_eTypeError `str` is not a string. + * @exception rb_eRegexpError Error inside of Onigmo (unlikely). + * @retval RUBY_Qnil Match failed. + * @retval otherwise Matched position (character index inside of + * `str`). + * @post `Regexp.last_match` is updated. + * @post `$&`, `$~`, etc., are updated. + * @note If you do this in ruby, named captures are assigned to local + * variable of the local scope. But that doesn't happen here. The + * assignment is done by the interpreter. + */ +VALUE rb_reg_match(VALUE re, VALUE str); + +/** + * Identical to rb_reg_match(), except it matches against rb_lastline_get() + * (or, the `$_`). + * + * @param[in] re An instance of ::rb_cRegexp. + * @exception rb_eRegexpError Error inside of Onigmo (unlikely). + * @retval RUBY_Qnil Match failed or `$_` is absent. + * @retval otherwise Matched position (character index inside of + * `$_`). + * @post `Regexp.last_match` is updated. + * @post `$&`, `$~`, etc., are updated. + */ +VALUE rb_reg_match2(VALUE re); + +/** + * Queries the options of the passed regular expression. + * + * @param[in] re An instance of ::rb_cRegexp. + * @return Its options. + * @note Possible return values are defined in Onigmo.h. + */ +int rb_reg_options(VALUE re); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_RE_H */ diff --git a/libs/libruby/ruby/internal/intern/ruby.h b/libs/libruby/ruby/internal/intern/ruby.h new file mode 100644 index 0000000..efe6142 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/ruby.h @@ -0,0 +1,77 @@ +#ifndef RBIMPL_INTERN_RUBY_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_RUBY_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Process-global APIs. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* ruby.c */ +/** @alias{rb_get_argv} */ +#define rb_argv rb_get_argv() + +/** + * The value of `$0` at process bootup. + * + * @note This is just a snapshot of `$0`, not the backend storage of it. `$0` + * could become something different because it is a writable global + * variable. Modifying it for instance affects `ps(1)` output. Don't + * assume they are synced. + */ +RUBY_EXTERN VALUE rb_argv0; + +/* io.c */ + +/** + * Queries the arguments passed to the current process that you can access from + * Ruby as `ARGV`. + * + * @return An array of strings containing arguments passed to the process. + */ +VALUE rb_get_argv(void); + +/* ruby.c */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Loads the given file. This function opens the given pathname for reading, + * parses the contents as a Ruby script, and returns an opaque "node" pointer. + * You can then pass it to ruby_run_node() for evaluation. + * + * @param[in] file File name, or "-" to read from stdin. + * @return Opaque "node" pointer. + */ +void *rb_load_file(const char *file); + +/** + * Identical to rb_load_file(), except it takes the argument as a Ruby's string + * instead of C's. + * + * @param[in] file File name, or "-" to read from stdin. + * @return Opaque "node" pointer. + */ +void *rb_load_file_str(VALUE file); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_RUBY_H */ diff --git a/libs/libruby/ruby/internal/intern/select.h b/libs/libruby/ruby/internal/intern/select.h new file mode 100644 index 0000000..fabc287 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/select.h @@ -0,0 +1,86 @@ +#ifndef RBIMPL_INTERN_SELECT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_SELECT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs to provide ::rb_fd_select(). + * @note Functions and structs defined in this header file are not + * necessarily ruby-specific. They don't need ::VALUE etc. + */ +#include "ruby/internal/config.h" + +#ifdef HAVE_SYS_TYPES_H +# include /* for NFDBITS (BSD Net/2) */ +#endif + +#include "ruby/internal/dllexport.h" + +/* thread.c */ +#if defined(NFDBITS) && defined(HAVE_RB_FD_INIT) +# include "ruby/internal/intern/select/largesize.h" +#elif defined(_WIN32) +# include "ruby/internal/intern/select/win32.h" +# /** Does nothing (defined for compatibility). */ +# define rb_fd_resize(n, f) ((void)(f)) +#else +# include "ruby/internal/intern/select/posix.h" +# /** Does nothing (defined for compatibility). */ +# define rb_fd_resize(n, f) ((void)(f)) +#endif + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +struct timeval; + +/** + * Waits for multiple file descriptors at once. This is basically a wrapper of + * system-provided select() with releasing GVL, to allow other Ruby threads run + * in parallel. + * + * @param[in] nfds Max FD in everything passed, plus one. + * @param[in,out] rfds Set of FDs to wait for reads. + * @param[in,out] wfds Set of FDs to wait for writes. + * @param[in,out] efds Set of FDs to wait for OOBs. + * @param[in,out] timeout Max blocking duration. + * @retval -1 Failed, errno set. + * @retval 0 Timeout exceeded. + * @retval otherwise Total number of file descriptors returned. + * @post `rfds` contains readable FDs. + * @post `wfds` contains writable FDs. + * @post `efds` contains exceptional FDs. + * @post `timeout` is the time left. + * @note All pointers are allowed to be null pointers. + * + * Although backend threads can run in parallel of this function, touching a + * file descriptor from multiple threads could be problematic. For instance + * what happens when a thread closes a file descriptor that is selected by + * someone else, vastly varies among operating systems. You would better avoid + * touching an fd from more than one threads. + * + * @internal + * + * Although any file descriptors are possible here, it makes completely no + * sense to pass a descriptor that is not `O_NONBLOCK`. If you want to know + * the reason for this limitatuon in detail, you might find this thread super + * interesting: https://lkml.org/lkml/2004/10/6/117 + */ +int rb_thread_fd_select(int nfds, rb_fdset_t *rfds, rb_fdset_t *wfds, rb_fdset_t *efds, struct timeval *timeout); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_SELECT_H */ diff --git a/libs/libruby/ruby/internal/intern/select/largesize.h b/libs/libruby/ruby/internal/intern/select/largesize.h new file mode 100644 index 0000000..d65f088 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/select/largesize.h @@ -0,0 +1,214 @@ +#ifndef RBIMPL_INTERN_SELECT_LARGESIZE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_SELECT_LARGESIZE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs to provide ::rb_fd_select(). + * + * Several Unix platforms support file descriptors bigger than FD_SETSIZE in + * `select(2)` system call. + * + * - Linux 2.2.12 (?) + * + * - NetBSD 1.2 (src/sys/kern/sys_generic.c:1.25) + * `select(2)` documents how to allocate fd_set dynamically. + * http://netbsd.gw.com/cgi-bin/man-cgi?select++NetBSD-4.0 + * + * - FreeBSD 2.2 (src/sys/kern/sys_generic.c:1.19) + * + * - OpenBSD 2.0 (src/sys/kern/sys_generic.c:1.4) + * `select(2)` documents how to allocate fd_set dynamically. + * http://www.openbsd.org/cgi-bin/man.cgi?query=select&manpath=OpenBSD+4.4 + * + * - Solaris 8 has `select_large_fdset` + * + * - Mac OS X 10.7 (Lion) + * `select(2)` returns `EINVAL` if `nfds` is greater than `FD_SET_SIZE` and + * `_DARWIN_UNLIMITED_SELECT` (or `_DARWIN_C_SOURCE`) isn't defined. + * http://developer.apple.com/library/mac/#releasenotes/Darwin/SymbolVariantsRelNotes/_index.html + * + * When `fd_set` is not big enough to hold big file descriptors, it should be + * allocated dynamically. Note that this assumes `fd_set` is structured as + * bitmap. + * + * `rb_fd_init` allocates the memory. + * `rb_fd_term` frees the memory. + * `rb_fd_set` may re-allocate bitmap. + * + * So `rb_fd_set` doesn't reject file descriptors bigger than `FD_SETSIZE`. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" + +/**@cond INTERNAL_MACRO */ +#define rb_fd_ptr rb_fd_ptr +#define rb_fd_max rb_fd_max +/** @endcond */ + +struct timeval; + +/** + * The data structure which wraps the fd_set bitmap used by select(2). This + * allows Ruby to use FD sets larger than that allowed by historic limitations + * on modern platforms. + */ +typedef struct { + int maxfd; /**< Maximum allowed number of FDs. */ + fd_set *fdset; /**< File descriptors buffer */ +} rb_fdset_t; + +RBIMPL_SYMBOL_EXPORT_BEGIN() +RBIMPL_ATTR_NONNULL(()) +/** + * (Re-)initialises a fdset. One must be initialised before other `rb_fd_*` + * operations. Analogous to calling `malloc(3)` to allocate an `fd_set`. + * + * @param[out] f An fdset to squash. + * @post `f` holds no file descriptors. + */ +void rb_fd_init(rb_fdset_t *f); + +RBIMPL_ATTR_NONNULL(()) +/** + * Destroys the ::rb_fdset_t, releasing any memory and resources it used. It + * must be reinitialised using rb_fd_init() before future use. Analogous to + * calling `free(3)` to release memory for an `fd_set`. + * + * @param[out] f An fdset to squash. + * @post `f` holds no file descriptors. + */ +void rb_fd_term(rb_fdset_t *f); + +RBIMPL_ATTR_NONNULL(()) +/** + * Wipes out the current set of FDs. + * + * @param[out] f The fdset to clear. + * @post `f` has no FDs. + */ +void rb_fd_zero(rb_fdset_t *f); + +RBIMPL_ATTR_NONNULL(()) +/** + * Sets an fd to a fdset. + * + * @param[in] fd A file descriptor. + * @param[out] f Target fdset. + * @post `f` holds `fd`. + */ +void rb_fd_set(int fd, rb_fdset_t *f); + +RBIMPL_ATTR_NONNULL(()) +/** + * Releases a specific FD from the given fdset. + * + * @param[in] fd Target FD. + * @param[out] f The fdset that holds `fd`. + * @post `f` doesn't hold n. + */ +void rb_fd_clr(int fd, rb_fdset_t *f); + +RBIMPL_ATTR_NONNULL(()) +RBIMPL_ATTR_PURE() +/** + * Queries if the given FD is in the given set. + * + * @param[in] fd Target FD. + * @param[in] f The fdset to scan. + * @retval 1 Yes there is. + * @retval 0 No there isn't. + * @see http://www.freebsd.org/cgi/query-pr.cgi?pr=91421 + */ +int rb_fd_isset(int fd, const rb_fdset_t *f); + +/** + * Destructively overwrites an fdset with another. + * + * @param[out] dst Target fdset. + * @param[in] src Source fdset. + * @param[in] max Maximum number of file descriptors to copy. + * @post `dst` is a copy of `src`. + */ +void rb_fd_copy(rb_fdset_t *dst, const fd_set *src, int max); + +/** + * Identical to rb_fd_copy(), except it copies unlimited number of file + * descriptors. + * + * @param[out] dst Target fdset. + * @param[in] src Source fdset. + * @post `dst` is a copy of `src`. + */ +void rb_fd_dup(rb_fdset_t *dst, const rb_fdset_t *src); + +/** + * Waits for multiple file descriptors at once. + * + * @param[in] nfds Max FD in everything passed, plus one. + * @param[in,out] rfds Set of FDs to wait for reads. + * @param[in,out] wfds Set of FDs to wait for writes. + * @param[in,out] efds Set of FDs to wait for OOBs. + * @param[in,out] timeout Max blocking duration. + * @retval -1 Failed, errno set. + * @retval 0 Timeout exceeded. + * @retval otherwise Total number of file descriptors returned. + * @post `rfds` contains readable FDs. + * @post `wfds` contains writable FDs. + * @post `efds` contains exceptional FDs. + * @post `timeout` is the time left. + * @note All pointers are allowed to be null pointers. + */ +int rb_fd_select(int nfds, rb_fdset_t *rfds, rb_fdset_t *wfds, rb_fdset_t *efds, struct timeval *timeout); +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_NONNULL(()) +RBIMPL_ATTR_PURE() +/** + * Raw pointer to `fd_set`. + * + * @param[in] f Target fdset. + * @retval NULL `f` is already terminated by rb_fd_term(). + * @retval otherwise Underlying fd_set. + * + * @internal + * + * Extension library must not touch raw pointers. It was a bad idea to let + * them use it. + */ +static inline fd_set * +rb_fd_ptr(const rb_fdset_t *f) +{ + return f->fdset; +} + +RBIMPL_ATTR_NONNULL(()) +RBIMPL_ATTR_PURE() +/** + * It seems this function has no use. Maybe just remove? + * + * @param[in] f A set. + * @return Number of file descriptors stored. + */ +static inline int +rb_fd_max(const rb_fdset_t *f) +{ + return f->maxfd; +} + +#endif /* RBIMPL_INTERN_SELECT_LARGESIZE_H */ diff --git a/libs/libruby/ruby/internal/intern/select/posix.h b/libs/libruby/ruby/internal/intern/select/posix.h new file mode 100644 index 0000000..0a9b0b2 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/select/posix.h @@ -0,0 +1,144 @@ +#ifndef RBIMPL_INTERN_SELECT_POSIX_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_SELECT_POSIX_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs to provide ::rb_fd_select(). + */ +#include "ruby/internal/config.h" + +#ifdef HAVE_SYS_SELECT_H +# include /* for select(2) (modern POSIX) */ +#endif + +#ifdef HAVE_UNISTD_H +# include /* for select(2) (archaic UNIX) */ +#endif + +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/noalias.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/pure.h" + +/** + * The data structure which wraps the fd_set bitmap used by `select(2)`. This + * allows Ruby to use FD sets larger than what has been historically allowed on + * modern platforms. + * + * @internal + * + * ... but because this header file is included only when the system is with + * that "historic restrictions", this is nothing more than an alias of fd_set. + */ +typedef fd_set rb_fdset_t; + +/** Clears the given ::rb_fdset_t. */ +#define rb_fd_zero FD_ZERO + +/** Sets the given fd to the ::rb_fdset_t. */ +#define rb_fd_set FD_SET + +/** Unsets the given fd from the ::rb_fdset_t. */ +#define rb_fd_clr FD_CLR + +/** Queries if the given fd is in the ::rb_fdset_t. */ +#define rb_fd_isset FD_ISSET + +/** Initialises the :given :rb_fdset_t. */ +#define rb_fd_init FD_ZERO + +/** Waits for multiple file descriptors at once. */ +#define rb_fd_select select + +/**@cond INTERNAL_MACRO */ +#define rb_fd_copy rb_fd_copy +#define rb_fd_dup rb_fd_dup +#define rb_fd_ptr rb_fd_ptr +#define rb_fd_max rb_fd_max +/** @endcond */ + +RBIMPL_ATTR_NONNULL(()) +RBIMPL_ATTR_NOALIAS() +/** + * Destructively overwrites an fdset with another. + * + * @param[out] dst Target fdset. + * @param[in] src Source fdset. + * @param[in] n Unused parameter. + * @post `dst` is a copy of `src`. + */ +static inline void +rb_fd_copy(rb_fdset_t *dst, const fd_set *src, int n) +{ + *dst = *src; +} + +RBIMPL_ATTR_NONNULL(()) +RBIMPL_ATTR_NOALIAS() +/** + * Destructively overwrites an fdset with another. + * + * @param[out] dst Target fdset. + * @param[in] src Source fdset. + * @post `dst` is a copy of `src`. + */ +static inline void +rb_fd_dup(rb_fdset_t *dst, const fd_set *src) +{ + *dst = *src; +} + +RBIMPL_ATTR_PURE() +/* :TODO: can this function be __attribute__((returns_nonnull)) or not? */ +/** + * Raw pointer to `fd_set`. + * + * @param[in] f Target fdset. + * @return Underlying fd_set. + * + * @internal + * + * Extension library must not touch raw pointers. It was a bad idea to let + * them use it. + */ +static inline fd_set * +rb_fd_ptr(rb_fdset_t *f) +{ + return f; +} + +RBIMPL_ATTR_CONST() +/** + * It seems this function has no use. Maybe just remove? + * + * @param[in] f A set. + * @return Number of file descriptors stored. + */ +static inline int +rb_fd_max(const rb_fdset_t *f) +{ + return FD_SETSIZE; +} + +/** @cond INTERNAL_MACRO */ +/* :FIXME: What are these? They don't exist for sibling implementations. */ +#define rb_fd_init_copy(d, s) (*(d) = *(s)) +#define rb_fd_term(f) ((void)(f)) +/** @endcond */ + +#endif /* RBIMPL_INTERN_SELECT_POSIX_H */ diff --git a/libs/libruby/ruby/internal/intern/signal.h b/libs/libruby/ruby/internal/intern/signal.h new file mode 100644 index 0000000..84f7558 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/signal.h @@ -0,0 +1,152 @@ +#ifndef RBIMPL_INTERN_SIGNAL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_SIGNAL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Signal handling APIs. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* signal.c */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Sends a signal ("kills") to processes. + * + * The first argument is the signal, either in: + * + * - Numerical representation (e.g. `9`), or + * - Textual representation of canonical (e.g. `:SIGKILL`) name or + * abbreviated (e.g. `:KILL`) name, either in ::rb_cSymbol or ::rb_cString. + * + * All the remaining arguments are numerical representations of process IDs. + * This function iterates over them to send the specified signal. + * + * You can specify both negative PIDs and negative signo to this function: + * + * ``` + * sig \ pid | >= 1 | == 0 | == -1 | <= -2 + * ===========+======+======+=======+======= + * > 0 | #1 | #2 | #3 | #4 + * == 0 | #5 | #6 | #7 | #8 + * < 0 | #9 | #10 | #11 + * ``` + * + * - Case #1: When signo and PID are both positive, this function sends the + * specified signal to the specified process (intuitive). + * + * - Case #2: When signo is positive and PID is zero, this function sends + * that signal to the current process group. + * + * - Case #3: When signo is positive and PID is -1, this function sends that + * signal to everything that the current process is allowed to kill. + * + * - Case #4: When signo is positive and PID is negative (but not -1), this + * function sends that signal to every processes in a process group, whose + * process group ID is the absolute value of the passed PID. + * + * - Case #5: When signo is zero and PID is positive, this function just + * checks for the existence of the specified process and doesn't send + * anything to anyone. In case the process is absent `Errno::ESRCH` is + * raised. + * + * - Case #6: When signo and PID are both zero, this function checks for the + * existence of the current process group. And it must do. This function + * is effectively a no-op then. + * + * - Case #7: When signo is zero and PID is -1, this function checks if there + * is any other process that the current process can kill. At least init + * (PID 1) must exist, so this must not fail. + * + * - Case #8: When signo is zero and PID is negative (but not -1), this + * function checks if there is a process group whose process group ID is + * the absolute value of the passed PID. In case the process group is + * absent `Errno::ESRCH` is raised. + * + * - Case #9: When signo is negative and PID is positive, this function sends + * the absolute value of the passed signo to the process group specified as + * the PID. + * + * - Case #10: When signo is negative and PID is zero, it is highly expected + * that this function sends the absolute value of the passed signo to the + * current process group. Strictly speaking, IEEE Std 1003.1-2017 + * specifies that this (`killpg(3posix)` with an argument of zero) is an + * undefined behaviour. But no operating system is known so far that does + * things differently. + * + * - Case #11: When signo and PID are both negative, the behaviour of this + * function depends on how `killpg(3)` works. On Linux, it seems such + * attempt is strictly prohibited and `Errno::EINVAL` is raised. But on + * macOS, it seems it tries to to send the signal actually to the process + * group. + * + * @note Above description is in fact different from how `kill(2)` works. + * We interpret the passed arguments before passing them through to + * system calls. + * @param[in] argc Number of objects in `argv`. + * @param[in] argv Signal, followed by target PIDs. + * @exception rb_eArgError Unknown signal name. + * @exception rb_eSystemCallError Various errors sending signal to processes. + * @return Something numeric. The meaning of this return value is unclear. + * It seems in case of #1 above, this could be the body count. But + * other cases remain mysterious. + */ +VALUE rb_f_kill(int argc, const VALUE *argv); + +/* This must be private, @shyouhei guesses. */ +#ifdef POSIX_SIGNAL +#define posix_signal ruby_posix_signal +void (*posix_signal(int, void (*)(int)))(int); +#endif + +RBIMPL_ATTR_PURE() +/** + * Queries the name of the signal. It returns for instance `"KILL"` for + * SIGKILL. + * + * @param[in] signo Signal number to query. + * @retval 0 No such signal. + * @retval otherwise A pointer to a static C string that is the name of + * the signal. + * @warning Don't free the return value. + */ +const char *ruby_signal_name(int signo); + +/** + * Pretends as if there was no custom signal handler. This function sets the + * signal action to SIG_DFL, then kills itself. + * + * @param[in] sig The signal. + * @post Previous signal handler is lost. + * @post Passed signal is sent to the current process. + * + * @internal + * + * @shyouhei doesn't understand the needs of this function being visible from + * extension libraries. + */ +void ruby_default_signal(int sig); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_SIGNAL_H */ diff --git a/libs/libruby/ruby/internal/intern/sprintf.h b/libs/libruby/ruby/internal/intern/sprintf.h new file mode 100644 index 0000000..aedc0f9 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/sprintf.h @@ -0,0 +1,159 @@ +#ifndef RBIMPL_INTERN_SPRINTF_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_SPRINTF_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Our own private `printf(3)`. + */ +#include "ruby/internal/attr/format.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* sprintf.c */ + +/** + * Identical to rb_str_format(), except how the arguments are arranged. + * + * @param[in] argc Number of objects of `argv`. + * @param[in] argv A format string, followed by its arguments. + * @return A rendered new instance of ::rb_cString. + * + * @internal + * + * You can safely pass NULL to `argv`. Doesn't make any sense though. + */ +VALUE rb_f_sprintf(int argc, const VALUE *argv); + +RBIMPL_ATTR_NONNULL((1)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2) +/** + * Ruby's extended `sprintf(3)`. We ended up reinventing the entire `printf` + * business because we don't want to depend on locales. OS-provided `printf` + * routines might or might not, which caused instabilities of the result + * strings. + * + * The format sequence is a mixture of format specifiers and other verbatim + * contents. Each format specifier starts with a `%`, and has the following + * structure: + * + * ``` + * %[flags][width][.precision][length]conversion + * ``` + * + * This function supports flags of ` `, `#`, `+`, `-`, `0`, width of + * non-negative decimal integer and `*`, precision of non-negative decimal + * integers and `*`, length of `L`, `h`, `t`, `z`, `l`, `ll`, `q`, conversions + * of `A`, `D`, `E`, `G`, `O`, `U`, `X`, `a`, `c`, `d`, `e`, `f`, `g`, `i`, + * `n`, `o`, `p`, `s`, `u`, `x`, and `%`. In case of `_WIN32` it also supports + * `I`. And additionally, it supports magical `PRIsVALUE` macro that can + * stringise arbitrary Ruby objects: + * + * ```CXX + * rb_sprintf("|%"PRIsVALUE"|", RUBY_Qtrue); // => "|true|" + * rb_sprintf("%+"PRIsVALUE, rb_stdin); // => "#>" + * ``` + * + * @param[in] fmt A `printf`-like format specifier. + * @param[in] ... Variadic number of contents to format. + * @return A rendered new instance of ::rb_cString. + * + * @internal + * + * :FIXME: We can improve this document. + */ +VALUE rb_sprintf(const char *fmt, ...); + +RBIMPL_ATTR_NONNULL((1)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 0) +/** + * Identical to rb_sprintf(), except it takes a `va_list`. + * + * @param[in] fmt A `printf`-like format specifier. + * @param[in] ap Contents to format. + * @return A rendered new instance of ::rb_cString. + */ +VALUE rb_vsprintf(const char *fmt, va_list ap); + +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 3) +/** + * Identical to rb_sprintf(), except it renders the output to the specified + * object rather than creating a new one. + * + * @param[out] dst String to modify. + * @param[in] fmt A `printf`-like format specifier. + * @param[in] ... Variadic number of contents to format. + * @exception rb_eTypeError `dst` is not a String. + * @return Passed `dst`. + * @post `dst` has the rendered output appended to its end. + */ +VALUE rb_str_catf(VALUE dst, const char *fmt, ...); + +RBIMPL_ATTR_NONNULL((2)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 2, 0) +/** + * Identical to rb_str_catf(), except it takes a `va_list`. It can also be + * seen as a routine identical to rb_vsprintf(), except it renders the output + * to the specified object rather than creating a new one. + * + * @param[out] dst String to modify. + * @param[in] fmt A `printf`-like format specifier. + * @param[in] ap Contents to format. + * @exception rb_eTypeError `dst` is not a String. + * @return Passed `dst`. + * @post `dst` has the rendered output appended to its end. + */ +VALUE rb_str_vcatf(VALUE dst, const char *fmt, va_list ap); + +/** + * Formats a string. + * + * Returns the string resulting from applying `fmt` to `argv`. The format + * sequence is a mixture of format specifiers and other verbatim contents. + * Each format specifier starts with a `%`, and has the following structure: + * + * ``` + * %[flags][width][.precision]type + * ``` + * + * ... which is different from that of rb_sprintf(). Because ruby has no + * `short` or `long`, there is no way to specify a "length" of an argument. + * + * This function supports flags of ` `, `#`, `+`, `-`, `<>`, `{}`, with of + * non-negative decimal integer and `$`, `*`, precision of non-negative decimal + * integer and `$`, `*`, type of `A`, `B`, `E`, `G`, `X`, `a`, `b`, `c`, `d`, + * `e`, `f`, `g`, `i`, `o`, `p`, `s`, `u`, `x`, `%`. This list is also + * (largely the same but) not identical to that of rb_sprintf(). + * + * @param[in] argc Number of objects in `argv`. + * @param[in] argv Format arguments. + * @param[in] fmt A printf-like format specifier. + * @exception rb_eTypeError `fmt` is not a string. + * @exception rb_eArgError Failed to parse `fmt`. + * @return A rendered new instance of ::rb_cString. + * @note Everything it takes must be Ruby objects. + * + */ +VALUE rb_str_format(int argc, const VALUE *argv, VALUE fmt); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_SPRINTF_H */ diff --git a/libs/libruby/ruby/internal/intern/string.h b/libs/libruby/ruby/internal/intern/string.h new file mode 100644 index 0000000..3083125 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/string.h @@ -0,0 +1,1757 @@ +#ifndef RBIMPL_INTERN_STRING_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_STRING_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cString. + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#ifdef HAVE_STRING_H +# include +#endif + +#ifdef HAVE_STDINT_H +# include +#endif + +#include "ruby/internal/attr/deprecated.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/constant_p.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/variable.h" /* rb_gvar_setter_t */ +#include "ruby/st.h" /* st_index_t */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* string.c */ + +/** + * Allocates an instance of ::rb_cString. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString, of `len` bytes length, of + * "binary" encoding, whose contents are verbatim copy of `ptr`. + * @pre At least `len` bytes of continuous memory region shall be + * accessible via `ptr`. + */ +VALUE rb_str_new(const char *ptr, long len); + +/** + * Identical to rb_str_new(), except it assumes the passed pointer is a pointer + * to a C string. + * + * @param[in] ptr A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @exception rb_eArgError `ptr` is a null pointer. + * @return An instance of ::rb_cString, of "binary" encoding, whose + * contents are verbatim copy of `ptr`. + * @pre `ptr` must not be a null pointer. + */ +VALUE rb_str_new_cstr(const char *ptr); + +/** + * Identical to rb_str_new_cstr(), except it takes a Ruby's string instead of + * C's. Implementation wise it creates a string that shares the backend memory + * region with the receiver. So the name. But there is no way for extension + * libraries to know if a string is of such variant. + * + * @param[in] str An object of ::RString. + * @return An allocated instance of ::rb_cString, which shares the + * encoding, length, and contents with the passed string. + * @pre `str` must not be any arbitrary object except ::RString. + * @note Use #StringValue to enforce the precondition. + */ +VALUE rb_str_new_shared(VALUE str); + +/** + * Creates a frozen copy of the string, if necessary. This function does + * nothing when the passed string is already frozen. Otherwise, it allocates a + * copy of it, which is frozen. The passed string is untouched either ways. + * + * @param[in] str An object of ::RString. + * @return Something frozen. + * @pre `str` must not be any arbitrary object except ::RString. + * @note Use #StringValue to enforce the precondition. + */ +VALUE rb_str_new_frozen(VALUE str); + +/** + * Identical to rb_str_new(), except it takes the class of the allocating + * object. + * + * @param[in] obj A string-ish object. + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of the class of `obj`, of `len` bytes length, of + * "binary" encoding, whose contents are verbatim copy of `ptr`. + * @pre At least `len` bytes of continuous memory region shall be + * accessible via `ptr`. + * + * @internal + * + * Why it doesn't take an instance of ::rb_cClass? + */ +VALUE rb_str_new_with_class(VALUE obj, const char *ptr, long len); + +/** + * Identical to rb_str_new(), except it generates a string of "default + * external" encoding. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString. In case encoding conversion from + * "default internal" to "default external" is fully defined over + * the given contents, then the return value is a string of + * "default external" encoding, whose contents are the converted + * ones. Otherwise the string is a junk. + * @warning It doesn't raise on a conversion failure and silently ends up in + * a corrupted output. You can know the failure by querying + * `valid_encoding?` of the result object. + */ +VALUE rb_external_str_new(const char *ptr, long len); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_external_str_new(), except it assumes the passed pointer is + * a pointer to a C string. It can also be seen as a routine identical to + * rb_str_new_cstr(), except it generates a string of "default external" + * encoding. + * + * @param[in] ptr A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString. In case encoding conversion from + * "default internal" to "default external" is fully defined over + * the given contents, then the return value is a string of + * "default external" encoding, whose contents are the converted + * ones. Otherwise the string is a junk. + * @warning It doesn't raise on a conversion failure and silently ends up in + * a corrupted output. You can know the failure by querying + * `valid_encoding?` of the result object. + * @pre `ptr` must not be a null pointer. + */ +VALUE rb_external_str_new_cstr(const char *ptr); + +/** + * Identical to rb_str_new(), except it generates a string of "locale" + * encoding. It can also be seen as a routine identical to + * rb_external_str_new(), except it generates a string of "locale" encoding + * instead of "default external" encoding. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString. In case encoding conversion from + * "default internal" to "locale" is fully defined over the given + * contents, then the return value is a string of "locale" + * encoding, whose contents are the converted ones. Otherwise the + * string is a junk. + * @warning It doesn't raise on a conversion failure and silently ends up in + * a corrupted output. You can know the failure by querying + * `valid_encoding?` of the result object. + */ +VALUE rb_locale_str_new(const char *ptr, long len); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_locale_str_new(), except it assumes the passed pointer is a + * pointer to a C string. It can also be seen as a routine identical to + * rb_external_str_new_cstr(), except it generates a string of "locale" + * encoding instead of "default external". + * + * @param[in] ptr A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString. In case encoding conversion from + * "default internal" to "locale" is fully defined over the given + * contents, then the return value is a string of "locale" + * encoding, whose contents are the converted ones. Otherwise the + * string is a junk. + * @warning It doesn't raise on a conversion failure and silently ends up in + * a corrupted output. You can know the failure by querying + * `valid_encoding?` of the result object. + * @pre `ptr` must not be a null pointer. + */ +VALUE rb_locale_str_new_cstr(const char *ptr); + +/** + * Identical to rb_str_new(), except it generates a string of "filesystem" + * encoding. It can also be seen as a routine identical to + * rb_external_str_new(), except it generates a string of "filesystem" encoding + * instead of "default external" encoding. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString. In case encoding conversion from + * "default internal" to "filesystem" is fully defined over the + * given contents, then the return value is a string of + * "filesystem" encoding, whose contents are the converted ones. + * Otherwise the string is a junk. + * @warning It doesn't raise on a conversion failure and silently ends up in + * a corrupted output. You can know the failure by querying + * `valid_encoding?` of the result object. + */ +VALUE rb_filesystem_str_new(const char *ptr, long len); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_filesystem_str_new(), except it assumes the passed pointer + * is a pointer to a C string. It can also be seen as a routine identical to + * rb_external_str_new_cstr(), except it generates a string of "filesystem" + * encoding instead of "default external". + * + * @param[in] ptr A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString. In case encoding conversion from + * "default internal" to "filesystem" is fully defined over the + * given contents, then the return value is a string of + * "filesystem" encoding, whose contents are the converted ones. + * Otherwise the string is a junk. + * @warning It doesn't raise on a conversion failure and silently ends up in + * a corrupted output. You can know the failure by querying + * `valid_encoding?` of the result object. + * @pre `ptr` must not be a null pointer. + */ +VALUE rb_filesystem_str_new_cstr(const char *ptr); + +/** + * Allocates a "string buffer". A string buffer here is an instance of + * ::rb_cString, whose capacity is bigger than the length of it. If you can + * say that a string grows to a specific amount of bytes, this could be + * effective than resizing a string over and over again and again. + * + * @param[in] capa Designed capacity of the generating string. + * @return An empty string, of "binary" encoding, whose capacity is `capa`. + */ +VALUE rb_str_buf_new(long capa); + +RBIMPL_ATTR_NONNULL(()) +/** + * This is a rb_str_buf_new() + rb_str_buf_cat() combo. + * + * @param[in] ptr A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString, of "binary" encoding, whose + * contents are verbatim copy of `ptr`. + * @pre `ptr` must not be a null pointer. + * + * @internal + * + * This must be identical to rb_str_new_cstr(), except done in inefficient way? + * @shyouhei doesn't understand why this is not a simple alias. + */ +VALUE rb_str_buf_new_cstr(const char *ptr); + +/** + * Allocates a "temporary" string. This is a hidden empty string. Handy on + * occasions. + * + * @param[in] len Designed length of the string. + * @return A hidden, empty string. + * @see rb_obj_hide() + */ +VALUE rb_str_tmp_new(long len); + +/** + * Identical to rb_str_new(), except it generates a string of "US ASCII" + * encoding. This is different from rb_external_str_new(), not only for the + * output encoding, but also it doesn't convert the contents. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString, of `len` bytes length, of + * "US ASCII" encoding, whose contents are verbatim copy of `ptr`. + */ +VALUE rb_usascii_str_new(const char *ptr, long len); + +/** + * Identical to rb_str_new_cstr(), except it generates a string of "US ASCII" + * encoding. It can also be seen as a routine Identical to + * rb_usascii_str_new(), except it assumes the passed pointer is a pointer to a + * C string. + * + * @param[in] ptr A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @exception rb_eArgError `ptr` is a null pointer. + * @return An instance of ::rb_cString, of "US ASCII" encoding, whose + * contents are verbatim copy of `ptr`. + * @pre `ptr` must not be a null pointer. + */ +VALUE rb_usascii_str_new_cstr(const char *ptr); + +/** + * Identical to rb_str_new(), except it generates a string of "UTF-8" encoding. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString, of `len` bytes length, of + * "UTF-8" encoding, whose contents are verbatim copy of `ptr`. + */ +VALUE rb_utf8_str_new(const char *ptr, long len); + +/** + * Identical to rb_str_new_cstr(), except it generates a string of "UTF-8" + * encoding. It can also be seen as a routine Identical to + * rb_usascii_str_new(), except it assumes the passed pointer is a pointer to a + * C string. + * + * @param[in] ptr A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @exception rb_eArgError `ptr` is a null pointer. + * @return An instance of ::rb_cString, of "UTF-8" encoding, whose contents + * are verbatim copy of `ptr`. + * @pre `ptr` must not be a null pointer. + */ +VALUE rb_utf8_str_new_cstr(const char *ptr); + +/** + * @name Special strings that are backended by C string literals. + * + * *_str_new_static functions are intended for C string literals. + * They require memory in the range [ptr, ptr+len] to always be readable. + * Note that this range covers a total of len + 1 bytes. + * + * @{ + */ + +/** + * Identical to rb_str_new(), except it takes a C string literal. + * + * @param[in] ptr A C string literal. + * @param[in] len `strlen(ptr)`. + * @exception rb_eArgError `len` out of range of `size_t`. + * @pre `ptr` must be a C string constant. + * @return An instance of ::rb_cString, of "binary" encoding, whose backend + * storage is the passed C string literal. + * @warning It is a very bad idea to write to a C string literal (often + * immediate SEGV shall occur). Consider return values of this + * function be read-only. + * + * @internal + * + * Surprisingly it can take NULL, and generates an empty string. + */ +VALUE rb_str_new_static(const char *ptr, long len); + +/** + * Identical to rb_str_new_static(), except it generates a string of "US ASCII" + * encoding instead of "binary". It can also be seen as a routine identical to + * rb_usascii_str_new(), except it takes a C string literal. + * + * @param[in] ptr A C string literal. + * @param[in] len `strlen(ptr)`. + * @exception rb_eArgError `len` out of range of `size_t`. + * @pre `ptr` must be a C string constant. + * @return An instance of ::rb_cString, of "US ASCII" encoding, whose + * backend storage is the passed C string literal. + * @warning It is a very bad idea to write to a C string literal (often + * immediate SEGV shall occur). Consider return values of this + * function be read-only. + */ +VALUE rb_usascii_str_new_static(const char *ptr, long len); + +/** + * Identical to rb_str_new_static(), except it generates a string of "UTF-8" + * encoding instead of "binary". It can also be seen as a routine identical to + * rb_utf8_str_new(), except it takes a C string literal. + * + * @param[in] ptr A C string literal. + * @param[in] len `strlen(ptr)`. + * @exception rb_eArgError `len` out of range of `size_t`. + * @pre `ptr` must be a C string constant. + * @return An instance of ::rb_cString, of "UTF-8" encoding, whose backend + * storage is the passed C string literal. + * @warning It is a very bad idea to write to a C string literal (often + * immediate SEGV shall occur). Consider return values of this + * function be read-only. + */ +VALUE rb_utf8_str_new_static(const char *ptr, long len); + +/** @} */ + +/** + * Identical to rb_interned_str(), except it takes a Ruby's string instead of + * C's. It can also be seen as a routine identical to to rb_str_new_shared(), + * except it returns an infamous "f"string. + * + * @param[in] str An object of ::RString. + * @return An instance of ::rb_cString, either cached or allocated, which + * has the identical encoding, length, and contents with the passed + * string. + * @pre `str` must not be any arbitrary object except ::RString. + * @note Use #StringValue to enforce the precondition. + * + * @internal + * + * It actually finds or creates a fstring of the needed property, and + * destructively modifies the receiver behind-the-scene so that it becomes a + * shared string whose parent is the returning fstring. + */ +VALUE rb_str_to_interned_str(VALUE str); + +/** + * Identical to rb_str_new(), except it returns an infamous "f"string. What is + * a fstring? Well it is a special subkind of strings that is immutable, + * deduped globally, and managed by our GC. It is much like a Symbol (in fact + * Symbols are dynamic these days and are backended using fstrings). This + * concept has been silently introduced at some point in 2.x era. Since then + * it gained wider acceptance in the core. Starting from 3.x extension + * libraries can also generate ones. + * + * @param[in] ptr A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @exception rb_eArgError `len` is negative. + * @return A found or created instance of ::rb_cString, of `len` bytes + * length, of "binary" encoding, whose contents are identical to + * that of `ptr`. + * @pre At least `len` bytes of continuous memory region shall be + * accessible via `ptr`. + */ +VALUE rb_interned_str(const char *ptr, long len); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_interned_str(), except it assumes the passed pointer is a + * pointer to a C's string. It can also be seen as a routine identical to to + * rb_str_to_interned_str(), except it takes a C's string instead of Ruby's. + * Or it can also be seen as a routine identical to rb_str_new_cstr(), except + * it returns an infamous "f"string. + * + * @param[in] ptr A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString, of "binary" encoding, whose + * contents are verbatim copy of `ptr`. + * @pre `ptr` must not be a null pointer. + */ +VALUE rb_interned_str_cstr(const char *ptr); + +/** + * Destroys the given string for no reason. + * + * @warning DO NOT USE IT. + * @warning Leave this task to our GC. + * @warning It was a bad idea at the first place to let you know about it. + * + * @param[out] str The string to be executed. + * @post The given string no longer exists. + * @note Maybe `String#clear` could be what you want. + * + * @internal + * + * Should have moved this to `internal/string.h`. + */ +void rb_str_free(VALUE str); + +/** + * Replaces the contents of the former with the latter. + * + * @param[out] dst Destination object. + * @param[in] src Source object. + * @pre Both objects must not be any arbitrary objects except + * ::RString. + * @post `dst`'s former components are abandoned. It now has the + * identical encoding, length, and contents to `src`. + * @see rb_str_replace() + * + * @internal + * + * @shyouhei doesn't understand why this is useful to extension libraries. + * Just use rb_str_replace(). What's wrong with that? + */ +void rb_str_shared_replace(VALUE dst, VALUE src); + +/** + * Identical to rb_str_cat_cstr(), except it takes Ruby's string instead of + * C's. It can also be seen as a routine identical to rb_str_shared_replace(), + * except it appends instead of replaces. + * + * @param[out] dst Destination object. + * @param[in] src Source object. + * @exception rb_eEncCompatError Can't mix the encodings. + * @exception rb_eArgError Result string too big. + * @return The passed `dst`. + * @pre Both objects must not be any arbitrary objects except + * ::RString. + * @post `dst` has the contents of `src` appended, with encoding + * converted into `dst`'s one, into the end of `dst`. + */ +VALUE rb_str_buf_append(VALUE dst, VALUE src); + +/** @alias{rb_str_cat} */ +VALUE rb_str_buf_cat(VALUE, const char*, long); + +/** @alias{rb_str_cat_cstr} */ +VALUE rb_str_buf_cat2(VALUE, const char*); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_str_cat_cstr(), except it additionally assumes the source + * string be a NUL terminated ASCII string. + * + * @param[out] dst Destination object. + * @param[in] src Source string. + * @exception rb_eArgError Result string too big. + * @return The passed `dst`. + * @pre `dst` must not be any arbitrary object except ::RString. + * @pre `src` must be a NUL terminated ASCII string. + * @post `dst` has the contents of `src` appended, with encoding + * converted into `dst`'s one, into the end of `dst`. + */ +VALUE rb_str_buf_cat_ascii(VALUE dst, const char *src); + +/** + * Try converting an object to its stringised representation using its `to_s` + * method, if any. If there is no such thing, it resorts to rb_any_to_s() + * output. + * + * @param[in] obj Arbitrary ruby object to stringise. + * @return An instance of ::rb_cString. + */ +VALUE rb_obj_as_string(VALUE obj); + +/** + * Try converting an object to its stringised representation using its `to_str` + * method, if any. If there is no such thing, returns ::RUBY_Qnil. + * + * @param[in] obj Arbitrary ruby object to stringise. + * @exception rb_eTypeError `obj.to_str` returned something non-String. + * @retval RUBY_Qnil No conversion from obj to String defined. + * @return otherwise Stringised representation of `obj`. + * @see rb_io_check_io + * @see rb_check_array_type + * @see rb_check_hash_type + */ +VALUE rb_check_string_type(VALUE obj); + +/** + * Asserts that the given string's encoding is (Ruby's definition of) ASCII + * compatible. + * + * @param[in] obj An instance of ::rb_cString. + * @exception rb_eEncCompatError `obj` is ASCII incompatible. + * + * @internal + * + * @shyouhei doesn't know if this is an Easter egg or an official feature, but + * this function can in fact take non-strings such as Symbols, Regexps, IOs, + * etc. However if something unsupported is passed, it causes SEGV. It seems + * the feature is kind of untested. + */ +void rb_must_asciicompat(VALUE obj); + +/** + * Duplicates a string. + * + * @param[in] str String in question to duplicate. + * @return A duplicated new instance. + * @pre `str` must be of ::RString. + */ +VALUE rb_str_dup(VALUE str); + +/** + * I guess there is no use case of this function in extension libraries, but + * this is a routine identical to rb_str_dup(), except it always creates an + * instance of ::rb_cString regardless of the given object's class. This makes + * the most sense when the passed string is formerly hidden by rb_obj_hide(). + * + * @param[in] str A string, possibly hidden. + * @return A duplicated new instance of ::rb_cString. + */ +VALUE rb_str_resurrect(VALUE str); + +/** + * Obtains a "temporary lock" of the string. This advisory locking mechanism + * prevents other cooperating threads from tampering the receiver. The same + * thing could be done via freeze mechanism, but this one can also be unlocked + * using rb_str_unlocktmp(). + * + * @param[out] str String to lock. + * @exception rb_eRuntimeError `str` already locked. + * @return The given string. + * @post The string is locked. + */ +VALUE rb_str_locktmp(VALUE str); + +/** + * Releases a lock formerly obtained by rb_str_locktmp(). + * + * @param[out] str String to unlock. + * @exception rb_eRuntimeError `str` already unlocked. + * @return The given string. + * @post The string is locked. + */ +VALUE rb_str_unlocktmp(VALUE str); + +/** @alias{rb_str_new_frozen} */ +VALUE rb_str_dup_frozen(VALUE); + +/** @alias{rb_str_new_frozen} */ +#define rb_str_dup_frozen rb_str_new_frozen + +/** + * Generates a new string, concatenating the former to the latter. It can also + * be seen as a routine identical to rb_str_append(), except it doesn't tamper + * the passed strings to create a new one instead. + * + * @param[in] lhs Source string #1. + * @param[in] rhs Source string #2. + * @exception rb_eEncCompatError Can't mix the encodings. + * @exception rb_eArgError Result string too big. + * @return A new string containing `rhs` concatenated to `lhs`. + * @pre Both objects must not be any arbitrary objects except ::RString. + * @note This operation doesn't commute. Don't get confused by the + * "plus" terminology. For historical reasons there are some + * noncommutative `+`s in Ruby. This is one of such things. There + * has been a long discussion around `+`s in programming languages. + */ +VALUE rb_str_plus(VALUE lhs, VALUE rhs); + +/** + * Repetition of a string. + * + * @param[in] str String to repeat. + * @param[in] num Count, something numeric. + * @exception rb_eArgError `num` is negative. + * @return A new string repeating `num` times of `str`. + */ +VALUE rb_str_times(VALUE str, VALUE num); + +/** + * Byte offset to character offset conversion. This makes sense when the + * receiver is in a multibyte encoding. The string's i-th character does not + * always sit at its i-th byte. This function scans the contents to find the + * character index that matches the byte index. Generally speaking this is an + * `O(n)` operation. Could be slow. + * + * @param[in] str The string to scan. + * @param[in] pos Offset, in bytes. + * @return Offset, in characters. + */ +long rb_str_sublen(VALUE str, long pos); + +/** + * This is the implementation of two-argumented `String#slice`. + * + * - Returns the substring of the given `len` found in `str` at offset `beg`: + * + * ```ruby + * 'foo'[0, 2] # => "fo" + * 'foo'[0, 0] # => "" + * ``` + * + * - Counts backward from the end of `str` if `beg` is negative: + * + * ```ruby + * 'foo'[-2, 2] # => "oo" + * ``` + * + * - Special case: returns a new empty string if `beg` is equal to the length + * of `str`: + * + * ```ruby + * 'foo'[3, 2] # => "" + * ``` + * + * - Returns a null pointer if `beg` is out of range: + * + * ```ruby + * 'foo'[4, 2] # => nil + * 'foo'[-4, 2] # => nil + * ``` + * + * - Returns the trailing substring of `str` if `len` is large: + * + * ```ruby + * 'foo'[1, 50] # => "oo" + * ``` + * + * - Returns a null pointer if `len` is negative: + * + * ```ruby + * 'foo'[0, -1] # => nil + * ``` + * + * @param[in] str The string to slice. + * @param[in] beg Requested offset of the substring. + * @param[in] len Requested length of the substring. + * @retval RUBY_Qnil Parameters out of range. + * @retval otherwise A new string whose contents is the specified + * substring of `str`. + * @pre `str` must not be any arbitrary objects except ::RString. + */ +VALUE rb_str_substr(VALUE str, long beg, long len); + +/** + * Identical to rb_str_substr(), except the numbers are interpreted as byte + * offsets instead of character offsets. + * + * @param[in] str The string to slice. + * @param[in] beg Requested offset of the substring. + * @param[in] len Requested length of the substring. + * @return A new string whose contents is the specified substring of `str`. + * @pre `str` must not be any arbitrary objects except ::RString. + * @pre `beg` and `len` must not point to OOB contents. + */ +VALUE rb_str_subseq(VALUE str, long beg, long len); + +/** + * Identical to rb_str_substr(), except it returns a C's string instead of + * Ruby's. + * + * @param[in] str The string to slice. + * @param[in] beg Requested offset of the substring. + * @param[in,out] len Requested length of the substring. + * @retval NULL Parameters out of range. + * @retval otherwise A pointer inside of `str`'s backend storage where + * the specified substring exist. + * @pre `str` must not be any arbitrary objects except ::RString. + * @post `len` is updated to have the length of the return value. + */ +char *rb_str_subpos(VALUE str, long beg, long *len); + +/** + * Declares that the string is about to be modified. This for instance let the + * string have a dedicated backend storage. + * + * @param[out] str String about to be modified. + * @exception rb_eRuntimeError `str` is `locktmp`-ed. + * @exception rb_eFrozenError `str` is frozen. + * @pre `str` must not be any arbitrary objects except ::RString. + * @post Upon successful return the passed string is eligible to be + * modified. + */ +void rb_str_modify(VALUE str); + +/** + * Identical to rb_str_modify(), except it additionally expands the capacity of + * the receiver. + * + * @param[out] str Target string to modify. + * @param[in] capa Additional capacity to add. + * @exception rb_eArgError `capa` is negative. + * @exception rb_eRuntimeError `str` is `locktmp`-ed. + * @exception rb_eFrozenError `str` is frozen. + * @pre `str` must not be any arbitrary objects except ::RString. + * @post Upon successful return the passed string is modified so that + * its capacity is increased for `capa` bytes. + */ +void rb_str_modify_expand(VALUE str, long capa); + +/** + * This is the implementation of `String#freeze`. + * + * @param[out] str Target string to freeze. + * @return The passed string. + * @post Upon successful return the passed string is frozen. + */ +VALUE rb_str_freeze(VALUE str); + +/** + * Overwrites the length of the string. Typically this is used to shrink a + * string that was formerly expanded. + * + * ```CXX + * extern int fd; + * auto str = rb_eval_string("'...'"); + * rb_str_modify_expand(str, BUFSIZ); + * if (auto len = recv(fd, RSTRING_PTR(str), BUFSIZ, 0); len >= 0) { + * rb_str_set_len(str, len); + * } + * else { + * rb_sys_fail("recv(2)"); + * } + * ``` + * + * @param[out] str String to shrink. + * @param[in] len New length of the string. + * @exception rb_eRuntimeError `str` is `locktmp`-ed. + * @exception rb_eFrozenError `str` is frozen. + * @pre `str` must not be any arbitrary objects except ::RString. + * @post Upon successful return `str`'s length is set to `len`. + */ +void rb_str_set_len(VALUE str, long len); + +/** + * Overwrites the length of the string. In contrast to rb_str_set_len(), this + * function can also expand a string. + * + * @param[out] str String to shrink. + * @param[in] len New length of the string. + * @exception rb_eArgError `len` is negative. + * @exception rb_eRuntimeError `str` is `locktmp`-ed. + * @exception rb_eFrozenError `str` is frozen. + * @return The passed `str`. + * @pre `str` must not be any arbitrary objects except ::RString. + * @post Upon successful return `str` is either expanded or shrunken to + * have its length be `len`. + */ +VALUE rb_str_resize(VALUE str, long len); + +/** + * Destructively appends the passed contents to the string. + * + * @param[out] dst Destination object. + * @param[in] src Contents to append. + * @param[in] srclen Length of `src`. + * @exception rb_eArgError `srclen` is negative. + * @return The passed `dst`. + * @pre `dst` must not be any arbitrary objects except ::RString. + * @post `dst` has the contents of `ptr` appended. + */ +VALUE rb_str_cat(VALUE dst, const char *src, long srclen); + +/** + * Identical to rb_str_cat(), except it assumes the passed pointer is a pointer + * to a C string. + * + * @param[out] dst Destination object. + * @param[in] src Contents to append. + * @exception rb_eArgError Result string too big. + * @exception rb_eArgError `src` is a null pointer. + * @return The passed `dst`. + * @pre `dst` must not be any arbitrary objects except ::RString. + * @pre `src` must not be a null pointer. + * @post `dst` has the contents of `src` appended. + */ +VALUE rb_str_cat_cstr(VALUE dst, const char *src); + +/** @alias{rb_str_cat_cstr} */ +VALUE rb_str_cat2(VALUE, const char*); + +/** + * Identical to rb_str_buf_append(), except it converts the right hand side + * before concatenating. + * + * @param[out] dst Destination object. + * @param[in] src Source object. + * @exception rb_eEncCompatError Can't mix the encodings. + * @exception rb_eArgError Result string too big. + * @return The passed `dst`. + * @pre `dst` must not be any arbitrary objects except ::RString. + * @post `dst` has the contents of `src` appended, with encoding + * converted into `dst`'s one, into the end of `dst`. + */ +VALUE rb_str_append(VALUE dst, VALUE src); + +/** + * Identical to rb_str_append(), except it also accepts an integer as a + * codepoint. This resembles `String#<<`. + * + * @param[out] dst Destination object. + * @param[in] src Source object, String or Numeric. + * @exception rb_eRangeError Source numeric is out of range. + * @exception rb_eEncCompatError Source string too long. + * @exception rb_eArgError Result string too big. + * @return The passed `dst`. + * @pre `dst` must not be any arbitrary objects except ::RString. + * @post `dst` has the contents of `src` appended, with encoding + * converted into `dst`'s one, into the end of `dst`. + */ +VALUE rb_str_concat(VALUE dst, VALUE src); + +/* random.c */ + +/** + * This is a universal hash function. + * + * @warning This function changes its value per process. + * @param[in] ptr Target message. + * @param[in] len Length of `ptr` in bytes. + * @return A pseudorandom number suitable for Hash's hash value. + * @see Aumasson, JP., Bernstein, D.J., "SipHash: A Fast Short-Input + * PRF", In proceedings of 13th International Conference on + * Cryptology in India (INDOCRYPT 2012), LNCS 7668, pp. 489-508, + * 2012. http://doi.org/10.1007/978-3-642-34931-7_28 +*/ +st_index_t rb_memhash(const void *ptr, long len); + +/** + * Starts a series of hashing. Suppose you have a struct: + * + * ```CXX + * struct foo_tag { + * unsigned char bar; + * uint32_t baz; + * }; + * ``` + * + * It is not a wise idea to call rb_memhash() over it, because there could be + * padding bits. Instead you should explicitly iterate over each fields: + * + * ```CXX + * foo_tag foo = { 0, 0, }; + * st_index_t hash = 0; + * + * hash = rb_hash_start(0); + * hash = rb_hash_uint(hash, foo.bar); + * hash = rb_hash_uint32(hash, foo.baz); + * hash = rb_hash_end(hash); + * ``` + * + * @param[in] i Initial value. + * @return A hash value. + */ +st_index_t rb_hash_start(st_index_t i); + +/** @alias{st_hash_uint32} */ +#define rb_hash_uint32(h, i) st_hash_uint32((h), (i)) + +/** @alias{st_hash_uint} */ +#define rb_hash_uint(h, i) st_hash_uint((h), (i)) + +/** @alias{st_hash_end} */ +#define rb_hash_end(h) st_hash_end(h) + +/* string.c */ + +/** + * Calculates a hash value of a string. This is one of the two functions that + * constructs struct ::st_hash_type. + * + * @param[in] str An object of ::RString. + * @return A hash value. + * @pre `str` must not be any arbitrary object except ::RString. + * + * @internal + * + * Although safe to call, there must be no particular use case of this function + * for extension libraries. Only ruby internals must know about it. + * + * This is not a simple alias of rb_memhash(), because it considers the passed + * string's encoding as well as its contents. + */ +st_index_t rb_str_hash(VALUE str); + +/** + * Compares two strings. This is one of the two functions that constructs + * struct ::st_hash_type. + * + * @param[in] str1 A string. + * @param[in] str2 Another string. + * @retval 1 They have identical contents, length, and encodings. + * @retval 0 Otherwise. + * @pre Both objects must not be any arbitrary objects except + * ::RString. + * + * @internal + * + * In contrast to rb_str_hash(), this could be handy for comparison that only + * concerns equality. rb_str_cmp() returns 1, 0, -1. + */ +int rb_str_hash_cmp(VALUE str1, VALUE str2); + +/** + * Checks if two strings are comparable each other or not. Because + * rb_str_cmp() must return "lesser than" or "greater than" information, + * comparing two strings needs a stricter restriction. Both sides must be in a + * same set of strings which have total order. This is to check that property. + * Intuitive it sounds? But they can have different encodings. A character + * and another might or might not appear in the same order in their codepoints. + * It is complicated than you think. + * + * @param[in] str1 A string. + * @param[in] str2 Another string. + * @retval 1 They agree on a total order. + * @retval 0 Otherwise. + * @pre Both objects must not be any arbitrary objects except + * ::RString. + */ +int rb_str_comparable(VALUE str1, VALUE str2); + +/** + * Compares two strings, as in `strcmp(3)`. This does not consider the current + * locale, but considers the encodings of both sides instead. + * + * @param[in] lhs A string. + * @param[in] rhs Another string. + * @retval -1 `lhs` is "bigger than" `rhs`. + * @retval 1 `rhs` is "bigger than" `lhs`. + * @retval 0 Otherwise, e.g. not comparable. + * @pre Both objects must not be any arbitrary objects except + * ::RString. + */ +int rb_str_cmp(VALUE lhs, VALUE rhs); + +/** + * Equality of two strings. + * + * If `str2` is not a String, it resorts to `str2 == str1`. Otherwise if they + * are not comparable, returns ::RUBY_Qfalse. Otherwise if they have the same + * contents and the length, returns ::RUBY_Qtrue. Otherwise, returns + * ::RUBY_Qfalse. + * + * @param[in] str1 A string. + * @param[in] str2 Another string. + * @retval RUBY_Qtrue They are equal. + * @retval RUBY_Qfalse They are either different, or not comparable. + */ +VALUE rb_str_equal(VALUE str1, VALUE str2); + +/** + * Shrinks the given string for the given number of bytes. + * + * @param[out] str String to squash. + * @param[in] len Number of bytes to reduce. + * @exception rb_eRuntimeError `str` is `locktmp`-ed. + * @exception rb_eFrozenError `str` is frozen. + * @return The passed `str`. + * @pre `str` must not be any arbitrary objects except ::RString. + * @post `str` is shrunken. + * @warning Can break a multibyte character in middle. + * + * @internal + * + * What if `len` is negative? + */ +VALUE rb_str_drop_bytes(VALUE str, long len); + +/** + * Replaces some (or all) of the contents of the given string. This is the + * implementation of three-argumented `String#[]=`. + * + * @param[out] dst Target string to update. + * @param[in] beg Offset of the affected portion. + * @param[in] len Length of the affected portion. + * @param[in] src Object to be assigned. + * @exception rb_eTypeError `src` has no implicit conversion to String. + * @exception rb_eIndexError `len` is negative, or `beg` is OOB. + * @exception rb_eRuntimeError `dst` is `locktmp`-ed. + * @exception rb_eFrozenError `dst` is frozen. + * @note Unlike rb_str_substr(), this function raises. + * @post A portion of `dst` from `beg` to `len` is the stringised + * representation of `src`. If that replacement string is not the + * same length as the portion it is replacing, `dst` will be + * resized accordingly. + */ +void rb_str_update(VALUE dst, long beg, long len, VALUE src); + +/** + * Replaces the contents of the former object with the stringised contents of + * the latter. + * + * @param[out] dst Destination object. + * @param[in] src Source object. + * @exception rb_eTypeError `src` has no implicit conversion to String. + * @exception rb_eRuntimeError `dst` is `locktmp`-ed. + * @exception rb_eFrozenError `dst` is frozen. + * @return The passed `dst`. + * @pre `dst` must not be any arbitrary object except ::RString. + * @post `dst`'s former components are abandoned. It now has the + * identical encoding, length, and contents to `src`. + */ +VALUE rb_str_replace(VALUE dst, VALUE src); + +/** + * Generates a "readable" version of the receiver. + * + * @warning The output is _insecure_. Never feed one to `eval`. + * @warning The output is not always in the same encoding as the given one. + * @warning A character might or might not be escaped, depending on the + * result encoding. + * @param[in] str String to inspect. + * @return Its inspection, either in default internal encoding if any, or + * in default external encoding otherwise. + * @see rb_str_dump() + * + * @internal + * + * This is a (silent) fix of an actual vulnerability feeding `inspect` output + * strings to `eval`: + * https://github.com/hiki/hiki/commit/8771a6e25198e264a2bf9dc1c102fea2cc8ff975 + * + * ... and its advisory: + * http://hikiwiki.org/en/advisory20040712.html + */ +VALUE rb_str_inspect(VALUE str); + +/** + * "Inverse" of rb_eval_string(). Returns a quoted version of the string. All + * non-printing characters are replaced by `\uNNNN` or `\xHH` notation and all + * special characters are escaped. The result string is guaranteed to render a + * string of the same contents when passed to `eval` and friends. + * + * @param[in] str String to dump. + * @exception rb_eRuntimeError Too many escape sequences causes integer + * overflow on the length of the string. + * @return An US-ASCII string that includes all the necessary info to + * reconstruct the original string. + */ +VALUE rb_str_dump(VALUE str); + +/** + * Divides the given string based on the given delimiter. This is the + * 1-argument 0-block version of `String#split`. + * + * @param[in] str Object in question to split. + * @param[in] delim Delimiter, in C string. + * @exception rb_eTypeError `str` has no implicit conversion to String. + * @exception rb_eArgError `delim` is a null pointer. + * @return An array of strings, which are substrings of the passed `str`. + * If `delim` is an empty C string (i.e. `""`), `str` is split into + * each characters. If `delim` is a C string whose sole content is + * a whitespace (i.e. `" "`), `str` is split on whitespaces, with + * leading and trailing whitespace and runs of contiguous + * whitespace characters ignored. Otherwise, `str` is split + * according to `delim`. + */ +VALUE rb_str_split(VALUE str, const char *delim); + +/** + * This is a ::rb_gvar_setter_t that refutes non-string assignments. + * + * @exception rb_eTypeError Passed something non-string. + */ +rb_gvar_setter_t rb_str_setter; + +/* symbol.c */ + +/** + * Identical to rb_to_symbol(), except it assumes the receiver being an + * instance of ::RString. + * + * @param[in] str The name of the id. + * @exception rb_eRuntimeError Too many symbols. + * @return A (possibly new) id whose value is the given `str`. + * @pre `str` must not be any arbitrary object except ::RString. + * @note These days Ruby internally has two kinds of symbols + * (static/dynamic). Symbols created using this function would + * become dynamic ones; i.e. would be garbage collected. It could + * be safer for you to use it than alternatives, when applicable. + */ +VALUE rb_str_intern(VALUE str); + +/* string.c */ + +/** + * This is an rb_sym2str() + rb_str_dup() combo. + * + * @param[in] sym A symbol to query. + * @return A string duplicating the symbol's backend storage. + * + * @internal + * + * This function causes SEGV when the passed value is a static symbol that + * doesn't exist. + */ +VALUE rb_sym_to_s(VALUE sym); + +/** + * Counts the number of characters (not bytes) that are stored inside of the + * given string. This of course depends on its encoding. Also this function + * generally runs in O(n), because for instance you have to scan the entire + * string to know how many characters are there in a UTF-8 string. + * + * @param[in] str Target string to query. + * @return Its number of characters. + */ +long rb_str_strlen(VALUE str); + +/** + * Identical to rb_str_strlen(), except it returns the value in ::rb_cInteger. + * + * @param[in] str Target string to query. + * @return Its number of characters. + */ +VALUE rb_str_length(VALUE); + +/** + * "Inverse" of rb_str_sublen(). This function scans the contents to find the + * byte index that matches the character index. Generally speaking this is an + * `O(n)` operation. Could be slow. + * + * @param[in] str The string to scan. + * @param[in] pos Offset, in characters. + * @return Offset, in bytes. + */ +long rb_str_offset(VALUE str, long pos); + +RBIMPL_ATTR_PURE() +/** + * Queries the capacity of the given string. + * + * @see ::RString::capa + * @param[in] str String in question. + * @return Its capacity. + */ +size_t rb_str_capacity(VALUE str); + +/** + * Shortens `str` and adds three dots, an ellipsis, if it is longer than `len` + * characters. The length of the returned string in characters is less than or + * equal to `len`. If the length of `str` is less than or equal `len`, returns + * `str` itself. The encoding of returned string is equal to that of passed + * one. The class of returned string is equal to that of passed one. + * + * @param[in] str The string to shorten. + * @param[in] len The maximum string length. + * @exception rb_eIndexError `len` is negative. + * @retval str No need to add ellipsis. + * @retval otherwise A new, shortened string. + * @note The length is counted in characters. + */ +VALUE rb_str_ellipsize(VALUE str, long len); + +/** + * "Cleanses" the string. A string has its encoding and its contents. They, + * in practice, do not always fit. There are strings in the wild that are + * "broken"; include bit patterns that are not allowed by its encoding. That + * can happen when a user copy&pasted something bad, network input got + * clobbered by a middleman, cosmic rays hit the physical memory, and many more + * occasions. This function takes such strings, and fills the "broken" portion + * with the passed replacement bit pattern. + * + * This function also takes a ruby block. That is a neat way to do things, but + * can be annoying when the caller function want to use a block for another + * purpose. + * + * @param[in] str Target string to scrub. + * @param[in] repl Replacement string. When it is a string, + * this function takes that as a replacement. + * When it is ::RUBY_Qnil, this function tries + * to yield a block (if any) and takes its + * evaluated value as a replacement. In case + * of ::RUBY_Qnil without a block, this + * function takes an encoding-specific default + * character (`U+FFFD`, for instance) as a last + * resort. + * @exception rb_eTypeError `repl` is neither string nor nil. + * @exception rb_eArgError `repl` itself is broken. + * @exception rb_eEncCompatError `repl` and `str` are incompatible. + * @retval RUBY_Qnil `str` is already clean. + * @retval otherwise A new, clean string. + */ +VALUE rb_str_scrub(VALUE str, VALUE repl); + +/** + * Searches for the "successor" of a string. This function is complicated! + * This is the only function in the entire ruby API (either C or Ruby) that + * generates a string out of thin air. First, the successor to an empty string + * is a new empty string: + * + * ```ruby + * ''.succ # => "" + * ``` + * + * Otherwise the successor is calculated by "incrementing" characters. The + * first character to be incremented is the rightmost alphanumeric: or, if no + * alphanumerics, the rightmost character: + * + * ```ruby + * 'THX1138'.succ # => "THX1139" + * '<>'.succ # => "<>" + * '***'.succ # => '**+' + * ``` + * + * The successor to a digit is another digit, "carrying" to the next-left + * character for a "rollover" from 9 to 0, and prepending another digit if + * necessary: + * + * ```ruby + * '00'.succ # => "01" + * '09'.succ # => "10" + * '99'.succ # => "100" + * '-9'.succ # => "-10" + * ``` + * + * The successor to a letter is another letter of the same case, carrying to + * the next-left character for a rollover, and prepending another same-case + * letter if necessary: + * + * ```ruby + * 'aa'.succ # => "ab" + * 'az'.succ # => "ba" + * 'zz'.succ # => "aaa" + * 'AA'.succ # => "AB" + * 'AZ'.succ # => "BA" + * 'ZZ'.succ # => "AAA" + * ``` + * + * The successor to a non-alphanumeric character is the next character in the + * underlying character set's collating sequence, carrying to the next-left + * character for a rollover, and prepending another character if necessary: + * + * ```ruby + * s = "\u03A1" + * s.succ # => "\u03A3" # There is no such thing like \u03A2. + * s = 255.chr * 3 + * s # => "\xFF\xFF\xFF" + * s.succ # => "\x01\x00\x00\x00" + * ``` + * + * Carrying can occur between and among mixtures of alphanumeric characters: + * + * ```ruby + * s = 'zz99zz99' + * s.succ # => "aaa00aa00" + * s = '99zz99zz' + * s.succ # => "100aa00aa" + * s = '1.9.9' + * s.succ # => "2.0.0" + * ``` + * + * @param[in] orig Predecessor string. + * @return Successor string. + */ +VALUE rb_str_succ(VALUE orig); + +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail. Don't bother. + * + * @param[in] str A C string. + * @return `strlen`, casted to `long`. + */ +static inline long +rbimpl_strlen(const char *str) +{ + return RBIMPL_CAST((long)strlen(str)); +} + +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail. Don't bother. + * + * @param[in] str A C string literal. + * @return Corresponding Ruby string. + */ +static inline VALUE +rbimpl_str_new_cstr(const char *str) +{ + long len = rbimpl_strlen(str); + return rb_str_new_static(str, len); +} + +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail. Don't bother. + * + * @param[in] str A C string literal. + * @return Corresponding Ruby string. + */ +static inline VALUE +rbimpl_usascii_str_new_cstr(const char *str) +{ + long len = rbimpl_strlen(str); + return rb_usascii_str_new_static(str, len); +} + +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail. Don't bother. + * + * @param[in] str A C string literal. + * @return Corresponding Ruby string. + */ +static inline VALUE +rbimpl_utf8_str_new_cstr(const char *str) +{ + long len = rbimpl_strlen(str); + return rb_utf8_str_new_static(str, len); +} + +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail. Don't bother. + * + * @param[in] str A C string literal. + * @return Corresponding Ruby string. + */ +static inline VALUE +rbimpl_external_str_new_cstr(const char *str) +{ + long len = rbimpl_strlen(str); + return rb_external_str_new(str, len); +} + +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail. Don't bother. + * + * @param[in] str A C string literal. + * @return Corresponding Ruby string. + */ +static inline VALUE +rbimpl_locale_str_new_cstr(const char *str) +{ + long len = rbimpl_strlen(str); + return rb_locale_str_new(str, len); +} + +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail. Don't bother. + * + * @param[in] str A C string literal. + * @return Corresponding Ruby string. + */ +static inline VALUE +rbimpl_str_buf_new_cstr(const char *str) +{ + long len = rbimpl_strlen(str); + VALUE buf = rb_str_buf_new(len); + return rb_str_buf_cat(buf, str, len); +} + +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail. Don't bother. + * + * @param[out] buf A string buffer. + * @param[in] str A C string literal. + * @return `buf` itself. + */ +static inline VALUE +rbimpl_str_cat_cstr(VALUE buf, const char *str) +{ + long len = rbimpl_strlen(str); + return rb_str_cat(buf, str, len); +} + +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail. Don't bother. + * + * @param[in] exc An exception class. + * @param[in] str A C string literal. + * @return An instance of `exc`. + */ +static inline VALUE +rbimpl_exc_new_cstr(VALUE exc, const char *str) +{ + long len = rbimpl_strlen(str); + return rb_exc_new(exc, str, len); +} + +/** + * Allocates an instance of ::rb_cString. + * + * @param[in] str A memory region of `len` bytes length. + * @param[in] len Length of `ptr`, in bytes, not including the + * terminating NUL character. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString, of `len` bytes length, of + * "binary" encoding, whose contents are verbatim copy of `str`. + * @pre At least `len` bytes of continuous memory region shall be + * accessible via `str`. + */ +#define rb_str_new(str, len) \ + ((RBIMPL_CONSTANT_P(str) && \ + RBIMPL_CONSTANT_P(len) ? \ + rb_str_new_static : \ + rb_str_new) ((str), (len))) + +/** + * Identical to #rb_str_new, except it assumes the passed pointer is a pointer + * to a C string. + * + * @param[in] str A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString, of "binary" encoding, whose + * contents are verbatim copy of `str`. + * @pre `str` must not be a null pointer. + */ +#define rb_str_new_cstr(str) \ + ((RBIMPL_CONSTANT_P(str) ? \ + rbimpl_str_new_cstr : \ + rb_str_new_cstr) (str)) + +/** + * Identical to #rb_str_new, except it generates a string of "US ASCII" + * encoding. This is different from rb_external_str_new(), not only for the + * output encoding, but also it doesn't convert the contents. + * + * @param[in] str A memory region of `len` bytes length. + * @param[in] len Length of `str`, in bytes, not including the + * terminating NUL character. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString, of `len` bytes length, of + * "US ASCII" encoding, whose contents are verbatim copy of `str`. + */ +#define rb_usascii_str_new(str, len) \ + ((RBIMPL_CONSTANT_P(str) && \ + RBIMPL_CONSTANT_P(len) ? \ + rb_usascii_str_new_static : \ + rb_usascii_str_new) ((str), (len))) + +/** + * Identical to #rb_str_new, except it generates a string of "UTF-8" encoding. + * + * @param[in] str A memory region of `len` bytes length. + * @param[in] len Length of `str`, in bytes, not including the + * terminating NUL character. + * @exception rb_eNoMemError Failed to allocate `len+1` bytes. + * @exception rb_eArgError `len` is negative. + * @return An instance of ::rb_cString, of `len` bytes length, of + * "UTF-8" encoding, whose contents are verbatim copy of `str`. + */ +#define rb_utf8_str_new(str, len) \ + ((RBIMPL_CONSTANT_P(str) && \ + RBIMPL_CONSTANT_P(len) ? \ + rb_utf8_str_new_static : \ + rb_utf8_str_new) ((str), (len))) + +/** + * Identical to #rb_str_new_cstr, except it generates a string of "US ASCII" + * encoding. It can also be seen as a routine Identical to + * #rb_usascii_str_new, except it assumes the passed pointer is a pointer to a + * C string. + * + * @param[in] str A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString, of "US ASCII" encoding, whose + * contents are verbatim copy of `str`. + * @pre `str` must not be a null pointer. + */ +#define rb_usascii_str_new_cstr(str) \ + ((RBIMPL_CONSTANT_P(str) ? \ + rbimpl_usascii_str_new_cstr : \ + rb_usascii_str_new_cstr) (str)) + +/** + * Identical to #rb_str_new_cstr, except it generates a string of "UTF-8" + * encoding. It can also be seen as a routine Identical to #rb_utf8_str_new, + * except it assumes the passed pointer is a pointer to a C string. + * + * @param[in] str A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString, of "UTF-8" encoding, whose contents + * are verbatim copy of `str`. + * @pre `str` must not be a null pointer. + */ +#define rb_utf8_str_new_cstr(str) \ + ((RBIMPL_CONSTANT_P(str) ? \ + rbimpl_utf8_str_new_cstr : \ + rb_utf8_str_new_cstr) (str)) + +/** + * Identical to #rb_str_new_cstr, except it generates a string of "default + * external" encoding. + * + * @param[in] str A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString. In case encoding conversion from + * "default internal" to "default external" is fully defined over + * the given contents, then the return value is a string of + * "default external" encoding, whose contents are the converted + * ones. Otherwise the string is a junk. + * @warning It doesn't raise on a conversion failure and silently ends up in + * a corrupted output. You can know the failure by querying + * `valid_encoding?` of the result object. + * @pre `str` must not be a null pointer. + */ +#define rb_external_str_new_cstr(str) \ + ((RBIMPL_CONSTANT_P(str) ? \ + rbimpl_external_str_new_cstr : \ + rb_external_str_new_cstr) (str)) + +/** + * Identical to #rb_external_str_new_cstr, except it generates a string of + * "locale" encoding instead of "default external". + * + * @param[in] str A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString. In case encoding conversion from + * "default internal" to "locale" is fully defined over the given + * contents, then the return value is a string of "locale" + * encoding, whose contents are the converted ones. Otherwise the + * string is a junk. + * @warning It doesn't raise on a conversion failure and silently ends up in + * a corrupted output. You can know the failure by querying + * `valid_encoding?` of the result object. + * @pre `str` must not be a null pointer. + */ +#define rb_locale_str_new_cstr(str) \ + ((RBIMPL_CONSTANT_P(str) ? \ + rbimpl_locale_str_new_cstr : \ + rb_locale_str_new_cstr) (str)) + +/** + * Identical to #rb_str_new_cstr, except done differently. + * + * @param[in] str A C string. + * @exception rb_eNoMemError Failed to allocate memory. + * @return An instance of ::rb_cString, of "binary" encoding, whose + * contents are verbatim copy of `str`. + * @pre `str` must not be a null pointer. + */ +#define rb_str_buf_new_cstr(str) \ + ((RBIMPL_CONSTANT_P(str) ? \ + rbimpl_str_buf_new_cstr : \ + rb_str_buf_new_cstr) (str)) + +/** + * Identical to rb_str_cat(), except it assumes the passed pointer is a pointer + * to a C string. + * + * @param[out] buf Destination object. + * @param[in] str Contents to append. + * @exception rb_eArgError Result string too big. + * @return The passed `buf`. + * @pre `buf` must not be any arbitrary objects except ::RString. + * @pre `str` must not be a null pointer. + * @post `buf` has the contents of `str` appended. + */ +#define rb_str_cat_cstr(buf, str) \ + ((RBIMPL_CONSTANT_P(str) ? \ + rbimpl_str_cat_cstr : \ + rb_str_cat_cstr) ((buf), (str))) + +/** + * Identical to rb_exc_new(), except it assumes the passed pointer is a pointer + * to a C string. + * + * @param[out] exc A subclass of ::rb_eException. + * @param[in] str Message to raise. + * @return An instance of `exc` whose message is `str`. + * @pre `str` must not be a null pointer. + */ +#define rb_exc_new_cstr(exc, str) \ + ((RBIMPL_CONSTANT_P(str) ? \ + rbimpl_exc_new_cstr : \ + rb_exc_new_cstr) ((exc), (str))) + +#define rb_str_new2 rb_str_new_cstr /**< @old{rb_str_new_cstr} */ +#define rb_str_new3 rb_str_new_shared /**< @old{rb_str_new_shared} */ +#define rb_str_new4 rb_str_new_frozen /**< @old{rb_str_new_frozen} */ +#define rb_str_new5 rb_str_new_with_class /**< @old{rb_str_new_with_class} */ +#define rb_str_buf_new2 rb_str_buf_new_cstr /**< @old{rb_str_buf_new_cstr} */ +#define rb_usascii_str_new2 rb_usascii_str_new_cstr /**< @old{rb_usascii_str_new_cstr} */ +#define rb_str_buf_cat rb_str_cat /**< @alias{rb_str_cat} */ +#define rb_str_buf_cat2 rb_str_cat_cstr /**< @old{rb_usascii_str_new_cstr} */ +#define rb_str_cat2 rb_str_cat_cstr /**< @old{rb_str_cat_cstr} */ + +/** + * Length of a string literal. + * + * @param[in] str A C String literal. + * @return An integer constant expression that represents `str`'s length, + * in bytes, not including the terminating NUL character. + */ +#define rb_strlen_lit(str) (sizeof(str "") - 1) + +/** + * Identical to rb_str_new_static(), except it cannot take string variables. + * + * @param[in] str A C string literal. + * @pre `str` must not be a variable. + * @return An instance of ::rb_cString, of "binary" encoding, whose backend + * storage is the passed C string literal. + * @warning It is a very bad idea to write to a C string literal (often + * immediate SEGV shall occur). Consider return values of this + * function be read-only. + */ +#define rb_str_new_lit(str) rb_str_new_static((str), rb_strlen_lit(str)) + +/** + * Identical to rb_usascii_str_new_static(), except it cannot take string + * variables. + * + * @param[in] str A C string literal. + * @pre `str` must not be a variable. + * @return An instance of ::rb_cString, of "US ASCII" encoding, whose + * backend storage is the passed C string literal. + * @warning It is a very bad idea to write to a C string literal (often + * immediate SEGV shall occur). Consider return values of this + * function be read-only. + */ +#define rb_usascii_str_new_lit(str) rb_usascii_str_new_static((str), rb_strlen_lit(str)) + +/** + * Identical to rb_utf8_str_new_static(), except it cannot take string + * variables. + * + * @param[in] str A C string literal. + * @pre `str` must not be a variable. + * @return An instance of ::rb_cString, of "UTF-8" encoding, whose backend + * storage is the passed C string literal. + * @warning It is a very bad idea to write to a C string literal (often + * immediate SEGV shall occur). Consider return values of this + * function be read-only. + */ +#define rb_utf8_str_new_lit(str) rb_utf8_str_new_static((str), rb_strlen_lit(str)) + +/** + * Identical to rb_enc_str_new_static(), except it cannot take string + * variables. + * + * @param[in] str A C string literal. + * @param[in] enc A pointer to an encoding. + * @pre `str` must not be a variable. + * @return An instance of ::rb_cString, of the passed encoding, whose + * backend storage is the passed C string literal. + * @warning It is a very bad idea to write to a C string literal (often + * immediate SEGV shall occur). Consider return values of this + * function be read-only. + */ +#define rb_enc_str_new_lit(str, enc) rb_enc_str_new_static((str), rb_strlen_lit(str), (enc)) + +#define rb_str_new_literal(str) rb_str_new_lit(str) /**< @alias{rb_str_new_lit} */ +#define rb_usascii_str_new_literal(str) rb_usascii_str_new_lit(str) /**< @alias{rb_usascii_str_new_lit} */ +#define rb_utf8_str_new_literal(str) rb_utf8_str_new_lit(str) /**< @alias{rb_utf8_str_new_lit} */ +#define rb_enc_str_new_literal(str, enc) rb_enc_str_new_lit(str, enc) /**< @alias{rb_enc_str_new_lit} */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_STRING_H */ diff --git a/libs/libruby/ruby/internal/intern/struct.h b/libs/libruby/ruby/internal/intern/struct.h new file mode 100644 index 0000000..312cf44 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/struct.h @@ -0,0 +1,203 @@ +#ifndef RBIMPL_INTERN_STRUCT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_STRUCT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cStruct. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/intern/vm.h" /* rb_alloc_func_t */ +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* struct.c */ + +/** + * Creates an instance of the given struct. + * + * @param[in] klass The class of the instance to allocate. + * @param[in] ... The fields. + * @return Allocated instance of `klass`. + * @pre `klass` must be a subclass of ::rb_cStruct. + * @note Number of variadic arguments must much that of the passed klass' + * fields. + */ +VALUE rb_struct_new(VALUE klass, ...); + +/** + * Defines a struct class. + * + * @param[in] name Name of the class. + * @param[in] ... Arbitrary number of `const char*`, terminated by + * zero. Each of which are the name of fields. + * @exception rb_eNameError `name` is not a constant name. + * @exception rb_eTypeError `name` is already taken. + * @exception rb_eArgError Duplicated field name. + * @return The defined class. + * @post Global toplevel constant `name` is defined. + * @note `name` is allowed to be a null pointer. This function creates + * an anonymous struct class then. + * + * @internal + * + * Not seriously checked but it seems this function does not share its + * implementation with how `Struct.new` is implemented...? + */ +VALUE rb_struct_define(const char *name, ...); + +RBIMPL_ATTR_NONNULL((2)) +/** + * Identical to rb_struct_define(), except it defines the class under the + * specified namespace instead of global toplevel. + * + * @param[out] space Namespace that the defining class shall reside. + * @param[in] name Name of the class. + * @param[in] ... Arbitrary number of `const char*`, terminated by + * zero. Each of which are the name of fields. + * @exception rb_eNameError `name` is not a constant name. + * @exception rb_eTypeError `name` is already taken. + * @exception rb_eArgError Duplicated field name. + * @return The defined class. + * @post `name` is a constant under `space`. + * @note In contrast to rb_struct_define(), it doesn't make any sense to + * pass a null pointer to this function. + */ +VALUE rb_struct_define_under(VALUE space, const char *name, ...); + +/** + * Identical to rb_struct_new(), except it takes the field values as a Ruby + * array. + * + * @param[in] klass The class of the instance to allocate. + * @param[in] values Field values. + * @return Allocated instance of `klass`. + * @pre `klass` must be a subclass of ::rb_cStruct. + * @pre `values` must be an instance of struct ::RArray. + */ +VALUE rb_struct_alloc(VALUE klass, VALUE values); + +/** + * Mass-assigns a struct's fields. + * + * @param[out] self An instance of a struct class to squash. + * @param[in] values New values. + * @return ::RUBY_Qnil. + */ +VALUE rb_struct_initialize(VALUE self, VALUE values); + +/** + * Identical to rb_struct_aref(), except it takes ::ID instead of ::VALUE. + * + * @param[in] self An instance of a struct class. + * @param[in] key Key to query. + * @exception rb_eTypeError `self` is not a struct. + * @exception rb_eNameError No such field. + * @return The value stored at `key` in `self`. + */ +VALUE rb_struct_getmember(VALUE self, ID key); + +/** + * Queries the list of the names of the fields of the given struct class. + * + * @param[in] klass A subclass of ::rb_cStruct. + * @return The list of the names of the fields of `klass`. + */ +VALUE rb_struct_s_members(VALUE klass); + +/** + * Queries the list of the names of the fields of the class of the given struct + * object. This is almost the same as calling rb_struct_s_members() over the + * class of the receiver. + * + * @internal + * + * "Almost"? What exactly is the difference? + * + * @endinternal + * + * @param[in] self An instance of a subclass of ::rb_cStruct. + * @return The list of the names of the fields. + */ +VALUE rb_struct_members(VALUE self); + +/** + * Allocates an instance of the given class. This consequential name is of + * course because rb_struct_alloc() not only allocates but also initialises an + * instance. The API design is broken. + * + * @param[in] klass A subclass of ::rb_cStruct. + * @return An allocated instance of `klass`, not initialised. + */ +VALUE rb_struct_alloc_noinit(VALUE klass); + +/** + * Identical to rb_struct_define(), except it does not define accessor methods. + * You have to define them yourself. Forget about the allocator function + * parameter; it is for internal use only. Extension libraries are unable to + * properly allocate a ruby struct, because `RStruct` is opaque. + * + * @internal + * + * Several flags must be set up properly for ::RUBY_T_STRUCT objects, which are + * also missing for extension libraries. + * + * @endinternal + * + * @param[in] name Name of the class. + * @param[in] super Superclass of the defining class. + * @param[in] func Must be 0 for extension libraries. + * @param[in] ... Arbitrary number of `const char*`, terminated by + * zero. Each of which are the name of fields. + * @exception rb_eNameError `name` is not a constant name. + * @exception rb_eTypeError `name` is already taken. + * @exception rb_eArgError Duplicated field name. + * @return The defined class. + * @post Global toplevel constant `name` is defined. + * @note `name` is allowed to be a null pointer. This function creates + * an anonymous struct class then. + */ +VALUE rb_struct_define_without_accessor(const char *name, VALUE super, rb_alloc_func_t func, ...); + +RBIMPL_ATTR_NONNULL((2)) +/** + * Identical to rb_struct_define_without_accessor(), except it defines the + * class under the specified namespace instead of global toplevel. It can also + * be seen as a routine identical to rb_struct_define_under(), except it does + * not define accessor methods. + * + * @param[out] outer Namespace that the defining class shall reside. + * @param[in] class_name Name of the class. + * @param[in] super Superclass of the defining class. + * @param[in] alloc Must be 0 for extension libraries. + * @param[in] ... Arbitrary number of `const char*`, terminated by + * zero. Each of which are the name of fields. + * @exception rb_eNameError `class_name` is not a constant name. + * @exception rb_eTypeError `class_name` is already taken. + * @exception rb_eArgError Duplicated field name. + * @return The defined class. + * @post `class_name` is a constant under `outer`. + * @note In contrast to rb_struct_define_without_accessor(), it doesn't + * make any sense to pass a null name. + */ +VALUE rb_struct_define_without_accessor_under(VALUE outer, const char *class_name, VALUE super, rb_alloc_func_t alloc, ...); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_STRUCT_H */ diff --git a/libs/libruby/ruby/internal/intern/thread.h b/libs/libruby/ruby/internal/intern/thread.h new file mode 100644 index 0000000..716375a --- /dev/null +++ b/libs/libruby/ruby/internal/intern/thread.h @@ -0,0 +1,492 @@ +#ifndef RBIMPL_INTERN_THREAD_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_THREAD_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cThread. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/config.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +struct timeval; + +/* thread.c */ + +/** + * Tries to switch to another thread. This function blocks until the current + * thread re-acquires the GVL. + * + * @exception rb_eInterrupt Operation interrupted. + */ +void rb_thread_schedule(void); + +/** + * Blocks the current thread until the given file descriptor is ready to be + * read. + * + * @param[in] fd A file descriptor. + * @exception rb_eIOError Closed stream. + * @exception rb_eSystemCallError Situations like EBADF. + */ +int rb_thread_wait_fd(int fd); + +/** + * Identical to rb_thread_wait_fd(), except it blocks the current thread until + * the given file descriptor is ready to be written. + * + * @param[in] fd A file descriptor. + * @exception rb_eIOError Closed stream. + * @exception rb_eSystemCallError Situations like EBADF. + */ +int rb_thread_fd_writable(int fd); + +/** + * Notifies a closing of a file descriptor to other threads. Multiple threads + * can wait for the given file descriptor at once. If such file descriptor is + * closed, threads need to start propagating their exceptions. This is the API + * to kick that process. + * + * @param[in] fd A file descriptor. + * @note This function blocks until all the threads waiting for such fd + * have woken up. + */ +void rb_thread_fd_close(int fd); + +/** + * Checks if the thread this function is running is the only thread that is + * currently alive. + * + * @retval 1 Yes it is. + * @retval 0 No it isn't. + * + * @internal + * + * Above description is in fact inaccurate. There are Ractors these days. + */ +int rb_thread_alone(void); + +/** + * Blocks for the given period of time. + * + * @warning This function can be interrupted by signals. + * @param[in] sec Duration in seconds. + * @exception rb_eInterrupt Interrupted. + */ +void rb_thread_sleep(int sec); + +/** + * Blocks indefinitely. + * + * @exception rb_eInterrupt Interrupted. + */ +void rb_thread_sleep_forever(void); + +/** + * Identical to rb_thread_sleep_forever(), except the thread calling this + * function is considered "dead" when our deadlock checker is triggered. + * + * @exception rb_eInterrupt Interrupted. + */ +void rb_thread_sleep_deadly(void); + +/** + * Stops the current thread. This is not the end of the thread's lifecycle. A + * stopped thread can later be woken up. + * + * @exception rb_eThreadError Stopping this thread would deadlock. + * @retval ::RUBY_Qnil Always. + * + * @internal + * + * The return value makes no sense at all. + */ +VALUE rb_thread_stop(void); + +/** + * Marks a given thread as eligible for scheduling. + * + * @note It may still remain blocked on I/O. + * @note This does not invoke the scheduler itself. + * + * @param[out] thread Thread in question to wake up. + * @exception rb_eThreadError Stop flogging a dead horse. + * @return The passed thread. + * @post The passed thread is made runnable. + */ +VALUE rb_thread_wakeup(VALUE thread); + +/** + * Identical to rb_thread_wakeup(), except it doesn't raise on an already + * killed thread. + * + * @param[out] thread A thread to wake up. + * @retval RUBY_Qnil `thread` is already killed. + * @retval otherwise `thread` is alive. + * @post The passed thread is made runnable, unless killed. + */ +VALUE rb_thread_wakeup_alive(VALUE thread); + +/** + * This is a rb_thread_wakeup() + rb_thread_schedule() combo. + * + * @note There is no guarantee that this function yields to the passed + * thread. It may still remain blocked on I/O. + * @param[out] thread Thread in question to wake up. + * @exception rb_eThreadError Stop flogging a dead horse. + * @return The passed thread. + */ +VALUE rb_thread_run(VALUE thread); + +/** + * Terminates the given thread. Unlike a stopped thread, a killed thread could + * never be revived. This function does return, when passed e.g. an already + * killed thread. But if the passed thread is the only one, or a special + * thread called "main", then it also terminates the entire process. + * + * @param[out] thread The thread to terminate. + * @exception rb_eFatal The passed thread is the running thread. + * @exception rb_eSystemExit The passed thread is the last thread. + * @return The passed thread. + * @post Either the passed thread, or the process entirely, is killed. + * + * @internal + * + * It seems killing the main thread also kills the entire process even if there + * are multiple running ractors. No idea why. + */ +VALUE rb_thread_kill(VALUE thread); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Creates a Ruby thread that is backended by a C function. + * + * @param[in] f The function to run on a thread. + * @param[in,out] g Passed through to `f`. + * @exception rb_eThreadError Could not create a ruby thread. + * @exception rb_eSystemCallError Situations like `EPERM`. + * @return Allocated instance of ::rb_cThread. + * @note This doesn't wait for anything. + */ +VALUE rb_thread_create(VALUE (*f)(void *g), void *g); + +/** + * Identical to rb_thread_sleep(), except it takes struct `timeval` instead. + * + * @warning This function can be interrupted by signals. + * @param[in] time Duration. + * @exception rb_eInterrupt Interrupted. + */ +void rb_thread_wait_for(struct timeval time); + +/** + * Obtains the "current" thread. + * + * @return The current thread of the current ractor of the current execution + * context. + * @pre This function must be called from a thread controlled by ruby. + */ +VALUE rb_thread_current(void); + +/** + * Obtains the "main" thread. There are threads called main. Historically the + * (only) main thread was the one which runs when the process boots. Now that + * we have Ractor, there are more than one main threads. + * + * @return The main thread of the current ractor of the current execution + * context. + * @pre This function must be called from a thread controlled by ruby. + */ +VALUE rb_thread_main(void); + +/** + * This badly named function reads from a Fiber local storage. When this + * function was born there was no such thing like a Fiber. The world was + * innocent. But now... This is a Fiber local storage. Sorry. + * + * @param[in] thread Thread that the target Fiber is running. + * @param[in] key The name of the Fiber local storage to read. + * @retval RUBY_Qnil No such storage. + * @retval otherwise The value stored at `key`. + * @note There in fact are "true" thread local storage, but Ruby doesn't + * provide any interface of them to you, C programmers. + */ +VALUE rb_thread_local_aref(VALUE thread, ID key); + +/** + * This badly named function writes to a Fiber local storage. When this + * function was born there was no such thing like a Fiber. The world was + * innocent. But now... This is a Fiber local storage. Sorry. + * + * @param[in] thread Thread that the target Fiber is running. + * @param[in] key The name of the Fiber local storage to write. + * @param[in] val The new value of the storage. + * @exception rb_eFrozenError `thread` is frozen. + * @return The passed `val` as-is. + * @post Fiber local storage `key` has value of `val`. + * @note There in fact are "true" thread local storage, but Ruby doesn't + * provide any interface of them to you, C programmers. + */ +VALUE rb_thread_local_aset(VALUE thread, ID key, VALUE val); + +/** + * A `pthread_atfork(3posix)`-like API. Ruby expects its child processes to + * call this function at the very beginning of their processes. If you plan to + * fork a process don't forget to call it. + */ +void rb_thread_atfork(void); + +/** + * :FIXME: situation of this function is unclear. It seems nobody uses it. + * Maybe a good idea to KonMari. + */ +void rb_thread_atfork_before_exec(void); + +/** + * "Recursion" API entry point. This basically calls the given function with + * the given arguments, but additionally with recursion flag. The flag is set + * to 1 if the execution have already experienced the passed `g` parameter + * before. + * + * @param[in] f The function that possibly recurs. + * @param[in,out] g Passed as-is to `f`. + * @param[in,out] h Passed as-is to `f`. + * @return The return value of f. + */ +VALUE rb_exec_recursive(VALUE (*f)(VALUE g, VALUE h, int r), VALUE g, VALUE h); + +/** + * Identical to rb_exec_recursive(), except it checks for the recursion on the + * ordered pair of `{ g, p }` instead of just `g`. + * + * @param[in] f The function that possibly recurs. + * @param[in,out] g Passed as-is to `f`. + * @param[in] p Paired object for recursion detection. + * @param[in,out] h Passed as-is to `f`. + */ +VALUE rb_exec_recursive_paired(VALUE (*f)(VALUE g, VALUE h, int r), VALUE g, VALUE p, VALUE h); + +/** + * Identical to rb_exec_recursive(), except it calls `f` for outermost + * recursion only. Inner recursions yield calls to rb_throw_obj(). + * + * @param[in] f The function that possibly recurs. + * @param[in,out] g Passed as-is to `f`. + * @param[in,out] h Passed as-is to `f`. + * @return The return value of f. + * + * @internal + * + * It seems nobody uses the "it calls rb_throw_obj()" part of this function. + * @shyouhei doesn't understand the needs. + */ +VALUE rb_exec_recursive_outer(VALUE (*f)(VALUE g, VALUE h, int r), VALUE g, VALUE h); + +/** + * Identical to rb_exec_recursive_outer(), except it checks for the recursion + * on the ordered pair of `{ g, p }` instead of just `g`. It can also be seen + * as a routine identical to rb_exec_recursive_paired(), except it calls `f` + * for outermost recursion only. Inner recursions yield calls to + * rb_throw_obj(). + * + * @param[in] f The function that possibly recurs. + * @param[in,out] g Passed as-is to `f`. + * @param[in] p Paired object for recursion detection. + * @param[in,out] h Passed as-is to `f`. + * + * @internal + * + * It seems nobody uses the "it calls rb_throw_obj()" part of this function. + * @shyouhei doesn't understand the needs. + */ +VALUE rb_exec_recursive_paired_outer(VALUE (*f)(VALUE g, VALUE h, int r), VALUE g, VALUE p, VALUE h); + +/** + * This is the type of UBFs. An UBF is a function that unblocks a blocking + * region. For instance when a thread is blocking due to `pselect(3posix)`, it + * is highly expected that `pthread_kill(3posix)` can interrupt the system call + * and the thread could revive. Or when a thread is blocking due to + * `waitpid(3posix)`, it is highly expected that killing the waited process + * should suffice. An UBF is a function that does such things. Designing your + * own UBF needs deep understanding of why your blocking region blocks, how + * threads work in ruby, and a matter of luck. It often is the case you simply + * cannot cancel something that had already begun. + * + * @see rb_thread_call_without_gvl() + */ +typedef void rb_unblock_function_t(void *); + +/** + * @private + * + * This is an implementation detail. Must be a mistake to be here. + * + * @internal + * + * Why is this function type different from what rb_thread_call_without_gvl() + * takes? + */ +typedef VALUE rb_blocking_function_t(void *); + +/** + * Checks for interrupts. In ruby, signals are masked by default. You can + * call this function at will to check if there are pending signals. In case + * there are, they would be handled in this function. + * + * If your extension library has a function that takes a long time, consider + * calling it periodically. + * + * @note It might switch to another thread. + */ +void rb_thread_check_ints(void); + +/** + * Checks if the thread's execution was recently interrupted. If called from + * that thread, this function can be used to detect spurious wake-ups. + * + * @param[in] thval Thread in question. + * @retval 0 The thread was not interrupted. + * @retval otherwise The thread was interrupted recently. + * + * @internal + * + * Above description is not a lie. But actually the return value is an opaque + * trap vector. If you know which bit means which, you can know what happened. + */ +int rb_thread_interrupted(VALUE thval); + +/** + * A special UBF for blocking IO operations. You need deep understanding of + * what this actually do before using. Basically you should not use it from + * extension libraries. It is too easy to mess up. + */ +#define RUBY_UBF_IO RBIMPL_CAST((rb_unblock_function_t *)-1) + +/** + * A special UBF for blocking process operations. You need deep understanding + * of what this actually do before using. Basically you should not use it from + * extension libraries. It is too easy to mess up. + */ +#define RUBY_UBF_PROCESS RBIMPL_CAST((rb_unblock_function_t *)-1) + +/* thread_sync.c */ + +/** + * Creates a mutex. + * + * @return An allocated instance of rb_cMutex. + */ +VALUE rb_mutex_new(void); + +/** + * Queries if there are any threads that holds the lock. + * + * @param[in] mutex The mutex in question. + * @retval RUBY_Qtrue The mutex is locked by someone. + * @retval RUBY_Qfalse The mutex is not locked by anyone. + */ +VALUE rb_mutex_locked_p(VALUE mutex); + +/** + * Attempts to lock the mutex, without waiting for other threads to unlock it. + * Failure in locking the mutex can be detected by the return value. + * + * @param[out] mutex The mutex to lock. + * @retval RUBY_Qtrue Successfully locked by the current thread. + * @retval RUBY_Qfalse Otherwise. + * @note This function also returns ::RUBY_Qfalse when the mutex is + * already owned by the calling thread itself. + */ +VALUE rb_mutex_trylock(VALUE mutex); + +/** + * Attempts to lock the mutex. It waits until the mutex gets available. + * + * @param[out] mutex The mutex to lock. + * @exception rb_eThreadError Recursive deadlock situation. + * @return The passed mutex. + * @post The mutex is owned by the current thread. + */ +VALUE rb_mutex_lock(VALUE mutex); + +/** + * Releases the mutex. + * + * @param[out] mutex The mutex to unlock. + * @exception rb_eThreadError The mutex is not owned by the current thread. + * @return The passed mutex. + * @post Upon successful return the passed mutex is no longer owned by + * the current thread. + */ +VALUE rb_mutex_unlock(VALUE mutex); + +/** + * Releases the lock held in the mutex and waits for the period of time; + * reacquires the lock on wakeup. + * + * @pre The lock has to be owned by the current thread beforehand. + * @param[out] self The target mutex. + * @param[in] timeout Duration, in seconds, in ::rb_cNumeric. + * @exception rb_eArgError `timeout` is negative. + * @exception rb_eRangeError `timeout` is out of range of `time_t`. + * @exception rb_eThreadError The mutex is not owned by the current thread. + * @return Number of seconds it actually slept. + * @warning It is a failure not to check the return value. This function + * can return spuriously for various reasons. Maybe other threads + * can rb_thread_wakeup(). Maybe an end user can press the + * Control and C key from the interactive console. On the other + * hand it can also take longer than the specified. The mutex + * could be locked by someone else. It waits then. + * @post Upon successful return the passed mutex is owned by the current + * thread. + * + * @internal + * + * This function is called from `ConditionVariable#wait`. So it is not a + * deprecated feature. However @shyouhei have never seen any similar mutex + * primitive available in any other languages than Ruby. + * + * EDIT: In 2021, @shyouhei asked @ko1 in person about this API. He answered + * that it is his invention. The motivation behind its design is to eliminate + * needs of condition variables as primitives. Unlike other languages, Ruby's + * `ConditionVariable` class was written in pure-Ruby initially. We don't have + * to implement machine-native condition variables in assembly each time we + * port Ruby to a new architecture. This function made it possible. "I felt I + * was a genius when this idea came to me", said @ko1. + * + * `rb_cConditionVariable` is now written in C for speed, though. + */ +VALUE rb_mutex_sleep(VALUE self, VALUE timeout); + +/** + * Obtains the lock, runs the passed function, and releases the lock when it + * completes. + * + * @param[out] mutex The mutex to lock. + * @param[in] func What to do during the mutex is locked. + * @param[in,out] arg Passed as-is to `func`. + */ +VALUE rb_mutex_synchronize(VALUE mutex, VALUE (*func)(VALUE arg), VALUE arg); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_THREAD_H */ diff --git a/libs/libruby/ruby/internal/intern/time.h b/libs/libruby/ruby/internal/intern/time.h new file mode 100644 index 0000000..df48286 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/time.h @@ -0,0 +1,161 @@ +#ifndef RBIMPL_INTERN_TIME_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_TIME_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to ::rb_cTime. + */ +#include "ruby/internal/config.h" + +#ifdef HAVE_TIME_H +# include /* for time_t */ +#endif + +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +struct timespec; +struct timeval; + +/* time.c */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Fills the current time into the given struct. + * + * @param[out] ts Return buffer. + * @exception rb_eSystemCallError Access denied for hardware clock. + * @post Current time is stored in `*ts`. + */ +void rb_timespec_now(struct timespec *ts); + +/** + * Creates an instance of ::rb_cTime with the given time and the local + * timezone. + * + * @param[in] sec Seconds since the UNIX epoch. + * @param[in] usec Subsecond part, in microseconds resolution. + * @exception rb_eRangeError Cannot express the time. + * @return An allocated instance of ::rb_cTime. + */ +VALUE rb_time_new(time_t sec, long usec); + +/** + * Identical to rb_time_new(), except it accepts the time in nanoseconds + * resolution. + * + * @param[in] sec Seconds since the UNIX epoch. + * @param[in] nsec Subsecond part, in nanoseconds resolution. + * @exception rb_eRangeError Cannot express the time. + * @return An allocated instance of ::rb_cTime. + */ +VALUE rb_time_nano_new(time_t sec, long nsec); + +RBIMPL_ATTR_NONNULL(()) +/** + * Creates an instance of ::rb_cTime, with given time and offset. + * + * @param[in] ts Time specifier. + * @param[in] offset Offset specifier, can take following values: + * - `INT_MAX`: `ts` is in local time. + * - `INT_MAX - 1`: `ts` is in UTC. + * - `-86400` to `86400`: fixed timezone. + * @exception rb_eArgError Malformed `offset`. + * @return An allocated instance of ::rb_cTime. + */ +VALUE rb_time_timespec_new(const struct timespec *ts, int offset); + +/** + * Identical to rb_time_timespec_new(), except it takes Ruby values instead of + * C structs. + * + * @param[in] timev Something numeric. Currently Integers, Rationals, + * and Floats are accepted. + * @param[in] off Offset specifier. As of 2.7 this argument is + * heavily extended to take following kinds of + * objects: + * - ::RUBY_Qundef ... means UTC. + * - ::rb_cString ... "+12:34" etc. + * - A mysterious "zone" object. This is largely + * undocumented. However the initial intent was + * that we want to accept + * `ActiveSupport::TimeZone` here. Other gems + * could also be possible... But how to make an + * acceptable class is beyond this document. + * @exception rb_eArgError Malformed `off`. + * @return An allocated instance of ::rb_cTime. + */ +VALUE rb_time_num_new(VALUE timev, VALUE off); + +/** + * Creates a "time interval". This basically converts an instance of + * ::rb_cNumeric into a struct `timeval`, but for instance negative time + * interval must not exist. + * + * @param[in] num An instance of ::rb_cNumeric. + * @exception rb_eArgError `num` is negative. + * @exception rb_eRangeError `num` is out of range of `timeval::tv_sec`. + * @return A struct that represents the identical time to `num`. + */ +struct timeval rb_time_interval(VALUE num); + +/** + * Converts an instance of rb_cTime to a struct timeval that represents the + * identical point of time. It can also take something numeric; would consider + * it as a UNIX time then. + * + * @param[in] time Instance of either ::rb_cTime or ::rb_cNumeric. + * @exception rb_eRangeError `time` is out of range of `timeval::tv_sec`. + * @return A struct that represents the identical time to `num`. + */ +struct timeval rb_time_timeval(VALUE time); + +/** + * Identical to rb_time_timeval(), except for return type. + * + * @param[in] time Instance of either ::rb_cTime or ::rb_cNumeric. + * @exception rb_eRangeError `time` is out of range of `timeval::tv_sec`. + * @return A struct that represents the identical time to `num`. + */ +struct timespec rb_time_timespec(VALUE time); + +/** + * Identical to rb_time_interval(), except for return type. + * + * @param[in] num An instance of ::rb_cNumeric. + * @exception rb_eArgError `num` is negative. + * @exception rb_eRangeError `num` is out of range of `timespec::tv_sec`. + * @return A struct that represents the identical time to `num`. + */ +struct timespec rb_time_timespec_interval(VALUE num); + +/** + * Queries the offset, in seconds between the time zone of the time and the + * UTC. + * + * @param[in] time An instance of ::rb_cTime. + * @return Numeric offset. + */ +VALUE rb_time_utc_offset(VALUE time); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_TIME_H */ diff --git a/libs/libruby/ruby/internal/intern/variable.h b/libs/libruby/ruby/internal/intern/variable.h new file mode 100644 index 0000000..479c395 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/variable.h @@ -0,0 +1,628 @@ +#ifndef RBIMPL_INTERN_VARIABLE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_VARIABLE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to names inside of a Ruby program. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/st.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* variable.c */ + +/** + * Queries the name of a module. + * + * @param[in] mod An instance of ::rb_cModule. + * @retval RUBY_Qnil `mod` is anonymous. + * @retval otherwise `mod` is onymous. + */ +VALUE rb_mod_name(VALUE mod); + +/** + * Identical to rb_mod_name(), except it returns `#` style + * inspection for anonymous modules. + * + * @param[in] mod An instance of ::rb_cModule. + * @return An instance of ::rb_cString representing `mod`'s path. + */ +VALUE rb_class_path(VALUE mod); + +/** + * @alias{rb_mod_name} + * + * @internal + * + * Am I missing something? Why we have the same thing in different names? + */ +VALUE rb_class_path_cached(VALUE mod); + +RBIMPL_ATTR_NONNULL(()) +/** + * Names a class. + * + * @param[out] klass Target module to name. + * @param[out] space Namespace that `klass` shall reside. + * @param[in] name Name of `klass`. + * @post `klass` has `space::klass` name. + */ +void rb_set_class_path(VALUE klass, VALUE space, const char *name); + +/** + * Identical to rb_set_class_path(), except it accepts the name as Ruby's + * string instead of C's. + * + * @param[out] klass Target module to name. + * @param[out] space Namespace that `klass` shall reside. + * @param[in] name Name of `klass`. + * @post `klass` has `space::klass` name. + */ +void rb_set_class_path_string(VALUE klass, VALUE space, VALUE name); + +/** + * Identical to rb_path2class(), except it accepts the path as Ruby's string + * instead of C's. + * + * @param[in] path Path to query. + * @exception rb_eArgError No such constant. + * @exception rb_eTypeError The path resolved to a non-module. + * @return Resolved class. + */ +VALUE rb_path_to_class(VALUE path); + +RBIMPL_ATTR_NONNULL(()) +/** + * Resolves a `Q::W::E::R`-style path string to the actual class it points. + * + * @param[in] path Path to query. + * @exception rb_eArgError No such constant. + * @exception rb_eTypeError The path resolved to a non-module. + * @return Resolved class. + */ +VALUE rb_path2class(const char *path); + +/** + * Queries the name of the given object's class. + * + * @param[in] obj Arbitrary object. + * @return An instance of ::rb_cString representing `obj`'s class' path. + */ +VALUE rb_class_name(VALUE obj); + +/** + * Kicks the autoload procedure as if it was "touched". + * + * @param[out] space Namespace where autoload is defined. + * @param[in] name Name of the autoloaded constant. + * @retval RUBY_Qfalse No such autoload. + * @retval RUBY_Qtrue Autoload successfully initiated. + * @note As an autoloaded library is expected to define `space::name`, + * it is a nature of this function to have process-global side + * effects. + * @note Multiple threads can simultaneously call this API. It blocks + * then. That must not last indefinitely but can take longer than + * you expect. + * + * @internal + * + * @shyouhei has no idea why extension libraries should use this API. + */ +VALUE rb_autoload_load(VALUE space, ID name); + +/** + * Queries if an autoload is defined at a point. + * + * @param[in] space Namespace where autoload is defined. + * @param[in] name Name of the autoloaded constant. + * @retval RUBY_Qnil No such autoload. + * @retval otherwise The feature (path) registered at `space::name`. + */ +VALUE rb_autoload_p(VALUE space, ID name); + +/** + * Traces a global variable. + * + * @param[in] argc Either 1 or 2. + * @param[in] argv Variable name, optionally a Proc. + * @retval RUBY_Qnil No previous tracers. + * @retval otherwise Previous tracers. + * + * @internal + * + * @shyouhei has no idea why extension libraries should use this API. + */ +VALUE rb_f_trace_var(int argc, const VALUE *argv); + +/** + * Deletes the passed tracer from the passed global variable, or if omitted, + * deletes everything. + * + * @param[in] argc Either 1 or 2. + * @param[in] argv Variable name, optionally a Proc. + * @retval RUBY_Qnil No previous tracers. + * @retval otherwise Deleted tracers. + * + * @internal + * + * @shyouhei has no idea why extension libraries should use this API. + */ +VALUE rb_f_untrace_var(int argc, const VALUE *argv); + +/** + * Queries the list of global variables. + * + * @return The list of the name of the global variables. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +VALUE rb_f_global_variables(void); + +/** + * Aliases a global variable. Did you know that you can alias a global + * variable? It is like aliasing methods: + * + * ```ruby + * alias $dst $src + * ``` + * + * This C function does the same thing. + * + * @param[in] dst Destination name. + * @param[in] src Source name. + * @post A global variable named `dst` is defined to be an alias of a + * global variable named `src`. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +void rb_alias_variable(ID dst, ID src); + +/** + * Frees the list of instance variables. 3rd parties need not know, but there + * are several ways to store an object's instance variables, depending on its + * internal structure. This function makes sense when the passed objects is + * using so-called "generic" backend storage. People need not be aware of this + * working behind-the-scenes. + * + * @param[out] obj The object in question. + * + * @internal + * + * This just destroys the given object. @shyouhei has no idea why extension + * libraries should use this API. + */ +void rb_free_generic_ivar(VALUE obj); + +/** + * Identical to rb_iv_get(), except it accepts the name as an ::ID instead of a + * C string. + * + * @param[in] obj Target object. + * @param[in] name Target instance variable to query. + * @retval RUBY_nil No such instance variable. + * @retval otherwise The value assigned to the instance variable. + */ +VALUE rb_ivar_get(VALUE obj, ID name); + +/** + * Identical to rb_iv_set(), except it accepts the name as an ::ID instead of a + * C string. + * + * @param[out] obj Target object. + * @param[in] name Target instance variable. + * @param[in] val Value to assign. + * @exception rb_eFrozenError Can't modify `obj`. + * @exception rb_eArgError `obj` has too many instance variables. + * @return Passed value. + * @post An instance variable named `name` is defined if absent on + * `obj`, whose value is set to `val`. + */ +VALUE rb_ivar_set(VALUE obj, ID name, VALUE val); + +/** + * Queries if the instance variable is defined at the object. This roughly + * resembles `defined?(@name)` in `obj`'s context. + * + * @param[in] obj Target object. + * @param[in] name Target instance variable to query. + * @retval RUBY_Qtrue There is an instance variable. + * @retval RUBY_Qfalse No such instance variable. + */ +VALUE rb_ivar_defined(VALUE obj, ID name); + +/** + * Iterates over an object's instance variables. + * + * @param[in] obj Target object. + * @param[in] func Callback function. + * @param[in] arg Passed as-is to the last argument of `func`. + */ +void rb_ivar_foreach(VALUE obj, int (*func)(ID name, VALUE val, st_data_t arg), st_data_t arg); + +/** + * Number of instance variables defined on an object. + * + * @param[in] obj Target object. + * @return Number of instance variables defined on `obj`. + */ +st_index_t rb_ivar_count(VALUE obj); + +/** + * Identical to rb_ivar_get() + * + * @param[in] obj Target object. + * @param[in] name Target instance variable to query. + * @retval RUBY_nil No such instance variable. + * @retval otherwise The value assigned to the instance variable. + * + * @internal + * + * Am I missing something? Why we have the same thing in different names? + */ +VALUE rb_attr_get(VALUE obj, ID name); + +/** + * Resembles `Object#instance_variables`. + * + * @param[in] obj Target object to query. + * @return An array of instance variable names for the receiver. + * @note Simply defining an accessor does not create the corresponding + * instance variable. + */ +VALUE rb_obj_instance_variables(VALUE obj); + +/** + * Resembles `Object#remove_instance_variable`. + * + * @param[out] obj Target object. + * @param[in] name Variable name to remove, either in Symbol or String. + * @return What was removed. + * @pre Instance variable named `name` is deleted from `obj`. + */ +VALUE rb_obj_remove_instance_variable(VALUE obj, VALUE name); + +/** + * This API is mysterious. It has been there since the initial revision. No + * single bits of documents has ever been written. The function name doesn't + * describe anything. What should be passed to the argument, or what should be + * the return value, are not obvious. Yet it has evolved over time. The + * source code is written in counter-intuitive way (as of 3.0). + * + * Simply put, don't try to understand this API. + */ +void *rb_mod_const_at(VALUE, void*); + +/** + * This is a variant of rb_mod_const_at(). As a result, it is also mysterious. + * It _seems_ it iterates over the ancestry tree of the module. But what that + * means is beyond a human brain. + */ +void *rb_mod_const_of(VALUE, void*); + +/** + * This is another mysterious API that comes with no documents at all. It + * seems it expects some specific data structure for the passed pointer. But + * the details has never been made explicit. It seems nobody should use this + * API. + */ +VALUE rb_const_list(void*); + +/** + * Resembles `Module#constants`. List up the constants defined at the + * receiver. This includes the names of constants in any included modules, + * unless `argv[0]` is ::RUBY_Qfalse. + * + * The implementation makes no guarantees about the order in which the + * constants are yielded. + * + * @param[in] argc Either 0 or 1. + * @param[in] argv Pointer to ::RUBY_Qfalse, if `argc == 1`. + * @param[in] recv Target namespace. + * @return An array of symbols, which are constant names under `recv`. + */ +VALUE rb_mod_constants(int argc, const VALUE *argv, VALUE recv); + +/** + * Resembles `Module#remove_const`. + * + * @param[out] space Target namespace. + * @param[in] name Variable name to remove, either in Symbol or String. + * @return What was removed. + * @pre Constant named `space::name` is deleted. + * @note In case what was removed was in fact a module or a class, this + * operation does not affect its name. Which means when people + * for instance look at it using `p` etc., it still introduces + * itself using the deleted name. Can confuse people. + */ +VALUE rb_mod_remove_const(VALUE space, VALUE name); + +/** + * Queries if the constant is defined at the namespace. + * + * @param[in] space Target namespace. + * @param[in] name Target name to query. + * @retval RUBY_Qtrue There is a constant. + * @retval RUBY_Qfalse No such constant. + * + * @internal + * + * The return values are not typo! This function returns ruby values casted to + * `int`. Completely brain-damaged design. + */ +int rb_const_defined(VALUE space, ID name); + +/** + * Identical to rb_const_defined(), except it doesn't look for parent classes. + * For instance `Array` is a toplevel constant, which is visible from + * everywhere. But this function does not take such things into account. It + * concerns only what is directly defined inside of the given namespace. + * + * @param[in] space Target namespace. + * @param[in] name Target name to query. + * @retval RUBY_Qtrue There is a constant. + * @retval RUBY_Qfalse No such constant. + * + * @internal + * + * The return values are not typo! This function returns ruby values casted to + * `int`. Completely brain-damaged design. + */ +int rb_const_defined_at(VALUE space, ID name); + +/** + * Identical to rb_const_defined(), except it returns false for private + * constants. + * + * @param[in] space Target namespace. + * @param[in] name Target name to query. + * @retval RUBY_Qtrue There is a constant. + * @retval RUBY_Qfalse No such constant. + * + * @internal + * + * What does "from" mean? The name sounds quite cryptic. + * + * The return values are not typo! This function returns ruby values casted to + * `int`. Completely brain-damaged design. + */ +int rb_const_defined_from(VALUE space, ID name); + +/** + * Identical to rb_const_defined(), except it returns the actual defined value. + * + * @param[in] space Target namespace. + * @param[in] name Target name to query. + * @exception rb_eNameError No such constant. + * @return The defined constant. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +VALUE rb_const_get(VALUE space, ID name); + +/** + * Identical to rb_const_defined_at(), except it returns the actual defined + * value. It can also be seen as a routine identical to rb_const_get(), except + * it doesn't look for parent classes. + * + * @param[in] space Target namespace. + * @param[in] name Target name to query. + * @exception rb_eNameError No such constant. + * @return The defined constant. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +VALUE rb_const_get_at(VALUE space, ID name); + +/** + * Identical to rb_const_defined_at(), except it returns the actual defined + * value. It can also be seen as a routine identical to rb_const_get(), except + * it doesn't return a private constant. + * + * @param[in] space Target namespace. + * @param[in] name Target name to query. + * @exception rb_eNameError No such constant. + * @return The defined constant. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +VALUE rb_const_get_from(VALUE space, ID name); + +/** + * Names a constant. + * + * @param[out] space Target namespace. + * @param[in] name Target name to query. + * @param[in] val Value to define. + * @exception rb_eTypeError `space` is not a module. + * @post `name` is a constant under `space`, whose value is `val`. + * @note You can reassign. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +void rb_const_set(VALUE space, ID name, VALUE val); + +/** + * Identical to rb_mod_remove_const(), except it takes the name as ::ID instead + * of ::VALUE. + * + * @param[out] space Target namespace. + * @param[in] name Variable name to remove, either in Symbol or String. + * @return What was removed. + * @pre Constant named `space::name` is deleted. + * @note In case what was removed was in fact a module or a class, this + * operation does not affect its name. Which means when people + * for instance look at it using `p` etc., it still introduces + * itself using the deleted name. Can confuse people. + */ +VALUE rb_const_remove(VALUE space, ID name); + +#if 0 /* EXPERIMENTAL: remove if no problem */ +RBIMPL_ATTR_NORETURN() +/** + * This is the default implementation of `Module#const_missing`. + * + * @param[in] space Target namespace. + * @param[in] name Target name that is nonexistent. + * @exception rb_eNameError Always. + */ +VALUE rb_mod_const_missing(VALUE space, VALUE name); +#endif + +/** + * Queries if the given class has the given class variable. + * + * @param[in] klass Target class. + * @param[in] name Name to query. + * @return RUBY_Qtrue Yes there is. + * @return RUBY_Qfalse No there isn't. + * @pre `klass` must be an instance of rb_cModule. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +VALUE rb_cvar_defined(VALUE klass, ID name); + +/** + * Assigns a value to a class variable. + * + * @param[out] klass Target class. + * @param[in] name Variable name. + * @param[in] val Value to be assigned. + * @post `klass` has a class variable named `name` whose value is `val`. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +void rb_cvar_set(VALUE klass, ID name, VALUE val); + +/** + * Obtains a value from a class variable. + * + * @param[in] klass Target class. + * @param[in] name Variable name. + * @exception rb_eNameError Uninitialised class variable. + * @exception rb_eRuntimeError `[Bug#14541]` situation. + * @return Class variable named `name` under `klass`. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +VALUE rb_cvar_get(VALUE klass, ID name); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_cvar_get(), except it takes additional "front" pointer. + * This extra parameter is a buffer, which will have the class where the + * queried class variable actually resides. + * + * @param[in] klass Target class. + * @param[in] name Variable name. + * @param[out] front Return buffer. + * @exception rb_eNameError Uninitialised class variable. + * @exception rb_eRuntimeError `[Bug#14541]` situation. + * @return Class variable named `name` under `klass`. + * @post `front` has the class object, which is an ancestor of `klass`, + * where the queried class variable actually resides. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +VALUE rb_cvar_find(VALUE klass, ID name, VALUE *front); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_cvar_set(), except it accepts C's string instead of ::ID. + * + * @param[out] klass Target class. + * @param[in] name Variable name. + * @param[in] val Value to be assigned. + * @post `klass` has a class variable named `name` whose value is `val`. + */ +void rb_cv_set(VALUE klass, const char *name, VALUE val); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_cvar_get(), except it accepts C's string instead of ::ID. + * + * @param[in] klass Target class. + * @param[in] name Variable name. + * @exception rb_eNameError Uninitialised class variable. + * @exception rb_eRuntimeError `[Bug#14541]` situation. + * @return Class variable named `name` under `klass`. + */ +VALUE rb_cv_get(VALUE klass, const char *name); + +RBIMPL_ATTR_NONNULL(()) +/** + * @alias{rb_cv_set} + * + * @internal + * + * Am I missing something? Why we have the same thing in different names? + */ +void rb_define_class_variable(VALUE, const char*, VALUE); + +/** + * Resembles `Module#class_variables`. List up the variables defined at the + * receiver. This includes the names of constants in any included modules, + * unless `argv[0]` is ::RUBY_Qfalse. + * + * The implementation makes no guarantees about the order in which the + * constants are yielded. + * + * @param[in] argc Either 0 or 1. + * @param[in] argv Pointer to ::RUBY_Qfalse, if `argc == 1`. + * @param[in] recv Target class. + * @return An array of symbols, which are class variable names under + * `recv`. + */ +VALUE rb_mod_class_variables(int argc, const VALUE *argv, VALUE recv); + +/** + * Resembles `Module#remove_class_variable`. + * + * @param[out] mod Target class. + * @param[in] name Variable name to remove, either in Symbol or String. + * @return What was removed. + * @pre Instance variable named `name` is deleted from `obj`. + */ +VALUE rb_mod_remove_cvar(VALUE mod, VALUE name); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_VARIABLE_H */ diff --git a/libs/libruby/ruby/internal/intern/vm.h b/libs/libruby/ruby/internal/intern/vm.h new file mode 100644 index 0000000..76af796 --- /dev/null +++ b/libs/libruby/ruby/internal/intern/vm.h @@ -0,0 +1,431 @@ +#ifndef RBIMPL_INTERN_VM_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERN_VM_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Public APIs related to rb_cRubyVM. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* vm.c */ + +/** + * Resembles `__LINE__`. + * + * @retval 0 Current execution context not in a ruby method. + * @retval otherwise The current line number of the current thread of the + * current ractor of the current execution context. + */ +int rb_sourceline(void); + +/** + * Resembles `__FILE__`. + * + * @retval 0 Current execution context not in a ruby method. + * @retval otherwise The current source path of the current thread of the + * current ractor of the current execution context. + * @note This may or may not be an absolute path. + */ +const char *rb_sourcefile(void); + +/** + * Resembles `__method__`. + * + * @param[out] idp Return buffer for method id. + * @param[out] klassp Return buffer for class. + * @retval 0 Current execution context not in a method. + * @retval 1 Successful return. + * @post Upon successful return `*idp` and `*klassp` are updated to have + * the current method name and its defined class respectively. + * @note Both parameters can be `NULL`. + */ +int rb_frame_method_id_and_class(ID *idp, VALUE *klassp); + +/* vm_eval.c */ + +/** + * Identical to rb_funcallv(), except it returns ::RUBY_Qundef instead of + * raising ::rb_eNoMethodError. + * + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @retval RUBY_Qundef `recv` doesn't respond to `mid`. + * @retval otherwise What the method evaluates to. + */ +VALUE rb_check_funcall(VALUE recv, ID mid, int argc, const VALUE *argv); + +/** + * Identical to rb_check_funcall(), except you can specify how to handle the + * last element of the given array. It can also be seen as a routine identical + * to rb_funcallv_kw(), except it returns ::RUBY_Qundef instead of raising + * ::rb_eNoMethodError. + * + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] argc Number of arguments. + * @param[in] argv Arbitrary number of method arguments. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `argv`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `argv`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @retval RUBY_Qundef `recv` doesn't respond to `mid`. + * @retval otherwise What the method evaluates to. + */ +VALUE rb_check_funcall_kw(VALUE recv, ID mid, int argc, const VALUE *argv, int kw_splat); + +/** + * This API is practically a variant of rb_proc_call_kw() now. Historically + * when there still was a concept called `$SAFE`, this was an API for that. + * But we no longer have that. This function basically ended its role. It + * just remains here because of no harm. + * + * @param[in] cmd A string, or something callable. + * @param[in] arg Argument passed to the call. + * @param[in] kw_splat Handling of keyword parameters: + * - RB_NO_KEYWORDS `arg`'s last is not a keyword argument. + * - RB_PASS_KEYWORDS `arg`'s last is a keyword argument. + * - RB_PASS_CALLED_KEYWORDS it depends if there is a passed block. + * @return What the command evaluates to. + */ +VALUE rb_eval_cmd_kw(VALUE cmd, VALUE arg, int kw_splat); + +/** + * Identical to rb_funcallv(), except it takes Ruby's array instead of C's. + * @param[in,out] recv Receiver of the method. + * @param[in] mid Name of the method to call. + * @param[in] args An instance of ::RArray. + * @exception rb_eNoMethodError No such method. + * @exception rb_eException Any exceptions happen inside. + * @return What the method evaluates to. + * @pre `args` must be an ::RArray. Call `to_ary` beforehand when + * necessary. + */ +VALUE rb_apply(VALUE recv, ID mid, VALUE args); + +/** + * Evaluates a string containing Ruby source code, or the given block, within + * the context of the receiver. In order to set the context, the variable + * `self` is set to `recv` while the code is executing, giving the code access + * to `recv`'s instance variables and private methods. + * + * When given a block, `recv` is also passed in as the block's only argument. + * + * When given a string, the optional second and third parameters supply a + * filename and starting line number that are used when reporting compilation + * errors. + * + * @param[in] argc Number of objects in `argv` + * @param[in] argv C array of 0 up to 3 elements. + * @param[in] recv The object in question. + * @return What was evaluated. + */ +VALUE rb_obj_instance_eval(int argc, const VALUE *argv, VALUE recv); + +/** + * Executes the given block within the context of the receiver. In order to + * set the context, the variable `self` is set to `recv` while the code is + * executing, giving the code access to `recv`'s instance variables. Arguments + * are passed as block parameters. + * + * @param[in] argc Number of objects in `argv` + * @param[in] argv Arbitrary parameters to be passed to the block. + * @param[in] recv The object in question. + * @return What was evaluated. + * @note Don't confuse this with rb_obj_instance_eval(). The key + * difference is whether you can pass arbitrary parameters to the + * block, like this: + * + * ```ruby + * class Foo + * def initialize + * @foo = 5 + * end + * end + * Foo.new.instance_exec(7) {|i| @foo + i } # => 12 + * ``` + */ +VALUE rb_obj_instance_exec(int argc, const VALUE *argv, VALUE recv); + +/** + * Identical to rb_obj_instance_eval(), except it evaluates within the context + * of module. + * + * @param[in] argc Number of objects in `argv` + * @param[in] argv C array of 0 up to 3 elements. + * @param[in] mod The module in question. + * @pre `mod` must be a Module. + * @return What was evaluated. + */ +VALUE rb_mod_module_eval(int argc, const VALUE *argv, VALUE mod); + +/** + * Identical to rb_obj_instance_exec(), except it evaluates within the context + * of module. + * + * @param[in] argc Number of objects in `argv` + * @param[in] argv Arbitrary parameters to be passed to the block. + * @param[in] mod The module in question. + * @pre `mod` must be a Module. + * @return What was evaluated. + */ +VALUE rb_mod_module_exec(int argc, const VALUE *argv, VALUE mod); + +/* vm_method.c */ + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define HAVE_RB_DEFINE_ALLOC_FUNC 1 + +/** + * This is the type of functions that ruby calls when trying to allocate an + * object. It is sometimes necessary to allocate extra memory regions for an + * object. When you define a class that uses ::RTypedData, it is typically the + * case. On such situations define a function of this type and pass it to + * rb_define_alloc_func(). + * + * @param[in] klass The class that this function is registered. + * @return A newly allocated instance of `klass`. + */ +typedef VALUE (*rb_alloc_func_t)(VALUE klass); + +/** + * Sets the allocator function of a class. + * + * @param[out] klass The class to modify. + * @param[in] func An allocator function for the class. + * @pre `klass` must be an instance of Class. + */ +void rb_define_alloc_func(VALUE klass, rb_alloc_func_t func); + +/** + * Deletes the allocator function of a class. It is sometimes desirable to + * restrict creation of an instance of a class. For example it rarely makes + * sense for a DB adaptor class to allow programmers creating DB row objects + * without querying the DB itself. You can kill sporadic creation of such + * objects then, by nullifying the allocator function using this API. Your + * object shall be allocated using #RB_NEWOBJ_OF() directly. + * + * @param[out] klass The class to modify. + * @pre `klass` must be an instance of Class. + */ +void rb_undef_alloc_func(VALUE klass); + +/** + * Queries the allocator function of a class. + * + * @param[in] klass The class in question. + * @pre `klass` must be an instance of Class. + * @retval 0 No allocator function is registered. + * @retval otherwise The allocator function. + * + * @internal + * + * Who cares? @shyouhei finds no practical usage of the return value. Maybe we + * need KonMari. + */ +rb_alloc_func_t rb_get_alloc_func(VALUE klass); + +/** + * Clears the inline constant caches associated with a particular ID. Extension + * libraries should not bother with such things. Just forget about this API (or + * even, the presence of constant caches). + */ +void rb_clear_constant_cache_for_id(ID id); + +/** + * Resembles `alias`. + * + * @param[out] klass Where to define an alias. + * @param[in] dst New name. + * @param[in] src Existing name. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eFrozenError `klass` is frozen. + * @exception rb_eNameError No such method named `src`. + * @post `klass` has a method named `dst`, which is the identical to its + * method named `src`. + */ +void rb_alias(VALUE klass, ID dst, ID src); + +/** + * This function resembles now-deprecated `Module#attr`. + * + * @param[out] klass Where to define an attribute. + * @param[in] name Name of an instance variable. + * @param[in] need_reader Whether attr_reader is needed. + * @param[in] need_writer Whether attr_writer is needed. + * @param[in] honour_visibility Whether to use the current visibility. + * @exception rb_eTypeError `klass` is not a class. + * @exception rb_eFrozenError `klass` is frozen. + * @post If `need_reader` is set `klass` has a method named `name`. + * @post If `need_writer` is set `klass` has a method named `name=`. + * + * @internal + * + * The three `int` arguments should have been bool, but there was no such thing + * like a bool when K&R was used in this project. + */ +void rb_attr(VALUE klass, ID name, int need_reader, int need_writer, int honour_visibility); + +RBIMPL_ATTR_NONNULL(()) +/** + * Removes a method. Don't confuse this to rb_undef_method(), which doesn't + * remove a method. This one resembles `Module#remove_method`. + * + * @param[out] klass The class to remove a method. + * @param[in] name Name of a method to be removed. + * @exception rb_eTypeError `klass` is a non-module. + * @exception rb_eFrozenError `klass` is frozen. + * @exception rb_eNameError No such method. + * @see rb_undef_method + */ +void rb_remove_method(VALUE klass, const char *name); + +/** + * Identical to rb_remove_method(), except it accepts the method name as ::ID. + * + * @param[out] klass The class to remove a method. + * @param[in] mid Name of a method to be removed. + * @exception rb_eTypeError `klass` is a non-module. + * @exception rb_eFrozenError `klass` is frozen. + * @exception rb_eNameError No such method. + * @see rb_undef + */ +void rb_remove_method_id(VALUE klass, ID mid); + +/** + * Queries if the klass has this method. This function has only one line of + * document in the implementation that states "// deprecated". Don't know what + * that means though. + * + * @param[in] klass The class in question. + * @param[in] id The method name to query. + * @param[in] ex Undocumented magic value. + * @retval false Method not found. + * @retval true There is a method. + * @pre `klass` must be a module. + * + * @internal + * + * @shyouhei has no motivation to describe what should be passed to `ex`. It + * seems this function should just be trashed. + */ +int rb_method_boundp(VALUE klass, ID id, int ex); + +/** + * Well... Let us hesitate from describing what a "basic definition" is. This + * nuanced concept should have been kept private. Just please. Don't touch + * it. This function is a badly distributed random number generator. Right? + * + * @param[in] klass The class in question. + * @param[in] mid The method name in question. + * @retval 1 It is. + * @retval 0 It isn't. + */ +int rb_method_basic_definition_p(VALUE klass, ID mid); + +/** + * Identical to rb_respond_to(), except it additionally takes the visibility + * parameter. This does not make difference unless the object has + * `respond_to?` undefined, but has `respond_to_missing?` defined. That case + * the passed argument becomes the second argument of `respond_to_missing?`. + * + * @param[in] obj The object in question. + * @param[in] mid The method name in question. + * @param[in] private_p This is the second argument of `obj`'s + * `respond_to_missing?`. + * @retval 1 Yes it does. + * @retval 0 No it doesn't. + */ +int rb_obj_respond_to(VALUE obj, ID mid, int private_p); + +/** + * Queries if the object responds to the method. This involves calling the + * object's `respond_to?` method. + * + * @param[in] obj The object in question. + * @param[in] mid The method name in question. + * @retval 1 Yes it does. + * @retval 0 No it doesn't. + */ +int rb_respond_to(VALUE obj, ID mid); + +RBIMPL_ATTR_NORETURN() +/** + * Raises ::rb_eNotImpError. This function is used as an argument to + * rb_define_method() etc. + * + * ```CXX + * rb_define_method(rb_cFoo, "foo", rb_f_notimplement, -1); + * ``` + * + * @param argc Unused parameter. + * @param argv Unused parameter. + * @param obj Unused parameter. + * @param marker Unused parameter. + * @exception rb_eNotImpError Always. + * @return Never returns. + * + * @internal + * + * See also the Q&A section of include/ruby/internal/anyargs.h. + */ +VALUE rb_f_notimplement(int argc, const VALUE *argv, VALUE obj, VALUE marker); +#if !defined(RUBY_EXPORT) && defined(_WIN32) +RUBY_EXTERN VALUE (*const rb_f_notimplement_)(int, const VALUE *, VALUE, VALUE marker); +#define rb_f_notimplement (*rb_f_notimplement_) +#endif + +/* vm_backtrace.c */ + +/** + * Prints the backtrace out to the standard error. This just confuses people + * for no reason. Evil souls must only use it. + * + * @internal + * + * Actually it is very useful when called from an interactive GDB session. + */ +void rb_backtrace(void); + +/** + * Creates the good old fashioned array-of-strings style backtrace info. + * + * @return An array which contains strings, which are the textual + * representations of the backtrace locations of the current thread of + * the current ractor of the current execution context. + * @note Ruby scripts can access more sophisticated + * `Thread::Backtrace::Location`. But it seems there is no way for C + * extensions to use that API. + */ +VALUE rb_make_backtrace(void); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERN_VM_H */ diff --git a/libs/libruby/ruby/internal/interpreter.h b/libs/libruby/ruby/internal/interpreter.h new file mode 100644 index 0000000..662d39c --- /dev/null +++ b/libs/libruby/ruby/internal/interpreter.h @@ -0,0 +1,304 @@ +#ifndef RBIMPL_INTERPRETER_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_INTERPRETER_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Interpreter embedding APIs. + */ +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * @defgroup embed CRuby Embedding APIs + * + * CRuby interpreter APIs. These are APIs to embed MRI interpreter into your + * program. + * These functions are not a part of Ruby extension library API. + * Extension libraries of Ruby should not depend on these functions. + * + * @{ + */ + +/** + * @defgroup ruby1 ruby(1) implementation + * + * A part of the implementation of ruby(1) command. + * Other programs that embed Ruby interpreter do not always need to use these + * functions. + * + * @{ + */ + +RBIMPL_ATTR_NONNULL(()) +/** + * Initializes the process for libruby. + * + * This function assumes this process is `ruby(1)` and it has just started. + * Usually programs that embed CRuby interpreter may not call this function, + * and may do their own initialization. + * + * @param[in] argc Pointer to process main's `argc`. + * @param[in] argv Pointer to process main's `argv`. + * @warning `argc` and `argv` cannot be `NULL`. + * + * @internal + * + * AFAIK Ruby does write to argv, especially `argv[0][0]`, via setproctitle(3). + * It is intentional that the argument is not const-qualified. + */ +void ruby_sysinit(int *argc, char ***argv); + +/** + * Calls ruby_setup() and check error. + * + * Prints errors and calls exit(3) if an error occurred. + */ +void ruby_init(void); + +/** + * Processes command line arguments and compiles the Ruby source to execute. + * + * This function does: + * - Processes the given command line flags and arguments for `ruby(1)` + * - Compiles the source code from the given argument, `-e` or `stdin`, and + * - Returns the compiled source as an opaque pointer to an internal data + * structure + * + * @param[in] argc Process main's `argc`. + * @param[in] argv Process main's `argv`. + * @return An opaque pointer to the compiled source or an internal special + * value. Pass it to ruby_executable_node() to detect which. + * @see ruby_executable_node + */ +void* ruby_options(int argc, char** argv); + +/** + * Checks the return value of ruby_options(). + * + * ruby_options() sometimes returns a special value to indicate this process + * should immediately exit. This function checks if the case. Also stores the + * exit status that the caller have to pass to exit(3) into `*status`. + * + * @param[in] n A return value of ruby_options(). + * @param[out] status Pointer to the exit status of this process. + * @retval 0 The given value is such a special value. + * @retval otherwise The given opaque pointer is actually a compiled + * source. + */ +int ruby_executable_node(void *n, int *status); + +/** + * Runs the given compiled source and exits this process. + * + * @param[in] n Opaque "node" pointer. + * @retval EXIT_SUCCESS Successfully run the source. + * @retval EXIT_FAILURE An error occurred. + */ +int ruby_run_node(void *n); + +/* version.c */ +/** Prints the version information of the CRuby interpreter to stdout. */ +void ruby_show_version(void); + +#ifndef ruby_show_copyright +/** Prints the copyright notice of the CRuby interpreter to stdout. */ +void ruby_show_copyright(void); +#endif + +/** + * A convenience macro to call ruby_init_stack(). + * Must be placed just after variable declarations. + */ +#define RUBY_INIT_STACK \ + VALUE variable_in_this_stack_frame; \ + ruby_init_stack(&variable_in_this_stack_frame); +/** @} */ + +/** + * Set stack bottom of Ruby implementation. + * + * You must call this function before any heap allocation by Ruby + * implementation. Or GC will break living objects. + * + * @param[in] addr A pointer somewhere on the stack, near its bottom. + */ +void ruby_init_stack(volatile VALUE *addr); + +/** + * Initializes the VM and builtin libraries. + * + * @retval 0 Initialization succeeded. + * @retval otherwise An error occurred. + * + * @internal + * + * Though not a part of our public API, the return value is in fact an enum + * ruby_tag_type. You can see the potential "otherwise" values by looking at + * vm_core.h. + */ +int ruby_setup(void); + +/** + * Destructs the VM. + * + * Runs the VM finalization processes as well as ruby_finalize(), and frees + * resources used by the VM. + * + * @param[in] ex Default value to the return value. + * @retval EXIT_FAILURE An error occurred. + * @retval ex Successful cleanup. + * @note This function does not raise any exception. + */ +int ruby_cleanup(int ex); + +/** + * Runs the VM finalization processes. + * + * `END{}` and procs registered by `Kernel.#at_exit` are executed here. See the + * Ruby language spec for more details. + * + * @note This function is allowed to raise an exception if an error occurred. + */ +void ruby_finalize(void); + +RBIMPL_ATTR_NORETURN() +/** Calls ruby_cleanup() and exits the process. */ +void ruby_stop(int); + +/** + * Checks for stack overflow. + * + * @retval true NG machine stack is about to overflow. + * @retval false OK there still is a room in the stack. + * + * @internal + * + * Does anybody use it? So far @shyouhei have never seen any actual use-case. + */ +int ruby_stack_check(void); + +/** + * Queries what Ruby thinks is the machine stack. Ruby manages a region of + * memory. It calls that area the "machine stack". By calling this function, + * in spite of its name, you can obtain both one end of the stack and its + * length at once. Which means you can know the entire region. + * + * @param[out] topnotch On return the pointer points to the upmost address of + * the macihne stack that Ruby knows. + * @return Length of the machine stack that Ruby knows. + * + * @internal + * + * Does anybody use it? @shyouhei is quite skeptical if this is useful outside + * of the VM. Maybe it was a wrong idea to expose this API to 3rd parties. + */ +size_t ruby_stack_length(VALUE **topnotch); + +/** + * Identical to ruby_run_node(), except it returns an opaque execution status. + * You can pass it to rb_cleanup(). + * + * @param[in] n Opaque "node" pointer. + * @retval 0 Successful end-of-execution. + * @retval otherwise An error occurred. + * + * @internal + * + * Though not a part of our public API, the return value is in fact an enum + * ruby_tag_type. You can see the potential "otherwise" values by looking at + * vm_core.h. + */ +int ruby_exec_node(void *n); + +/** + * Sets the current script name to this value. + * + * This is similar to `$0 = name` in Ruby level but also affects + * `Method#location` and others. + * + * @param[in] name File name to set. + */ +void ruby_script(const char* name); + +/** + * Identical to ruby_script(), except it takes the name as a Ruby String + * instance. + * + * @param[in] name File name to set. + */ +void ruby_set_script_name(VALUE name); + +/** Defines built-in variables */ +void ruby_prog_init(void); + +/** + * Sets argv that ruby understands. Your program might have its own command + * line parameters etc. Handle them as you wish, and pass remaining parts of + * argv here. + * + * @param[in] argc Number of elements of `argv`. + * @param[in] argv Command line arguments. + */ +void ruby_set_argv(int argc, char **argv); + +/** + * Identical to ruby_options(), except it raises ruby-level exceptions on + * failure. + * + * @param[in] argc Process main's `argc`. + * @param[in] argv Process main's `argv`. + * @return An opaque "node" pointer. + */ +void *ruby_process_options(int argc, char **argv); + +/** + * Sets up `$LOAD_PATH`. + * + * @internal + * + * @shyouhei guesses this has to be called at very later stage, at least after + * the birth of object system. But is not exactly sure when. + */ +void ruby_init_loadpath(void); + +/** + * Appends the given path to the end of the load path. + * + * @pre ruby_init_loadpath() must be done beforehand. + * @param[in] path The path you want to push to the load path. + */ +void ruby_incpush(const char *path); + +/** + * Clear signal handlers. + * + * Ruby installs its own signal handler (apart from those which user scripts + * set). This is to clear that. Must be called when the ruby part terminates, + * before switching to your program's own logic. + */ +void ruby_sig_finalize(void); + +/** @} */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_INTERPRETER_H */ diff --git a/libs/libruby/ruby/internal/iterator.h b/libs/libruby/ruby/internal/iterator.h new file mode 100644 index 0000000..5f70646 --- /dev/null +++ b/libs/libruby/ruby/internal/iterator.h @@ -0,0 +1,513 @@ +#ifndef RBIMPL_ITERATOR_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_ITERATOR_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Block related APIs. + */ +#include "ruby/internal/attr/deprecated.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define RB_BLOCK_CALL_FUNC_STRICT 1 + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define RUBY_BLOCK_CALL_FUNC_TAKES_BLOCKARG 1 + +/** + * Shim for block function parameters. Historically ::rb_block_call_func_t had + * only two parameters. Over time it evolved to have much more than that. By + * using this macro you can absorb such API differences. + * + * ```CXX + * // This works since 2.1.0 + * VALUE my_own_iterator(RB_BLOCK_CALL_FUNC_ARGLIST(y, c)); + * ``` + */ +#define RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg) \ + VALUE yielded_arg, VALUE callback_arg, int argc, const VALUE *argv, VALUE blockarg + +/** + * This is the type of a function that the interpreter expect for C-backended + * blocks. Blocks are often written in Ruby. But C extensions might want to + * have their own blocks. In order to do so authors have to create a separate + * C function of this type, and pass its pointer to rb_block_call(). + * + * ```CXX + * VALUE + * my_own_iterator(RB_BLOCK_CALL_FUNC_ARGLIST(y, c)) + * { + * const auto plus = rb_intern("+"); + * return rb_funcall(c, plus, 1, y); + * } + * + * VALUE + * my_own_method(VALUE self) + * { + * const auto each = rb_intern("each"); + * return rb_block_call(self, each, 0, 0, my_own_iterator, self); + * } + * ``` + */ +typedef VALUE rb_block_call_func(RB_BLOCK_CALL_FUNC_ARGLIST(yielded_arg, callback_arg)); + +/** + * Shorthand type that represents an iterator-written-in-C function pointer. + */ +typedef rb_block_call_func *rb_block_call_func_t; + +/** + * This is a shorthand of calling `obj.each`. + * + * @param[in] obj The receiver. + * @return What `obj.each` returns. + * + * @internal + * + * Does anyone still need it? This API was to use with rb_iterate(), which is + * marked deprecated (see below). Old idiom to call an iterator was: + * + * ```CXX + * VALUE recv; + * VALUE iter_func(ANYARGS); + * VALUE iter_data; + * rb_iterate(rb_each, recv, iter_func, iter_data); + * ``` + */ +VALUE rb_each(VALUE obj); + +/** + * Yields the block. In Ruby there is a concept called a block. You can pass + * one to a method. In a method, when called with a block, you can yield it + * using this function. + * + * ```CXX + * VALUE + * iterate(VALUE self) + * { + * extern int get_n(VALUE); + * extern VALUE get_v(VALUE, VALUE); + * const auto n = get_n(self); + * + * for (int i=0; i + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Memory management stuff. + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#ifdef HAVE_STRING_H +# include +#endif + +#ifdef HAVE_STDINT_H +# include +#endif + +#ifdef HAVE_ALLOCA_H +# include +#endif + +#if defined(_MSC_VER) && defined(_WIN64) +# include +# pragma intrinsic(_umul128) +#endif + +#include "ruby/internal/attr/alloc_size.h" +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/constexpr.h" +#include "ruby/internal/attr/noalias.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/attr/restrict.h" +#include "ruby/internal/attr/returns_nonnull.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/has/builtin.h" +#include "ruby/internal/stdalign.h" +#include "ruby/internal/stdbool.h" +#include "ruby/internal/xmalloc.h" +#include "ruby/backward/2/limits.h" +#include "ruby/backward/2/long_long.h" +#include "ruby/backward/2/assume.h" +#include "ruby/defines.h" + +/** @cond INTENAL_MACRO */ + +/* Make alloca work the best possible way. */ +#if defined(alloca) +# /* Take that. */ +#elif RBIMPL_HAS_BUILTIN(__builtin_alloca) +# define alloca __builtin_alloca +#elif defined(_AIX) +# pragma alloca +#elif defined(__cplusplus) +extern "C" void *alloca(size_t); +#else +extern void *alloca(); +#endif + +/** @endcond */ + +#if defined(__DOXYGEN__) +/** + * @private + * + * Type that is as twice wider as size_t. This is an implementation detail of + * rb_mul_size_overflow(). People should not use it. This is not a good name + * either. + */ +typedef uint128_t DSIZE_T; +#elif defined(HAVE_INT128_T) && SIZEOF_SIZE_T <= 8 +# define DSIZE_T uint128_t +#elif SIZEOF_SIZE_T * 2 <= SIZEOF_LONG_LONG +# define DSIZE_T unsigned LONG_LONG +#endif + +/** + * @private + * + * Maximum possible number of bytes that #RB_ALLOCV can allocate using + * `alloca`. Anything beyond this is allocated using rb_alloc_tmp_buffer(). + * This selection is transparent to users. People don't have to bother. + */ +#ifdef C_ALLOCA +# define RUBY_ALLOCV_LIMIT 0 +#else +# define RUBY_ALLOCV_LIMIT 1024 +#endif + +/** + * Prevents premature destruction of local objects. Ruby's garbage collector + * is conservative; it scans the C level machine stack as well. Possible in- + * use Ruby objects must remain visible on stack, to be properly marked as + * such. However contemporary C compilers do not interface well with this. + * Consider the following example: + * + * ```CXX + * auto s = rb_str_new_cstr(" world"); + * auto sptr = RSTRING_PTR(s); + * auto t = rb_str_new_cstr("hello,"); // Possible GC invocation + * auto u = rb_str_cat_cstr(t, sptr); + * + * RB_GC_GUARD(s); // ensure `s` (and thus `sptr`) do not get GC-ed + * ``` + * + * Here, without the #RB_GC_GUARD, the last use of `s` is _before_ the last use + * of `sptr`. Compilers could thus think `s` and `t` are allowed to overlap. + * That would eliminate `s` from the stack, while `sptr` is still in use. If + * our GC ran at that very moment, `s` gets swept out, which also destroys + * `sptr`. Boom! You got a SEGV. + * + * In order to prevent this scenario #RB_GC_GUARD must be placed _after_ the + * last use of `sptr`. Placing #RB_GC_GUARD before dereferencing `sptr` would + * be of no use. + * + * #RB_GC_GUARD would not be necessary at all in the above example if non- + * inlined function calls are made on the `s` variable after `sptr` is + * dereferenced. Thus, in the above example, calling any un-inlined function + * on `s` such as `rb_str_modify(s);` will ensure `s` stays on the stack or + * register to prevent a GC invocation from prematurely freeing it. + * + * Using the #RB_GC_GUARD macro is preferable to using the `volatile` keyword + * in C. #RB_GC_GUARD has the following advantages: + * + * - the intent of the macro use is clear. + * + * - #RB_GC_GUARD only affects its call site. OTOH `volatile` generates some + * extra code every time the variable is used, hurting optimisation. + * + * - `volatile` implementations may be buggy/inconsistent in some compilers + * and architectures. #RB_GC_GUARD is customisable for broken + * systems/compilers without negatively affecting other systems. + * + * - C++ since C++20 deprecates `volatile`. If you write your extension + * library in that language there is no escape but to use this macro. + * + * @param v A variable of ::VALUE type. + * @post `v` is still alive. + */ +#ifdef __GNUC__ +#define RB_GC_GUARD(v) \ + (*__extension__ ({ \ + volatile VALUE *rb_gc_guarded_ptr = &(v); \ + __asm__("" : : "m"(rb_gc_guarded_ptr)); \ + rb_gc_guarded_ptr; \ + })) +#elif defined _MSC_VER +#define RB_GC_GUARD(v) (*rb_gc_guarded_ptr(&(v))) +#else +#define HAVE_RB_GC_GUARDED_PTR_VAL 1 +#define RB_GC_GUARD(v) (*rb_gc_guarded_ptr_val(&(v),(v))) +#endif + +/* Casts needed because void* is NOT compatible with others in C++. */ + +/** + * Convenient macro that allocates an array of n elements. + * + * @param type Type of array elements. + * @param n Length of the array. + * @exception rb_eNoMemError No space left for allocation. + * @exception rb_eArgError Integer overflow trying to calculate the length + * of continuous memory region of `n` elements of + * `type`. + * @return Storage instance that is capable of storing at least `n` + * elements of type `type`. + * @note It doesn't return NULL, even when `n` is zero. + * @warning The return value shall be invalidated exactly once by either + * ruby_xfree(), ruby_xrealloc(), or ruby_xrealloc2(). It is a + * failure to pass it to system free(), because the system and Ruby + * might or might not share the same malloc() implementation. + */ +#define RB_ALLOC_N(type,n) RBIMPL_CAST((type *)ruby_xmalloc2((n), sizeof(type))) + +/** + * Shorthand of #RB_ALLOC_N with `n=1`. + * + * @param type Type of allocation. + * @exception rb_eNoMemError No space left for allocation. + * @return Storage instance that can hold an `type` object. + * @note It doesn't return NULL. + * @warning The return value shall be invalidated exactly once by either + * ruby_xfree(), ruby_xrealloc(), or ruby_xrealloc2(). It is a + * failure to pass it to system free(), because the system and Ruby + * might or might not share the same malloc() implementation. + */ +#define RB_ALLOC(type) RBIMPL_CAST((type *)ruby_xmalloc(sizeof(type))) + +/** + * Identical to #RB_ALLOC_N() but also nullifies the allocated region before + * returning. + * + * @param type Type of array elements. + * @param n Length of the array. + * @exception rb_eNoMemError No space left for allocation. + * @exception rb_eArgError Integer overflow trying to calculate the length + * of continuous memory region of `n` elements of + * `type`. + * @return Storage instance that is capable of storing at least `n` + * elements of type `type`. + * @post Returned array is filled with zeros. + * @note It doesn't return NULL, even when `n` is zero. + * @warning The return value shall be invalidated exactly once by either + * ruby_xfree(), ruby_xrealloc(), or ruby_xrealloc2(). It is a + * failure to pass it to system free(), because the system and Ruby + * might or might not share the same malloc() implementation. + */ +#define RB_ZALLOC_N(type,n) RBIMPL_CAST((type *)ruby_xcalloc((n), sizeof(type))) + +/** + * Shorthand of #RB_ZALLOC_N with `n=1`. + * + * @param type Type of allocation. + * @exception rb_eNoMemError No space left for allocation. + * @return Storage instance that can hold an `type` object. + * @post Returned object is filled with zeros. + * @note It doesn't return NULL. + * @warning The return value shall be invalidated exactly once by either + * ruby_xfree(), ruby_xrealloc(), or ruby_xrealloc2(). It is a + * failure to pass it to system free(), because the system and Ruby + * might or might not share the same malloc() implementation. + */ +#define RB_ZALLOC(type) (RB_ZALLOC_N(type, 1)) + +/** + * Convenient macro that reallocates an array with a new size. + * + * @param var A variable of `type`, which points to a storage + * instance that was previously returned from + * either + * - ruby_xmalloc(), + * - ruby_xmalloc2(), + * - ruby_xcalloc(), + * - ruby_xrealloc(), or + * - ruby_xrealloc2(). + * @param type Type of allocation. + * @param n Requested new size of each element. + * @exception rb_eNoMemError No space left for allocation. + * @exception rb_eArgError Integer overflow trying to calculate the length + * of continuous memory region of `n` elements of + * `type`. + * @return Storage instance that is capable of storing at least `n` + * elements of type `type`. + * @pre The passed variable must point to a valid live storage instance. + * It is a failure to pass a variable that holds an already-freed + * pointer. + * @note It doesn't return NULL, even when `n` is zero. + * @warning Do not assume anything on the alignment of the return value. + * There is no guarantee that it inherits the passed argument's + * one. + * @warning The return value shall be invalidated exactly once by either + * ruby_xfree(), ruby_xrealloc(), or ruby_xrealloc2(). It is a + * failure to pass it to system free(), because the system and Ruby + * might or might not share the same malloc() implementation. + */ +#define RB_REALLOC_N(var,type,n) \ + ((var) = RBIMPL_CAST((type *)ruby_xrealloc2((void *)(var), (n), sizeof(type)))) + +/** + * @deprecated This macro is dangerous (does not bother stack overflow at + * all). #RB_ALLOCV is the modern way to do the same thing. + * @param type Type of array elements. + * @param n Length of the array. + * @return A pointer on stack. + */ +#define ALLOCA_N(type,n) \ + RBIMPL_CAST((type *)alloca(rbimpl_size_mul_or_raise(sizeof(type), (n)))) + +/** + * Identical to #RB_ALLOCV_N(), except that it allocates a number of bytes and + * returns a void* . + * + * @param v A variable to hold the just-in-case opaque Ruby object. + * @param n Size of allocation, in bytes. + * @return A void pointer to `n` bytes storage. + * @note `n` may be evaluated twice. + */ +#define RB_ALLOCV(v, n) \ + ((n) < RUBY_ALLOCV_LIMIT ? \ + ((v) = 0, alloca(n)) : \ + rb_alloc_tmp_buffer(&(v), (n))) + +/** + * Allocates a memory region, possibly on stack. If the given size exceeds + * #RUBY_ALLOCV_LIMIT, it allocates a dedicated opaque ruby object instead and + * let our GC sweep that region after use. Either way you can fire-and-forget. + * + * ```CXX + * #include + * + * VALUE + * foo(int n) + * { + * VALUE v; + * auto ptr = RB_ALLOCV(struct tms, v, n); + * ... + * // no need to free `ptr`. + * } + * ``` + * + * If you want to be super-duper polite you can also explicitly state the end + * of use of such memory region by calling #RB_ALLOCV_END(). + * + * @param type The type of array elements. + * @param v A variable to hold the just-in-case opaque Ruby object. + * @param n Number of elements requested to allocate. + * @return An array of `n` elements of `type`. + * @note `n` may be evaluated twice. + */ +#define RB_ALLOCV_N(type, v, n) \ + RBIMPL_CAST((type *) \ + (((size_t)(n) < RUBY_ALLOCV_LIMIT / sizeof(type)) ? \ + ((v) = 0, alloca((n) * sizeof(type))) : \ + rb_alloc_tmp_buffer2(&(v), (n), sizeof(type)))) + +/** + * Polite way to declare that the given array is not used any longer. Calling + * this not mandatory. Our GC can baby-sit you. However it is not a very bad + * idea to use it when possible. Doing so could reduce memory footprint. + * + * @param v A variable previously passed to either #RB_ALLOCV/#RB_ALLOCV_N. + */ +#define RB_ALLOCV_END(v) rb_free_tmp_buffer(&(v)) + +/** + * Handy macro to erase a region of memory. + * + * @param p Target pointer. + * @param type Type of `p[0]` + * @param n Length of `p`. + * @return `p`. + * @post First `n` elements of `p` are squashed. + */ +#define MEMZERO(p,type,n) memset((p), 0, rbimpl_size_mul_or_raise(sizeof(type), (n))) + +/** + * Handy macro to call memcpy. + * + * @param p1 Destination pointer. + * @param p2 Source pointer. + * @param type Type of `p2[0]` + * @param n Length of `p2`. + * @return `p1`. + * @post First `n` elements of `p2` are copied into `p1`. + */ +#define MEMCPY(p1,p2,type,n) ruby_nonempty_memcpy((p1), (p2), rbimpl_size_mul_or_raise(sizeof(type), (n))) + +/** + * Handy macro to call memmove. + * + * @param p1 Destination pointer. + * @param p2 Source pointer. + * @param type Type of `p2[0]` + * @param n Length of `p2`. + * @return `p1`. + * @post First `n` elements of `p2` are copied into `p1`. + */ +#define MEMMOVE(p1,p2,type,n) memmove((p1), (p2), rbimpl_size_mul_or_raise(sizeof(type), (n))) + +/** + * Handy macro to call memcmp + * + * @param p1 Target LHS. + * @param p2 Target RHS. + * @param type Type of `p1[0]` + * @param n Length of `p1`. + * @retval <0 `p1` is "less" than `p2`. + * @retval 0 `p1` is equal to `p2`. + * @retval >0 `p1` is "greater" than `p2`. + */ +#define MEMCMP(p1,p2,type,n) memcmp((p1), (p2), rbimpl_size_mul_or_raise(sizeof(type), (n))) + +#define ALLOC_N RB_ALLOC_N /**< @old{RB_ALLOC_N} */ +#define ALLOC RB_ALLOC /**< @old{RB_ALLOC} */ +#define ZALLOC_N RB_ZALLOC_N /**< @old{RB_ZALLOC_N} */ +#define ZALLOC RB_ZALLOC /**< @old{RB_ZALLOC} */ +#define REALLOC_N RB_REALLOC_N /**< @old{RB_REALLOC_N} */ +#define ALLOCV RB_ALLOCV /**< @old{RB_ALLOCV} */ +#define ALLOCV_N RB_ALLOCV_N /**< @old{RB_ALLOCV_N} */ +#define ALLOCV_END RB_ALLOCV_END /**< @old{RB_ALLOCV_END} */ + +/** + * @private + * + * This is an implementation detail of rbimpl_size_mul_overflow(). + * + * @internal + * + * Expecting this struct to be eliminated by function inlinings. This is + * nothing more than std::variant if we could use recent C++, but + * reality is we cannot. + */ +struct rbimpl_size_mul_overflow_tag { + bool left; /**< Whether overflow happened or not. */ + size_t right; /**< Multiplication result. */ +}; + +RBIMPL_SYMBOL_EXPORT_BEGIN() +RBIMPL_ATTR_RESTRICT() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((2)) +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail of #RB_ALLOCV(). People don't use this + * directly. + * + * @param[out] store Pointer to a variable. + * @param[in] len Requested number of bytes to allocate. + * @return Allocated `len` bytes array. + * @post `store` holds the corresponding tmp buffer object. + */ +void *rb_alloc_tmp_buffer(volatile VALUE *store, long len); + +RBIMPL_ATTR_RESTRICT() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((2,3)) +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail of #RB_ALLOCV_N(). People don't use this + * directly. + * + * @param[out] store Pointer to a variable. + * @param[in] len Requested number of bytes to allocate. + * @param[in] count Number of elements in an array. + * @return Allocated `len` bytes array. + * @post `store` holds the corresponding tmp buffer object. + * + * @internal + * + * Although the meaning of `count` variable is clear, @shyouhei doesn't + * understand its needs. + */ +void *rb_alloc_tmp_buffer_with_count(volatile VALUE *store, size_t len,size_t count); + +/** + * @private + * + * This is an implementation detail of #RB_ALLOCV_END(). People don't use this + * directly. + * + * @param[out] store Pointer to a variable. + * @pre `store` is a NULL, or a pointer to a tmp buffer object. + * @post `*store` is ::RUBY_Qfalse. + * @post The object formerly stored in `store` is destroyed. + */ +void rb_free_tmp_buffer(volatile VALUE *store); + +RBIMPL_ATTR_NORETURN() +/** + * @private + * + * This is an implementation detail of #RB_ALLOCV_N(). People don't use this + * directly. + * + * @param[in] x Arbitrary value. + * @param[in] y Arbitrary value. + * @exception rb_eArgError `x` * `y` would integer overflow. + */ +void ruby_malloc_size_overflow(size_t x, size_t y); + +#ifdef HAVE_RB_GC_GUARDED_PTR_VAL +volatile VALUE *rb_gc_guarded_ptr_val(volatile VALUE *ptr, VALUE val); +#endif +RBIMPL_SYMBOL_EXPORT_END() + +#ifdef _MSC_VER +# pragma optimize("", off) + +/** + * @private + * + * This is an implementation detail of #RB_GC_GUARD(). People don't use this + * directly. + * + * @param[in] ptr A pointer to an on-stack C variable. + * @return `ptr` as-is. + */ +static inline volatile VALUE * +rb_gc_guarded_ptr(volatile VALUE *ptr) +{ + return ptr; +} + +# pragma optimize("", on) +#endif + +/** + * @deprecated This function was an implementation detail of old + * #RB_ALLOCV_N(). We no longer use it. @shyouhei suspects that + * there are no actual usage now. However it was not marked as + * private before. We cannot delete it any longer. + * @param[in] a Arbitrary value. + * @param[in] b Arbitrary value. + * @param[in] max Possible maximum value. + * @param[out] c A pointer to return the computation result. + * @retval 1 `c` is insane. + * @retval 0 `c` is sane. + * @post `c` holds `a` * `b`, but could be overflowed. + */ +static inline int +rb_mul_size_overflow(size_t a, size_t b, size_t max, size_t *c) +{ +#ifdef DSIZE_T + RB_GNUC_EXTENSION DSIZE_T da, db, c2; + da = a; + db = b; + c2 = da * db; + if (c2 > max) return 1; + *c = RBIMPL_CAST((size_t)c2); +#else + if (b != 0 && a > max / b) return 1; + *c = a * b; +#endif + return 0; +} + +#if defined(__DOXYGEN__) +RBIMPL_ATTR_CONSTEXPR(CXX14) +#elif RBIMPL_COMPILER_SINCE(GCC, 7, 0, 0) +RBIMPL_ATTR_CONSTEXPR(CXX14) /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70507 */ +#elif RBIMPL_COMPILER_SINCE(Clang, 7, 0, 0) +RBIMPL_ATTR_CONSTEXPR(CXX14) /* https://bugs.llvm.org/show_bug.cgi?id=37633 */ +#endif +RBIMPL_ATTR_CONST() +/** + * @private + * + * This is an implementation detail of #RB_ALLOCV_N(). People don't use this + * directly. + * + * @param[in] x Arbitrary value. + * @param[in] y Arbitrary value. + * @return `{ left, right }`, where `left` is whether there is an integer + * overflow or not, and `right` is a (possibly overflowed) result + * of `x` * `y`. + * + * @internal + * + * This is in fact also an implementation detail of ruby_xmalloc2() etc. + */ +static inline struct rbimpl_size_mul_overflow_tag +rbimpl_size_mul_overflow(size_t x, size_t y) +{ + struct rbimpl_size_mul_overflow_tag ret = { false, 0, }; + +#if RBIMPL_HAS_BUILTIN(__builtin_mul_overflow) + ret.left = __builtin_mul_overflow(x, y, &ret.right); + +#elif defined(DSIZE_T) + RB_GNUC_EXTENSION DSIZE_T dx = x; + RB_GNUC_EXTENSION DSIZE_T dy = y; + RB_GNUC_EXTENSION DSIZE_T dz = dx * dy; + ret.left = dz > SIZE_MAX; + ret.right = RBIMPL_CAST((size_t)dz); + +#elif defined(_MSC_VER) && defined(_WIN64) + unsigned __int64 dp = 0; + unsigned __int64 dz = _umul128(x, y, &dp); + ret.left = RBIMPL_CAST((bool)dp); + ret.right = RBIMPL_CAST((size_t)dz); + +#else + /* https://wiki.sei.cmu.edu/confluence/display/c/INT30-C.+Ensure+that+unsigned+integer+operations+do+not+wrap */ + ret.left = (y != 0) && (x > SIZE_MAX / y); + ret.right = x * y; +#endif + + return ret; +} + +/** + * @private + * + * This is an implementation detail of #RB_ALLOCV_N(). People don't use this + * directly. + * + * @param[in] x Arbitrary value. + * @param[in] y Arbitrary value. + * @exception rb_eArgError Multiplication could integer overflow. + * @return `x` * `y`. + * + * @internal + * + * This is in fact also an implementation detail of ruby_xmalloc2() etc. + */ +static inline size_t +rbimpl_size_mul_or_raise(size_t x, size_t y) +{ + struct rbimpl_size_mul_overflow_tag size = + rbimpl_size_mul_overflow(x, y); + + if (RB_LIKELY(! size.left)) { + return size.right; + } + else { + ruby_malloc_size_overflow(x, y); + RBIMPL_UNREACHABLE_RETURN(0); + } +} + +/** + * This is an implementation detail of #RB_ALLOCV_N(). People don't use this + * directly. + * + * @param[out] store Pointer to a variable. + * @param[in] count Number of elements in an array. + * @param[in] elsize Size of each elements. + * @return Region of `count` * `elsize` bytes. + * @post `store` holds the corresponding tmp buffer object. + * + * @internal + * + * We might want to deprecate this function and make a `rbimpl_` counterpart. + */ +static inline void * +rb_alloc_tmp_buffer2(volatile VALUE *store, long count, size_t elsize) +{ + const size_t total_size = rbimpl_size_mul_or_raise(count, elsize); + const size_t cnt = (total_size + sizeof(VALUE) - 1) / sizeof(VALUE); + return rb_alloc_tmp_buffer_with_count(store, total_size, cnt); +} + +RBIMPL_SYMBOL_EXPORT_BEGIN() +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL((1)) +RBIMPL_ATTR_RETURNS_NONNULL() +/* At least since 2004, glibc's annotates memcpy to be + * __attribute__((__nonnull__(1, 2))). However it is safe to pass NULL to the + * source pointer, if n is 0. Let's wrap memcpy. */ +static inline void * +ruby_nonempty_memcpy(void *dest, const void *src, size_t n) +{ + if (n) { + return memcpy(dest, src, n); + } + else { + return dest; + } +} +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_MEMORY_H */ diff --git a/libs/libruby/ruby/internal/method.h b/libs/libruby/ruby/internal/method.h new file mode 100644 index 0000000..19feb0c --- /dev/null +++ b/libs/libruby/ruby/internal/method.h @@ -0,0 +1,205 @@ +#ifndef RBIMPL_METHOD_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_METHOD_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Creation and modification of Ruby methods. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/backward/2/stdarg.h" + +/** + * @defgroup defmethod Defining methods + * + * There are some APIs to define a method from C. + * These API takes a C function as a method body. + * + * ### Method body functions + * + * Method body functions must return a VALUE and + * can be one of the following form: + * + * #### Fixed number of parameters + * + * This form is a normal C function, excepting it takes + * a receiver object as the first argument. + * + * ```CXX + * static VALUE my_method(VALUE self, VALUE x, VALUE y); + * ``` + * + * #### argc and argv style + * + * This form takes three parameters: argc, argv and self. + * self is the receiver. argc is the number of arguments. + * argv is a pointer to an array of the arguments. + * + * ```CXX + * static VALUE my_method(int argc, VALUE *argv, VALUE self); + * ``` + * + * #### Ruby array style + * + * This form takes two parameters: self and args. + * self is the receiver. args is an Array object which + * contains the arguments. + * + * ```CXX + * static VALUE my_method(VALUE self, VALUE args); + * ``` + * + * ### Number of parameters + * + * Method defining APIs takes the number of parameters which the + * method will takes. This number is called argc. + * argc can be: + * + * - Zero or positive number. + * This means the method body function takes a fixed number of parameters. + * + * - `-1`. + * This means the method body function is "argc and argv" style. + * + * - `-2`. + * This means the method body function is "self and args" style. + * + * @{ + */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines a method. + * + * @param[out] klass A module or a class. + * @param[in] mid Name of the function. + * @param[in] func The method body. + * @param[in] arity The number of parameters. See @ref defmethod. + * @note There are in fact 18 different prototypes for func. + * @see ::ruby::backward::cxxanyargs::define_method::rb_define_method + */ +void rb_define_method(VALUE klass, const char *mid, VALUE (*func)(ANYARGS), int arity); + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines a module function for a module. + * + * @param[out] klass A module or a class. + * @param[in] mid Name of the function. + * @param[in] func The method body. + * @param[in] arity The number of parameters. See @ref defmethod. + * @note There are in fact 18 different prototypes for func. + * @see ::ruby::backward::cxxanyargs::define_method::rb_define_module_function + */ +void rb_define_module_function(VALUE klass, const char *mid, VALUE (*func)(ANYARGS), int arity); + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines a global function. + * + * @param[in] mid Name of the function. + * @param[in] func The method body. + * @param[in] arity The number of parameters. See @ref defmethod. + * @note There are in fact 18 different prototypes for func. + * @see ::ruby::backward::cxxanyargs::define_method::rb_define_global_function + */ +void rb_define_global_function(const char *mid, VALUE (*func)(ANYARGS), int arity); + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines an undef of a method. -- What? + * + * In ruby, there are two separate concepts called "undef" and "remove_method". + * The thing you imagine when you "un-define" a method is remove_method. This + * one on the other hand is masking of a previous method definition. Suppose + * for instance: + * + * ```ruby + * class Foo + * def foo + * end + * end + * + * class Bar < Foo + * def bar + * foo + * end + * end + * + * class Baz < Foo + * undef foo # <--- (*1) + * end + * ``` + * + * This `undef foo` at `(*1)` must not eliminate `Foo#foo`, because that method + * is also used from `Bar#bar`. So instead of physically executing the target + * method, `undef` inserts a special filtering entry to the class (`Baz` this + * case). That entry, when called, acts as if there were no methods at all. + * But the original can still be accessible, via ways like `Bar#bar` above. + * + * @param[out] klass The class to insert an undef. + * @param[in] name Name of the undef. + * @exception rb_eTypeError `klass` is a non-module. + * @exception rb_eFrozenError `klass` is frozen. + * @see rb_remove_method + */ +void rb_undef_method(VALUE klass, const char *name); + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines an alias of a method. + * + * @param[in,out] klass The class which the original method belongs + * to; this is also where the new method will + * belong to. + * @param[in] dst A new name for the method. + * @param[in] src The original name of the method. + * @exception rb_eTypeError `klass` is a non-module. + * @exception rb_eFrozenError `klass` is frozen. + * @exception rb_eNameError There is no such method named as `src` in + * `klass`. + * + * @internal + * + * Above description is in fact a bit inaccurate because it ignores + * Refinements. + */ +void rb_define_alias(VALUE klass, const char *dst, const char *src); + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines public accessor method(s) for an attribute. + * + * @param[out] klass The class which the attribute will belong to. + * @param[in] name Name of the attribute. + * @param[in] read Whether to define a getter method. + * @param[in] write Whether to define a setter method. + * @exception rb_eTypeError `klass` is a non-module. + * @exception rb_eFrozenError `klass` is frozen. + * @exception rb_eNameError `name` invalid as an attr e.g. an operator. + */ +void rb_define_attr(VALUE klass, const char *name, int read, int write); + +/** @} */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_METHOD_H */ diff --git a/libs/libruby/ruby/internal/module.h b/libs/libruby/ruby/internal/module.h new file mode 100644 index 0000000..d678dd2 --- /dev/null +++ b/libs/libruby/ruby/internal/module.h @@ -0,0 +1,177 @@ +#ifndef RBIMPL_MODULE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_MODULE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Creation and modification of Ruby modules. + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" + +/** + * @defgroup class Classes and their hierarchy. + * + * @par Terminology + * - class: same as in Ruby. + * - singleton class: class for a particular object. + * - eigenclass: = singleton class + * - metaclass: class of a class. Metaclass is a kind of singleton class. + * - metametaclass: class of a metaclass. + * - meta^(n)-class: class of a meta^(n-1)-class. + * - attached object: A singleton class knows its unique instance. + * The instance is called the attached object for the singleton class. + * @{ + */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines a top-level class. + * + * @param[in] name Name of the class. + * @param[in] super A class from which the new class will derive. + * @exception rb_eTypeError The constant name `name` is already taken but the + * constant is not a class. + * @exception rb_eTypeError The class is already defined but the class can + * not be reopened because its superclass is not + * `super`. + * @exception rb_eArgError `super` is NULL. + * @return The created class. + * @post Top-level constant named `name` refers the returned class. + * @note If a class named `name` is already defined and its superclass is + * `super`, the function just returns the defined class. + * @note The compaction GC does not move classes returned by this + * function. + * + * @internal + * + * There are classes without names, but you can't pass NULL here. You have to + * use other ways to create one. + */ +VALUE rb_define_class(const char *name, VALUE super); + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines a top-level module. + * + * @param[in] name Name of the module. + * @exception rb_eTypeError The constant name `name` is already taken but the + * constant is not a module. + * @return The created module. + * @post Top-level constant named `name` refers the returned module. + * @note The compaction GC does not move classes returned by this + * function. + * + * @internal + * + * There are modules without names, but you can't pass NULL here. You have to + * use other ways to create one. + */ +VALUE rb_define_module(const char *name); + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines a class under the namespace of `outer`. + * + * @param[out] outer A class which contains the new class. + * @param[in] name Name of the new class + * @param[in] super A class from which the new class will derive. + * 0 means ::rb_cObject. + * @exception rb_eTypeError The constant name `name` is already taken but + * the constant is not a class. + * @exception rb_eTypeError The class is already defined but the class can + * not be reopened because its superclass is not + * `super`. + * @exception rb_eArgError `super` is NULL. + * @return The created class. + * @post `outer::name` refers the returned class. + * @note If a class named `name` is already defined and its superclass + * is `super`, the function just returns the defined class. + * @note The compaction GC does not move classes returned by this + * function. + */ +VALUE rb_define_class_under(VALUE outer, const char *name, VALUE super); + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines a module under the namespace of `outer`. + * + * @param[out] outer A class which contains the new module. + * @param[in] name Name of the new module + * @exception rb_eTypeError The constant name `name` is already taken but + * the constant is not a class. + * @return The created module. + * @post `outer::name` refers the returned module. + * @note The compaction GC does not move classes returned by this + * function. + */ +VALUE rb_define_module_under(VALUE outer, const char *name); + +/** + * Includes a module to a class. + * + * @param[out] klass Inclusion destination. + * @param[in] module Inclusion source. + * @exception rb_eArgError Cyclic inclusion. + * + * @internal + * + * :FIXME: @shyouhei suspects this function lacks assertion that the arguments + * being modules... Could silently SEGV if non-module was passed? + */ +void rb_include_module(VALUE klass, VALUE module); + +/** + * Extend the object with the module. + * + * @warning This is the same as `Module#extend_object`, not + * `Object#extend`! These two methods are very similar, but not + * identical. The difference is the hook. `Module#extend_object` + * does not invoke `Module#extended`, while `Object#extend` does. + * @param[out] obj Object to extend. + * @param[in] mod Module of extension. + */ +void rb_extend_object(VALUE obj, VALUE mod); + +/** + * Identical to rb_include_module(), except it "prepends" the passed module to + * the klass, instead of includes. This affects how `super` resolves. For + * instance: + * + * ```ruby + * class Q; def foo; "" end end + * module W; def foo; "#{super}" end end + * class E < Q; include W; def foo; "#{super}" end end + * class R < Q; prepend W; def foo; "#{super}" end end + * + * E.new.foo # => "" + * r.new.foo # => "" + * ``` + * + * @param[out] klass Target class to modify. + * @param[in] module Module to prepend. + * @exception rb_eArgError Cyclic inclusion. + */ +void rb_prepend_module(VALUE klass, VALUE module); + +/** @} */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_MODULE_H */ diff --git a/libs/libruby/ruby/internal/newobj.h b/libs/libruby/ruby/internal/newobj.h new file mode 100644 index 0000000..a8a5557 --- /dev/null +++ b/libs/libruby/ruby/internal/newobj.h @@ -0,0 +1,195 @@ +#ifndef RBIMPL_NEWOBJ_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_NEWOBJ_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #NEWOBJ. + */ +#include "ruby/internal/attr/deprecated.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/fl_type.h" +#include "ruby/internal/special_consts.h" +#include "ruby/internal/value.h" +#include "ruby/assert.h" + +/** + * Declares, allocates, then assigns a new object to the given variable. + * + * @param obj Variable name. + * @param type Variable type. + * @exception rb_eNoMemError No space left. + * @return An allocated object, not initialised. + * @note Modern programs tend to use #NEWOBJ_OF instead. + * + * @internal + * + * :FIXME: Should we deprecate it? + */ +#define RB_NEWOBJ(obj,type) type *(obj) = RBIMPL_CAST((type *)rb_newobj()) + +/** + * Identical to #RB_NEWOBJ, except it also accepts the allocating object's + * class and flags. + * + * @param obj Variable name. + * @param type Variable type. + * @param klass Object's class. + * @param flags Object's flags. + * @exception rb_eNoMemError No space left. + * @return An allocated object, filled with the arguments. + */ +#define RB_NEWOBJ_OF(obj,type,klass,flags) type *(obj) = RBIMPL_CAST((type *)rb_newobj_of(klass, flags)) + +#define NEWOBJ RB_NEWOBJ /**< @old{RB_NEWOBJ} */ +#define NEWOBJ_OF RB_NEWOBJ_OF /**< @old{RB_NEWOBJ_OF} */ +#define OBJSETUP rb_obj_setup /**< @old{rb_obj_setup} */ +#define CLONESETUP rb_clone_setup /**< @old{rb_clone_setup} */ +#define DUPSETUP rb_dup_setup /**< @old{rb_dup_setup} */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * This is the implementation detail of #RB_NEWOBJ. + * + * @exception rb_eNoMemError No space left. + * @return An allocated object, not initialised. + */ +VALUE rb_newobj(void); + +/** + * This is the implementation detail of #RB_NEWOBJ_OF. + * + * @param klass Object's class. + * @param flags Object's flags. + * @exception rb_eNoMemError No space left. + * @return An allocated object, filled with the arguments. + */ +VALUE rb_newobj_of(VALUE klass, VALUE flags); + +/** + * Fills common fields in the object. + * + * @note Prefer rb_newobj_of() to this function. + * @param[in,out] obj A Ruby object to be set up. + * @param[in] klass `obj` will belong to this class. + * @param[in] type One of ::ruby_value_type. + * @return The passed object. + * + * @internal + * + * Historically, authors of Ruby has described the `type` argument as "one of + * ::ruby_value_type". In reality it accepts either ::ruby_value_type, + * ::ruby_fl_type, or any combinations of the two. For instance + * `RUBY_T_STRING | RUBY_FL_FREEZE` is a valid value that this function takes, + * and means this is a frozen string. + * + * 3rd party extension libraries rarely need to allocate Strings this way. + * They normally only concern ::RUBY_T_DATA. This argument is mainly used for + * specifying flags, @shyouhei suspects. + */ +VALUE rb_obj_setup(VALUE obj, VALUE klass, VALUE type); + +/** + * Queries the class of an object. This is not always identical to + * `RBASIC_CLASS(obj)`. It searches for the nearest ancestor skipping + * singleton classes or included modules. + * + * @param[in] obj Object in question. + * @return The object's class, in a normal sense. + */ +VALUE rb_obj_class(VALUE obj); + +/** + * Clones a singleton class. An object can have its own singleton class. OK. + * Then what happens when a program clones such object? The singleton class + * that is attached to the source object must also be cloned. Otherwise a + * singleton object gets shared with two objects, which breaks "singleton"-ness + * of such class. + * + * This is basically an implementation detail of rb_clone_setup(). People + * need not be aware of this working behind-the-scene. + * + * @param[in] obj The object that has its own singleton class. + * @return Cloned singleton class. + */ +VALUE rb_singleton_class_clone(VALUE obj); + +/** + * Attaches a singleton class to its corresponding object. + * + * This is basically an implementation detail of rb_clone_setup(). People + * need not be aware of this working behind-the-scene. + * + * @param[in] klass The singleton class. + * @param[out] obj The object to attach a class. + * @pre The passed two objects must agree with each other that `klass` + * becomes a singleton class of `obj`. + * @post `klass` becomes the singleton class of `obj`. + */ +void rb_singleton_class_attached(VALUE klass, VALUE obj); + +/** + * Copies the list of instance variables. 3rd parties need not know, but there + * are several ways to store an object's instance variables, depending on its + * internal structure. This function makes sense when either of the passed + * objects are using so-called "generic" backend storage. This distinction is + * purely an implementation detail of rb_clone_setup(). People need not be + * aware of this working behind-the-scenes. + * + * @param[out] clone The destination object. + * @param[in] obj The source object. + */ +void rb_copy_generic_ivar(VALUE clone, VALUE obj); +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_DEPRECATED(("This is no longer how Object#clone works.")) +/** + * @deprecated Not sure exactly when but at some time, the implementation of + * `Object#clone` stopped using this function. It remained + * untouched for a while, and then @shyouhei realised that they + * are no longer doing the same thing. It seems nobody seriously + * uses this function any longer. Let's just abandon it. + * + * @param[out] clone The destination object. + * @param[in] obj The source object. + */ +static inline void +rb_clone_setup(VALUE clone, VALUE obj) +{ + return; +} + +RBIMPL_ATTR_DEPRECATED(("This is no longer how Object#dup works.")) +/** + * @deprecated Not sure exactly when but at some time, the implementation of + * `Object#dup` stopped using this function. It remained + * untouched for a while, and then @shyouhei realised that they + * are no longer the same thing. It seems nobody seriously uses + * this function any longer. Let's just abandon it. + * + * @param[out] dup The destination object. + * @param[in] obj The source object. + */ +static inline void +rb_dup_setup(VALUE dup, VALUE obj) +{ + return; +} + +#endif /* RBIMPL_NEWOBJ_H */ diff --git a/libs/libruby/ruby/internal/rgengc.h b/libs/libruby/ruby/internal/rgengc.h new file mode 100644 index 0000000..7ea0444 --- /dev/null +++ b/libs/libruby/ruby/internal/rgengc.h @@ -0,0 +1,443 @@ +#ifndef RBIMPL_RGENGC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_RGENGC_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief RGENGC write-barrier APIs. + * @see Sasada, K., "Gradual write-barrier insertion into a Ruby + * interpreter", in proceedings of the 2019 ACM SIGPLAN + * International Symposium on Memory Management (ISMM 2019), pp + * 115-121, 2019. https://doi.org/10.1145/3315573.3329986 + */ +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/maybe_unused.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/special_consts.h" +#include "ruby/internal/stdbool.h" +#include "ruby/internal/value.h" +#include "ruby/assert.h" + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#undef USE_RGENGC +#define USE_RGENGC 1 + +/** + * @private + * + * This is a compile-time flag to enable/disable incremental GC feature. It + * has to be set at the time ruby itself compiles. Makes no sense for 3rd + * parties. It is safe for them to set this though; that just doesn't change + * anything. + */ +#ifndef USE_RINCGC +# define USE_RINCGC 1 +#endif + +/** + * @deprecated This macro seems broken. Setting this to anything other than + * zero just doesn't compile. We need to KonMari. + */ +#ifndef USE_RGENGC_LOGGING_WB_UNPROTECT +# define USE_RGENGC_LOGGING_WB_UNPROTECT 0 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RArray. It has to be set at the time ruby itself compiles. Makes + * no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_ARRAY +# define RGENGC_WB_PROTECTED_ARRAY 1 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RHash. It has to be set at the time ruby itself compiles. Makes + * no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_HASH +# define RGENGC_WB_PROTECTED_HASH 1 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RStruct. It has to be set at the time ruby itself compiles. Makes + * no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_STRUCT +# define RGENGC_WB_PROTECTED_STRUCT 1 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RString. It has to be set at the time ruby itself compiles. Makes + * no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_STRING +# define RGENGC_WB_PROTECTED_STRING 1 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RObject. It has to be set at the time ruby itself compiles. Makes + * no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_OBJECT +# define RGENGC_WB_PROTECTED_OBJECT 1 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RRegexp. It has to be set at the time ruby itself compiles. Makes + * no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_REGEXP +# define RGENGC_WB_PROTECTED_REGEXP 1 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RClass. It has to be set at the time ruby itself compiles. Makes + * no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_CLASS +# define RGENGC_WB_PROTECTED_CLASS 1 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RFloat. It has to be set at the time ruby itself compiles. Makes + * no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_FLOAT +# define RGENGC_WB_PROTECTED_FLOAT 1 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RComplex. It has to be set at the time ruby itself compiles. + * Makes no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_COMPLEX +# define RGENGC_WB_PROTECTED_COMPLEX 1 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RRational. It has to be set at the time ruby itself compiles. + * Makes no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_RATIONAL +# define RGENGC_WB_PROTECTED_RATIONAL 1 +#endif + +/** + * @private + * + * This is a compile-time flag to enable/disable write barrier for + * struct ::RBignum. It has to be set at the time ruby itself compiles. Makes + * no sense for 3rd parties. + */ +#ifndef RGENGC_WB_PROTECTED_BIGNUM +# define RGENGC_WB_PROTECTED_BIGNUM 1 +#endif + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + * + * @internal + * + * @shyouhei doesn't think anybody uses this right now. + */ +#ifndef RGENGC_WB_PROTECTED_NODE_CREF +# define RGENGC_WB_PROTECTED_NODE_CREF 1 +#endif + +/** + * @defgroup rgengc Write barrier (WB) interfaces: + * + * @note The following core interfaces can be changed in the future. Please + * catch up if you want to insert WB into C-extensions correctly. + * + * @{ + */ + +/** + * Declaration of a "back" pointer. This is a write barrier for new reference + * from "old" generation to "young" generation. It writes `young` into + * `*slot`, which is a pointer inside of `old`. + * + * @param[in] old An old object. + * @param[in] slot A pointer inside of `old`. + * @param[out] young A young object. + */ +#define RB_OBJ_WRITE(old, slot, young) \ + RBIMPL_CAST(rb_obj_write((VALUE)(old), (VALUE *)(slot), (VALUE)(young), __FILE__, __LINE__)) + +/** + * Identical to #RB_OBJ_WRITE(), except it doesn't write any values, but only a + * WB declaration. `oldv` is replaced value with `b` (not used in current + * Ruby). + * + * @param[in] old An old object. + * @param[in] oldv An object previously stored inside of `old`. + * @param[out] young A young object. + */ +#define RB_OBJ_WRITTEN(old, oldv, young) \ + RBIMPL_CAST(rb_obj_written((VALUE)(old), (VALUE)(oldv), (VALUE)(young), __FILE__, __LINE__)) +/** @} */ + +#define OBJ_PROMOTED_RAW RB_OBJ_PROMOTED_RAW /**< @old{RB_OBJ_PROMOTED_RAW} */ +#define OBJ_PROMOTED RB_OBJ_PROMOTED /**< @old{RB_OBJ_PROMOTED} */ +#define OBJ_WB_UNPROTECT RB_OBJ_WB_UNPROTECT /**< @old{RB_OBJ_WB_UNPROTECT} */ + +/** + * Asserts that the passed object is not fenced by write barriers. Objects of + * such property do not contribute to generational GCs. They are scanned + * always. + * + * @param[out] x An object that would not be protected by the barrier. + */ +#define RB_OBJ_WB_UNPROTECT(x) rb_obj_wb_unprotect(x, __FILE__, __LINE__) + +/** + * Identical to #RB_OBJ_WB_UNPROTECT(), except it can also assert that the + * given object is of given type. + * + * @param[in] type One of `ARRAY`, `STRING`, etc. + * @param[out] obj An object of `type` that would not be protected. + * + * @internal + * + * @shyouhei doesn't understand why this has to be visible from extensions. + */ +#define RB_OBJ_WB_UNPROTECT_FOR(type, obj) \ + (RGENGC_WB_PROTECTED_##type ? OBJ_WB_UNPROTECT(obj) : obj) + +/** + * @private + * + * This is an implementation detail of rb_obj_wb_unprotect(). People don't use + * it directly. + */ +#define RGENGC_LOGGING_WB_UNPROTECT rb_gc_unprotect_logging + +/** @cond INTERNAL_MACRO */ +#define RB_OBJ_PROMOTED_RAW RB_OBJ_PROMOTED_RAW +#define RB_OBJ_PROMOTED RB_OBJ_PROMOTED +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() +/** + * This is the implementation of #RB_OBJ_WRITE(). People don't use it + * directly. + * + * @param[in] old An object that points to `young`. + * @param[out] young An object that is referenced from `old`. + */ +void rb_gc_writebarrier(VALUE old, VALUE young); + +/** + * This is the implementation of #RB_OBJ_WB_UNPROTECT(). People don't use it + * directly. + * + * @param[out] obj An object that does not participate in WB. + */ +void rb_gc_writebarrier_unprotect(VALUE obj); + +#if USE_RGENGC_LOGGING_WB_UNPROTECT +/** + * @private + * + * This is the implementation of #RGENGC_LOGGING_WB_UNPROTECT(). People + * don't use it directly. + * + * @param[in] objptr Don't know why this is a pointer to void but in + * reality this is a pointer to an object that is about + * to be un-protected. + * @param[in] filename Pass C's `__FILE__` here. + * @param[in] line Pass C's `__LINE__` here. + */ +void rb_gc_unprotect_logging(void *objptr, const char *filename, int line); +#endif + +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * This is the implementation of #RB_OBJ_PROMOTED(). People don't use it + * directly. + * + * @param[in] obj An object to query. + * @retval true The object is "promoted". + * @retval false The object is young. Have not experienced GC at all. + */ +static inline bool +RB_OBJ_PROMOTED_RAW(VALUE obj) +{ + RBIMPL_ASSERT_OR_ASSUME(RB_FL_ABLE(obj)); + return RB_FL_ANY_RAW(obj, RUBY_FL_PROMOTED); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Tests if the object is "promoted" -- that is, whether the object experienced + * one or more GC marks. + * + * @param[in] obj An object to query. + * @retval true The object is "promoted". + * @retval false The object is young. Have not experienced GC at all. + * @note Hello, is anyone actively calling this function? @shyouhei have + * never seen any actual usages outside of the GC implementation + * itself. + */ +static inline bool +RB_OBJ_PROMOTED(VALUE obj) +{ + if (! RB_FL_ABLE(obj)) { + return false; + } + else { + return RB_OBJ_PROMOTED_RAW(obj); + } +} + +/** + * This is the implementation of #RB_OBJ_WB_UNPROTECT(). People don't use it + * directly. + * + * @param[out] x An object that does not participate in WB. + * @param[in] filename C's `__FILE__` of the caller function. + * @param[in] line C's `__LINE__` of the caller function. + * @return x + */ +static inline VALUE +rb_obj_wb_unprotect( + VALUE x, + RBIMPL_ATTR_MAYBE_UNUSED() + const char *filename, + RBIMPL_ATTR_MAYBE_UNUSED() + int line) +{ +#if USE_RGENGC_LOGGING_WB_UNPROTECT + RGENGC_LOGGING_WB_UNPROTECT(RBIMPL_CAST((void *)x), filename, line); +#endif + rb_gc_writebarrier_unprotect(x); + return x; +} + +/** + * @private + * + * This is the implementation of #RB_OBJ_WRITTEN(). People don't use it + * directly. + * + * @param[in] a An old object. + * @param[in] oldv An object previously stored inside of `old`. + * @param[out] b A young object. + * @param[in] filename C's `__FILE__` of the caller function. + * @param[in] line C's `__LINE__` of the caller function. + * @return a + */ +static inline VALUE +rb_obj_written( + VALUE a, + RBIMPL_ATTR_MAYBE_UNUSED() + VALUE oldv, + VALUE b, + RBIMPL_ATTR_MAYBE_UNUSED() + const char *filename, + RBIMPL_ATTR_MAYBE_UNUSED() + int line) +{ +#if USE_RGENGC_LOGGING_WB_UNPROTECT + RGENGC_LOGGING_OBJ_WRITTEN(a, oldv, b, filename, line); +#endif + + if (!RB_SPECIAL_CONST_P(b)) { + rb_gc_writebarrier(a, b); + } + + return a; +} + +/** + * @private + * + * This is the implementation of #RB_OBJ_WRITE(). People don't use it + * directly. + * + * @param[in] a An old object. + * @param[in] slot A pointer inside of `old`. + * @param[out] b A young object. + * @param[in] filename C's `__FILE__` of the caller function. + * @param[in] line C's `__LINE__` of the caller function. + * @return a + */ +static inline VALUE +rb_obj_write( + VALUE a, VALUE *slot, VALUE b, + RBIMPL_ATTR_MAYBE_UNUSED() + const char *filename, + RBIMPL_ATTR_MAYBE_UNUSED() + int line) +{ +#ifdef RGENGC_LOGGING_WRITE + RGENGC_LOGGING_WRITE(a, slot, b, filename, line); +#endif + + *slot = b; + + rb_obj_written(a, RUBY_Qundef /* ignore `oldv' now */, b, filename, line); + return a; +} + +#endif /* RBIMPL_RGENGC_H */ diff --git a/libs/libruby/ruby/internal/scan_args.h b/libs/libruby/ruby/internal/scan_args.h new file mode 100644 index 0000000..1ed2bf6 --- /dev/null +++ b/libs/libruby/ruby/internal/scan_args.h @@ -0,0 +1,534 @@ +#ifndef RBIMPL_SCAN_ARGS_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_SCAN_ARGS_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Compile-time static implementation of ::rb_scan_args(). + * + * This is a beast. It statically analyses the argument spec string, and + * expands the assignment of variables into dedicated codes. + */ +#include "ruby/assert.h" +#include "ruby/internal/attr/diagnose_if.h" +#include "ruby/internal/attr/error.h" +#include "ruby/internal/attr/forceinline.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/config.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/has/attribute.h" +#include "ruby/internal/intern/array.h" /* rb_ary_new_from_values */ +#include "ruby/internal/intern/error.h" /* rb_error_arity */ +#include "ruby/internal/intern/hash.h" /* rb_hash_dup */ +#include "ruby/internal/intern/proc.h" /* rb_block_proc */ +#include "ruby/internal/iterator.h" /* rb_block_given_p / rb_keyword_given_p */ +#include "ruby/internal/static_assert.h" +#include "ruby/internal/stdbool.h" +#include "ruby/internal/value.h" + +/** + * @name Possible values that you should pass to rb_scan_args_kw(). + * @{ + */ + +/** Same behaviour as rb_scan_args(). */ +#define RB_SCAN_ARGS_PASS_CALLED_KEYWORDS 0 + +/** The final argument should be a hash treated as keywords.*/ +#define RB_SCAN_ARGS_KEYWORDS 1 + +/** + * Treat a final argument as keywords if it is a hash, and not as keywords + * otherwise. + */ +#define RB_SCAN_ARGS_LAST_HASH_KEYWORDS 3 + +/** @} */ + +/** + * @name Possible values that you should pass to rb_funcallv_kw(). + * @{ + */ + +/** Do not pass keywords. */ +#define RB_NO_KEYWORDS 0 + +/** Pass keywords, final argument should be a hash of keywords. */ +#define RB_PASS_KEYWORDS 1 + +/** + * Pass keywords if current method is called with keywords, useful for argument + * delegation + */ +#define RB_PASS_CALLED_KEYWORDS rb_keyword_given_p() + +/** @} */ + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define HAVE_RB_SCAN_ARGS_OPTIONAL_HASH 1 + +RBIMPL_SYMBOL_EXPORT_BEGIN() +RBIMPL_ATTR_NONNULL((2, 3)) +/** + * Retrieves argument from argc and argv to given ::VALUE references according + * to the format string. The format can be described in ABNF as follows: + * + * ``` + * scan-arg-spec := param-arg-spec [keyword-arg-spec] [block-arg-spec] + * + * param-arg-spec := pre-arg-spec [post-arg-spec] / post-arg-spec / + * pre-opt-post-arg-spec + * pre-arg-spec := num-of-leading-mandatory-args + * [num-of-optional-args] + * post-arg-spec := sym-for-variable-length-args + * [num-of-trailing-mandatory-args] + * pre-opt-post-arg-spec := num-of-leading-mandatory-args num-of-optional-args + * num-of-trailing-mandatory-args + * keyword-arg-spec := sym-for-keyword-arg + * block-arg-spec := sym-for-block-arg + * + * num-of-leading-mandatory-args := DIGIT ; The number of leading mandatory + * ; arguments + * num-of-optional-args := DIGIT ; The number of optional arguments + * sym-for-variable-length-args := "*" ; Indicates that variable length + * ; arguments are captured as a ruby + * ; array + * num-of-trailing-mandatory-args := DIGIT ; The number of trailing mandatory + * ; arguments + * sym-for-keyword-arg := ":" ; Indicates that keyword argument + * ; captured as a hash. + * ; If keyword arguments are not + * ; provided, returns nil. + * sym-for-block-arg := "&" ; Indicates that an iterator block + * ; should be captured if given + * ``` + * + * For example, "12" means that the method requires at least one argument, and + * at most receives three (1+2) arguments. So, the format string must be + * followed by three variable references, which are to be assigned to captured + * arguments. For omitted arguments, variables are set to ::RUBY_Qnil. `NULL` + * can be put in place of a variable reference, which means the corresponding + * captured argument(s) should be just dropped. + * + * The number of given arguments, excluding an option hash or iterator block, + * is returned. + * + * @param[in] argc Length of `argv`. + * @param[in] argv Pointer to the arguments to parse. + * @param[in] fmt Format, in the language described above. + * @param[out] ... Variables to fill in. + * @exception rb_eFatal Malformed `fmt`. + * @exception rb_eArgError Arity mismatch. + * @return Actually parsed number of given arguments. + * @post Each values passed to `argv` is filled into the variadic + * arguments, according to the format. + */ +int rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...); + +RBIMPL_ATTR_NONNULL((3, 4)) +/** + * Identical to rb_scan_args(), except it also accepts `kw_splat`. + * + * @param[in] kw_splat How to understand the keyword arguments. + * - RB_SCAN_ARGS_PASS_CALLED_KEYWORDS: Same behaviour as rb_scan_args(). + * - RB_SCAN_ARGS_KEYWORDS: The final argument is a kwarg. + * - RB_SCAN_ARGS_LAST_HASH_KEYWORDS: The final argument is a kwarg, iff it + * is a hash. + * @param[in] argc Length of `argv`. + * @param[in] argv Pointer to the arguments to parse. + * @param[in] fmt Format, in the language described above. + * @param[out] ... Variables to fill in. + * @exception rb_eFatal Malformed `fmt`. + * @exception rb_eArgError Arity mismatch. + * @return Actually parsed number of given arguments. + * @post Each values passed to `argv` is filled into the variadic + * arguments, according to the format. + */ +int rb_scan_args_kw(int kw_splat, int argc, const VALUE *argv, const char *fmt, ...); + +RBIMPL_ATTR_ERROR(("bad scan arg format")) +/** + * @private + * + * This is an implementation detail of rb_scan_args(). People don't use it + * directly. + */ +void rb_scan_args_bad_format(const char*); + +RBIMPL_ATTR_ERROR(("variable argument length doesn't match")) +/** + * @private + * + * This is an implementation detail of rb_scan_args(). People don't use it + * directly. + */ +void rb_scan_args_length_mismatch(const char*,int); + +RBIMPL_SYMBOL_EXPORT_END() + +/** @cond INTERNAL_MACRO */ + +/* If we could use constexpr the following macros could be inline functions + * ... but sadly we cannot. */ + +#define rb_scan_args_isdigit(c) (RBIMPL_CAST((unsigned char)((c)-'0'))<10) + +#define rb_scan_args_count_end(fmt, ofs, vari) \ + ((fmt)[ofs] ? -1 : (vari)) + +#define rb_scan_args_count_block(fmt, ofs, vari) \ + ((fmt)[ofs]!='&' ? \ + rb_scan_args_count_end(fmt, ofs, vari) : \ + rb_scan_args_count_end(fmt, (ofs)+1, (vari)+1)) + +#define rb_scan_args_count_hash(fmt, ofs, vari) \ + ((fmt)[ofs]!=':' ? \ + rb_scan_args_count_block(fmt, ofs, vari) : \ + rb_scan_args_count_block(fmt, (ofs)+1, (vari)+1)) + +#define rb_scan_args_count_trail(fmt, ofs, vari) \ + (!rb_scan_args_isdigit((fmt)[ofs]) ? \ + rb_scan_args_count_hash(fmt, ofs, vari) : \ + rb_scan_args_count_hash(fmt, (ofs)+1, (vari)+((fmt)[ofs]-'0'))) + +#define rb_scan_args_count_var(fmt, ofs, vari) \ + ((fmt)[ofs]!='*' ? \ + rb_scan_args_count_trail(fmt, ofs, vari) : \ + rb_scan_args_count_trail(fmt, (ofs)+1, (vari)+1)) + +#define rb_scan_args_count_opt(fmt, ofs, vari) \ + (!rb_scan_args_isdigit((fmt)[ofs]) ? \ + rb_scan_args_count_var(fmt, ofs, vari) : \ + rb_scan_args_count_var(fmt, (ofs)+1, (vari)+(fmt)[ofs]-'0')) + +#define rb_scan_args_count_lead(fmt, ofs, vari) \ + (!rb_scan_args_isdigit((fmt)[ofs]) ? \ + rb_scan_args_count_var(fmt, ofs, vari) : \ + rb_scan_args_count_opt(fmt, (ofs)+1, (vari)+(fmt)[ofs]-'0')) + +#define rb_scan_args_count(fmt) rb_scan_args_count_lead(fmt, 0, 0) + +#if RBIMPL_HAS_ATTRIBUTE(diagnose_if) +# /* Assertions done in the attribute. */ +# define rb_scan_args_verify(fmt, varc) RBIMPL_ASSERT_NOTHING +#else +# /* At one sight it _seems_ the expressions below could be written using +# * static assertions. The reality is no, they don't. Because fmt is a +# * string literal, any operations against fmt cannot produce the "integer +# * constant expression"s, as defined in ISO/IEC 9899:2018 section 6.6 +# * paragraph #6. Static assertions need such integer constant expressions as +# * defined in ISO/IEC 9899:2018 section 6.7.10 paragraph #3. +# * +# * GCC nonetheless constant-folds this into a no-op, though. */ +# define rb_scan_args_verify(fmt, varc) \ + (sizeof(char[1-2*(rb_scan_args_count(fmt)<0)])!=1 ? \ + rb_scan_args_bad_format(fmt) : \ + sizeof(char[1-2*(rb_scan_args_count(fmt)!=(varc))])!=1 ? \ + rb_scan_args_length_mismatch(fmt, varc) : \ + RBIMPL_ASSERT_NOTHING) +#endif + +static inline bool +rb_scan_args_keyword_p(int kw_flag, VALUE last) +{ + switch (kw_flag) { + case RB_SCAN_ARGS_PASS_CALLED_KEYWORDS: + return !! rb_keyword_given_p(); + case RB_SCAN_ARGS_KEYWORDS: + return true; + case RB_SCAN_ARGS_LAST_HASH_KEYWORDS: + return RB_TYPE_P(last, T_HASH); + default: + return false; + } +} + +RBIMPL_ATTR_FORCEINLINE() +static bool +rb_scan_args_lead_p(const char *fmt) +{ + return rb_scan_args_isdigit(fmt[0]); +} + +RBIMPL_ATTR_FORCEINLINE() +static int +rb_scan_args_n_lead(const char *fmt) +{ + return (rb_scan_args_lead_p(fmt) ? fmt[0]-'0' : 0); +} + +RBIMPL_ATTR_FORCEINLINE() +static bool +rb_scan_args_opt_p(const char *fmt) +{ + return (rb_scan_args_lead_p(fmt) && rb_scan_args_isdigit(fmt[1])); +} + +RBIMPL_ATTR_FORCEINLINE() +static int +rb_scan_args_n_opt(const char *fmt) +{ + return (rb_scan_args_opt_p(fmt) ? fmt[1]-'0' : 0); +} + +RBIMPL_ATTR_FORCEINLINE() +static int +rb_scan_args_var_idx(const char *fmt) +{ + return (!rb_scan_args_lead_p(fmt) ? 0 : !rb_scan_args_isdigit(fmt[1]) ? 1 : 2); +} + +RBIMPL_ATTR_FORCEINLINE() +static bool +rb_scan_args_f_var(const char *fmt) +{ + return (fmt[rb_scan_args_var_idx(fmt)]=='*'); +} + +RBIMPL_ATTR_FORCEINLINE() +static int +rb_scan_args_trail_idx(const char *fmt) +{ + const int idx = rb_scan_args_var_idx(fmt); + return idx+(fmt[idx]=='*'); +} + +RBIMPL_ATTR_FORCEINLINE() +static int +rb_scan_args_n_trail(const char *fmt) +{ + const int idx = rb_scan_args_trail_idx(fmt); + return (rb_scan_args_isdigit(fmt[idx]) ? fmt[idx]-'0' : 0); +} + +RBIMPL_ATTR_FORCEINLINE() +static int +rb_scan_args_hash_idx(const char *fmt) +{ + const int idx = rb_scan_args_trail_idx(fmt); + return idx+rb_scan_args_isdigit(fmt[idx]); +} + +RBIMPL_ATTR_FORCEINLINE() +static bool +rb_scan_args_f_hash(const char *fmt) +{ + return (fmt[rb_scan_args_hash_idx(fmt)]==':'); +} + +RBIMPL_ATTR_FORCEINLINE() +static int +rb_scan_args_block_idx(const char *fmt) +{ + const int idx = rb_scan_args_hash_idx(fmt); + return idx+(fmt[idx]==':'); +} + +RBIMPL_ATTR_FORCEINLINE() +static bool +rb_scan_args_f_block(const char *fmt) +{ + return (fmt[rb_scan_args_block_idx(fmt)]=='&'); +} + +# if 0 +RBIMPL_ATTR_FORCEINLINE() +static int +rb_scan_args_end_idx(const char *fmt) +{ + const int idx = rb_scan_args_block_idx(fmt); + return idx+(fmt[idx]=='&'); +} +# endif + +/* NOTE: Use `char *fmt` instead of `const char *fmt` because of clang's bug*/ +/* https://bugs.llvm.org/show_bug.cgi?id=38095 */ +# define rb_scan_args0(argc, argv, fmt, varc, vars) \ + rb_scan_args_set(RB_SCAN_ARGS_PASS_CALLED_KEYWORDS, argc, argv, \ + rb_scan_args_n_lead(fmt), \ + rb_scan_args_n_opt(fmt), \ + rb_scan_args_n_trail(fmt), \ + rb_scan_args_f_var(fmt), \ + rb_scan_args_f_hash(fmt), \ + rb_scan_args_f_block(fmt), \ + (rb_scan_args_verify(fmt, varc), vars), (char *)fmt, varc) +# define rb_scan_args_kw0(kw_flag, argc, argv, fmt, varc, vars) \ + rb_scan_args_set(kw_flag, argc, argv, \ + rb_scan_args_n_lead(fmt), \ + rb_scan_args_n_opt(fmt), \ + rb_scan_args_n_trail(fmt), \ + rb_scan_args_f_var(fmt), \ + rb_scan_args_f_hash(fmt), \ + rb_scan_args_f_block(fmt), \ + (rb_scan_args_verify(fmt, varc), vars), (char *)fmt, varc) + +RBIMPL_ATTR_FORCEINLINE() +static int +rb_scan_args_set(int kw_flag, int argc, const VALUE *argv, + int n_lead, int n_opt, int n_trail, + bool f_var, bool f_hash, bool f_block, + VALUE *vars[], RB_UNUSED_VAR(const char *fmt), RB_UNUSED_VAR(int varc)) + RBIMPL_ATTR_DIAGNOSE_IF(rb_scan_args_count(fmt) < 0, "bad scan arg format", "error") + RBIMPL_ATTR_DIAGNOSE_IF(rb_scan_args_count(fmt) != varc, "variable argument length doesn't match", "error") +{ + int i, argi = 0, vari = 0; + VALUE *var, hash = Qnil; +#define rb_scan_args_next_param() vars[vari++] + const int n_mand = n_lead + n_trail; + + /* capture an option hash - phase 1: pop from the argv */ + if (f_hash && argc > 0) { + VALUE last = argv[argc - 1]; + if (rb_scan_args_keyword_p(kw_flag, last)) { + hash = rb_hash_dup(last); + argc--; + } + } + + if (argc < n_mand) { + goto argc_error; + } + + /* capture leading mandatory arguments */ + for (i = 0; i < n_lead; i++) { + var = rb_scan_args_next_param(); + if (var) *var = argv[argi]; + argi++; + } + + /* capture optional arguments */ + for (i = 0; i < n_opt; i++) { + var = rb_scan_args_next_param(); + if (argi < argc - n_trail) { + if (var) *var = argv[argi]; + argi++; + } + else { + if (var) *var = Qnil; + } + } + + /* capture variable length arguments */ + if (f_var) { + int n_var = argc - argi - n_trail; + + var = rb_scan_args_next_param(); + if (0 < n_var) { + if (var) *var = rb_ary_new_from_values(n_var, &argv[argi]); + argi += n_var; + } + else { + if (var) *var = rb_ary_new(); + } + } + + /* capture trailing mandatory arguments */ + for (i = 0; i < n_trail; i++) { + var = rb_scan_args_next_param(); + if (var) *var = argv[argi]; + argi++; + } + + /* capture an option hash - phase 2: assignment */ + if (f_hash) { + var = rb_scan_args_next_param(); + if (var) *var = hash; + } + + /* capture iterator block */ + if (f_block) { + var = rb_scan_args_next_param(); + if (rb_block_given_p()) { + *var = rb_block_proc(); + } + else { + *var = Qnil; + } + } + + if (argi == argc) { + return argc; + } + + argc_error: + rb_error_arity(argc, n_mand, f_var ? UNLIMITED_ARGUMENTS : n_mand + n_opt); + UNREACHABLE_RETURN(-1); +#undef rb_scan_args_next_param +} + +/** @endcond */ + +#if defined(__DOXYGEN__) +# /* don't bother */ + +#elif ! defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) +# /* skip */ + +#elif ! defined(HAVE_VA_ARGS_MACRO) +# /* skip */ + +#elif ! defined(__OPTIMIZE__) +# /* skip */ + +#elif defined(HAVE___VA_OPT__) +# define rb_scan_args(argc, argvp, fmt, ...) \ + __builtin_choose_expr( \ + __builtin_constant_p(fmt), \ + rb_scan_args0( \ + argc, argvp, fmt, \ + (sizeof((VALUE*[]){__VA_ARGS__})/sizeof(VALUE*)), \ + ((VALUE*[]){__VA_ARGS__})), \ + (rb_scan_args)(argc, argvp, fmt __VA_OPT__(, __VA_ARGS__))) +# define rb_scan_args_kw(kw_flag, argc, argvp, fmt, ...) \ + __builtin_choose_expr( \ + __builtin_constant_p(fmt), \ + rb_scan_args_kw0( \ + kw_flag, argc, argvp, fmt, \ + (sizeof((VALUE*[]){__VA_ARGS__})/sizeof(VALUE*)), \ + ((VALUE*[]){__VA_ARGS__})), \ + (rb_scan_args_kw)(kw_flag, argc, argvp, fmt __VA_OPT__(, __VA_ARGS__))) + +#elif defined(__STRICT_ANSI__) +# /* skip */ + +#elif defined(__GNUC__) +# define rb_scan_args(argc, argvp, fmt, ...) \ + __builtin_choose_expr( \ + __builtin_constant_p(fmt), \ + rb_scan_args0( \ + argc, argvp, fmt, \ + (sizeof((VALUE*[]){__VA_ARGS__})/sizeof(VALUE*)), \ + ((VALUE*[]){__VA_ARGS__})), \ + (rb_scan_args)(argc, argvp, fmt, __VA_ARGS__)) +# define rb_scan_args_kw(kw_flag, argc, argvp, fmt, ...) \ + __builtin_choose_expr( \ + __builtin_constant_p(fmt), \ + rb_scan_args_kw0( \ + kw_flag, argc, argvp, fmt, \ + (sizeof((VALUE*[]){__VA_ARGS__})/sizeof(VALUE*)), \ + ((VALUE*[]){__VA_ARGS__})), \ + (rb_scan_args_kw)(kw_flag, argc, argvp, fmt, __VA_ARGS__ /**/)) +#endif + +#endif /* RBIMPL_SCAN_ARGS_H */ diff --git a/libs/libruby/ruby/internal/special_consts.h b/libs/libruby/ruby/internal/special_consts.h new file mode 100644 index 0000000..dc0a6b4 --- /dev/null +++ b/libs/libruby/ruby/internal/special_consts.h @@ -0,0 +1,362 @@ +#ifndef RBIMPL_SPECIAL_CONSTS_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_SPECIAL_CONSTS_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines enum ::ruby_special_consts. + * @see Sasada, K., "A Lightweight Representation of Floating-Point + * Numbers on Ruby Interpreter", in proceedings of 10th JSSST + * SIGPPL Workshop on Programming and Programming Languages + * (PPL2008), pp. 9-16, 2008. + */ +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/constexpr.h" +#include "ruby/internal/attr/enum_extensibility.h" +#include "ruby/internal/stdbool.h" +#include "ruby/internal/value.h" + +/** + * @private + * @warning Do not touch this macro. + * @warning It is an implementation detail. + * @warning The value of this macro must match for ruby itself and all + * extension libraries, otherwise serious memory corruption shall + * occur. + */ +#if defined(USE_FLONUM) +# /* Take that. */ +#elif SIZEOF_VALUE >= SIZEOF_DOUBLE +# define USE_FLONUM 1 +#else +# define USE_FLONUM 0 +#endif + +/** This is an old name of #RB_TEST. Not sure which name is preferred. */ +#define RTEST RB_TEST + +#define FIXNUM_P RB_FIXNUM_P /**< @old{RB_FIXNUM_P} */ +#define IMMEDIATE_P RB_IMMEDIATE_P /**< @old{RB_IMMEDIATE_P} */ +#define NIL_P RB_NIL_P /**< @old{RB_NIL_P} */ +#define SPECIAL_CONST_P RB_SPECIAL_CONST_P /**< @old{RB_SPECIAL_CONST_P} */ +#define STATIC_SYM_P RB_STATIC_SYM_P /**< @old{RB_STATIC_SYM_P} */ + +#define Qfalse RUBY_Qfalse /**< @old{RUBY_Qfalse} */ +#define Qnil RUBY_Qnil /**< @old{RUBY_Qnil} */ +#define Qtrue RUBY_Qtrue /**< @old{RUBY_Qtrue} */ +#define Qundef RUBY_Qundef /**< @old{RUBY_Qundef} */ + +#define FIXNUM_FLAG RUBY_FIXNUM_FLAG /**< @old{RUBY_FIXNUM_FLAG} */ +#define FLONUM_FLAG RUBY_FLONUM_FLAG /**< @old{RUBY_FLONUM_FLAG} */ +#define FLONUM_MASK RUBY_FLONUM_MASK /**< @old{RUBY_FLONUM_MASK} */ +#define FLONUM_P RB_FLONUM_P /**< @old{RB_FLONUM_P} */ +#define IMMEDIATE_MASK RUBY_IMMEDIATE_MASK /**< @old{RUBY_IMMEDIATE_MASK} */ +#define SYMBOL_FLAG RUBY_SYMBOL_FLAG /**< @old{RUBY_SYMBOL_FLAG} */ + +/** @cond INTERNAL_MACRO */ +#define RB_FIXNUM_P RB_FIXNUM_P +#define RB_FLONUM_P RB_FLONUM_P +#define RB_IMMEDIATE_P RB_IMMEDIATE_P +#define RB_NIL_P RB_NIL_P +#define RB_SPECIAL_CONST_P RB_SPECIAL_CONST_P +#define RB_STATIC_SYM_P RB_STATIC_SYM_P +#define RB_TEST RB_TEST +#define RB_UNDEF_P RB_UNDEF_P +#define RB_NIL_OR_UNDEF_P RB_NIL_OR_UNDEF_P +/** @endcond */ + +/** special constants - i.e. non-zero and non-fixnum constants */ +enum +RBIMPL_ATTR_ENUM_EXTENSIBILITY(closed) +ruby_special_consts { +#if defined(__DOXYGEN__) + RUBY_Qfalse, /**< @see ::rb_cFalseClass */ + RUBY_Qtrue, /**< @see ::rb_cTrueClass */ + RUBY_Qnil, /**< @see ::rb_cNilClass */ + RUBY_Qundef, /**< Represents so-called undef. */ + RUBY_IMMEDIATE_MASK, /**< Bit mask detecting special consts. */ + RUBY_FIXNUM_FLAG, /**< Flag to denote a fixnum. */ + RUBY_FLONUM_MASK, /**< Bit mask detecting a flonum. */ + RUBY_FLONUM_FLAG, /**< Flag to denote a flonum. */ + RUBY_SYMBOL_FLAG, /**< Flag to denote a static symbol. */ +#elif USE_FLONUM + RUBY_Qfalse = 0x00, /* ...0000 0000 */ + RUBY_Qnil = 0x04, /* ...0000 0100 */ + RUBY_Qtrue = 0x14, /* ...0001 0100 */ + RUBY_Qundef = 0x24, /* ...0010 0100 */ + RUBY_IMMEDIATE_MASK = 0x07, /* ...0000 0111 */ + RUBY_FIXNUM_FLAG = 0x01, /* ...xxxx xxx1 */ + RUBY_FLONUM_MASK = 0x03, /* ...0000 0011 */ + RUBY_FLONUM_FLAG = 0x02, /* ...xxxx xx10 */ + RUBY_SYMBOL_FLAG = 0x0c, /* ...xxxx 1100 */ +#else + RUBY_Qfalse = 0x00, /* ...0000 0000 */ + RUBY_Qnil = 0x02, /* ...0000 0010 */ + RUBY_Qtrue = 0x06, /* ...0000 0110 */ + RUBY_Qundef = 0x0a, /* ...0000 1010 */ + RUBY_IMMEDIATE_MASK = 0x03, /* ...0000 0011 */ + RUBY_FIXNUM_FLAG = 0x01, /* ...xxxx xxx1 */ + RUBY_FLONUM_MASK = 0x00, /* any values ANDed with FLONUM_MASK cannot be FLONUM_FLAG */ + RUBY_FLONUM_FLAG = 0x02, /* ...0000 0010 */ + RUBY_SYMBOL_FLAG = 0x0e, /* ...xxxx 1110 */ +#endif + + RUBY_SPECIAL_SHIFT = 8 /**< Least significant 8 bits are reserved. */ +}; + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Emulates Ruby's "if" statement. + * + * @param[in] obj An arbitrary ruby object. + * @retval false `obj` is either ::RUBY_Qfalse or ::RUBY_Qnil. + * @retval true Anything else. + * + * @internal + * + * It HAS to be `__attribute__((const))` in order for clang to properly deduce + * `__builtin_assume()`. + */ +static inline bool +RB_TEST(VALUE obj) +{ + /* + * if USE_FLONUM + * Qfalse: ....0000 0000 + * Qnil: ....0000 0100 + * ~Qnil: ....1111 1011 + * v ....xxxx xxxx + * ---------------------------- + * RTEST(v) ....xxxx x0xx + * + * if ! USE_FLONUM + * Qfalse: ....0000 0000 + * Qnil: ....0000 0010 + * ~Qnil: ....1111 1101 + * v ....xxxx xxxx + * ---------------------------- + * RTEST(v) ....xxxx xx0x + * + * RTEST(v) can be 0 if and only if (v == Qfalse || v == Qnil). + */ + return obj & ~RUBY_Qnil; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Checks if the given object is nil. + * + * @param[in] obj An arbitrary ruby object. + * @retval true `obj` is ::RUBY_Qnil. + * @retval false Anything else. + */ +static inline bool +RB_NIL_P(VALUE obj) +{ + return obj == RUBY_Qnil; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Checks if the given object is undef. + * + * @param[in] obj An arbitrary ruby object. + * @retval true `obj` is ::RUBY_Qundef. + * @retval false Anything else. + */ +static inline bool +RB_UNDEF_P(VALUE obj) +{ + return obj == RUBY_Qundef; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX14) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Checks if the given object is nil or undef. Can be used to see if + * a keyword argument is not given or given `nil`. + * + * @param[in] obj An arbitrary ruby object. + * @retval true `obj` is ::RUBY_Qnil or ::RUBY_Qundef. + * @retval false Anything else. + */ +static inline bool +RB_NIL_OR_UNDEF_P(VALUE obj) +{ + /* + * if USE_FLONUM + * Qundef: ....0010 0100 + * Qnil: ....0000 0100 + * mask: ....1101 1111 + * common_bits: ....0000 0100 + * --------------------------------- + * Qnil & mask ....0000 0100 + * Qundef & mask ....0000 0100 + * + * if ! USE_FLONUM + * Qundef: ....0000 1010 + * Qnil: ....0000 0010 + * mask: ....1111 0111 + * common_bits: ....0000 0010 + * ---------------------------- + * Qnil & mask ....0000 0010 + * Qundef & mask ....0000 0010 + * + * NIL_OR_UNDEF_P(v) can be true only when v is Qundef or Qnil. + */ + const VALUE mask = ~(RUBY_Qundef ^ RUBY_Qnil); + const VALUE common_bits = RUBY_Qundef & RUBY_Qnil; + return (obj & mask) == common_bits; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Checks if the given object is a so-called Fixnum. + * + * @param[in] obj An arbitrary ruby object. + * @retval true `obj` is a Fixnum. + * @retval false Anything else. + * @note Fixnum was a thing in the 20th century, but it is rather an + * implementation detail today. + */ +static inline bool +RB_FIXNUM_P(VALUE obj) +{ + return obj & RUBY_FIXNUM_FLAG; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX14) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Checks if the given object is a static symbol. + * + * @param[in] obj An arbitrary ruby object. + * @retval true `obj` is a static symbol + * @retval false Anything else. + * @see RB_DYNAMIC_SYM_P() + * @see RB_SYMBOL_P() + * @note These days there are static and dynamic symbols, just like we + * once had Fixnum/Bignum back in the old days. + */ +static inline bool +RB_STATIC_SYM_P(VALUE obj) +{ + RBIMPL_ATTR_CONSTEXPR(CXX14) + const VALUE mask = ~(RBIMPL_VALUE_FULL << RUBY_SPECIAL_SHIFT); + return (obj & mask) == RUBY_SYMBOL_FLAG; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Checks if the given object is a so-called Flonum. + * + * @param[in] obj An arbitrary ruby object. + * @retval true `obj` is a Flonum. + * @retval false Anything else. + * @see RB_FLOAT_TYPE_P() + * @note These days there are Flonums and non-Flonum floats, just like we + * once had Fixnum/Bignum back in the old days. + */ +static inline bool +RB_FLONUM_P(VALUE obj) +{ +#if USE_FLONUM + return (obj & RUBY_FLONUM_MASK) == RUBY_FLONUM_FLAG; +#else + return false; +#endif +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Checks if the given object is an immediate i.e. an object which has no + * corresponding storage inside of the object space. + * + * @param[in] obj An arbitrary ruby object. + * @retval true `obj` is a Flonum. + * @retval false Anything else. + * @see RB_FLOAT_TYPE_P() + * @note The concept of "immediate" is purely C specific. + */ +static inline bool +RB_IMMEDIATE_P(VALUE obj) +{ + return obj & RUBY_IMMEDIATE_MASK; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +RBIMPL_ATTR_ARTIFICIAL() +/** + * Checks if the given object is of enum ::ruby_special_consts. + * + * @param[in] obj An arbitrary ruby object. + * @retval true `obj` is a special constant. + * @retval false Anything else. + */ +static inline bool +RB_SPECIAL_CONST_P(VALUE obj) +{ + return RB_IMMEDIATE_P(obj) || obj == RUBY_Qfalse; +} + +RBIMPL_ATTR_CONST() +RBIMPL_ATTR_CONSTEXPR(CXX11) +/** + * Identical to RB_SPECIAL_CONST_P, except it returns a ::VALUE. + * + * @param[in] obj An arbitrary ruby object. + * @retval RUBY_Qtrue `obj` is a special constant. + * @retval RUBY_Qfalse Anything else. + * + * @internal + * + * This function is to mimic old rb_special_const_p macro but have anyone + * actually used its return value? Wasn't it just something no one needed? + */ +static inline VALUE +rb_special_const_p(VALUE obj) +{ + return RB_SPECIAL_CONST_P(obj) * RUBY_Qtrue; +} + +/** + * @cond INTERNAL_MACRO + * See [ruby-dev:27513] for the following macros. + */ +#define RUBY_Qfalse RBIMPL_CAST((VALUE)RUBY_Qfalse) +#define RUBY_Qtrue RBIMPL_CAST((VALUE)RUBY_Qtrue) +#define RUBY_Qnil RBIMPL_CAST((VALUE)RUBY_Qnil) +#define RUBY_Qundef RBIMPL_CAST((VALUE)RUBY_Qundef) +/** @endcond */ + +#endif /* RBIMPL_SPECIAL_CONSTS_H */ diff --git a/libs/libruby/ruby/internal/static_assert.h b/libs/libruby/ruby/internal/static_assert.h new file mode 100644 index 0000000..594c2b2 --- /dev/null +++ b/libs/libruby/ruby/internal/static_assert.h @@ -0,0 +1,77 @@ +#ifndef RBIMPL_STATIC_ASSERT_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_STATIC_ASSERT_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_STATIC_ASSERT. + */ +#include +#include "ruby/internal/has/extension.h" +#include "ruby/internal/compiler_since.h" + +/** @cond INTERNAL_MACRO */ +#if defined(__cplusplus) && defined(__cpp_static_assert) +# /* https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations */ +# define RBIMPL_STATIC_ASSERT0 static_assert + +#elif defined(__cplusplus) && RBIMPL_COMPILER_SINCE(MSVC, 16, 0, 0) +# define RBIMPL_STATIC_ASSERT0 static_assert + +#elif defined(__INTEL_CXX11_MODE__) +# define RBIMPL_STATIC_ASSERT0 static_assert + +#elif defined(__cplusplus) && __cplusplus >= 201103L +# define RBIMPL_STATIC_ASSERT0 static_assert + +#elif defined(__cplusplus) && RBIMPL_HAS_EXTENSION(cxx_static_assert) +# define RBIMPL_STATIC_ASSERT0 __extension__ static_assert + +#elif defined(__GXX_EXPERIMENTAL_CXX0X__) && __GXX_EXPERIMENTAL_CXX0X__ +# define RBIMPL_STATIC_ASSERT0 __extension__ static_assert + +#elif defined(__STDC_VERSION__) && RBIMPL_HAS_EXTENSION(c_static_assert) +# define RBIMPL_STATIC_ASSERT0 __extension__ _Static_assert + +#elif defined(__STDC_VERSION__) && RBIMPL_COMPILER_SINCE(GCC, 4, 6, 0) +# define RBIMPL_STATIC_ASSERT0 __extension__ _Static_assert + +#elif defined(static_assert) +# /* Take definition */ +# define RBIMPL_STATIC_ASSERT0 static_assert +#endif +/** @endcond */ + +/** + * @brief Wraps (or simulates) `static_assert` + * @param name Valid C/C++ identifier, describing the assertion. + * @param expr Expression to assert. + * @note `name` shall not be a string literal. + */ +#if defined(__DOXYGEN__) +# define RBIMPL_STATIC_ASSERT static_assert + +#elif defined(RBIMPL_STATIC_ASSERT0) +# define RBIMPL_STATIC_ASSERT(name, expr) \ + RBIMPL_STATIC_ASSERT0(expr, # name ": " # expr) + +#else +# define RBIMPL_STATIC_ASSERT(name, expr) \ + typedef int static_assert_ ## name ## _check[1 - 2 * !(expr)] +#endif + +#endif /* RBIMPL_STATIC_ASSERT_H */ diff --git a/libs/libruby/ruby/internal/stdalign.h b/libs/libruby/ruby/internal/stdalign.h new file mode 100644 index 0000000..ec68f6a --- /dev/null +++ b/libs/libruby/ruby/internal/stdalign.h @@ -0,0 +1,135 @@ +#ifndef RBIMPL_STDALIGN_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_STDALIGN_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_ALIGNAS / #RBIMPL_ALIGNOF + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#include "ruby/internal/compiler_is.h" +#include "ruby/internal/has/attribute.h" +#include "ruby/internal/has/declspec_attribute.h" +#include "ruby/internal/has/feature.h" + +/** + * Wraps (or simulates) `alignas`. This is C++11's `alignas` and is _different_ + * from C11 `_Alignas`. For instance, + * + * ```CXX + * typedef struct alignas(128) foo { int foo } foo; + * ``` + * + * is a valid C++ while + * + * ```C + * typedef struct _Alignas(128) foo { int foo } foo; + * ``` + * + * is an invalid C because: + * + * - You cannot `struct _Alignas`. + * - A `typedef` cannot have alignments. + */ +#if defined(__cplusplus) && RBIMPL_HAS_FEATURE(cxx_alignas) +# define RBIMPL_ALIGNAS alignas + +#elif defined(__cplusplus) && (__cplusplus >= 201103L) +# define RBIMPL_ALIGNAS alignas + +#elif defined(__INTEL_CXX11_MODE__) +# define RBIMPL_ALIGNAS alignas + +#elif defined(__GXX_EXPERIMENTAL_CXX0X__) +# define RBIMPL_ALIGNAS alignas + +#elif RBIMPL_HAS_DECLSPEC_ATTRIBUTE(align) +# define RBIMPL_ALIGNAS(_) __declspec(align(_)) + +#elif RBIMPL_HAS_ATTRIBUTE(aligned) +# define RBIMPL_ALIGNAS(_) __attribute__((__aligned__(_))) + +#else +# define RBIMPL_ALIGNAS(_) /* void */ +#endif + +/** + * Wraps (or simulates) `alignof`. + * + * We want C11's `_Alignof`. However in spite of its clear language, compilers + * (including GCC and clang) tend to have buggy implementations. We have to + * avoid such things to resort to our own version. + * + * @see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=52023 + * @see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69560 + * @see https://bugs.llvm.org/show_bug.cgi?id=26547 + */ +#if defined(__DOXYGEN__) +# define RBIMPL_ALIGNOF alignof +#elif defined(__cplusplus) +# /* C++11 `alignof()` can be buggy. */ +# /* see: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69560 */ +# /* But don't worry, we can use templates. */ +# define RBIMPL_ALIGNOF(T) (static_cast(ruby::rbimpl_alignof::value)) + +namespace ruby { +template +struct rbimpl_alignof { + typedef struct { + char _; + T t; + } type; + + enum { + value = offsetof(type, t) + }; +}; +} + +#elif RBIMPL_COMPILER_IS(MSVC) +# /* Windows have no alignment glitch.*/ +# define RBIMPL_ALIGNOF __alignof + +#elif defined(HAVE__ALIGNOF) +# /* Autoconf detected availability of a sane `_Alignof()`. */ +# define RBIMPL_ALIGNOF(T) RB_GNUC_EXTENSION(_Alignof(T)) + +#else +# /* :BEWARE: This is the last resort. If your compiler somehow supports +# * querying the alignment of a type, you definitely should use that instead. +# * There are 2 known pitfalls for this fallback implementation: +# * +# * First, it is either an undefined behaviour (C) or an explicit error (C++) +# * to define a struct inside of `offsetof`. C compilers tend to accept such +# * things, but AFAIK C++ has no room to allow. +# * +# * Second, there exist T such that `struct { char _; T t; }` is invalid. A +# * known example is when T is a struct with a flexible array member. Such +# * struct cannot be enclosed into another one. +# */ +# /* see: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2083.htm */ +# /* see: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2350.htm */ +# define RBIMPL_ALIGNOF(T) offsetof(struct { char _; T t; }, t) + +#endif + +#endif /* RBIMPL_STDALIGN_H */ diff --git a/libs/libruby/ruby/internal/stdbool.h b/libs/libruby/ruby/internal/stdbool.h new file mode 100644 index 0000000..1ca6113 --- /dev/null +++ b/libs/libruby/ruby/internal/stdbool.h @@ -0,0 +1,51 @@ +#ifndef RBIMPL_STDBOOL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_STDBOOL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief C99 shim for + */ +#include "ruby/internal/config.h" + +#if defined(__bool_true_false_are_defined) +# /* Take that. */ + +#elif defined(__cplusplus) +# /* bool is a keyword in C++. */ +# if defined(HAVE_STDBOOL_H) && (__cplusplus >= 201103L) +# include +# endif +# +# ifndef __bool_true_false_are_defined +# define __bool_true_false_are_defined +# endif + +#elif defined(HAVE_STDBOOL_H) +# /* Take stdbool.h definition. */ +# include + +#elif !defined(HAVE__BOOL) +typedef unsigned char _Bool; +# /* See also http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2229.htm */ +# define bool _Bool +# define true ((_Bool)+1) +# define false ((_Bool)+0) +# define __bool_true_false_are_defined +#endif + +#endif /* RBIMPL_STDBOOL_H */ diff --git a/libs/libruby/ruby/internal/symbol.h b/libs/libruby/ruby/internal/symbol.h new file mode 100644 index 0000000..869a311 --- /dev/null +++ b/libs/libruby/ruby/internal/symbol.h @@ -0,0 +1,332 @@ +#ifndef RBIMPL_SYMBOL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_SYMBOL_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #rb_intern + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#ifdef HAVE_STRING_H +# include +#endif + +#include "ruby/internal/attr/noalias.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/constant_p.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/has/builtin.h" +#include "ruby/internal/value.h" + +#define RB_ID2SYM rb_id2sym /**< @alias{rb_id2sym} */ +#define RB_SYM2ID rb_sym2id /**< @alias{rb_sym2id} */ +#define ID2SYM RB_ID2SYM /**< @old{RB_ID2SYM} */ +#define SYM2ID RB_SYM2ID /**< @old{RB_SYM2ID} */ +#define CONST_ID_CACHE RUBY_CONST_ID_CACHE /**< @old{RUBY_CONST_ID_CACHE} */ +#define CONST_ID RUBY_CONST_ID /**< @old{RUBY_CONST_ID} */ + +/** @cond INTERNAL_MACRO */ +#define rb_intern_const rb_intern_const +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Converts an instance of ::rb_cSymbol into an ::ID. + * + * @param[in] obj An instance of ::rb_cSymbol. + * @exception rb_eTypeError `obj` is not an instance of ::rb_cSymbol. + * @return An ::ID of the identical symbol. + */ +ID rb_sym2id(VALUE obj); + +/** + * Allocates an instance of ::rb_cSymbol that has the given id. + * + * @param[in] id An id. + * @retval RUBY_Qfalse No such id ever existed in the history. + * @retval Otherwise An allocated ::rb_cSymbol instance. + */ +VALUE rb_id2sym(ID id); + +RBIMPL_ATTR_NONNULL(()) +/** + * Finds or creates a symbol of the given name. + * + * @param[in] name The name of the id. + * @exception rb_eRuntimeError Too many symbols. + * @return A (possibly new) id whose value is the given name. + * @note These days Ruby internally has two kinds of symbols (static / + * dynamic). Symbols created using this function would become a + * static one; i.e. would never be garbage collected. It is up to + * you to avoid memory leaks. Think twice before using it. + */ +ID rb_intern(const char *name); + +/** + * Identical to rb_intern(), except it additionally takes the length of the + * string. This way you can have a symbol that contains NUL characters. + * + * @param[in] name The name of the id. + * @param[in] len Length of `name`. + * @exception rb_eRuntimeError Too many symbols. + * @return A (possibly new) id whose value is the given name. + * @note These days Ruby internally has two kinds of symbols + * (static/dynamic). Symbols created using this function would + * become static ones; i.e. would never be garbage collected. It + * is up to you to avoid memory leaks. Think twice before using + * it. + */ +ID rb_intern2(const char *name, long len); + +/** + * Identical to rb_intern(), except it takes an instance of ::rb_cString. + * + * @param[in] str The name of the id. + * @pre `str` must either be an instance of ::rb_cSymbol, or an instance + * of ::rb_cString, or responds to `#to_str` method. + * @exception rb_eTypeError Can't convert `str` into ::rb_cString. + * @exception rb_eRuntimeError Too many symbols. + * @return A (possibly new) id whose value is the given str. + * @note These days Ruby internally has two kinds of symbols + * (static/dynamic). Symbols created using this function would + * become static ones; i.e. would never be garbage collected. It + * is up to you to avoid memory leaks. Think twice before using + * it. + */ +ID rb_intern_str(VALUE str); + +/** + * Retrieves the name mapped to the given id. + * + * @param[in] id An id to query. + * @retval NULL No such id ever existed in the history. + * @retval otherwise A name that the id represents. + * @note The return value is managed by the interpreter. Don't pass it + * to free(). + */ +const char *rb_id2name(ID id); + +RBIMPL_ATTR_NONNULL(()) +/** + * Detects if the given name is already interned or not. It first tries to + * convert the argument to an instance of ::rb_cString if it is neither an + * instance of ::rb_cString nor ::rb_cSymbol. The conversion result is written + * back to the variable. Then queries if that name was already interned + * before. If found it returns such id, otherwise zero. + * + * We eventually introduced this API to avoid inadvertent symbol pin-down. + * Before, there was no way to know if an ID was already interned or not + * without actually creating one (== leaking memory). By using this API you + * can avoid such situations: + * + * ```CXX + * bool does_interning_this_leak_memory(VALUE obj) + * { + * auto tmp = obj; + * if (auto id = rb_check_id(&tmp); id) { + * return false; + * } + * else { + * return true; // Let GC sweep tmp if necessary. + * } + * } + * ``` + * + * @param[in,out] namep A pointer to a name to query. + * @pre The object referred by `*namep` must either be an instance + * of ::rb_cSymbol, or an instance of ::rb_cString, or responds + * to `#to_str` method. + * @exception rb_eTypeError Can't convert `*namep` into ::rb_cString. + * @exception rb_eEncodingError Given string is non-ASCII. + * @retval 0 No such id ever existed in the history. + * @retval otherwise The id that represents the given name. + * @post The object that `*namep` points to is a converted result + * object, which is always an instance of either ::rb_cSymbol + * or ::rb_cString. + * @see https://bugs.ruby-lang.org/issues/5072 + * + * @internal + * + * @shyouhei doesn't know why this has to raise rb_eEncodingError. + */ +ID rb_check_id(volatile VALUE *namep); + +/** + * @copydoc rb_intern_str() + * + * @internal + * + * :FIXME: Can anyone tell us what is the difference between this one and + * rb_intern_str()? As far as @shyouhei reads the implementation it seems what + * rb_to_id() does is is just waste some CPU time, then call rb_intern_str(). + * He hopes he is wrong. + */ +ID rb_to_id(VALUE str); + +/** + * Identical to rb_id2name(), except it returns a Ruby's String instead of C's. + * + * @param[in] id An id to query. + * @retval RUBY_Qfalse No such id ever existed in the history. + * @retval otherwise An instance of ::rb_cString with the name of id. + * + * @internal + * + * In reality "rb_id2str() is identical to rb_id2name() except it returns Ruby + * string" is just describing things upside down; truth is `rb_id2name(foo)` is + * a shorthand of `RSTRING_PTR(rb_id2str(foo))`. + */ +VALUE rb_id2str(ID id); + +/** + * Identical to rb_id2str(), except it takes an instance of ::rb_cSymbol rather + * than an ::ID. + * + * @param[in] id An id to query. + * @retval RUBY_Qfalse No such id ever existed in the history. + * @retval otherwise An instance of ::rb_cString with the name of id. + */ +VALUE rb_sym2str(VALUE id); + +/** + * Identical to rb_intern_str(), except it generates a dynamic symbol if + * necessary. + * + * @param[in] name The name of the id. + * @pre `name` must either be an instance of ::rb_cSymbol, or an + * instance of ::rb_cString, or responds to `#to_str` method. + * @exception rb_eTypeError Can't convert `name` into ::rb_cString. + * @exception rb_eRuntimeError Too many symbols. + * @return A (possibly new) id whose value is the given name. + * @note These days Ruby internally has two kinds of symbols + * (static/dynamic). Symbols created using this function would + * become dynamic ones; i.e. would be garbage collected. It could + * be safer for you to use it than alternatives, when applicable. + */ +VALUE rb_to_symbol(VALUE name); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_check_id(), except it returns an instance of ::rb_cSymbol + * instead. + * + * @param[in,out] namep A pointer to a name to query. + * @pre The object referred by `*namep` must either be an instance + * of ::rb_cSymbol, or an instance of ::rb_cString, or responds + * to `#to_str` method. + * @exception rb_eTypeError Can't convert `*namep` into ::rb_cString. + * @exception rb_eEncodingError Given string is non-ASCII. + * @retval RUBY_Qnil No such id ever existed in the history. + * @retval otherwise The id that represents the given name. + * @post The object that `*namep` points to is a converted result + * object, which is always an instance of either ::rb_cSymbol + * or ::rb_cString. + * @see https://bugs.ruby-lang.org/issues/5072 + * + * @internal + * + * @shyouhei doesn't know why this has to raise rb_eEncodingError. + */ +VALUE rb_check_symbol(volatile VALUE *namep); +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_PURE() +RBIMPL_ATTR_NONNULL(()) +/** + * This is a "tiny optimisation" over rb_intern(). If you pass a string + * _literal_, and if your C compiler can special-case strlen of such literal to + * strength-reduce into an integer constant expression, then this inline + * function can precalc a part of conversion. + * + * @note This function also works happily for non-constant strings. Why + * bother then? Just apply liberally to everything. + * @note But #rb_intern() could be faster on compilers with statement + * expressions, because they can cache the created ::ID. + * @param[in] str The name of the id. + * @exception rb_eRuntimeError Too many symbols. + * @return A (possibly new) id whose value is the given str. + * @note These days Ruby internally has two kinds of symbols (static / + * dynamic). Symbols created using this function would become a + * static one; i.e. would never be garbage collected. It is up to + * you to avoid memory leaks. Think twice before using it. + */ +static inline ID +rb_intern_const(const char *str) +{ + size_t len = strlen(str); + return rb_intern2(str, RBIMPL_CAST((long)len)); +} + +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL(()) +/** + * @private + * + * This is an implementation detail of #rb_intern(). Just don't use it. + */ +static inline ID +rbimpl_intern_const(ID *ptr, const char *str) +{ + while (! *ptr) { + *ptr = rb_intern_const(str); + } + + return *ptr; +} + +/** + * Old implementation detail of rb_intern(). + * @deprecated Does anyone use it? Preserved for backward compat. + */ +#define RUBY_CONST_ID_CACHE(result, str) \ + { \ + static ID rb_intern_id_cache; \ + rbimpl_intern_const(&rb_intern_id_cache, (str)); \ + result rb_intern_id_cache; \ + } + +/** + * Old implementation detail of rb_intern(). + * @deprecated Does anyone use it? Preserved for backward compat. + */ +#define RUBY_CONST_ID(var, str) \ + do { \ + static ID rbimpl_id; \ + (var) = rbimpl_intern_const(&rbimpl_id, (str)); \ + } while (0) + +#if defined(HAVE_STMT_AND_DECL_IN_EXPR) +/* __builtin_constant_p and statement expression is available + * since gcc-2.7.2.3 at least. */ +#define rb_intern(str) \ + (RBIMPL_CONSTANT_P(str) ? \ + __extension__ ({ \ + static ID rbimpl_id; \ + rbimpl_intern_const(&rbimpl_id, (str)); \ + }) : \ + (rb_intern)(str)) +#endif + +#endif /* RBIMPL_SYMBOL_H */ diff --git a/libs/libruby/ruby/internal/value.h b/libs/libruby/ruby/internal/value.h new file mode 100644 index 0000000..805cd83 --- /dev/null +++ b/libs/libruby/ruby/internal/value.h @@ -0,0 +1,133 @@ +#ifndef RBIMPL_VALUE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_VALUE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines ::VALUE and ::ID. + */ +#include "ruby/internal/static_assert.h" +#include "ruby/backward/2/long_long.h" +#include "ruby/backward/2/limits.h" + +#if defined(__DOXYGEN__) + +/** + * Type that represents a Ruby object. It is an unsigned integer of some kind, + * depending on platforms. + * + * ```CXX + * VALUE value = rb_eval_string("ARGF.readlines.map.with_index"); + * ``` + * + * @warning ::VALUE is not a pointer. + * @warning ::VALUE can be wider than `long`. + */ +typedef uintptr_t VALUE; + +/** + * Type that represents a Ruby identifier such as a variable name. + * + * ```CXX + * ID method = rb_intern("method"); + * VALUE result = rb_funcall(obj, method, 0); + * ``` + * + * @note ::rb_cSymbol is a Ruby-level data type for the same thing. + */ +typedef uintptr_t ID; + +/** + * A signed integer type that has the same width with ::VALUE. + * + * @internal + * + * @shyouhei wonders: is it guaranteed that `uintptr_t` and `intptr_t` are the + * same width? As far as I read ISO/IEC 9899:2018 section 7.20.1.4 paragraph 1 + * no such description is given... or defined elsewhere? + */ +typedef intptr_t SIGNED_VALUE; + +/** + * Identical to `sizeof(VALUE)`, except it is a macro that can also be used + * inside of preprocessor directives such as `#if`. Handy on occasions. + */ +#define SIZEOF_VALUE SIZEOF_UINTPTR_T + +/** + * @private + * + * A compile-time constant of type ::VALUE whose value is 0. + */ +#define RBIMPL_VALUE_NULL UINTPTR_C(0) + +/** + * @private + * + * A compile-time constant of type ::VALUE whose value is 1. + */ +#define RBIMPL_VALUE_ONE UINTPTR_C(1) + +/** + * @private + * + * Maximum possible value that a ::VALUE can take. + */ +#define RBIMPL_VALUE_FULL UINTPTR_MAX + +#elif defined HAVE_UINTPTR_T && 0 +typedef uintptr_t VALUE; +typedef uintptr_t ID; +# define SIGNED_VALUE intptr_t +# define SIZEOF_VALUE SIZEOF_UINTPTR_T +# undef PRI_VALUE_PREFIX +# define RBIMPL_VALUE_NULL UINTPTR_C(0) +# define RBIMPL_VALUE_ONE UINTPTR_C(1) +# define RBIMPL_VALUE_FULL UINTPTR_MAX + +#elif SIZEOF_LONG == SIZEOF_VOIDP +typedef unsigned long VALUE; +typedef unsigned long ID; +# define SIGNED_VALUE long +# define SIZEOF_VALUE SIZEOF_LONG +# define PRI_VALUE_PREFIX "l" +# define RBIMPL_VALUE_NULL 0UL +# define RBIMPL_VALUE_ONE 1UL +# define RBIMPL_VALUE_FULL ULONG_MAX + +#elif SIZEOF_LONG_LONG == SIZEOF_VOIDP +typedef unsigned LONG_LONG VALUE; +typedef unsigned LONG_LONG ID; +# define SIGNED_VALUE LONG_LONG +# define LONG_LONG_VALUE 1 +# define SIZEOF_VALUE SIZEOF_LONG_LONG +# define PRI_VALUE_PREFIX PRI_LL_PREFIX +# define RBIMPL_VALUE_NULL 0ULL +# define RBIMPL_VALUE_ONE 1ULL +# define RBIMPL_VALUE_FULL ULLONG_MAX + +#else +# error ---->> ruby requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<---- +#endif + +/** @cond INTERNAL_MACRO */ +RBIMPL_STATIC_ASSERT(sizeof_int, SIZEOF_INT == sizeof(int)); +RBIMPL_STATIC_ASSERT(sizeof_long, SIZEOF_LONG == sizeof(long)); +RBIMPL_STATIC_ASSERT(sizeof_long_long, SIZEOF_LONG_LONG == sizeof(LONG_LONG)); +RBIMPL_STATIC_ASSERT(sizeof_voidp, SIZEOF_VOIDP == sizeof(void *)); +/** @endcond */ +#endif /* RBIMPL_VALUE_H */ diff --git a/libs/libruby/ruby/internal/value_type.h b/libs/libruby/ruby/internal/value_type.h new file mode 100644 index 0000000..977f60a --- /dev/null +++ b/libs/libruby/ruby/internal/value_type.h @@ -0,0 +1,449 @@ +#ifndef RBIMPL_VALUE_TYPE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_VALUE_TYPE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines enum ::ruby_value_type. + */ +#include "ruby/internal/assume.h" +#include "ruby/internal/attr/artificial.h" +#include "ruby/internal/attr/cold.h" +#include "ruby/internal/attr/enum_extensibility.h" +#include "ruby/internal/attr/forceinline.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/cast.h" +#include "ruby/internal/constant_p.h" +#include "ruby/internal/core/rbasic.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/error.h" +#include "ruby/internal/has/builtin.h" +#include "ruby/internal/special_consts.h" +#include "ruby/internal/stdbool.h" +#include "ruby/internal/value.h" +#include "ruby/assert.h" + +#if defined(T_DATA) +/* + * :!BEWARE!: (Recent?) Solaris' have conflicting definition of + * T_DATA. Let us stop here. Please have a workaround like this: + * + * ```C + * #include // <- Include this one first. + * #undef T_DATA // <- ... and stick to RUBY_T_DATA forever. + * #include // <- OS-provided T_DATA introduced. + * ``` + * + * See also [ruby-core:4261] + */ +# error Bail out due to conflicting definition of T_DATA. +#endif + +#define T_ARRAY RUBY_T_ARRAY /**< @old{RUBY_T_ARRAY} */ +#define T_BIGNUM RUBY_T_BIGNUM /**< @old{RUBY_T_BIGNUM} */ +#define T_CLASS RUBY_T_CLASS /**< @old{RUBY_T_CLASS} */ +#define T_COMPLEX RUBY_T_COMPLEX /**< @old{RUBY_T_COMPLEX} */ +#define T_DATA RUBY_T_DATA /**< @old{RUBY_T_DATA} */ +#define T_FALSE RUBY_T_FALSE /**< @old{RUBY_T_FALSE} */ +#define T_FILE RUBY_T_FILE /**< @old{RUBY_T_FILE} */ +#define T_FIXNUM RUBY_T_FIXNUM /**< @old{RUBY_T_FIXNUM} */ +#define T_FLOAT RUBY_T_FLOAT /**< @old{RUBY_T_FLOAT} */ +#define T_HASH RUBY_T_HASH /**< @old{RUBY_T_HASH} */ +#define T_ICLASS RUBY_T_ICLASS /**< @old{RUBY_T_ICLASS} */ +#define T_IMEMO RUBY_T_IMEMO /**< @old{RUBY_T_IMEMO} */ +#define T_MASK RUBY_T_MASK /**< @old{RUBY_T_MASK} */ +#define T_MATCH RUBY_T_MATCH /**< @old{RUBY_T_MATCH} */ +#define T_MODULE RUBY_T_MODULE /**< @old{RUBY_T_MODULE} */ +#define T_MOVED RUBY_T_MOVED /**< @old{RUBY_T_MOVED} */ +#define T_NIL RUBY_T_NIL /**< @old{RUBY_T_NIL} */ +#define T_NODE RUBY_T_NODE /**< @old{RUBY_T_NODE} */ +#define T_NONE RUBY_T_NONE /**< @old{RUBY_T_NONE} */ +#define T_OBJECT RUBY_T_OBJECT /**< @old{RUBY_T_OBJECT} */ +#define T_RATIONAL RUBY_T_RATIONAL /**< @old{RUBY_T_RATIONAL} */ +#define T_REGEXP RUBY_T_REGEXP /**< @old{RUBY_T_REGEXP} */ +#define T_STRING RUBY_T_STRING /**< @old{RUBY_T_STRING} */ +#define T_STRUCT RUBY_T_STRUCT /**< @old{RUBY_T_STRUCT} */ +#define T_SYMBOL RUBY_T_SYMBOL /**< @old{RUBY_T_SYMBOL} */ +#define T_TRUE RUBY_T_TRUE /**< @old{RUBY_T_TRUE} */ +#define T_UNDEF RUBY_T_UNDEF /**< @old{RUBY_T_UNDEF} */ +#define T_ZOMBIE RUBY_T_ZOMBIE /**< @old{RUBY_T_ZOMBIE} */ + +#define BUILTIN_TYPE RB_BUILTIN_TYPE /**< @old{RB_BUILTIN_TYPE} */ +#define DYNAMIC_SYM_P RB_DYNAMIC_SYM_P /**< @old{RB_DYNAMIC_SYM_P} */ +#define RB_INTEGER_TYPE_P rb_integer_type_p /**< @old{rb_integer_type_p} */ +#define SYMBOL_P RB_SYMBOL_P /**< @old{RB_SYMBOL_P} */ +#define rb_type_p RB_TYPE_P /**< @alias{RB_TYPE_P} */ + +/** @cond INTERNAL_MACRO */ +#define RB_BUILTIN_TYPE RB_BUILTIN_TYPE +#define RB_DYNAMIC_SYM_P RB_DYNAMIC_SYM_P +#define RB_FLOAT_TYPE_P RB_FLOAT_TYPE_P +#define RB_SYMBOL_P RB_SYMBOL_P +#define RB_TYPE_P RB_TYPE_P +#define Check_Type Check_Type + +#if !RUBY_DEBUG +# define RBIMPL_ASSERT_TYPE(v, t) RBIMPL_ASSERT_OR_ASSUME(RB_TYPE_P((v), (t))) +#else +# define RBIMPL_ASSERT_TYPE Check_Type +#endif +/** @endcond */ + +/** @old{rb_type} */ +#define TYPE(_) RBIMPL_CAST((int)rb_type(_)) + +/** C-level type of an object. */ +enum +RBIMPL_ATTR_ENUM_EXTENSIBILITY(closed) +ruby_value_type { + RUBY_T_NONE = 0x00, /**< Non-object (swept etc.) */ + + RUBY_T_OBJECT = 0x01, /**< @see struct ::RObject */ + RUBY_T_CLASS = 0x02, /**< @see struct ::RClass and ::rb_cClass */ + RUBY_T_MODULE = 0x03, /**< @see struct ::RClass and ::rb_cModule */ + RUBY_T_FLOAT = 0x04, /**< @see struct ::RFloat */ + RUBY_T_STRING = 0x05, /**< @see struct ::RString */ + RUBY_T_REGEXP = 0x06, /**< @see struct ::RRegexp */ + RUBY_T_ARRAY = 0x07, /**< @see struct ::RArray */ + RUBY_T_HASH = 0x08, /**< @see struct ::RHash */ + RUBY_T_STRUCT = 0x09, /**< @see struct ::RStruct */ + RUBY_T_BIGNUM = 0x0a, /**< @see struct ::RBignum */ + RUBY_T_FILE = 0x0b, /**< @see struct ::RFile */ + RUBY_T_DATA = 0x0c, /**< @see struct ::RTypedData */ + RUBY_T_MATCH = 0x0d, /**< @see struct ::RMatch */ + RUBY_T_COMPLEX = 0x0e, /**< @see struct ::RComplex */ + RUBY_T_RATIONAL = 0x0f, /**< @see struct ::RRational */ + + RUBY_T_NIL = 0x11, /**< @see ::RUBY_Qnil */ + RUBY_T_TRUE = 0x12, /**< @see ::RUBY_Qfalse */ + RUBY_T_FALSE = 0x13, /**< @see ::RUBY_Qtrue */ + RUBY_T_SYMBOL = 0x14, /**< @see struct ::RSymbol */ + RUBY_T_FIXNUM = 0x15, /**< Integers formerly known as Fixnums. */ + RUBY_T_UNDEF = 0x16, /**< @see ::RUBY_Qundef */ + + RUBY_T_IMEMO = 0x1a, /**< @see struct ::RIMemo */ + RUBY_T_NODE = 0x1b, /**< @see struct ::RNode */ + RUBY_T_ICLASS = 0x1c, /**< Hidden classes known as IClasses. */ + RUBY_T_ZOMBIE = 0x1d, /**< @see struct ::RZombie */ + RUBY_T_MOVED = 0x1e, /**< @see struct ::RMoved */ + + RUBY_T_MASK = 0x1f /**< Bitmask of ::ruby_value_type. */ +}; + +RBIMPL_SYMBOL_EXPORT_BEGIN() +RBIMPL_ATTR_COLD() +/** + * @private + * + * This was the old implementation of Check_Type(), but they diverged. This + * one remains for theoretical backwards compatibility. People normally need + * not use it. + * + * @param[in] obj An object. + * @param[in] t A type. + * @exception rb_eTypeError `obj` is not of type `t`. + * @exception rb_eFatal `obj` is corrupt. + * @post Upon successful return `obj` is guaranteed to have type `t`. + * + * @internal + * + * The second argument shall have been enum ::ruby_value_type. But at the time + * matz designed this function he still used K&R C. There was no such thing + * like a function prototype. We can no longer change this API. + */ +void rb_check_type(VALUE obj, int t); +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries the type of the object. + * + * @param[in] obj Object in question. + * @pre `obj` must not be a special constant. + * @return The type of `obj`. + */ +static inline enum ruby_value_type +RB_BUILTIN_TYPE(VALUE obj) +{ + RBIMPL_ASSERT_OR_ASSUME(! RB_SPECIAL_CONST_P(obj)); + +#if 0 && defined __GNUC__ && !defined __clang__ + /* Don't move the access to `flags` before the preceding + * RB_SPECIAL_CONST_P check. */ + __asm volatile("": : :"memory"); +#endif + VALUE ret = RBASIC(obj)->flags & RUBY_T_MASK; + return RBIMPL_CAST((enum ruby_value_type)ret); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +/** + * Queries if the object is an instance of ::rb_cInteger. + * + * @param[in] obj Object in question. + * @retval true It is. + * @retval false It isn't. + */ +static inline bool +rb_integer_type_p(VALUE obj) +{ + if (RB_FIXNUM_P(obj)) { + return true; + } + else if (RB_SPECIAL_CONST_P(obj)) { + return false; + } + else { + return RB_BUILTIN_TYPE(obj) == RUBY_T_BIGNUM; + } +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +/** + * Identical to RB_BUILTIN_TYPE(), except it can also accept special constants. + * + * @param[in] obj Object in question. + * @return The type of `obj`. + */ +static inline enum ruby_value_type +rb_type(VALUE obj) +{ + if (! RB_SPECIAL_CONST_P(obj)) { + return RB_BUILTIN_TYPE(obj); + } + else if (obj == RUBY_Qfalse) { + return RUBY_T_FALSE; + } + else if (obj == RUBY_Qnil) { + return RUBY_T_NIL; + } + else if (obj == RUBY_Qtrue) { + return RUBY_T_TRUE; + } + else if (obj == RUBY_Qundef) { + return RUBY_T_UNDEF; + } + else if (RB_FIXNUM_P(obj)) { + return RUBY_T_FIXNUM; + } + else if (RB_STATIC_SYM_P(obj)) { + return RUBY_T_SYMBOL; + } + else { + RBIMPL_ASSUME(RB_FLONUM_P(obj)); + return RUBY_T_FLOAT; + } +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries if the object is an instance of ::rb_cFloat. + * + * @param[in] obj Object in question. + * @retval true It is. + * @retval false It isn't. + */ +static inline bool +RB_FLOAT_TYPE_P(VALUE obj) +{ + if (RB_FLONUM_P(obj)) { + return true; + } + else if (RB_SPECIAL_CONST_P(obj)) { + return false; + } + else { + return RB_BUILTIN_TYPE(obj) == RUBY_T_FLOAT; + } +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries if the object is a dynamic symbol. + * + * @param[in] obj Object in question. + * @retval true It is. + * @retval false It isn't. + */ +static inline bool +RB_DYNAMIC_SYM_P(VALUE obj) +{ + if (RB_SPECIAL_CONST_P(obj)) { + return false; + } + else { + return RB_BUILTIN_TYPE(obj) == RUBY_T_SYMBOL; + } +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries if the object is an instance of ::rb_cSymbol. + * + * @param[in] obj Object in question. + * @retval true It is. + * @retval false It isn't. + */ +static inline bool +RB_SYMBOL_P(VALUE obj) +{ + return RB_STATIC_SYM_P(obj) || RB_DYNAMIC_SYM_P(obj); +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +RBIMPL_ATTR_FORCEINLINE() +/** + * @private + * + * This is an implementation detail of RB_TYPE_P(). Just don't use it. + * + * @param[in] obj An object. + * @param[in] t A type. + * @retval true `obj` is of type `t`. + * @retval false Otherwise. + */ +static bool +rbimpl_RB_TYPE_P_fastpath(VALUE obj, enum ruby_value_type t) +{ + if (t == RUBY_T_TRUE) { + return obj == RUBY_Qtrue; + } + else if (t == RUBY_T_FALSE) { + return obj == RUBY_Qfalse; + } + else if (t == RUBY_T_NIL) { + return obj == RUBY_Qnil; + } + else if (t == RUBY_T_UNDEF) { + return obj == RUBY_Qundef; + } + else if (t == RUBY_T_FIXNUM) { + return RB_FIXNUM_P(obj); + } + else if (t == RUBY_T_SYMBOL) { + return RB_SYMBOL_P(obj); + } + else if (t == RUBY_T_FLOAT) { + return RB_FLOAT_TYPE_P(obj); + } + else if (RB_SPECIAL_CONST_P(obj)) { + return false; + } + else if (t == RB_BUILTIN_TYPE(obj)) { + return true; + } + else { + return false; + } +} + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +RBIMPL_ATTR_ARTIFICIAL() +/** + * Queries if the given object is of given type. + * + * @param[in] obj An object. + * @param[in] t A type. + * @retval true `obj` is of type `t`. + * @retval false Otherwise. + * + * @internal + * + * This function is a super-duper hot path. Optimised targeting modern C + * compilers and x86_64 architecture. + */ +static inline bool +RB_TYPE_P(VALUE obj, enum ruby_value_type t) +{ + if (RBIMPL_CONSTANT_P(t)) { + return rbimpl_RB_TYPE_P_fastpath(obj, t); + } + else { + return t == rb_type(obj); + } +} + +/** @cond INTERNAL_MACRO */ +/* Clang, unlike GCC, cannot propagate __builtin_constant_p beyond function + * boundary. */ +#if defined(__clang__) +# undef RB_TYPE_P +# define RB_TYPE_P(obj, t) \ + (RBIMPL_CONSTANT_P(t) ? \ + rbimpl_RB_TYPE_P_fastpath((obj), (t)) : \ + (RB_TYPE_P)((obj), (t))) +#endif + +/* clang 3.x (4.2 compatible) can't eliminate CSE of RB_BUILTIN_TYPE + * in inline function and caller function + * See also 8998c06461ea0bef11b3aeb30b6d2ab71c8762ba + */ +#if RBIMPL_COMPILER_BEFORE(Clang, 4, 0, 0) +# undef rb_integer_type_p +# define rb_integer_type_p(obj) \ + __extension__ ({ \ + const VALUE integer_type_obj = (obj); \ + (RB_FIXNUM_P(integer_type_obj) || \ + (!RB_SPECIAL_CONST_P(integer_type_obj) && \ + RB_BUILTIN_TYPE(integer_type_obj) == RUBY_T_BIGNUM)); \ + }) +#endif +/** @endcond */ + +RBIMPL_ATTR_PURE() +RBIMPL_ATTR_ARTIFICIAL() +/** + * @private + * Defined in ruby/internal/core/rtypeddata.h + */ +static inline bool rbimpl_rtypeddata_p(VALUE obj); + +RBIMPL_ATTR_ARTIFICIAL() +/** + * Identical to RB_TYPE_P(), except it raises exceptions on predication + * failure. + * + * @param[in] v An object. + * @param[in] t A type. + * @exception rb_eTypeError `obj` is not of type `t`. + * @exception rb_eFatal `obj` is corrupt. + * @post Upon successful return `obj` is guaranteed to have type `t`. + */ +static inline void +Check_Type(VALUE v, enum ruby_value_type t) +{ + if (RB_UNLIKELY(! RB_TYPE_P(v, t))) { + goto unexpected_type; + } + else if (t == RUBY_T_DATA && rbimpl_rtypeddata_p(v)) { + /* Typed data is not simple `T_DATA`, see `rb_check_type` */ + goto unexpected_type; + } + else { + return; + } + + unexpected_type: + rb_unexpected_type(v, t); +} + +#endif /* RBIMPL_VALUE_TYPE_H */ diff --git a/libs/libruby/ruby/internal/variable.h b/libs/libruby/ruby/internal/variable.h new file mode 100644 index 0000000..c017ffe --- /dev/null +++ b/libs/libruby/ruby/internal/variable.h @@ -0,0 +1,337 @@ +#ifndef RBIMPL_VARIABLE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_VARIABLE_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Declares rb_define_variable(). + */ +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/noreturn.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Type that represents a global variable getter function. + * + * @param[in] id The variable name. + * @param[in,out] data Where the value is stored. + * @return The value that shall be visible from Ruby. + */ +typedef VALUE rb_gvar_getter_t(ID id, VALUE *data); + +/** + * Type that represents a global variable setter function. + * + * @param[in] val The value to set. + * @param[in] id The variable name. + * @param[in,out] data Where the value is to be stored. + */ +typedef void rb_gvar_setter_t(VALUE val, ID id, VALUE *data); + +/** + * Type that represents a global variable marker function. + * + * @param[in] var Where the value is to be stored. + */ +typedef void rb_gvar_marker_t(VALUE *var); + +/** + * @deprecated + * + * This function has no actual usage (than in ruby itself). Please ignore. It + * was a bad idea to expose this function to 3rd parties, but we can no longer + * delete it. + */ +rb_gvar_getter_t rb_gvar_undef_getter; + +/** + * @deprecated + * + * This function has no actual usage (than in ruby itself). Please ignore. It + * was a bad idea to expose this function to 3rd parties, but we can no longer + * delete it. + */ +rb_gvar_setter_t rb_gvar_undef_setter; + +/** + * @deprecated + * + * This function has no actual usage (than in ruby itself). Please ignore. It + * was a bad idea to expose this function to 3rd parties, but we can no longer + * delete it. + */ +rb_gvar_marker_t rb_gvar_undef_marker; + +/** + * This is the getter function that backs global variables defined from a ruby + * script. Extension libraries can use this if its global variable needs no + * custom logic. + */ +rb_gvar_getter_t rb_gvar_val_getter; + +/** + * This is the setter function that backs global variables defined from a ruby + * script. Extension libraries can use this if its global variable needs no + * custom logic. + */ +rb_gvar_setter_t rb_gvar_val_setter; + +/** + * This is the setter function that backs global variables defined from a ruby + * script. Extension libraries can use this if its global variable needs no + * custom logic. + */ +rb_gvar_marker_t rb_gvar_val_marker; + +/** + * @deprecated + * + * This function has no actual usage (than in ruby itself). Please ignore. It + * was a bad idea to expose this function to 3rd parties, but we can no longer + * delete it. + */ +rb_gvar_getter_t rb_gvar_var_getter; + +/** + * @deprecated + * + * This function has no actual usage (than in ruby itself). Please ignore. It + * was a bad idea to expose this function to 3rd parties, but we can no longer + * delete it. + */ +rb_gvar_setter_t rb_gvar_var_setter; + +/** + * @deprecated + * + * This function has no actual usage (than in ruby itself). Please ignore. It + * was a bad idea to expose this function to 3rd parties, but we can no longer + * delete it. + */ +rb_gvar_marker_t rb_gvar_var_marker; + +RBIMPL_ATTR_NORETURN() +/** + * This function just raises ::rb_eNameError. Handy when you want to prohibit + * a global variable from being squashed by someone. + */ +rb_gvar_setter_t rb_gvar_readonly_setter; + +RBIMPL_ATTR_NONNULL(()) +/** + * "Shares" a global variable between Ruby and C. Normally a Ruby-level global + * variable is stored somewhere deep inside of the interpreter's execution + * context, but this way you can explicitly specify its storage. + * + * ```CXX + * static VALUE foo; + * + * extern "C" void + * init_Foo(void) + * { + * foo = rb_eval_string("..."); + * rb_define_variable("$foo", &foo); + * } + * ``` + * + * In the above example a Ruby global variable named `$foo` is stored in a C + * global variable named `foo`. + * + * @param[in] name Variable (Ruby side). + * @param[in] var Variable (C side). + * @post Ruby level global variable named `name` is defined if absent, + * and its storage is set to `var`. + */ +void rb_define_variable(const char *name, VALUE *var); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Defines a global variable that is purely function-backended. By using this + * API a programmer can define a global variable that dynamically changes from + * time to time. + * + * @param[in] name Variable name, in C's string. + * @param[in] getter A getter function. + * @param[in] setter A setter function. + * @post Ruby level global variable named `name` is defined if absent. + * + * @internal + * + * @shyouhei doesn't know if this is an Easter egg or an official feature, but + * you can pass 0 to the third argument (setter). That effectively nullifies + * any efforts to write to the defining global variable. + */ +void rb_define_virtual_variable(const char *name, rb_gvar_getter_t *getter, rb_gvar_setter_t *setter); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Identical to rb_define_virtual_variable(), but can also specify a storage. + * A programmer can use the storage for e.g. memoisation, storing intermediate + * computation result, etc. + * + * Also you can pass 0 to this function, unlike other variants: + * + * - When getter is 0 ::rb_gvar_var_getter is used instead. + * - When setter is 0 ::rb_gvar_var_setter is used instead. + * - When data is 0, you must specify a non-zero setter function. Otherwise + * ::rb_gvar_var_setter tries to write to `*NULL`, and just causes SEGV. + * + * @param[in] name Variable name, in C's string. + * @param[in] var Variable storage. + * @param[in] getter A getter function. + * @param[in] setter A setter function. + * @post Ruby level global variable named `name` is defined if absent. + */ +void rb_define_hooked_variable(const char *name, VALUE *var, rb_gvar_getter_t *getter, rb_gvar_setter_t *setter); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_define_variable(), except it does not allow Ruby programs to + * assign values to such global variable. C codes can still set values at + * will. This could be handy for you when implementing an `errno`-like + * experience, where a method updates a read-only global variable as a side- + * effect. + * + * @param[in] name Variable (Ruby side). + * @param[in] var Variable (C side). + * @post Ruby level global variable named `name` is defined if absent, + * and its storage is set to `var`. + */ +void rb_define_readonly_variable(const char *name, const VALUE *var); + +RBIMPL_ATTR_NONNULL(()) +/** + * Defines a Ruby level constant under a namespace. + * + * @param[out] klass Namespace for the constant to reside. + * @param[in] name Name of the constant. + * @param[in] val Value of the constant. + * @exception rb_eTypeError `klass` is not a kind of ::rb_cModule. + * @exception rb_eFrozenError `klass` is frozen. + * @post Ruby level constant `klass::name` is defined to be `val`. + * @note This API does not stop you from defining a constant that is + * unable to reach from ruby (like for instance passing + * non-capital letter to `name`). + * @note This API does not stop you from overwriting a constant that + * already exist. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +void rb_define_const(VALUE klass, const char *name, VALUE val); + +RBIMPL_ATTR_NONNULL(()) +/** + * Identical to rb_define_const(), except it defines that of "global", + * i.e. toplevel constant. + * + * @param[in] name Name of the constant. + * @param[in] val Value of the constant. + * @exception rb_eFrozenError ::rb_cObject is frozen. + * @post Ruby level constant \::name is defined to be `val`. + * @note This API does not stop you from defining a constant that is + * unable to reach from ruby (like for instance passing + * non-capital letter to `name`). + * @note This API does not stop you from overwriting a constant that + * already exist. + */ +void rb_define_global_const(const char *name, VALUE val); + +RBIMPL_ATTR_NONNULL(()) +/** + * Asserts that the given constant is deprecated. Attempt to refer such + * constant will produce a warning. + * + * @param[in] mod Namespace of the target constant. + * @param[in] name Name of the constant. + * @exception rb_eNameError No such constant. + * @exception rb_eFrozenError `mod` is frozen. + * @post `name` under `mod` is deprecated. + */ +void rb_deprecate_constant(VALUE mod, const char *name); + +RBIMPL_ATTR_NONNULL(()) +/** + * Assigns to a global variable. + * + * @param[in] name Target global variable. + * @param[in] val Value to assign. + * @return Passed value. + * @post Ruby level global variable named `name` is defined if absent, + * whose value is set to `val`. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with + * `set_trace_func`. + */ +VALUE rb_gv_set(const char *name, VALUE val); + +RBIMPL_ATTR_NONNULL(()) +/** + * Obtains a global variable. + * + * @param[in] name Global variable to query. + * @retval RUBY_Qnil The global variable does not exist. + * @retval otherwise The value assigned to the global variable. + * + * @internal + * + * Unlike rb_gv_set(), there is no way to trace this function. + */ +VALUE rb_gv_get(const char *name); + +RBIMPL_ATTR_NONNULL(()) +/** + * Obtains an instance variable. + * + * @param[in] obj Target object. + * @param[in] name Target instance variable to query. + * @exception rb_eEncodingError `name` is corrupt (contains Hanzi etc.). + * @retval RUBY_nil No such instance variable. + * @retval otherwise The value assigned to the instance variable. + */ +VALUE rb_iv_get(VALUE obj, const char *name); + +RBIMPL_ATTR_NONNULL(()) +/** + * Assigns to an instance variable. + * + * @param[out] obj Target object. + * @param[in] name Target instance variable. + * @param[in] val Value to assign. + * @exception rb_eFrozenError Can't modify `obj`. + * @exception rb_eArgError `obj` has too many instance variables. + * @return Passed value. + * @post An instance variable named `name` is defined if absent on + * `obj`, whose value is set to `val`. + * + * @internal + * + * This function does not stop you form creating an ASCII-incompatible instance + * variable, but there is no way to get one because rb_iv_get raises exceptions + * for such things. This design seems broken... But no idea why. + */ +VALUE rb_iv_set(VALUE obj, const char *name, VALUE val); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_VARIABLE_H */ diff --git a/libs/libruby/ruby/internal/warning_push.h b/libs/libruby/ruby/internal/warning_push.h new file mode 100644 index 0000000..f598163 --- /dev/null +++ b/libs/libruby/ruby/internal/warning_push.h @@ -0,0 +1,124 @@ +#ifndef RBIMPL_WARNING_PUSH_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_WARNING_PUSH_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Defines #RBIMPL_WARNING_PUSH. + * + * ### Q&A ### + * + * Q: Why all the macros defined in this file are function-like macros? + * + * A: Sigh. This is because of Doxygen. Its `SKIP_FUNCTION_MACROS = YES` + * configuration setting requests us that if we want it to ignore these + * macros, then we have to do two things: (1) let them be defined as + * function-like macros, and (2) place them separately in their own line, + * like below: + * + * ```CXX + * // NG -- foo's type considered something like `unsigned int`. + * RBIMPL_WARNING_PUSH + * int foo(void); + * RBIMPL_WARNING_POP + * + * // OK -- the macros are ignored by Doxygen. + * RBIMPL_WARNING_PUSH() + * int foo(void); + * RBIMPL_WARNING_POP() + * ``` + */ +#include "ruby/internal/compiler_is.h" +#include "ruby/internal/compiler_since.h" + +#if defined(__DOXYGEN__) + +/** + * @private + * + * Pushes compiler warning state. + */ +#define RBIMPL_WARNING_PUSH() __pragma(warning(push)) + +/** + * @private + * + * Pops compiler warning state. + */ +#define RBIMPL_WARNING_POP() __pragma(warning(pop)) + +/** + * @private + * + * Turns a warning into a fatal error. + * + * @param flag A flag that represents the kind of warnings. + */ +#define RBIMPL_WARNING_ERROR(flag) __pragma(warning(error: flag)) + +/** + * @private + * + * Suppresses a warning. + * + * @param flag A flag that represents the kind of warnings. + */ +#define RBIMPL_WARNING_IGNORED(flag) __pragma(warning(disable: flag)) + +#elif RBIMPL_COMPILER_SINCE(MSVC, 12, 0, 0) +# /* Not sure exactly when but it seems VC++ 6.0 is a version with it.*/ +# define RBIMPL_WARNING_PUSH() __pragma(warning(push)) +# define RBIMPL_WARNING_POP() __pragma(warning(pop)) +# define RBIMPL_WARNING_ERROR(flag) __pragma(warning(error: flag)) +# define RBIMPL_WARNING_IGNORED(flag) __pragma(warning(disable: flag)) + +#elif RBIMPL_COMPILER_SINCE(Intel, 13, 0, 0) +# define RBIMPL_WARNING_PUSH() __pragma(warning(push)) +# define RBIMPL_WARNING_POP() __pragma(warning(pop)) +# define RBIMPL_WARNING_ERROR(flag) __pragma(warning(error: flag)) +# define RBIMPL_WARNING_IGNORED(flag) __pragma(warning(disable: flag)) + +#elif RBIMPL_COMPILER_IS(Clang) || RBIMPL_COMPILER_IS(Apple) +# /* Not sure exactly when but it seems LLVM 2.6.0 is a version with it. */ +# define RBIMPL_WARNING_PRAGMA0(x) _Pragma(# x) +# define RBIMPL_WARNING_PRAGMA1(x) RBIMPL_WARNING_PRAGMA0(clang diagnostic x) +# define RBIMPL_WARNING_PRAGMA2(x, y) RBIMPL_WARNING_PRAGMA1(x # y) +# define RBIMPL_WARNING_PUSH() RBIMPL_WARNING_PRAGMA1(push) +# define RBIMPL_WARNING_POP() RBIMPL_WARNING_PRAGMA1(pop) +# define RBIMPL_WARNING_ERROR(flag) RBIMPL_WARNING_PRAGMA2(error, flag) +# define RBIMPL_WARNING_IGNORED(flag) RBIMPL_WARNING_PRAGMA2(ignored, flag) + +#elif RBIMPL_COMPILER_SINCE(GCC, 4, 6, 0) +# /* https://gcc.gnu.org/onlinedocs/gcc-4.6.0/gcc/Diagnostic-Pragmas.html */ +# define RBIMPL_WARNING_PRAGMA0(x) _Pragma(# x) +# define RBIMPL_WARNING_PRAGMA1(x) RBIMPL_WARNING_PRAGMA0(GCC diagnostic x) +# define RBIMPL_WARNING_PRAGMA2(x, y) RBIMPL_WARNING_PRAGMA1(x # y) +# define RBIMPL_WARNING_PUSH() RBIMPL_WARNING_PRAGMA1(push) +# define RBIMPL_WARNING_POP() RBIMPL_WARNING_PRAGMA1(pop) +# define RBIMPL_WARNING_ERROR(flag) RBIMPL_WARNING_PRAGMA2(error, flag) +# define RBIMPL_WARNING_IGNORED(flag) RBIMPL_WARNING_PRAGMA2(ignored, flag) + +#else +# /* :FIXME: improve here */ +# define RBIMPL_WARNING_PUSH() /* void */ +# define RBIMPL_WARNING_POP() /* void */ +# define RBIMPL_WARNING_ERROR(flag) /* void */ +# define RBIMPL_WARNING_IGNORED(flag) /* void */ +#endif /* _MSC_VER */ +/** @endcond */ + +#endif /* RBIMPL_WARNING_PUSH_H */ diff --git a/libs/libruby/ruby/internal/xmalloc.h b/libs/libruby/ruby/internal/xmalloc.h new file mode 100644 index 0000000..57552e4 --- /dev/null +++ b/libs/libruby/ruby/internal/xmalloc.h @@ -0,0 +1,392 @@ +#ifndef RBIMPL_XMALLOC_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RBIMPL_XMALLOC_H +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning Symbols prefixed with either `RBIMPL` or `rbimpl` are + * implementation details. Don't take them as canon. They could + * rapidly appear then vanish. The name (path) of this header file + * is also an implementation detail. Do not expect it to persist + * at the place it is now. Developers are free to move it anywhere + * anytime at will. + * @note To ruby-core: remember that this header can be possibly + * recursively included from extension libraries written in C++. + * Do not expect for instance `__VA_ARGS__` is always available. + * We assume C99 for ruby itself but we don't assume languages of + * extension libraries. They could be written in C++98. + * @brief Declares ::ruby_xmalloc(). + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#ifdef HAVE_STDLIB_H +# include +#endif + +#include "ruby/internal/attr/alloc_size.h" +#include "ruby/internal/attr/nodiscard.h" +#include "ruby/internal/attr/noexcept.h" +#include "ruby/internal/attr/restrict.h" +#include "ruby/internal/attr/returns_nonnull.h" +#include "ruby/internal/dllexport.h" + +/** + * @private + * @warning Do not touch this macro. + * @warning It is an implementation detail. + * @warning It was a failure at the first place to let you know about it. + * @warning The value of this macro must match for ruby itself and all + * extension libraries, otherwise serious memory corruption shall + * occur. + */ +#ifndef USE_GC_MALLOC_OBJ_INFO_DETAILS +# define USE_GC_MALLOC_OBJ_INFO_DETAILS 0 +#endif + +#define xmalloc ruby_xmalloc /**< @old{ruby_xmalloc} */ +#define xmalloc2 ruby_xmalloc2 /**< @old{ruby_xmalloc2} */ +#define xcalloc ruby_xcalloc /**< @old{ruby_xcalloc} */ +#define xrealloc ruby_xrealloc /**< @old{ruby_xrealloc} */ +#define xrealloc2 ruby_xrealloc2 /**< @old{ruby_xrealloc2} */ +#define xfree ruby_xfree /**< @old{ruby_xfree} */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RESTRICT() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((1)) +/** + * Allocates a storage instance. It is largely the same as system malloc(), + * except: + * + * - It raises Ruby exceptions instead of returning NULL, and + * - In case of `ENOMEM` it tries to GC to make some room. + * + * @param[in] size Requested amount of memory. + * @exception rb_eNoMemError No space left for `size` bytes allocation. + * @return A valid pointer to an allocated storage instance; which has at + * least `size` bytes width, with appropriate alignment detected by + * the underlying malloc() routine. + * @note It doesn't return NULL. + * @note Unlike some malloc() implementations, it allocates something and + * returns a meaningful value even when `size` is equal to zero. + * @warning The return value shall be invalidated exactly once by either + * ruby_xfree(), ruby_xrealloc(), or ruby_xrealloc2(). It is a + * failure to pass it to system free(), because the system and Ruby + * might or might not share the same malloc() implementation. + */ +void *ruby_xmalloc(size_t size) +RBIMPL_ATTR_NOEXCEPT(malloc(size)) +; + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RESTRICT() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((1,2)) +/** + * Identical to ruby_xmalloc(), except it allocates `nelems` * `elemsiz` bytes. + * This is needed because the multiplication could integer overflow. On such + * situations Ruby does not try to allocate at all but raises Ruby level + * exceptions instead. If there is no integer overflow the behaviour is + * exactly the same as `ruby_xmalloc(nelems*elemsiz)`. + * + * @param[in] nelems Number of elements. + * @param[in] elemsiz Size of an element. + * @exception rb_eNoMemError No space left for allocation. + * @exception rb_eArgError `nelems` * `elemsiz` would overflow. + * @return A valid pointer to an allocated storage instance; which has at + * least `nelems` * `elemsiz` bytes width, with appropriate + * alignment detected by the underlying malloc() routine. + * @note It doesn't return NULL. + * @note Unlike some malloc() implementations, it allocates something and + * returns a meaningful value even when `nelems` or `elemsiz` or + * both are zero. + * @warning The return value shall be invalidated exactly once by either + * ruby_xfree(), ruby_xrealloc(), or ruby_xrealloc2(). It is a + * failure to pass it to system free(), because the system and Ruby + * might or might not share the same malloc() implementation. + */ +void *ruby_xmalloc2(size_t nelems, size_t elemsiz) +RBIMPL_ATTR_NOEXCEPT(malloc(nelems * elemsiz)) +; + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RESTRICT() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((1,2)) +/** + * Identical to ruby_xmalloc2(), except it returns a zero-filled storage + * instance. It can also be seen as a routine identical to ruby_xmalloc(), + * except it calls calloc() instead of malloc(). + * + * @param[in] nelems Number of elements. + * @param[in] elemsiz Size of an element. + * @exception rb_eNoMemError No space left for allocation. + * @exception rb_eArgError `nelems` * `elemsiz` would overflow. + * @return A valid pointer to an allocated storage instance; which has at + * least `nelems` * `elemsiz` bytes width, with appropriate + * alignment detected by the underlying calloc() routine. + * @post The returned storage instance is filled with zeros. + * @note It doesn't return NULL. + * @note Unlike some calloc() implementations, it allocates something and + * returns a meaningful value even when `nelems` or `elemsiz` or + * both are zero. + * @warning The return value shall be invalidated exactly once by either + * ruby_xfree(), ruby_xrealloc(), or ruby_xrealloc2(). It is a + * failure to pass it to system free(), because the system and Ruby + * might or might not share the same malloc() implementation. + */ +void *ruby_xcalloc(size_t nelems, size_t elemsiz) +RBIMPL_ATTR_NOEXCEPT(calloc(nelems, elemsiz)) +; + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((2)) +/** + * Resize the storage instance. + * + * @param[in] ptr A valid pointer to a storage instance that was + * previously returned from either: + * - ruby_xmalloc(), + * - ruby_xmalloc2(), + * - ruby_xcalloc(), + * - ruby_xrealloc(), or + * - ruby_xrealloc2(). + * @param[in] newsiz Requested new amount of memory. + * @exception rb_eNoMemError No space left for `newsiz` bytes allocation. + * @return A valid pointer to a (possibly newly allocated) storage + * instance; which has at least `newsiz` bytes width, with + * appropriate alignment detected by the underlying realloc() + * routine. + * @pre The passed pointer must point to a valid live storage instance. + * It is a failure to pass an already freed pointer. + * @post In case the function returns the passed pointer as-is, the + * storage instance that the pointer holds is either grown or + * shrunken to have at least `newsiz` bytes. Otherwise a valid + * pointer to a newly allocated storage instance is returned. In + * this case `ptr` is invalidated as if it was passed to + * ruby_xfree(). + * @note It doesn't return NULL. + * @warning Unlike some realloc() implementations, passing zero to `newsiz` + * is not the same as calling ruby_xfree(), because this function + * never returns NULL. Something meaningful still returns then. + * @warning It is a failure not to check the return value. Do not assume + * anything on it. It could be either identical to, or distinct + * form the passed argument. + * @warning Do not assume anything on the alignment of the return value. + * There is no guarantee that it inherits the passed argument's + * one. + * @warning The return value shall be invalidated exactly once by either + * ruby_xfree(), ruby_xrealloc(), or ruby_xrealloc2(). It is a + * failure to pass it to system free(), because the system and Ruby + * might or might not share the same malloc() implementation. + */ +void *ruby_xrealloc(void *ptr, size_t newsiz) +RBIMPL_ATTR_NOEXCEPT(realloc(ptr, newsiz)) +; + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((2,3)) +/** + * Identical to ruby_xrealloc(), except it resizes the given storage instance + * to `newelems` * `newsiz` bytes. This is needed because the multiplication + * could integer overflow. On such situations Ruby does not try to touch the + * contents of argument pointer at all but raises Ruby level exceptions + * instead. If there is no integer overflow the behaviour is exactly the same + * as `ruby_xrealloc(ptr,nelems*elemsiz)`. + * + * This is roughly the same as reallocarray() function that OpenBSD + * etc. provides, but also interacts with our GC. + * + * @param[in] ptr A valid pointer to a storage instance that was + * previously returned from either: + * - ruby_xmalloc(), + * - ruby_xmalloc2(), + * - ruby_xcalloc(), + * - ruby_xrealloc(), or + * - ruby_xrealloc2(). + * @param[in] newelems Requested new number of elements. + * @param[in] newsiz Requested new size of each element. + * @exception rb_eNoMemError No space left for allocation. + * @exception rb_eArgError `newelems` * `newsiz` would overflow. + * @return A valid pointer to a (possibly newly allocated) storage + * instance; which has at least `newelems` * `newsiz` bytes width, + * with appropriate alignment detected by the underlying realloc() + * routine. + * @pre The passed pointer must point to a valid live storage instance. + * It is a failure to pass an already freed pointer. + * @post In case the function returns the passed pointer as-is, the + * storage instance that the pointer holds is either grown or + * shrunken to have at least `newelems` * `newsiz` bytes. + * Otherwise a valid pointer to a newly allocated storage instance + * is returned. In this case `ptr` is invalidated as if it was + * passed to ruby_xfree(). + * @note It doesn't return NULL. + * @warning Unlike some realloc() implementations, passing zero to either + * `newelems` or `elemsiz` are not the same as calling + * ruby_xfree(), because this function never returns NULL. + * Something meaningful still returns then. + * @warning It is a failure not to check the return value. Do not assume + * anything on it. It could be either identical to, or distinct + * form the passed argument. + * @warning Do not assume anything on the alignment of the return value. + * There is no guarantee that it inherits the passed argument's + * one. + * @warning The return value shall be invalidated exactly once by either + * ruby_xfree(), ruby_xrealloc(), or ruby_xrealloc2(). It is a + * failure to pass it to system free(), because the system and Ruby + * might or might not share the same malloc() implementation. + */ +void *ruby_xrealloc2(void *ptr, size_t newelems, size_t newsiz) +RBIMPL_ATTR_NOEXCEPT(realloc(ptr, newelems * newsiz)) +; + +/** + * Deallocates a storage instance. + * + * @param[out] ptr Either + * - NULL, or + * - a valid pointer previously returned from one of: + * - ruby_xmalloc(), + * - ruby_xmalloc2(), + * - ruby_xcalloc(), + * - ruby_xrealloc(), or + * - ruby_xrealloc2(). + * @pre The passed pointer must point to a valid live storage instance. + * It is a failure to pass an already freed pointer. + * @post The storage instance pointed by the passed pointer gets + * invalidated; it is no longer addressable. + * @warning Every single storage instance that was previously allocated by + * either ruby_xmalloc(), ruby_xmalloc2(), ruby_xcalloc(), + * ruby_xrealloc(), or ruby_xrealloc2() shall be invalidated + * exactly once by either passing it to ruby_xfree(), or passing + * it to either ruby_xrealloc(), ruby_xrealloc2() then check the + * return value for invalidation. + * @warning Do not pass anything other than pointers described above. For + * instance pointers returned from malloc() or mmap() shall not be + * passed to this function, because the underlying memory + * management mechanism could differ. + * @warning Do not pass any invalid pointers to this function e.g. by + * calling it twice with a same argument. + */ +void ruby_xfree(void *ptr) +RBIMPL_ATTR_NOEXCEPT(free(ptr)) +; + +#if USE_GC_MALLOC_OBJ_INFO_DETAILS +# define ruby_xmalloc(s1) ruby_xmalloc_with_location(s1, __FILE__, __LINE__) +# define ruby_xmalloc2(s1, s2) ruby_xmalloc2_with_location(s1, s2, __FILE__, __LINE__) +# define ruby_xcalloc(s1, s2) ruby_xcalloc_with_location(s1, s2, __FILE__, __LINE__) +# define ruby_xrealloc(ptr, s1) ruby_xrealloc_with_location(ptr, s1, __FILE__, __LINE__) +# define ruby_xrealloc2(ptr, s1, s2) ruby_xrealloc2_with_location(ptr, s1, s2, __FILE__, __LINE__) + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RESTRICT() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((1)) +void *ruby_xmalloc_body(size_t size) +RBIMPL_ATTR_NOEXCEPT(malloc(size)) +; + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RESTRICT() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((1,2)) +void *ruby_xmalloc2_body(size_t nelems, size_t elemsiz) +RBIMPL_ATTR_NOEXCEPT(malloc(nelems * elemsiz)) +; + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RESTRICT() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((1,2)) +void *ruby_xcalloc_body(size_t nelems, size_t elemsiz) +RBIMPL_ATTR_NOEXCEPT(calloc(nelems, elemsiz)) +; + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((2)) +void *ruby_xrealloc_body(void *ptr, size_t newsiz) +RBIMPL_ATTR_NOEXCEPT(realloc(ptr, newsiz)) +; + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_ALLOC_SIZE((2,3)) +void *ruby_xrealloc2_body(void *ptr, size_t newelems, size_t newsiz) +RBIMPL_ATTR_NOEXCEPT(realloc(ptr, newelems * newsiz)) +; + +RUBY_EXTERN const char *ruby_malloc_info_file; +RUBY_EXTERN int ruby_malloc_info_line; + +static inline void * +ruby_xmalloc_with_location(size_t s, const char *file, int line) +{ + void *ptr; + ruby_malloc_info_file = file; + ruby_malloc_info_line = line; + ptr = ruby_xmalloc_body(s); + ruby_malloc_info_file = NULL; + return ptr; +} + +static inline void * +ruby_xmalloc2_with_location(size_t s1, size_t s2, const char *file, int line) +{ + void *ptr; + ruby_malloc_info_file = file; + ruby_malloc_info_line = line; + ptr = ruby_xmalloc2_body(s1, s2); + ruby_malloc_info_file = NULL; + return ptr; +} + +static inline void * +ruby_xcalloc_with_location(size_t s1, size_t s2, const char *file, int line) +{ + void *ptr; + ruby_malloc_info_file = file; + ruby_malloc_info_line = line; + ptr = ruby_xcalloc_body(s1, s2); + ruby_malloc_info_file = NULL; + return ptr; +} + +static inline void * +ruby_xrealloc_with_location(void *ptr, size_t s, const char *file, int line) +{ + void *rptr; + ruby_malloc_info_file = file; + ruby_malloc_info_line = line; + rptr = ruby_xrealloc_body(ptr, s); + ruby_malloc_info_file = NULL; + return rptr; +} + +static inline void * +ruby_xrealloc2_with_location(void *ptr, size_t s1, size_t s2, const char *file, int line) +{ + void *rptr; + ruby_malloc_info_file = file; + ruby_malloc_info_line = line; + rptr = ruby_xrealloc2_body(ptr, s1, s2); + ruby_malloc_info_file = NULL; + return rptr; +} +#endif + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RBIMPL_XMALLOC_H */ diff --git a/libs/libruby/ruby/io.h b/libs/libruby/ruby/io.h new file mode 100644 index 0000000..88029b1 --- /dev/null +++ b/libs/libruby/ruby/io.h @@ -0,0 +1,1022 @@ +#ifndef RUBY_IO_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_IO_H 1 +/** + * @file + * @author $Author$ + * @date Fri Nov 12 16:47:09 JST 1993 + * @copyright Copyright (C) 1993-2007 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ +#include "ruby/internal/config.h" + +#include +#include "ruby/encoding.h" + +#if defined(HAVE_STDIO_EXT_H) +#include +#endif + +#include + +/** @cond INTERNAL_MACRO */ +#if defined(HAVE_POLL) +# ifdef _AIX +# define reqevents events +# define rtnevents revents +# endif +# include +# ifdef _AIX +# undef reqevents +# undef rtnevents +# undef events +# undef revents +# endif +# define RB_WAITFD_IN POLLIN +# if defined(POLLPRI) +# define RB_WAITFD_PRI POLLPRI +# else +# define RB_WAITFD_PRI 0 +# endif +# define RB_WAITFD_OUT POLLOUT +#else +# define RB_WAITFD_IN 0x001 +# define RB_WAITFD_PRI 0x002 +# define RB_WAITFD_OUT 0x004 +#endif +/** @endcond */ + +#include "ruby/internal/attr/const.h" +#include "ruby/internal/attr/pure.h" +#include "ruby/internal/attr/noreturn.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/value.h" +#include "ruby/backward/2/attributes.h" /* PACKED_STRUCT_UNALIGNED */ + +// IO#wait, IO#wait_readable, IO#wait_writable, IO#wait_priority are defined by this implementation. +#define RUBY_IO_WAIT_METHODS + +// Used as the default timeout argument to `rb_io_wait` to use the `IO#timeout` value. +#define RUBY_IO_TIMEOUT_DEFAULT Qnil + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +struct stat; +struct timeval; + +/** + * Indicates that a timeout has occurred while performing an IO operation. + */ +RUBY_EXTERN VALUE rb_eIOTimeoutError; + +/** + * Type of events that an IO can wait. + * + * @internal + * + * This is visible from extension libraries because `io/wait` wants it. + */ +typedef enum { + RUBY_IO_READABLE = RB_WAITFD_IN, /**< `IO::READABLE` */ + RUBY_IO_WRITABLE = RB_WAITFD_OUT, /**< `IO::WRITABLE` */ + RUBY_IO_PRIORITY = RB_WAITFD_PRI, /**< `IO::PRIORITY` */ +} rb_io_event_t; + +/** + * IO buffers. This is an implementation detail of ::rb_io_t::wbuf and + * ::rb_io_t::rbuf. People don't manipulate it directly. + */ +PACKED_STRUCT_UNALIGNED(struct rb_io_buffer_t { + + /** Pointer to the underlying memory region, of at least `capa` bytes. */ + char *ptr; /* off + len <= capa */ + + /** Offset inside of `ptr`. */ + int off; + + /** Length of the buffer. */ + int len; + + /** Designed capacity of the buffer. */ + int capa; +}); + +/** @alias{rb_io_buffer_t} */ +typedef struct rb_io_buffer_t rb_io_buffer_t; + +/** Decomposed encoding flags (e.g. `"enc:enc2""`). */ +/* + * enc enc2 read action write action + * NULL NULL force_encoding(default_external) write the byte sequence of str + * e1 NULL force_encoding(e1) convert str.encoding to e1 + * e1 e2 convert from e2 to e1 convert str.encoding to e2 + */ +struct rb_io_enc_t { + /** Internal encoding. */ + rb_encoding *enc; + /** External encoding. */ + rb_encoding *enc2; + /** + * Flags. + * + * @see enum ::ruby_econv_flag_type + */ + int ecflags; + /** + * Flags as Ruby hash. + * + * @internal + * + * This is set. But used from nowhere maybe? + */ + VALUE ecopts; +}; + +/** Ruby's IO, metadata and buffers. */ +typedef struct rb_io_t { + + /** The IO's Ruby level counterpart. */ + VALUE self; + + /** stdio ptr for read/write, if available. */ + FILE *stdio_file; + + /** file descriptor. */ + int fd; + + /** mode flags: FMODE_XXXs */ + int mode; + + /** child's pid (for pipes) */ + rb_pid_t pid; + + /** number of lines read */ + int lineno; + + /** pathname for file */ + VALUE pathv; + + /** finalize proc */ + void (*finalize)(struct rb_io_t*,int); + + /** Write buffer. */ + rb_io_buffer_t wbuf; + + /** + * (Byte) read buffer. Note also that there is a field called + * ::rb_io_t::cbuf, which also concerns read IO. + */ + rb_io_buffer_t rbuf; + + /** + * Duplex IO object, if set. + * + * @see rb_io_set_write_io() + */ + VALUE tied_io_for_writing; + + struct rb_io_enc_t encs; /**< Decomposed encoding flags. */ + + /** Encoding converter used when reading from this IO. */ + rb_econv_t *readconv; + + /** + * rb_io_ungetc() destination. This buffer is read before checking + * ::rb_io_t::rbuf + */ + rb_io_buffer_t cbuf; + + /** Encoding converter used when writing to this IO. */ + rb_econv_t *writeconv; + + /** + * This is, when set, an instance of ::rb_cString which holds the "common" + * encoding. Write conversion can convert strings twice... In case + * conversion from encoding X to encoding Y does not exist, Ruby finds an + * encoding Z that bridges the two, so that X to Z to Y conversion happens. + */ + VALUE writeconv_asciicompat; + + /** Whether ::rb_io_t::writeconv is already set up. */ + int writeconv_initialized; + + /** + * Value of ::rb_io_t::rb_io_enc_t::ecflags stored right before + * initialising ::rb_io_t::writeconv. + */ + int writeconv_pre_ecflags; + + /** + * Value of ::rb_io_t::rb_io_enc_t::ecopts stored right before initialising + * ::rb_io_t::writeconv. + */ + VALUE writeconv_pre_ecopts; + + /** + * This is a Ruby level mutex. It avoids multiple threads to write to an + * IO at once; helps for instance rb_io_puts() to ensure newlines right + * next to its arguments. + * + * This of course doesn't help inter-process IO interleaves, though. + */ + VALUE write_lock; + + /** + * The timeout associated with this IO when performing blocking operations. + */ + VALUE timeout; +} rb_io_t; + +/** @alias{rb_io_enc_t} */ +typedef struct rb_io_enc_t rb_io_enc_t; + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define HAVE_RB_IO_T 1 + +/** + * @name Possible flags for ::rb_io_t::mode + * + * @{ + */ + +/** The IO is opened for reading. */ +#define FMODE_READABLE 0x00000001 + +/** The IO is opened for writing. */ +#define FMODE_WRITABLE 0x00000002 + +/** The IO is opened for both read/write. */ +#define FMODE_READWRITE (FMODE_READABLE|FMODE_WRITABLE) + +/** + * The IO is in "binary mode". This is not what everything rb_io_binmode() + * concerns. This low-level flag is to stop CR <-> CRLF conversions that would + * happen in the underlying operating system. + * + * Setting this one and #FMODE_TEXTMODE at the same time is a contradiction. + * Setting this one and #ECONV_NEWLINE_DECORATOR_MASK at the same time is also + * a contradiction. + */ +#define FMODE_BINMODE 0x00000004 + +/** + * The IO is in "sync mode". All output is immediately flushed to the + * underlying operating system then. Can be set via rb_io_synchronized(), but + * there is no way except calling `IO#sync=` to reset. + */ +#define FMODE_SYNC 0x00000008 + +/** + * The IO is a TTY. What is a TTY and what isn't depends on the underlying + * operating system's `isatty(3)` output. You cannot change this. + */ +#define FMODE_TTY 0x00000010 + +/** + * Ruby eventually detects that the IO is bidirectional. For instance a TTY + * has such property. There are several other things known to be duplexed. + * Additionally you (extension library authors) can also implement your own + * bidirectional IO subclasses. One of such example is `Socket`. + */ +#define FMODE_DUPLEX 0x00000020 + +/** + * The IO is opened for appending. This mode always writes at the end of the + * IO. Ruby manages this flag for record but basically the logic behind this + * mode is at the underlying operating system. We almost do nothing. + */ +#define FMODE_APPEND 0x00000040 + +/** + * The IO is opened for creating. This makes sense only when the destination + * file does not exist at the time the IO object was created. This is the + * default mode for writing, but you can pass `"r+"` to `IO.open` etc., to + * reroute this creation. + */ +#define FMODE_CREATE 0x00000080 +/* #define FMODE_NOREVLOOKUP 0x00000100 */ + +/** + * This flag amends the effect of #FMODE_CREATE, so that if there already is a + * file at the given path the operation fails. Using this you can be sure that + * the file you get is a fresh new one. + */ +#define FMODE_EXCL 0x00000400 + +/** + * This flag amends the effect of #FMODE_CREATE, so that if there already is a + * file at the given path it gets truncated. + */ +#define FMODE_TRUNC 0x00000800 + +/** + * The IO is in "text mode". On systems where such mode make sense, this flag + * changes the way the IO handles the contents. On POSIX systems it is + * basically a no-op, but with this flag set you can optionally let Ruby + * manually convert newlines, unlike when in binary mode: + * + * ```ruby + * IO.open("/p/a/t/h", "wt", crlf_newline: true) # "wb" is NG. + * ``` + * + * Setting this one and #FMODE_BINMODE at the same time is a contradiction. + */ +#define FMODE_TEXTMODE 0x00001000 +/* #define FMODE_PREP 0x00010000 */ +/* #define FMODE_SIGNAL_ON_EPIPE 0x00020000 */ + +/** + * This flag amends the encoding of the IO so that the BOM of the contents of + * the IO takes effect. + */ +#define FMODE_SETENC_BY_BOM 0x00100000 +/* #define FMODE_UNIX 0x00200000 */ +/* #define FMODE_INET 0x00400000 */ +/* #define FMODE_INET6 0x00800000 */ + +/** @} */ + +/** + * Queries the underlying IO pointer. + * + * @param[in] obj An IO object. + * @param[out] fp A variable of type ::rb_io_t. + * @exception rb_eFrozenError `obj` is frozen. + * @exception rb_eIOError `obj` is closed. + * @post `fp` holds `obj`'s underlying IO. + */ +#define RB_IO_POINTER(obj,fp) rb_io_check_closed((fp) = RFILE(rb_io_taint_check(obj))->fptr) + +/** + * This is an old name of #RB_IO_POINTER. Not sure if we want to deprecate + * this macro. There still are tons of usages out there in the wild. + */ +#define GetOpenFile RB_IO_POINTER + +/** + * Fills an IO object. This makes the best sense when called from inside of an + * `#initialize` method of a 3rd party extension library that inherits + * ::rb_cIO. + * + * If the passed IO is already opened for something it first closes that and + * opens a new one instead. + * + * @param[out] obj An IO object to fill in. + * @param[out] fp A variable of type ::rb_io_t. + * @exception rb_eTypeError `obj` is not ::RUBY_T_FILE. + * @post `fp` holds `obj`'s underlying IO. + */ +#define RB_IO_OPEN(obj, fp) do {\ + (fp) = rb_io_make_open_file(obj);\ +} while (0) + +/** + * This is an old name of #RB_IO_OPEN. Not sure if we want to deprecate this + * macro. There still are usages out there in the wild. + */ +#define MakeOpenFile RB_IO_OPEN + +/** + * @private + * + * This is an implementation detail of #RB_IO_OPEN. People don't use it + * directly. + * + * @param[out] obj An IO object to fill in. + * @exception rb_eTypeError `obj` is not ::RUBY_T_FILE. + * @return `obj`'s backend IO. + * @post `obj` is initialised. + */ +rb_io_t *rb_io_make_open_file(VALUE obj); + +/** + * Finds or creates a stdio's file structure from a Ruby's one. This can be + * handy if you want to call an external API that accepts `FILE *`. + * + * @note Note however, that `FILE`s can have their own buffer. Mixing Ruby's + * and stdio's file are basically dangerous. Use with care. + * + * @param[in,out] fptr Target IO. + * @return A stdio's file, created if absent. + * @post `fptr` has its corresponding stdio's file. + * + * @internal + * + * We had rich support for `FILE` before! In the days of 1.8.x ::rb_io_t was + * like this: + * + * ```CXX + * typedef struct rb_io_t { + * FILE *f; // stdio ptr for read/write + * FILE *f2; // additional ptr for rw pipes + * int mode; // mode flags + * int pid; // child's pid (for pipes) + * int lineno; // number of lines read + * char *path; // pathname for file + * void (*finalize) _((struct rb_io_t*,int)); // finalize proc + * } rb_io_t; + *``` + * + * But we eventually abandoned this layout. It was too difficult. We could + * not have fine-grained control over the `f` field. + * + * - `FILE` tends to be an opaque struct. It does not interface well with + * `select(2)` etc. This makes IO multiplexing quite hard. Using stdio, + * there is arguably no portable way to know if `fwrite(3)` blocks. + * + * - Nonblocking mode, which is another core concept that enables IO + * multiplexing, does not interface with stdio routines at all. + * + * - Detection of duplexed IO is also hard for the same reason. + * + * - `feof(3)` is not portable. + * https://mail.python.org/pipermail/python-dev/2001-January/011390.html + * + * - Solaris was a thing back then. They could not have more than 256 `FILE` + * structures at a time. Their file descriptors ware stored in an + * `unsigned char`. + * + * - It is next to impossible to avoid SEGV, especially when a thread tries to + * `ungetc(3)`-ing from a `FILE` which is `fread(3)`-ed by another one. + * + * In short, it is a bad idea to let someone else manage IO buffers, especially + * someone you cannot control. This still applies to extension libraries + * methinks. Ruby doesn't prevent you from shooting yourself in the foot, but + * consider yourself warned here. + */ +FILE *rb_io_stdio_file(rb_io_t *fptr); + +/** + * Identical to rb_io_stdio_file(), except it takes file descriptors instead of + * Ruby's IO. It can also be seen as a compatibility layer to wrap + * `fdopen(3)`. Nowadays all supporting systems, including Windows, have + * `fdopen`. Why not use them. + * + * @param[in] fd A file descriptor. + * @param[in] modestr C string, something like `"r+"`. + * @exception rb_eSystemCallError `fdopen` failed for some reason. + * @return A stdio's file associated with `fd`. + * @note Interpretation of `modestr` depends on the underlying operating + * system. On glibc you might be able to pass e.g. `"rm"`, but + * that's an extension to POSIX. + */ +FILE *rb_fdopen(int fd, const char *modestr); + +/** + * Maps a file mode string (that rb_file_open() takes) into a mixture of + * `FMODE_` flags. This for instance returns + * `FMODE_WRITABLE | FMODE_TRUNC | FMODE_CREATE | FMODE_EXCL` for `"wx"`. + * + * @note You cannot pass this return value to OS provided `open(2)` etc. + * + * @param[in] modestr File mode, in C's string. + * @exception rb_eArgError `modestr` is broken. + * @return A set of flags. + * + * @internal + * + * rb_io_modestr_fmode() is not a pure function because it raises. + */ +int rb_io_modestr_fmode(const char *modestr); + +/** + * Identical to rb_io_modestr_fmode(), except it returns a mixture of `O_` + * flags. This for instance returns `O_WRONLY | O_TRUNC | O_CREAT | O_EXCL` for + * `"wx"`. + * + * @param[in] modestr File mode, in C's string. + * @exception rb_eArgError `modestr` is broken. + * @return A set of flags. + * + * @internal + * + * rb_io_modestr_oflags() is not a pure function because it raises. + */ +int rb_io_modestr_oflags(const char *modestr); + +RBIMPL_ATTR_CONST() +/** + * Converts an oflags (that rb_io_modestr_oflags() returns) to a fmode (that + * rb_io_mode_flags() returns). This is a purely functional operation. + * + * @param[in] oflags A set of `O_` flags. + * @return Corresponding set of `FMODE_` flags. + */ +int rb_io_oflags_fmode(int oflags); + +/** + * Asserts that an IO is opened for writing. + * + * @param[in] fptr An IO you want to write to. + * @exception rb_eIOError `fptr` is not for writing. + * @post Upon successful return `fptr` is ready for writing. + * + * @internal + * + * The parameter must have been `const rb_io_t *`. + */ +void rb_io_check_writable(rb_io_t *fptr); + +/** @alias{rb_io_check_byte_readable} */ +void rb_io_check_readable(rb_io_t *fptr); + +/** + * Asserts that an IO is opened for character-based reading. A character can + * be wider than a byte. Because of this we have to buffer reads from + * descriptors. This fiction checks if that is possible. + * + * @param[in] fptr An IO you want to read characters from. + * @exception rb_eIOError `fptr` is not for reading. + * @post Upon successful return `fptr` is ready for reading characters. + * + * @internal + * + * Unlike rb_io_check_writable() the parameter cannot be `const rb_io_t *`. + * Behind the scene this operation flushes its write buffers. This is because + * of OpenSSL. They mandate this way. + * + * @see "Can I use OpenSSL's SSL library with non-blocking I/O?" + * https://www.openssl.org/docs/faq.html + */ +void rb_io_check_char_readable(rb_io_t *fptr); + +/** + * Asserts that an IO is opened for byte-based reading. Byte-based and + * character-based reading operations cannot be mixed at a time. + * + * @param[in] fptr An IO you want to read characters from. + * @exception rb_eIOError `fptr` is not for reading. + * @post Upon successful return `fptr` is ready for reading bytes. + */ +void rb_io_check_byte_readable(rb_io_t *fptr); + +/** + * Destroys the given IO. Any pending operations are flushed. + * + * @note It makes no sense to call this function from anywhere outside of your + * class' ::rb_data_type_struct::dfree. + * + * @param[out] fptr IO to close. + * @post `fptr` is no longer a valid pointer. + */ +int rb_io_fptr_finalize(rb_io_t *fptr); + +/** + * Sets #FMODE_SYNC. + * + * @note There is no way for C extensions to undo this operation. + * + * @param[out] fptr IO to set the flag. + * @exception rb_eIOError `fptr` is not opened. + * @post `fptr` is in sync mode. + */ +void rb_io_synchronized(rb_io_t *fptr); + +/** + * Asserts that the passed IO is initialised. + * + * @param[in] fptr IO that you expect be initialised. + * @exception rb_eIOError `fptr` is not initialised. + * @post `fptr` is initialised. + */ +void rb_io_check_initialized(rb_io_t *fptr); + +/** + * This badly named function asserts that the passed IO is _open_. + * + * @param[in] fptr An IO + * @exception rb_eIOError `fptr` is closed. + * @post `fptr` is open. + */ +void rb_io_check_closed(rb_io_t *fptr); + +/** + * Identical to rb_io_check_io(), except it raises exceptions on conversion + * failures. + * + * @param[in] io Target object. + * @exception rb_eTypeError No implicit conversion to IO. + * @return Return value of `obj.to_io`. + * @see rb_str_to_str + * @see rb_ary_to_ary + */ +VALUE rb_io_get_io(VALUE io); + +/** + * Try converting an object to its IO representation using its `to_io` method, + * if any. If there is no such thing, returns ::RUBY_Qnil. + * + * @param[in] io Arbitrary ruby object to convert. + * @exception rb_eTypeError `obj.to_io` returned something non-IO. + * @retval RUBY_Qnil No conversion from `obj` to IO defined. + * @retval otherwise Converted IO representation of `obj`. + * @see rb_check_array_type + * @see rb_check_string_type + * @see rb_check_hash_type + */ +VALUE rb_io_check_io(VALUE io); + +/** + * Queries the tied IO for writing. An IO can be duplexed. Fine. The thing + * is, that characteristics could sometimes be achieved by the underlying + * operating system (for instance a socket's duplexity is by nature) but + * sometimes by us. Notable example is a bidirectional pipe. Suppose you + * have: + * + * ```ruby + * fp = IO.popen("-", "r+") + * ``` + * + * This pipe is duplexed (the `"r+"`). You can both read from/write to it. + * However your operating system may or may not implement bidirectional pipes. + * FreeBSD is one of such operating systems known to have one; OTOH Linux is + * known to lack such things. So to achieve maximum portability, Ruby's + * bidirectional pipes are done purely in user land. A pipe in ruby can have + * multiple file descriptors; one for reading and the other for writing. This + * API is to obtain the IO port which corresponds to the passed one, for + * writing. + * + * @param[in] io An IO. + * @return Its tied IO for writing, if any, or `io` itself otherwise. + */ +VALUE rb_io_get_write_io(VALUE io); + +/** + * Assigns the tied IO for writing. See rb_io_get_write_io() for what a "tied + * IO for writing" is. + * + * @param[out] io An IO. + * @param[in] w Another IO. + * @retval RUBY_Qnil There was no tied IO for writing for `io`. + * @retval otherwise The IO formerly tied to `io`. + * @post `io` ties `w` for writing. + * + * @internal + * + * @shyouhei doesn't think there is any needs of this function for 3rd party + * extension libraries. + */ +VALUE rb_io_set_write_io(VALUE io, VALUE w); + +/** + * Instructs the OS to put its internal file structure into "nonblocking mode". + * This is an in-Kernel concept. Reading from/writing to that file using C + * function calls would return -1 with errno set. However when it comes to a + * ruby program, we hide that error behind our `IO#read` method. Ruby level + * `IO#read` blocks regardless of this flag. If you want to avoid blocking, + * you should consider using methods like `IO#readpartial`. + * + * ```ruby + * require 'io/nonblock' + * STDIN.nonblock = true + * STDIN.gets # blocks. + * ``` + * + * As of writing there is a room of this API in Fiber schedulers. A Fiber + * scheduler could be written in a way its behaviour depends on this property. + * You need an in-depth understanding of how schedulers work to properly + * leverage this, though. + * + * @note Note however that nonblocking-ness propagates across process + * boundaries. You must really carefully watch your step when turning + * for instance `stderr` into nonblock mode (it tends to be shared + * across many processes). Also it is a complete disaster to mix a + * nonblocking file and stdio, and `stderr` tends to be under control of + * stdio in other processes. + * + * @param[out] fptr An IO that is to ne nonblocking. + * @post Descriptor that `fptr` describes is under nonblocking mode. + * + * @internal + * + * There is `O_NONBLOCK` but not `FMODE_NONBLOCK`. You cannot atomically + * create a nonblocking file descriptor using our API. + */ +void rb_io_set_nonblock(rb_io_t *fptr); + +/** + * Returns an integer representing the numeric file descriptor for + * io. + * + * @param[in] io An IO. + * @retval int A file descriptor. + */ +int rb_io_descriptor(VALUE io); + +/** + * This function breaks down the option hash that `IO#initialize` takes into + * components. This is an implementation detail of rb_io_extract_modeenc() + * today. People prefer that API instead. + * + * @param[in] opt The hash to decompose. + * @param[out] enc_p Return value buffer. + * @param[out] enc2_p Return value buffer. + * @param[out] fmode_p Return value buffer. + * @exception rb_eTypeError `opt` is broken. + * @exception rb_eArgError Specified encoding does not exist. + * @retval 1 Components got extracted. + * @retval 0 Otherwise. + * @post `enc_p` is the specified internal encoding. + * @post `enc2_p` is the specified external encoding. + * @post `fmode_p` is the specified set of `FMODE_` modes. + */ +int rb_io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2_p, int *fmode_p); + +/** + * This function can be seen as an extended version of + * rb_io_extract_encoding_option() that not only concerns the option hash but + * also mode string and so on. This should be mixed with rb_scan_args() like: + * + * ```CXX + * // This method mimics File.new + * static VALUE + * your_method(int argc, const VALUE *argv, VALUE self) + * { + * VALUE f; // file name + * VALUE m; // open mode + * VALUE p; // permission (O_CREAT) + * VALUE k; // keywords + * rb_io_enc_t c; // converter + * int oflags; + * int fmode; + * + * int n = rb_scan_args(argc, argv, "12:", &f, &m, &p, &k); + * rb_io_extract_modeenc(&m, &p, k, &oflags, &fmode, &c); + * + * // Every local variables declared so far has been properly filled here. + * ... + * } + * ``` + * + * @param[in,out] vmode_p Pointer to a mode object. + * @param[in,out] vperm_p Pointer to a permission object. + * @param[in] opthash Keyword arguments + * @param[out] oflags_p `O_` flags return buffer. + * @param[out] fmode_p `FMODE_` flags return buffer. + * @param[out] convconfig_p Encoding config return buffer. + * @exception rb_eTypeError Unexpected object (e.g. Time) passed. + * @exception rb_eArgError Contradiction inside of params. + * @post `*vmode_p` is a mode object (filled if any). + * @post `*vperm_p` is a permission object (filled if any). + * @post `*oflags_p` is filled with `O_` flags. + * @post `*fmode_p` is filled with `FMODE_` flags. + * @post `*convconfig_p` is filled with conversion instructions. + * + * @internal + * + * ```rbs + * class File + * def initialize: ( + * (String | int) path, + * ?(String | int) fmode, + * ?(String | int) perm, + * ?mode: (String | int), + * ?flags: int, + * ?external_encoding: (Encoding | String), + * ?internal_encoding: (Encoding | String), + * ?encoding: String, + * ?textmode: bool, + * ?binmode: bool, + * ?autoclose: bool, + * ?invalid: :replace, + * ?undef: :replace, + * ?replace: String, + * ?fallback: (Hash | Proc | Method), + * ?xml: (:text | :attr), + * ?crlf_newline: bool, + * ?cr_newline: bool, + * ?universal_newline: bool + * ) -> void + * ``` + */ +void rb_io_extract_modeenc(VALUE *vmode_p, VALUE *vperm_p, VALUE opthash, int *oflags_p, int *fmode_p, rb_io_enc_t *convconfig_p); + +/* :TODO: can this function be __attribute__((warn_unused_result)) or not? */ +/** + * Buffered write to the passed IO. + * + * @param[out] io Destination IO. + * @param[in] buf Contents to go to `io`. + * @param[in] size Number of bytes of `buf`. + * @exception rb_eFrozenError `io` is frozen. + * @exception rb_eIOError `io` is not open for writing. + * @exception rb_eSystemCallError `writev(2)` failed for some reason. + * @retval -1 Write failed. + * @retval otherwise Number of bytes actually written. + * @post `buf` is written to `io`. + * @note Partial write is a thing. It is a failure not to check the + * return value. + */ +ssize_t rb_io_bufwrite(VALUE io, const void *buf, size_t size); + +//RBIMPL_ATTR_DEPRECATED(("use rb_io_maybe_wait_readable")) +/** + * Blocks until the passed file descriptor gets readable. + * + * @deprecated We now prefer rb_io_maybe_wait_readable() over this one. + * @param[in] fd The file descriptor to wait. + * @exception rb_eIOError Bad file descriptor. + * @return 0 or 1 (meaning unclear). + * @post `fd` is ready for reading. + */ +int rb_io_wait_readable(int fd); + +//RBIMPL_ATTR_DEPRECATED(("use rb_io_maybe_wait_writable")) +/** + * Blocks until the passed file descriptor gets writable. + * + * @deprecated We now prefer rb_io_maybe_wait_writable() over this one. + * @param[in] fd The file descriptor to wait. + * @exception rb_eIOError Bad file descriptor. + * @return 0 or 1 (meaning unclear). + */ +int rb_io_wait_writable(int fd); + +//RBIMPL_ATTR_DEPRECATED(("use rb_io_wait")) +/** + * Blocks until the passed file descriptor is ready for the passed events. + * + * @deprecated We now prefer rb_io_maybe_wait() over this one. + * @param[in] fd The file descriptor to wait. + * @param[in] events A set of enum ::rb_io_event_t. + * @param[in,out] tv Timeout. + * @retval 0 Operation timed out. + * @retval -1 `select(2)` failed for some reason. + * @retval otherwise A set of enum ::rb_io_event_t. + * @note Depending on your operating system `tv` might or might not + * be updated (POSIX permits both). Portable programs must + * have no assumptions. + */ +int rb_wait_for_single_fd(int fd, int events, struct timeval *tv); + +/** + * Get the timeout associated with the specified io object. + * + * @param[in] io An IO object. + * @retval RUBY_Qnil There is no associated timeout. + * @retval Otherwise The timeout value. + */ +VALUE rb_io_timeout(VALUE io); + +/** + * Set the timeout associated with the specified io object. This timeout is + * used as a best effort timeout to prevent operations from blocking forever. + * + * @param[in] io An IO object. + * @param[in] timeout A timeout value. Must respond to #to_f. + * @ + */ +VALUE rb_io_set_timeout(VALUE io, VALUE timeout); + +/** + * Blocks until the passed IO is ready for the passed events. The "events" + * here is a Ruby level integer, which is an OR-ed value of `IO::READABLE`, + * `IO::WRITable`, and `IO::PRIORITY`. + * + * If timeout is `Qnil`, it will use the default timeout as given by + * `rb_io_timeout(io)`. + * + * @param[in] io An IO object to wait. + * @param[in] events See above. + * @param[in] timeout Time, or numeric seconds since UNIX epoch. + * If Qnil, use the default timeout. If Qfalse + * or Qundef, wait forever. + * @exception rb_eIOError `io` is not open. + * @exception rb_eRangeError `timeout` is out of range. + * @exception rb_eSystemCallError `select(2)` failed for some reason. + * @retval RUBY_Qfalse Operation timed out. + * @retval Otherwise Actual events reached. + */ +VALUE rb_io_wait(VALUE io, VALUE events, VALUE timeout); + +/** + * Identical to rb_io_wait() except it additionally takes previous errno. If + * the passed errno indicates for instance `EINTR`, this function returns + * immediately. This is expected to be called in a loop. + * + * ```CXX + * while (true) { + * + * ... // Your interesting operation here + * // `errno` could be updated + * + * rb_io_maybe_wait(errno, io, ev, Qnil); + * } + * ``` + * + * @param[in] error System errno. + * @param[in] io An IO object to wait. + * @param[in] events An integer set of interests. + * @param[in] timeout Time, or numeric seconds since UNIX epoch. + * @exception rb_eIOError `io` is not open. + * @exception rb_eRangeError `timeout` is out of range. + * @exception rb_eSystemCallError `select(2)` failed for some reason. + * @retval RUBY_Qfalse Operation timed out. + * @retval Otherwise Actual events reached. + * + * @internal + * + * This function to return ::RUBY_Qfalse on timeout could be unintended. It + * seems timeout feature has some rough edge. + */ +VALUE rb_io_maybe_wait(int error, VALUE io, VALUE events, VALUE timeout); + +/** + * Blocks until the passed IO is ready for reading, if that makes sense for the + * passed errno. This is a special case of rb_io_maybe_wait() that only + * concerns for reading. + * + * @param[in] error System errno. + * @param[in] io An IO object to wait. + * @param[in] timeout Time, or numeric seconds since UNIX epoch. + * @exception rb_eIOError `io` is not open. + * @exception rb_eRangeError `timeout` is out of range. + * @exception rb_eSystemCallError `select(2)` failed for some reason. + * @retval 0 Operation timed out. + * @retval Otherwise Always returns ::RUBY_IO_READABLE. + */ +int rb_io_maybe_wait_readable(int error, VALUE io, VALUE timeout); + +/** + * Blocks until the passed IO is ready for writing, if that makes sense for the + * passed errno. This is a special case of rb_io_maybe_wait() that only + * concernsfor writing. + * + * @param[in] error System errno. + * @param[in] io An IO object to wait. + * @param[in] timeout Time, or numeric seconds since UNIX epoch. + * @exception rb_eIOError `io` is not open. + * @exception rb_eRangeError `timeout` is out of range. + * @exception rb_eSystemCallError `select(2)` failed for some reason. + * @retval 0 Operation timed out. + * @retval Otherwise Always returns ::RUBY_IO_WRITABLE. + */ +int rb_io_maybe_wait_writable(int error, VALUE io, VALUE timeout); + +/** @cond INTERNAL_MACRO */ +/* compatibility for ruby 1.8 and older */ +#define rb_io_mode_flags(modestr) [<"rb_io_mode_flags() is obsolete; use rb_io_modestr_fmode()">] +#define rb_io_modenum_flags(oflags) [<"rb_io_modenum_flags() is obsolete; use rb_io_oflags_fmode()">] +/** @endcond */ + +/** + * @deprecated This function once was a thing in the old days, but makes no + * sense any longer today. Exists here for backwards + * compatibility only. You can safely forget about it. + * + * @param[in] obj Object in question. + * @exception rb_eFrozenError obj is frozen. + * @return The passed `obj` + */ +VALUE rb_io_taint_check(VALUE obj); + +RBIMPL_ATTR_NORETURN() +/** + * Utility function to raise ::rb_eEOFError. + * + * @exception rb_eEOFError End of file situation. + * @note It never returns. + */ +void rb_eof_error(void); + +/** + * Blocks until there is a pending read in the passed IO. If there already is + * it just returns. + * + * @param[out] fptr An IO to wait for reading. + * @post The are bytes to be read. + */ +void rb_io_read_check(rb_io_t *fptr); + +RBIMPL_ATTR_PURE() +/** + * Queries if the passed IO has any pending reads. Unlike rb_io_read_check() + * this doesn't block; has no side effects. + * + * @param[in] fptr An IO which can have pending reads. + * @retval 0 The IO is empty. + * @retval 1 There is something buffered. + */ +int rb_io_read_pending(rb_io_t *fptr); + +/** + * Constructs an instance of ::rb_cStat from the passed information. + * + * @param[in] st A stat. + * @return Allocated new instance of ::rb_cStat. + */ +VALUE rb_stat_new(const struct stat *st); + +/* gc.c */ + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_IO_H */ diff --git a/libs/libruby/ruby/io/buffer.h b/libs/libruby/ruby/io/buffer.h new file mode 100644 index 0000000..88e5598 --- /dev/null +++ b/libs/libruby/ruby/io/buffer.h @@ -0,0 +1,96 @@ +#ifndef RUBY_IO_BUFFER_H +#define RUBY_IO_BUFFER_H +/** + * @file + * @author Samuel Williams + * @date Fri 2 Jul 2021 16:29:01 NZST + * @copyright Copyright (C) 2021 Samuel Williams + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ + +#pragma once + +#include "ruby/ruby.h" +#include "ruby/internal/config.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +// WARNING: This entire interface is experimental and may change in the future! +#define RB_IO_BUFFER_EXPERIMENTAL 1 + +#define RUBY_IO_BUFFER_VERSION 2 + +RUBY_EXTERN VALUE rb_cIOBuffer; +RUBY_EXTERN size_t RUBY_IO_BUFFER_PAGE_SIZE; +RUBY_EXTERN size_t RUBY_IO_BUFFER_DEFAULT_SIZE; + +enum rb_io_buffer_flags { + // The memory in the buffer is owned by someone else. + // More specifically, it means that someone else owns the buffer and we shouldn't try to resize it. + RB_IO_BUFFER_EXTERNAL = 1, + // The memory in the buffer is allocated internally. + RB_IO_BUFFER_INTERNAL = 2, + // The memory in the buffer is mapped. + // A non-private mapping is marked as external. + RB_IO_BUFFER_MAPPED = 4, + + // A mapped buffer that is also shared. + RB_IO_BUFFER_SHARED = 8, + + // The buffer is locked and cannot be resized. + // More specifically, it means we can't change the base address or size. + // A buffer is typically locked before a system call that uses the data. + RB_IO_BUFFER_LOCKED = 32, + + // The buffer mapping is private and will not impact other processes or the underlying file. + RB_IO_BUFFER_PRIVATE = 64, + + // The buffer is read-only and cannot be modified. + RB_IO_BUFFER_READONLY = 128 +}; + +enum rb_io_buffer_endian { + RB_IO_BUFFER_LITTLE_ENDIAN = 4, + RB_IO_BUFFER_BIG_ENDIAN = 8, + +#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + RB_IO_BUFFER_HOST_ENDIAN = RB_IO_BUFFER_LITTLE_ENDIAN, +#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + RB_IO_BUFFER_HOST_ENDIAN = RB_IO_BUFFER_BIG_ENDIAN, +#elif REG_DWORD == REG_DWORD_LITTLE_ENDIAN + RB_IO_BUFFER_HOST_ENDIAN = RB_IO_BUFFER_LITTLE_ENDIAN, +#elif REG_DWORD == REG_DWORD_BIG_ENDIAN + RB_IO_BUFFER_HOST_ENDIAN = RB_IO_BUFFER_BIG_ENDIAN, +#endif + + RB_IO_BUFFER_NETWORK_ENDIAN = RB_IO_BUFFER_BIG_ENDIAN +}; + +VALUE rb_io_buffer_new(void *base, size_t size, enum rb_io_buffer_flags flags); +VALUE rb_io_buffer_map(VALUE io, size_t size, rb_off_t offset, enum rb_io_buffer_flags flags); + +VALUE rb_io_buffer_lock(VALUE self); +VALUE rb_io_buffer_unlock(VALUE self); +int rb_io_buffer_try_unlock(VALUE self); +VALUE rb_io_buffer_free(VALUE self); + +int rb_io_buffer_get_bytes(VALUE self, void **base, size_t *size); +void rb_io_buffer_get_bytes_for_reading(VALUE self, const void **base, size_t *size); +void rb_io_buffer_get_bytes_for_writing(VALUE self, void **base, size_t *size); + +VALUE rb_io_buffer_transfer(VALUE self); +void rb_io_buffer_resize(VALUE self, size_t size); +void rb_io_buffer_clear(VALUE self, uint8_t value, size_t offset, size_t length); + +// The length is the minimum required length. +VALUE rb_io_buffer_read(VALUE self, VALUE io, size_t length, size_t offset); +VALUE rb_io_buffer_pread(VALUE self, VALUE io, rb_off_t from, size_t length, size_t offset); +VALUE rb_io_buffer_write(VALUE self, VALUE io, size_t length, size_t offset); +VALUE rb_io_buffer_pwrite(VALUE self, VALUE io, rb_off_t from, size_t length, size_t offset); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_IO_BUFFER_H */ diff --git a/libs/libruby/ruby/memory_view.h b/libs/libruby/ruby/memory_view.h new file mode 100644 index 0000000..1ddca2d --- /dev/null +++ b/libs/libruby/ruby/memory_view.h @@ -0,0 +1,325 @@ +#ifndef RUBY_MEMORY_VIEW_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_MEMORY_VIEW_H 1 +/** + * @file + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @brief Memory View. + */ + +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include /* size_t */ +#endif + +#ifdef HAVE_SYS_TYPES_H +# include /* ssize_t */ +#endif + +#include "ruby/internal/attr/pure.h" /* RBIMPL_ATTR_PURE */ +#include "ruby/internal/core/rtypeddata.h" /* rb_data_type_t */ +#include "ruby/internal/dllexport.h" /* RUBY_EXTERN */ +#include "ruby/internal/stdbool.h" /* bool */ +#include "ruby/internal/value.h" /* VALUE */ + +/** + * Flags passed to rb_memory_view_get(), then to ::rb_memory_view_get_func_t. + */ +enum ruby_memory_view_flags { + RUBY_MEMORY_VIEW_SIMPLE = 0, + RUBY_MEMORY_VIEW_WRITABLE = (1<<0), + RUBY_MEMORY_VIEW_FORMAT = (1<<1), + RUBY_MEMORY_VIEW_MULTI_DIMENSIONAL = (1<<2), + RUBY_MEMORY_VIEW_STRIDES = (1<<3) | RUBY_MEMORY_VIEW_MULTI_DIMENSIONAL, + RUBY_MEMORY_VIEW_ROW_MAJOR = (1<<4) | RUBY_MEMORY_VIEW_STRIDES, + RUBY_MEMORY_VIEW_COLUMN_MAJOR = (1<<5) | RUBY_MEMORY_VIEW_STRIDES, + RUBY_MEMORY_VIEW_ANY_CONTIGUOUS = RUBY_MEMORY_VIEW_ROW_MAJOR | RUBY_MEMORY_VIEW_COLUMN_MAJOR, + RUBY_MEMORY_VIEW_INDIRECT = (1<<6) | RUBY_MEMORY_VIEW_STRIDES, +}; + +/** Memory view component metadata. */ +typedef struct { + /** @see ::rb_memory_view_t::format */ + char format; + + /** :FIXME: what is a "native" size is unclear. */ + unsigned native_size_p: 1; + + /** Endian of the component */ + unsigned little_endian_p: 1; + + /** The component's offset. */ + size_t offset; + + /** The component's size. */ + size_t size; + + /** + * How many numbers of components are there. For instance "CCC"'s repeat is + * 3. + */ + size_t repeat; +} rb_memory_view_item_component_t; + +/** + * A MemoryView structure, `rb_memory_view_t`, is used for exporting objects' + * MemoryView. + * + * This structure contains the reference of the object, which is the owner of + * the MemoryView, the pointer to the head of exported memory, and the metadata + * that describes the structure of the memory. The metadata can describe + * multidimensional arrays with strides. + */ +typedef struct { + /** + * The original object that has the memory exported via this memory view. + */ + VALUE obj; + + /** The pointer to the exported memory. */ + void *data; + + /** The number of bytes in data. */ + ssize_t byte_size; + + /** true for readonly memory, false for writable memory. */ + bool readonly; + + /** + * A string to describe the format of an element, or NULL for unsigned bytes. + * The format string is a sequence of the following pack-template specifiers: + * + * c, C, s, s!, S, S!, n, v, i, i!, I, I!, l, l!, L, L!, + * N, V, f, e, g, q, q!, Q, Q!, d, E, G, j, J, x + * + * For example, "dd" for an element that consists of two double values, + * and "CCC" for an element that consists of three bytes, such as + * an RGB color triplet. + * + * Also, the value endianness can be explicitly specified by '<' or '>' + * following a value type specifier. + * + * The items are packed contiguously. When you emulate the alignment of + * structure members, put '|' at the beginning of the format string, + * like "|iqc". On x86_64 Linux ABI, the size of the item by this format + * is 24 bytes instead of 13 bytes. + */ + const char *format; + + /** + * The number of bytes in each element. + * item_size should equal to rb_memory_view_item_size_from_format(format). */ + ssize_t item_size; + + /** Description of each components. */ + struct { + /** + * The array of rb_memory_view_item_component_t that describes the + * item structure. rb_memory_view_prepare_item_desc and + * rb_memory_view_get_item allocate this memory if needed, + * and rb_memory_view_release frees it. */ + const rb_memory_view_item_component_t *components; + + /** The number of components in an item. */ + size_t length; + } item_desc; + + /** The number of dimension. */ + ssize_t ndim; + + /** + * ndim size array indicating the number of elements in each dimension. + * This can be NULL when ndim == 1. */ + const ssize_t *shape; + + /** + * ndim size array indicating the number of bytes to skip to go to the + * next element in each dimension. */ + const ssize_t *strides; + + /** + * The offset in each dimension when this memory view exposes a nested array. + * Or, NULL when this memory view exposes a flat array. */ + const ssize_t *sub_offsets; + + /** The private data for managing this exported memory */ + void *private_data; + + /** DO NOT TOUCH THIS: The memory view entry for the internal use */ + const struct rb_memory_view_entry *_memory_view_entry; +} rb_memory_view_t; + +/** Type of function of ::rb_memory_view_entry_t::get_func. */ +typedef bool (* rb_memory_view_get_func_t)(VALUE obj, rb_memory_view_t *view, int flags); + +/** Type of function of ::rb_memory_view_entry_t::release_func. */ +typedef bool (* rb_memory_view_release_func_t)(VALUE obj, rb_memory_view_t *view); + +/** Type of function of ::rb_memory_view_entry_t::available_p_func. */ +typedef bool (* rb_memory_view_available_p_func_t)(VALUE obj); + +/** Operations applied to a specific kind of a memory view. */ +typedef struct rb_memory_view_entry { + /** + * Exports a memory view from a Ruby object. + */ + rb_memory_view_get_func_t get_func; + + /** + * Releases a memory view that was previously generated using + * ::rb_memory_view_entry_t::get_func. + */ + rb_memory_view_release_func_t release_func; + + /** + * Queries if an object understands memory view protocol. + */ + rb_memory_view_available_p_func_t available_p_func; +} rb_memory_view_entry_t; + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* memory_view.c */ + +/** + * Associates the passed class with the passed memory view entry. This has to + * be called before actually creating a memory view from an instance. + */ +bool rb_memory_view_register(VALUE klass, const rb_memory_view_entry_t *entry); + +RBIMPL_ATTR_PURE() +/** + * Return `true` if the data in the MemoryView `view` is row-major contiguous. + * + * Return `false` otherwise. + */ +bool rb_memory_view_is_row_major_contiguous(const rb_memory_view_t *view); + +RBIMPL_ATTR_PURE() +/** + * Return `true` if the data in the MemoryView `view` is column-major + * contiguous. + * + * Return `false` otherwise. + */ +bool rb_memory_view_is_column_major_contiguous(const rb_memory_view_t *view); + +RBIMPL_ATTR_NOALIAS() +/** + * Fill the `strides` array with byte-Strides of a contiguous array of the + * given shape with the given element size. + */ +void rb_memory_view_fill_contiguous_strides(const ssize_t ndim, const ssize_t item_size, const ssize_t *const shape, const bool row_major_p, ssize_t *const strides); + +RBIMPL_ATTR_NOALIAS() +/** + * Fill the members of `view` as an 1-dimensional byte array. + */ +bool rb_memory_view_init_as_byte_array(rb_memory_view_t *view, VALUE obj, void *data, const ssize_t len, const bool readonly); + +/** + * Deconstructs the passed format string, as describe in + * ::rb_memory_view_t::format. + */ +ssize_t rb_memory_view_parse_item_format(const char *format, + rb_memory_view_item_component_t **members, + size_t *n_members, const char **err); + +/** + * Calculate the number of bytes occupied by an element. + * + * When the calculation fails, the failed location in `format` is stored into + * `err`, and returns `-1`. + */ +ssize_t rb_memory_view_item_size_from_format(const char *format, const char **err); + +/** + * Calculate the location of the item indicated by the given `indices`. + * + * The length of `indices` must equal to `view->ndim`. + * + * This function initializes `view->item_desc` if needed. + */ +void *rb_memory_view_get_item_pointer(rb_memory_view_t *view, const ssize_t *indices); + +/** + * Return a value that consists of item members. + * + * When an item is a single member, the return value is a single value. + * + * When an item consists of multiple members, an array will be returned. + */ +VALUE rb_memory_view_extract_item_members(const void *ptr, const rb_memory_view_item_component_t *members, const size_t n_members); + +/** Fill the `item_desc` member of `view`. */ +void rb_memory_view_prepare_item_desc(rb_memory_view_t *view); + +/** * Return a value that consists of item members in the given memory view. */ +VALUE rb_memory_view_get_item(rb_memory_view_t *view, const ssize_t *indices); + +/** + * Return `true` if `obj` supports to export a MemoryView. Return `false` + * otherwise. + * + * If this function returns `true`, it doesn't mean the function + * `rb_memory_view_get` will succeed. + */ +bool rb_memory_view_available_p(VALUE obj); + +/** + * If the given `obj` supports to export a MemoryView that conforms the given + * `flags`, this function fills `view` by the information of the MemoryView and + * returns `true`. In this case, the reference count of `obj` is increased. + * + * If the given combination of `obj` and `flags` cannot export a MemoryView, + * this function returns `false`. The content of `view` is not touched in this + * case. + * + * The exported MemoryView must be released by `rb_memory_view_release` when + * the MemoryView is no longer needed. + */ +bool rb_memory_view_get(VALUE obj, rb_memory_view_t* memory_view, int flags); + +/** + * Release the given MemoryView `view` and decrement the reference count of + * `memory_view->obj`. + * + * Consumers must call this function when the MemoryView is no longer needed. + * Missing to call this function leads memory leak. + */ +bool rb_memory_view_release(rb_memory_view_t* memory_view); + +/* for testing */ +/** @cond INTERNAL_MACRO */ +RUBY_EXTERN VALUE rb_memory_view_exported_object_registry; +RUBY_EXTERN const rb_data_type_t rb_memory_view_exported_object_registry_data_type; +/** @endcond */ + +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_PURE() +/** + * Return `true` if the data in the MemoryView `view` is row-major or + * column-major contiguous. + * + * Return `false` otherwise. + */ +static inline bool +rb_memory_view_is_contiguous(const rb_memory_view_t *view) +{ + if (rb_memory_view_is_row_major_contiguous(view)) { + return true; + } + else if (rb_memory_view_is_column_major_contiguous(view)) { + return true; + } + else { + return false; + } +} + +#endif /* RUBY_BUFFER_H */ diff --git a/libs/libruby/ruby/missing.h b/libs/libruby/ruby/missing.h new file mode 100644 index 0000000..aea6c90 --- /dev/null +++ b/libs/libruby/ruby/missing.h @@ -0,0 +1,342 @@ +#ifndef RUBY_MISSING_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_MISSING_H 1 +/** + * @author $Author$ + * @date Sat May 11 23:46:03 JST 2002 + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @brief Prototype for *.c in ./missing, and for missing timeval struct. + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include +#endif + +#if defined(__cplusplus) +# include +#else +# include /* for INFINITY and NAN */ +#endif + +#ifdef RUBY_ALTERNATIVE_MALLOC_HEADER +# include RUBY_ALTERNATIVE_MALLOC_HEADER +#endif + +#if defined(HAVE_TIME_H) +# include +#endif + +#if defined(HAVE_SYS_TIME_H) +# include +#endif + +#ifdef HAVE_SYS_STAT_H +# include +#endif + +#ifdef HAVE_UNISTD_H +# include +#endif + +#ifdef HAVE_STDIO_H +# include +#endif + +#ifdef HAVE_IEEEFP_H +# include +#endif + +#include "ruby/internal/dllexport.h" +#include "ruby/internal/attr/format.h" + +#ifndef M_PI +# define M_PI 3.14159265358979323846 +#endif +#ifndef M_PI_2 +# define M_PI_2 (M_PI/2) +#endif + +#if !defined(HAVE_STRUCT_TIMEVAL) +struct timeval { + time_t tv_sec; /* seconds */ + long tv_usec; /* microseconds */ +}; +#endif /* HAVE_STRUCT_TIMEVAL */ + +#if !defined(HAVE_STRUCT_TIMESPEC) +/* :BEWARE: @shyouhei warns that IT IS A WRONG IDEA to define our own version + * of struct timespec here. `clock_gettime` is a system call, and your kernel + * could expect something other than just `long` (results stack smashing if + * that happens). See also https://ewontfix.com/19/ */ +struct timespec { + time_t tv_sec; /* seconds */ + long tv_nsec; /* nanoseconds */ +}; +#endif + +#if !defined(HAVE_STRUCT_TIMEZONE) +struct timezone { + int tz_minuteswest; + int tz_dsttime; +}; +#endif + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +#ifndef HAVE_ACOSH +RUBY_EXTERN double acosh(double); +RUBY_EXTERN double asinh(double); +RUBY_EXTERN double atanh(double); +#endif + +#ifndef HAVE_CRYPT +RUBY_EXTERN char *crypt(const char *, const char *); +#endif + +#ifndef HAVE_EACCESS +RUBY_EXTERN int eaccess(const char*, int); +#endif + +#ifndef HAVE_ROUND +RUBY_EXTERN double round(double); /* numeric.c */ +#endif + +#ifndef HAVE_FLOCK +RUBY_EXTERN int flock(int, int); +#endif + +/* +#ifndef HAVE_FREXP +RUBY_EXTERN double frexp(double, int *); +#endif +*/ + +#ifndef HAVE_HYPOT +RUBY_EXTERN double hypot(double, double); +#endif + +#ifndef HAVE_ERF +RUBY_EXTERN double erf(double); +RUBY_EXTERN double erfc(double); +#endif + +#ifndef HAVE_TGAMMA +RUBY_EXTERN double tgamma(double); +#endif + +#ifndef HAVE_LGAMMA_R +RUBY_EXTERN double lgamma_r(double, int *); +#endif + +#ifndef HAVE_CBRT +RUBY_EXTERN double cbrt(double); +#endif + +#if !defined(INFINITY) || !defined(NAN) +union bytesequence4_or_float { + unsigned char bytesequence[4]; + float float_value; +}; +#endif + +#ifndef INFINITY +/** @internal */ +RUBY_EXTERN const union bytesequence4_or_float rb_infinity; +# define INFINITY (rb_infinity.float_value) +# define USE_RB_INFINITY 1 +#endif + +#ifndef NAN +/** @internal */ +RUBY_EXTERN const union bytesequence4_or_float rb_nan; +# define NAN (rb_nan.float_value) +# define USE_RB_NAN 1 +#endif + +#ifndef HUGE_VAL +# define HUGE_VAL ((double)INFINITY) +#endif + +#ifndef HAVE_FINITE +# define HAVE_FINITE 1 +# define finite(x) isfinite(x) +#endif + +#ifndef HAVE_NAN +RUBY_EXTERN double nan(const char *); +#endif + +#ifndef HAVE_NEXTAFTER +RUBY_EXTERN double nextafter(double x, double y); +#endif + +/* +#ifndef HAVE_MEMCMP +RUBY_EXTERN int memcmp(const void *, const void *, size_t); +#endif +*/ + +#ifndef HAVE_MEMMOVE +RUBY_EXTERN void *memmove(void *, const void *, size_t); +#endif + +/* +#ifndef HAVE_MODF +RUBY_EXTERN double modf(double, double *); +#endif +*/ + +#ifndef HAVE_STRCHR +RUBY_EXTERN char *strchr(const char *, int); +RUBY_EXTERN char *strrchr(const char *, int); +#endif + +#ifndef HAVE_STRERROR +RUBY_EXTERN char *strerror(int); +#endif + +#ifndef HAVE_STRSTR +RUBY_EXTERN char *strstr(const char *, const char *); +#endif + +#ifndef HAVE_STRLCPY +RUBY_EXTERN size_t strlcpy(char *, const char*, size_t); +#endif + +#ifndef HAVE_STRLCAT +RUBY_EXTERN size_t strlcat(char *, const char*, size_t); +#endif + +#ifndef HAVE_FFS +RUBY_EXTERN int ffs(int); +#endif + +#ifdef BROKEN_CLOSE +# include +# include +RUBY_EXTERN int ruby_getpeername(int, struct sockaddr *, socklen_t *); +RUBY_EXTERN int ruby_getsockname(int, struct sockaddr *, socklen_t *); +RUBY_EXTERN int ruby_shutdown(int, int); +RUBY_EXTERN int ruby_close(int); +#endif + +#ifndef HAVE_SETPROCTITLE +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 1, 2) +RUBY_EXTERN void setproctitle(const char *fmt, ...); +#endif + +#ifdef HAVE_EXPLICIT_BZERO +# /* Take that. */ +#elif defined(SecureZeroMemory) +# define explicit_bzero(b, len) SecureZeroMemory(b, len) +#else +RUBY_EXTERN void explicit_bzero(void *b, size_t len); +#endif + +#ifndef HAVE_TZSET +RUBY_EXTERN void tzset(void); +#endif + +#ifndef HAVE_POSIX_MADVISE +RUBY_EXTERN int posix_madvise(void *, size_t, int); +#endif + +#ifndef HAVE_GETEUID +RUBY_EXTERN rb_uid_t geteuid(void); +#endif + +#ifndef HAVE_GETUID +RUBY_EXTERN rb_uid_t getuid(void); +#endif + +#ifndef HAVE_GETEGID +RUBY_EXTERN rb_gid_t getegid(void); +#endif + +#ifndef HAVE_GETGID +RUBY_EXTERN rb_gid_t getgid(void); +#endif + +#ifndef HAVE_GETLOGIN +RUBY_EXTERN char *getlogin(void); +#endif + +#ifndef HAVE_GETPPID +RUBY_EXTERN rb_pid_t getppid(void); +#endif + +#ifndef HAVE_UMASK +RUBY_EXTERN rb_mode_t umask(rb_mode_t); +#endif + +#ifndef HAVE_CHMOD +RUBY_EXTERN int chmod(const char *, rb_mode_t); +#endif + +#ifndef HAVE_CHOWN +RUBY_EXTERN int chown(const char *, rb_uid_t, rb_gid_t); +#endif + +#ifndef HAVE_PCLOSE +RUBY_EXTERN int pclose(FILE *); +#endif + +#ifndef HAVE_POPEN +RUBY_EXTERN FILE *popen(const char *, const char *); +#endif + +#ifndef HAVE_PIPE +RUBY_EXTERN int pipe(int [2]); +#endif + +#ifndef HAVE_DUP +RUBY_EXTERN int dup(int); +#endif + +#ifndef HAVE_DUP2 +RUBY_EXTERN int dup2(int, int); +#endif + +#ifndef HAVE_KILL +RUBY_EXTERN int kill(rb_pid_t, int); +#endif + +#ifndef HAVE_EXECL +RUBY_EXTERN int execl(const char *, const char *, ...); +#endif + +#ifndef HAVE_EXECLE +RUBY_EXTERN int execle(const char *, const char *, ...); +#endif + +#ifndef HAVE_EXECV +RUBY_EXTERN int execv(const char *, char *const []); +#endif + +#ifndef HAVE_EXECVE +RUBY_EXTERN int execve(const char *, char *const [], char *const []); +#endif + +#ifndef HAVE_SHUTDOWN +RUBY_EXTERN int shutdown(int, int); +#endif + +#ifndef HAVE_SYSTEM +RUBY_EXTERN int system(const char *); +#endif + +#ifndef WNOHANG +# define WNOHANG 0 +#endif + +#ifndef HAVE_WAITPID +# define HAVE_WAITPID 1 +RUBY_EXTERN rb_pid_t waitpid(rb_pid_t, int *, int); +#endif + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_MISSING_H */ diff --git a/libs/libruby/ruby/onigmo.h b/libs/libruby/ruby/onigmo.h new file mode 100644 index 0000000..8d7c601 --- /dev/null +++ b/libs/libruby/ruby/onigmo.h @@ -0,0 +1,952 @@ +#ifndef ONIGMO_H +#define ONIGMO_H +/********************************************************************** + onigmo.h - Onigmo (Oniguruma-mod) (regular expression library) +**********************************************************************/ +/*- + * Copyright (c) 2002-2009 K.Kosako + * Copyright (c) 2011-2017 K.Takata + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifdef __cplusplus +extern "C" { +# if 0 +} /* satisfy cc-mode */ +# endif +#endif + +#define ONIGMO_VERSION_MAJOR 6 +#define ONIGMO_VERSION_MINOR 1 +#define ONIGMO_VERSION_TEENY 3 + +#ifndef ONIG_EXTERN +# ifdef RUBY_EXTERN +# define ONIG_EXTERN RUBY_EXTERN +# else +# if defined(_WIN32) && !defined(__GNUC__) +# if defined(EXPORT) || defined(RUBY_EXPORT) +# define ONIG_EXTERN extern __declspec(dllexport) +# else +# define ONIG_EXTERN extern __declspec(dllimport) +# endif +# endif +# endif +#endif + +#ifndef ONIG_EXTERN +# define ONIG_EXTERN extern +#endif + +#ifndef RUBY +# ifndef RUBY_SYMBOL_EXPORT_BEGIN +# define RUBY_SYMBOL_EXPORT_BEGIN +# define RUBY_SYMBOL_EXPORT_END +# endif +#endif + +RUBY_SYMBOL_EXPORT_BEGIN + +#include /* for size_t */ + +/* PART: character encoding */ + +#ifndef ONIG_ESCAPE_UCHAR_COLLISION +# define UChar OnigUChar +#endif + +typedef unsigned char OnigUChar; +typedef unsigned int OnigCodePoint; +typedef unsigned int OnigCtype; +typedef size_t OnigDistance; +typedef ptrdiff_t OnigPosition; + +#define ONIG_INFINITE_DISTANCE ~((OnigDistance )0) + +/* + * Onig casefold/case mapping flags and related definitions + * + * Subfields (starting with 0 at LSB): + * 0-2: Code point count in casefold.h + * 3-12: Index into SpecialCaseMapping array in casefold.h + * 13-22: Case folding/mapping flags + */ +typedef unsigned int OnigCaseFoldType; /* case fold flag */ + +ONIG_EXTERN OnigCaseFoldType OnigDefaultCaseFoldFlag; + +/* bits for actual code point count; 3 bits is more than enough, currently only 2 used */ +#define OnigCodePointMaskWidth 3 +#define OnigCodePointMask ((1< Unicode:0x1ffc */ + +/* code range */ +#define ONIGENC_CODE_RANGE_NUM(range) ((int )range[0]) +#define ONIGENC_CODE_RANGE_FROM(range,i) range[((i)*2) + 1] +#define ONIGENC_CODE_RANGE_TO(range,i) range[((i)*2) + 2] + +typedef struct { + int byte_len; /* argument(original) character(s) byte length */ + int code_len; /* number of code */ + OnigCodePoint code[ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN]; +} OnigCaseFoldCodeItem; + +typedef struct { + OnigCodePoint esc; + OnigCodePoint anychar; + OnigCodePoint anytime; + OnigCodePoint zero_or_one_time; + OnigCodePoint one_or_more_time; + OnigCodePoint anychar_anytime; +} OnigMetaCharTableType; + +typedef int (*OnigApplyAllCaseFoldFunc)(OnigCodePoint from, OnigCodePoint* to, int to_len, void* arg); + +typedef struct OnigEncodingTypeST { + int (*precise_mbc_enc_len)(const OnigUChar* p,const OnigUChar* e, const struct OnigEncodingTypeST* enc); + const char* name; + int max_enc_len; + int min_enc_len; + int (*is_mbc_newline)(const OnigUChar* p, const OnigUChar* end, const struct OnigEncodingTypeST* enc); + OnigCodePoint (*mbc_to_code)(const OnigUChar* p, const OnigUChar* end, const struct OnigEncodingTypeST* enc); + int (*code_to_mbclen)(OnigCodePoint code, const struct OnigEncodingTypeST* enc); + int (*code_to_mbc)(OnigCodePoint code, OnigUChar *buf, const struct OnigEncodingTypeST* enc); + int (*mbc_case_fold)(OnigCaseFoldType flag, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to, const struct OnigEncodingTypeST* enc); + int (*apply_all_case_fold)(OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg, const struct OnigEncodingTypeST* enc); + int (*get_case_fold_codes_by_str)(OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem acs[], const struct OnigEncodingTypeST* enc); + int (*property_name_to_ctype)(const struct OnigEncodingTypeST* enc, const OnigUChar* p, const OnigUChar* end); + int (*is_code_ctype)(OnigCodePoint code, OnigCtype ctype, const struct OnigEncodingTypeST* enc); + int (*get_ctype_code_range)(OnigCtype ctype, OnigCodePoint* sb_out, const OnigCodePoint* ranges[], const struct OnigEncodingTypeST* enc); + OnigUChar* (*left_adjust_char_head)(const OnigUChar* start, const OnigUChar* p, const OnigUChar* end, const struct OnigEncodingTypeST* enc); + int (*is_allowed_reverse_match)(const OnigUChar* p, const OnigUChar* end, const struct OnigEncodingTypeST* enc); + int (*case_map)(OnigCaseFoldType* flagP, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to, OnigUChar* to_end, const struct OnigEncodingTypeST* enc); + int ruby_encoding_index; + unsigned int flags; +} OnigEncodingType; + +typedef const OnigEncodingType* OnigEncoding; + +ONIG_EXTERN const OnigEncodingType OnigEncodingASCII; +#ifndef RUBY +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_1; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_2; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_3; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_4; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_5; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_6; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_7; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_8; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_9; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_10; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_11; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_13; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_14; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_15; +ONIG_EXTERN const OnigEncodingType OnigEncodingISO_8859_16; +ONIG_EXTERN const OnigEncodingType OnigEncodingUTF_8; +ONIG_EXTERN const OnigEncodingType OnigEncodingUTF_16BE; +ONIG_EXTERN const OnigEncodingType OnigEncodingUTF_16LE; +ONIG_EXTERN const OnigEncodingType OnigEncodingUTF_32BE; +ONIG_EXTERN const OnigEncodingType OnigEncodingUTF_32LE; +ONIG_EXTERN const OnigEncodingType OnigEncodingEUC_JP; +ONIG_EXTERN const OnigEncodingType OnigEncodingEUC_TW; +ONIG_EXTERN const OnigEncodingType OnigEncodingEUC_KR; +ONIG_EXTERN const OnigEncodingType OnigEncodingEUC_CN; +ONIG_EXTERN const OnigEncodingType OnigEncodingShift_JIS; +ONIG_EXTERN const OnigEncodingType OnigEncodingWindows_31J; +/* ONIG_EXTERN const OnigEncodingType OnigEncodingKOI8; */ +ONIG_EXTERN const OnigEncodingType OnigEncodingKOI8_R; +ONIG_EXTERN const OnigEncodingType OnigEncodingKOI8_U; +ONIG_EXTERN const OnigEncodingType OnigEncodingWindows_1250; +ONIG_EXTERN const OnigEncodingType OnigEncodingWindows_1251; +ONIG_EXTERN const OnigEncodingType OnigEncodingWindows_1252; +ONIG_EXTERN const OnigEncodingType OnigEncodingWindows_1253; +ONIG_EXTERN const OnigEncodingType OnigEncodingWindows_1254; +ONIG_EXTERN const OnigEncodingType OnigEncodingWindows_1257; +ONIG_EXTERN const OnigEncodingType OnigEncodingBIG5; +ONIG_EXTERN const OnigEncodingType OnigEncodingGB18030; +#endif /* RUBY */ + +#define ONIG_ENCODING_ASCII (&OnigEncodingASCII) +#ifndef RUBY +# define ONIG_ENCODING_ISO_8859_1 (&OnigEncodingISO_8859_1) +# define ONIG_ENCODING_ISO_8859_2 (&OnigEncodingISO_8859_2) +# define ONIG_ENCODING_ISO_8859_3 (&OnigEncodingISO_8859_3) +# define ONIG_ENCODING_ISO_8859_4 (&OnigEncodingISO_8859_4) +# define ONIG_ENCODING_ISO_8859_5 (&OnigEncodingISO_8859_5) +# define ONIG_ENCODING_ISO_8859_6 (&OnigEncodingISO_8859_6) +# define ONIG_ENCODING_ISO_8859_7 (&OnigEncodingISO_8859_7) +# define ONIG_ENCODING_ISO_8859_8 (&OnigEncodingISO_8859_8) +# define ONIG_ENCODING_ISO_8859_9 (&OnigEncodingISO_8859_9) +# define ONIG_ENCODING_ISO_8859_10 (&OnigEncodingISO_8859_10) +# define ONIG_ENCODING_ISO_8859_11 (&OnigEncodingISO_8859_11) +# define ONIG_ENCODING_ISO_8859_13 (&OnigEncodingISO_8859_13) +# define ONIG_ENCODING_ISO_8859_14 (&OnigEncodingISO_8859_14) +# define ONIG_ENCODING_ISO_8859_15 (&OnigEncodingISO_8859_15) +# define ONIG_ENCODING_ISO_8859_16 (&OnigEncodingISO_8859_16) +# define ONIG_ENCODING_UTF_8 (&OnigEncodingUTF_8) +# define ONIG_ENCODING_UTF_16BE (&OnigEncodingUTF_16BE) +# define ONIG_ENCODING_UTF_16LE (&OnigEncodingUTF_16LE) +# define ONIG_ENCODING_UTF_32BE (&OnigEncodingUTF_32BE) +# define ONIG_ENCODING_UTF_32LE (&OnigEncodingUTF_32LE) +# define ONIG_ENCODING_EUC_JP (&OnigEncodingEUC_JP) +# define ONIG_ENCODING_EUC_TW (&OnigEncodingEUC_TW) +# define ONIG_ENCODING_EUC_KR (&OnigEncodingEUC_KR) +# define ONIG_ENCODING_EUC_CN (&OnigEncodingEUC_CN) +# define ONIG_ENCODING_SHIFT_JIS (&OnigEncodingShift_JIS) +# define ONIG_ENCODING_WINDOWS_31J (&OnigEncodingWindows_31J) +/* # define ONIG_ENCODING_KOI8 (&OnigEncodingKOI8) */ +# define ONIG_ENCODING_KOI8_R (&OnigEncodingKOI8_R) +# define ONIG_ENCODING_KOI8_U (&OnigEncodingKOI8_U) +# define ONIG_ENCODING_WINDOWS_1250 (&OnigEncodingWindows_1250) +# define ONIG_ENCODING_WINDOWS_1251 (&OnigEncodingWindows_1251) +# define ONIG_ENCODING_WINDOWS_1252 (&OnigEncodingWindows_1252) +# define ONIG_ENCODING_WINDOWS_1253 (&OnigEncodingWindows_1253) +# define ONIG_ENCODING_WINDOWS_1254 (&OnigEncodingWindows_1254) +# define ONIG_ENCODING_WINDOWS_1257 (&OnigEncodingWindows_1257) +# define ONIG_ENCODING_BIG5 (&OnigEncodingBIG5) +# define ONIG_ENCODING_GB18030 (&OnigEncodingGB18030) + +/* old names */ +# define ONIG_ENCODING_SJIS ONIG_ENCODING_SHIFT_JIS +# define ONIG_ENCODING_CP932 ONIG_ENCODING_WINDOWS_31J +# define ONIG_ENCODING_CP1250 ONIG_ENCODING_WINDOWS_1250 +# define ONIG_ENCODING_CP1251 ONIG_ENCODING_WINDOWS_1251 +# define ONIG_ENCODING_CP1252 ONIG_ENCODING_WINDOWS_1252 +# define ONIG_ENCODING_CP1253 ONIG_ENCODING_WINDOWS_1253 +# define ONIG_ENCODING_CP1254 ONIG_ENCODING_WINDOWS_1254 +# define ONIG_ENCODING_CP1257 ONIG_ENCODING_WINDOWS_1257 +# define ONIG_ENCODING_UTF8 ONIG_ENCODING_UTF_8 +# define ONIG_ENCODING_UTF16_BE ONIG_ENCODING_UTF_16BE +# define ONIG_ENCODING_UTF16_LE ONIG_ENCODING_UTF_16LE +# define ONIG_ENCODING_UTF32_BE ONIG_ENCODING_UTF_32BE +# define ONIG_ENCODING_UTF32_LE ONIG_ENCODING_UTF_32LE +#endif /* RUBY */ + +#define ONIG_ENCODING_UNDEF ((OnigEncoding )0) + +/* this declaration needs to be here because it is used in string.c in Ruby */ +ONIG_EXTERN +int onigenc_ascii_only_case_map(OnigCaseFoldType* flagP, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to, OnigUChar* to_end, const struct OnigEncodingTypeST* enc); + + +/* work size */ +#define ONIGENC_CODE_TO_MBC_MAXLEN 7 +#define ONIGENC_MBC_CASE_FOLD_MAXLEN 18 +/* 18: 6(max-byte) * 3(case-fold chars) */ + +/* character types */ +#define ONIGENC_CTYPE_NEWLINE 0 +#define ONIGENC_CTYPE_ALPHA 1 +#define ONIGENC_CTYPE_BLANK 2 +#define ONIGENC_CTYPE_CNTRL 3 +#define ONIGENC_CTYPE_DIGIT 4 +#define ONIGENC_CTYPE_GRAPH 5 +#define ONIGENC_CTYPE_LOWER 6 +#define ONIGENC_CTYPE_PRINT 7 +#define ONIGENC_CTYPE_PUNCT 8 +#define ONIGENC_CTYPE_SPACE 9 +#define ONIGENC_CTYPE_UPPER 10 +#define ONIGENC_CTYPE_XDIGIT 11 +#define ONIGENC_CTYPE_WORD 12 +#define ONIGENC_CTYPE_ALNUM 13 /* alpha || digit */ +#define ONIGENC_CTYPE_ASCII 14 +#define ONIGENC_MAX_STD_CTYPE ONIGENC_CTYPE_ASCII + +/* flags */ +#define ONIGENC_FLAG_NONE 0U +#define ONIGENC_FLAG_UNICODE 1U + +#define onig_enc_len(enc,p,e) ONIGENC_MBC_ENC_LEN(enc, p, e) + +#define ONIGENC_IS_UNDEF(enc) ((enc) == ONIG_ENCODING_UNDEF) +#define ONIGENC_IS_SINGLEBYTE(enc) (ONIGENC_MBC_MAXLEN(enc) == 1) +#define ONIGENC_IS_MBC_HEAD(enc,p,e) (ONIGENC_MBC_ENC_LEN(enc,p,e) != 1) +#define ONIGENC_IS_MBC_ASCII(p) (*(p) < 128) +#define ONIGENC_IS_CODE_ASCII(code) ((code) < 128) +#define ONIGENC_IS_MBC_WORD(enc,s,end) \ + ONIGENC_IS_CODE_WORD(enc,ONIGENC_MBC_TO_CODE(enc,s,end)) +#define ONIGENC_IS_MBC_ASCII_WORD(enc,s,end) \ + onigenc_ascii_is_code_ctype( \ + ONIGENC_MBC_TO_CODE(enc,s,end),ONIGENC_CTYPE_WORD,enc) +#define ONIGENC_IS_UNICODE(enc) ((enc)->flags & ONIGENC_FLAG_UNICODE) + + +#define ONIGENC_NAME(enc) ((enc)->name) + +#define ONIGENC_MBC_CASE_FOLD(enc,flag,pp,end,buf) \ + (enc)->mbc_case_fold(flag,(const OnigUChar** )pp,end,buf,enc) +#define ONIGENC_IS_ALLOWED_REVERSE_MATCH(enc,s,end) \ + (enc)->is_allowed_reverse_match(s,end,enc) +#define ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc,start,s,end) \ + (enc)->left_adjust_char_head(start, s, end, enc) +#define ONIGENC_APPLY_ALL_CASE_FOLD(enc,case_fold_flag,f,arg) \ + (enc)->apply_all_case_fold(case_fold_flag,f,arg,enc) +#define ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc,case_fold_flag,p,end,acs) \ + (enc)->get_case_fold_codes_by_str(case_fold_flag,p,end,acs,enc) +#define ONIGENC_STEP_BACK(enc,start,s,end,n) \ + onigenc_step_back((enc),(start),(s),(end),(n)) + +#define ONIGENC_CONSTRUCT_MBCLEN_CHARFOUND(n) (n) +#define ONIGENC_MBCLEN_CHARFOUND_P(r) (0 < (r)) +#define ONIGENC_MBCLEN_CHARFOUND_LEN(r) (r) + +#define ONIGENC_CONSTRUCT_MBCLEN_INVALID() (-1) +#define ONIGENC_MBCLEN_INVALID_P(r) ((r) == -1) + +#define ONIGENC_CONSTRUCT_MBCLEN_NEEDMORE(n) (-1-(n)) +#define ONIGENC_MBCLEN_NEEDMORE_P(r) ((r) < -1) +#define ONIGENC_MBCLEN_NEEDMORE_LEN(r) (-1-(r)) + +#define ONIGENC_PRECISE_MBC_ENC_LEN(enc,p,e) (enc)->precise_mbc_enc_len(p,e,enc) + +ONIG_EXTERN +int onigenc_mbclen(const OnigUChar* p,const OnigUChar* e, const struct OnigEncodingTypeST* enc); + +#define ONIGENC_MBC_ENC_LEN(enc,p,e) onigenc_mbclen(p,e,enc) +#define ONIGENC_MBC_MAXLEN(enc) ((enc)->max_enc_len) +#define ONIGENC_MBC_MAXLEN_DIST(enc) ONIGENC_MBC_MAXLEN(enc) +#define ONIGENC_MBC_MINLEN(enc) ((enc)->min_enc_len) +#define ONIGENC_IS_MBC_NEWLINE(enc,p,end) (enc)->is_mbc_newline((p),(end),enc) +#define ONIGENC_MBC_TO_CODE(enc,p,end) (enc)->mbc_to_code((p),(end),enc) +#define ONIGENC_CODE_TO_MBCLEN(enc,code) (enc)->code_to_mbclen(code,enc) +#define ONIGENC_CODE_TO_MBC(enc,code,buf) (enc)->code_to_mbc(code,buf,enc) +#define ONIGENC_PROPERTY_NAME_TO_CTYPE(enc,p,end) \ + (enc)->property_name_to_ctype(enc,p,end) + +#define ONIGENC_IS_CODE_CTYPE(enc,code,ctype) (enc)->is_code_ctype(code,ctype,enc) + +#define ONIGENC_IS_CODE_NEWLINE(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_NEWLINE) +#define ONIGENC_IS_CODE_GRAPH(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_GRAPH) +#define ONIGENC_IS_CODE_PRINT(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PRINT) +#define ONIGENC_IS_CODE_ALNUM(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALNUM) +#define ONIGENC_IS_CODE_ALPHA(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALPHA) +#define ONIGENC_IS_CODE_LOWER(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_LOWER) +#define ONIGENC_IS_CODE_UPPER(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_UPPER) +#define ONIGENC_IS_CODE_CNTRL(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_CNTRL) +#define ONIGENC_IS_CODE_PUNCT(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PUNCT) +#define ONIGENC_IS_CODE_SPACE(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_SPACE) +#define ONIGENC_IS_CODE_BLANK(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_BLANK) +#define ONIGENC_IS_CODE_DIGIT(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_DIGIT) +#define ONIGENC_IS_CODE_XDIGIT(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_XDIGIT) +#define ONIGENC_IS_CODE_WORD(enc,code) \ + ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_WORD) + +#define ONIGENC_GET_CTYPE_CODE_RANGE(enc,ctype,sbout,ranges) \ + (enc)->get_ctype_code_range(ctype,sbout,ranges,enc) + +ONIG_EXTERN +OnigUChar* onigenc_step_back(OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, const OnigUChar* end, int n); + + +/* encoding API */ +ONIG_EXTERN +int onigenc_init(void); +ONIG_EXTERN +int onigenc_set_default_encoding(OnigEncoding enc); +ONIG_EXTERN +OnigEncoding onigenc_get_default_encoding(void); +ONIG_EXTERN +OnigUChar* onigenc_get_right_adjust_char_head_with_prev(OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, const OnigUChar* end, const OnigUChar** prev); +ONIG_EXTERN +OnigUChar* onigenc_get_prev_char_head(OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, const OnigUChar* end); +ONIG_EXTERN +OnigUChar* onigenc_get_left_adjust_char_head(OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, const OnigUChar* end); +ONIG_EXTERN +OnigUChar* onigenc_get_right_adjust_char_head(OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, const OnigUChar* end); +ONIG_EXTERN +int onigenc_strlen(OnigEncoding enc, const OnigUChar* p, const OnigUChar* end); +ONIG_EXTERN +int onigenc_strlen_null(OnigEncoding enc, const OnigUChar* p); +ONIG_EXTERN +int onigenc_str_bytelen_null(OnigEncoding enc, const OnigUChar* p); + + + +/* PART: regular expression */ + +/* config parameters */ +#define ONIG_NREGION 4 +#define ONIG_MAX_CAPTURE_GROUP_NUM 32767 +#define ONIG_MAX_BACKREF_NUM 1000 +#define ONIG_MAX_REPEAT_NUM 100000 +#define ONIG_MAX_MULTI_BYTE_RANGES_NUM 10000 +/* constants */ +#define ONIG_MAX_ERROR_MESSAGE_LEN 90 + +typedef unsigned int OnigOptionType; + +#define ONIG_OPTION_DEFAULT ONIG_OPTION_NONE + +/* options */ +#define ONIG_OPTION_NONE 0U +#define ONIG_OPTION_IGNORECASE 1U +#define ONIG_OPTION_EXTEND (ONIG_OPTION_IGNORECASE << 1) +#define ONIG_OPTION_MULTILINE (ONIG_OPTION_EXTEND << 1) +#define ONIG_OPTION_DOTALL ONIG_OPTION_MULTILINE +#define ONIG_OPTION_SINGLELINE (ONIG_OPTION_MULTILINE << 1) +#define ONIG_OPTION_FIND_LONGEST (ONIG_OPTION_SINGLELINE << 1) +#define ONIG_OPTION_FIND_NOT_EMPTY (ONIG_OPTION_FIND_LONGEST << 1) +#define ONIG_OPTION_NEGATE_SINGLELINE (ONIG_OPTION_FIND_NOT_EMPTY << 1) +#define ONIG_OPTION_DONT_CAPTURE_GROUP (ONIG_OPTION_NEGATE_SINGLELINE << 1) +#define ONIG_OPTION_CAPTURE_GROUP (ONIG_OPTION_DONT_CAPTURE_GROUP << 1) +/* options (search time) */ +#define ONIG_OPTION_NOTBOL (ONIG_OPTION_CAPTURE_GROUP << 1) +#define ONIG_OPTION_NOTEOL (ONIG_OPTION_NOTBOL << 1) +#define ONIG_OPTION_NOTBOS (ONIG_OPTION_NOTEOL << 1) +#define ONIG_OPTION_NOTEOS (ONIG_OPTION_NOTBOS << 1) +/* options (ctype range) */ +#define ONIG_OPTION_ASCII_RANGE (ONIG_OPTION_NOTEOS << 1) +#define ONIG_OPTION_POSIX_BRACKET_ALL_RANGE (ONIG_OPTION_ASCII_RANGE << 1) +#define ONIG_OPTION_WORD_BOUND_ALL_RANGE (ONIG_OPTION_POSIX_BRACKET_ALL_RANGE << 1) +/* options (newline) */ +#define ONIG_OPTION_NEWLINE_CRLF (ONIG_OPTION_WORD_BOUND_ALL_RANGE << 1) +#define ONIG_OPTION_MAXBIT ONIG_OPTION_NEWLINE_CRLF /* limit */ + +#define ONIG_OPTION_ON(options,regopt) ((options) |= (regopt)) +#define ONIG_OPTION_OFF(options,regopt) ((options) &= ~(regopt)) +#define ONIG_IS_OPTION_ON(options,option) ((options) & (option)) + +/* syntax */ +typedef struct { + unsigned int op; + unsigned int op2; + unsigned int behavior; + OnigOptionType options; /* default option */ + OnigMetaCharTableType meta_char_table; +} OnigSyntaxType; + +ONIG_EXTERN const OnigSyntaxType OnigSyntaxASIS; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxPosixBasic; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxPosixExtended; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxEmacs; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxGrep; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxGnuRegex; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxJava; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxPerl58; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxPerl58_NG; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxPerl; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxRuby; +ONIG_EXTERN const OnigSyntaxType OnigSyntaxPython; + +/* predefined syntaxes (see regsyntax.c) */ +#define ONIG_SYNTAX_ASIS (&OnigSyntaxASIS) +#define ONIG_SYNTAX_POSIX_BASIC (&OnigSyntaxPosixBasic) +#define ONIG_SYNTAX_POSIX_EXTENDED (&OnigSyntaxPosixExtended) +#define ONIG_SYNTAX_EMACS (&OnigSyntaxEmacs) +#define ONIG_SYNTAX_GREP (&OnigSyntaxGrep) +#define ONIG_SYNTAX_GNU_REGEX (&OnigSyntaxGnuRegex) +#define ONIG_SYNTAX_JAVA (&OnigSyntaxJava) +#define ONIG_SYNTAX_PERL58 (&OnigSyntaxPerl58) +#define ONIG_SYNTAX_PERL58_NG (&OnigSyntaxPerl58_NG) +#define ONIG_SYNTAX_PERL (&OnigSyntaxPerl) +#define ONIG_SYNTAX_RUBY (&OnigSyntaxRuby) +#define ONIG_SYNTAX_PYTHON (&OnigSyntaxPython) + +/* default syntax */ +ONIG_EXTERN const OnigSyntaxType* OnigDefaultSyntax; +#define ONIG_SYNTAX_DEFAULT OnigDefaultSyntax + +/* syntax (operators) */ +#define ONIG_SYN_OP_VARIABLE_META_CHARACTERS (1U<<0) +#define ONIG_SYN_OP_DOT_ANYCHAR (1U<<1) /* . */ +#define ONIG_SYN_OP_ASTERISK_ZERO_INF (1U<<2) /* * */ +#define ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF (1U<<3) +#define ONIG_SYN_OP_PLUS_ONE_INF (1U<<4) /* + */ +#define ONIG_SYN_OP_ESC_PLUS_ONE_INF (1U<<5) +#define ONIG_SYN_OP_QMARK_ZERO_ONE (1U<<6) /* ? */ +#define ONIG_SYN_OP_ESC_QMARK_ZERO_ONE (1U<<7) +#define ONIG_SYN_OP_BRACE_INTERVAL (1U<<8) /* {lower,upper} */ +#define ONIG_SYN_OP_ESC_BRACE_INTERVAL (1U<<9) /* \{lower,upper\} */ +#define ONIG_SYN_OP_VBAR_ALT (1U<<10) /* | */ +#define ONIG_SYN_OP_ESC_VBAR_ALT (1U<<11) /* \| */ +#define ONIG_SYN_OP_LPAREN_SUBEXP (1U<<12) /* (...) */ +#define ONIG_SYN_OP_ESC_LPAREN_SUBEXP (1U<<13) /* \(...\) */ +#define ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR (1U<<14) /* \A, \Z, \z */ +#define ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR (1U<<15) /* \G */ +#define ONIG_SYN_OP_DECIMAL_BACKREF (1U<<16) /* \num */ +#define ONIG_SYN_OP_BRACKET_CC (1U<<17) /* [...] */ +#define ONIG_SYN_OP_ESC_W_WORD (1U<<18) /* \w, \W */ +#define ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END (1U<<19) /* \<. \> */ +#define ONIG_SYN_OP_ESC_B_WORD_BOUND (1U<<20) /* \b, \B */ +#define ONIG_SYN_OP_ESC_S_WHITE_SPACE (1U<<21) /* \s, \S */ +#define ONIG_SYN_OP_ESC_D_DIGIT (1U<<22) /* \d, \D */ +#define ONIG_SYN_OP_LINE_ANCHOR (1U<<23) /* ^, $ */ +#define ONIG_SYN_OP_POSIX_BRACKET (1U<<24) /* [:xxxx:] */ +#define ONIG_SYN_OP_QMARK_NON_GREEDY (1U<<25) /* ??,*?,+?,{n,m}? */ +#define ONIG_SYN_OP_ESC_CONTROL_CHARS (1U<<26) /* \n,\r,\t,\a ... */ +#define ONIG_SYN_OP_ESC_C_CONTROL (1U<<27) /* \cx */ +#define ONIG_SYN_OP_ESC_OCTAL3 (1U<<28) /* \OOO */ +#define ONIG_SYN_OP_ESC_X_HEX2 (1U<<29) /* \xHH */ +#define ONIG_SYN_OP_ESC_X_BRACE_HEX8 (1U<<30) /* \x{7HHHHHHH} */ +#define ONIG_SYN_OP_ESC_O_BRACE_OCTAL (1U<<31) /* \o{OOO} */ + +#define ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE (1U<<0) /* \Q...\E */ +#define ONIG_SYN_OP2_QMARK_GROUP_EFFECT (1U<<1) /* (?...) */ +#define ONIG_SYN_OP2_OPTION_PERL (1U<<2) /* (?imsxadlu), (?-imsx), (?^imsxalu) */ +#define ONIG_SYN_OP2_OPTION_RUBY (1U<<3) /* (?imxadu), (?-imx) */ +#define ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT (1U<<4) /* ?+,*+,++ */ +#define ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL (1U<<5) /* {n,m}+ */ +#define ONIG_SYN_OP2_CCLASS_SET_OP (1U<<6) /* [...&&..[..]..] */ +#define ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP (1U<<7) /* (?...) */ +#define ONIG_SYN_OP2_ESC_K_NAMED_BACKREF (1U<<8) /* \k */ +#define ONIG_SYN_OP2_ESC_G_SUBEXP_CALL (1U<<9) /* \g, \g */ +#define ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY (1U<<10) /* (?@..),(?@..) */ +#define ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL (1U<<11) /* \C-x */ +#define ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META (1U<<12) /* \M-x */ +#define ONIG_SYN_OP2_ESC_V_VTAB (1U<<13) /* \v as VTAB */ +#define ONIG_SYN_OP2_ESC_U_HEX4 (1U<<14) /* \uHHHH */ +#define ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR (1U<<15) /* \`, \' */ +#define ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY (1U<<16) /* \p{...}, \P{...} */ +#define ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT (1U<<17) /* \p{^..}, \P{^..} */ +/* #define ONIG_SYN_OP2_CHAR_PROPERTY_PREFIX_IS (1U<<18) */ +#define ONIG_SYN_OP2_ESC_H_XDIGIT (1U<<19) /* \h, \H */ +#define ONIG_SYN_OP2_INEFFECTIVE_ESCAPE (1U<<20) /* \ */ +#define ONIG_SYN_OP2_ESC_CAPITAL_R_LINEBREAK (1U<<21) /* \R as (?>\x0D\x0A|[\x0A-\x0D\x{85}\x{2028}\x{2029}]) */ +#define ONIG_SYN_OP2_ESC_CAPITAL_X_EXTENDED_GRAPHEME_CLUSTER (1U<<22) /* \X */ +#define ONIG_SYN_OP2_ESC_V_VERTICAL_WHITESPACE (1U<<23) /* \v, \V -- Perl */ /* NOTIMPL */ +#define ONIG_SYN_OP2_ESC_H_HORIZONTAL_WHITESPACE (1U<<24) /* \h, \H -- Perl */ /* NOTIMPL */ +#define ONIG_SYN_OP2_ESC_CAPITAL_K_KEEP (1U<<25) /* \K */ +#define ONIG_SYN_OP2_ESC_G_BRACE_BACKREF (1U<<26) /* \g{name}, \g{n} */ +#define ONIG_SYN_OP2_QMARK_SUBEXP_CALL (1U<<27) /* (?&name), (?n), (?R), (?0) */ +#define ONIG_SYN_OP2_QMARK_VBAR_BRANCH_RESET (1U<<28) /* (?|...) */ /* NOTIMPL */ +#define ONIG_SYN_OP2_QMARK_LPAREN_CONDITION (1U<<29) /* (?(cond)yes...|no...) */ +#define ONIG_SYN_OP2_QMARK_CAPITAL_P_NAMED_GROUP (1U<<30) /* (?P...), (?P=name), (?P>name) -- Python/PCRE */ +#define ONIG_SYN_OP2_QMARK_TILDE_ABSENT (1U<<31) /* (?~...) */ +/* #define ONIG_SYN_OP2_OPTION_JAVA (1U< {0,n} */ +#define ONIG_SYN_STRICT_CHECK_BACKREF (1U<<5) /* /(\1)/,/\1()/ ..*/ +#define ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND (1U<<6) /* (?<=a|bc) */ +#define ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP (1U<<7) /* see doc/RE */ +#define ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME (1U<<8) /* (?)(?) */ +#define ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY (1U<<9) /* a{n}?=(?:a{n})? */ +#define ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME_CALL (1U<<10) /* (?)(?)(?&x) */ +#define ONIG_SYN_USE_LEFT_MOST_NAMED_GROUP (1U<<11) /* (?)(?)\k */ + +/* syntax (behavior) in char class [...] */ +#define ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC (1U<<20) /* [^...] */ +#define ONIG_SYN_BACKSLASH_ESCAPE_IN_CC (1U<<21) /* [..\w..] etc.. */ +#define ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC (1U<<22) +#define ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC (1U<<23) /* [0-9-a]=[0-9\-a] */ +/* syntax (behavior) warning */ +#define ONIG_SYN_WARN_CC_OP_NOT_ESCAPED (1U<<24) /* [,-,] */ +#define ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT (1U<<25) /* (?:a*)+ */ +#define ONIG_SYN_WARN_CC_DUP (1U<<26) /* [aa] */ + +/* meta character specifiers (onig_set_meta_char()) */ +#define ONIG_META_CHAR_ESCAPE 0 +#define ONIG_META_CHAR_ANYCHAR 1 +#define ONIG_META_CHAR_ANYTIME 2 +#define ONIG_META_CHAR_ZERO_OR_ONE_TIME 3 +#define ONIG_META_CHAR_ONE_OR_MORE_TIME 4 +#define ONIG_META_CHAR_ANYCHAR_ANYTIME 5 + +#define ONIG_INEFFECTIVE_META_CHAR 0 + +/* error codes */ +#define ONIG_IS_PATTERN_ERROR(ecode) ((ecode) <= -100 && (ecode) > -1000) +/* normal return */ +#define ONIG_NORMAL 0 +#define ONIG_MISMATCH -1 +#define ONIG_NO_SUPPORT_CONFIG -2 + +/* internal error */ +#define ONIGERR_MEMORY -5 +#define ONIGERR_TYPE_BUG -6 +#define ONIGERR_PARSER_BUG -11 +#define ONIGERR_STACK_BUG -12 +#define ONIGERR_UNDEFINED_BYTECODE -13 +#define ONIGERR_UNEXPECTED_BYTECODE -14 +#define ONIGERR_MATCH_STACK_LIMIT_OVER -15 +#define ONIGERR_PARSE_DEPTH_LIMIT_OVER -16 +#define ONIGERR_DEFAULT_ENCODING_IS_NOT_SET -21 +#define ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR -22 +/* general error */ +#define ONIGERR_INVALID_ARGUMENT -30 +/* syntax error */ +#define ONIGERR_END_PATTERN_AT_LEFT_BRACE -100 +#define ONIGERR_END_PATTERN_AT_LEFT_BRACKET -101 +#define ONIGERR_EMPTY_CHAR_CLASS -102 +#define ONIGERR_PREMATURE_END_OF_CHAR_CLASS -103 +#define ONIGERR_END_PATTERN_AT_ESCAPE -104 +#define ONIGERR_END_PATTERN_AT_META -105 +#define ONIGERR_END_PATTERN_AT_CONTROL -106 +#define ONIGERR_META_CODE_SYNTAX -108 +#define ONIGERR_CONTROL_CODE_SYNTAX -109 +#define ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE -110 +#define ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE -111 +#define ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS -112 +#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED -113 +#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID -114 +#define ONIGERR_NESTED_REPEAT_OPERATOR -115 +#define ONIGERR_UNMATCHED_CLOSE_PARENTHESIS -116 +#define ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS -117 +#define ONIGERR_END_PATTERN_IN_GROUP -118 +#define ONIGERR_UNDEFINED_GROUP_OPTION -119 +#define ONIGERR_INVALID_POSIX_BRACKET_TYPE -121 +#define ONIGERR_INVALID_LOOK_BEHIND_PATTERN -122 +#define ONIGERR_INVALID_REPEAT_RANGE_PATTERN -123 +#define ONIGERR_INVALID_CONDITION_PATTERN -124 +/* values error (syntax error) */ +#define ONIGERR_TOO_BIG_NUMBER -200 +#define ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE -201 +#define ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE -202 +#define ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS -203 +#define ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE -204 +#define ONIGERR_TOO_MANY_MULTI_BYTE_RANGES -205 +#define ONIGERR_TOO_SHORT_MULTI_BYTE_STRING -206 +#define ONIGERR_TOO_BIG_BACKREF_NUMBER -207 +#define ONIGERR_INVALID_BACKREF -208 +#define ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED -209 +#define ONIGERR_TOO_MANY_CAPTURE_GROUPS -210 +#define ONIGERR_TOO_SHORT_DIGITS -211 +#define ONIGERR_TOO_LONG_WIDE_CHAR_VALUE -212 +#define ONIGERR_EMPTY_GROUP_NAME -214 +#define ONIGERR_INVALID_GROUP_NAME -215 +#define ONIGERR_INVALID_CHAR_IN_GROUP_NAME -216 +#define ONIGERR_UNDEFINED_NAME_REFERENCE -217 +#define ONIGERR_UNDEFINED_GROUP_REFERENCE -218 +#define ONIGERR_MULTIPLEX_DEFINED_NAME -219 +#define ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL -220 +#define ONIGERR_NEVER_ENDING_RECURSION -221 +#define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY -222 +#define ONIGERR_INVALID_CHAR_PROPERTY_NAME -223 +#define ONIGERR_INVALID_CODE_POINT_VALUE -400 +#define ONIGERR_INVALID_WIDE_CHAR_VALUE -400 +#define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE -401 +#define ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION -402 +#define ONIGERR_INVALID_COMBINATION_OF_OPTIONS -403 + +/* errors related to thread */ +/* #define ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT -1001 */ + + +/* must be smaller than BIT_STATUS_BITS_NUM (unsigned int * 8) */ +#define ONIG_MAX_CAPTURE_HISTORY_GROUP 31 +#define ONIG_IS_CAPTURE_HISTORY_GROUP(r, i) \ + ((i) <= ONIG_MAX_CAPTURE_HISTORY_GROUP && (r)->list && (r)->list[i]) + +#ifdef USE_CAPTURE_HISTORY +typedef struct OnigCaptureTreeNodeStruct { + int group; /* group number */ + OnigPosition beg; + OnigPosition end; + int allocated; + int num_childs; + struct OnigCaptureTreeNodeStruct** childs; +} OnigCaptureTreeNode; +#endif + +/* match result region type */ +struct re_registers { + int allocated; + int num_regs; + OnigPosition* beg; + OnigPosition* end; +#ifdef USE_CAPTURE_HISTORY + /* extended */ + OnigCaptureTreeNode* history_root; /* capture history tree root */ +#endif +}; + +/* capture tree traverse */ +#define ONIG_TRAVERSE_CALLBACK_AT_FIRST 1 +#define ONIG_TRAVERSE_CALLBACK_AT_LAST 2 +#define ONIG_TRAVERSE_CALLBACK_AT_BOTH \ + ( ONIG_TRAVERSE_CALLBACK_AT_FIRST | ONIG_TRAVERSE_CALLBACK_AT_LAST ) + + +#define ONIG_REGION_NOTPOS -1 + +typedef struct re_registers OnigRegion; + +typedef struct { + OnigEncoding enc; + OnigUChar* par; + OnigUChar* par_end; +} OnigErrorInfo; + +typedef struct { + int lower; + int upper; + long base_num; + long inner_num; +} OnigRepeatRange; + +typedef void (*OnigWarnFunc)(const char* s); +extern void onig_null_warn(const char* s); +#define ONIG_NULL_WARN onig_null_warn + +#define ONIG_CHAR_TABLE_SIZE 256 + +typedef struct re_pattern_buffer { + /* common members of BBuf(bytes-buffer) */ + unsigned char* p; /* compiled pattern */ + unsigned int used; /* used space for p */ + unsigned int alloc; /* allocated space for p */ + + int num_mem; /* used memory(...) num counted from 1 */ + int num_repeat; /* OP_REPEAT/OP_REPEAT_NG id-counter */ + int num_null_check; /* OP_NULL_CHECK_START/END id counter */ + int num_comb_exp_check; /* combination explosion check */ + int num_call; /* number of subexp call */ + unsigned int capture_history; /* (?@...) flag (1-31) */ + unsigned int bt_mem_start; /* need backtrack flag */ + unsigned int bt_mem_end; /* need backtrack flag */ + int stack_pop_level; + int repeat_range_alloc; + + OnigOptionType options; + + OnigRepeatRange* repeat_range; + + OnigEncoding enc; + const OnigSyntaxType* syntax; + void* name_table; + OnigCaseFoldType case_fold_flag; + + /* optimization info (string search, char-map and anchors) */ + int optimize; /* optimize flag */ + int threshold_len; /* search str-length for apply optimize */ + int anchor; /* BEGIN_BUF, BEGIN_POS, (SEMI_)END_BUF */ + OnigDistance anchor_dmin; /* (SEMI_)END_BUF anchor distance */ + OnigDistance anchor_dmax; /* (SEMI_)END_BUF anchor distance */ + int sub_anchor; /* start-anchor for exact or map */ + unsigned char *exact; + unsigned char *exact_end; + unsigned char map[ONIG_CHAR_TABLE_SIZE]; /* used as BM skip or char-map */ + int *int_map; /* BM skip for exact_len > 255 */ + int *int_map_backward; /* BM skip for backward search */ + OnigDistance dmin; /* min-distance of exact or map */ + OnigDistance dmax; /* max-distance of exact or map */ + + /* rb_hrtime_t from hrtime.h */ +#ifdef MY_RUBY_BUILD_MAY_TIME_TRAVEL + int128_t timelimit; +#else + uint64_t timelimit; +#endif + + /* regex_t link chain */ + struct re_pattern_buffer* chain; /* escape compile-conflict */ +} OnigRegexType; + +typedef OnigRegexType* OnigRegex; + +#ifndef ONIG_ESCAPE_REGEX_T_COLLISION +typedef OnigRegexType regex_t; +#endif + + +typedef struct { + int num_of_elements; + OnigEncoding pattern_enc; + OnigEncoding target_enc; + const OnigSyntaxType* syntax; + OnigOptionType option; + OnigCaseFoldType case_fold_flag; +} OnigCompileInfo; + +/* Oniguruma Native API */ +ONIG_EXTERN +int onig_initialize(OnigEncoding encodings[], int n); +ONIG_EXTERN +int onig_init(void); +ONIG_EXTERN +int onig_error_code_to_str(OnigUChar* s, OnigPosition err_code, ...); +ONIG_EXTERN +void onig_set_warn_func(OnigWarnFunc f); +ONIG_EXTERN +void onig_set_verb_warn_func(OnigWarnFunc f); +ONIG_EXTERN +int onig_new(OnigRegex*, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, const OnigSyntaxType* syntax, OnigErrorInfo* einfo); +ONIG_EXTERN +int onig_reg_init(OnigRegex reg, OnigOptionType option, OnigCaseFoldType case_fold_flag, OnigEncoding enc, const OnigSyntaxType* syntax); +ONIG_EXTERN +int onig_new_without_alloc(OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, const OnigSyntaxType* syntax, OnigErrorInfo* einfo); +ONIG_EXTERN +int onig_new_deluxe(OnigRegex* reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo); +ONIG_EXTERN +void onig_free(OnigRegex); +ONIG_EXTERN +void onig_free_body(OnigRegex); +ONIG_EXTERN +OnigPosition onig_scan(OnigRegex reg, const OnigUChar* str, const OnigUChar* end, OnigRegion* region, OnigOptionType option, int (*scan_callback)(OnigPosition, OnigPosition, OnigRegion*, void*), void* callback_arg); +ONIG_EXTERN +OnigPosition onig_search(OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* start, const OnigUChar* range, OnigRegion* region, OnigOptionType option); +ONIG_EXTERN +OnigPosition onig_search_gpos(OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* global_pos, const OnigUChar* start, const OnigUChar* range, OnigRegion* region, OnigOptionType option); +ONIG_EXTERN +OnigPosition onig_match(OnigRegex, const OnigUChar* str, const OnigUChar* end, const OnigUChar* at, OnigRegion* region, OnigOptionType option); +ONIG_EXTERN +int onig_check_linear_time(OnigRegex reg); +ONIG_EXTERN +OnigRegion* onig_region_new(void); +ONIG_EXTERN +void onig_region_init(OnigRegion* region); +ONIG_EXTERN +void onig_region_free(OnigRegion* region, int free_self); +ONIG_EXTERN +void onig_region_copy(OnigRegion* to, const OnigRegion* from); +ONIG_EXTERN +void onig_region_clear(OnigRegion* region); +ONIG_EXTERN +int onig_region_resize(OnigRegion* region, int n); +ONIG_EXTERN +int onig_region_set(OnigRegion* region, int at, int beg, int end); +ONIG_EXTERN +int onig_name_to_group_numbers(OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, int** nums); +ONIG_EXTERN +int onig_name_to_backref_number(OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, const OnigRegion *region); +ONIG_EXTERN +int onig_foreach_name(OnigRegex reg, int (*func)(const OnigUChar*, const OnigUChar*,int,int*,OnigRegex,void*), void* arg); +ONIG_EXTERN +int onig_number_of_names(const OnigRegexType *reg); +ONIG_EXTERN +int onig_number_of_captures(const OnigRegexType *reg); +ONIG_EXTERN +int onig_number_of_capture_histories(const OnigRegexType *reg); +#ifdef USE_CAPTURE_HISTORY +ONIG_EXTERN +OnigCaptureTreeNode* onig_get_capture_tree(OnigRegion* region); +#endif +ONIG_EXTERN +int onig_capture_tree_traverse(OnigRegion* region, int at, int(*callback_func)(int,OnigPosition,OnigPosition,int,int,void*), void* arg); +ONIG_EXTERN +int onig_noname_group_capture_is_active(const OnigRegexType *reg); +ONIG_EXTERN +OnigEncoding onig_get_encoding(const OnigRegexType *reg); +ONIG_EXTERN +OnigOptionType onig_get_options(const OnigRegexType *reg); +ONIG_EXTERN +OnigCaseFoldType onig_get_case_fold_flag(const OnigRegexType *reg); +ONIG_EXTERN +const OnigSyntaxType* onig_get_syntax(const OnigRegexType *reg); +ONIG_EXTERN +int onig_set_default_syntax(const OnigSyntaxType* syntax); +ONIG_EXTERN +void onig_copy_syntax(OnigSyntaxType* to, const OnigSyntaxType* from); +ONIG_EXTERN +unsigned int onig_get_syntax_op(const OnigSyntaxType* syntax); +ONIG_EXTERN +unsigned int onig_get_syntax_op2(const OnigSyntaxType* syntax); +ONIG_EXTERN +unsigned int onig_get_syntax_behavior(const OnigSyntaxType* syntax); +ONIG_EXTERN +OnigOptionType onig_get_syntax_options(const OnigSyntaxType* syntax); +ONIG_EXTERN +void onig_set_syntax_op(OnigSyntaxType* syntax, unsigned int op); +ONIG_EXTERN +void onig_set_syntax_op2(OnigSyntaxType* syntax, unsigned int op2); +ONIG_EXTERN +void onig_set_syntax_behavior(OnigSyntaxType* syntax, unsigned int behavior); +ONIG_EXTERN +void onig_set_syntax_options(OnigSyntaxType* syntax, OnigOptionType options); +ONIG_EXTERN +int onig_set_meta_char(OnigSyntaxType* syntax, unsigned int what, OnigCodePoint code); +ONIG_EXTERN +void onig_copy_encoding(OnigEncodingType *to, OnigEncoding from); +ONIG_EXTERN +OnigCaseFoldType onig_get_default_case_fold_flag(void); +ONIG_EXTERN +int onig_set_default_case_fold_flag(OnigCaseFoldType case_fold_flag); +ONIG_EXTERN +unsigned int onig_get_match_stack_limit_size(void); +ONIG_EXTERN +int onig_set_match_stack_limit_size(unsigned int size); +ONIG_EXTERN +unsigned int onig_get_parse_depth_limit(void); +ONIG_EXTERN +int onig_set_parse_depth_limit(unsigned int depth); +ONIG_EXTERN +int onig_end(void); +ONIG_EXTERN +const char* onig_version(void); +ONIG_EXTERN +const char* onig_copyright(void); + +RUBY_SYMBOL_EXPORT_END + +#ifdef __cplusplus +# if 0 +{ /* satisfy cc-mode */ +# endif +} +#endif + +#endif /* ONIGMO_H */ diff --git a/libs/libruby/ruby/oniguruma.h b/libs/libruby/ruby/oniguruma.h new file mode 100644 index 0000000..dc83754 --- /dev/null +++ b/libs/libruby/ruby/oniguruma.h @@ -0,0 +1,8 @@ +#ifndef ONIGURUMA_H +#define ONIGURUMA_H +#include "onigmo.h" +#define ONIGURUMA +#define ONIGURUMA_VERSION_MAJOR ONIGMO_VERSION_MAJOR +#define ONIGURUMA_VERSION_MINOR ONIGMO_VERSION_MINOR +#define ONIGURUMA_VERSION_TEENY ONIGMO_VERSION_TEENY +#endif /* ONIGURUMA_H */ diff --git a/libs/libruby/ruby/ractor.h b/libs/libruby/ruby/ractor.h new file mode 100644 index 0000000..7811616 --- /dev/null +++ b/libs/libruby/ruby/ractor.h @@ -0,0 +1,264 @@ +#ifndef RUBY_RACTOR_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_RACTOR_H 1 + +/** + * @file + * @author Koichi Sasada + * @date Tue Nov 17 16:39:15 2020 + * @copyright Copyright (C) 2020 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ +#include "internal/dllexport.h" /* RUBY_EXTERN is here */ +#include "internal/fl_type.h" /* FL_TEST_RAW is here */ +#include "internal/special_consts.h" /* RB_SPECIAL_CONSTS_P is here */ +#include "internal/stdbool.h" /* bool is here */ +#include "internal/value.h" /* VALUE is here */ + +/** Type that defines a ractor-local storage. */ +struct rb_ractor_local_storage_type { + + /** + * A function to mark a ractor-local storage. + * + * @param[out] ptr A ractor-local storage. + * @post Ruby objects inside of `ptr` are marked. + */ + void (*mark)(void *ptr); + + /** + * A function to destruct a ractor-local storage. + * + * @param[out] ptr A ractor-local storage. + * @post `ptr` is not a valid pointer. + */ + void (*free)(void *ptr); + // TODO: update +}; + +/** (Opaque) struct that holds a ractor-local storage key. */ +typedef struct rb_ractor_local_key_struct *rb_ractor_local_key_t; + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * `Ractor` class. + * + * @ingroup object + */ +RUBY_EXTERN VALUE rb_cRactor; + +/** + * Queries the standard input of the current Ractor that is calling this + * function. + * + * @return An IO. + * @note This can be different from the process-global one. + */ +VALUE rb_ractor_stdin(void); + +/** + * Queries the standard output of the current Ractor that is calling this + * function. + * + * @return An IO. + * @note This can be different from the process-global one. + */ +VALUE rb_ractor_stdout(void); + +/** + * Queries the standard error of the current Ractor that is calling this + * function. + * + * @return An IO. + * @note This can be different from the process-global one. + */ +VALUE rb_ractor_stderr(void); + +/** + * Assigns an IO to the standard input of the Ractor that is calling this + * function. + * + * @param[in] io An IO. + * @post `io` is the standard input of the current ractor. + * @post In case the calling Ractor is the main Ractor, it also updates + * the process global ::rb_stdin. + */ +void rb_ractor_stdin_set(VALUE io); + +/** + * Assigns an IO to the standard output of the Ractor that is calling this + * function. + * + * @param[in] io An IO. + * @post `io` is the standard input of the current ractor. + * @post In case the calling Ractor is the main Ractor, it also updates + * the process global ::rb_stdout. + */ +void rb_ractor_stdout_set(VALUE io); + +/** + * Assigns an IO to the standard error of the Ractor that is calling this + * function. + * + * @param[in] io An IO. + * @post `io` is the standard input of the current ractor. + * @post In case the calling Ractor is the main Ractor, it also updates + * the process global ::rb_stderr. + */ +void rb_ractor_stderr_set(VALUE io); + +/** + * Issues a new key. + * + * @return A newly issued ractor-local storage key. Keys issued using this + * key can be associated to a Ruby object per Ractor. + */ +rb_ractor_local_key_t rb_ractor_local_storage_value_newkey(void); + +/** + * Queries the key. + * + * @param[in] key A ractor-local storage key to lookup. + * @retval RUBY_Qnil No such key. + * @retval otherwise A value corresponds to `key` in the current Ractor. + * @note This cannot distinguish between a nonexistent key and a key + * exists and corresponds to ::RUBY_Qnil. + */ +VALUE rb_ractor_local_storage_value(rb_ractor_local_key_t key); + +/** + * Queries the key. + * + * @param[in] key A ractor-local storage key to lookup. + * @param[out] val Return value buffer. + * @retval false `key` not found. + * @retval true `key` found. + * @post `val` is updated so that it has the value corresponds to `key` + * in the current Ractor. + */ +bool rb_ractor_local_storage_value_lookup(rb_ractor_local_key_t key, VALUE *val); + +/** + * Associates the passed value to the passed key. + * + * @param[in] key A ractor-local storage key. + * @param[in] val Arbitrary ruby object. + * @post `val` corresponds to `key` in the current Ractor. + */ +void rb_ractor_local_storage_value_set(rb_ractor_local_key_t key, VALUE val); + +/** + * A type of ractor-local storage that destructs itself using ::ruby_xfree. + * + * @internal + * + * Why it is visible from 3rd party extension libraries is not obvious to + * @shyouhei. + */ +RUBY_EXTERN const struct rb_ractor_local_storage_type rb_ractor_local_storage_type_free; + +/** @alias{rb_ractor_local_storage_type_free} */ +#define RB_RACTOR_LOCAL_STORAGE_TYPE_FREE (&rb_ractor_local_storage_type_free) + +/** + * Extended version of rb_ractor_local_storage_value_newkey(). It additionally + * takes the type of the issuing key. + * + * @param[in] type How the value associated with the issuing key should + * behave. + * @return A newly issued ractor-local storage key, of type `type`. + */ +rb_ractor_local_key_t rb_ractor_local_storage_ptr_newkey(const struct rb_ractor_local_storage_type *type); + +/** + * Identical to rb_ractor_local_storage_value() except the return type. + * + * @param[in] key A ractor-local storage key to lookup. + * @retval NULL No such key. + * @retval otherwise A value corresponds to `key` in the current Ractor. + */ +void *rb_ractor_local_storage_ptr(rb_ractor_local_key_t key); + +/** + * Identical to rb_ractor_local_storage_value_set() except the parameter type. + * + * @param[in] key A ractor-local storage key. + * @param[in] ptr A pointer that conforms `key`'s type. + * @post `ptr` corresponds to `key` in the current Ractor. + */ +void rb_ractor_local_storage_ptr_set(rb_ractor_local_key_t key, void *ptr); + +/** + * Destructively transforms the passed object so that multiple Ractors can + * share it. What is a shareable object and what is not is a nuanced concept, + * and @ko1 says the definition can still change. However extension library + * authors might interest to learn how to use #RUBY_TYPED_FROZEN_SHAREABLE. + * + * @param[out] obj Arbitrary ruby object to modify. + * @exception rb_eRactorError Ractors cannot share `obj` by nature. + * @return Passed `obj`. + * @post Multiple Ractors can share `obj`. + * + * @internal + * + * In case an exception is raised, `obj` remains in an intermediate state where + * some of its part is frozen and others are not. @shyouhei is not sure if it + * is either an intended behaviour, current implementation limitation, or + * simply a bug. Note also that there is no way to "melt" a frozen object. + */ +VALUE rb_ractor_make_shareable(VALUE obj); + +/** + * Identical to rb_ractor_make_shareable(), except it returns a (deep) copy of + * the passed one instead of modifying it in-place. + * + * @param[in] obj Arbitrary ruby object to duplicate. + * @exception rb_eRactorError Ractors cannot share `obj` by nature. + * @return A deep copy of `obj` which is sharable among Ractors. + */ +VALUE rb_ractor_make_shareable_copy(VALUE obj); + +RBIMPL_SYMBOL_EXPORT_END() + +/** + * Queries if the passed object has previously classified as shareable or not. + * This doesn't mean anything in practice... Objects can be shared later. + * Always use rb_ractor_shareable_p() instead. + * + * @param[in] obj Object in question. + * @retval RUBY_FL_SHAREABLE It once was shareable before. + * @retval 0 Otherwise. + */ +#define RB_OBJ_SHAREABLE_P(obj) FL_TEST_RAW((obj), RUBY_FL_SHAREABLE) + +/** + * Queries if multiple Ractors can share the passed object or not. Ractors run + * without protecting each other. Sharing an object among them is basically + * dangerous, disabled by default. However there are objects that are + * extremely carefully implemented to be Ractor-safe; for instance integers + * have such property. This function can classify that. + * + * @param[in] obj Arbitrary ruby object. + * @retval true `obj` is capable of shared across ractors. + * @retval false `obj` cannot travel across ractor boundaries. + */ +static inline bool +rb_ractor_shareable_p(VALUE obj) +{ + bool rb_ractor_shareable_p_continue(VALUE obj); + + if (RB_SPECIAL_CONST_P(obj)) { + return true; + } + else if (RB_OBJ_SHAREABLE_P(obj)) { + return true; + } + else { + return rb_ractor_shareable_p_continue(obj); + } +} + +#endif /* RUBY_RACTOR_H */ diff --git a/libs/libruby/ruby/random.h b/libs/libruby/ruby/random.h new file mode 100644 index 0000000..39bdb6f --- /dev/null +++ b/libs/libruby/ruby/random.h @@ -0,0 +1,359 @@ +#ifndef RUBY_RANDOM_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_RANDOM_H 1 +/** + * @file + * @date Sat May 7 11:51:14 JST 2016 + * @copyright 2007-2020 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * + * This is a set of APIs to roll your own subclass of ::rb_cRandom. An + * illustrative example of such PRNG can be found at + * `ext/-test-/ramdom/loop.c`. + */ + +#include "ruby/ruby.h" + +/* + * version + * 0: before versioning; deprecated + * 1: added version, flags and init_32bit function + */ +#define RUBY_RANDOM_INTERFACE_VERSION_MAJOR 1 +#define RUBY_RANDOM_INTERFACE_VERSION_MINOR 0 + +#define RUBY_RANDOM_PASTE_VERSION_SUFFIX(x, y, z) x##_##y##_##z +#define RUBY_RANDOM_WITH_VERSION_SUFFIX(name, major, minor) \ + RUBY_RANDOM_PASTE_VERSION_SUFFIX(name, major, minor) +#define rb_random_data_type \ + RUBY_RANDOM_WITH_VERSION_SUFFIX(rb_random_data_type, \ + RUBY_RANDOM_INTERFACE_VERSION_MAJOR, \ + RUBY_RANDOM_INTERFACE_VERSION_MINOR) +#define RUBY_RANDOM_INTERFACE_VERSION_INITIALIZER \ + {RUBY_RANDOM_INTERFACE_VERSION_MAJOR, RUBY_RANDOM_INTERFACE_VERSION_MINOR} +#define RUBY_RANDOM_INTERFACE_VERSION_MAJOR_MAX 0xff +#define RUBY_RANDOM_INTERFACE_VERSION_MINOR_MAX 0xff + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Base components of the random interface. + * + * @internal + * + * Ideally this could be an empty class if we could assume C++, but in C a + * struct must have at least one field. + */ +struct rb_random_struct { + /** Seed, passed through e.g. `Random.new` */ + VALUE seed; +}; +typedef struct rb_random_struct rb_random_t; /**< @see ::rb_random_struct */ + +RBIMPL_ATTR_NONNULL(()) +/** + * This is the type of functions called when your random object is initialised. + * Passed buffer is the seed object basically. But in Ruby a number can be + * really big. This type of functions accept such big integers as a series of + * machine words. + * + * @param[out] rng Your random struct to fill in. + * @param[in] buf Seed, maybe converted from a bignum. + * @param[in] len Number of words of `buf`. + * @post `rng` is initialised using the passed seeds. + */ +typedef void rb_random_init_func(rb_random_t *rng, const uint32_t *buf, size_t len); + +RBIMPL_ATTR_NONNULL(()) +/** + * This is the type of functions called when your random object is initialised. + * Passed data is the seed integer. + * + * @param[out] rng Your random struct to fill in. + * @param[in] data Seed, single word. + * @post `rng` is initialised using the passed seeds. + */ +typedef void rb_random_init_int32_func(rb_random_t *rng, uint32_t data); + +RBIMPL_ATTR_NONNULL(()) +/** + * This is the type of functions called from your object's `#rand` method. + * + * @param[out] rng Your random struct to extract an integer from. + * @return A random number. + * @post `rng` is consumed somehow. + */ +typedef unsigned int rb_random_get_int32_func(rb_random_t *rng); + +RBIMPL_ATTR_NONNULL(()) +/** + * This is the type of functions called from your object's `#bytes` method. + * + * @param[out] rng Your random struct to extract an integer from. + * @param[out] buf Return buffer of at least `len` bytes length. + * @param[in] len Number of bytes of `buf`. + * @post `rng` is consumed somehow. + * @post `buf` is filled with random bytes. + */ +typedef void rb_random_get_bytes_func(rb_random_t *rng, void *buf, size_t len); + +RBIMPL_ATTR_NONNULL(()) +/** + * This is the type of functions called from your object's `#rand` method. + * + * @param[out] rng Your random struct to extract an integer from. + * @param[in] excl Pass nonzero value here to indicate you don't want 1.0. + * @return A random number of range 0.0 to 1.0. + * @post `rng` is consumed somehow. + */ +typedef double rb_random_get_real_func(rb_random_t *rng, int excl); + +/** PRNG algorithmic interface, analogous to Ruby level classes. */ +typedef struct { + /** Number of bits of seed numbers. */ + size_t default_seed_bits; + + /** + * Major/minor versions of this interface + */ + struct { + uint8_t major, minor; + } version; + + /** + * Reserved flags + */ + uint16_t flags; + + /** Function to initialize from uint32_t array. */ + rb_random_init_func *init; + + /** Function to initialize from single uint32_t. */ + rb_random_init_int32_func *init_int32; + + /** Function to obtain a random integer. */ + rb_random_get_int32_func *get_int32; + + /** + * Function to obtain a series of random bytes. If your PRNG have a native + * method to yield arbitrary number of bytes use that to implement this. + * But in case you lack such things, you can do so by using + * rb_rand_bytes_int32() + * + * ```CXX + * extern rb_random_get_int32_func your_get_int32_func; + * + * void + * your_get_byes_func(rb_random_t *rng, void *buf, size_t len) + * { + * rb_rand_bytes_int32(your_get_int32_func, rng, buf, len); + * } + * ``` + */ + rb_random_get_bytes_func *get_bytes; + + /** + * Function to obtain a random double. If your PRNG have a native method + * to yield a floating point random number use that to implement this. But + * in case you lack such things, you can do so by using + * rb_int_pair_to_real(). + * + * ```CXX + * extern rb_random_get_int32_func your_get_int32_func; + * + * void + * your_get_real_func(rb_random_t *rng, int excl) + * { + * auto a = your_get_int32_func(rng); + * auto b = your_get_int32_func(rng); + * return rb_int_pair_to_real(a, b, excl); + * } + * ``` + */ + rb_random_get_real_func *get_real; +} rb_random_interface_t; + +/** + * This utility macro defines 4 functions named prefix_init, prefix_init_int32, + * prefix_get_int32, prefix_get_bytes. + */ +#define RB_RANDOM_INTERFACE_DECLARE(prefix) \ + static void prefix##_init(rb_random_t *, const uint32_t *, size_t); \ + static void prefix##_init_int32(rb_random_t *, uint32_t); \ + static unsigned int prefix##_get_int32(rb_random_t *); \ + static void prefix##_get_bytes(rb_random_t *, void *, size_t) + +/** + * Identical to #RB_RANDOM_INTERFACE_DECLARE except it also declares + * prefix_get_real. + */ +#define RB_RANDOM_INTERFACE_DECLARE_WITH_REAL(prefix) \ + RB_RANDOM_INTERFACE_DECLARE(prefix); \ + static double prefix##_get_real(rb_random_t *, int) + +/** + * This utility macro expands to the names declared using + * #RB_RANDOM_INTERFACE_DECLARE. Expected to be used inside of a + * ::rb_random_interface_t initialiser: + * + * ```CXX + * RB_RANDOM_INTERFACE_DECLARE(foo); + * + * static inline constexpr rb_random_interface_t foo_interface = { + * 32768, // bits + * RB_RANDOM_INTERFACE_DEFINE(foo), + * }; + * ``` + */ +#define RB_RANDOM_INTERFACE_DEFINE(prefix) \ + RUBY_RANDOM_INTERFACE_VERSION_INITIALIZER, 0, \ + prefix##_init, \ + prefix##_init_int32, \ + prefix##_get_int32, \ + prefix##_get_bytes + +/** + * Identical to #RB_RANDOM_INTERFACE_DEFINE except it also defines + * prefix_get_real. + */ +#define RB_RANDOM_INTERFACE_DEFINE_WITH_REAL(prefix) \ + RB_RANDOM_INTERFACE_DEFINE(prefix), \ + prefix##_get_real + +#define RB_RANDOM_DEFINE_INIT_INT32_FUNC(prefix) \ + static void prefix##_init_int32(rb_random_t *rnd, uint32_t data) \ + { \ + prefix##_init(rnd, &data, 1); \ + } + +#if defined _WIN32 && !defined __CYGWIN__ +typedef rb_data_type_t rb_random_data_type_t; +# define RB_RANDOM_PARENT 0 +#else + +/** This is the type of ::rb_random_data_type. */ +typedef const rb_data_type_t rb_random_data_type_t; + +/** + * This utility macro can be used when you define your own PRNG type: + * + * ```CXX + * static inline constexpr rb_random_interface_t your_if = { + * 0, RB_RANDOM_INTERFACE_DEFINE(your), + * }; + * + * static inline constexpr rb_random_data_type_t your_prng_type = { + * "your PRNG", + * { rb_random_mark, }, + * RB_RANDOM_PARENT, // <<-- HERE + * &your_if, + * 0, + * } + * ``` + */ +# define RB_RANDOM_PARENT &rb_random_data_type +#endif + +/** + * This macro is expected to be called exactly once at the beginning of a + * program, possibly from inside of your `Init_Foo()` function. Depending on + * platforms #RB_RANDOM_PARENT can require a fixup. This routine does that + * when necessary. + */ +#define RB_RANDOM_DATA_INIT_PARENT(random_data) \ + rbimpl_random_data_init_parent(&random_data) + +/** + * This is the implementation of ::rb_data_type_struct::dmark for + * ::rb_random_data_type. In case your PRNG does not involve Ruby objects at + * all (which is quite likely), you can simply reuse it. + * + * @param[out] ptr Target to mark, which is a ::rb_random_t this case. + */ +void rb_random_mark(void *ptr); + +/** + * Initialises an allocated ::rb_random_t instance. Call it from your own + * initialiser appropriately. + * + * @param[out] rnd Your PRNG's base part. + * @post `rnd` is filled with an initial state. + */ +void rb_random_base_init(rb_random_t *rnd); + +/** + * Generates a 64 bit floating point number by concatenating two 32bit unsigned + * integers. + * + * @param[in] a Most significant 32 bits of the result. + * @param[in] b Least significant 32 bits of the result. + * @param[in] excl Whether the result should exclude 1.0 or not. + * @return A double, whose range is either `[0, 1)` or `[0, 1]`. + * @see ::rb_random_interface_t::get_real() + * + * @internal + * + * This in fact has nothing to do with PRNGs. + */ +double rb_int_pair_to_real(uint32_t a, uint32_t b, int excl); + +/** + * Repeatedly calls the passed function over and over again until the passed + * buffer is filled with random bytes. + * + * @param[in] func Generator function. + * @param[out] prng Passed as-is to `func`. + * @param[out] buff Return buffer. + * @param[in] size Number of words of `buff`. + * @post `buff` is filled with random bytes. + * @post `prng` is updated by `func`. + * @see ::rb_random_interface_t::get_bytes() + */ +void rb_rand_bytes_int32(rb_random_get_int32_func *func, rb_random_t *prng, void *buff, size_t size); + +/** + * The data that holds the backend type of ::rb_cRandom. Used as your PRNG's + * ::rb_data_type_struct::parent. + */ +RUBY_EXTERN const rb_data_type_t rb_random_data_type; + +RBIMPL_SYMBOL_EXPORT_END() + +RBIMPL_ATTR_PURE_UNLESS_DEBUG() +/* :TODO: can this function be __attribute__((returns_nonnull)) or not? */ +/** + * Queries the interface of the passed random object. + * + * @param[in] obj An instance (of a subclass) of ::rb_cRandom. + * @return Its corresponding ::rb_random_interface_t interface. + */ +static inline const rb_random_interface_t * +rb_rand_if(VALUE obj) +{ + RBIMPL_ASSERT_OR_ASSUME(RTYPEDDATA_P(obj)); + const struct rb_data_type_struct *t = RTYPEDDATA_TYPE(obj); + const void *ret = t->data; + return RBIMPL_CAST((const rb_random_interface_t *)ret); +} + +RBIMPL_ATTR_NOALIAS() +/** + * @private + * + * This is an implementation detail of #RB_RANDOM_DATA_INIT_PARENT. People + * don't use it directly. + * + * @param[out] random_data Region to fill. + * @post ::rb_random_data_type is filled appropriately. + */ +static inline void +rbimpl_random_data_init_parent(rb_random_data_type_t *random_data) +{ +#if defined _WIN32 && !defined __CYGWIN__ + random_data->parent = &rb_random_data_type; +#endif +} + +#endif /* RUBY_RANDOM_H */ diff --git a/libs/libruby/ruby/re.h b/libs/libruby/ruby/re.h new file mode 100644 index 0000000..3892d6e --- /dev/null +++ b/libs/libruby/ruby/re.h @@ -0,0 +1,147 @@ +#ifndef RUBY_RE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_RE_H 1 +/** + * @file + * @author $Author$ + * @date Thu Sep 30 14:18:32 JST 1993 + * @copyright Copyright (C) 1993-2007 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ +#include "ruby/internal/config.h" + +#ifdef HAVE_SYS_TYPES_H +# include +#endif + +#include + +#include "ruby/regex.h" +#include "ruby/internal/core/rmatch.h" +#include "ruby/internal/dllexport.h" + +struct re_registers; /* Defined in onigmo.h */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Creates a new instance of ::rb_cRegexp. It can be seen as a specialised + * version of rb_reg_new_str() where it does not take options. + * + * @param[in] str Source code in String. + * @return Allocated new instance of ::rb_cRegexp. + */ +VALUE rb_reg_regcomp(VALUE str); + +/** + * Runs the passed regular expression over the passed string. Unlike + * rb_reg_search() this function also takes position and direction of the + * search, which make it possible for this function to run from in middle of + * the string. + * + * @param[in] re Regular expression to execute. + * @param[in] str Target string to search. + * @param[in] pos Offset in `str` to start searching, in bytes. + * @param[in] dir `pos`' direction; 0 means left-to-right, 1 for + * the opposite. + * @exception rb_eArgError `re` is broken. + * @exception rb_eRegexpError `re` is malformed. + * @retval -1 Match failed. + * @retval otherwise Offset of first such byte where match happened. + * @post `Regexp.last_match` is updated. + * @post `$&`, `$~`, etc., are updated. + * + * @internal + * + * Distinction between raising ::rb_eArgError and ::rb_eRegexpError is not + * obvious, at least to @shyouhei. + */ +long rb_reg_search(VALUE re, VALUE str, long pos, int dir); + +/** + * Substitution. This is basically the implementation of `String#sub`. Also + * `String#gsub` repeatedly calls this function. + * + * @param[in] repl Replacement string, e.g. `"\\1\\2"` + * @param[in] src Source string, to be replaced. + * @param[in] regs Matched data generated by applying `rexp` to `src`. + * @param[in] rexp Regular expression. + * @return A substituted string. + * + * @internal + * + * This function does not check for encoding compatibility. `String#sub!` + * etc. employ their own checker. + * + * `regs` should have been `const struct re_registers *` because it is read + * only. Kept as-is for compatibility. + */ +VALUE rb_reg_regsub(VALUE repl, VALUE src, struct re_registers *regs, VALUE rexp); + +/** + * Tell us if this is a wrong idea, but it seems this function has no usage at + * all. Just remains here for theoretical backwards compatibility. + * + * @param[in] re Regular expression to execute. + * @param[in] str Target string to search. + * @param[in] pos Offset in `str` to start searching, in bytes. + * @param[in] dir `pos`' direction; 0 means left-to-right, 1 for + * the opposite. + * @return Adjusted nearest offset to `pos` inside of `str`, where is a + * character boundary. + * + */ +long rb_reg_adjust_startpos(VALUE re, VALUE str, long pos, int dir); + +/** + * Escapes any characters that would have special meaning in a regular + * expression. + * + * @param[in] str Target string to escape. + * @return A copy of `str` whose contents are escaped. + */ +VALUE rb_reg_quote(VALUE str); + +/** + * Exercises various checks and preprocesses so that the given regular + * expression can be applied to the given string. The preprocess here includes + * (but not limited to) for instance encoding conversion. + * + * @param[in] re Target regular expression. + * @param[in] str What `re` is about to run on. + * @exception rb_eArgError `re` does not fit for `str`. + * @exception rb_eEncCompatError `re` and `str` are incompatible. + * @exception rb_eRegexpError `re` is malformed. + * @return A preprocessesed pattern buffer ready to be applied to `str`. + * @note The return value is manages by our GC. Don't free. + * + * @internal + * + * The return type, `regex_t *`, is defined in ``, _and_ + * _conflicts_ with POSIX's ``. We can no longer save the situation + * at this point. Just don't mix the two. + */ +regex_t *rb_reg_prepare_re(VALUE re, VALUE str); + +/** + * Duplicates a match data. This is roughly the same as `onig_region_copy()`, + * except it tries to GC when there is not enough memory. + * + * @param[out] dst Target registers to fill. + * @param[in] src Source registers to duplicate. + * @exception rb_eNoMemError Not enough memory. + * @retval 0 Successful + * @retval ONIGERR_MEMORY Not enough memory, even after GC (unlikely). + * @post `dst` has identical contents to `src`. + * + * @internal + * + * It seems this function is here for `ext/strscan` and nothing else. + */ +int rb_reg_region_copy(struct re_registers *dst, const struct re_registers *src); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_RE_H */ diff --git a/libs/libruby/ruby/regex.h b/libs/libruby/ruby/regex.h new file mode 100644 index 0000000..5327817 --- /dev/null +++ b/libs/libruby/ruby/regex.h @@ -0,0 +1,43 @@ +#ifndef ONIGURUMA_REGEX_H /*-*-C++-*-vi:se ft=cpp:*/ +#define ONIGURUMA_REGEX_H 1 +/** + * @author $Author$ + * @copyright Copyright (C) 1993-2007 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ +#if defined(__cplusplus) +extern "C" { +#if 0 +} /* satisfy cc-mode */ +#endif +#endif + +#ifdef RUBY +#include "ruby/oniguruma.h" +#else +#include "oniguruma.h" +#endif + +RUBY_SYMBOL_EXPORT_BEGIN + +#ifndef ONIG_RUBY_M17N + +ONIG_EXTERN OnigEncoding OnigEncDefaultCharEncoding; + +#define mbclen(p,e,enc) rb_enc_mbclen((p),(e),(enc)) + +#endif /* ifndef ONIG_RUBY_M17N */ + +RUBY_SYMBOL_EXPORT_END + +#if defined(__cplusplus) +#if 0 +{ /* satisfy cc-mode */ +#endif +} /* extern "C" { */ +#endif + +#endif /* ONIGURUMA_REGEX_H */ diff --git a/libs/libruby/ruby/ruby.h b/libs/libruby/ruby/ruby.h new file mode 100644 index 0000000..bbe9504 --- /dev/null +++ b/libs/libruby/ruby/ruby.h @@ -0,0 +1,321 @@ +#ifndef RUBY_RUBY_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_RUBY_H 1 +/** + * @file + * @author $Author$ + * @date Thu Jun 10 14:26:32 JST 1993 + * @copyright Copyright (C) 1993-2008 Yukihiro Matsumoto + * @copyright Copyright (C) 2000 Network Applied Communication Laboratory, + * Inc. + * @copyright Copyright (C) 2000 Information-technology Promotion Agency, + * Japan + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ +#include "ruby/internal/config.h" + +/* @shyouhei doesn't understand why we need at this very + * beginning of the entire circus. */ +#ifdef HAVE_INTRINSICS_H +#include +#endif + +#include + +#include "defines.h" +#include "ruby/assert.h" +#include "ruby/backward/2/assume.h" +#include "ruby/backward/2/inttypes.h" +#include "ruby/backward/2/limits.h" +#include "ruby/internal/abi.h" +#include "ruby/internal/anyargs.h" +#include "ruby/internal/arithmetic.h" +#include "ruby/internal/core.h" +#include "ruby/internal/ctype.h" +#include "ruby/internal/dllexport.h" +#include "ruby/internal/error.h" +#include "ruby/internal/eval.h" +#include "ruby/internal/event.h" +#include "ruby/internal/fl_type.h" +#include "ruby/internal/gc.h" +#include "ruby/internal/glob.h" +#include "ruby/internal/globals.h" +#include "ruby/internal/has/warning.h" +#include "ruby/internal/interpreter.h" +#include "ruby/internal/iterator.h" +#include "ruby/internal/memory.h" +#include "ruby/internal/method.h" +#include "ruby/internal/module.h" +#include "ruby/internal/newobj.h" +#include "ruby/internal/rgengc.h" +#include "ruby/internal/scan_args.h" +#include "ruby/internal/special_consts.h" +#include "ruby/internal/symbol.h" +#include "ruby/internal/value.h" +#include "ruby/internal/value_type.h" +#include "ruby/internal/variable.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/* Module#methods, #singleton_methods and so on return Symbols */ +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define USE_SYMBOL_AS_METHOD_NAME 1 + +/** + * Converts an object to a path. It first tries `#to_path` method if any, then + * falls back to `#to_str` method. + * + * @param[in] obj Arbitrary ruby object. + * @exception rb_eArgError `obj` contains a NUL byte. + * @exception rb_eTypeError `obj` is not path-ish. + * @exception rb_eEncCompatError No encoding conversion from `obj` to path. + * @return Converted path object. + */ +VALUE rb_get_path(VALUE obj); + +/** + * Ensures that the parameter object is a path. + * + * @param[in,out] v Arbitrary ruby object. + * @exception rb_eArgError `v` contains a NUL byte. + * @exception rb_eTypeError `v` is not path-ish. + * @exception rb_eEncCompatError `v` is not path-compatible. + * @post `v` is a path. + */ +#define FilePathValue(v) (RB_GC_GUARD(v) = rb_get_path(v)) + +/** + * @deprecated This function is an alias of rb_get_path() now. The part that + * did "no_checksafe" was deleted. It remains here because of no + * harm. + */ +VALUE rb_get_path_no_checksafe(VALUE); + +/** + * @deprecated This macro is an alias of #FilePathValue now. The part that did + * "String" was deleted. It remains here because of no harm. + */ +#define FilePathStringValue(v) ((v) = rb_get_path(v)) + +/** @cond INTERNAL_MACRO */ +#if defined(HAVE_BUILTIN___BUILTIN_CONSTANT_P) && \ + defined(HAVE_STMT_AND_DECL_IN_EXPR) +#define rb_varargs_argc_check_runtime(argc, vargc) \ + (((argc) <= (vargc)) \ + ? (argc) \ + : (rb_fatal("argc(%d) exceeds actual arguments(%d)", argc, vargc), 0)) +#define rb_varargs_argc_valid_p(argc, vargc) \ + ((argc) == 0 ? (vargc) <= 1 : /* [ruby-core:85266] [Bug #14425] */ \ + (argc) == (vargc)) +#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR_CONSTANT_P) +#ifdef HAVE_ATTRIBUTE_ERRORFUNC +ERRORFUNC((" argument length doesn't match"), + int rb_varargs_bad_length(int, int)); +#else +#define rb_varargs_bad_length(argc, vargc) \ + ((argc) / rb_varargs_argc_valid_p(argc, vargc)) +#endif +#define rb_varargs_argc_check(argc, vargc) \ + __builtin_choose_expr(__builtin_constant_p(argc), \ + (rb_varargs_argc_valid_p(argc, vargc) \ + ? (argc) \ + : rb_varargs_bad_length(argc, vargc)), \ + rb_varargs_argc_check_runtime(argc, vargc)) +#else +#define rb_varargs_argc_check(argc, vargc) \ + rb_varargs_argc_check_runtime(argc, vargc) +#endif +#endif +/** @endcond */ + +/** + * Queries the name of the passed class. + * + * @param[in] klass An instance of a class. + * @return The name of `klass`. + * @note Return value is managed by our GC. Don't free. + */ +const char *rb_class2name(VALUE klass); + +/** + * Queries the name of the class of the passed object. + * + * @param[in] obj Arbitrary ruby object. + * @return The name of the class of `obj`. + * @note Return value is managed by our GC. Don't free. + */ +const char *rb_obj_classname(VALUE obj); + +/** + * Inspects an object. It first calls the argument's `#inspect` method, then + * feeds its result string into ::rb_stdout. + * + * This is identical to Ruby level `Kernel#p`, except it takes only one object. + * + * @internal + * + * Above description is in fact inaccurate. This API interfaces with Ractors. + */ +void rb_p(VALUE obj); + +/** + * This function is an optimised version of calling `#==`. It checks equality + * between two objects by first doing a fast identity check using using C's + * `==` (same as `BasicObject#equal?`). If that check fails, it calls `#==` + * dynamically. This optimisation actually affects semantics, because when + * `#==` returns false for the same object obj, `rb_equal(obj, obj)` would + * still return true. This happens for `Float::NAN`, where `Float::NAN == + * Float::NAN` is `false`, but `rb_equal(Float::NAN, Float::NAN)` is `true`. + * + * @param[in] lhs Comparison LHS. + * @param[in] rhs Comparison RHS. + * @retval RUBY_Qtrue They are the same. + * @retval RUBY_Qfalse They are different. + */ +VALUE rb_equal(VALUE lhs, VALUE rhs); + +/** + * Identical to rb_require_string(), except it takes C's string instead of + * Ruby's. + * + * @param[in] feature Name of a feature, e.g. `"json"`. + * @exception rb_eLoadError No such feature. + * @exception rb_eRuntimeError `$"` is frozen; unable to push. + * @retval RUBY_Qtrue The feature is loaded for the first time. + * @retval RUBY_Qfalse The feature has already been loaded. + * @post `$"` is updated. + */ +VALUE rb_require(const char *feature); + +#include "ruby/intern.h" + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define RUBY_VM 1 /* YARV */ + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define HAVE_NATIVETHREAD + +/** + * Queries if the thread which calls this function is a ruby's thread. + * "Ruby's" in this context is a thread created using one of our APIs like + * rb_thread_create(). There are distinctions between ruby's and other + * threads. For instance calling ruby methods are allowed only from inside of + * a ruby's thread. + * + * @retval 1 The current thread is a Ruby's thread. + * @retval 0 The current thread is a random thread from outside of Ruby. + */ +int ruby_native_thread_p(void); + +/** + * @private + * + * This macro is for internal use. Must be a mistake to place here. + */ +#define InitVM(ext) \ + { \ + void InitVM_##ext(void); \ + InitVM_##ext(); \ + } + +RBIMPL_ATTR_NONNULL((3)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 3, 4) +/** + * Our own locale-insensitive version of `snprintf(3)`. It can also be seen as + * a routine identical to rb_sprintf(), except it writes back to the passed + * buffer instead of allocating a new Ruby object. + * + * @param[out] str Return buffer + * @param[in] n Number of bytes of `str`. + * @param[in] fmt A `printf`-like format specifier. + * @param[in] ... Variadic number of contents to format. + * @return Number of bytes that would have been written to `str`, if `n` + * was large enough. Comparing this to `n` can give you insights + * that the buffer is too small or too big. Especially passing 0 + * to `n` gives you the exact number of bytes necessary to hold + * the result string without writing anything to anywhere. + * @post `str` holds up to `n-1` bytes of formatted contents (and the + * terminating NUL character.) + */ +int ruby_snprintf(char *str, size_t n, char const *fmt, ...); + +RBIMPL_ATTR_NONNULL((3)) +RBIMPL_ATTR_FORMAT(RBIMPL_PRINTF_FORMAT, 3, 0) +/** + * Identical to ruby_snprintf(), except it takes a `va_list`. It can also be + * seen as a routine identical to rb_vsprintf(), except it writes back to the + * passed buffer instead of allocating a new Ruby object. + * + * @param[out] str Return buffer + * @param[in] n Number of bytes of `str`. + * @param[in] fmt A `printf`-like format specifier. + * @param[in] ap Contents to format. + * @return Number of bytes that would have been written to `str`, if `n` + * was large enough. Comparing this to `n` can give you insights + * that the buffer is too small or too big. Especially passing 0 + * to `n` gives you the exact number of bytes necessary to hold + * the result string without writing anything to anywhere. + * @post `str` holds up to `n-1` bytes of formatted contents (and the + * terminating NUL character.) + */ +int ruby_vsnprintf(char *str, size_t n, char const *fmt, va_list ap); + +/** @cond INTERNAL_MACRO */ +#if RBIMPL_HAS_WARNING("-Wgnu-zero-variadic-macro-arguments") +#/* Skip it; clang -pedantic doesn't like the following */ +#elif defined(__GNUC__) && defined(HAVE_VA_ARGS_MACRO) && defined(__OPTIMIZE__) +#define rb_yield_values(argc, ...) \ + __extension__({ \ + const int rb_yield_values_argc = (argc); \ + const VALUE rb_yield_values_args[] = {__VA_ARGS__}; \ + const int rb_yield_values_nargs = \ + (int)(sizeof(rb_yield_values_args) / sizeof(VALUE)); \ + rb_yield_values2( \ + rb_varargs_argc_check(rb_yield_values_argc, rb_yield_values_nargs), \ + rb_yield_values_nargs ? rb_yield_values_args : NULL); \ + }) + +#define rb_funcall(recv, mid, argc, ...) \ + __extension__({ \ + const int rb_funcall_argc = (argc); \ + const VALUE rb_funcall_args[] = {__VA_ARGS__}; \ + const int rb_funcall_nargs = \ + (int)(sizeof(rb_funcall_args) / sizeof(VALUE)); \ + rb_funcallv(recv, mid, \ + rb_varargs_argc_check(rb_funcall_argc, rb_funcall_nargs), \ + rb_funcall_nargs ? rb_funcall_args : NULL); \ + }) +#endif +/** @endcond */ + +#ifndef RUBY_DONT_SUBST +#include "ruby/subst.h" +#endif + +#if !defined RUBY_EXPORT && !defined RUBY_NO_OLD_COMPATIBILITY +#include "ruby/backward.h" +#endif + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_RUBY_H */ diff --git a/libs/libruby/ruby/st.h b/libs/libruby/ruby/st.h new file mode 100644 index 0000000..f35ab43 --- /dev/null +++ b/libs/libruby/ruby/st.h @@ -0,0 +1,199 @@ +/* This is a public domain general purpose hash table package + originally written by Peter Moore @ UCB. + + The hash table data structures were redesigned and the package was + rewritten by Vladimir Makarov . */ + +#ifndef RUBY_ST_H +#define RUBY_ST_H 1 + +#if defined(__cplusplus) +extern "C" { +#if 0 +} /* satisfy cc-mode */ +#endif +#endif + +#include "ruby/defines.h" + +RUBY_SYMBOL_EXPORT_BEGIN + +#if SIZEOF_LONG == SIZEOF_VOIDP +typedef unsigned long st_data_t; +#elif SIZEOF_LONG_LONG == SIZEOF_VOIDP +typedef unsigned LONG_LONG st_data_t; +#else +# error ---->> st.c requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<---- +#endif +#define ST_DATA_T_DEFINED + +#ifndef CHAR_BIT +# ifdef HAVE_LIMITS_H +# include +# else +# define CHAR_BIT 8 +# endif +#endif +#ifndef _ +# define _(args) args +#endif +#ifndef ANYARGS +# ifdef __cplusplus +# define ANYARGS ... +# else +# define ANYARGS +# endif +#endif + +typedef struct st_table st_table; + +typedef st_data_t st_index_t; + +/* Maximal value of unsigned integer type st_index_t. */ +#define MAX_ST_INDEX_VAL (~(st_index_t) 0) + +typedef int st_compare_func(st_data_t, st_data_t); +typedef st_index_t st_hash_func(st_data_t); + +typedef char st_check_for_sizeof_st_index_t[SIZEOF_VOIDP == (int)sizeof(st_index_t) ? 1 : -1]; +#define SIZEOF_ST_INDEX_T SIZEOF_VOIDP + +struct st_hash_type { + int (*compare)(st_data_t, st_data_t); /* st_compare_func* */ + st_index_t (*hash)(st_data_t); /* st_hash_func* */ +}; + +#define ST_INDEX_BITS (SIZEOF_ST_INDEX_T * CHAR_BIT) + +#if defined(HAVE_BUILTIN___BUILTIN_CHOOSE_EXPR) && defined(HAVE_BUILTIN___BUILTIN_TYPES_COMPATIBLE_P) +# define ST_DATA_COMPATIBLE_P(type) \ + __builtin_choose_expr(__builtin_types_compatible_p(type, st_data_t), 1, 0) +#else +# define ST_DATA_COMPATIBLE_P(type) 0 +#endif + +typedef struct st_table_entry st_table_entry; + +struct st_table_entry; /* defined in st.c */ + +struct st_table { + /* Cached features of the table -- see st.c for more details. */ + unsigned char entry_power, bin_power, size_ind; + /* How many times the table was rebuilt. */ + unsigned int rebuilds_num; + const struct st_hash_type *type; + /* Number of entries currently in the table. */ + st_index_t num_entries; + /* Array of bins used for access by keys. */ + st_index_t *bins; + /* Start and bound index of entries in array entries. + entries_starts and entries_bound are in interval + [0,allocated_entries]. */ + st_index_t entries_start, entries_bound; + /* Array of size 2^entry_power. */ + st_table_entry *entries; +}; + +#define st_is_member(table,key) st_lookup((table),(key),(st_data_t *)0) + +enum st_retval {ST_CONTINUE, ST_STOP, ST_DELETE, ST_CHECK, ST_REPLACE}; + +size_t rb_st_table_size(const struct st_table *tbl); +#define st_table_size rb_st_table_size +st_table *rb_st_init_table(const struct st_hash_type *); +#define st_init_table rb_st_init_table +st_table *rb_st_init_table_with_size(const struct st_hash_type *, st_index_t); +#define st_init_table_with_size rb_st_init_table_with_size +st_table *rb_st_init_numtable(void); +#define st_init_numtable rb_st_init_numtable +st_table *rb_st_init_numtable_with_size(st_index_t); +#define st_init_numtable_with_size rb_st_init_numtable_with_size +st_table *rb_st_init_strtable(void); +#define st_init_strtable rb_st_init_strtable +st_table *rb_st_init_strtable_with_size(st_index_t); +#define st_init_strtable_with_size rb_st_init_strtable_with_size +st_table *rb_st_init_strcasetable(void); +#define st_init_strcasetable rb_st_init_strcasetable +st_table *rb_st_init_strcasetable_with_size(st_index_t); +#define st_init_strcasetable_with_size rb_st_init_strcasetable_with_size +int rb_st_delete(st_table *, st_data_t *, st_data_t *); /* returns 0:notfound 1:deleted */ +#define st_delete rb_st_delete +int rb_st_delete_safe(st_table *, st_data_t *, st_data_t *, st_data_t); +#define st_delete_safe rb_st_delete_safe +int rb_st_shift(st_table *, st_data_t *, st_data_t *); /* returns 0:notfound 1:deleted */ +#define st_shift rb_st_shift +int rb_st_insert(st_table *, st_data_t, st_data_t); +#define st_insert rb_st_insert +int rb_st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t)); +#define st_insert2 rb_st_insert2 +int rb_st_lookup(st_table *, st_data_t, st_data_t *); +#define st_lookup rb_st_lookup +int rb_st_get_key(st_table *, st_data_t, st_data_t *); +#define st_get_key rb_st_get_key +typedef int st_update_callback_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing); +/* *key may be altered, but must equal to the old key, i.e., the + * results of hash() are same and compare() returns 0, otherwise the + * behavior is undefined */ +int rb_st_update(st_table *table, st_data_t key, st_update_callback_func *func, st_data_t arg); +#define st_update rb_st_update +typedef int st_foreach_callback_func(st_data_t, st_data_t, st_data_t); +typedef int st_foreach_check_callback_func(st_data_t, st_data_t, st_data_t, int); +int rb_st_foreach_with_replace(st_table *tab, st_foreach_check_callback_func *func, st_update_callback_func *replace, st_data_t arg); +#define st_foreach_with_replace rb_st_foreach_with_replace +int rb_st_foreach(st_table *, st_foreach_callback_func *, st_data_t); +#define st_foreach rb_st_foreach +int rb_st_foreach_check(st_table *, st_foreach_check_callback_func *, st_data_t, st_data_t); +#define st_foreach_check rb_st_foreach_check +st_index_t rb_st_keys(st_table *table, st_data_t *keys, st_index_t size); +#define st_keys rb_st_keys +st_index_t rb_st_keys_check(st_table *table, st_data_t *keys, st_index_t size, st_data_t never); +#define st_keys_check rb_st_keys_check +st_index_t rb_st_values(st_table *table, st_data_t *values, st_index_t size); +#define st_values rb_st_values +st_index_t rb_st_values_check(st_table *table, st_data_t *values, st_index_t size, st_data_t never); +#define st_values_check rb_st_values_check +void rb_st_add_direct(st_table *, st_data_t, st_data_t); +#define st_add_direct rb_st_add_direct +void rb_st_free_table(st_table *); +#define st_free_table rb_st_free_table +void rb_st_cleanup_safe(st_table *, st_data_t); +#define st_cleanup_safe rb_st_cleanup_safe +void rb_st_clear(st_table *); +#define st_clear rb_st_clear +st_table *rb_st_copy(st_table *); +#define st_copy rb_st_copy +CONSTFUNC(int rb_st_numcmp(st_data_t, st_data_t)); +#define st_numcmp rb_st_numcmp +CONSTFUNC(st_index_t rb_st_numhash(st_data_t)); +#define st_numhash rb_st_numhash +PUREFUNC(int rb_st_locale_insensitive_strcasecmp(const char *s1, const char *s2)); +#define st_locale_insensitive_strcasecmp rb_st_locale_insensitive_strcasecmp +PUREFUNC(int rb_st_locale_insensitive_strncasecmp(const char *s1, const char *s2, size_t n)); +#define st_locale_insensitive_strncasecmp rb_st_locale_insensitive_strncasecmp +#define st_strcasecmp rb_st_locale_insensitive_strcasecmp +#define st_strncasecmp rb_st_locale_insensitive_strncasecmp +PUREFUNC(size_t rb_st_memsize(const st_table *)); +#define st_memsize rb_st_memsize +PUREFUNC(st_index_t rb_st_hash(const void *ptr, size_t len, st_index_t h)); +#define st_hash rb_st_hash +CONSTFUNC(st_index_t rb_st_hash_uint32(st_index_t h, uint32_t i)); +#define st_hash_uint32 rb_st_hash_uint32 +CONSTFUNC(st_index_t rb_st_hash_uint(st_index_t h, st_index_t i)); +#define st_hash_uint rb_st_hash_uint +CONSTFUNC(st_index_t rb_st_hash_end(st_index_t h)); +#define st_hash_end rb_st_hash_end +CONSTFUNC(st_index_t rb_st_hash_start(st_index_t h)); +#define st_hash_start(h) ((st_index_t)(h)) + +void rb_hash_bulk_insert_into_st_table(long, const VALUE *, VALUE); + +RUBY_SYMBOL_EXPORT_END + +#if defined(__cplusplus) +#if 0 +{ /* satisfy cc-mode */ +#endif +} /* extern "C" { */ +#endif + +#endif /* RUBY_ST_H */ diff --git a/libs/libruby/ruby/subst.h b/libs/libruby/ruby/subst.h new file mode 100644 index 0000000..d7b9a63 --- /dev/null +++ b/libs/libruby/ruby/subst.h @@ -0,0 +1,26 @@ +#ifndef RUBY_SUBST_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_SUBST_H 1 +/** + * @author Ruby developers + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ + +#undef snprintf +#undef vsnprintf +#define snprintf ruby_snprintf +#define vsnprintf ruby_vsnprintf + +#ifdef BROKEN_CLOSE +#undef getpeername +#define getpeername ruby_getpeername +#undef getsockname +#define getsockname ruby_getsockname +#undef shutdown +#define shutdown ruby_shutdown +#undef close +#define close ruby_close +#endif +#endif diff --git a/libs/libruby/ruby/thread.h b/libs/libruby/ruby/thread.h new file mode 100644 index 0000000..0b5b1ca --- /dev/null +++ b/libs/libruby/ruby/thread.h @@ -0,0 +1,235 @@ +#ifndef RUBY_THREAD_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_THREAD_H 1 +/** + * @file + * @author $Author: matz $ + * @date Tue Jul 10 17:35:43 JST 2012 + * @copyright Copyright (C) 2007 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + */ +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/intern/thread.h" /* rb_unblock_function_t */ +#include "ruby/internal/dllexport.h" + +/** + * @name Flags for rb_nogvl() + * + * @{ + */ + +/** + * Passing this flag to rb_nogvl() prevents it from checking interrupts. + * Interrupts can impact your program negatively. For instance consider + * following callback function: + * + * ```CXX + * static inline int fd; // set elsewhere. + * static inline auto callback(auto buf) { + * auto tmp = ruby_xmalloc(BUFSIZ); + * auto ret = ruby_xmalloc(sizeof(ssize_t)); // (a) + * auto n = read(fd, tmp, BUFSIZ); // (b) + * memcpy(buf, tmp, n); // (c) + * memcpy(ret, n, sizeof(n)); + * ruby_xfree(tmp); + * return ret; + * } + * ``` + * + * Here, if it gets interrupted at (a) or (b), `read(2)` is cancelled and this + * function leaks memory (which is not a good thing of course, but...). But if + * it gets interrupted at (c), where `read(2)` is already done, interruption is + * way more catastrophic because what was read gets lost. To reroute this kind + * of problem you should set this flag. And check interrupts elsewhere at your + * own risk. + */ +#define RB_NOGVL_INTR_FAIL (0x1) + +/** + * Passing this flag to rb_nogvl() indicates that the passed UBF is + * async-signal-safe. An UBF could be async safe, and that makes things + * simpler. However async unsafe UBFs are just okay. If unsure, you can + * safely leave it unspecified. + * + * @internal + * + * This makes sense only in case of POSIX threads. + */ +#define RB_NOGVL_UBF_ASYNC_SAFE (0x2) + +/** @} */ + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +RBIMPL_ATTR_NONNULL((1)) +/** + * (Re-)acquires the GVL. This manoeuvre makes it possible for an out-of-GVL + * routine to one-shot call a ruby method. + * + * What this function does: + * + * 1. Blocks until it acquires the GVL. + * 2. Calls the passed function. + * 3. Releases the GVL. + * 4. Returns what was returned form the passed function. + * + * @param[in] func What to call with GVL. + * @param[in,out] data1 Passed as-is to `func`. + * @return What was returned from `func`. + * @warning `func` must not return a Ruby object. If it did such return + * value would escape from GC's scope; would not be marked. + * @warning Global escapes from this function just yield whatever fatal + * undefined behaviours. You must make sure that `func` does + * not raise, by properly rescuing everything using + * e.g. rb_protect(). + * @warning You cannot convert a non-Ruby thread into a Ruby thread + * using this API. This function makes sense only from inside + * of a rb_thread_call_without_gvl()'s callback. + */ +void *rb_thread_call_with_gvl(void *(*func)(void *), void *data1); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Allows the passed function to run in parallel with other Ruby threads. + * + * What this function does: + * + * 1. Checks (and handles) pending interrupts. + * 2. Releases the GVL. (Others can run here in parallel...) + * 3. Calls the passed function. + * 4. Blocks until it re-acquires the GVL. + * 5. Checks interrupts that happened between 2 to 4. + * + * In case other threads interfaced with this thread using rb_thread_kill() + * etc., the passed UBF is additionally called. See ::rb_unblock_function_t + * for details. + * + * Unlike rb_thread_call_without_gvl2() this function also reacts to signals + * etc. + * + * @param[in] func A function to call without GVL. + * @param[in,out] data1 Passed as-is to `func`. + * @param[in] ubf An UBF to cancel `func`. + * @param[in,out] data2 Passed as-is to `ubf`. + * @return What `func` returned, or 0 in case `ubf` cancelled `func`. + * @warning You cannot use most of Ruby C APIs like calling methods or + * raising exceptions from any of the functions passed to it. + * If that is dead necessary use rb_thread_call_with_gvl() to + * re-acquire the GVL. + * @warning In short, this API is difficult. @ko1 recommends you to use + * other ways if any. We lack experiences to use this API. If + * you find any corner cases etc., please report it to the + * devs. + * @warning Releasing and re-acquiring the GVL are expensive operations. + * For a short-running `func`, it might be faster to just call + * `func` with blocking everything else. Be sure to benchmark + * your code to see if it is actually worth releasing the GVL. + */ +void *rb_thread_call_without_gvl(void *(*func)(void *), void *data1, + rb_unblock_function_t *ubf, void *data2); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Identical to rb_thread_call_without_gvl(), except it does not interface with + * signals etc. As described in #RB_NOGVL_INTR_FAIL, interrupts can hurt you. + * In case this function detects an interrupt, it returns immediately. You can + * record progress of your callback and check it after returning from this + * function. + * + * What this function does: + * + * 1. Checks for pending interrupts and if any, just returns. + * 2. Releases the GVL. (Others can run here in parallel...) + * 3. Calls the passed function. + * 4. Blocks until it re-acquires the GVL. + * + * @param[in] func A function to call without GVL. + * @param[in,out] data1 Passed as-is to `func`. + * @param[in] ubf An UBF to cancel `func`. + * @param[in,out] data2 Passed as-is to `ubf`. + * @return What `func` returned, or 0 in case `func` did not return. + */ +void *rb_thread_call_without_gvl2(void *(*func)(void *), void *data1, + rb_unblock_function_t *ubf, void *data2); + +/* + * XXX: unstable/unapproved - out-of-tree code should NOT not depend + * on this until it hits Ruby 2.6.1 + */ + +RBIMPL_ATTR_NONNULL((1)) +/** + * Identical to rb_thread_call_without_gvl(), except it additionally takes + * "flags" that change the behaviour. + * + * @param[in] func A function to call without GVL. + * @param[in,out] data1 Passed as-is to `func`. + * @param[in] ubf An UBF to cancel `func`. + * @param[in,out] data2 Passed as-is to `ubf`. + * @param[in] flags Flags. + * @return What `func` returned, or 0 in case `func` did not return. + */ +void *rb_nogvl(void *(*func)(void *), void *data1, + rb_unblock_function_t *ubf, void *data2, + int flags); + +/** + * @private + * + * @deprecated This macro once was a thing in the old days, but makes no sense + * any longer today. Exists here for backwards compatibility + * only. You can safely forget about it. + */ +#define RUBY_CALL_WO_GVL_FLAG_SKIP_CHECK_INTS_AFTER 0x01 + +/** + * @private + * @deprecated It seems even in the old days it made no sense...? + */ +#define RUBY_CALL_WO_GVL_FLAG_SKIP_CHECK_INTS_ + +#define RUBY_INTERNAL_THREAD_EVENT_STARTED 1 << 0 /** thread started */ +#define RUBY_INTERNAL_THREAD_EVENT_READY 1 << 1 /** acquiring GVL */ +#define RUBY_INTERNAL_THREAD_EVENT_RESUMED 1 << 2 /** acquired GVL */ +#define RUBY_INTERNAL_THREAD_EVENT_SUSPENDED 1 << 3 /** released GVL */ +#define RUBY_INTERNAL_THREAD_EVENT_EXITED 1 << 4 /** thread terminated */ +#define RUBY_INTERNAL_THREAD_EVENT_MASK 0xff /** All Thread events */ + +typedef void rb_internal_thread_event_data_t; // for future extension. + +typedef void (*rb_internal_thread_event_callback)(rb_event_flag_t event, + const rb_internal_thread_event_data_t *event_data, + void *user_data); +typedef struct rb_internal_thread_event_hook rb_internal_thread_event_hook_t; + +/** + * Registers a thread event hook function. + * + * @param[in] func A callback. + * @param[in] events A set of events that `func` should run. + * @param[in] data Passed as-is to `func`. + * @return An opaque pointer to the hook, to unregister it later. + * @note This functionality is a noop on Windows. + * @warning This function MUST not be called from a thread event callback. + */ +rb_internal_thread_event_hook_t *rb_internal_thread_add_event_hook( + rb_internal_thread_event_callback func, rb_event_flag_t events, + void *data); + + +/** + * Unregister the passed hook. + * + * @param[in] hook. The hook to unregister. + * @return Wether the hook was found and unregistered. + * @note This functionality is a noop on Windows. + * @warning This function MUST not be called from a thread event callback. +*/ +bool rb_internal_thread_remove_event_hook( + rb_internal_thread_event_hook_t * hook); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_THREAD_H */ diff --git a/libs/libruby/ruby/thread_native.h b/libs/libruby/ruby/thread_native.h new file mode 100644 index 0000000..c23b15e --- /dev/null +++ b/libs/libruby/ruby/thread_native.h @@ -0,0 +1,205 @@ +#ifndef RUBY_THREAD_NATIVE_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_THREAD_NATIVE_H 1 +/** + * @file + * @author $Author: ko1 $ + * @date Wed May 14 19:37:31 2014 + * @copyright Copyright (C) 2014 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * + * This file contains wrapper APIs for native thread primitives + * which Ruby interpreter uses. + * + * Now, we only support pthread and Windows threads. + * + * If you want to use Ruby's Mutex and so on to synchronize Ruby Threads, + * please use Mutex directly. + */ + +#if defined(_WIN32) +#include +typedef HANDLE rb_nativethread_id_t; + +typedef union rb_thread_lock_union { + HANDLE mutex; + CRITICAL_SECTION crit; +} rb_nativethread_lock_t; + +typedef struct rb_thread_cond_struct rb_nativethread_cond_t; + +#elif defined(HAVE_PTHREAD_H) + +#include +typedef pthread_t rb_nativethread_id_t; +typedef pthread_mutex_t rb_nativethread_lock_t; +typedef pthread_cond_t rb_nativethread_cond_t; + +#elif defined(__wasi__) // no-thread platforms + +typedef struct rb_nativethread_id_t *rb_nativethread_id_t; +typedef struct rb_nativethread_lock_t *rb_nativethread_lock_t; +typedef struct rb_nativethread_cond_t *rb_nativethread_cond_t; + +#elif defined(__DOXYGEN__) + +/** Opaque type that holds an ID of a native thread. */ +struct rb_nativethread_id_t; + +/** Opaque type that holds a lock. */ +struct rb_nativethread_lock_t; + +/** Opaque type that holds a condition variable. */ +struct rb_nativethread_cond_t; + +#else +#error "unsupported thread type" + +#endif + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * Queries the ID of the native thread that is calling this function. + * + * @return The caller thread's native ID. + */ +rb_nativethread_id_t rb_nativethread_self(void); + +/** + * Fills the passed lock with an initial value. + * + * @param[out] lock A mutex to initialise. + * @post `lock` is updated to its initial state. + * + * @internal + * + * There is no data structure that analogous to pthread_once_t in ruby. It is + * pretty much tricky (if not impossible) to properly initialise a mutex + * exactly once. + */ +void rb_nativethread_lock_initialize(rb_nativethread_lock_t *lock); + +/** + * Destroys the passed mutex. + * + * @param[out] lock A mutex to kill. + * @post `lock` is no longer eligible for other functions. + * + * @internal + * + * It is an undefined behaviour (see `pthread_mutex_destroy(3posix)`) to + * destroy a locked mutex. So it has to be unlocked. But an unlocked mutex + * can of course be locked by another thread. That's the ultimate reason why + * we do mutex. There is an inevitable race condition here. 2017 edition of + * IEEE 1003.1 issue 7 says in its rationale that "care must be taken". Care? + * How? + * + * @shyouhei thinks that POSIX is broken by design. + */ +void rb_nativethread_lock_destroy(rb_nativethread_lock_t *lock); + +/** + * Blocks until the current thread obtains a lock. + * + * @param[out] lock A mutex to lock. + * @post `lock` is owned by the current native thread. + */ +void rb_nativethread_lock_lock(rb_nativethread_lock_t *lock); + +/** + * Releases a lock. + * + * @param[out] lock A mutex to unlock. + * @pre `lock` is owned by the current native thread. + * @post `lock` is not owned by the current native thread. + */ +void rb_nativethread_lock_unlock(rb_nativethread_lock_t *lock); + +/** @alias{rb_nativethread_lock_lock} */ +void rb_native_mutex_lock(rb_nativethread_lock_t *lock); + +/** + * Identical to rb_native_mutex_lock(), except it doesn't block in case + * rb_native_mutex_lock() would. + * + * @param[out] lock A mutex to lock. + * @retval 0 `lock` is successfully owned by the current thread. + * @retval EBUSY `lock` is owned by someone else. + */ +int rb_native_mutex_trylock(rb_nativethread_lock_t *lock); + +/** @alias{rb_nativethread_lock_unlock} */ +void rb_native_mutex_unlock(rb_nativethread_lock_t *lock); + +/** @alias{rb_nativethread_lock_initialize} */ +void rb_native_mutex_initialize(rb_nativethread_lock_t *lock); + +/** @alias{rb_nativethread_lock_destroy} */ +void rb_native_mutex_destroy(rb_nativethread_lock_t *lock); + +/** + * Signals a condition variable. + * + * @param[out] cond A condition variable to ping. + * @post More than one threads waiting for `cond` gets signalled. + * @note This function can spuriously wake multiple threads up. + * `pthread_cond_signal(3posix)` says it can even be "impossible + * to avoid the unblocking of more than one thread blocked on a + * condition variable". Just brace spurious wakeups. + */ +void rb_native_cond_signal(rb_nativethread_cond_t *cond); + +/** + * Signals a condition variable. + * + * @param[out] cond A condition variable to ping. + * @post All threads waiting for `cond` gets signalled. + */ +void rb_native_cond_broadcast(rb_nativethread_cond_t *cond); + +/** + * Waits for the passed condition variable to be signalled. + * + * @param[out] cond A condition variable to wait. + * @param[out] mutex A mutex. + * @pre `mutex` is owned by the current thread. + * @post `mutex` is owned by the current thread. + * @note This can wake up spuriously. + */ +void rb_native_cond_wait(rb_nativethread_cond_t *cond, rb_nativethread_lock_t *mutex); + +/** + * Identical to rb_native_cond_wait(), except it additionally takes timeout in + * msec resolution. Timeouts can be detected by catching exceptions. + * + * @param[out] cond A condition variable to wait. + * @param[out] mutex A mutex. + * @param[in] msec Timeout. + * @exception rb_eSystemCallError `Errno::ETIMEDOUT` for timeout. + * @pre `mutex` is owned by the current thread. + * @post `mutex` is owned by the current thread. + * @note This can wake up spuriously. + */ +void rb_native_cond_timedwait(rb_nativethread_cond_t *cond, rb_nativethread_lock_t *mutex, unsigned long msec); + +/** + * Fills the passed condition variable with an initial value. + * + * @param[out] cond A condition variable to initialise. + * @post `cond` is updated to its initial state. + */ +void rb_native_cond_initialize(rb_nativethread_cond_t *cond); + +/** + * Destroys the passed condition variable. + * + * @param[out] cond A condition variable to kill. + * @post `cond` is no longer eligible for other functions. + */ +void rb_native_cond_destroy(rb_nativethread_cond_t *cond); + +RBIMPL_SYMBOL_EXPORT_END() +#endif diff --git a/libs/libruby/ruby/util.h b/libs/libruby/ruby/util.h new file mode 100644 index 0000000..e8727a3 --- /dev/null +++ b/libs/libruby/ruby/util.h @@ -0,0 +1,228 @@ +#ifndef RUBY_UTIL_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_UTIL_H 1 +/** + * @file + * @author $Author$ + * @date Thu Mar 9 11:55:53 JST 1995 + * @copyright Copyright (C) 1993-2007 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @warning DO NOT ADD RANDOM GARBAGES IN THIS FILE! Contents of this file + * reside here for historical reasons. Find a right place for your + * API! + */ +#include "ruby/internal/config.h" + +#ifdef STDC_HEADERS +# include /* size_t */ +#endif + +#ifdef HAVE_SYS_TYPES_H +# include /* ssize_t */ +#endif + +#include "ruby/internal/attr/noalias.h" +#include "ruby/internal/attr/nodiscard.h" +#include "ruby/internal/attr/nonnull.h" +#include "ruby/internal/attr/restrict.h" +#include "ruby/internal/attr/returns_nonnull.h" +#include "ruby/internal/dllexport.h" +#include "ruby/defines.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** an approximation of ceil(n * log10(2)), up to 65536 at least */ +#define DECIMAL_SIZE_OF_BITS(n) (((n) * 3010 + 9998) / 9999) + +/** + * Character to number mapping like `'a'` -> `10`, `'b'` -> `11` etc. For + * punctuation etc., the value is -1. "36" terminology comes from the fact + * that this is the table behind `str.to_i(36)`. + */ +RUBY_EXTERN const signed char ruby_digit36_to_number_table[]; + +/** + * Characters that Ruby accepts as hexadecimal digits. This is `/\h/` expanded + * into an array. + */ +RUBY_EXTERN const char ruby_hexdigits[]; + +/** + * Scans the passed string, assuming the string is a textual representation of + * an integer. Stops when encountering something non-digit for the passed + * base. + * + * @note This does not understand minus sign. + * @note This does not understand e.g. `0x` prefix. + * @note It is a failure to pass `0` to `base`, unlike ruby_strtoul(). + * @param[in] str Target string of digits to interpret. + * @param[in] len Number of bytes of `str`, or -1 to detect `NUL`. + * @param[in] base Base, `2` to `36` inclusive. + * @param[out] retlen Return value buffer. + * @param[out] overflow Return value buffer. + * @return Interpreted numeric representation of `str`. + * @post `retlen` is the number of bytes scanned so far. + * @post `overflow` is set to true if the string represents something + * bigger than `ULONG_MAX`. Something meaningful still returns; + * which is the designed belabour of C's unsigned arithmetic. + */ +unsigned long ruby_scan_digits(const char *str, ssize_t len, int base, size_t *retlen, int *overflow); + +/** @old{ruby_scan_oct} */ +#define scan_oct(s,l,e) ((int)ruby_scan_oct((s),(l),(e))) + +RBIMPL_ATTR_NOALIAS() +RBIMPL_ATTR_NONNULL(()) +/** + * Interprets the passed string as an octal unsigned integer. Stops when + * encounters something not understood. + * + * @param[in] str C string to scan. + * @param[in] len Length of `str`. + * @param[out] consumed Return value buffer. + * @return Parsed integer. + * @post `ret` is the number of characters read. + * + * @internal + * + * No consideration is made for integer overflows. As the return value is + * unsigned this function has fully defined behaviour, but you cannot know if + * there was an integer wrap-around or not. + */ +unsigned long ruby_scan_oct(const char *str, size_t len, size_t *consumed); + +/** @old{ruby_scan_hex} */ +#define scan_hex(s,l,e) ((int)ruby_scan_hex((s),(l),(e))) + +RBIMPL_ATTR_NONNULL(()) +/** + * Interprets the passed string a hexadecimal unsigned integer. Stops when + * encounters something not understood. + * + * @param[in] str C string to scan. + * @param[in] len Length of `str`. + * @param[out] ret Return value buffer. + * @return Parsed integer. + * @post `ret` is the number of characters read. + * + * @internal + * + * No consideration is made for integer overflows. As the return value is + * unsigned this function has fully defined behaviour, but you cannot know if + * there was an integer wrap-around or not. + */ +unsigned long ruby_scan_hex(const char *str, size_t len, size_t *ret); + +/** + * Reentrant implementation of quick sort. If your system provides something + * (like C11 qsort_s), this is a thin wrapper of that routine. Otherwise + * resorts to our own version. + */ +#ifdef HAVE_GNU_QSORT_R +# define ruby_qsort qsort_r +#else +void ruby_qsort(void *, const size_t, const size_t, + int (*)(const void *, const void *, void *), void *); +#endif + +RBIMPL_ATTR_NONNULL((1)) +/** + * Sets an environment variable. In case of POSIX this is a wrapper of + * `setenv(3)`. But there are systems which lack one. We try hard emulating. + * + * @param[in] key An environment variable. + * @param[in] val A value to be associated with `key`, or 0. + * @exception rb_eSystemCallError `setenv(3)` failed for some reason. + * @post Environment variable `key` is created if necessary. Its value + * is updated to be `val`. + */ +void ruby_setenv(const char *key, const char *val); + +RBIMPL_ATTR_NONNULL(()) +/** + * Deletes the passed environment variable, if any. + * + * @param[in] key An environment variable. + * @exception rb_eSystemCallError `unsetenv(3)` failed for some reason. + * @post Environment variable `key` does not exist. + */ +void ruby_unsetenv(const char *key); + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RESTRICT() +RBIMPL_ATTR_RETURNS_NONNULL() +RBIMPL_ATTR_NONNULL(()) +/** + * This is our own version of `strdup(3)` that uses ruby_xmalloc() instead of + * system malloc (benefits our GC). + * + * @param[in] str Target C string to duplicate. + * @return An allocated C string holding the identical contents. + * @note Return value must be discarded using ruby_xfree(). + */ +char *ruby_strdup(const char *str); + +#undef strdup +/** + * @alias{ruby_strdup} + * + * @internal + * + * @shyouhei doesn't think it is a wise idea. ruby_strdup()'s return value + * must be passed to ruby_xfree(), but this macro makes it almost impossible. + */ +#define strdup(s) ruby_strdup(s) + +RBIMPL_ATTR_NODISCARD() +RBIMPL_ATTR_RESTRICT() +RBIMPL_ATTR_RETURNS_NONNULL() +/** + * This is our own version of `getcwd(3)` that uses ruby_xmalloc() instead of + * system malloc (benefits our GC). + * + * @return An allocated C string holding the process working directory. + * @note Return value must be discarded using ruby_xfree(). + */ +char *ruby_getcwd(void); + +RBIMPL_ATTR_NONNULL((1)) +/** + * Our own locale-insensitive version of `strtod(3)`. The conversion is done + * as if the current locale is set to the "C" locale, no matter actual runtime + * locale settings. + * + * @param[in] str Decimal or hexadecimal representation of a floating + * point number. + * @param[out] endptr NULL, or an arbitrary pointer (overwritten on return). + * @return Converted number. + * @post If `endptr` is not NULL, it is updated to point the first such + * byte where conversion failed. + * @note This function sets `errno` on failure. + * - `ERANGE`: Converted integer is out of range of `double`. + * @see William D. Clinger, "How to Read Floating Point Numbers + * Accurately" in Proc. ACM SIGPLAN '90, pp. 92-101. + * https://doi.org/10.1145/93542.93557 + */ +double ruby_strtod(const char *str, char **endptr); + +#undef strtod +/** @alias{ruby_strtod} */ +#define strtod(s,e) ruby_strtod((s),(e)) + +RBIMPL_ATTR_NONNULL((2)) +/** + * Scans the passed string, with calling the callback function every time it + * encounters a "word". A word here is a series of characters separated by + * either a space (of IEEE 1003.1 section 7.3.1.1), or a `','`. + * + * @param[in] str Target string to split into each words. + * @param[in] func Callback function. + * @param[in,out] argv Passed as-is to `func`. + */ +void ruby_each_words(const char *str, void (*func)(const char *word, int len, void *argv), void *argv); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_UTIL_H */ diff --git a/libs/libruby/ruby/version.h b/libs/libruby/ruby/version.h new file mode 100644 index 0000000..18b3abc --- /dev/null +++ b/libs/libruby/ruby/version.h @@ -0,0 +1,159 @@ +#ifndef RUBY_VERSION_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_VERSION_H 1 +/** + * @file + * @author $Author$ + * @date Wed May 13 12:56:56 JST 2009 + * @copyright Copyright (C) 1993-2009 Yukihiro Matsumoto + * @copyright Copyright (C) 2000 Network Applied Communication Laboratory, Inc. + * @copyright Copyright (C) 2000 Information-technology Promotion Agency, Japan + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * + * This file contains only + * - never-changeable information, and + * - interfaces accessible from extension libraries. + * + * Never try to check RUBY_VERSION_CODE etc in extension libraries, + * check the features with mkmf.rb instead. + */ + +/** + * @name The origin. + * + * These information never change. Just written here to remember. + * + * @{ + */ + +/** Author of this project. */ +#define RUBY_AUTHOR "Yukihiro Matsumoto" + +/** Ruby's birth year. */ +#define RUBY_BIRTH_YEAR 1993 + +/** Ruby's birth month. */ +#define RUBY_BIRTH_MONTH 2 + +/** Ruby's birth day. */ +#define RUBY_BIRTH_DAY 24 + +/** @} */ + +/** + * @name The API version. + * + * API version is different from binary version. These numbers are for API + * stability. When you have distinct API versions x and y, you cannot expect + * codes targeted to x also works for y. + * + * However let us repeat here that it's a BAD idea to check + * #RUBY_API_VERSION_CODE form extension libraries. Different API versions are + * just different. There is no such thing like upper compatibility. + * + * @{ + */ + +/** + * Major version. This digit changes sometimes for various reasons, but that + * doesn't mean a total rewrite. Practically when it comes to API versioning, + * major and minor version changes are equally catastrophic. + */ +#define RUBY_API_VERSION_MAJOR 3 + +/** + * Minor version. As of writing this version changes annually. Greater + * version doesn't mean "better"; they just mean years passed. + */ +#define RUBY_API_VERSION_MINOR 2 + +/** + * Teeny version. This digit is kind of reserved these days. Kept 0 for the + * entire 2.x era. Waiting for future uses. + */ +#define RUBY_API_VERSION_TEENY 0 + +/** + * This macro is API versions encoded into a C integer. + * + * @note Use mkmf. + * @note Don't rely on it. + */ +#define RUBY_API_VERSION_CODE (RUBY_API_VERSION_MAJOR*10000+RUBY_API_VERSION_MINOR*100+RUBY_API_VERSION_TEENY) + +/** @} */ + +#ifdef RUBY_EXTERN +/* Internal note: this file could be included from verconf.mk _before_ + * generating config.h, on Windows. The #ifdef above is to trick such + * situation. */ +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * @name Interfaces from extension libraries. + * + * Before using these infos, think thrice whether they are really + * necessary or not, and if the answer was yes, think twice a week + * later again. + * + * @{ + */ + +/** API versions, in { major, minor, teeny } order. */ +RUBY_EXTERN const int ruby_api_version[3]; + +/** + * Stringised version. + * + * @note This is the runtime version, not the API version. For instance it + * was `"2.5.9"` when ::ruby_api_version was `{ 2, 5, 0 }`. + */ +RUBY_EXTERN const char ruby_version[]; + +/** Date of release, in a C string. */ +RUBY_EXTERN const char ruby_release_date[]; + +/** + * Target platform identifier, in a C string. + * + * @note Seasoned UNIX programmers should beware that this "platform + * identifier" is our invention; not always identical to so-called + * target triplets that GNU systems use. For instance on @shyouhei's + * machine, ::ruby_platform is `"x64_64-linux"` while its target triplet + * is `x86_64-pc-linux-gnu`. + * @note Note also that we support Windows. + */ +RUBY_EXTERN const char ruby_platform[]; + +/** + * This is a monotonic increasing integer that describes specific "patch" + * level. You can know the exact changeset your binary is running by this info + * (and ::ruby_version), unless this is -1. -1 means there is no release yet + * for the version; ruby is actively developed. 0 means the initial GA version. + */ +RUBY_EXTERN const int ruby_patchlevel; + +/** + * This is what `ruby -v` prints to the standard error. Something like: + * `"ruby 2.5.9p229 (2021-04-05 revision 67829) [x86_64-linux]"`. This doesn't + * include runtime options like a JIT being enabled. + */ +RUBY_EXTERN const char ruby_description[]; + +/** Copyright notice. */ +RUBY_EXTERN const char ruby_copyright[]; + +/** + * This is just `"ruby"` for us. But different implementations can have + * different strings here. + */ +RUBY_EXTERN const char ruby_engine[]; + +/** @} */ + +RBIMPL_SYMBOL_EXPORT_END() +#endif + +#endif diff --git a/libs/libruby/ruby/vm.h b/libs/libruby/ruby/vm.h new file mode 100644 index 0000000..3458c28 --- /dev/null +++ b/libs/libruby/ruby/vm.h @@ -0,0 +1,54 @@ +#ifndef RUBY_VM_H /*-*-C++-*-vi:se ft=cpp:*/ +#define RUBY_VM_H 1 +/** + * @file + * @author $Author$ + * @date Sat May 31 15:17:36 2008 + * @copyright Copyright (C) 2008 Yukihiro Matsumoto + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * + * We planned to have multiple VMs run side-by-side. The API here was a + * preparation of that feature. The topic branch was eventually abandoned, and + * we now have Ractor. This file is kind of obsolescent. + */ +#include "ruby/internal/dllexport.h" + +RBIMPL_SYMBOL_EXPORT_BEGIN() + +/** + * The opaque struct to hold VM internals. Its fields are intentionally hidden + * from extension libraries because it changes drastically time to time. + */ +typedef struct rb_vm_struct ruby_vm_t; + +/** + * Destructs the passed VM. You don't have to call this API directly now, + * because there is no way to create one. There is only one VM at one time. + * ruby_stop() should just suffice. + */ +int ruby_vm_destruct(ruby_vm_t *vm); + +/** + * ruby_vm_at_exit registers a function _func_ to be invoked when a VM + * passed away. Functions registered this way runs in reverse order + * of registration, just like END {} block does. The difference is + * its timing to be triggered. ruby_vm_at_exit functions runs when a + * VM _passed_ _away_, while END {} blocks runs just _before_ a VM + * _is_ _passing_ _away_. + * + * You cannot register a function to another VM than where you are in. + * So where to register is intuitive, omitted. OTOH the argument + * _func_ cannot know which VM it is in because at the time of + * invocation, the VM has already died and there is no execution + * context. The VM itself is passed as the first argument to it. + * + * @param[in] func the function to register. + */ +void ruby_vm_at_exit(void(*func)(ruby_vm_t *)); + +RBIMPL_SYMBOL_EXPORT_END() + +#endif /* RUBY_VM_H */ diff --git a/src/scripting/process.cc b/src/scripting/process.cc index 6d749ce..500f719 100644 --- a/src/scripting/process.cc +++ b/src/scripting/process.cc @@ -34,7 +34,6 @@ static void ruby_load(const char *main_file) { int state = 0; rb_load_protect(rb_str_new_cstr(main_file), 0, &state); if (state) { - VALUE err = rb_errinfo(); rb_set_errinfo(Qnil); fprintf(stderr, "%d: Failed to load Ruby file %s\n", state, main_file); } @@ -44,7 +43,6 @@ static void ruby_eval_string(const char *code) { int state = 0; rb_eval_string_protect(code, &state); if (state) { - VALUE err = rb_errinfo(); rb_set_errinfo(Qnil); fprintf(stderr, "Ruby eval failed\n"); }