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; }
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; }