Commit Graph

14 Commits

Author SHA1 Message Date
David Farler
834b03b6cd [Reflection] Substitute generics and resolve dependent members
Once an unsubstituted typeref for a field is built, we substitute
`GenericTypeParameterTypeRef`s with concrete ones built from the generic
arguments of concrete bound generic metadata.

During that process, if we run into a `DependentMemberTypeRef` (e.g.
something of type T.Index), we substitute the base (T) using the current
list of substitutions, and then resolve what `Index` is for the base
using the associated type metadata in the 'assocty' data section.
2016-03-07 17:43:13 -08:00
David Farler
ce3ed51485 swift-reflection-test: Don't leave test process hanging 2016-03-04 17:10:40 -08:00
David Farler
5196f5b89c Get typerefs for nominal type metadata
and read their generic arguments, if there are any, too.
2016-03-04 17:10:39 -08:00
practicalswift
48193eff1d [gardening] Fix recently introduced typo: "exectuable" → "executable" 2016-03-03 23:40:25 +01:00
Slava Pestov
768f6da949 swift-reflection-test: Fix warnings 2016-03-03 06:59:55 -08:00
Slava Pestov
acca688e3f Fix compile error in swift-reflection-test.cpp 2016-03-02 22:12:20 -08:00
David Farler
f73223aba5 swift-reflection-test: Guard Mach-specific remote tests
These won't build on Linux.
2016-03-02 21:25:05 -08:00
David Farler
0ab31065ff Flesh out remote memory reader
Adds a rough sketch of what will be a test harness, currently only supported
on OS X:
- Launch a child process: an executable written in Swift
- Receive the child process's Mach port
- Receive reflection section addresses and the address of a heap instance
  of interest
- Perform field type lookup on the instance remotely (TODO)
2016-03-02 21:25:04 -08:00
practicalswift
06059cb448 [gardening] Fix recently introduced typo: "a associated" → "an associated" 2016-02-13 11:03:29 +01:00
David Farler
c7d4d25d53 [Reflection] Adopt the MemoryReader in swift-reflection-test
Also do a little bit of gardening of the various headers.
2016-02-12 16:34:28 -08:00
David Farler
69bb6235fa [Reflection] Serialize associated types for nominal decls
This closes the loop on being able to resolve dependent member types
during remote reflection.
2016-02-12 16:34:28 -08:00
David Farler
c5298c0b52 [Reflection] Start fleshing out the remote mirrors library
- Don't depend on LLVM Support and swiftBasic as this will bring in
  llvmSupport and other heavy dependencies, which we don't build for
  non-host architectures right now anyway.

- Add a reader template that works with the same (albeit somewhat
  clunky) interface in-process with the runtime and remotely, by having
  the memory tool supply a function that will copy data from the remote
  process.

- Add a Buffer type to abstract indirecting pointers in a remote address
  space, which is handled by the memory reader.

- Start sketching out the C remote mirrors interface.
2016-02-12 16:34:28 -08:00
David Farler
ede69acfb7 Add tests for decoding type references 2016-02-07 21:40:08 -08:00
David Farler
086000a198 Start the swiftReflection library
- Nearly done: TypeRefs and the mangled name decoder.

- Add the swift-reflection-test tool.
  The field reflection pipeline is roughly:
  - Decode type references
  - Substitute generic parameters
  - Calculate sizes and offsets

  There is currently only one action in the tool, which will test the
  *Decode* part of the pipeline: `dump-reflection-section`. This reads
  the *swift3_reflect section from an object file and dumps the decoded
  type references for all of the stored properties and enum cases in the
  file.
  - TODO: Write tests with various type arrangements to exercise the
    decoder - there are likely some holes in the decoder still since the
    AST mangler is quite rich in its kinds.

  TODO: The next test mode, `dump-field-types`, will do the following:
  1. Launch a swift executable with a canned stopping point
  2. Get the address of a heap object instance of interest
  3. Dump the fully substituted typerefs of all of the stored properties
  or enum case payloads.

  That test mode will be more involved since it will attach to another
  process and need to read from its address space but will test the
  entire out-of-process reflection pipeline in a controlled environment.
  We can maybe take this test a step further, with an option or a new
  test mode, that prints the entire heap reference graph rooted at that
  object of interest, in order to test the ability to detect reference
  cycles, for example.
2016-02-04 18:10:49 -08:00