| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 ssa.tracer; | 5 library ssa.tracer; |
| 6 | 6 |
| 7 import 'dart:async' show EventSink; | 7 import 'dart:async' show EventSink; |
| 8 | 8 |
| 9 import '../compiler.dart' show Compiler; | 9 import '../compiler.dart' show Compiler; |
| 10 import '../diagnostics/invariant.dart' show DEBUG_MODE; | 10 import '../diagnostics/invariant.dart' show DEBUG_MODE; |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 153 } else { | 153 } else { |
| 154 prefix = 'U'; | 154 prefix = 'U'; |
| 155 } | 155 } |
| 156 return "$prefix${instruction.id}"; | 156 return "$prefix${instruction.id}"; |
| 157 } | 157 } |
| 158 | 158 |
| 159 String visitBoolify(HBoolify node) { | 159 String visitBoolify(HBoolify node) { |
| 160 return "Boolify: ${temporaryId(node.inputs[0])}"; | 160 return "Boolify: ${temporaryId(node.inputs[0])}"; |
| 161 } | 161 } |
| 162 | 162 |
| 163 String handleInvokeBinary(HInvokeBinary node, String op) { | 163 String handleInvokeBinary(HInvokeBinary node, String opcode) { |
| 164 String left = temporaryId(node.left); | 164 String left = temporaryId(node.left); |
| 165 String right= temporaryId(node.right); | 165 String right= temporaryId(node.right); |
| 166 return '$left $op $right'; | 166 return '$opcode: $left $right'; |
| 167 } | 167 } |
| 168 | 168 |
| 169 String visitAdd(HAdd node) => handleInvokeBinary(node, '+'); | 169 String visitAdd(HAdd node) => handleInvokeBinary(node, 'Add'); |
| 170 | 170 |
| 171 String visitBitAnd(HBitAnd node) => handleInvokeBinary(node, '&'); | 171 String visitBitAnd(HBitAnd node) => handleInvokeBinary(node, 'BitAnd'); |
| 172 | 172 |
| 173 String visitBitNot(HBitNot node) { | 173 String visitBitNot(HBitNot node) { |
| 174 String operand = temporaryId(node.operand); | 174 String operand = temporaryId(node.operand); |
| 175 return "~$operand"; | 175 return "BitNot: $operand"; |
| 176 } | 176 } |
| 177 | 177 |
| 178 String visitBitOr(HBitOr node) => handleInvokeBinary(node, '|'); | 178 String visitBitOr(HBitOr node) => handleInvokeBinary(node, 'BitOr'); |
| 179 | 179 |
| 180 String visitBitXor(HBitXor node) => handleInvokeBinary(node, '^'); | 180 String visitBitXor(HBitXor node) => handleInvokeBinary(node, 'BitXor'); |
| 181 | 181 |
| 182 String visitBoundsCheck(HBoundsCheck node) { | 182 String visitBoundsCheck(HBoundsCheck node) { |
| 183 String lengthId = temporaryId(node.length); | 183 String lengthId = temporaryId(node.length); |
| 184 String indexId = temporaryId(node.index); | 184 String indexId = temporaryId(node.index); |
| 185 return "Bounds check: length = $lengthId, index = $indexId"; | 185 return "BoundsCheck: length = $lengthId, index = $indexId"; |
| 186 } | 186 } |
| 187 | 187 |
| 188 String visitBreak(HBreak node) { | 188 String visitBreak(HBreak node) { |
| 189 HBasicBlock target = currentBlock.successors[0]; | 189 HBasicBlock target = currentBlock.successors[0]; |
| 190 if (node.label != null) { | 190 if (node.label != null) { |
| 191 return "Break ${node.label.labelName}: (B${target.id})"; | 191 return "Break ${node.label.labelName}: (B${target.id})"; |
| 192 } | 192 } |
| 193 return "Break: (B${target.id})"; | 193 return "Break: (B${target.id})"; |
| 194 } | 194 } |
| 195 | 195 |
| 196 String visitConstant(HConstant constant) => "Constant ${constant.constant}"; | 196 String visitConstant(HConstant constant) => "Constant: ${constant.constant}"; |
| 197 | 197 |
| 198 String visitContinue(HContinue node) { | 198 String visitContinue(HContinue node) { |
| 199 HBasicBlock target = currentBlock.successors[0]; | 199 HBasicBlock target = currentBlock.successors[0]; |
| 200 if (node.label != null) { | 200 if (node.label != null) { |
| 201 return "Continue ${node.label.labelName}: (B${target.id})"; | 201 return "Continue ${node.label.labelName}: (B${target.id})"; |
| 202 } | 202 } |
| 203 return "Continue: (B${target.id})"; | 203 return "Continue: (B${target.id})"; |
| 204 } | 204 } |
| 205 | 205 |
| 206 String visitDivide(HDivide node) => handleInvokeBinary(node, '/'); | 206 String visitDivide(HDivide node) => handleInvokeBinary(node, 'Divide'); |
| 207 | 207 |
| 208 String visitExit(HExit node) => "exit"; | 208 String visitExit(HExit node) => "Exit"; |
| 209 | 209 |
| 210 String visitFieldGet(HFieldGet node) { | 210 String visitFieldGet(HFieldGet node) { |
| 211 if (node.isNullCheck) { | 211 if (node.isNullCheck) { |
| 212 return 'null check on ${temporaryId(node.receiver)}'; | 212 return 'FieldGet: NullCheck ${temporaryId(node.receiver)}'; |
| 213 } | 213 } |
| 214 String fieldName = node.element.name; | 214 String fieldName = node.element.name; |
| 215 return 'field get ${temporaryId(node.receiver)}.$fieldName'; | 215 return 'FieldGet: ${temporaryId(node.receiver)}.$fieldName'; |
| 216 } | 216 } |
| 217 | 217 |
| 218 String visitFieldSet(HFieldSet node) { | 218 String visitFieldSet(HFieldSet node) { |
| 219 String valueId = temporaryId(node.value); | 219 String valueId = temporaryId(node.value); |
| 220 String fieldName = node.element.name; | 220 String fieldName = node.element.name; |
| 221 return 'field set ${temporaryId(node.receiver)}.$fieldName to $valueId'; | 221 return 'FieldSet: ${temporaryId(node.receiver)}.$fieldName to $valueId'; |
| 222 } | 222 } |
| 223 | 223 |
| 224 String visitReadModifyWrite(HReadModifyWrite node) { | 224 String visitReadModifyWrite(HReadModifyWrite node) { |
| 225 String fieldName = node.element.name; | 225 String fieldName = node.element.name; |
| 226 String receiverId = temporaryId(node.receiver); | 226 String receiverId = temporaryId(node.receiver); |
| 227 String op = node.jsOp; | 227 String op = node.jsOp; |
| 228 if (node.isAssignOp) { | 228 if (node.isAssignOp) { |
| 229 String valueId = temporaryId(node.value); | 229 String valueId = temporaryId(node.value); |
| 230 return 'field-update $receiverId.$fieldName $op= $valueId'; | 230 return 'ReadModifyWrite: $receiverId.$fieldName $op= $valueId'; |
| 231 } else if (node.isPreOp) { | 231 } else if (node.isPreOp) { |
| 232 return 'field-update $op$receiverId.$fieldName'; | 232 return 'ReadModifyWrite: $op$receiverId.$fieldName'; |
| 233 } else { | 233 } else { |
| 234 return 'field-update $receiverId.$fieldName$op'; | 234 return 'ReadModifyWrite: $receiverId.$fieldName$op'; |
| 235 } | 235 } |
| 236 } | 236 } |
| 237 | 237 |
| 238 String visitLocalGet(HLocalGet node) { | 238 String visitLocalGet(HLocalGet node) { |
| 239 String localName = node.variable.name; | 239 String localName = node.variable.name; |
| 240 return 'local get ${temporaryId(node.local)}.$localName'; | 240 return 'LocalGet: ${temporaryId(node.local)}.$localName'; |
| 241 } | 241 } |
| 242 | 242 |
| 243 String visitLocalSet(HLocalSet node) { | 243 String visitLocalSet(HLocalSet node) { |
| 244 String valueId = temporaryId(node.value); | 244 String valueId = temporaryId(node.value); |
| 245 String localName = node.variable.name; | 245 String localName = node.variable.name; |
| 246 return 'local set ${temporaryId(node.local)}.$localName to $valueId'; | 246 return 'LocalSet: ${temporaryId(node.local)}.$localName to $valueId'; |
| 247 } | 247 } |
| 248 | 248 |
| 249 String visitGoto(HGoto node) { | 249 String visitGoto(HGoto node) { |
| 250 HBasicBlock target = currentBlock.successors[0]; | 250 HBasicBlock target = currentBlock.successors[0]; |
| 251 return "Goto: (B${target.id})"; | 251 return "Goto: (B${target.id})"; |
| 252 } | 252 } |
| 253 | 253 |
| 254 String visitGreater(HGreater node) => handleInvokeBinary(node, '>'); | 254 String visitGreater(HGreater node) => handleInvokeBinary(node, 'Greater'); |
| 255 String visitGreaterEqual(HGreaterEqual node) { | 255 String visitGreaterEqual(HGreaterEqual node) { |
| 256 return handleInvokeBinary(node, '>='); | 256 return handleInvokeBinary(node, 'GreaterEqual'); |
| 257 } | 257 } |
| 258 String visitIdentity(HIdentity node) => handleInvokeBinary(node, '==='); | 258 String visitIdentity(HIdentity node) => handleInvokeBinary(node, 'Identity'); |
| 259 | 259 |
| 260 String visitIf(HIf node) { | 260 String visitIf(HIf node) { |
| 261 HBasicBlock thenBlock = currentBlock.successors[0]; | 261 HBasicBlock thenBlock = currentBlock.successors[0]; |
| 262 HBasicBlock elseBlock = currentBlock.successors[1]; | 262 HBasicBlock elseBlock = currentBlock.successors[1]; |
| 263 String conditionId = temporaryId(node.inputs[0]); | 263 String conditionId = temporaryId(node.inputs[0]); |
| 264 return "If ($conditionId): (B${thenBlock.id}) else (B${elseBlock.id})"; | 264 return "If ($conditionId): (B${thenBlock.id}) else (B${elseBlock.id})"; |
| 265 } | 265 } |
| 266 | 266 |
| 267 String visitGenericInvoke(String invokeType, String functionName, | 267 String handleGenericInvoke(String invokeType, String functionName, |
| 268 List<HInstruction> arguments) { | 268 List<HInstruction> arguments) { |
| 269 StringBuffer argumentsString = new StringBuffer(); | 269 StringBuffer argumentsString = new StringBuffer(); |
| 270 for (int i = 0; i < arguments.length; i++) { | 270 for (int i = 0; i < arguments.length; i++) { |
| 271 if (i != 0) argumentsString.write(", "); | 271 if (i != 0) argumentsString.write(", "); |
| 272 argumentsString.write(temporaryId(arguments[i])); | 272 argumentsString.write(temporaryId(arguments[i])); |
| 273 } | 273 } |
| 274 return "$invokeType: $functionName($argumentsString)"; | 274 return "$invokeType: $functionName($argumentsString)"; |
| 275 } | 275 } |
| 276 | 276 |
| 277 String visitIndex(HIndex node) { | 277 String visitIndex(HIndex node) { |
| 278 String receiver = temporaryId(node.receiver); | 278 String receiver = temporaryId(node.receiver); |
| 279 String index = temporaryId(node.index); | 279 String index = temporaryId(node.index); |
| 280 return "Index: $receiver[$index]"; | 280 return "Index: $receiver[$index]"; |
| 281 } | 281 } |
| 282 | 282 |
| 283 String visitIndexAssign(HIndexAssign node) { | 283 String visitIndexAssign(HIndexAssign node) { |
| 284 String receiver = temporaryId(node.receiver); | 284 String receiver = temporaryId(node.receiver); |
| 285 String index = temporaryId(node.index); | 285 String index = temporaryId(node.index); |
| 286 String value = temporaryId(node.value); | 286 String value = temporaryId(node.value); |
| 287 return "IndexAssign: $receiver[$index] = $value"; | 287 return "IndexAssign: $receiver[$index] = $value"; |
| 288 } | 288 } |
| 289 | 289 |
| 290 String visitInterceptor(HInterceptor node) { | 290 String visitInterceptor(HInterceptor node) { |
| 291 String value = temporaryId(node.inputs[0]); | 291 String value = temporaryId(node.inputs[0]); |
| 292 if (node.interceptedClasses != null) { | 292 if (node.interceptedClasses != null) { |
| 293 JavaScriptBackend backend = compiler.backend; | 293 JavaScriptBackend backend = compiler.backend; |
| 294 String cls = | 294 String cls = |
| 295 backend.namer.suffixForGetInterceptor(node.interceptedClasses); | 295 backend.namer.suffixForGetInterceptor(node.interceptedClasses); |
| 296 return "Intercept ($cls): $value"; | 296 return "Interceptor ($cls): $value"; |
| 297 } | 297 } |
| 298 return "Intercept: $value"; | 298 return "Interceptor: $value"; |
| 299 } | 299 } |
| 300 | 300 |
| 301 String visitInvokeClosure(HInvokeClosure node) | 301 String visitInvokeClosure(HInvokeClosure node) |
| 302 => visitInvokeDynamic(node, "closure"); | 302 => handleInvokeDynamic(node, "InvokeClosure"); |
| 303 | 303 |
| 304 String visitInvokeDynamic(HInvokeDynamic invoke, String kind) { | 304 String handleInvokeDynamic(HInvokeDynamic invoke, String kind) { |
| 305 String receiver = temporaryId(invoke.receiver); | 305 String receiver = temporaryId(invoke.receiver); |
| 306 String name = invoke.selector.name; | 306 String name = invoke.selector.name; |
| 307 String target = "($kind) $receiver.$name"; | 307 String target = "$receiver.$name"; |
| 308 int offset = HInvoke.ARGUMENTS_OFFSET; | 308 int offset = HInvoke.ARGUMENTS_OFFSET; |
| 309 List arguments = invoke.inputs.sublist(offset); | 309 List arguments = invoke.inputs.sublist(offset); |
| 310 return visitGenericInvoke("Invoke", target, arguments) + | 310 return handleGenericInvoke(kind, target, arguments) + |
| 311 "(${invoke.mask})"; | 311 "(${invoke.mask})"; |
| 312 } | 312 } |
| 313 | 313 |
| 314 String visitInvokeDynamicMethod(HInvokeDynamicMethod node) | 314 String visitInvokeDynamicMethod(HInvokeDynamicMethod node) |
| 315 => visitInvokeDynamic(node, "method"); | 315 => handleInvokeDynamic(node, "InvokeDynamicMethod"); |
| 316 String visitInvokeDynamicGetter(HInvokeDynamicGetter node) | 316 String visitInvokeDynamicGetter(HInvokeDynamicGetter node) |
| 317 => visitInvokeDynamic(node, "get"); | 317 => handleInvokeDynamic(node, "InvokeDynamicGetter"); |
| 318 String visitInvokeDynamicSetter(HInvokeDynamicSetter node) | 318 String visitInvokeDynamicSetter(HInvokeDynamicSetter node) |
| 319 => visitInvokeDynamic(node, "set"); | 319 => handleInvokeDynamic(node, "InvokeDynamicSetter"); |
| 320 | 320 |
| 321 String visitInvokeStatic(HInvokeStatic invoke) { | 321 String visitInvokeStatic(HInvokeStatic invoke) { |
| 322 String target = invoke.element.name; | 322 String target = invoke.element.name; |
| 323 return visitGenericInvoke("Invoke", target, invoke.inputs); | 323 return handleGenericInvoke("InvokeStatic", target, invoke.inputs); |
| 324 } | 324 } |
| 325 | 325 |
| 326 String visitInvokeSuper(HInvokeSuper invoke) { | 326 String visitInvokeSuper(HInvokeSuper invoke) { |
| 327 String target = invoke.element.name; | 327 String target = invoke.element.name; |
| 328 return visitGenericInvoke("Invoke super", target, invoke.inputs); | 328 return handleGenericInvoke("InvokeSuper", target, invoke.inputs); |
| 329 } | 329 } |
| 330 | 330 |
| 331 String visitInvokeConstructorBody(HInvokeConstructorBody invoke) { | 331 String visitInvokeConstructorBody(HInvokeConstructorBody invoke) { |
| 332 String target = invoke.element.name; | 332 String target = invoke.element.name; |
| 333 return visitGenericInvoke("Invoke constructor body", target, invoke.inputs); | 333 return handleGenericInvoke("InvokeConstructorBody", target, invoke.inputs); |
| 334 } | 334 } |
| 335 | 335 |
| 336 String visitForeignCode(HForeignCode foreign) { | 336 String visitForeignCode(HForeignCode foreign) { |
| 337 return visitGenericInvoke("Foreign", "${foreign.codeTemplate.ast}", | 337 return handleGenericInvoke("ForeignCode", "${foreign.codeTemplate.ast}", |
| 338 foreign.inputs); | 338 foreign.inputs); |
| 339 } | 339 } |
| 340 | 340 |
| 341 String visitForeignNew(HForeignNew node) { | 341 String visitForeignNew(HForeignNew node) { |
| 342 return visitGenericInvoke("New", | 342 return handleGenericInvoke("ForeignNew", |
| 343 "${node.element.name}", | 343 "${node.element.name}", |
| 344 node.inputs); | 344 node.inputs); |
| 345 } | 345 } |
| 346 | 346 |
| 347 String visitLess(HLess node) => handleInvokeBinary(node, '<'); | 347 String visitLess(HLess node) => handleInvokeBinary(node, 'Less'); |
| 348 String visitLessEqual(HLessEqual node) => handleInvokeBinary(node, '<='); | 348 String visitLessEqual(HLessEqual node) => |
| 349 handleInvokeBinary(node, 'LessEqual'); |
| 349 | 350 |
| 350 String visitLiteralList(HLiteralList node) { | 351 String visitLiteralList(HLiteralList node) { |
| 351 StringBuffer elementsString = new StringBuffer(); | 352 StringBuffer elementsString = new StringBuffer(); |
| 352 for (int i = 0; i < node.inputs.length; i++) { | 353 for (int i = 0; i < node.inputs.length; i++) { |
| 353 if (i != 0) elementsString.write(", "); | 354 if (i != 0) elementsString.write(", "); |
| 354 elementsString.write(temporaryId(node.inputs[i])); | 355 elementsString.write(temporaryId(node.inputs[i])); |
| 355 } | 356 } |
| 356 return "Literal list: [$elementsString]"; | 357 return "LiteralList: [$elementsString]"; |
| 357 } | 358 } |
| 358 | 359 |
| 359 String visitLoopBranch(HLoopBranch branch) { | 360 String visitLoopBranch(HLoopBranch branch) { |
| 360 HBasicBlock bodyBlock = currentBlock.successors[0]; | 361 HBasicBlock bodyBlock = currentBlock.successors[0]; |
| 361 HBasicBlock exitBlock = currentBlock.successors[1]; | 362 HBasicBlock exitBlock = currentBlock.successors[1]; |
| 362 String conditionId = temporaryId(branch.inputs[0]); | 363 String conditionId = temporaryId(branch.inputs[0]); |
| 363 return "While ($conditionId): (B${bodyBlock.id}) then (B${exitBlock.id})"; | 364 return |
| 365 "LoopBranch ($conditionId): (B${bodyBlock.id}) then (B${exitBlock.id})"; |
| 364 } | 366 } |
| 365 | 367 |
| 366 String visitMultiply(HMultiply node) => handleInvokeBinary(node, '*'); | 368 String visitMultiply(HMultiply node) => handleInvokeBinary(node, 'Multiply'); |
| 367 | 369 |
| 368 String visitNegate(HNegate node) { | 370 String visitNegate(HNegate node) { |
| 369 String operand = temporaryId(node.operand); | 371 String operand = temporaryId(node.operand); |
| 370 return "-$operand"; | 372 return "Negate: $operand"; |
| 371 } | 373 } |
| 372 | 374 |
| 373 String visitNot(HNot node) => "Not: ${temporaryId(node.inputs[0])}"; | 375 String visitNot(HNot node) => "Not: ${temporaryId(node.inputs[0])}"; |
| 374 | 376 |
| 375 String visitParameterValue(HParameterValue node) { | 377 String visitParameterValue(HParameterValue node) { |
| 376 return "p${node.sourceElement.name}"; | 378 return "ParameterValue: ${node.sourceElement.name}"; |
| 377 } | 379 } |
| 378 | 380 |
| 379 String visitLocalValue(HLocalValue node) { | 381 String visitLocalValue(HLocalValue node) { |
| 380 return "l${node.sourceElement.name}"; | 382 return "LocalValue: ${node.sourceElement.name}"; |
| 381 } | 383 } |
| 382 | 384 |
| 383 String visitPhi(HPhi phi) { | 385 String visitPhi(HPhi phi) { |
| 384 StringBuffer buffer = new StringBuffer(); | 386 StringBuffer buffer = new StringBuffer(); |
| 385 buffer.write("Phi("); | 387 buffer.write("Phi: "); |
| 386 for (int i = 0; i < phi.inputs.length; i++) { | 388 for (int i = 0; i < phi.inputs.length; i++) { |
| 387 if (i > 0) buffer.write(", "); | 389 if (i > 0) buffer.write(", "); |
| 388 buffer.write(temporaryId(phi.inputs[i])); | 390 buffer.write(temporaryId(phi.inputs[i])); |
| 389 } | 391 } |
| 390 buffer.write(")"); | |
| 391 return buffer.toString(); | 392 return buffer.toString(); |
| 392 } | 393 } |
| 393 | 394 |
| 394 String visitRef(HRef node) { | 395 String visitRef(HRef node) { |
| 395 return 'Ref ${temporaryId(node.value)}'; | 396 return 'Ref: ${temporaryId(node.value)}'; |
| 396 } | 397 } |
| 397 | 398 |
| 398 String visitReturn(HReturn node) => "Return ${temporaryId(node.inputs[0])}"; | 399 String visitReturn(HReturn node) => "Return: ${temporaryId(node.inputs[0])}"; |
| 399 | 400 |
| 400 String visitShiftLeft(HShiftLeft node) => handleInvokeBinary(node, '<<'); | 401 String visitShiftLeft(HShiftLeft node) => |
| 401 String visitShiftRight(HShiftRight node) => handleInvokeBinary(node, '>>'); | 402 handleInvokeBinary(node, 'ShiftLeft'); |
| 403 String visitShiftRight(HShiftRight node) => |
| 404 handleInvokeBinary(node, 'ShiftRight'); |
| 402 | 405 |
| 403 String visitStatic(HStatic node) | 406 String visitStatic(HStatic node) |
| 404 => "Static ${node.element.name}"; | 407 => "Static: ${node.element.name}"; |
| 405 | 408 |
| 406 String visitLazyStatic(HLazyStatic node) | 409 String visitLazyStatic(HLazyStatic node) |
| 407 => "LazyStatic ${node.element.name}"; | 410 => "LazyStatic: ${node.element.name}"; |
| 408 | 411 |
| 409 String visitOneShotInterceptor(HOneShotInterceptor node) | 412 String visitOneShotInterceptor(HOneShotInterceptor node) |
| 410 => visitInvokeDynamic(node, "one shot interceptor"); | 413 => handleInvokeDynamic(node, "OneShotInterceptor"); |
| 411 | 414 |
| 412 String visitStaticStore(HStaticStore node) { | 415 String visitStaticStore(HStaticStore node) { |
| 413 String lhs = node.element.name; | 416 String lhs = node.element.name; |
| 414 return "Static $lhs = ${temporaryId(node.inputs[0])}"; | 417 return "StaticStore: $lhs = ${temporaryId(node.inputs[0])}"; |
| 415 } | 418 } |
| 416 | 419 |
| 417 String visitStringConcat(HStringConcat node) { | 420 String visitStringConcat(HStringConcat node) { |
| 418 var leftId = temporaryId(node.left); | 421 var leftId = temporaryId(node.left); |
| 419 var rightId = temporaryId(node.right); | 422 var rightId = temporaryId(node.right); |
| 420 return "StringConcat: $leftId + $rightId"; | 423 return "StringConcat: $leftId + $rightId"; |
| 421 } | 424 } |
| 422 | 425 |
| 423 String visitStringify(HStringify node) { | 426 String visitStringify(HStringify node) { |
| 424 return "Stringify ${temporaryId(node.inputs[0])}"; | 427 return "Stringify: ${temporaryId(node.inputs[0])}"; |
| 425 } | 428 } |
| 426 | 429 |
| 427 String visitSubtract(HSubtract node) => handleInvokeBinary(node, '-'); | 430 String visitSubtract(HSubtract node) => handleInvokeBinary(node, 'Subtract'); |
| 428 | 431 |
| 429 String visitSwitch(HSwitch node) { | 432 String visitSwitch(HSwitch node) { |
| 430 StringBuffer buf = new StringBuffer(); | 433 StringBuffer buf = new StringBuffer(); |
| 431 buf.write("Switch: ("); | 434 buf.write("Switch: ("); |
| 432 buf.write(temporaryId(node.inputs[0])); | 435 buf.write(temporaryId(node.inputs[0])); |
| 433 buf.write(") "); | 436 buf.write(") "); |
| 434 for (int i = 1; i < node.inputs.length; i++) { | 437 for (int i = 1; i < node.inputs.length; i++) { |
| 435 buf.write(temporaryId(node.inputs[i])); | 438 buf.write(temporaryId(node.inputs[i])); |
| 436 buf.write(": B"); | 439 buf.write(": B"); |
| 437 buf.write(node.block.successors[i - 1].id); | 440 buf.write(node.block.successors[i - 1].id); |
| 438 buf.write(", "); | 441 buf.write(", "); |
| 439 } | 442 } |
| 440 buf.write("default: B"); | 443 buf.write("default: B"); |
| 441 buf.write(node.defaultTarget.id); | 444 buf.write(node.defaultTarget.id); |
| 442 return buf.toString(); | 445 return buf.toString(); |
| 443 } | 446 } |
| 444 | 447 |
| 445 String visitThis(HThis node) => "this"; | 448 String visitThis(HThis node) => "This"; |
| 446 | 449 |
| 447 String visitThrow(HThrow node) => "Throw ${temporaryId(node.inputs[0])}"; | 450 String visitThrow(HThrow node) => "Throw: ${temporaryId(node.inputs[0])}"; |
| 448 | 451 |
| 449 String visitThrowExpression(HThrowExpression node) { | 452 String visitThrowExpression(HThrowExpression node) { |
| 450 return "ThrowExpression ${temporaryId(node.inputs[0])}"; | 453 return "ThrowExpression: ${temporaryId(node.inputs[0])}"; |
| 451 } | 454 } |
| 452 | 455 |
| 453 String visitTruncatingDivide(HTruncatingDivide node) { | 456 String visitTruncatingDivide(HTruncatingDivide node) { |
| 454 return handleInvokeBinary(node, '~/'); | 457 return handleInvokeBinary(node, 'TruncatingDivide'); |
| 455 } | 458 } |
| 456 | 459 |
| 457 String visitExitTry(HExitTry node) { | 460 String visitExitTry(HExitTry node) { |
| 458 return "Exit try"; | 461 return "ExitTry"; |
| 459 } | 462 } |
| 460 | 463 |
| 461 String visitTry(HTry node) { | 464 String visitTry(HTry node) { |
| 462 List<HBasicBlock> successors = currentBlock.successors; | 465 List<HBasicBlock> successors = currentBlock.successors; |
| 463 String tryBlock = 'B${successors[0].id}'; | 466 String tryBlock = 'B${successors[0].id}'; |
| 464 String catchBlock = 'none'; | 467 String catchBlock = 'none'; |
| 465 if (node.catchBlock != null) { | 468 if (node.catchBlock != null) { |
| 466 catchBlock = 'B${successors[1].id}'; | 469 catchBlock = 'B${successors[1].id}'; |
| 467 } | 470 } |
| 468 | 471 |
| 469 String finallyBlock = 'none'; | 472 String finallyBlock = 'none'; |
| 470 if (node.finallyBlock != null) { | 473 if (node.finallyBlock != null) { |
| 471 finallyBlock = 'B${node.finallyBlock.id}'; | 474 finallyBlock = 'B${node.finallyBlock.id}'; |
| 472 } | 475 } |
| 473 | 476 |
| 474 return "Try: $tryBlock, Catch: $catchBlock, Finally: $finallyBlock, " | 477 return "Try: $tryBlock, Catch: $catchBlock, Finally: $finallyBlock, " |
| 475 "Join: B${successors.last.id}"; | 478 "Join: B${successors.last.id}"; |
| 476 } | 479 } |
| 477 | 480 |
| 478 String visitIs(HIs node) { | 481 String visitIs(HIs node) { |
| 479 String type = node.typeExpression.toString(); | 482 String type = node.typeExpression.toString(); |
| 480 return "TypeTest: ${temporaryId(node.expression)} is $type"; | 483 return "Is: ${temporaryId(node.expression)} is $type"; |
| 481 } | 484 } |
| 482 | 485 |
| 483 String visitIsViaInterceptor(HIsViaInterceptor node) { | 486 String visitIsViaInterceptor(HIsViaInterceptor node) { |
| 484 String type = node.typeExpression.toString(); | 487 String type = node.typeExpression.toString(); |
| 485 return "TypeTest: ${temporaryId(node.inputs[0])} is $type"; | 488 return "IsViaInterceptor: ${temporaryId(node.inputs[0])} is $type"; |
| 486 } | 489 } |
| 487 | 490 |
| 488 String visitTypeConversion(HTypeConversion node) { | 491 String visitTypeConversion(HTypeConversion node) { |
| 489 assert(node.inputs.length <= 2); | 492 assert(node.inputs.length <= 2); |
| 490 String otherInput = (node.inputs.length == 2) | 493 String otherInput = (node.inputs.length == 2) |
| 491 ? temporaryId(node.inputs[1]) | 494 ? temporaryId(node.inputs[1]) |
| 492 : ''; | 495 : ''; |
| 493 return "TypeConversion: ${temporaryId(node.checkedInput)} to " | 496 return "TypeConversion: ${temporaryId(node.checkedInput)} to " |
| 494 "${node.instructionType} $otherInput"; | 497 "${node.instructionType} $otherInput"; |
| 495 } | 498 } |
| (...skipping 26 matching lines...) Expand all Loading... |
| 522 | 525 |
| 523 String visitInterfaceType(HInterfaceType node) { | 526 String visitInterfaceType(HInterfaceType node) { |
| 524 return "InterfaceType: ${node.dartType}"; | 527 return "InterfaceType: ${node.dartType}"; |
| 525 } | 528 } |
| 526 | 529 |
| 527 String visitDynamicType(HDynamicType node) { | 530 String visitDynamicType(HDynamicType node) { |
| 528 return "DynamicType"; | 531 return "DynamicType"; |
| 529 } | 532 } |
| 530 | 533 |
| 531 String visitAwait(HAwait node) { | 534 String visitAwait(HAwait node) { |
| 532 return "await ${temporaryId(node.inputs[0])}"; | 535 return "Await: ${temporaryId(node.inputs[0])}"; |
| 533 } | 536 } |
| 534 | 537 |
| 535 String visitYield(HYield node) { | 538 String visitYield(HYield node) { |
| 536 return "yield${node.hasStar ? "*" : ""} ${temporaryId(node.inputs[0])}"; | 539 return "Yield${node.hasStar ? "*" : ""}: ${temporaryId(node.inputs[0])}"; |
| 537 } | 540 } |
| 538 } | 541 } |
| OLD | NEW |