[前][次][番号順一覧][スレッド一覧]

ruby-changes:73899

From: Aaron <ko1@a...>
Date: Fri, 7 Oct 2022 15:21:00 +0900 (JST)
Subject: [ruby-changes:73899] 48a6498406 (master): [ruby/fiddle] Add constants for unsigned values (https://github.com/ruby/fiddle/pull/111)

https://git.ruby-lang.org/ruby.git/commit/?id=48a6498406

From 48a64984063532f4dedf62e8ac4958a3cf3b556d Mon Sep 17 00:00:00 2001
From: Aaron Patterson <tenderlove@r...>
Date: Mon, 12 Sep 2022 09:53:19 -0700
Subject: [ruby/fiddle] Add constants for unsigned values
 (https://github.com/ruby/fiddle/pull/111)

This commit adds constants for unsigned values. Currently we can use `-`
to mean "unsigned", but I think having a specific name makes Fiddle more
user friendly. This commit continues to support `-`, but introduces
negative constants with "unsigned" names

I think this will help to eliminate [this
code](https://github.com/ruby/ruby/blob/3a56bf0bcc66e14ffe5ec89efc32ecfceed180f4/lib/mjit/c_type.rb#L31-L38)

https://github.com/ruby/fiddle/commit/2bef0f1082

Co-authored-by: Sutou Kouhei <kou@c...>
---
 ext/fiddle/closure.c             |  20 ++++----
 ext/fiddle/conversions.c         |  20 ++++----
 ext/fiddle/fiddle.c              | 108 +++++++++++++++++++++++++++++++++++++++
 ext/fiddle/fiddle.h              |  21 ++++++++
 ext/fiddle/lib/fiddle/cparser.rb |  18 +++----
 ext/fiddle/lib/fiddle/pack.rb    |  30 +++++------
 test/fiddle/test_import.rb       |  10 ++++
 7 files changed, 183 insertions(+), 44 deletions(-)

diff --git a/ext/fiddle/closure.c b/ext/fiddle/closure.c
index a74cc53b78..2d340297d5 100644
--- a/ext/fiddle/closure.c
+++ b/ext/fiddle/closure.c
@@ -90,7 +90,7 @@ with_gvl_callback(void *ptr) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/closure.c#L90
 	  case TYPE_INT:
 	    rb_ary_push(params, INT2NUM(*(int *)x->args[i]));
 	    break;
-	  case -TYPE_INT:
+	  case TYPE_UINT:
 	    rb_ary_push(params, UINT2NUM(*(unsigned int *)x->args[i]));
 	    break;
 	  case TYPE_VOIDP:
@@ -101,19 +101,19 @@ with_gvl_callback(void *ptr) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/closure.c#L101
 	  case TYPE_LONG:
 	    rb_ary_push(params, LONG2NUM(*(long *)x->args[i]));
 	    break;
-	  case -TYPE_LONG:
+	  case TYPE_ULONG:
 	    rb_ary_push(params, ULONG2NUM(*(unsigned long *)x->args[i]));
 	    break;
 	  case TYPE_CHAR:
 	    rb_ary_push(params, INT2NUM(*(signed char *)x->args[i]));
 	    break;
-	  case -TYPE_CHAR:
+	  case TYPE_UCHAR:
 	    rb_ary_push(params, UINT2NUM(*(unsigned char *)x->args[i]));
 	    break;
 	  case TYPE_SHORT:
 	    rb_ary_push(params, INT2NUM(*(signed short *)x->args[i]));
 	    break;
-	  case -TYPE_SHORT:
+	  case TYPE_USHORT:
 	    rb_ary_push(params, UINT2NUM(*(unsigned short *)x->args[i]));
 	    break;
 	  case TYPE_DOUBLE:
@@ -126,7 +126,7 @@ with_gvl_callback(void *ptr) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/closure.c#L126
 	  case TYPE_LONG_LONG:
 	    rb_ary_push(params, LL2NUM(*(LONG_LONG *)x->args[i]));
 	    break;
-	  case -TYPE_LONG_LONG:
+	  case TYPE_ULONG_LONG:
 	    rb_ary_push(params, ULL2NUM(*(unsigned LONG_LONG *)x->args[i]));
 	    break;
 #endif
@@ -149,7 +149,7 @@ with_gvl_callback(void *ptr) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/closure.c#L149
       case TYPE_LONG:
 	*(long *)x->resp = NUM2LONG(ret);
 	break;
-      case -TYPE_LONG:
+      case TYPE_ULONG:
 	*(unsigned long *)x->resp = NUM2ULONG(ret);
 	break;
       case TYPE_CHAR:
@@ -157,9 +157,9 @@ with_gvl_callback(void *ptr) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/closure.c#L157
       case TYPE_INT:
 	*(ffi_sarg *)x->resp = NUM2INT(ret);
 	break;
-      case -TYPE_CHAR:
-      case -TYPE_SHORT:
-      case -TYPE_INT:
+      case TYPE_UCHAR:
+      case TYPE_USHORT:
+      case TYPE_UINT:
 	*(ffi_arg *)x->resp = NUM2UINT(ret);
 	break;
       case TYPE_VOIDP:
@@ -175,7 +175,7 @@ with_gvl_callback(void *ptr) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/closure.c#L175
       case TYPE_LONG_LONG:
 	*(LONG_LONG *)x->resp = NUM2LL(ret);
 	break;
-      case -TYPE_LONG_LONG:
+      case TYPE_ULONG_LONG:
 	*(unsigned LONG_LONG *)x->resp = NUM2ULL(ret);
 	break;
 #endif
diff --git a/ext/fiddle/conversions.c b/ext/fiddle/conversions.c
index 6e0ce36378..3b70f7de4c 100644
--- a/ext/fiddle/conversions.c
+++ b/ext/fiddle/conversions.c
@@ -211,32 +211,32 @@ rb_fiddle_value_to_generic(int type, VALUE *src, fiddle_generic *dst) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/conversions.c#L211
       case TYPE_CHAR:
 	dst->schar = (signed char)NUM2INT(*src);
 	break;
-      case -TYPE_CHAR:
+      case TYPE_UCHAR:
 	dst->uchar = (unsigned char)NUM2UINT(*src);
 	break;
       case TYPE_SHORT:
 	dst->sshort = (unsigned short)NUM2INT(*src);
 	break;
-      case -TYPE_SHORT:
+      case TYPE_USHORT:
 	dst->sshort = (signed short)NUM2UINT(*src);
 	break;
       case TYPE_INT:
 	dst->sint = NUM2INT(*src);
 	break;
-      case -TYPE_INT:
+      case TYPE_UINT:
 	dst->uint = NUM2UINT(*src);
 	break;
       case TYPE_LONG:
 	dst->slong = NUM2LONG(*src);
 	break;
-      case -TYPE_LONG:
+      case TYPE_ULONG:
 	dst->ulong = NUM2ULONG(*src);
 	break;
 #if HAVE_LONG_LONG
       case TYPE_LONG_LONG:
 	dst->slong_long = NUM2LL(*src);
 	break;
-      case -TYPE_LONG_LONG:
+      case TYPE_ULONG_LONG:
 	dst->ulong_long = NUM2ULL(*src);
 	break;
 #endif
@@ -283,24 +283,24 @@ rb_fiddle_generic_to_value(VALUE rettype, fiddle_generic retval) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/conversions.c#L283
           PTR2NUM((void *)retval.pointer));
       case TYPE_CHAR:
 	return INT2NUM((signed char)retval.fffi_sarg);
-      case -TYPE_CHAR:
+      case TYPE_UCHAR:
 	return INT2NUM((unsigned char)retval.fffi_arg);
       case TYPE_SHORT:
 	return INT2NUM((signed short)retval.fffi_sarg);
-      case -TYPE_SHORT:
+      case TYPE_USHORT:
 	return INT2NUM((unsigned short)retval.fffi_arg);
       case TYPE_INT:
 	return INT2NUM((signed int)retval.fffi_sarg);
-      case -TYPE_INT:
+      case TYPE_UINT:
 	return UINT2NUM((unsigned int)retval.fffi_arg);
       case TYPE_LONG:
 	return LONG2NUM(retval.slong);
-      case -TYPE_LONG:
+      case TYPE_ULONG:
 	return ULONG2NUM(retval.ulong);
 #if HAVE_LONG_LONG
       case TYPE_LONG_LONG:
 	return LL2NUM(retval.slong_long);
-      case -TYPE_LONG_LONG:
+      case TYPE_ULONG_LONG:
 	return ULL2NUM(retval.ulong_long);
 #endif
       case TYPE_FLOAT:
diff --git a/ext/fiddle/fiddle.c b/ext/fiddle/fiddle.c
index a8b5123269..245d8768b6 100644
--- a/ext/fiddle/fiddle.c
+++ b/ext/fiddle/fiddle.c
@@ -182,30 +182,60 @@ Init_fiddle(void) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/fiddle.c#L182
      */
     rb_define_const(mFiddle, "TYPE_CHAR",      INT2NUM(TYPE_CHAR));
 
+    /* Document-const: TYPE_UCHAR
+     *
+     * C type - unsigned char
+     */
+    rb_define_const(mFiddle, "TYPE_UCHAR",      INT2NUM(TYPE_UCHAR));
+
     /* Document-const: TYPE_SHORT
      *
      * C type - short
      */
     rb_define_const(mFiddle, "TYPE_SHORT",     INT2NUM(TYPE_SHORT));
 
+    /* Document-const: TYPE_USHORT
+     *
+     * C type - unsigned short
+     */
+    rb_define_const(mFiddle, "TYPE_USHORT",     INT2NUM(TYPE_USHORT));
+
     /* Document-const: TYPE_INT
      *
      * C type - int
      */
     rb_define_const(mFiddle, "TYPE_INT",       INT2NUM(TYPE_INT));
 
+    /* Document-const: TYPE_UINT
+     *
+     * C type - unsigned int
+     */
+    rb_define_const(mFiddle, "TYPE_UINT",       INT2NUM(TYPE_UINT));
+
     /* Document-const: TYPE_LONG
      *
      * C type - long
      */
     rb_define_const(mFiddle, "TYPE_LONG",      INT2NUM(TYPE_LONG));
 
+    /* Document-const: TYPE_ULONG
+     *
+     * C type - long
+     */
+    rb_define_const(mFiddle, "TYPE_ULONG",      INT2NUM(TYPE_ULONG));
+
 #if HAVE_LONG_LONG
     /* Document-const: TYPE_LONG_LONG
      *
      * C type - long long
      */
     rb_define_const(mFiddle, "TYPE_LONG_LONG", INT2NUM(TYPE_LONG_LONG));
+
+    /* Document-const: TYPE_ULONG_LONG
+     *
+     * C type - long long
+     */
+    rb_define_const(mFiddle, "TYPE_ULONG_LONG", INT2NUM(TYPE_ULONG_LONG));
 #endif
 
 #ifdef TYPE_INT8_T
@@ -214,6 +244,12 @@ Init_fiddle(void) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/fiddle.c#L244
      * C type - int8_t
      */
     rb_define_const(mFiddle, "TYPE_INT8_T",    INT2NUM(TYPE_INT8_T));
+
+    /* Document-const: TYPE_UINT8_T
+     *
+     * C type - uint8_t
+     */
+    rb_define_const(mFiddle, "TYPE_UINT8_T",    INT2NUM(TYPE_UINT8_T));
 #endif
 
 #ifdef TYPE_INT16_T
@@ -222,6 +258,12 @@ Init_fiddle(void) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/fiddle.c#L258
      * C type - int16_t
      */
     rb_define_const(mFiddle, "TYPE_INT16_T",   INT2NUM(TYPE_INT16_T));
+
+    /* Document-const: TYPE_UINT16_T
+     *
+     * C type - uint16_t
+     */
+    rb_define_const(mFiddle, "TYPE_UINT16_T",   INT2NUM(TYPE_UINT16_T));
 #endif
 
 #ifdef TYPE_INT32_T
@@ -230,6 +272,12 @@ Init_fiddle(void) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/fiddle.c#L272
      * C type - int32_t
      */
     rb_define_const(mFiddle, "TYPE_INT32_T",   INT2NUM(TYPE_INT32_T));
+
+    /* Document-const: TYPE_UINT32_T
+     *
+     * C type - uint32_t
+     */
+    rb_define_const(mFiddle, "TYPE_UINT32_T",   INT2NUM(TYPE_UINT32_T));
 #endif
 
 #ifdef TYPE_INT64_T
@@ -238,6 +286,12 @@ Init_fiddle(void) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/fiddle.c#L286
      * C type - int64_t
      */
     rb_define_const(mFiddle, "TYPE_INT64_T",   INT2NUM(TYPE_INT64_T));
+
+    /* Document-const: TYPE_UINT64_T
+     *
+     * C type - uint64_t
+     */
+    rb_define_const(mFiddle, "TYPE_UINT64_T",   INT2NUM(TYPE_UINT64_T));
 #endif
 
     /* Document-const: TYPE_FLOAT
@@ -422,30 +476,60 @@ Init_fiddle(void) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/fiddle.c#L476
      */
     rb_define_const(mFiddle, "SIZEOF_CHAR",  INT2NUM(sizeof(char)));
 
+    /* Document-const: SIZEOF_UCHAR
+     *
+     * size of a unsigned char
+     */
+    rb_define_const(mFiddle, "SIZEOF_UCHAR",  INT2NUM(sizeof(unsigned char)));
+
     /* Document-const: SIZEOF_SHORT
      *
      * size of a short
      */
     rb_define_const(mFiddle, "SIZEOF_SHORT", INT2NUM(sizeof(short)));
 
+    /* Document-const: SIZEOF_USHORT
+ (... truncated)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]