OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library dart2js.ir_builder_task; | 5 library dart2js.ir_builder_task; |
6 | 6 |
7 import '../closure.dart' as closurelib; | 7 import '../closure.dart' as closurelib; |
8 import '../closure.dart' hide ClosureScope; | 8 import '../closure.dart' hide ClosureScope; |
| 9 import '../common/names.dart' show |
| 10 Names, |
| 11 Selectors; |
9 import '../common/tasks.dart' show | 12 import '../common/tasks.dart' show |
10 CompilerTask; | 13 CompilerTask; |
11 import '../compiler.dart' show | 14 import '../compiler.dart' show |
12 Compiler; | 15 Compiler; |
13 import '../constants/expressions.dart'; | 16 import '../constants/expressions.dart'; |
14 import '../dart_types.dart'; | 17 import '../dart_types.dart'; |
15 import '../diagnostics/invariant.dart' show | 18 import '../diagnostics/invariant.dart' show |
16 invariant; | 19 invariant; |
17 import '../elements/elements.dart'; | 20 import '../elements/elements.dart'; |
18 import '../elements/modelx.dart' show | 21 import '../elements/modelx.dart' show |
(...skipping 1424 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1443 setValue: (ir.Primitive result) { | 1446 setValue: (ir.Primitive result) { |
1444 irBuilder.buildDynamicSet( | 1447 irBuilder.buildDynamicSet( |
1445 target, setterSelector, elements.getTypeMask(node), result); | 1448 target, setterSelector, elements.getTypeMask(node), result); |
1446 }); | 1449 }); |
1447 } | 1450 } |
1448 return node.isConditional | 1451 return node.isConditional |
1449 ? irBuilder.buildIfNotNullSend(target, nested(helper)) | 1452 ? irBuilder.buildIfNotNullSend(target, nested(helper)) |
1450 : helper(); | 1453 : helper(); |
1451 } | 1454 } |
1452 | 1455 |
1453 ir.Primitive buildLocalNoSuchSetter(Local local, ir.Primitive value) { | 1456 ir.Primitive buildLocalNoSuchSetter(LocalElement local, ir.Primitive value) { |
1454 Selector selector = new Selector.setter(local.name, null); | 1457 Selector selector = new Selector.setter( |
| 1458 new Name(local.name, local.library, isSetter: true)); |
1455 return buildStaticNoSuchMethod(selector, [value]); | 1459 return buildStaticNoSuchMethod(selector, [value]); |
1456 } | 1460 } |
1457 | 1461 |
1458 @override | 1462 @override |
1459 ir.Primitive handleLocalCompounds( | 1463 ir.Primitive handleLocalCompounds( |
1460 ast.SendSet node, | 1464 ast.SendSet node, |
1461 LocalElement local, | 1465 LocalElement local, |
1462 CompoundRhs rhs, | 1466 CompoundRhs rhs, |
1463 arg, | 1467 arg, |
1464 {bool isSetterValid}) { | 1468 {bool isSetterValid}) { |
(...skipping 11 matching lines...) Expand all Loading... |
1476 if (isSetterValid) { | 1480 if (isSetterValid) { |
1477 irBuilder.buildLocalVariableSet(local, result); | 1481 irBuilder.buildLocalVariableSet(local, result); |
1478 } else { | 1482 } else { |
1479 return buildLocalNoSuchSetter(local, result); | 1483 return buildLocalNoSuchSetter(local, result); |
1480 } | 1484 } |
1481 }); | 1485 }); |
1482 } | 1486 } |
1483 | 1487 |
1484 ir.Primitive buildStaticNoSuchGetter(Element element) { | 1488 ir.Primitive buildStaticNoSuchGetter(Element element) { |
1485 return buildStaticNoSuchMethod( | 1489 return buildStaticNoSuchMethod( |
1486 new Selector.getter(element.name, element.library), | 1490 new Selector.getter(new Name(element.name, element.library)), |
1487 const <ir.Primitive>[]); | 1491 const <ir.Primitive>[]); |
1488 } | 1492 } |
1489 | 1493 |
1490 ir.Primitive buildStaticNoSuchSetter(Element element, ir.Primitive value) { | 1494 ir.Primitive buildStaticNoSuchSetter(Element element, ir.Primitive value) { |
1491 return buildStaticNoSuchMethod( | 1495 return buildStaticNoSuchMethod( |
1492 new Selector.setter(element.name, element.library), | 1496 new Selector.setter(new Name(element.name, element.library)), |
1493 <ir.Primitive>[value]); | 1497 <ir.Primitive>[value]); |
1494 } | 1498 } |
1495 | 1499 |
1496 @override | 1500 @override |
1497 ir.Primitive handleStaticCompounds( | 1501 ir.Primitive handleStaticCompounds( |
1498 ast.SendSet node, | 1502 ast.SendSet node, |
1499 Element getter, | 1503 Element getter, |
1500 CompoundGetter getterKind, | 1504 CompoundGetter getterKind, |
1501 Element setter, | 1505 Element setter, |
1502 CompoundSetter setterKind, | 1506 CompoundSetter setterKind, |
(...skipping 25 matching lines...) Expand all Loading... |
1528 case CompoundSetter.INVALID: | 1532 case CompoundSetter.INVALID: |
1529 // TODO(johnniwinther): Ensure [setter] is non null. | 1533 // TODO(johnniwinther): Ensure [setter] is non null. |
1530 return buildStaticNoSuchSetter( | 1534 return buildStaticNoSuchSetter( |
1531 setter != null ? setter : getter, result); | 1535 setter != null ? setter : getter, result); |
1532 } | 1536 } |
1533 }); | 1537 }); |
1534 } | 1538 } |
1535 | 1539 |
1536 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { | 1540 ir.Primitive buildSuperNoSuchGetter(Element element, TypeMask mask) { |
1537 return buildInstanceNoSuchMethod( | 1541 return buildInstanceNoSuchMethod( |
1538 new Selector.getter(element.name, element.library), | 1542 new Selector.getter(new Name(element.name, element.library)), |
1539 mask, | 1543 mask, |
1540 const <ir.Primitive>[]); | 1544 const <ir.Primitive>[]); |
1541 } | 1545 } |
1542 | 1546 |
1543 ir.Primitive buildSuperNoSuchSetter(Element element, | 1547 ir.Primitive buildSuperNoSuchSetter(Element element, |
1544 TypeMask mask, | 1548 TypeMask mask, |
1545 ir.Primitive value) { | 1549 ir.Primitive value) { |
1546 return buildInstanceNoSuchMethod( | 1550 return buildInstanceNoSuchMethod( |
1547 new Selector.setter(element.name, element.library), | 1551 new Selector.setter(new Name(element.name, element.library)), |
1548 mask, | 1552 mask, |
1549 <ir.Primitive>[value]); | 1553 <ir.Primitive>[value]); |
1550 } | 1554 } |
1551 | 1555 |
1552 @override | 1556 @override |
1553 ir.Primitive handleSuperCompounds( | 1557 ir.Primitive handleSuperCompounds( |
1554 ast.SendSet node, | 1558 ast.SendSet node, |
1555 Element getter, | 1559 Element getter, |
1556 CompoundGetter getterKind, | 1560 CompoundGetter getterKind, |
1557 Element setter, | 1561 Element setter, |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1871 } | 1875 } |
1872 | 1876 |
1873 @override | 1877 @override |
1874 ir.Primitive visitClassTypeLiteralSet( | 1878 ir.Primitive visitClassTypeLiteralSet( |
1875 ast.SendSet node, | 1879 ast.SendSet node, |
1876 TypeConstantExpression constant, | 1880 TypeConstantExpression constant, |
1877 ast.Node rhs, _) { | 1881 ast.Node rhs, _) { |
1878 InterfaceType type = constant.type; | 1882 InterfaceType type = constant.type; |
1879 ClassElement element = type.element; | 1883 ClassElement element = type.element; |
1880 return buildStaticNoSuchMethod( | 1884 return buildStaticNoSuchMethod( |
1881 new Selector.setter(element.name, element.library), [visit(rhs)]); | 1885 new Selector.setter(element.memberName), |
| 1886 [visit(rhs)]); |
1882 } | 1887 } |
1883 | 1888 |
1884 @override | 1889 @override |
1885 ir.Primitive visitTypedefTypeLiteralSet( | 1890 ir.Primitive visitTypedefTypeLiteralSet( |
1886 ast.SendSet node, | 1891 ast.SendSet node, |
1887 TypeConstantExpression constant, | 1892 TypeConstantExpression constant, |
1888 ast.Node rhs, _) { | 1893 ast.Node rhs, _) { |
1889 TypedefType type = constant.type; | 1894 TypedefType type = constant.type; |
1890 TypedefElement element = type.element; | 1895 TypedefElement element = type.element; |
1891 return buildStaticNoSuchMethod( | 1896 return buildStaticNoSuchMethod( |
1892 new Selector.setter(element.name, element.library), [visit(rhs)]); | 1897 new Selector.setter(element.memberName), |
| 1898 [visit(rhs)]); |
1893 } | 1899 } |
1894 | 1900 |
1895 @override | 1901 @override |
1896 ir.Primitive visitTypeVariableTypeLiteralSet( | 1902 ir.Primitive visitTypeVariableTypeLiteralSet( |
1897 ast.SendSet node, | 1903 ast.SendSet node, |
1898 TypeVariableElement element, | 1904 TypeVariableElement element, |
1899 ast.Node rhs, _) { | 1905 ast.Node rhs, _) { |
1900 return buildStaticNoSuchMethod( | 1906 return buildStaticNoSuchMethod( |
1901 new Selector.setter(element.name, element.library), [visit(rhs)]); | 1907 new Selector.setter(element.memberName), [visit(rhs)]); |
1902 } | 1908 } |
1903 | 1909 |
1904 @override | 1910 @override |
1905 ir.Primitive visitDynamicTypeLiteralSet( | 1911 ir.Primitive visitDynamicTypeLiteralSet( |
1906 ast.SendSet node, | 1912 ast.SendSet node, |
1907 ConstantExpression constant, | 1913 ConstantExpression constant, |
1908 ast.Node rhs, _) { | 1914 ast.Node rhs, _) { |
1909 return buildStaticNoSuchMethod( | 1915 return buildStaticNoSuchMethod( |
1910 new Selector.setter('dynamic', null), [visit(rhs)]); | 1916 new Selector.setter(Names.dynamic_), [visit(rhs)]); |
1911 } | 1917 } |
1912 | 1918 |
1913 @override | 1919 @override |
1914 ir.Primitive visitAbstractClassConstructorInvoke( | 1920 ir.Primitive visitAbstractClassConstructorInvoke( |
1915 ast.NewExpression node, | 1921 ast.NewExpression node, |
1916 ConstructorElement element, | 1922 ConstructorElement element, |
1917 InterfaceType type, | 1923 InterfaceType type, |
1918 ast.NodeList arguments, | 1924 ast.NodeList arguments, |
1919 CallStructure callStructure, _) { | 1925 CallStructure callStructure, _) { |
1920 return buildAbstractClassInstantiationError(element.enclosingClass); | 1926 return buildAbstractClassInstantiationError(element.enclosingClass); |
1921 } | 1927 } |
1922 | 1928 |
1923 @override | 1929 @override |
1924 ir.Primitive handleFinalStaticFieldSet( | 1930 ir.Primitive handleFinalStaticFieldSet( |
1925 ast.SendSet node, | 1931 ast.SendSet node, |
1926 FieldElement field, | 1932 FieldElement field, |
1927 ast.Node rhs, _) { | 1933 ast.Node rhs, _) { |
1928 // TODO(asgerf): Include class name somehow for static class members? | 1934 // TODO(asgerf): Include class name somehow for static class members? |
1929 return buildStaticNoSuchMethod( | 1935 return buildStaticNoSuchMethod( |
1930 new Selector.setter(field.name, field.library), | 1936 new Selector.setter(field.memberName), |
1931 [visit(rhs)]); | 1937 [visit(rhs)]); |
1932 } | 1938 } |
1933 | 1939 |
1934 @override | 1940 @override |
1935 ir.Primitive visitFinalSuperFieldSet( | 1941 ir.Primitive visitFinalSuperFieldSet( |
1936 ast.SendSet node, | 1942 ast.SendSet node, |
1937 FieldElement field, | 1943 FieldElement field, |
1938 ast.Node rhs, _) { | 1944 ast.Node rhs, _) { |
1939 return buildInstanceNoSuchMethod( | 1945 return buildInstanceNoSuchMethod( |
1940 new Selector.setter(field.name, field.library), | 1946 new Selector.setter(field.memberName), |
1941 elements.getTypeMask(node), | 1947 elements.getTypeMask(node), |
1942 [visit(rhs)]); | 1948 [visit(rhs)]); |
1943 } | 1949 } |
1944 | 1950 |
1945 @override | 1951 @override |
1946 ir.Primitive handleImmutableLocalSet( | 1952 ir.Primitive handleImmutableLocalSet( |
1947 ast.SendSet node, | 1953 ast.SendSet node, |
1948 LocalElement local, | 1954 LocalElement local, |
1949 ast.Node rhs, _) { | 1955 ast.Node rhs, _) { |
1950 return buildStaticNoSuchMethod( | 1956 return buildStaticNoSuchMethod( |
1951 new Selector.setter(local.name, null), | 1957 new Selector.setter(new Name(local.name, local.library)), |
1952 [visit(rhs)]); | 1958 [visit(rhs)]); |
1953 } | 1959 } |
1954 | 1960 |
1955 @override | 1961 @override |
1956 ir.Primitive handleStaticFunctionSet( | 1962 ir.Primitive handleStaticFunctionSet( |
1957 ast.Send node, | 1963 ast.Send node, |
1958 MethodElement function, | 1964 MethodElement function, |
1959 ast.Node rhs, | 1965 ast.Node rhs, |
1960 _) { | 1966 _) { |
1961 return buildStaticNoSuchMethod( | 1967 return buildStaticNoSuchMethod( |
1962 new Selector.setter(function.name, function.library), | 1968 new Selector.setter(function.memberName), |
1963 [visit(rhs)]); | 1969 [visit(rhs)]); |
1964 } | 1970 } |
1965 | 1971 |
1966 @override | 1972 @override |
1967 ir.Primitive handleStaticGetterSet( | 1973 ir.Primitive handleStaticGetterSet( |
1968 ast.SendSet node, | 1974 ast.SendSet node, |
1969 FunctionElement getter, | 1975 GetterElement getter, |
1970 ast.Node rhs, | 1976 ast.Node rhs, |
1971 _) { | 1977 _) { |
1972 return buildStaticNoSuchMethod( | 1978 return buildStaticNoSuchMethod( |
1973 new Selector.setter(getter.name, getter.library), | 1979 new Selector.setter(getter.memberName), |
1974 [visit(rhs)]); | 1980 [visit(rhs)]); |
1975 } | 1981 } |
1976 | 1982 |
1977 @override | 1983 @override |
1978 ir.Primitive handleStaticSetterGet( | 1984 ir.Primitive handleStaticSetterGet( |
1979 ast.Send node, | 1985 ast.Send node, |
1980 FunctionElement setter, | 1986 SetterElement setter, |
1981 _) { | 1987 _) { |
1982 return buildStaticNoSuchMethod( | 1988 return buildStaticNoSuchMethod( |
1983 new Selector.getter(setter.name, setter.library), | 1989 new Selector.getter(setter.memberName), |
1984 []); | 1990 []); |
1985 } | 1991 } |
1986 | 1992 |
1987 @override | 1993 @override |
1988 ir.Primitive handleStaticSetterInvoke( | 1994 ir.Primitive handleStaticSetterInvoke( |
1989 ast.Send node, | 1995 ast.Send node, |
1990 FunctionElement setter, | 1996 SetterElement setter, |
1991 ast.NodeList arguments, | 1997 ast.NodeList arguments, |
1992 CallStructure callStructure, _) { | 1998 CallStructure callStructure, _) { |
1993 // Translate as a method call. | 1999 // Translate as a method call. |
1994 List<ir.Primitive> args = arguments.nodes.mapToList(visit); | 2000 List<ir.Primitive> args = arguments.nodes.mapToList(visit); |
1995 Name name = new Name(setter.name, setter.library); | |
1996 return buildStaticNoSuchMethod( | 2001 return buildStaticNoSuchMethod( |
1997 new Selector(SelectorKind.CALL, name, callStructure), | 2002 new Selector(SelectorKind.CALL, setter.memberName, callStructure), |
1998 args); | 2003 args); |
1999 } | 2004 } |
2000 | 2005 |
2001 @override | 2006 @override |
2002 ir.Primitive visitSuperGetterSet( | 2007 ir.Primitive visitSuperGetterSet( |
2003 ast.SendSet node, | 2008 ast.SendSet node, |
2004 FunctionElement getter, | 2009 GetterElement getter, |
2005 ast.Node rhs, | 2010 ast.Node rhs, |
2006 _) { | 2011 _) { |
2007 return buildInstanceNoSuchMethod( | 2012 return buildInstanceNoSuchMethod( |
2008 new Selector.setter(getter.name, getter.library), | 2013 new Selector.setter(getter.memberName), |
2009 elements.getTypeMask(node), | 2014 elements.getTypeMask(node), |
2010 [visit(rhs)]); | 2015 [visit(rhs)]); |
2011 } | 2016 } |
2012 | 2017 |
2013 @override | 2018 @override |
2014 ir.Primitive visitSuperMethodSet( | 2019 ir.Primitive visitSuperMethodSet( |
2015 ast.Send node, | 2020 ast.Send node, |
2016 MethodElement method, | 2021 MethodElement method, |
2017 ast.Node rhs, | 2022 ast.Node rhs, |
2018 _) { | 2023 _) { |
2019 return buildInstanceNoSuchMethod( | 2024 return buildInstanceNoSuchMethod( |
2020 new Selector.setter(method.name, method.library), | 2025 new Selector.setter(method.memberName), |
2021 elements.getTypeMask(node), | 2026 elements.getTypeMask(node), |
2022 [visit(rhs)]); | 2027 [visit(rhs)]); |
2023 } | 2028 } |
2024 | 2029 |
2025 @override | 2030 @override |
2026 ir.Primitive visitSuperSetterGet( | 2031 ir.Primitive visitSuperSetterGet( |
2027 ast.Send node, | 2032 ast.Send node, |
2028 FunctionElement setter, _) { | 2033 SetterElement setter, _) { |
2029 return buildInstanceNoSuchMethod( | 2034 return buildInstanceNoSuchMethod( |
2030 new Selector.setter(setter.name, setter.library), | 2035 new Selector.setter(setter.memberName), |
2031 elements.getTypeMask(node), | 2036 elements.getTypeMask(node), |
2032 []); | 2037 []); |
2033 } | 2038 } |
2034 | 2039 |
2035 @override | 2040 @override |
2036 ir.Primitive visitSuperSetterInvoke( | 2041 ir.Primitive visitSuperSetterInvoke( |
2037 ast.Send node, | 2042 ast.Send node, |
2038 FunctionElement setter, | 2043 SetterElement setter, |
2039 ast.NodeList arguments, | 2044 ast.NodeList arguments, |
2040 CallStructure callStructure, _) { | 2045 CallStructure callStructure, _) { |
2041 List<ir.Primitive> args = | 2046 List<ir.Primitive> args = |
2042 translateDynamicArguments(arguments, callStructure); | 2047 translateDynamicArguments(arguments, callStructure); |
2043 Name name = new Name(setter.name, setter.library); | |
2044 return buildInstanceNoSuchMethod( | 2048 return buildInstanceNoSuchMethod( |
2045 new Selector(SelectorKind.CALL, name, callStructure), | 2049 new Selector(SelectorKind.CALL, setter.memberName, callStructure), |
2046 elements.getTypeMask(node), | 2050 elements.getTypeMask(node), |
2047 args); | 2051 args); |
2048 } | 2052 } |
2049 | 2053 |
2050 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) { | 2054 ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) { |
2051 try { | 2055 try { |
2052 return action(); | 2056 return action(); |
2053 } catch(e) { | 2057 } catch(e) { |
2054 if (e == ABORT_IRNODE_BUILDER) { | 2058 if (e == ABORT_IRNODE_BUILDER) { |
2055 return null; | 2059 return null; |
(...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3083 new CallStructure.unnamed(4), | 3087 new CallStructure.unnamed(4), |
3084 [receiver, name, argumentList, expectedArgumentNames]); | 3088 [receiver, name, argumentList, expectedArgumentNames]); |
3085 } | 3089 } |
3086 | 3090 |
3087 @override | 3091 @override |
3088 ir.Primitive buildInstanceNoSuchMethod(Selector selector, | 3092 ir.Primitive buildInstanceNoSuchMethod(Selector selector, |
3089 TypeMask mask, | 3093 TypeMask mask, |
3090 List<ir.Primitive> arguments) { | 3094 List<ir.Primitive> arguments) { |
3091 return irBuilder.buildDynamicInvocation( | 3095 return irBuilder.buildDynamicInvocation( |
3092 irBuilder.buildThis(), | 3096 irBuilder.buildThis(), |
3093 compiler.noSuchMethodSelector, | 3097 Selectors.noSuchMethod_, |
3094 mask, | 3098 mask, |
3095 [irBuilder.buildInvocationMirror(selector, arguments)]); | 3099 [irBuilder.buildInvocationMirror(selector, arguments)]); |
3096 } | 3100 } |
3097 | 3101 |
3098 @override | 3102 @override |
3099 ir.Primitive buildRuntimeError(String message) { | 3103 ir.Primitive buildRuntimeError(String message) { |
3100 return irBuilder.buildStaticFunctionInvocation( | 3104 return irBuilder.buildStaticFunctionInvocation( |
3101 backend.getThrowRuntimeError(), | 3105 backend.getThrowRuntimeError(), |
3102 new CallStructure.unnamed(1), | 3106 new CallStructure.unnamed(1), |
3103 [irBuilder.buildStringConstant(message)]); | 3107 [irBuilder.buildStringConstant(message)]); |
(...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3364 if (compiler.backend.isForeign(function)) { | 3368 if (compiler.backend.isForeign(function)) { |
3365 return handleForeignCode(node, function, argumentList, callStructure); | 3369 return handleForeignCode(node, function, argumentList, callStructure); |
3366 } else { | 3370 } else { |
3367 return irBuilder.buildStaticFunctionInvocation(function, callStructure, | 3371 return irBuilder.buildStaticFunctionInvocation(function, callStructure, |
3368 translateStaticArguments(argumentList, function, callStructure), | 3372 translateStaticArguments(argumentList, function, callStructure), |
3369 sourceInformation: | 3373 sourceInformation: |
3370 sourceInformationBuilder.buildCall(node, node.selector)); | 3374 sourceInformationBuilder.buildCall(node, node.selector)); |
3371 } | 3375 } |
3372 } | 3376 } |
3373 } | 3377 } |
OLD | NEW |