@@ -1910,54 +1910,90 @@ cstrToStringRef(const char *typeNameStart, size_t typeNameLength) {
1910
1910
return typeName;
1911
1911
}
1912
1912
1913
- SWIFT_CC (swift) SWIFT_RUNTIME_STDLIB_SPI
1914
- unsigned
1915
- swift_func_getParameterCount(const char *typeNameStart, size_t typeNameLength) {
1913
+ // / Given mangling for a method, extract its function type in demangled
1914
+ // / representation.
1915
+ static NodePointer extractFunctionTypeFromMethod (Demangler &demangler,
1916
+ const char *typeNameStart,
1917
+ size_t typeNameLength) {
1916
1918
llvm::Optional<llvm::StringRef> typeName =
1917
1919
cstrToStringRef (typeNameStart, typeNameLength);
1918
1920
if (!typeName)
1919
- return -1 ;
1920
-
1921
- StackAllocatedDemangler<1024 > demangler;
1921
+ return nullptr ;
1922
1922
1923
1923
auto node = demangler.demangleSymbol (*typeName);
1924
- if (!node) return -2 ;
1924
+ if (!node)
1925
+ return nullptr ;
1925
1926
1926
1927
node = node->findByKind (Node::Kind::Function, /* maxDepth=*/ 2 );
1927
- if (!node) return -3 ;
1928
+ if (!node)
1929
+ return nullptr ;
1928
1930
1929
1931
node = node->findByKind (Node::Kind::Type, /* maxDepth=*/ 2 );
1930
- if (!node) return -4 ;
1932
+ if (!node)
1933
+ return nullptr ;
1931
1934
1932
- node = node->findByKind (Node::Kind::ArgumentTuple, /* maxDepth=*/ 3 );
1933
- // Get the "deepest" Tuple from the ArgumentTuple, that's the arguments
1934
- while (node && node->getKind () != Node::Kind::Tuple) {
1935
- node = node->getFirstChild ();
1935
+ // If this is a generic function, it requires special handling.
1936
+ if (auto genericType =
1937
+ node->findByKind (Node::Kind::DependentGenericType, /* maxDepth=*/ 1 )) {
1938
+ node = genericType->findByKind (Node::Kind::Type, /* maxDepth=*/ 1 );
1939
+ return node->findByKind (Node::Kind::FunctionType, /* maxDepth=*/ 1 );
1936
1940
}
1937
1941
1938
- if (node) {
1939
- return node->getNumChildren ();
1940
- }
1942
+ auto funcType = node->getFirstChild ();
1943
+ assert (funcType->getKind () == Node::Kind::FunctionType);
1944
+ return funcType;
1945
+ }
1946
+
1947
+ // / For a single unlabeled parameter this function returns whole
1948
+ // / `ArgumentTuple`, for everything else a `Tuple` element inside it.
1949
+ static NodePointer getParameterList (NodePointer funcType) {
1950
+ assert (funcType->getKind () == Node::Kind::FunctionType);
1951
+
1952
+ auto parameterContainer =
1953
+ funcType->findByKind (Node::Kind::ArgumentTuple, /* maxDepth=*/ 1 );
1954
+ assert (parameterContainer->getNumChildren () > 0 );
1955
+
1956
+ // This is a type that convers entire parameter list.
1957
+ auto parameterList = parameterContainer->getFirstChild ();
1958
+ assert (parameterList->getKind () == Node::Kind::Type);
1959
+
1960
+ auto parameters = parameterList->getFirstChild ();
1961
+ if (parameters->getKind () == Node::Kind::Tuple)
1962
+ return parameters;
1963
+
1964
+ return parameterContainer;
1965
+ }
1966
+
1967
+ SWIFT_CC (swift)
1968
+ SWIFT_RUNTIME_STDLIB_SPI
1969
+ unsigned swift_func_getParameterCount(const char *typeNameStart,
1970
+ size_t typeNameLength) {
1971
+ StackAllocatedDemangler<1024 > demangler;
1941
1972
1942
- return -5 ;
1973
+ auto funcType =
1974
+ extractFunctionTypeFromMethod (demangler, typeNameStart, typeNameLength);
1975
+ if (!funcType)
1976
+ return -1 ;
1977
+
1978
+ auto parameterList = getParameterList (funcType);
1979
+ return parameterList->getNumChildren ();
1943
1980
}
1944
1981
1945
1982
SWIFT_CC (swift) SWIFT_RUNTIME_STDLIB_SPI
1946
1983
const Metadata *_Nullable
1947
1984
swift_func_getReturnTypeInfo(const char *typeNameStart, size_t typeNameLength) {
1948
- llvm::Optional<llvm::StringRef> typeName =
1949
- cstrToStringRef (typeNameStart, typeNameLength);
1950
- if (!typeName) return nullptr ;
1951
-
1952
1985
StackAllocatedDemangler<1024 > demangler;
1953
- auto node = demangler.demangleSymbol (*typeName);
1954
- if (!node) return nullptr ;
1955
1986
1956
- node = node->findByKind (Node::Kind::Function, /* maxDepth=*/ 2 );
1957
- if (!node) return nullptr ;
1987
+ auto *funcType =
1988
+ extractFunctionTypeFromMethod (demangler, typeNameStart, typeNameLength);
1989
+ if (!funcType)
1990
+ return nullptr ;
1991
+
1992
+ auto resultType = funcType->getLastChild ();
1993
+ if (!resultType)
1994
+ return nullptr ;
1958
1995
1959
- node = node->findByKind (Node::Kind::ReturnType, /* maxDepth=*/ 4 );
1960
- if (!node) return nullptr ;
1996
+ assert (resultType->getKind () == Node::Kind::ReturnType);
1961
1997
1962
1998
DecodedMetadataBuilder builder (
1963
1999
demangler,
@@ -1967,7 +2003,8 @@ swift_func_getReturnTypeInfo(const char *typeNameStart, size_t typeNameLength) {
1967
2003
[](const Metadata *, unsigned ) { return nullptr ; });
1968
2004
1969
2005
TypeDecoder<DecodedMetadataBuilder> decoder (builder);
1970
- auto builtTypeOrError = decoder.decodeMangledType (node);
2006
+ auto builtTypeOrError =
2007
+ decoder.decodeMangledType (resultType->getFirstChild ());
1971
2008
if (builtTypeOrError.isError ()) {
1972
2009
auto err = builtTypeOrError.getError ();
1973
2010
char *errStr = err->copyErrorString ();
@@ -1985,31 +2022,19 @@ swift_func_getParameterTypeInfo(
1985
2022
Metadata const **types, unsigned typesLength) {
1986
2023
if (typesLength < 0 ) return -1 ;
1987
2024
1988
- llvm::Optional<llvm::StringRef> typeName =
1989
- cstrToStringRef (typeNameStart, typeNameLength);
1990
- if (!typeName) return -1 ;
1991
-
1992
2025
StackAllocatedDemangler<1024 > demangler;
1993
- auto node = demangler.demangleSymbol (*typeName);
1994
- if (!node) return -1 ;
1995
2026
1996
- node = node->findByKind (Node::Kind::Function, /* maxDepth=*/ 2 );
1997
- if (!node) return -3 ;
2027
+ auto *funcType =
2028
+ extractFunctionTypeFromMethod (demangler, typeNameStart, typeNameLength);
2029
+ if (!funcType)
2030
+ return -1 ;
1998
2031
1999
- node = node->findByKind (Node::Kind::Type, /* maxDepth=*/ 2 );
2000
- if (!node) return -4 ;
2001
-
2002
- node = node->findByKind (Node::Kind::ArgumentTuple, /* maxDepth=*/ 3 );
2003
- // Get the "deepest" Tuple from the ArgumentTuple, that's the arguments
2004
- while (node && node->getKind () != Node::Kind::Tuple) {
2005
- node = node->getFirstChild ();
2006
- }
2032
+ auto parameterList = getParameterList (funcType);
2007
2033
2008
2034
// Only successfully return if the expected parameter count is the same
2009
2035
// as space prepared for it in the buffer.
2010
- if (!node || (node && node->getNumChildren () != typesLength)) {
2011
- return -5 ;
2012
- }
2036
+ if (!(parameterList && parameterList->getNumChildren () == typesLength))
2037
+ return -2 ;
2013
2038
2014
2039
DecodedMetadataBuilder builder (
2015
2040
demangler,
@@ -2021,14 +2046,15 @@ swift_func_getParameterTypeInfo(
2021
2046
2022
2047
auto typeIdx = 0 ;
2023
2048
// for each parameter (TupleElement), store it into the provided buffer
2024
- for (auto tupleElement : *node) {
2025
- assert (tupleElement->getKind () == Node::Kind::TupleElement);
2026
- assert (tupleElement->getNumChildren () == 1 );
2049
+ for (auto *parameter : *parameterList) {
2050
+ if (parameter->getKind () == Node::Kind::TupleElement) {
2051
+ assert (parameter->getNumChildren () == 1 );
2052
+ parameter = parameter->getFirstChild ();
2053
+ }
2027
2054
2028
- auto typeNode = tupleElement->getFirstChild ();
2029
- assert (typeNode->getKind () == Node::Kind::Type);
2055
+ assert (parameter->getKind () == Node::Kind::Type);
2030
2056
2031
- auto builtTypeOrError = decoder.decodeMangledType (tupleElement );
2057
+ auto builtTypeOrError = decoder.decodeMangledType (parameter );
2032
2058
if (builtTypeOrError.isError ()) {
2033
2059
auto err = builtTypeOrError.getError ();
2034
2060
char *errStr = err->copyErrorString ();
@@ -2038,14 +2064,10 @@ swift_func_getParameterTypeInfo(
2038
2064
}
2039
2065
2040
2066
types[typeIdx] = builtTypeOrError.getType ();
2041
- typeIdx += 1 ;
2067
+ ++typeIdx ;
2042
2068
} // end foreach parameter
2043
2069
2044
- if (node) {
2045
- return node->getNumChildren ();
2046
- }
2047
-
2048
- return -9 ;
2070
+ return typesLength;
2049
2071
}
2050
2072
2051
2073
// ==== End of Function metadata functions ---------------------------------------
0 commit comments