From 4c18b669232f5ad24d02c832d2c4f8eec17c367e Mon Sep 17 00:00:00 2001 From: Marcelo Matus Date: Wed, 28 Dec 2005 02:34:08 +0000 Subject: [PATCH] idenitfy the exact cast case (minimum rank possible) and dispatch inmediatly git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@8106 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- SWIG/Source/Modules/overload.cxx | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/SWIG/Source/Modules/overload.cxx b/SWIG/Source/Modules/overload.cxx index e9a74b3b4..be5f4ded1 100644 --- a/SWIG/Source/Modules/overload.cxx +++ b/SWIG/Source/Modules/overload.cxx @@ -408,6 +408,7 @@ Swig_overload_dispatch_cast(Node *n, const String_or_char *fmt, int *maxargs) { Printf(f,"if (%s >= %d) {\n", argc_template_string, num_required); } Printf(f,"SWIG_TypeRank _ranki = 0;\n"); + Printf(f,"SWIG_TypeRank _rankm = 0;\n"); Printf(f,"SWIG_TypeRank _pi = 1;\n",num_arguments); /* create a list with the wrappers that collide with the @@ -497,6 +498,7 @@ Swig_overload_dispatch_cast(Node *n, const String_or_char *fmt, int *maxargs) { fn = i + 1; Printf(f, "if (!_v) goto check_%d;\n", fn); Printf(f, "_ranki += _v*_pi;\n", fn); + Printf(f, "_rankm += _pi;\n", fn); Printf(f, "_pi *= SWIG_MAXCASTRANK;\n", fn); } } @@ -517,7 +519,10 @@ Swig_overload_dispatch_cast(Node *n, const String_or_char *fmt, int *maxargs) { /* close braces */ for (/* empty */; num_braces > 0; num_braces--) Printf(f, "}\n"); - Printf(f,"if (!_index || (_ranki < _rank)) { _rank = _ranki; _index = %d;}\n",i+1); + Printf(f,"if (!_index || (_ranki < _rank)) {\n",i+1); + Printf(f," _rank = _ranki; _index = %d;\n",i+1); + Printf(f," if (_rank == _rankm) goto dispatch;\n",i+1); + Printf(f,"}\n",i+1); String *lfmt = ReplaceFormat (fmt, num_arguments); Printf(sw, "case %d:\n", i+1); Printf(sw, Char(lfmt),Getattr(ni,"wrap:name")); @@ -530,6 +535,7 @@ Swig_overload_dispatch_cast(Node *n, const String_or_char *fmt, int *maxargs) { Delete(coll); } Delete(dispatch); + Printf(f,"dispatch:\n"); Printf(f,"switch(_index) {\n"); Printf(f,"%s",sw); Printf(f,"}\n");