On 13-05-01 04:57 PM, Niko Matsakis wrote:
> On Wed, May 01, 2013 at 11:49:10AM -0700, Graydon Hoare wrote:
>> 1. Why _exactly_ (if it's possible to reconstruct) did this factoring
>> not work last time, and what has changed since?
>
> AFAIK we never looked deeply into changing the representation of ~[]
> and @[] such that they are represented by a pair rather than a single
> pointer. In fact, I originally had it as an explicit goal that ~T for
> any T was always a pointer, whereas in this proposal, ~T may be a
> single pointer (for sized types) or a pair (for unsized types).
Ok. Makes sense.
> It is a bit unclear how often we will need to use `Sized` in practice.
> I argued that a lot of code may not need it, becaues it is implied by
> Copy and Clone, but certainly a fair amount will. For example, to
> define a standard `map` function over vectors, one would probably
> write:
>
> fn map<A:Sized,B:Sized>(v: &[A], f: &fn(&A) -> B) -> ~[B] { ... }
>
> Here the kind on `A` is needed because `A` appears inside `&[A]`, and
> you can only have slices of sized types; the kind on `B` is needed
> because a `B` is returned by `f` and because it appears within a
> vector on the RHS.
Concerning the 'Sized' kind, I wonder if it can ever be implied,
somehow, due to the use of T in [T]. Like it's pretty much mandatory if
you do:
impl <T> foo for [T] {
}
that the <T> there actually be <T:Sized> right? You can't denote the [T]
type for any non-Sized T. Not that I'm really keen on any additional
inference rules that a user needs to remember. Hmm.
>> 2. What ballpark amount-of-effort do you think the work entails in
>> implementation, and how much do you think it will perturb code?
>> It _looks_ to me like .. relatively little on both counts, but it's
>> hard to know.
>
> It seems like a relatively straightforward change, actually, but it is
> somewhat...extensive. The representation of types within the compiler
> will want to change, which will trickle through various parts of the
> code, and we'll have to update trans of course (but that's probably
> the easy part). One tricky part might be dealing with the various bits
> of unsafe code that think they know what the representation of a ~[T]
> is, but I imagine we'll find most of those crashes pretty quickly.
>
>> 3. Are any capabilities lost? I don't see any, but I'm a little
>> slow on the implications, often. It seems like maybe the GC will
>> no longer be able to track sizes by looking in pointees, but
>> that's not so bad; there's a digital trie that already covers
>> that.
>
> A very good question. I don't think any capabilities are lost from an
> expressiveness point-of-view. I hadn't thought about the implications
> for garbage collection. I think that all the information that the GC
> could need is still present, but it has moved around, and the new
> approach would be somewhat less amenable to a conservative
> scan. Whereas before everything you needed was present in the `@[T]`
> box, in the new world, the length of the array would be found next to
> the pointer that led you to the `@[T]` box in the first place. And of
> course in a conservative GC you can't be sure that it really was a
> pointer and not some random int, so you can't trust that. So we'd have
> to find a way to stash the data somewhere else to handle that case,
> perhaps in a side-table as you suggest---or else we could duplicate
> the information in the GC header, taking the place of the ref count.
Sizes are already tracked in the digital trie since we have to do a
nearest-value-less-than-P search for each possible pointer. So it's not
actually a risk / problem; just makes us a tiny bit more committed to
that structure.
-Graydon
_______________________________________________
Rust-dev mailing list
[email protected]
https://mail.mozilla.org/listinfo/rust-dev