Index: sdk/lib/_internal/compiler/implementation/lib/interceptors.dart |
=================================================================== |
--- sdk/lib/_internal/compiler/implementation/lib/interceptors.dart (revision 14840) |
+++ sdk/lib/_internal/compiler/implementation/lib/interceptors.dart (working copy) |
@@ -6,6 +6,41 @@ |
#import('dart:collection'); |
+/** |
+ * The interceptor class for [String]. The compiler recognizes this |
+ * class as an interceptor, and changes references to [:this:] to |
+ * actually use the receiver of the method, which is generated as an extra |
+ * argument added to each member. |
+ */ |
+class JSString implements String { |
+ const JSString(); |
+ |
+ int charCodeAt(index) { |
+ if (index is !num) throw new ArgumentError(index); |
+ if (index < 0) throw new RangeError.value(index); |
+ if (index >= length) throw new RangeError.value(index); |
+ return JS('int', r'#.charCodeAt(#)', this, index); |
+ } |
+} |
+ |
+/** |
+ * The interceptor class for all non-primitive objects. All its |
+ * members are synthethized by the compiler's emitter. |
+ */ |
+class ObjectInterceptor { |
+ const ObjectInterceptor(); |
+} |
+ |
+/** |
+ * Get the interceptor for [object]. Called by the compiler when it needs |
+ * to emit a call to an intercepted method, that is a method that is |
+ * defined in an interceptor class. |
+ */ |
+getInterceptor(object) { |
+ if (object is String) return const JSString(); |
+ return const ObjectInterceptor(); |
+} |
+ |
add$1(var receiver, var value) { |
if (isJsArray(receiver)) { |
checkGrowable(receiver, 'add'); |
@@ -90,17 +125,6 @@ |
return UNINTERCEPTED(receiver.iterator()); |
} |
-charCodeAt(var receiver, int index) { |
- if (receiver is String) { |
- if (index is !num) throw new ArgumentError(index); |
- if (index < 0) throw new RangeError.value(index); |
- if (index >= receiver.length) throw new RangeError.value(index); |
- return JS('int', r'#.charCodeAt(#)', receiver, index); |
- } else { |
- return UNINTERCEPTED(receiver.charCodeAt(index)); |
- } |
-} |
- |
get$isEmpty(receiver) { |
if (receiver is String || isJsArray(receiver)) { |
return JS('bool', r'#.length === 0', receiver); |