diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart index 631fa6c1d5f..195b1889b24 100644 --- a/pkg/compiler/lib/src/ssa/builder.dart +++ b/pkg/compiler/lib/src/ssa/builder.dart @@ -89,6 +89,8 @@ class SyntheticLocal extends Local { final ExecutableElement executableContext; SyntheticLocal(this.name, this.executableContext); + + toString() => 'SyntheticLocal($name)'; } class SsaBuilderTask extends CompilerTask { @@ -389,8 +391,11 @@ class LocalsHandler { HParameterValue value = new HParameterValue(parameter, builder.getTypeOfThis()); builder.graph.explicitReceiverParameter = value; - builder.graph.entry.addAfter( - directLocals[closureData.thisLocal], value); + builder.graph.entry.addAfter(directLocals[closureData.thisLocal], value); + if (builder.lastAddedParameter == null) { + // If this is the first parameter inserted, make sure it stays first. + builder.lastAddedParameter = value; + } if (isInterceptorClass) { // Only use the extra parameter in intercepted classes. directLocals[closureData.thisLocal] = value; diff --git a/tests/html/custom_elements_23127_test.dart b/tests/html/custom_elements_23127_test.dart new file mode 100644 index 00000000000..6386690e2e0 --- /dev/null +++ b/tests/html/custom_elements_23127_test.dart @@ -0,0 +1,126 @@ +// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + + +// Regression test for http://dartbug.com/23127 +// Tests super calls to a custom element upgrade constructor with various +// combinations of parameters and type arguments. + +library custom_elements_23127_test; +import 'dart:async'; +import 'dart:html'; +import 'package:unittest/html_individual_config.dart'; +import 'package:unittest/unittest.dart'; +import 'utils.dart'; + +abstract class B1 extends HtmlElement { + void action(); + + B1.created() : super.created() { + action(); + } +} + +abstract class B1T extends HtmlElement { + void action(); + var qq = false; + B1T.created() : super.created() { + action(); + qq = this is T; + } +} + +abstract class B2 extends HtmlElement { + void action(); + var qq; + B2.created([a = 1, b = 2, c = 3]) + : qq = callTwice(() => ++a * ++b), // [a] and [b] are boxed. + super.created() { + action(); + qq = [qq, a, b, c]; + } +} + +abstract class B2T extends HtmlElement { + void action(); + var qq; + B2T.created([a = 1, b = 2, c = 3]) + : qq = callTwice(() => ++a * ++b), + super.created() { + action(); + qq = [this is T, qq, a, b, c]; + } +} + +class C1 extends B1 { + int z; + C1.created() : super.created(); + action() => z = 3; +} + +class C1T extends B1T { + int z; + C1T.created() : super.created(); + action() => z = 3; +} + +class C2 extends B2 { + int z; + C2.created() : super.created(20); + action() => z = 3; +} + +class C2T extends B2T { + int z; + C2T.created() : super.created(20); + action() => z = 3; +} + + + +var callTwice; + +main() { + useHtmlIndividualConfiguration(); + + setUp(() => customElementsReady); + + callTwice = (f) { f(); return f(); }; + + group('baseline', () { + test('C1', () { + document.register('x-c1', C1); + C1 e = document.createElement('x-c1'); + expect(e.z, 3); + }); + }); + + group('c1t', () { + test('C1T', () { + document.register('x-c1t', C1T); + C1T e = document.createElement('x-c1t'); + expect(e.z, 3); + expect(e.qq, true); + }); + }); + + group('c2', () { + test('C2', () { + document.register('x-c2', C2); + C2 e = document.createElement('x-c2'); + expect(e.z, 3); + expect(e.qq, [88, 22, 4, 3]); + }); + }); + + group('c2t', () { + test('C2T', () { + document.register('x-c2t', C2T); + C2T e = document.createElement('x-c2t'); + expect(e.z, 3); + expect(e.qq, [true, 88, 22, 4, 3]); + }); + }); + +} diff --git a/tests/html/custom_elements_23127_test.html b/tests/html/custom_elements_23127_test.html new file mode 100644 index 00000000000..b0b68b5ef24 --- /dev/null +++ b/tests/html/custom_elements_23127_test.html @@ -0,0 +1,22 @@ + + + + + + custom_elements_23127_test + + + + + +

Running custom_elements_23127_test

+ + %TEST_SCRIPTS% + +