From 6f889b50d96aa3675ce3313209d627976c82ec91 Mon Sep 17 00:00:00 2001 From: suke Date: Sat, 21 Oct 2017 23:57:10 +0000 Subject: ext/win32ole/win32ole.c (fole_missing): set receiver in NoMethodError. test/win32ole/test_win32ole.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@60330 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ext/win32ole/win32ole.c | 42 ++++++++++++++++++++++++++++++------------ 1 file changed, 30 insertions(+), 12 deletions(-) (limited to 'ext/win32ole') diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c index 84bb0ba819..960c03da1c 100644 --- a/ext/win32ole/win32ole.c +++ b/ext/win32ole/win32ole.c @@ -2646,9 +2646,7 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket) &wcmdname, 1, lcid, &DispID); SysFreeString(wcmdname); if(FAILED(hr)) { - ole_raise(hr, rb_eNoMethodError, - "unknown property or method: `%s'", - StringValuePtr(cmd)); + return rb_eNoMethodError; } } @@ -2850,7 +2848,11 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket) static VALUE fole_invoke(int argc, VALUE *argv, VALUE self) { - return ole_invoke(argc, argv, self, DISPATCH_METHOD|DISPATCH_PROPERTYGET, FALSE); + VALUE v = ole_invoke(argc, argv, self, DISPATCH_METHOD|DISPATCH_PROPERTYGET, FALSE); + if (v == rb_eNoMethodError) { + return rb_call_super(argc, argv); + } + return v; } static VALUE @@ -2863,8 +2865,7 @@ ole_invoke2(VALUE self, VALUE dispid, VALUE args, VALUE types, USHORT dispkind) VARIANT result; DISPPARAMS dispParams; VARIANTARG* realargs = NULL; - int i, j; - VALUE obj = Qnil; + int i, j; VALUE obj = Qnil; VALUE tp, param; VALUE v; VARTYPE vt; @@ -3118,7 +3119,11 @@ fole_setproperty2(VALUE self, VALUE dispid, VALUE args, VALUE types) static VALUE fole_setproperty_with_bracket(int argc, VALUE *argv, VALUE self) { - return ole_invoke(argc, argv, self, DISPATCH_PROPERTYPUT, TRUE); + VALUE v = ole_invoke(argc, argv, self, DISPATCH_PROPERTYPUT, TRUE); + if (v == rb_eNoMethodError) { + return rb_call_super(argc, argv); + } + return v; } /* @@ -3137,7 +3142,11 @@ fole_setproperty_with_bracket(int argc, VALUE *argv, VALUE self) static VALUE fole_setproperty(int argc, VALUE *argv, VALUE self) { - return ole_invoke(argc, argv, self, DISPATCH_PROPERTYPUT, FALSE); + VALUE v = ole_invoke(argc, argv, self, DISPATCH_PROPERTYPUT, FALSE); + if (v == rb_eNoMethodError) { + return rb_call_super(argc, argv); + } + return v; } /* @@ -3159,7 +3168,11 @@ fole_setproperty(int argc, VALUE *argv, VALUE self) static VALUE fole_getproperty_with_bracket(int argc, VALUE *argv, VALUE self) { - return ole_invoke(argc, argv, self, DISPATCH_PROPERTYGET, TRUE); + VALUE v = ole_invoke(argc, argv, self, DISPATCH_PROPERTYGET, TRUE); + if (v == rb_eNoMethodError) { + return rb_call_super(argc, argv); + } + return v; } static VALUE @@ -3342,11 +3355,11 @@ fole_each(VALUE self) static VALUE fole_missing(int argc, VALUE *argv, VALUE self) { - VALUE mid, sym; + VALUE mid, org_mid, sym, v; const char* mname; long n; rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS); - mid = argv[0]; + mid = org_mid = argv[0]; sym = rb_check_symbol(&mid); if (!NIL_P(sym)) mid = rb_sym2str(sym); mname = StringValueCStr(mid); @@ -3362,7 +3375,12 @@ fole_missing(int argc, VALUE *argv, VALUE self) } else { argv[0] = rb_enc_associate(rb_str_dup(mid), cWIN32OLE_enc); - return ole_invoke(argc, argv, self, DISPATCH_METHOD|DISPATCH_PROPERTYGET, FALSE); + v = ole_invoke(argc, argv, self, DISPATCH_METHOD|DISPATCH_PROPERTYGET, FALSE); + if (v == rb_eNoMethodError) { + argv[0] = org_mid; + return rb_call_super(argc, argv); + } + return v; } } -- cgit v1.2.3