public override string GetCLRParamTypeName(DefParam param) { if (IsVoid) { string name = "void"; if (param.IsConst) name = "const " + name; switch (param.PassedByType) { case PassedByType.Value: break; case PassedByType.Pointer: name += "*"; break; case PassedByType.PointerPointer: name += "*%"; break; case PassedByType.Reference: throw new Exception("Unexpected"); } return name; } switch (param.PassedByType) { case PassedByType.Value: return Name; case PassedByType.Reference: case PassedByType.Pointer: if (!param.IsConst && !param.HasAttribute<RawPointerParamAttribute>()) { return "[Out] " + Name + "%"; } else { //Treat it as array //return "array<" + FullCLRName + ">^"; string name = Name + "*"; if (param.IsConst) name = "const " + name; return name; } case PassedByType.PointerPointer: default: throw new Exception("Unexpected"); } }
public override string GetPreCallParamConversion(DefParam param, out string newname) { if (IsVoid) { newname = param.Name; return ""; } switch (param.PassedByType) { case PassedByType.Reference: newname = "*p_" + param.Name; return "pin_ptr<" + FullCLRName + "> p_" + param.Name + " = &" + param.Name + ";\n"; case PassedByType.Pointer: if (!param.IsConst && !param.HasAttribute<RawPointerParamAttribute>()) { newname = "p_" + param.Name; return "pin_ptr<" + FullCLRName + "> p_" + param.Name + " = &" + param.Name + ";\n"; } else { //Treat it as array //newname = "arr_" + param.Name; //string expr = FullNativeName + "* arr_" + param.Name + " = new " + FullNativeName + "[" + param.Name + "->Length];\n"; //expr += "pin_ptr<" + FullCLRName + "> src_" + param.Name + " = &" + param.Name + "[0];\n"; //expr += "memcpy(arr_" + param.Name + ", src_" + param.Name + ", " + param.Name + "->Length * sizeof(" + FullNativeName + "));\n"; //return expr; newname = param.Name; return ""; } default: return base.GetPreCallParamConversion(param, out newname); } }