diff options
Diffstat (limited to 'include/ruby/internal/intern')
38 files changed, 0 insertions, 11868 deletions
diff --git a/include/ruby/internal/intern/array.h b/include/ruby/internal/intern/array.h deleted file mode 100644 index 1909fdf17b..0000000000 --- a/include/ruby/internal/intern/array.h +++ /dev/null @@ -1,657 +0,0 @@ -#ifndef RBIMPL_INTERN_ARRAY_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_ARRAY_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 RangeError. - * 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/include/ruby/internal/intern/bignum.h b/include/ruby/internal/intern/bignum.h deleted file mode 100644 index c27f77a1fb..0000000000 --- a/include/ruby/internal/intern/bignum.h +++ /dev/null @@ -1,846 +0,0 @@ -#ifndef RBIMPL_INTERN_BIGNUM_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_BIGNUM_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 <stddef.h> -#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 "bigzero". 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/include/ruby/internal/intern/class.h b/include/ruby/internal/intern/class.h deleted file mode 100644 index 0fb2d001bc..0000000000 --- a/include/ruby/internal/intern/class.h +++ /dev/null @@ -1,394 +0,0 @@ -#ifndef RBIMPL_INTERN_CLASS_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_CLASS_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/compar.h b/include/ruby/internal/intern/compar.h deleted file mode 100644 index dc3b377b01..0000000000 --- a/include/ruby/internal/intern/compar.h +++ /dev/null @@ -1,62 +0,0 @@ -#ifndef RBIMPL_INTERN_COMPAR_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_COMPAR_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/complex.h b/include/ruby/internal/intern/complex.h deleted file mode 100644 index e111bd8ced..0000000000 --- a/include/ruby/internal/intern/complex.h +++ /dev/null @@ -1,253 +0,0 @@ -#ifndef RBIMPL_INTERN_COMPLEX_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_COMPLEX_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/cont.h b/include/ruby/internal/intern/cont.h deleted file mode 100644 index 32647f48aa..0000000000 --- a/include/ruby/internal/intern/cont.h +++ /dev/null @@ -1,282 +0,0 @@ -#ifndef RBIMPL_INTERN_CONT_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_CONT_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 "<x> =>> #{i}" - * puts "<y> <-- #{i + 1}" - * j = Fiber.yield(i + 1) - * puts "<z> =>> #{j}" - * puts "<w> <-- #{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] <x> <y> [b] [c] <z> <w> [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/include/ruby/internal/intern/dir.h b/include/ruby/internal/intern/dir.h deleted file mode 100644 index da1873e068..0000000000 --- a/include/ruby/internal/intern/dir.h +++ /dev/null @@ -1,42 +0,0 @@ -#ifndef RBIMPL_INTERN_DIR_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_DIR_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/enum.h b/include/ruby/internal/intern/enum.h deleted file mode 100644 index 215ad82672..0000000000 --- a/include/ruby/internal/intern/enum.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef RBIMPL_INTERN_ENUM_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_ENUM_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/enumerator.h b/include/ruby/internal/intern/enumerator.h deleted file mode 100644 index 20e5d7c6fc..0000000000 --- a/include/ruby/internal/intern/enumerator.h +++ /dev/null @@ -1,259 +0,0 @@ -#ifndef RBIMPL_INTERN_ENUMERATOR_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_ENUMERATOR_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/error.h b/include/ruby/internal/intern/error.h deleted file mode 100644 index bf8daadd3e..0000000000 --- a/include/ruby/internal/intern/error.h +++ /dev/null @@ -1,287 +0,0 @@ -#ifndef RBIMPL_INTERN_ERROR_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_ERROR_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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. - */ -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/include/ruby/internal/intern/eval.h b/include/ruby/internal/intern/eval.h deleted file mode 100644 index 2230f7ab0c..0000000000 --- a/include/ruby/internal/intern/eval.h +++ /dev/null @@ -1,222 +0,0 @@ -#ifndef RBIMPL_INTERN_EVAL_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_EVAL_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/file.h b/include/ruby/internal/intern/file.h deleted file mode 100644 index 79820fdc61..0000000000 --- a/include/ruby/internal/intern/file.h +++ /dev/null @@ -1,213 +0,0 @@ -#ifndef RBIMPL_INTERN_FILE_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_FILE_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 `<sys/stat.h>` 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/include/ruby/internal/intern/hash.h b/include/ruby/internal/intern/hash.h deleted file mode 100644 index af8dfd5d8f..0000000000 --- a/include/ruby/internal/intern/hash.h +++ /dev/null @@ -1,320 +0,0 @@ -#ifndef RBIMPL_INTERN_HASH_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_HASH_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/io.h b/include/ruby/internal/intern/io.h deleted file mode 100644 index 02c249723e..0000000000 --- a/include/ruby/internal/intern/io.h +++ /dev/null @@ -1,661 +0,0 @@ -#ifndef RBIMPL_INTERN_IO_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_IO_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/load.h b/include/ruby/internal/intern/load.h deleted file mode 100644 index 9ceb98c2e4..0000000000 --- a/include/ruby/internal/intern/load.h +++ /dev/null @@ -1,255 +0,0 @@ -#ifndef RBIMPL_INTERN_LOAD_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_LOAD_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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); - -/** - * Resolves and returns a symbol of a function in the native extension - * specified by the feature and symbol names. Extensions will use this function - * to access the symbols provided by other native extensions. - * - * @param[in] feature Name of a feature, e.g. `"json"`. - * @param[in] symbol Name of a symbol defined by the feature. - * @return The resolved symbol of a function, defined and externed by the - * specified feature. It may be NULL if the feature is not loaded, - * the feature is not extension, or the symbol is not found. - */ -void *rb_ext_resolve_symbol(const char *feature, const char *symbol); - -/** - * This macro is to provide backwards compatibility. It provides a way to - * define function prototypes and resolving function symbols in a safe way. - * - * ```CXX - * // prototypes - * #ifdef HAVE_RB_EXT_RESOLVE_SYMBOL - * VALUE *(*other_extension_func)(VALUE,VALUE); - * #else - * VALUE other_extension_func(VALUE); - * #endif - * - * // in Init_xxx() - * #ifdef HAVE_RB_EXT_RESOLVE_SYMBOL - * other_extension_func = \ - * (VALUE(*)(VALUE,VALUE))rb_ext_resolve_symbol(fname, sym_name); - * if (other_extension_func == NULL) { - * // raise your own error - * } - * #endif - * ``` - */ -#define HAVE_RB_EXT_RESOLVE_SYMBOL 1 - -/** - * @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/include/ruby/internal/intern/marshal.h b/include/ruby/internal/intern/marshal.h deleted file mode 100644 index 118d78a4a0..0000000000 --- a/include/ruby/internal/intern/marshal.h +++ /dev/null @@ -1,112 +0,0 @@ -#ifndef RBIMPL_INTERN_MARSHAL_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_MARSHAL_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/numeric.h b/include/ruby/internal/intern/numeric.h deleted file mode 100644 index 30863fb0c8..0000000000 --- a/include/ruby/internal/intern/numeric.h +++ /dev/null @@ -1,208 +0,0 @@ -#ifndef RBIMPL_INTERN_NUMERIC_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_NUMERIC_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/object.h b/include/ruby/internal/intern/object.h deleted file mode 100644 index b9ffa57c06..0000000000 --- a/include/ruby/internal/intern/object.h +++ /dev/null @@ -1,501 +0,0 @@ -#ifndef RBIMPL_INTERN_OBJECT_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_OBJECT_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/parse.h b/include/ruby/internal/intern/parse.h deleted file mode 100644 index 7c4e9925b9..0000000000 --- a/include/ruby/internal/intern/parse.h +++ /dev/null @@ -1,194 +0,0 @@ -#ifndef RBIMPL_INTERN_PARSE_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_PARSE_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/proc.h b/include/ruby/internal/intern/proc.h deleted file mode 100644 index b8c3c5e146..0000000000 --- a/include/ruby/internal/intern/proc.h +++ /dev/null @@ -1,353 +0,0 @@ -#ifndef RBIMPL_INTERN_PROC_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_PROC_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/process.h b/include/ruby/internal/intern/process.h deleted file mode 100644 index cfa5e13162..0000000000 --- a/include/ruby/internal/intern/process.h +++ /dev/null @@ -1,282 +0,0 @@ -#ifndef RBIMPL_INTERN_PROCESS_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_PROCESS_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 */ - -/** - * Wait for the specified process to terminate, reap it, and return its status. - * - * @param[in] pid The process ID to wait for. - * @param[in] flags The flags to pass to waitpid(2). - * @return VALUE An instance of Process::Status. - */ -VALUE rb_process_status_wait(rb_pid_t pid, int flags); - -/** - * 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 `./configure` 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/include/ruby/internal/intern/random.h b/include/ruby/internal/intern/random.h deleted file mode 100644 index 5577f53cb4..0000000000 --- a/include/ruby/internal/intern/random.h +++ /dev/null @@ -1,116 +0,0 @@ -#ifndef RBIMPL_INTERN_RANDOM_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_RANDOM_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/range.h b/include/ruby/internal/intern/range.h deleted file mode 100644 index 1f7d7c313f..0000000000 --- a/include/ruby/internal/intern/range.h +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef RBIMPL_INTERN_RANGE_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_RANGE_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/rational.h b/include/ruby/internal/intern/rational.h deleted file mode 100644 index ff4beca297..0000000000 --- a/include/ruby/internal/intern/rational.h +++ /dev/null @@ -1,172 +0,0 @@ -#ifndef RBIMPL_INTERN_RATIONAL_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_RATIONAL_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/re.h b/include/ruby/internal/intern/re.h deleted file mode 100644 index 4dd58b469b..0000000000 --- a/include/ruby/internal/intern/re.h +++ /dev/null @@ -1,244 +0,0 @@ -#ifndef RBIMPL_INTERN_RE_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_RE_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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. - * - */ -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/include/ruby/internal/intern/ruby.h b/include/ruby/internal/intern/ruby.h deleted file mode 100644 index efe61424ca..0000000000 --- a/include/ruby/internal/intern/ruby.h +++ /dev/null @@ -1,77 +0,0 @@ -#ifndef RBIMPL_INTERN_RUBY_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_RUBY_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/select.h b/include/ruby/internal/intern/select.h deleted file mode 100644 index 6ba84c6e63..0000000000 --- a/include/ruby/internal/intern/select.h +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef RBIMPL_INTERN_SELECT_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_SELECT_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 <sys/types.h> /* 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 limitation 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/include/ruby/internal/intern/select/largesize.h b/include/ruby/internal/intern/select/largesize.h deleted file mode 100644 index d65f088c06..0000000000 --- a/include/ruby/internal/intern/select/largesize.h +++ /dev/null @@ -1,214 +0,0 @@ -#ifndef RBIMPL_INTERN_SELECT_LARGESIZE_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_SELECT_LARGESIZE_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/select/posix.h b/include/ruby/internal/intern/select/posix.h deleted file mode 100644 index 0a9b0b2e51..0000000000 --- a/include/ruby/internal/intern/select/posix.h +++ /dev/null @@ -1,144 +0,0 @@ -#ifndef RBIMPL_INTERN_SELECT_POSIX_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_SELECT_POSIX_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 <sys/select.h> /* for select(2) (modern POSIX) */ -#endif - -#ifdef HAVE_UNISTD_H -# include <unistd.h> /* 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/include/ruby/internal/intern/select/win32.h b/include/ruby/internal/intern/select/win32.h deleted file mode 100644 index edaf7a8523..0000000000 --- a/include/ruby/internal/intern/select/win32.h +++ /dev/null @@ -1,259 +0,0 @@ -#ifndef RBIMPL_INTERN_SELECT_WIN32_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_SELECT_WIN32_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/dosish.h" /* for rb_w32_select */ -#include "ruby/internal/attr/nonnull.h" -#include "ruby/internal/attr/pure.h" -#include "ruby/internal/attr/noalias.h" -#include "ruby/internal/dllexport.h" -#include "ruby/assert.h" - -/**@cond INTERNAL_MACRO */ -#define rb_fd_zero rb_fd_zero -#define rb_fd_clr rb_fd_clr -#define rb_fd_isset rb_fd_isset -#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_SYMBOL_EXPORT_BEGIN() - -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 capa; /**< Maximum allowed number of FDs. */ - fd_set *fdset; /**< File descriptors buffer. */ -} rb_fdset_t; - -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. - * - * @internal - * - * Can't this leak memory if the same `f` is passed twice...? - */ -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(()) -/** - * 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(()) -/** - * 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_w32_fd_copy(rb_fdset_t *dst, const fd_set *src, int max); - -RBIMPL_ATTR_NONNULL(()) -/** - * Identical to rb_w32_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_w32_fd_dup(rb_fdset_t *dst, const rb_fdset_t *src); - -RBIMPL_SYMBOL_EXPORT_END() - -RBIMPL_ATTR_NONNULL(()) -RBIMPL_ATTR_NOALIAS() -/** - * Wipes out the current set of FDs. - * - * @param[out] f The fdset to clear. - * @post `f` has no FDs. - */ -static inline void -rb_fd_zero(rb_fdset_t *f) -{ - f->fdset->fd_count = 0; -} - -RBIMPL_ATTR_NONNULL(()) -/** - * Releases a specific FD from the given fdset. - * - * @param[in] n Target FD. - * @param[out] f The fdset that holds `n`. - * @post `f` doesn't hold n. - */ -static inline void -rb_fd_clr(int n, rb_fdset_t *f) -{ - rb_w32_fdclr(n, f->fdset); -} - -RBIMPL_ATTR_NONNULL(()) -/** - * Queries if the given FD is in the given set. - * - * @param[in] n Target FD. - * @param[in] f The fdset to scan. - * @retval 1 Yes there is. - * @retval 0 No there isn't. - */ -static inline int -rb_fd_isset(int n, rb_fdset_t *f) -{ - return rb_w32_fdisset(n, f->fdset); -} - -RBIMPL_ATTR_NONNULL(()) -/** - * Destructively overwrites an fdset with another. - * - * @param[out] dst Target fdset. - * @param[in] src Source fdset. - * @param[in] n Maximum number of file descriptors to copy. - * @post `dst` is a copy of `src`. - */ -static inline void -rb_fd_copy(rb_fdset_t *dst, const fd_set *src, int n) -{ - rb_w32_fd_copy(dst, src, n); -} - -RBIMPL_ATTR_NONNULL(()) -/** - * 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`. - */ -static inline void -rb_fd_dup(rb_fdset_t *dst, const rb_fdset_t *src) -{ - rb_w32_fd_dup(dst, src); -} - -/** - * Waits for multiple file descriptors at once. - * - * @param[in] n 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. - * - * @internal - * - * This can wait for `SOCKET` and `HANDLE` at once. In order to achieve that - * property we heavily touch the internals of MSVCRT. We `CreateFile` a - * `"NUL"` alongside of a socket and directly manipulate its `struct ioinfo`. - * This is of course a very dirty hack. If we could design the API today we - * could use `CancellIoEx`. But we are older than that Win32 API. - */ -static inline int -rb_fd_select(int n, rb_fdset_t *rfds, rb_fdset_t *wfds, rb_fdset_t *efds, struct timeval *timeout) -{ - return rb_w32_select( - n, - rfds ? rfds->fdset : NULL, - wfds ? wfds->fdset : NULL, - efds ? efds->fdset : NULL, - timeout); -} - -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_UNLESS_DEBUG() -/** - * 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) -{ - const fd_set *p = f->fdset; - - RBIMPL_ASSERT_OR_ASSUME(p); - return p->fd_count; -} - -#endif /* RBIMPL_INTERN_SELECT_WIN32_H */ diff --git a/include/ruby/internal/intern/signal.h b/include/ruby/internal/intern/signal.h deleted file mode 100644 index e5b6d6c3d5..0000000000 --- a/include/ruby/internal/intern/signal.h +++ /dev/null @@ -1,146 +0,0 @@ -#ifndef RBIMPL_INTERN_SIGNAL_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_SIGNAL_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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); - -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/include/ruby/internal/intern/sprintf.h b/include/ruby/internal/intern/sprintf.h deleted file mode 100644 index aedc0f9ab1..0000000000 --- a/include/ruby/internal/intern/sprintf.h +++ /dev/null @@ -1,159 +0,0 @@ -#ifndef RBIMPL_INTERN_SPRINTF_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_SPRINTF_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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); // => "#<IO:<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/include/ruby/internal/intern/string.h b/include/ruby/internal/intern/string.h deleted file mode 100644 index 3083125e56..0000000000 --- a/include/ruby/internal/intern/string.h +++ /dev/null @@ -1,1757 +0,0 @@ -#ifndef RBIMPL_INTERN_STRING_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_STRING_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 <stddef.h> -#endif - -#ifdef HAVE_STRING_H -# include <string.h> -#endif - -#ifdef HAVE_STDINT_H -# include <stdint.h> -#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" - * '<<koala>>'.succ # => "<<koalb>>" - * '***'.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/include/ruby/internal/intern/struct.h b/include/ruby/internal/intern/struct.h deleted file mode 100644 index 4510508d77..0000000000 --- a/include/ruby/internal/intern/struct.h +++ /dev/null @@ -1,217 +0,0 @@ -#ifndef RBIMPL_INTERN_STRUCT_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_STRUCT_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 - * NULL. 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 - * NULL. 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 - * NULL. 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 - * NULL. 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, ...); - -/** - * Defines an anonymous data class. - * - * @endinternal - * - * @param[in] super Superclass of the defining class. Must be a - * descendant of ::rb_cData, or 0 as ::rb_cData. - * @param[in] ... Arbitrary number of `const char*`, terminated by - * NULL. Each of which are the name of fields. - * @exception rb_eArgError Duplicated field name. - * @return The defined class. - */ -VALUE rb_data_define(VALUE super, ...); - -RBIMPL_SYMBOL_EXPORT_END() - -#endif /* RBIMPL_INTERN_STRUCT_H */ diff --git a/include/ruby/internal/intern/thread.h b/include/ruby/internal/intern/thread.h deleted file mode 100644 index 716375acd7..0000000000 --- a/include/ruby/internal/intern/thread.h +++ /dev/null @@ -1,492 +0,0 @@ -#ifndef RBIMPL_INTERN_THREAD_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_THREAD_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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/include/ruby/internal/intern/time.h b/include/ruby/internal/intern/time.h deleted file mode 100644 index df482862eb..0000000000 --- a/include/ruby/internal/intern/time.h +++ /dev/null @@ -1,161 +0,0 @@ -#ifndef RBIMPL_INTERN_TIME_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_TIME_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 <time.h> /* 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/include/ruby/internal/intern/variable.h b/include/ruby/internal/intern/variable.h deleted file mode 100644 index 479c3950c1..0000000000 --- a/include/ruby/internal/intern/variable.h +++ /dev/null @@ -1,628 +0,0 @@ -#ifndef RBIMPL_INTERN_VARIABLE_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_VARIABLE_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 `#<Class: ...>` 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/include/ruby/internal/intern/vm.h b/include/ruby/internal/intern/vm.h deleted file mode 100644 index 76af796b54..0000000000 --- a/include/ruby/internal/intern/vm.h +++ /dev/null @@ -1,431 +0,0 @@ -#ifndef RBIMPL_INTERN_VM_H /*-*-C++-*-vi:se ft=cpp:*/ -#define RBIMPL_INTERN_VM_H -/** - * @file - * @author Ruby developers <ruby-core@ruby-lang.org> - * @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 */ |
