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

Unified Diff: pkg/compiler/lib/src/js_backend/codegen/codegen.dart

Issue 1779153002: Make source information on conditions mandatory in CPS (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 4 years, 9 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: pkg/compiler/lib/src/js_backend/codegen/codegen.dart
diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
index 9f45eabbf2129fc0a1ad0104def01f33f19c291f..c54629b5dd3c66d8dbe6886c2280c2386b576f99 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
@@ -659,12 +659,14 @@ class CodeGenerator extends tree_ir.StatementVisitor
bool thenHasFallthrough = (fallthrough.useCount > usesBefore);
if (thenHasFallthrough) {
js.Statement elseBody = buildBodyStatement(node.elseStatement);
- accumulator.add(new js.If(condition, thenBody, elseBody));
+ accumulator.add(new js.If(condition, thenBody, elseBody)
+ .withSourceInformation(node.sourceInformation));
return null;
} else {
// The 'then' body cannot complete normally, so emit a short 'if'
// and put the 'else' body after it.
- accumulator.add(new js.If.noElse(condition, thenBody));
+ accumulator.add(new js.If.noElse(condition, thenBody)
+ .withSourceInformation(node.sourceInformation));
return node.elseStatement;
}
}
@@ -1079,86 +1081,91 @@ class CodeGenerator extends tree_ir.StatementVisitor
@override
js.Expression visitApplyBuiltinOperator(tree_ir.ApplyBuiltinOperator node) {
List<js.Expression> args = visitExpressionList(node.arguments);
- switch (node.operator) {
- case BuiltinOperator.NumAdd:
- return new js.Binary('+', args[0], args[1]);
- case BuiltinOperator.NumSubtract:
- return new js.Binary('-', args[0], args[1]);
- case BuiltinOperator.NumMultiply:
- return new js.Binary('*', args[0], args[1]);
- case BuiltinOperator.NumDivide:
- return new js.Binary('/', args[0], args[1]);
- case BuiltinOperator.NumRemainder:
- return new js.Binary('%', args[0], args[1]);
- case BuiltinOperator.NumTruncatingDivideToSigned32:
- return js.js('(# / #) | 0', args);
- case BuiltinOperator.NumAnd:
- return normalizeBitOp(js.js('# & #', args), node);
- case BuiltinOperator.NumOr:
- return normalizeBitOp(js.js('# | #', args), node);
- case BuiltinOperator.NumXor:
- return normalizeBitOp(js.js('# ^ #', args), node);
- case BuiltinOperator.NumLt:
- return new js.Binary('<', args[0], args[1]);
- case BuiltinOperator.NumLe:
- return new js.Binary('<=', args[0], args[1]);
- case BuiltinOperator.NumGt:
- return new js.Binary('>', args[0], args[1]);
- case BuiltinOperator.NumGe:
- return new js.Binary('>=', args[0], args[1]);
- case BuiltinOperator.NumShl:
- return normalizeBitOp(js.js('# << #', args), node);
- case BuiltinOperator.NumShr:
- // No normalization required since output is always uint32.
- return js.js('# >>> #', args);
- case BuiltinOperator.NumBitNot:
- return js.js('(~#) >>> 0', args);
- case BuiltinOperator.NumNegate:
- return js.js('-#', args);
- case BuiltinOperator.StringConcatenate:
- if (args.isEmpty) return js.string('');
- return args.reduce((e1,e2) => new js.Binary('+', e1, e2));
- case BuiltinOperator.CharCodeAt:
- return js.js('#.charCodeAt(#)', args);
- case BuiltinOperator.Identical:
- registry.registerStaticUse(new StaticUse.staticInvoke(
- glue.identicalFunction, new CallStructure.unnamed(args.length)));
- return buildStaticHelperInvocation(glue.identicalFunction, args);
- case BuiltinOperator.StrictEq:
- return new js.Binary('===', args[0], args[1]);
- case BuiltinOperator.StrictNeq:
- return new js.Binary('!==', args[0], args[1]);
- case BuiltinOperator.LooseEq:
- return new js.Binary('==', args[0], args[1]);
- case BuiltinOperator.LooseNeq:
- return new js.Binary('!=', args[0], args[1]);
- case BuiltinOperator.IsFalsy:
- return new js.Prefix('!', args[0]);
- case BuiltinOperator.IsNumber:
- return js.js('typeof # === "number"', args);
- case BuiltinOperator.IsNotNumber:
- return js.js('typeof # !== "number"', args);
- case BuiltinOperator.IsFloor:
- return js.js('Math.floor(#) === #', args);
- case BuiltinOperator.IsInteger:
- return js.js('typeof # === "number" && Math.floor(#) === #', args);
- case BuiltinOperator.IsNotInteger:
- return js.js('typeof # !== "number" || Math.floor(#) !== #', args);
- case BuiltinOperator.IsUnsigned32BitInteger:
- return js.js('# >>> 0 === #', args);
- case BuiltinOperator.IsNotUnsigned32BitInteger:
- return js.js('# >>> 0 !== #', args);
- case BuiltinOperator.IsFixedLengthJSArray:
- // TODO(sra): Remove boolify (i.e. !!).
- return js.js(r'!!#.fixed$length', args);
- case BuiltinOperator.IsExtendableJSArray:
- return js.js(r'!#.fixed$length', args);
- case BuiltinOperator.IsModifiableJSArray:
- return js.js(r'!#.immutable$list', args);
- case BuiltinOperator.IsUnmodifiableJSArray:
- // TODO(sra): Remove boolify (i.e. !!).
- return js.js(r'!!#.immutable$list', args);
+
+ js.Expression createExpression() {
+ switch (node.operator) {
+ case BuiltinOperator.NumAdd:
+ return new js.Binary('+', args[0], args[1]);
+ case BuiltinOperator.NumSubtract:
+ return new js.Binary('-', args[0], args[1]);
+ case BuiltinOperator.NumMultiply:
+ return new js.Binary('*', args[0], args[1]);
+ case BuiltinOperator.NumDivide:
+ return new js.Binary('/', args[0], args[1]);
+ case BuiltinOperator.NumRemainder:
+ return new js.Binary('%', args[0], args[1]);
+ case BuiltinOperator.NumTruncatingDivideToSigned32:
+ return js.js('(# / #) | 0', args);
+ case BuiltinOperator.NumAnd:
+ return normalizeBitOp(js.js('# & #', args), node);
+ case BuiltinOperator.NumOr:
+ return normalizeBitOp(js.js('# | #', args), node);
+ case BuiltinOperator.NumXor:
+ return normalizeBitOp(js.js('# ^ #', args), node);
+ case BuiltinOperator.NumLt:
+ return new js.Binary('<', args[0], args[1]);
+ case BuiltinOperator.NumLe:
+ return new js.Binary('<=', args[0], args[1]);
+ case BuiltinOperator.NumGt:
+ return new js.Binary('>', args[0], args[1]);
+ case BuiltinOperator.NumGe:
+ return new js.Binary('>=', args[0], args[1]);
+ case BuiltinOperator.NumShl:
+ return normalizeBitOp(js.js('# << #', args), node);
+ case BuiltinOperator.NumShr:
+ // No normalization required since output is always uint32.
+ return js.js('# >>> #', args);
+ case BuiltinOperator.NumBitNot:
+ return js.js('(~#) >>> 0', args);
+ case BuiltinOperator.NumNegate:
+ return js.js('-#', args);
+ case BuiltinOperator.StringConcatenate:
+ if (args.isEmpty) return js.string('');
+ return args.reduce((e1,e2) => new js.Binary('+', e1, e2));
+ case BuiltinOperator.CharCodeAt:
+ return js.js('#.charCodeAt(#)', args);
+ case BuiltinOperator.Identical:
+ registry.registerStaticUse(new StaticUse.staticInvoke(
+ glue.identicalFunction, new CallStructure.unnamed(args.length)));
+ return buildStaticHelperInvocation(glue.identicalFunction, args);
+ case BuiltinOperator.StrictEq:
+ return new js.Binary('===', args[0], args[1]);
+ case BuiltinOperator.StrictNeq:
+ return new js.Binary('!==', args[0], args[1]);
+ case BuiltinOperator.LooseEq:
+ return new js.Binary('==', args[0], args[1]);
+ case BuiltinOperator.LooseNeq:
+ return new js.Binary('!=', args[0], args[1]);
+ case BuiltinOperator.IsFalsy:
+ return new js.Prefix('!', args[0]);
+ case BuiltinOperator.IsNumber:
+ return js.js('typeof # === "number"', args);
+ case BuiltinOperator.IsNotNumber:
+ return js.js('typeof # !== "number"', args);
+ case BuiltinOperator.IsFloor:
+ return js.js('Math.floor(#) === #', args);
+ case BuiltinOperator.IsInteger:
+ return js.js('typeof # === "number" && Math.floor(#) === #', args);
+ case BuiltinOperator.IsNotInteger:
+ return js.js('typeof # !== "number" || Math.floor(#) !== #', args);
+ case BuiltinOperator.IsUnsigned32BitInteger:
+ return js.js('# >>> 0 === #', args);
+ case BuiltinOperator.IsNotUnsigned32BitInteger:
+ return js.js('# >>> 0 !== #', args);
+ case BuiltinOperator.IsFixedLengthJSArray:
+ // TODO(sra): Remove boolify (i.e. !!).
+ return js.js(r'!!#.fixed$length', args);
+ case BuiltinOperator.IsExtendableJSArray:
+ return js.js(r'!#.fixed$length', args);
+ case BuiltinOperator.IsModifiableJSArray:
+ return js.js(r'!#.immutable$list', args);
+ case BuiltinOperator.IsUnmodifiableJSArray:
+ // TODO(sra): Remove boolify (i.e. !!).
+ return js.js(r'!!#.immutable$list', args);
+ }
}
+
+ return createExpression().withSourceInformation(node.sourceInformation);
}
/// Add a uint32 normalization `op >>> 0` to [op] if it is not in 31-bit
« no previous file with comments | « pkg/compiler/lib/src/io/source_information.dart ('k') | pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698