scope escaping
Adam D. Ruppe
destructionator at gmail.com
Thu Feb 6 16:35:19 PST 2014
On Thursday, 6 February 2014 at 22:04:05 UTC, Dicebot wrote:
> I think it makes sense to prohibit `scope` as explicitly named
> return attribute but make it inferrable via `inout`.
I think it is very important to put on the return value
explicitly so it can be used to control access to a sealed
resource.
Perhaps returning a scope var would make it easy enough to infer
though.
> 2) Transitivity & aggregation:
> A a; // is it different from "scope A a;"?
Probably not because A is a value type. Even if you explicitly
marked it scope, it wouldn't really matter. Any pointer to it
should be scope since it is on the stack though.
> a.slice2 = new int[]; // should this?
Yeah, it should. Here's how I'm seeing the struct: let's just
decompose it to a list of local variables. So "A a;" is
considered by the same rules as
scope int[] a_slice1;
int[] a_slice2;
int a_value;
as if they were written right there as local variables. A struct
is conceptually just a group of variables, after all, let's treat
it just like that.
> foo(a.slice2); // but does this?
Thus this is ok too, since it would work if we used the local var
a_slice2.
> void boo(ref int input) { }
> boo(a.value); // I'd expect this to fail
I actually think that should work. Let's try to imagine what
problems could come up in boo:
int* global;
void boo(ref int input) {
global = &input;
}
That is a problem... but it is almost ALWAYS a problem. Unless it
happened to be passed a heap int by ref, this would always fail.
I think taking the address of a ref parameter should be allowed,
but should always yield a scope pointer. You can't be sure it
isn't on the stack, so you don't want to escape that address....
perhaps ref implies scope? If you want a pointer to escape, ask
for a pointer. Moreover, I think address of a stack var should
also be scope, so
void storeMe(int* i) {}
void test() {
int i;
storeMe(&i); // fails: address of stack var yielded scope var
which cannot be passed to non-scope parameter
}
Otherwise though, writing to a ref is ok, even if it is on the
stack. If boo just wants to read and update the value, that's ok.
> Main problem with strict scope definition is that most seem to
> inuitively get what it is expected to do but defining exact set
> of rules is rather tricky.
Yeah, structs definitely complicate things, but I think
pretending they are just a bunch of local variables gives us a
consistent and useful definition.
More information about the Digitalmars-d
mailing list