On Friday, 25 January 2013 at 11:28:16 UTC, TommiT wrote:
On Monday, 21 January 2013 at 17:37:38 UTC, F i L wrote:
   type Foo
   {
       var bar = 0
   }

   func main
   {
       ref f : Foo
       ref b : int

       scope
       {
           var foo = Foo # allocates Foo

           f => foo      # f points to foo
           f.bar = 1     # foo.bar = 1

           b => f.bar    # b points to foo.bar
           b = 3         # foo.bar = 3

           # auto 'clean up code' at end of scope:
           #
           #     Memory.delete(foo)
           #     f => null
           #
       }

       f.bar = 4 # ERROR: f is null

I think there should be also b => null in the implicit 'auto clean up' phase.

b didn't need to be assigned to null because the compiler could determine it wasn't being directly accessed after that scope (it was assigned to a new var first). It was intentionally left out to illustrate how the compiler could optimize special cases like that. I wrote that in my original post a bit after that code.


I think it's good to note whether errors are compilation errors or runtime errors. I assume f.bar = 4 in the end there would be a compilation error?

If the compiler could determine that a ref was being used directly after being cleaned up, then yes, the compiler could throw an error. But that can't happen in every case, so when it can't you'll get a runtime error. Sorry I wasn't clear about that.


On Friday, 25 January 2013 at 02:12:56 UTC, F i L wrote:
   var nums = int[] # DynamicArray(int)
   ref a, b : int

   func main
   {
       nums += 1 # allocate
       nums += 2 # allocate
       nums += 3 # allocate

       a => nums[2] # nums.=>(2, a)
       b => a       # nums.=>(2, b)

What if we now (after the code snippet above) write:

nums += 4

And nums has run out of room in its place in the heap and needs to re-allocate its data (4 ints now). I guess that would mean that the call += should nullify all refs pointing to nums (a and b). If we now write:

a = -3

...that can't be a compilation error. Because it's not known at compile-time whether or not nums += 4 forces a re-allocation. Wouldn't this mean then, that all accesses through references would require a runtime penalty for checking whether the ref is null or not?

The specific code you're talking about is a demonstration of an area where the compiler can't (like you said) determine at compile-time the clean-up code, and therefor has to use a runtime approach to nullifying references.

The issue you raise isn't really a problem though. If the memory gets rearranged then the runtime could inform the DynamicArray, and it, in turn, could reassign those refs to the new memory address.

The idea here is that if you're writing something complex like a Container, you may need to use the unmanaged 'ptr' type to get the job done. However, such containers could still make safety guarantees to their users. So if the standard libs provided enough basic building blocks, and the compiler supported advanced meta-programming features (like in D), then programmers would rarely, if ever, need to touch a 'ptr' to make applications.

Reply via email to