protected override object VisitCallIndirect(Variable dest, Variable callee, Variable receiver, Variable[] arguments, FunctionPointer fp, Statement stat, object arg)
 {
   // don't do anything here, since this is not verifiable code
   return arg;
 }
Example #2
0
 public static FunctionPointer/*!*/ For(TypeNodeList/*!*/ parameterTypes, TypeNode/*!*/ returnType)
 {
     Module mod = returnType.DeclaringModule;
     if(mod == null) { Debug.Fail(""); mod = new Module(); }
     StringBuilder sb = new StringBuilder("function pointer ");
     sb.Append(returnType.FullName);
     sb.Append('(');
     for(int i = 0, n = parameterTypes == null ? 0 : parameterTypes.Count; i < n; i++)
     {
         TypeNode type = parameterTypes[i];
         if(type == null)
             continue;
         if(i != 0)
             sb.Append(',');
         sb.Append(type.FullName);
     }
     sb.Append(')');
     Identifier name = Identifier.For(sb.ToString());
     TypeNode t = mod.GetStructurallyEquivalentType(returnType.Namespace, name);
     int counter = 1;
     while(t != null)
     {
         FunctionPointer fp = t as FunctionPointer;
         if(fp != null)
         {
             if(fp.ReturnType == returnType && FunctionPointer.ParameterTypesAreEquivalent(fp.ParameterTypes, parameterTypes))
                 return fp;
         }
         name = Identifier.For(name.ToString() + counter++);
         t = mod.GetStructurallyEquivalentType(returnType.Namespace, name);
     }
     FunctionPointer result = t as FunctionPointer;
     if(result == null)
     {
         result = new FunctionPointer(parameterTypes, returnType, name);
         result.DeclaringModule = mod;
         mod.StructurallyEquivalentType[name.UniqueIdKey] = result;
     }
     return result;
 }