Projects

Ticket #178: ticket-178.diff

File ticket-178.diff, 1.9 KB (added by dognotdog@…, 3 years ago)

Patch for #178 quickfix

  • objc.m

     
    650650} 
    651651 
    652652static void 
     653rb_objc_rval_to_ocval(VALUE rval, const char *octype, void **ocval); 
     654 
     655static void 
     656rb_objc_ary_to_ocval(VALUE rval, const char *octype, void **ocval) 
     657{ 
     658        size_t aryCount = 0; 
     659        while (isdigit(*octype)) 
     660                aryCount = aryCount*10 + (*(octype++) - '0'); 
     661                 
     662        size_t offset = rb_objc_octype_size(octype); 
     663 
     664        if (aryCount != RARRAY_LEN(rval)) 
     665                rb_raise(rb_eArgError, "can't convert Ruby array `%s' to " \ 
     666                 "Objective-C value of type `%s' because of length mismatch",  
     667                 RSTRING_PTR(rb_inspect(rval)), octype); 
     668 
     669        void *oc = ocval; 
     670 
     671        size_t i = 0; 
     672        for (i = 0; i < aryCount; ++i) 
     673        { 
     674                rb_objc_rval_to_ocval(RARRAY_AT(rval, i), octype, oc); 
     675                oc += offset; 
     676        } 
     677} 
     678 
     679static void 
    653680rb_objc_rval_to_ocval(VALUE rval, const char *octype, void **ocval) 
    654681{ 
    655682    bs_element_boxed_t *bs_boxed; 
     
    827854            } 
    828855            break; 
    829856 
     857        case _C_ARY_B: 
     858            { 
     859                        rb_objc_ary_to_ocval(rval, octype+1, ocval); 
     860            } 
     861            break; 
     862 
    830863        default: 
    831864            ok = false; 
    832865    } 
     
    854887} 
    855888 
    856889static void 
     890rb_objc_ocval_to_ary(void **ocval, const char *octype, VALUE *rbval) 
     891{ 
     892        size_t aryCount = 0; 
     893        while(isdigit(*octype)) 
     894                aryCount = aryCount*10 + (*(octype++) - '0'); 
     895         
     896        *rbval = rb_ary_new2(aryCount); 
     897 
     898        size_t offset = rb_objc_octype_size(octype); 
     899 
     900        void *oc = ocval; 
     901        size_t i = 0; 
     902        for (i = 0; i < aryCount; ++i) 
     903        { 
     904                VALUE val = 0; 
     905                rb_objc_ocval_to_rval(oc, octype, &val); 
     906                rb_ary_insert(*rbval, i, val); 
     907                oc += offset; 
     908        } 
     909} 
     910 
     911static void 
    857912rb_objc_ocval_to_rval(void **ocval, const char *octype, VALUE *rbval) 
    858913{ 
    859914    bool ok; 
     
    9741029            } 
    9751030            break; 
    9761031 
     1032        case _C_ARY_B: 
     1033        { 
     1034                rb_objc_ocval_to_ary(ocval, octype+1, rbval); 
     1035            break; 
     1036        } 
     1037 
    9771038        default: 
    9781039            ok = false; 
    9791040    }