Skip to content

Commit

Permalink
Runtime/stdlib: Remove _stdlib_getDemangledTypeName.
Browse files Browse the repository at this point in the history
We don't really need its peculiar behavior characteristics; its uses in the legacy mirror implementations can now be replaced by direct stringification of metatypes.
  • Loading branch information
jckarter committed Nov 13, 2015
1 parent c6b6d34 commit 49261a0
Show file tree
Hide file tree
Showing 4 changed files with 4 additions and 124 deletions.
17 changes: 0 additions & 17 deletions stdlib/public/core/Misc.swift
Original file line number Diff line number Diff line change
Expand Up @@ -70,9 +70,6 @@ func _withUninitializedString<R>(
return (bodyResult, stringResult)
}

@asmname("swift_stdlib_getDemangledTypeName")
public func _stdlib_getDemangledTypeNameImpl<T>(value: T, _ result: UnsafeMutablePointer<String>)

@asmname("swift_stdlib_getDemangledMetatypeName")
public func _stdlib_getDemangledMetatypeNameImpl(type: Any.Type, qualified: Bool, _ result: UnsafeMutablePointer<String>)

Expand All @@ -90,20 +87,6 @@ func _typeName(type: Any.Type, qualified: Bool = true) -> String {
return result
}

/// Returns the human-readable type name for the given value.
@warn_unused_result
public // @testable
func _stdlib_getDemangledTypeName<T>(value: T) -> String {
// FIXME: this code should be using _withUninitializedString, but it leaks
// when called from here.
// <rdar://problem/17892969> Closures in generic context leak their captures?
let stringPtr = UnsafeMutablePointer<String>.alloc(1)
_stdlib_getDemangledTypeNameImpl(value, stringPtr)
let stringResult = stringPtr.move()
stringPtr.dealloc(1)
return stringResult
}

@warn_unused_result
@asmname("swift_stdlib_demangleName")
func _stdlib_demangleNameImpl(
Expand Down
8 changes: 4 additions & 4 deletions stdlib/public/core/Reflection.swift
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ struct _StructMirror : _MirrorType {
}

var summary: String {
return _stdlib_getDemangledTypeName(value)
return _typeName(valueType)
}
var quickLookObject: PlaygroundQuickLook? { return nil }
var disposition: _MirrorDisposition { return .Struct }
Expand All @@ -372,7 +372,7 @@ struct _EnumMirror : _MirrorType {
}
var summary: String {
let maybeCaseName = String.fromCString(self.caseName)
let typeName = _stdlib_getDemangledTypeName(value)
let typeName = _typeName(valueType)
if let caseName = maybeCaseName {
return typeName + "." + caseName
}
Expand Down Expand Up @@ -413,7 +413,7 @@ struct _ClassMirror : _MirrorType {
return _getClassChild(i, data)
}
var summary: String {
return _stdlib_getDemangledTypeName(value)
return _typeName(valueType)
}
var quickLookObject: PlaygroundQuickLook? {
#if _runtime(_ObjC)
Expand Down Expand Up @@ -442,7 +442,7 @@ struct _ClassSuperMirror : _MirrorType {
return _getClassChild(i, data)
}
var summary: String {
return _stdlib_getDemangledTypeName(value)
return _typeName(data.metadata)
}
var quickLookObject: PlaygroundQuickLook? { return nil }
var disposition: _MirrorDisposition { return .Class }
Expand Down
59 changes: 0 additions & 59 deletions stdlib/public/runtime/Reflection.mm
Original file line number Diff line number Diff line change
Expand Up @@ -1271,65 +1271,6 @@ static Mirror ObjC_getMirrorForSuperclass(Class sup,
swift_stringFromUTF8InRawMemory(outString, name.data(), name.length());
}

static void swift_stdlib_getDemangledTypeNameImpl(OpaqueValue *value,
const Metadata *T,
const Metadata *dynamicType,
String *result) {
switch (dynamicType->getKind()) {
// Drill through existentials to properly get the dynamic type of their
// contained value.
case MetadataKind::Existential: {
auto existentialMetadata =
static_cast<const ExistentialTypeMetadata *>(dynamicType);
return swift_stdlib_getDemangledTypeNameImpl(
value, T, existentialMetadata->getDynamicType(value), result);
}

// TODO: Do we need something similar for ExistentialMetatype?

case MetadataKind::Class: {
// If the class is an artificial subclass, jump up to the "real" base
// class.
for (;;) {
auto dynamicClass = static_cast<const ClassMetadata *>(dynamicType);
if (dynamicClass->isTypeMetadata()
&& dynamicClass->isArtificialSubclass())
dynamicType = dynamicClass->SuperClass;
else
break;
}
SWIFT_FALLTHROUGH;
}
case MetadataKind::Tuple:
case MetadataKind::Struct:
case MetadataKind::Enum:
case MetadataKind::Opaque:
case MetadataKind::Function:
case MetadataKind::ExistentialMetatype:
case MetadataKind::Metatype:
case MetadataKind::ObjCClassWrapper:
case MetadataKind::ForeignClass:
return swift_stdlib_getDemangledMetatypeName(dynamicType,
/*qualified*/ true,
result);

// Values should never use these metadata kinds.
case MetadataKind::HeapLocalVariable:
case MetadataKind::HeapGenericLocalVariable:
case MetadataKind::ErrorObject:
assert(false);
new (result) String("");
return;
}
}

extern "C" void swift_stdlib_getDemangledTypeName(OpaqueValue *value,
String *result,
const Metadata *T) {
swift_stdlib_getDemangledTypeNameImpl(value, T, T, result);
T->vw_destroy(value);
}

extern "C" void swift_stdlib_demangleName(const char *mangledName,
size_t mangledNameLength,
String *demangledName) {
Expand Down
44 changes: 0 additions & 44 deletions test/1_stdlib/Runtime.swift
Original file line number Diff line number Diff line change
Expand Up @@ -621,50 +621,6 @@ enum SomeEnum {
init() { self = .A }
}

Runtime.test("getDemangledTypeName") {
expectEqual("a.SomeClass", _stdlib_getDemangledTypeName(SomeClass()))
expectEqual("a.SomeObjCClass", _stdlib_getDemangledTypeName(SomeObjCClass()))
expectEqual("a.SomeNSObjectSubclass", _stdlib_getDemangledTypeName(SomeNSObjectSubclass()))
expectEqual("NSObject", _stdlib_getDemangledTypeName(NSObject()))
expectEqual("a.SomeStruct", _stdlib_getDemangledTypeName(SomeStruct()))
expectEqual("a.SomeEnum", _stdlib_getDemangledTypeName(SomeEnum()))
expectEqual("protocol<>.Protocol", _stdlib_getDemangledTypeName(Any.self))
expectEqual("Swift.AnyObject.Protocol", _stdlib_getDemangledTypeName(AnyObject.self))
expectEqual("Swift.AnyObject.Type.Protocol", _stdlib_getDemangledTypeName(AnyClass.self))
expectEqual("Swift.Optional<Swift.AnyObject>.Type", _stdlib_getDemangledTypeName((AnyObject?).self))

var a: Any = SomeClass()
expectEqual("a.SomeClass", _stdlib_getDemangledTypeName(a))

a = SomeObjCClass()
expectEqual("a.SomeObjCClass", _stdlib_getDemangledTypeName(a))

a = SomeNSObjectSubclass()
expectEqual("a.SomeNSObjectSubclass", _stdlib_getDemangledTypeName(a))

a = NSObject()
expectEqual("NSObject", _stdlib_getDemangledTypeName(a))

a = SomeStruct()
expectEqual("a.SomeStruct", _stdlib_getDemangledTypeName(a))

a = SomeEnum()
expectEqual("a.SomeEnum", _stdlib_getDemangledTypeName(a))

a = AnyObject.self
expectEqual("Swift.AnyObject.Protocol", _stdlib_getDemangledTypeName(a))

a = AnyClass.self
expectEqual("Swift.AnyObject.Type.Protocol", _stdlib_getDemangledTypeName(a))

a = (AnyObject?).self
expectEqual("Swift.Optional<Swift.AnyObject>.Type",
_stdlib_getDemangledTypeName(a))

a = Any.self
expectEqual("protocol<>.Protocol", _stdlib_getDemangledTypeName(a))
}

Runtime.test("demangleName") {
expectEqual("", _stdlib_demangleName(""))
expectEqual("abc", _stdlib_demangleName("abc"))
Expand Down

0 comments on commit 49261a0

Please sign in to comment.