diff options
author | Nobuyoshi Nakada <[email protected]> | 2024-06-07 11:06:53 +0900 |
---|---|---|
committer | git <[email protected]> | 2024-06-08 03:40:27 +0000 |
commit | 0619312bb53cb64dedbfbf30eafd3a708b72588e (patch) | |
tree | 5f3189b451d1e906add7952fe99964d72f299d08 /ext/digest/digest.c | |
parent | 0d91887c6aa740d3226407cafa1f27c62fd119f4 (diff) |
[ruby/digest] Use typed data in digest
https://github.com/ruby/digest/commit/9a22f921c9
Diffstat (limited to 'ext/digest/digest.c')
-rw-r--r-- | ext/digest/digest.c | 40 |
1 files changed, 32 insertions, 8 deletions
diff --git a/ext/digest/digest.c b/ext/digest/digest.c index 68837a674c..06b07bb886 100644 --- a/ext/digest/digest.c +++ b/ext/digest/digest.c @@ -537,6 +537,36 @@ rb_digest_class_init(VALUE self) * Data_Wrap_Struct(0, 0, 0, (void *)&sha1)); */ +#ifdef DIGEST_USE_RB_EXT_RESOLVE_SYMBOL +static const rb_data_type_t metadata_type = { + "digest/metadata", + {0}, +}; + +RUBY_FUNC_EXPORTED VALUE +rb_digest_wrap_metadata(const rb_digest_metadata_t *meta) +{ + return rb_obj_freeze(TypedData_Wrap_Struct(0, &metadata_type, (void *)meta)); +} +#endif + +static rb_digest_metadata_t * +get_metadata_ptr(VALUE obj) +{ + rb_digest_metadata_t *algo; + +#ifdef DIGEST_USE_RB_EXT_RESOLVE_SYMBOL + if (!rb_typeddata_is_kind_of(obj, &metadata_type)) return 0; + algo = RTYPEDDATA_DATA(obj); +#else +# undef RUBY_UNTYPED_DATA_WARNING +# define RUBY_UNTYPED_DATA_WARNING 0 + Data_Get_Struct(obj, rb_digest_metadata_t, algo); +#endif + + return algo; +} + static rb_digest_metadata_t * get_digest_base_metadata(VALUE klass) { @@ -554,8 +584,8 @@ get_digest_base_metadata(VALUE klass) if (NIL_P(p)) rb_raise(rb_eRuntimeError, "Digest::Base cannot be directly inherited in Ruby"); - if (!RB_TYPE_P(obj, T_DATA) || RTYPEDDATA_P(obj)) { - wrong: + algo = get_metadata_ptr(obj); + if (!algo) { if (p == klass) rb_raise(rb_eTypeError, "%"PRIsVALUE"::metadata is not initialized properly", klass); @@ -564,12 +594,6 @@ get_digest_base_metadata(VALUE klass) klass, p); } -#undef RUBY_UNTYPED_DATA_WARNING -#define RUBY_UNTYPED_DATA_WARNING 0 - Data_Get_Struct(obj, rb_digest_metadata_t, algo); - - if (!algo) goto wrong; - switch (algo->api_version) { case 3: break; |