@@ -349,7 +349,7 @@ static HRESULT ( STDMETHODCALLTYPE GetIDsOfNames )(
349349 Win32OLEIDispatch* p = (Win32OLEIDispatch*)This;
350350 */
351351 char * psz = ole_wc2mb (* rgszNames ); // support only one method
352- ID nameid = rb_intern (psz );
352+ ID nameid = rb_check_id_cstr (psz , ( long ) strlen ( psz ), cWIN32OLE_enc );
353353 free (psz );
354354 if ((ID )(DISPID )nameid != nameid ) return E_NOINTERFACE ;
355355 * rgDispId = (DISPID )nameid ;
@@ -3277,29 +3277,31 @@ fole_each(VALUE self)
32773277static VALUE
32783278fole_missing (int argc , VALUE * argv , VALUE self )
32793279{
3280- ID id ;
3280+ VALUE mid , sym ;
32813281 const char * mname ;
3282- size_t n ;
3282+ long n ;
32833283 rb_check_arity (argc , 1 , UNLIMITED_ARGUMENTS );
3284- id = rb_to_id (argv [0 ]);
3285- mname = rb_id2name (id );
3284+ mid = argv [0 ];
3285+ sym = rb_check_symbol (& mid );
3286+ if (sym ) mid = rb_sym2str (sym );
3287+ mname = StringValueCStr (mid );
32863288 if (!mname ) {
32873289 rb_raise (rb_eRuntimeError , "fail: unknown method or property" );
32883290 }
3289- n = strlen ( mname );
3291+ n = RSTRING_LEN ( mid );
32903292#if SIZEOF_SIZE_T > SIZEOF_LONG
32913293 if (n >= LONG_MAX ) {
32923294 rb_raise (rb_eRuntimeError , "too long method or property name" );
32933295 }
32943296#endif
32953297 if (mname [n - 1 ] == '=' ) {
32963298 rb_check_arity (argc , 2 , 2 );
3297- argv [0 ] = rb_enc_str_new (mname , (long )( n - 1 ), cWIN32OLE_enc );
3299+ argv [0 ] = rb_enc_str_new (mname , (n - 1 ), cWIN32OLE_enc );
32983300
32993301 return ole_propertyput (self , argv [0 ], argv [1 ]);
33003302 }
33013303 else {
3302- argv [0 ] = rb_enc_str_new (mname , ( long ) n , cWIN32OLE_enc );
3304+ argv [0 ] = rb_enc_str_new (mname , n , cWIN32OLE_enc );
33033305 return ole_invoke (argc , argv , self , DISPATCH_METHOD |DISPATCH_PROPERTYGET , FALSE);
33043306 }
33053307}
0 commit comments