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

Side by Side Diff: pkg/compiler/lib/src/constant_system_dart.dart

Issue 2400853003: dart2js: Constant fold num.round() (Closed)
Patch Set: Created 4 years, 2 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
« no previous file with comments | « no previous file | pkg/compiler/lib/src/constants/constant_system.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 library dart2js.constant_system.dart; 5 library dart2js.constant_system.dart;
6 6
7 import 'compiler.dart' show Compiler; 7 import 'compiler.dart' show Compiler;
8 import 'constants/constant_system.dart'; 8 import 'constants/constant_system.dart';
9 import 'constants/values.dart'; 9 import 'constants/values.dart';
10 import 'dart_types.dart'; 10 import 'dart_types.dart';
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 final String name = '??'; 341 final String name = '??';
342 const IfNullOperation(); 342 const IfNullOperation();
343 ConstantValue fold(ConstantValue left, ConstantValue right) { 343 ConstantValue fold(ConstantValue left, ConstantValue right) {
344 if (left.isNull) return right; 344 if (left.isNull) return right;
345 return left; 345 return left;
346 } 346 }
347 347
348 apply(left, right) => left ?? right; 348 apply(left, right) => left ?? right;
349 } 349 }
350 350
351 abstract class CodeUnitAtOperation implements BinaryOperation { 351 class CodeUnitAtOperation implements BinaryOperation {
352 final String name = 'charCodeAt'; 352 String get name => 'charCodeAt';
353 const CodeUnitAtOperation(); 353 const CodeUnitAtOperation();
354 ConstantValue fold(ConstantValue left, ConstantValue right) => null;
354 apply(left, right) => left.codeUnitAt(right); 355 apply(left, right) => left.codeUnitAt(right);
355 } 356 }
356 357
357 class CodeUnitAtConstantOperation extends CodeUnitAtOperation {
358 const CodeUnitAtConstantOperation();
359 ConstantValue fold(ConstantValue left, ConstantValue right) {
360 // 'a'.codeUnitAt(0) is not a constant expression.
361 return null;
362 }
363 }
364
365 class CodeUnitAtRuntimeOperation extends CodeUnitAtOperation { 358 class CodeUnitAtRuntimeOperation extends CodeUnitAtOperation {
366 const CodeUnitAtRuntimeOperation(); 359 const CodeUnitAtRuntimeOperation();
367 IntConstantValue fold(ConstantValue left, ConstantValue right) { 360 IntConstantValue fold(ConstantValue left, ConstantValue right) {
368 if (left.isString && right.isInt) { 361 if (left.isString && right.isInt) {
369 StringConstantValue stringConstant = left; 362 StringConstantValue stringConstant = left;
370 IntConstantValue indexConstant = right; 363 IntConstantValue indexConstant = right;
371 DartString dartString = stringConstant.primitiveValue; 364 DartString dartString = stringConstant.primitiveValue;
372 int index = indexConstant.primitiveValue; 365 int index = indexConstant.primitiveValue;
373 if (index < 0 || index >= dartString.length) return null; 366 if (index < 0 || index >= dartString.length) return null;
374 String string = dartString.slowToString(); 367 String string = dartString.slowToString();
375 int value = string.codeUnitAt(index); 368 int value = string.codeUnitAt(index);
376 return DART_CONSTANT_SYSTEM.createInt(value); 369 return DART_CONSTANT_SYSTEM.createInt(value);
377 } 370 }
378 return null; 371 return null;
379 } 372 }
380 } 373 }
381 374
375 class UnfoldedUnaryOperation implements UnaryOperation {
376 final String name;
377 const UnfoldedUnaryOperation(this.name);
378 ConstantValue fold(ConstantValue constant) {
379 return null;
380 }
381 }
382
382 /** 383 /**
383 * A constant system implementing the Dart semantics. This system relies on 384 * A constant system implementing the Dart semantics. This system relies on
384 * the underlying runtime-system. That is, if dart2js is run in an environment 385 * the underlying runtime-system. That is, if dart2js is run in an environment
385 * that doesn't correctly implement Dart's semantics this constant system will 386 * that doesn't correctly implement Dart's semantics this constant system will
386 * not return the correct values. 387 * not return the correct values.
387 */ 388 */
388 class DartConstantSystem extends ConstantSystem { 389 class DartConstantSystem extends ConstantSystem {
389 final add = const AddOperation(); 390 final add = const AddOperation();
390 final bitAnd = const BitAndOperation(); 391 final bitAnd = const BitAndOperation();
391 final bitNot = const BitNotOperation(); 392 final bitNot = const BitNotOperation();
(...skipping 10 matching lines...) Expand all
402 final lessEqual = const LessEqualOperation(); 403 final lessEqual = const LessEqualOperation();
403 final less = const LessOperation(); 404 final less = const LessOperation();
404 final modulo = const ModuloOperation(); 405 final modulo = const ModuloOperation();
405 final multiply = const MultiplyOperation(); 406 final multiply = const MultiplyOperation();
406 final negate = const NegateOperation(); 407 final negate = const NegateOperation();
407 final not = const NotOperation(); 408 final not = const NotOperation();
408 final shiftLeft = const ShiftLeftOperation(); 409 final shiftLeft = const ShiftLeftOperation();
409 final shiftRight = const ShiftRightOperation(); 410 final shiftRight = const ShiftRightOperation();
410 final subtract = const SubtractOperation(); 411 final subtract = const SubtractOperation();
411 final truncatingDivide = const TruncatingDivideOperation(); 412 final truncatingDivide = const TruncatingDivideOperation();
412 final codeUnitAt = const CodeUnitAtConstantOperation(); 413 final codeUnitAt = const CodeUnitAtOperation();
414 final round = const UnfoldedUnaryOperation('round');
413 415
414 const DartConstantSystem(); 416 const DartConstantSystem();
415 417
416 @override 418 @override
417 IntConstantValue createInt(int i) => new IntConstantValue(i); 419 IntConstantValue createInt(int i) => new IntConstantValue(i);
418 420
419 @override 421 @override
420 DoubleConstantValue createDouble(double d) => new DoubleConstantValue(d); 422 DoubleConstantValue createDouble(double d) => new DoubleConstantValue(d);
421 423
422 @override 424 @override
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 bool isInt(ConstantValue constant) => constant.isInt; 462 bool isInt(ConstantValue constant) => constant.isInt;
461 bool isDouble(ConstantValue constant) => constant.isDouble; 463 bool isDouble(ConstantValue constant) => constant.isDouble;
462 bool isString(ConstantValue constant) => constant.isString; 464 bool isString(ConstantValue constant) => constant.isString;
463 bool isBool(ConstantValue constant) => constant.isBool; 465 bool isBool(ConstantValue constant) => constant.isBool;
464 bool isNull(ConstantValue constant) => constant.isNull; 466 bool isNull(ConstantValue constant) => constant.isNull;
465 467
466 bool isSubtype(DartTypes types, DartType s, DartType t) { 468 bool isSubtype(DartTypes types, DartType s, DartType t) {
467 return types.isSubtype(s, t); 469 return types.isSubtype(s, t);
468 } 470 }
469 } 471 }
OLDNEW
« no previous file with comments | « no previous file | pkg/compiler/lib/src/constants/constant_system.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698