@@ -1913,54 +1913,90 @@ cstrToStringRef(const char *typeNameStart, size_t typeNameLength) {
19131913 return typeName;
19141914}
19151915
1916- SWIFT_CC (swift) SWIFT_RUNTIME_STDLIB_SPI
1917- unsigned
1918- swift_func_getParameterCount(const char *typeNameStart, size_t typeNameLength) {
1916+ // / Given mangling for a method, extract its function type in demangled
1917+ // / representation.
1918+ static NodePointer extractFunctionTypeFromMethod (Demangler &demangler,
1919+ const char *typeNameStart,
1920+ size_t typeNameLength) {
19191921 llvm::Optional<llvm::StringRef> typeName =
19201922 cstrToStringRef (typeNameStart, typeNameLength);
19211923 if (!typeName)
1922- return -1 ;
1923-
1924- StackAllocatedDemangler<1024 > demangler;
1924+ return nullptr ;
19251925
19261926 auto node = demangler.demangleSymbol (*typeName);
1927- if (!node) return -2 ;
1927+ if (!node)
1928+ return nullptr ;
19281929
19291930 node = node->findByKind (Node::Kind::Function, /* maxDepth=*/ 2 );
1930- if (!node) return -3 ;
1931+ if (!node)
1932+ return nullptr ;
19311933
19321934 node = node->findByKind (Node::Kind::Type, /* maxDepth=*/ 2 );
1933- if (!node) return -4 ;
1935+ if (!node)
1936+ return nullptr ;
19341937
1935- node = node->findByKind (Node::Kind::ArgumentTuple, /* maxDepth=*/ 3 );
1936- // Get the "deepest" Tuple from the ArgumentTuple, that's the arguments
1937- while (node && node->getKind () != Node::Kind::Tuple) {
1938- node = node->getFirstChild ();
1938+ // If this is a generic function, it requires special handling.
1939+ if (auto genericType =
1940+ node->findByKind (Node::Kind::DependentGenericType, /* maxDepth=*/ 1 )) {
1941+ node = genericType->findByKind (Node::Kind::Type, /* maxDepth=*/ 1 );
1942+ return node->findByKind (Node::Kind::FunctionType, /* maxDepth=*/ 1 );
19391943 }
19401944
1941- if (node) {
1942- return node->getNumChildren ();
1943- }
1945+ auto funcType = node->getFirstChild ();
1946+ assert (funcType->getKind () == Node::Kind::FunctionType);
1947+ return funcType;
1948+ }
1949+
1950+ // / For a single unlabeled parameter this function returns whole
1951+ // / `ArgumentTuple`, for everything else a `Tuple` element inside it.
1952+ static NodePointer getParameterList (NodePointer funcType) {
1953+ assert (funcType->getKind () == Node::Kind::FunctionType);
1954+
1955+ auto parameterContainer =
1956+ funcType->findByKind (Node::Kind::ArgumentTuple, /* maxDepth=*/ 1 );
1957+ assert (parameterContainer->getNumChildren () > 0 );
1958+
1959+ // This is a type that convers entire parameter list.
1960+ auto parameterList = parameterContainer->getFirstChild ();
1961+ assert (parameterList->getKind () == Node::Kind::Type);
1962+
1963+ auto parameters = parameterList->getFirstChild ();
1964+ if (parameters->getKind () == Node::Kind::Tuple)
1965+ return parameters;
1966+
1967+ return parameterContainer;
1968+ }
1969+
1970+ SWIFT_CC (swift)
1971+ SWIFT_RUNTIME_STDLIB_SPI
1972+ unsigned swift_func_getParameterCount(const char *typeNameStart,
1973+ size_t typeNameLength) {
1974+ StackAllocatedDemangler<1024 > demangler;
19441975
1945- return -5 ;
1976+ auto funcType =
1977+ extractFunctionTypeFromMethod (demangler, typeNameStart, typeNameLength);
1978+ if (!funcType)
1979+ return -1 ;
1980+
1981+ auto parameterList = getParameterList (funcType);
1982+ return parameterList->getNumChildren ();
19461983}
19471984
19481985SWIFT_CC (swift) SWIFT_RUNTIME_STDLIB_SPI
19491986const Metadata *_Nullable
19501987swift_func_getReturnTypeInfo(const char *typeNameStart, size_t typeNameLength) {
1951- llvm::Optional<llvm::StringRef> typeName =
1952- cstrToStringRef (typeNameStart, typeNameLength);
1953- if (!typeName) return nullptr ;
1954-
19551988 StackAllocatedDemangler<1024 > demangler;
1956- auto node = demangler.demangleSymbol (*typeName);
1957- if (!node) return nullptr ;
19581989
1959- node = node->findByKind (Node::Kind::Function, /* maxDepth=*/ 2 );
1960- if (!node) return nullptr ;
1990+ auto *funcType =
1991+ extractFunctionTypeFromMethod (demangler, typeNameStart, typeNameLength);
1992+ if (!funcType)
1993+ return nullptr ;
1994+
1995+ auto resultType = funcType->getLastChild ();
1996+ if (!resultType)
1997+ return nullptr ;
19611998
1962- node = node->findByKind (Node::Kind::ReturnType, /* maxDepth=*/ 4 );
1963- if (!node) return nullptr ;
1999+ assert (resultType->getKind () == Node::Kind::ReturnType);
19642000
19652001 DecodedMetadataBuilder builder (
19662002 demangler,
@@ -1970,7 +2006,8 @@ swift_func_getReturnTypeInfo(const char *typeNameStart, size_t typeNameLength) {
19702006 [](const Metadata *, unsigned ) { return nullptr ; });
19712007
19722008 TypeDecoder<DecodedMetadataBuilder> decoder (builder);
1973- auto builtTypeOrError = decoder.decodeMangledType (node);
2009+ auto builtTypeOrError =
2010+ decoder.decodeMangledType (resultType->getFirstChild ());
19742011 if (builtTypeOrError.isError ()) {
19752012 auto err = builtTypeOrError.getError ();
19762013 char *errStr = err->copyErrorString ();
@@ -1988,31 +2025,19 @@ swift_func_getParameterTypeInfo(
19882025 Metadata const **types, unsigned typesLength) {
19892026 if (typesLength < 0 ) return -1 ;
19902027
1991- llvm::Optional<llvm::StringRef> typeName =
1992- cstrToStringRef (typeNameStart, typeNameLength);
1993- if (!typeName) return -1 ;
1994-
19952028 StackAllocatedDemangler<1024 > demangler;
1996- auto node = demangler.demangleSymbol (*typeName);
1997- if (!node) return -1 ;
19982029
1999- node = node->findByKind (Node::Kind::Function, /* maxDepth=*/ 2 );
2000- if (!node) return -3 ;
2030+ auto *funcType =
2031+ extractFunctionTypeFromMethod (demangler, typeNameStart, typeNameLength);
2032+ if (!funcType)
2033+ return -1 ;
20012034
2002- node = node->findByKind (Node::Kind::Type, /* maxDepth=*/ 2 );
2003- if (!node) return -4 ;
2004-
2005- node = node->findByKind (Node::Kind::ArgumentTuple, /* maxDepth=*/ 3 );
2006- // Get the "deepest" Tuple from the ArgumentTuple, that's the arguments
2007- while (node && node->getKind () != Node::Kind::Tuple) {
2008- node = node->getFirstChild ();
2009- }
2035+ auto parameterList = getParameterList (funcType);
20102036
20112037 // Only successfully return if the expected parameter count is the same
20122038 // as space prepared for it in the buffer.
2013- if (!node || (node && node->getNumChildren () != typesLength)) {
2014- return -5 ;
2015- }
2039+ if (!(parameterList && parameterList->getNumChildren () == typesLength))
2040+ return -2 ;
20162041
20172042 DecodedMetadataBuilder builder (
20182043 demangler,
@@ -2024,14 +2049,15 @@ swift_func_getParameterTypeInfo(
20242049
20252050 auto typeIdx = 0 ;
20262051 // for each parameter (TupleElement), store it into the provided buffer
2027- for (auto tupleElement : *node) {
2028- assert (tupleElement->getKind () == Node::Kind::TupleElement);
2029- assert (tupleElement->getNumChildren () == 1 );
2052+ for (auto *parameter : *parameterList) {
2053+ if (parameter->getKind () == Node::Kind::TupleElement) {
2054+ assert (parameter->getNumChildren () == 1 );
2055+ parameter = parameter->getFirstChild ();
2056+ }
20302057
2031- auto typeNode = tupleElement->getFirstChild ();
2032- assert (typeNode->getKind () == Node::Kind::Type);
2058+ assert (parameter->getKind () == Node::Kind::Type);
20332059
2034- auto builtTypeOrError = decoder.decodeMangledType (tupleElement );
2060+ auto builtTypeOrError = decoder.decodeMangledType (parameter );
20352061 if (builtTypeOrError.isError ()) {
20362062 auto err = builtTypeOrError.getError ();
20372063 char *errStr = err->copyErrorString ();
@@ -2041,14 +2067,10 @@ swift_func_getParameterTypeInfo(
20412067 }
20422068
20432069 types[typeIdx] = builtTypeOrError.getType ();
2044- typeIdx += 1 ;
2070+ ++typeIdx ;
20452071 } // end foreach parameter
20462072
2047- if (node) {
2048- return node->getNumChildren ();
2049- }
2050-
2051- return -9 ;
2073+ return typesLength;
20522074}
20532075
20542076// ==== End of Function metadata functions ---------------------------------------
0 commit comments