anchor.diff:      return handleGenericInvoke("InvokeConstructorBody", target, invoke.inputs);
     }
   
  -  String visitForeignCode(HForeignCode foreign) {
  -    return handleGenericInvoke(
  -        "ForeignCode", "${foreign.codeTemplate.ast}", foreign.inputs);
  +  String visitForeignCode(HForeignCode node) {
  +    var template = node.codeTemplate;
  +    String code = '${template.ast}';
  +    var inputs = node.inputs.map(temporaryId).join(', ');
  +    return "ForeignCode: $code ($inputs)";
     }
   
     String visitLess(HLess node) => handleInvokeBinary(node, 'Less');
  
positive.code:   }
  
    String visitTypeInfoReadRaw(HTypeInfoReadRaw node) {
      return "TypeInfoReadRaw";
    }
  
    String visitTypeInfoReadVariable(HTypeInfoReadVariable node) {
      return "TypeInfoReadVariable ${node.variable}";
    }
  
    String visitTypeInfoExpression(HTypeInfoExpression node) {
      return "TypeInfoExpression ${node.kindAsString} ${node.dartType}";
    }
  
    String visitReadTypeVariable(HReadTypeVariable node) {
      return "ReadTypeVariable: ${node.dartType} ${node.hasReceiver}";
    }
  
    String visitFunctionType(HFunctionType node) {
      return "FunctionType: ${node.dartType}";
    }
  
    String visitVoidType(HVoidType node) {
  
negative.code:   }
  
    String visitTypeConversion(HTypeConversion node) {
      String checkedInput = temporaryId(node.checkedInput);
      String rest;
      if (node.usesMethodOnType) {
        assert(node.inputs.length == 2);
        assert(identical(node.checkedInput, node.inputs.last));
        rest = " ${temporaryId(node.inputs.first)}";
      } else if (node.inputs.length == 2) {
        rest = " ${temporaryId(node.inputs.last)}";
      } else {
        assert(node.inputs.length == 1);
        rest = "";
      }
      return "TypeConversion: $checkedInput to ${node.instructionType}$rest";
    }
  
    String visitTypeKnown(HTypeKnown node) {
  