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

Unified Diff: tool/input_sdk/private/ddc_runtime/types.dart

Issue 1963733003: Faster ignore. (Closed) Base URL: git@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 side-by-side diff with in-line comments
Download patch
Index: tool/input_sdk/private/ddc_runtime/types.dart
diff --git a/tool/input_sdk/private/ddc_runtime/types.dart b/tool/input_sdk/private/ddc_runtime/types.dart
index 1cecf25f925d68b189ebd3d050f41269283ca556..4371cf2d21c150bacb60125f04d981609373a227 100644
--- a/tool/input_sdk/private/ddc_runtime/types.dart
+++ b/tool/input_sdk/private/ddc_runtime/types.dart
@@ -312,6 +312,8 @@ typedef(name, closure) => JS('', 'new #(#, #)', Typedef, name, closure);
bool isDartType(type) => JS('bool', '#(#) === #', _getRuntimeType, type, Type);
typeName(type) => JS('', '''(() => {
+ if ($type === void 0) return "undefined type";
+ if ($type === null) return "null type";
// Non-instance types
if ($type instanceof $TypeRep) {
if ($type instanceof $Typedef) {
@@ -332,7 +334,7 @@ typeName(type) => JS('', '''(() => {
result += '<';
for (let i = 0; i < args.length; ++i) {
- if (i > 0) name += ', ';
+ if (i > 0) result += ', ';
let argName = $typeName(args[i]);
if (argName != 'dynamic') allDynamic = false;
@@ -459,25 +461,35 @@ canonicalType(t) => JS('', '''(() => {
return t;
})()''');
-final subtypeMap = JS('', 'new Map()');
+/// TODO(leafp): This duplicates code in operations.dart.
+/// I haven't found a way to factor it out that makes the
+/// code generator happy though.
+_subtypeMemo(f) => JS('', '''(() => {
+ let memo = new Map();
+ return (t1, t2) => {
+ let map = memo.get(t1);
+ let result;
+ if (map) {
+ result = map.get(t2);
+ if (result !== void 0) return result;
+ } else {
+ memo.set(t1, map = new Map());
+ }
+ console.log("Checking " + $typeName(t1) + " <: " + $typeName(t2));
+ result = $f(t1, t2);
+ map.set(t2, result);
+ return result;
+ };
+})()''');
+
/// Returns true if [t1] <: [t2].
/// Returns false if [t1] </: [t2] in both spec and strong mode
/// Returns undefined if [t1] </: [t2] in strong mode, but spec
/// mode may differ
-isSubtype(t1, t2) => JS('', '''(() => {
- // See if we already know the answer
- // TODO(jmesserly): general purpose memoize function?
- let map = $subtypeMap.get($t1);
- let result;
- if (map) {
- result = map.get($t2);
- if (result !== void 0) return result;
- } else {
- $subtypeMap.set($t1, map = new Map());
- }
- result = $isSubtype_($t1, $t2, true);
- map.set($t2, result);
- return result;
+final isSubtype = JS('', '''(() => {
+ return $_subtypeMemo((t1, t2) => {
+ return $isSubtype_(t1, t2, true);
+ });
})()''');
_isBottom(type) => JS('bool', '# == #', type, bottom);

Powered by Google App Engine
This is Rietveld 408576698