dev_compiler icon indicating copy to clipboard operation
dev_compiler copied to clipboard

Overridden private fields trigger runtime error

Open vsmenon opened this issue 10 years ago • 8 comments

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

vsmenon avatar Oct 22 '15 16:10 vsmenon

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

jmesserly avatar Oct 22 '15 16:10 jmesserly

in other words, is this a dupe of #52

jmesserly avatar Oct 22 '15 16:10 jmesserly

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

vsmenon avatar Oct 22 '15 16:10 vsmenon

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.

jmesserly avatar Oct 22 '15 16:10 jmesserly

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 avatar Oct 22 '15 17:10 vsmenon

We could statically disallow this as well though.

vsmenon avatar Oct 22 '15 17:10 vsmenon

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 avatar Oct 22 '15 17:10 jmesserly

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.

jmesserly avatar Oct 22 '15 17:10 jmesserly