Skip to content
This repository has been archived by the owner on Feb 22, 2018. It is now read-only.

Overridden private fields trigger runtime error #370

Open
vsmenon opened this issue Oct 22, 2015 · 8 comments
Open

Overridden private fields trigger runtime error #370

vsmenon opened this issue Oct 22, 2015 · 8 comments

Comments

@vsmenon
Copy link
Contributor

vsmenon commented Oct 22, 2015

The following code:

class A {
  int _x = 42;
}

class B extends A {
  int _x = 95;
}

main() {
  var a = new B();
  print(a._x);
}

generates this error:

Uncaught TypeError: Cannot convert a Symbol value to a string
virtualField @ _classes.js:289
@jmesserly
Copy link
Contributor

@vsmenon -- that's an illegal field override with field, right?

@jmesserly
Copy link
Contributor

in other words, is this a dupe of #52

@vsmenon
Copy link
Contributor Author

vsmenon commented Oct 22, 2015

Right, if we statically disallow, we could make this a "won't fix".

@jmesserly
Copy link
Contributor

Nice. I'll dupe it as the other bug covers either fix option. I think we're leaning towards restriction first. While runtime fix is pretty easy, it has some bad implications on the generated code.

@vsmenon
Copy link
Contributor Author

vsmenon commented Oct 22, 2015

I'm hitting a different error if I change the override to a getter:

class A {
  int _x = 42;
}

class B extends A {
  int get _x => 32;
}

main() {
  var a = new B();
  print(a._x);
}

Error is:

Uncaught TypeError: Cannot set property Symbol(_x) of [object Object] which has only a getter
_isolate_helper.js:685

@vsmenon
Copy link
Contributor Author

vsmenon commented Oct 22, 2015

We could statically disallow this as well though.

@jmesserly
Copy link
Contributor

good catch! I forgot if that was supposed to be supported or not :)

does it work differently with public fields (I guess probably not)?

@jmesserly
Copy link
Contributor

Looking at the comments, it looks like we didn't intend to support overriding fields at all, even with getter/setter. (It doesn't interact well with separate compilation. Basically has the same issue.)

I wonder if this works, though:

class A {
  int get _x => 42;
}

class B extends A {
  int _x = 32;
}

main() {
  var a = new B();
  print(a._x);
}

That one should work, but might not, because this code looks pretty fishy:
https://github.com/dart-lang/dev_compiler/blob/ed47365eaa6985199555289616b242d2c2878a43/lib/runtime/_classes.js#L289

FWIW, that string concat is semantically meaningless ... the string is only to help debugging.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Development

No branches or pull requests

2 participants