| OLD | NEW |
| 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 part of ssa; | 5 part of ssa; |
| 6 | 6 |
| 7 class SsaCodeGeneratorTask extends CompilerTask { | 7 class SsaCodeGeneratorTask extends CompilerTask { |
| 8 | 8 |
| 9 final JavaScriptBackend backend; | 9 final JavaScriptBackend backend; |
| 10 | 10 |
| (...skipping 2226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2237 push(new js.Binary('||', | 2237 push(new js.Binary('||', |
| 2238 functionTest, | 2238 functionTest, |
| 2239 new js.Binary('&&', objectTest, pop()))); | 2239 new js.Binary('&&', objectTest, pop()))); |
| 2240 } | 2240 } |
| 2241 | 2241 |
| 2242 void checkType(HInstruction input, DartType type, {bool negative: false}) { | 2242 void checkType(HInstruction input, DartType type, {bool negative: false}) { |
| 2243 assert(invariant(input, !type.isMalformed, | 2243 assert(invariant(input, !type.isMalformed, |
| 2244 message: 'Attempt to check malformed type $type')); | 2244 message: 'Attempt to check malformed type $type')); |
| 2245 world.registerIsCheck(type, work.resolutionTree); | 2245 world.registerIsCheck(type, work.resolutionTree); |
| 2246 Element element = type.element; | 2246 Element element = type.element; |
| 2247 String operatorIs = backend.namer.operatorIsType(type); |
| 2247 use(input); | 2248 use(input); |
| 2248 js.PropertyAccess field = | 2249 js.PropertyAccess field = |
| 2249 new js.PropertyAccess.field(pop(), backend.namer.operatorIs(element)); | 2250 new js.PropertyAccess.field(pop(), operatorIs); |
| 2250 if (backend.emitter.nativeEmitter.requiresNativeIsCheck(element)) { | 2251 if (backend.emitter.nativeEmitter.requiresNativeIsCheck(element)) { |
| 2251 push(new js.Call(field, <js.Expression>[])); | 2252 push(new js.Call(field, <js.Expression>[])); |
| 2252 if (negative) push(new js.Prefix('!', pop())); | 2253 if (negative) push(new js.Prefix('!', pop())); |
| 2253 } else { | 2254 } else { |
| 2254 // We always negate at least once so that the result is boolified. | 2255 // We always negate at least once so that the result is boolified. |
| 2255 push(new js.Prefix('!', field)); | 2256 push(new js.Prefix('!', field)); |
| 2256 // If the result is not negated, put another '!' in front. | 2257 // If the result is not negated, put another '!' in front. |
| 2257 if (!negative) push(new js.Prefix('!', pop())); | 2258 if (!negative) push(new js.Prefix('!', pop())); |
| 2258 } | 2259 } |
| 2259 } | 2260 } |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2419 use(node.checkedInput); | 2420 use(node.checkedInput); |
| 2420 arguments.add(pop()); | 2421 arguments.add(pop()); |
| 2421 int parameterCount = | 2422 int parameterCount = |
| 2422 helperElement.computeSignature(compiler).parameterCount; | 2423 helperElement.computeSignature(compiler).parameterCount; |
| 2423 // TODO(johnniwinther): Refactor this to avoid using the parameter count | 2424 // TODO(johnniwinther): Refactor this to avoid using the parameter count |
| 2424 // to determine how the helper should be called. | 2425 // to determine how the helper should be called. |
| 2425 if (parameterCount == 2) { | 2426 if (parameterCount == 2) { |
| 2426 // 2 arguments implies that the method is either [propertyTypeCheck] | 2427 // 2 arguments implies that the method is either [propertyTypeCheck] |
| 2427 // or [propertyTypeCast]. | 2428 // or [propertyTypeCast]. |
| 2428 assert(!type.isMalformed); | 2429 assert(!type.isMalformed); |
| 2429 String additionalArgument = backend.namer.operatorIs(type.element); | 2430 String additionalArgument = backend.namer.operatorIsType(type); |
| 2430 arguments.add(js.string(additionalArgument)); | 2431 arguments.add(js.string(additionalArgument)); |
| 2431 } else if (parameterCount == 3) { | 2432 } else if (parameterCount == 3) { |
| 2432 // 3 arguments implies that the method is [malformedTypeCheck]. | 2433 // 3 arguments implies that the method is [malformedTypeCheck]. |
| 2433 assert(type.isMalformed); | 2434 assert(type.isMalformed); |
| 2434 String reasons = Types.fetchReasonsFromMalformedType(type); | 2435 String reasons = Types.fetchReasonsFromMalformedType(type); |
| 2435 arguments.add(js.string('$type')); | 2436 arguments.add(js.string('$type')); |
| 2436 // TODO(johnniwinther): Handle escaping correctly. | 2437 // TODO(johnniwinther): Handle escaping correctly. |
| 2437 arguments.add(js.string(reasons)); | 2438 arguments.add(js.string(reasons)); |
| 2438 } else { | 2439 } else { |
| 2439 assert(!type.isMalformed); | 2440 assert(!type.isMalformed); |
| (...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2963 if (leftType.canBeNull() && rightType.canBeNull()) { | 2964 if (leftType.canBeNull() && rightType.canBeNull()) { |
| 2964 if (left.isConstantNull() || right.isConstantNull() || | 2965 if (left.isConstantNull() || right.isConstantNull() || |
| 2965 (leftType.isPrimitive() && leftType == rightType)) { | 2966 (leftType.isPrimitive() && leftType == rightType)) { |
| 2966 return '=='; | 2967 return '=='; |
| 2967 } | 2968 } |
| 2968 return null; | 2969 return null; |
| 2969 } else { | 2970 } else { |
| 2970 return '==='; | 2971 return '==='; |
| 2971 } | 2972 } |
| 2972 } | 2973 } |
| OLD | NEW |