@@ -1913,54 +1913,90 @@ cstrToStringRef(const char *typeNameStart, size_t typeNameLength) {
1913
1913
return typeName;
1914
1914
}
1915
1915
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) {
1919
1921
llvm::Optional<llvm::StringRef> typeName =
1920
1922
cstrToStringRef (typeNameStart, typeNameLength);
1921
1923
if (!typeName)
1922
- return -1 ;
1923
-
1924
- StackAllocatedDemangler<1024 > demangler;
1924
+ return nullptr ;
1925
1925
1926
1926
auto node = demangler.demangleSymbol (*typeName);
1927
- if (!node) return -2 ;
1927
+ if (!node)
1928
+ return nullptr ;
1928
1929
1929
1930
node = node->findByKind (Node::Kind::Function, /* maxDepth=*/ 2 );
1930
- if (!node) return -3 ;
1931
+ if (!node)
1932
+ return nullptr ;
1931
1933
1932
1934
node = node->findByKind (Node::Kind::Type, /* maxDepth=*/ 2 );
1933
- if (!node) return -4 ;
1935
+ if (!node)
1936
+ return nullptr ;
1934
1937
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 );
1939
1943
}
1940
1944
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;
1944
1975
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 ();
1946
1983
}
1947
1984
1948
1985
SWIFT_CC (swift) SWIFT_RUNTIME_STDLIB_SPI
1949
1986
const Metadata *_Nullable
1950
1987
swift_func_getReturnTypeInfo(const char *typeNameStart, size_t typeNameLength) {
1951
- llvm::Optional<llvm::StringRef> typeName =
1952
- cstrToStringRef (typeNameStart, typeNameLength);
1953
- if (!typeName) return nullptr ;
1954
-
1955
1988
StackAllocatedDemangler<1024 > demangler;
1956
- auto node = demangler.demangleSymbol (*typeName);
1957
- if (!node) return nullptr ;
1958
1989
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 ;
1961
1998
1962
- node = node->findByKind (Node::Kind::ReturnType, /* maxDepth=*/ 4 );
1963
- if (!node) return nullptr ;
1999
+ assert (resultType->getKind () == Node::Kind::ReturnType);
1964
2000
1965
2001
DecodedMetadataBuilder builder (
1966
2002
demangler,
@@ -1970,7 +2006,8 @@ swift_func_getReturnTypeInfo(const char *typeNameStart, size_t typeNameLength) {
1970
2006
[](const Metadata *, unsigned ) { return nullptr ; });
1971
2007
1972
2008
TypeDecoder<DecodedMetadataBuilder> decoder (builder);
1973
- auto builtTypeOrError = decoder.decodeMangledType (node);
2009
+ auto builtTypeOrError =
2010
+ decoder.decodeMangledType (resultType->getFirstChild ());
1974
2011
if (builtTypeOrError.isError ()) {
1975
2012
auto err = builtTypeOrError.getError ();
1976
2013
char *errStr = err->copyErrorString ();
@@ -1988,31 +2025,19 @@ swift_func_getParameterTypeInfo(
1988
2025
Metadata const **types, unsigned typesLength) {
1989
2026
if (typesLength < 0 ) return -1 ;
1990
2027
1991
- llvm::Optional<llvm::StringRef> typeName =
1992
- cstrToStringRef (typeNameStart, typeNameLength);
1993
- if (!typeName) return -1 ;
1994
-
1995
2028
StackAllocatedDemangler<1024 > demangler;
1996
- auto node = demangler.demangleSymbol (*typeName);
1997
- if (!node) return -1 ;
1998
2029
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 ;
2001
2034
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);
2010
2036
2011
2037
// Only successfully return if the expected parameter count is the same
2012
2038
// 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 ;
2016
2041
2017
2042
DecodedMetadataBuilder builder (
2018
2043
demangler,
@@ -2024,14 +2049,15 @@ swift_func_getParameterTypeInfo(
2024
2049
2025
2050
auto typeIdx = 0 ;
2026
2051
// 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
+ }
2030
2057
2031
- auto typeNode = tupleElement->getFirstChild ();
2032
- assert (typeNode->getKind () == Node::Kind::Type);
2058
+ assert (parameter->getKind () == Node::Kind::Type);
2033
2059
2034
- auto builtTypeOrError = decoder.decodeMangledType (tupleElement );
2060
+ auto builtTypeOrError = decoder.decodeMangledType (parameter );
2035
2061
if (builtTypeOrError.isError ()) {
2036
2062
auto err = builtTypeOrError.getError ();
2037
2063
char *errStr = err->copyErrorString ();
@@ -2041,14 +2067,10 @@ swift_func_getParameterTypeInfo(
2041
2067
}
2042
2068
2043
2069
types[typeIdx] = builtTypeOrError.getType ();
2044
- typeIdx += 1 ;
2070
+ ++typeIdx ;
2045
2071
} // end foreach parameter
2046
2072
2047
- if (node) {
2048
- return node->getNumChildren ();
2049
- }
2050
-
2051
- return -9 ;
2073
+ return typesLength;
2052
2074
}
2053
2075
2054
2076
// ==== End of Function metadata functions ---------------------------------------
0 commit comments