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

Side by Side Diff: tool/input_sdk/private/ddc_runtime/operations.dart

Issue 1944483002: Redo how Type objects are exposed from DDC. (Closed) Base URL: https://github.com/dart-lang/dev_compiler.git@master
Patch Set: Created 4 years, 7 months 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
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 /// This library defines runtime operations on objects used by the code 5 /// This library defines runtime operations on objects used by the code
6 /// generator. 6 /// generator.
7 part of dart._runtime; 7 part of dart._runtime;
8 8
9 _canonicalFieldName(obj, name, args, displayName) => JS('', '''(() => { 9 _canonicalFieldName(obj, name, args, displayName) => JS('', '''(() => {
10 $name = $canonicalMember($obj, $name); 10 $name = $canonicalMember($obj, $name);
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 $isSubtype($type, $StreamSubscription) && 160 $isSubtype($type, $StreamSubscription) &&
161 $isSubtype($actual, $StreamSubscription)) { 161 $isSubtype($actual, $StreamSubscription)) {
162 console.warn('Ignoring cast fail from ' + $typeName($actual) + 162 console.warn('Ignoring cast fail from ' + $typeName($actual) +
163 ' to ' + $typeName($type)); 163 ' to ' + $typeName($type));
164 return true; 164 return true;
165 } 165 }
166 return false; 166 return false;
167 })()'''); 167 })()''');
168 168
169 strongInstanceOf(obj, type, ignoreFromWhiteList) => JS('', '''(() => { 169 strongInstanceOf(obj, type, ignoreFromWhiteList) => JS('', '''(() => {
170 let actual = $realRuntimeType($obj); 170 let actual = $getReifiedType($obj);
171 if ($isSubtype(actual, $type) || actual == $jsobject || 171 if ($isSubtype(actual, $type) || actual == $jsobject ||
172 actual == $int && type == $double) return true; 172 actual == $int && type == $double) return true;
173 if ($ignoreFromWhiteList == void 0) return false; 173 if ($ignoreFromWhiteList == void 0) return false;
174 if ($isGroundType($type)) return false; 174 if ($isGroundType($type)) return false;
175 if ($_ignoreTypeFailure(actual, $type)) return true; 175 if ($_ignoreTypeFailure(actual, $type)) return true;
176 return false; 176 return false;
177 })()'''); 177 })()''');
178 178
179 instanceOfOrNull(obj, type) => JS('', '''(() => { 179 instanceOfOrNull(obj, type) => JS('', '''(() => {
180 if (($obj == null) || $strongInstanceOf($obj, $type, true)) return true; 180 if (($obj == null) || $strongInstanceOf($obj, $type, true)) return true;
181 return false; 181 return false;
182 })()'''); 182 })()''');
183 183
184 @JSExportName('is') 184 @JSExportName('is')
185 instanceOf(obj, type) => JS('', '''(() => { 185 instanceOf(obj, type) => JS('', '''(() => {
186 if ($strongInstanceOf($obj, $type)) return true; 186 if ($strongInstanceOf($obj, $type)) return true;
187 // TODO(#296): This is perhaps too eager to throw a StrongModeError? 187 // TODO(#296): This is perhaps too eager to throw a StrongModeError?
188 // It will throw on <int>[] is List<String>. 188 // It will throw on <int>[] is List<String>.
189 // TODO(vsm): We can statically detect many cases where this 189 // TODO(vsm): We can statically detect many cases where this
190 // check is unnecessary. 190 // check is unnecessary.
191 if ($isGroundType($type)) return false; 191 if ($isGroundType($type)) return false;
192 let actual = $realRuntimeType($obj); 192 let actual = $getReifiedType($obj);
193 $throwStrongModeError('Strong mode is check failure: ' + 193 $throwStrongModeError('Strong mode is check failure: ' +
194 $typeName(actual) + ' does not soundly subtype ' + 194 $typeName(actual) + ' does not soundly subtype ' +
195 $typeName($type)); 195 $typeName($type));
196 })()'''); 196 })()''');
197 197
198 @JSExportName('as') 198 @JSExportName('as')
199 cast(obj, type) => JS('', '''(() => { 199 cast(obj, type) => JS('', '''(() => {
200 // TODO(#296): This is perhaps too eager to throw a StrongModeError? 200 // TODO(#296): This is perhaps too eager to throw a StrongModeError?
201 // TODO(vsm): handle non-nullable types 201 // TODO(vsm): handle non-nullable types
202 if ($instanceOfOrNull($obj, $type)) return $obj; 202 if ($instanceOfOrNull($obj, $type)) return $obj;
203 let actual = $realRuntimeType($obj); 203 let actual = $getReifiedType($obj);
204 if ($isGroundType($type)) $throwCastError(actual, $type); 204 if ($isGroundType($type)) $throwCastError(actual, $type);
205 205
206 if ($_ignoreTypeFailure(actual, $type)) return $obj; 206 if ($_ignoreTypeFailure(actual, $type)) return $obj;
207 207
208 $throwStrongModeError('Strong mode cast failure from ' + 208 $throwStrongModeError('Strong mode cast failure from ' +
209 $typeName(actual) + ' to ' + $typeName($type)); 209 $typeName(actual) + ' to ' + $typeName($type));
210 })()'''); 210 })()''');
211 211
212 asInt(obj) => JS('', '''(() => { 212 asInt(obj) => JS('', '''(() => {
213 if ($obj == null) { 213 if ($obj == null) {
214 return null; 214 return null;
215 } 215 }
216 if (Math.floor($obj) != $obj) { 216 if (Math.floor($obj) != $obj) {
217 // Note: null will also be caught by this check 217 // Note: null will also be caught by this check
218 $throwCastError($realRuntimeType($obj), $int); 218 $throwCastError($getReifiedType($obj), $int);
219 } 219 }
220 return $obj; 220 return $obj;
221 })()'''); 221 })()''');
222 222
223 arity(f) => JS('', '''(() => { 223 arity(f) => JS('', '''(() => {
224 // TODO(jmesserly): need to parse optional params. 224 // TODO(jmesserly): need to parse optional params.
225 // In ES6, length is the number of required arguments. 225 // In ES6, length is the number of required arguments.
226 return { min: $f.length, max: $f.length }; 226 return { min: $f.length, max: $f.length };
227 })()'''); 227 })()''');
228 228
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 355
356 /// 356 ///
357 /// Canonicalize a constant object. 357 /// Canonicalize a constant object.
358 /// 358 ///
359 /// Preconditions: 359 /// Preconditions:
360 /// - `obj` is an objects or array, not a primitive. 360 /// - `obj` is an objects or array, not a primitive.
361 /// - nested values of the object are themselves already canonicalized. 361 /// - nested values of the object are themselves already canonicalized.
362 /// 362 ///
363 @JSExportName('const') 363 @JSExportName('const')
364 const_(obj) => JS('', '''(() => { 364 const_(obj) => JS('', '''(() => {
365 let objectKey = [$realRuntimeType($obj)]; 365 let objectKey = [$getReifiedType($obj)];
366 // TODO(jmesserly): there's no guarantee in JS that names/symbols are 366 // TODO(jmesserly): there's no guarantee in JS that names/symbols are
367 // returned in the same order. 367 // returned in the same order.
368 // 368 //
369 // We could probably get the same order if we're judicious about 369 // We could probably get the same order if we're judicious about
370 // initializing fields in a consistent order across all const constructors. 370 // initializing fields in a consistent order across all const constructors.
371 // Alternatively we need a way to sort them to make consistent. 371 // Alternatively we need a way to sort them to make consistent.
372 // 372 //
373 // Right now we use the (name,value) pairs in sequence, which prevents 373 // Right now we use the (name,value) pairs in sequence, which prevents
374 // an object with incorrect field values being returned, but won't 374 // an object with incorrect field values being returned, but won't
375 // canonicalize correctly if key order is different. 375 // canonicalize correctly if key order is different.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 constructor(dartIterator) { 427 constructor(dartIterator) {
428 this.dartIterator = dartIterator; 428 this.dartIterator = dartIterator;
429 } 429 }
430 next() { 430 next() {
431 let i = this.dartIterator; 431 let i = this.dartIterator;
432 let done = !i.moveNext(); 432 let done = !i.moveNext();
433 return { done: done, value: done ? void 0 : i.current }; 433 return { done: done, value: done ? void 0 : i.current };
434 } 434 }
435 } 435 }
436 '''); 436 ''');
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698