[swift-dev] metatype of Int

Jordan Rose jordan_rose at apple.com
Fri Dec 18 22:49:20 CST 2015


I think Jon's trying to build something on top of swiftc or SourceKit. Yes?

You can do something like this to build your own metatype:

ASTContext &ctx = …
Type intTy = ctx.getIntDecl()->getDeclaredType();
auto *intMetaTy = MetatypeType::get(intTy, ctx);

And then compare types using TypeBase::isEqual (which looks through typealiases and such—it's comparing "canonical" types).

Type unknownTy = …
if (unknownTy->isEqual(intMetaTy)) {
  // celebrate
}

Hope that helps,
Jordan

> On Dec 18, 2015, at 13:47 , Slava Pestov via swift-dev <swift-dev at swift.org> wrote:
> 
> You can probably get the mangled name of the metatype, and refer to that. Eg,
> 
> public func f() -> Any.Type {
>  return Int.self
> }
> 
> f()
> 
> Compile this with -emit-ir:
> 
> @_TMSi = external global %swift.type, align 8
> 
> define %swift.type* @_TF4blah1fFT_PMP_() #0 {
> entry:
>  ret %swift.type* @_TMSi
> }
> 
> So in your C++ program,
> 
> extern "C" {
>  extern void *_TMSi;
> }
> 
> Note that this is completely unsupported, and probably insane. You have been warned.
> 
> Slava
> 
>> On Dec 18, 2015, at 12:14 PM, Rafkind, Jon via swift-dev <swift-dev at swift.org> wrote:
>> 
>> Sorry I should have been more specific. I am working at the C++ level. I have a swift::MetaType* and want to compare it to something.
>> 
>> On 12/18/2015 12:10 PM, Dave Abrahams wrote:
>> 
>> 
>> 
>> 
>> On Dec 18, 2015, at 11:16 AM, Rafkind, Jon via swift-dev <swift-dev at swift.org><mailto:swift-dev at swift.org> wrote:
>> 
>> Given a swift::MetaType how can I tell if it corresponds to the MetaType of the standard Int type? Is there a way to get a reference to the MetaType from the StdlibModule or TheBuiltinModule?
>> 
>> For now I can convert the MetaType to a string and compare it to "Int.Type" but that is yucky.
>> 
>> 
>> 
>> Equality comparison works:
>> 
>> (swift) String.self == Int.self
>> // r2 : Bool = false
>> (swift) Int.self == Int.self
>> // r3 : Bool = true
>> 
>> 
>> 
>> 
>> 
>> --
>> _______________________________________________
>> swift-dev mailing list
>> swift-dev at swift.org<mailto:swift-dev at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-dev
>> 
>> 
>> 
>> -Dave
>> 
>> 
>> 
>> 
>> 
>> 
>> --
>> _______________________________________________
>> swift-dev mailing list
>> swift-dev at swift.org
>> https://lists.swift.org/mailman/listinfo/swift-dev
> 
> _______________________________________________
> swift-dev mailing list
> swift-dev at swift.org
> https://lists.swift.org/mailman/listinfo/swift-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20151218/a0590552/attachment.html>


More information about the swift-dev mailing list