Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 839ccbb4f2b1444ec5ecfdc58dafbca86c655aec)
+++ src/GenPoly/Box.cc	(revision bdf1954790585dfa89c94d7c24ae116932ab3a87)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov 19 17:40:51 2015
-// Update Count     : 133
+// Last Modified By : Rob Schluntz
+// Last Modified On : Tue Nov 24 15:59:33 2015
+// Update Count     : 169
 //
 
@@ -142,4 +142,31 @@
 
 	namespace {
+		std::string makePolyMonoSuffix( FunctionType * function, const TyVarMap &tyVars ) {
+			std::stringstream name;
+
+			// if the return type or a parameter type involved polymorphic types, then the adapter will need 
+			// to take those polymorphic types as pointers. Therefore, there can be two different functions 
+			// with the same mangled name, so we need to further mangle the names.
+			if ( isPolyRet( function, tyVars ) ) {
+				name << "P";
+			} else {
+				name << "M";
+			}
+			name << "_";
+			std::list< DeclarationWithType *> &paramList = function->get_parameters();
+			for ( std::list< DeclarationWithType *>::iterator arg = paramList.begin(); arg != paramList.end(); ++arg ) {
+				if ( isPolyObj( (*arg)->get_type(), tyVars ) ) {
+					name << "P";
+				} else {
+					name << "M";				
+				}
+			} // for
+			return name.str();
+		}
+
+		std::string mangleAdapterName( FunctionType * function, const TyVarMap &tyVars ) {
+			return SymTab::Mangler::mangle( function ) + makePolyMonoSuffix( function, tyVars );
+		}
+
 		std::string makeAdapterName( const std::string &mangleName ) {
 			return "_adapter" + mangleName;
@@ -217,11 +244,5 @@
 				AdapterMap & adapters = Pass1::adapters.top();
 				for ( std::list< FunctionType *>::iterator funType = functions.begin(); funType != functions.end(); ++funType ) {
-					std::string mangleName = SymTab::Mangler::mangle( *funType );
-					if ( isPolyRet( *funType, scopeTyVars ) ) {
-						// if the return type involved polymorphic types, then the adapter will need to take those
-						// polymorphic types as pointers. Therefore, there can be two different functions with the same
-						// mangled name, so we need the mangled names to be different.
-						mangleName += "polyret_";
-					} // if
+					std::string mangleName = mangleAdapterName( *funType, scopeTyVars );
 					if ( adapters.find( mangleName ) == adapters.end() ) {
 						std::string adapterName = makeAdapterName( mangleName );
@@ -347,8 +368,5 @@
 				ret = addRetParam( appExpr, function, function->get_returnVals().front()->get_type(), arg );
 			} // if
-			std::string mangleName = SymTab::Mangler::mangle( function );
-			if ( isPolyRet( function, tyVars ) ) {
-				mangleName += "polyret_";
-			} // if
+			std::string mangleName = mangleAdapterName( function, tyVars );
 			std::string adapterName = makeAdapterName( mangleName );
 
@@ -565,9 +583,6 @@
 					assert( env );
 					env->apply( realFunction );
-					mangleName = SymTab::Mangler::mangle( realFunction );
-
-					if ( isPolyRet( originalFunction, exprTyVars ) ) {
-						mangleName += "polyret_";
-					} // if
+					mangleName = SymTab::Mangler::mangle( realFunction ); 
+					mangleName += makePolyMonoSuffix( originalFunction, exprTyVars );
 
 					AdapterMap & adapters = Pass1::adapters.top();
@@ -900,6 +915,5 @@
 
 		void Pass1::doBeginScope() {
-			// actually, maybe this could (should?) push
-			// a copy of the current map
+			// push a copy of the current map
 			adapters.push(adapters.top());
 		}
@@ -923,8 +937,5 @@
 			std::set< std::string > adaptersDone;
 			for ( std::list< FunctionType *>::iterator funType = functions.begin(); funType != functions.end(); ++funType ) {
-				std::string mangleName = SymTab::Mangler::mangle( *funType );
-				if ( isPolyRet( *funType, scopeTyVars ) ) {
-					mangleName += "polyret_";
-				} // if
+				std::string mangleName = mangleAdapterName( *funType, scopeTyVars );
 				if ( adaptersDone.find( mangleName ) == adaptersDone.end() ) {
 					std::string adapterName = makeAdapterName( mangleName );
Index: src/GenPoly/GenPoly.cc
===================================================================
--- src/GenPoly/GenPoly.cc	(revision 839ccbb4f2b1444ec5ecfdc58dafbca86c655aec)
+++ src/GenPoly/GenPoly.cc	(revision bdf1954790585dfa89c94d7c24ae116932ab3a87)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov 19 17:23:44 2015
-// Update Count     : 10
+// Last Modified By : Rob Schluntz
+// Last Modified On : Tue Nov 24 15:23:08 2015
+// Update Count     : 11
 //
 
@@ -75,4 +75,14 @@
 	}
 
+	bool isPolyObj( Type *type, const TyVarMap &tyVars ) {
+		if ( isPolyVal( type, tyVars ) ) {
+			return true;
+		} else if ( PointerType *pt = dynamic_cast<PointerType*>( type ) ) {
+			return isPolyObj( pt->get_base(), tyVars );
+		} else {
+			return false;
+		}
+	}
+
 	void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap ) {
 		for ( TyVarMap::const_iterator i = tyVarMap.begin(); i != tyVarMap.end(); ++i ) {
Index: src/GenPoly/GenPoly.h
===================================================================
--- src/GenPoly/GenPoly.h	(revision 839ccbb4f2b1444ec5ecfdc58dafbca86c655aec)
+++ src/GenPoly/GenPoly.h	(revision bdf1954790585dfa89c94d7c24ae116932ab3a87)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Nov 19 17:24:03 2015
-// Update Count     : 4
+// Last Modified By : Rob Schluntz
+// Last Modified On : Tue Nov 24 15:24:38 2015
+// Update Count     : 6
 //
 
@@ -31,4 +31,7 @@
 //	bool isPolyFun( FunctionType *fun, const TyVarMap &tyVars );
 	bool isPolyVal( Type *type, const TyVarMap &tyVars );
+
+  // true if type variable or any number of pointers to type variable 
+  bool isPolyObj( Type *type, const TyVarMap &tyVars );
 	void printTyVarMap( std::ostream &os, const TyVarMap &tyVarMap );
 } // namespace GenPoly
