From 2d6fc849619d3d92e3b3faf1b3caf896ff47605c Mon Sep 17 00:00:00 2001 From: Joel Andersson Date: Tue, 8 Apr 2014 16:02:52 +0200 Subject: [PATCH] [MATLAB] Fixed overloaded functions in .m file --- Examples/matlab/class/example.h | 5 +++++ Source/Modules/matlab.cxx | 32 ++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/Examples/matlab/class/example.h b/Examples/matlab/class/example.h index 0dff185b265..b888af5e558 100644 --- a/Examples/matlab/class/example.h +++ b/Examples/matlab/class/example.h @@ -21,6 +21,11 @@ class Circle : public Shape { public: Circle(double r) : radius(r) { } virtual double area(); + + // Test overloading + virtual double foo(int d){ return area();} + virtual double foo(){ return perimeter();} + virtual double perimeter(); }; diff --git a/Source/Modules/matlab.cxx b/Source/Modules/matlab.cxx index 81f64250a36..b240e2508c9 100644 --- a/Source/Modules/matlab.cxx +++ b/Source/Modules/matlab.cxx @@ -770,11 +770,17 @@ int MATLAB::memberfunctionHandler(Node *n) { #ifdef MATLABPRINTFUNCTIONENTRY Printf(stderr,"Entering memberfunctionHandler\n"); #endif - String *symname = Getattr(n, "sym:name"); - String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); - Printf(f_wrap_m,"function varargout = %s(this,varargin)\n",symname); - Printf(f_wrap_m,"[varargout{1:nargout}] = %s('%s',this.h,varargin{:})\n",mex_fcn,fullname); - Printf(f_wrap_m,"end\n"); + bool overloaded = !!Getattr(n, "sym:overloaded"); + bool last_overload = overloaded && !Getattr(n, "sym:nextSibling"); + + // Add function to .m wrapper + if(!overloaded || last_overload){ + String *symname = Getattr(n, "sym:name"); + String *fullname = Swig_name_member(NSPACE_TODO, class_name, symname); + Printf(f_wrap_m,"function varargout = %s(this,varargin)\n",symname); + Printf(f_wrap_m,"[varargout{1:nargout}] = %s('%s',this.h,varargin{:})\n",mex_fcn,fullname); + Printf(f_wrap_m,"end\n"); + } return Language::memberfunctionHandler(n); } @@ -790,11 +796,17 @@ int MATLAB::constructorHandler(Node *n) { #ifdef MATLABPRINTFUNCTIONENTRY Printf(stderr,"Entering constructorHandler\n"); #endif - String *symname = Getattr(n, "sym:name"); - String *fullname = Swig_name_construct(NSPACE_TODO, symname); - Printf(f_wrap_m,"function this = %s(varargin)\n",symname); - Printf(f_wrap_m,"this.h = %s('%s',varargin{:})\n",mex_fcn,fullname); - Printf(f_wrap_m,"end\n"); + bool overloaded = !!Getattr(n, "sym:overloaded"); + bool last_overload = overloaded && !Getattr(n, "sym:nextSibling"); + + // Add function to .m wrapper + if(!overloaded || last_overload){ + String *symname = Getattr(n, "sym:name"); + String *fullname = Swig_name_construct(NSPACE_TODO, symname); + Printf(f_wrap_m,"function this = %s(varargin)\n",symname); + Printf(f_wrap_m,"this.h = %s('%s',varargin{:})\n",mex_fcn,fullname); + Printf(f_wrap_m,"end\n"); + } return Language::constructorHandler(n); }