Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(573)

Side by Side Diff: dart/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart

Issue 27524003: Generate tear-off closures dynamically. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 part of js_backend; 5 part of js_backend;
6 6
7 const VERBOSE_OPTIMIZER_HINTS = false; 7 const VERBOSE_OPTIMIZER_HINTS = false;
8 8
9 class JavaScriptItemCompilationContext extends ItemCompilationContext { 9 class JavaScriptItemCompilationContext extends ItemCompilationContext {
10 final Set<HInstruction> boundsChecked = new Set<HInstruction>(); 10 final Set<HInstruction> boundsChecked = new Set<HInstruction>();
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after
793 } else if (cls == compiler.boundClosureClass) { 793 } else if (cls == compiler.boundClosureClass) {
794 // TODO(ngeoffray): Move the bound closure class in the 794 // TODO(ngeoffray): Move the bound closure class in the
795 // backend. 795 // backend.
796 enqueueClass(enqueuer, compiler.boundClosureClass, elements); 796 enqueueClass(enqueuer, compiler.boundClosureClass, elements);
797 } else if (Elements.isNativeOrExtendsNative(cls)) { 797 } else if (Elements.isNativeOrExtendsNative(cls)) {
798 enqueue(enqueuer, getNativeInterceptorMethod, elements); 798 enqueue(enqueuer, getNativeInterceptorMethod, elements);
799 enqueueClass(enqueuer, jsInterceptorClass, compiler.globalDependencies); 799 enqueueClass(enqueuer, jsInterceptorClass, compiler.globalDependencies);
800 enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, elements); 800 enqueueClass(enqueuer, jsPlainJavaScriptObjectClass, elements);
801 } 801 }
802 } 802 }
803 if (cls == compiler.closureClass) {
804 enqueue(enqueuer,
805 compiler.findHelper('closureFromTearOff'),
806 elements);
807 }
803 ClassElement result = null; 808 ClassElement result = null;
804 if (cls == compiler.stringClass || cls == jsStringClass) { 809 if (cls == compiler.stringClass || cls == jsStringClass) {
805 addInterceptors(jsStringClass, enqueuer, elements); 810 addInterceptors(jsStringClass, enqueuer, elements);
806 } else if (cls == compiler.listClass 811 } else if (cls == compiler.listClass
807 || cls == jsArrayClass 812 || cls == jsArrayClass
808 || cls == jsFixedArrayClass 813 || cls == jsFixedArrayClass
809 || cls == jsExtendableArrayClass) { 814 || cls == jsExtendableArrayClass) {
810 addInterceptors(jsArrayClass, enqueuer, elements); 815 addInterceptors(jsArrayClass, enqueuer, elements);
811 addInterceptors(jsMutableArrayClass, enqueuer, elements); 816 addInterceptors(jsMutableArrayClass, enqueuer, elements);
812 addInterceptors(jsFixedArrayClass, enqueuer, elements); 817 addInterceptors(jsFixedArrayClass, enqueuer, elements);
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 void registerTypeVariableExpression(TreeElements elements) { 976 void registerTypeVariableExpression(TreeElements elements) {
972 enqueueInResolution(getSetRuntimeTypeInfo(), elements); 977 enqueueInResolution(getSetRuntimeTypeInfo(), elements);
973 enqueueInResolution(getGetRuntimeTypeInfo(), elements); 978 enqueueInResolution(getGetRuntimeTypeInfo(), elements);
974 registerGetRuntimeTypeArgument(elements); 979 registerGetRuntimeTypeArgument(elements);
975 enqueueClass(compiler.enqueuer.resolution, compiler.listClass, elements); 980 enqueueClass(compiler.enqueuer.resolution, compiler.listClass, elements);
976 enqueueInResolution(getRuntimeTypeToString(), elements); 981 enqueueInResolution(getRuntimeTypeToString(), elements);
977 enqueueInResolution(getCreateRuntimeType(), elements); 982 enqueueInResolution(getCreateRuntimeType(), elements);
978 } 983 }
979 984
980 void registerIsCheck(DartType type, Enqueuer world, TreeElements elements) { 985 void registerIsCheck(DartType type, Enqueuer world, TreeElements elements) {
986 enqueueInResolution(getThrowRuntimeError(), elements);
981 type = type.unalias(compiler); 987 type = type.unalias(compiler);
982 enqueueClass(world, compiler.boolClass, elements); 988 enqueueClass(world, compiler.boolClass, elements);
983 bool inCheckedMode = compiler.enableTypeAssertions; 989 bool inCheckedMode = compiler.enableTypeAssertions;
984 // [registerIsCheck] is also called for checked mode checks, so we 990 // [registerIsCheck] is also called for checked mode checks, so we
985 // need to register checked mode helpers. 991 // need to register checked mode helpers.
986 if (inCheckedMode) { 992 if (inCheckedMode) {
987 if (!world.isResolutionQueue) { 993 if (!world.isResolutionQueue) {
988 // All helpers are added to resolution queue in enqueueHelpers. These 994 // All helpers are added to resolution queue in enqueueHelpers. These
989 // calls to enqueueInResolution serve as assertions that the helper was 995 // calls to enqueueInResolution serve as assertions that the helper was
990 // in fact added. 996 // in fact added.
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1028 // We will neeed to add the "$is" and "$as" properties on the 1034 // We will neeed to add the "$is" and "$as" properties on the
1029 // JavaScript object prototype, so we make sure 1035 // JavaScript object prototype, so we make sure
1030 // [:defineProperty:] is compiled. 1036 // [:defineProperty:] is compiled.
1031 enqueue(world, 1037 enqueue(world,
1032 compiler.findHelper('defineProperty'), 1038 compiler.findHelper('defineProperty'),
1033 elements); 1039 elements);
1034 } 1040 }
1035 } 1041 }
1036 1042
1037 void registerAsCheck(DartType type, Enqueuer world, TreeElements elements) { 1043 void registerAsCheck(DartType type, Enqueuer world, TreeElements elements) {
1044 enqueueInResolution(getThrowRuntimeError(), elements);
1038 type = type.unalias(compiler); 1045 type = type.unalias(compiler);
1039 if (!world.isResolutionQueue) { 1046 if (!world.isResolutionQueue) {
1040 // All helpers are added to resolution queue in enqueueHelpers. These 1047 // All helpers are added to resolution queue in enqueueHelpers. These
1041 // calls to enqueueInResolution serve as assertions that the helper was in 1048 // calls to enqueueInResolution serve as assertions that the helper was in
1042 // fact added. 1049 // fact added.
1043 // TODO(13155): Find a way to enqueue helpers lazily. 1050 // TODO(13155): Find a way to enqueue helpers lazily.
1044 CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: true); 1051 CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: true);
1045 enqueueInResolution(helper.getElement(compiler), elements); 1052 enqueueInResolution(helper.getElement(compiler), elements);
1046 // We also need the native variant of the check (for DOM types). 1053 // We also need the native variant of the check (for DOM types).
1047 helper = getNativeCheckedModeHelper(type, typeCast: true); 1054 helper = getNativeCheckedModeHelper(type, typeCast: true);
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after
1705 /** 1712 /**
1706 * Returns `true` if [element] can be accessed through reflection, that is, 1713 * Returns `true` if [element] can be accessed through reflection, that is,
1707 * is in the set of elements covered by a `MirrorsUsed` annotation. 1714 * is in the set of elements covered by a `MirrorsUsed` annotation.
1708 * 1715 *
1709 * This property is used to tag emitted elements with a marker which is 1716 * This property is used to tag emitted elements with a marker which is
1710 * checked by the runtime system to throw an exception if an element is 1717 * checked by the runtime system to throw an exception if an element is
1711 * accessed (invoked, get, set) that is not accessible for the reflective 1718 * accessed (invoked, get, set) that is not accessible for the reflective
1712 * system. 1719 * system.
1713 */ 1720 */
1714 bool isAccessibleByReflection(Element element) { 1721 bool isAccessibleByReflection(Element element) {
1722 // TODO(ahe): This isn't sufficient: simply importing dart:mirrors
1723 // causes hasInsufficientMirrorsUsed to become true.
1715 if (hasInsufficientMirrorsUsed) return true; 1724 if (hasInsufficientMirrorsUsed) return true;
1716 return isNeededForReflection(element); 1725 return isNeededForReflection(element);
1717 } 1726 }
1718 1727
1719 /** 1728 /**
1720 * Returns `true` if the emitter must emit the element even though there 1729 * Returns `true` if the emitter must emit the element even though there
1721 * is no direct use in the program, but because the reflective system may 1730 * is no direct use in the program, but because the reflective system may
1722 * need to access it. 1731 * need to access it.
1723 */ 1732 */
1724 bool isNeededForReflection(Element element) { 1733 bool isNeededForReflection(Element element) {
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1942 copy(constant.values); 1951 copy(constant.values);
1943 copy(constant.protoValue); 1952 copy(constant.protoValue);
1944 copy(constant); 1953 copy(constant);
1945 } 1954 }
1946 1955
1947 void visitConstructed(ConstructedConstant constant) { 1956 void visitConstructed(ConstructedConstant constant) {
1948 copy(constant.fields); 1957 copy(constant.fields);
1949 copy(constant); 1958 copy(constant);
1950 } 1959 }
1951 } 1960 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698