/* generate the code that calls the C++ method */ static void vtkWrapPython_GenerateMethodCall( FILE *fp, FunctionInfo *currentFunction, ClassInfo *data, HierarchyInfo *hinfo, int is_vtkobject) { char methodname[256]; ValueInfo *arg; int totalArgs; int is_constructor; int i, k, n; totalArgs = vtkWrap_CountWrappedParameters(currentFunction); is_constructor = vtkWrap_IsConstructor(data, currentFunction); /* for vtkobjects, do a bound call and an unbound call */ n = 1; if (is_vtkobject && !currentFunction->IsStatic && !currentFunction->IsPureVirtual && !is_constructor) { n = 2; } if (!is_constructor && !vtkWrap_IsVoid(currentFunction->ReturnValue)) { /* temp variable for C++-type return value */ fprintf(fp, " "); vtkWrap_DeclareVariable(fp, data, currentFunction->ReturnValue, "tempr", -1, VTK_WRAP_RETURN | VTK_WRAP_NOSEMI); fprintf(fp, " ="); } /* handle both bound and unbound calls */ if (n == 2) { if (!is_constructor && !vtkWrap_IsVoid(currentFunction->ReturnValue)) { fprintf(fp, " (ap.IsBound() ?\n" " "); } else { fprintf(fp, " if (ap.IsBound())\n" " {\n" " "); } } /* print the code that calls the method */ for (k = 0; k < n; k++) { if (k == 1) { /* unbound method call */ sprintf(methodname, "op->%s::%s", data->Name, currentFunction->Name); } else if (currentFunction->IsStatic) { /* static method call */ sprintf(methodname, "%s::%s", data->Name, currentFunction->Name); } else if (is_constructor) { /* constructor call */ sprintf(methodname, "new %s", currentFunction->Name); } else { /* standard bound method call */ sprintf(methodname, "op->%s", currentFunction->Name); } if (is_constructor) { fprintf(fp, " %s *op = new %s(", data->Name, data->Name); } else if (vtkWrap_IsVoid(currentFunction->ReturnValue)) { fprintf(fp, " %s(", methodname); } else if (vtkWrap_IsRef(currentFunction->ReturnValue)) { fprintf(fp, " &%s(", methodname); } else { fprintf(fp, " %s(", methodname); } /* print all the arguments in the call */ for (i = 0; i < totalArgs; i++) { arg = currentFunction->Parameters[i]; if (vtkWrap_IsFunction(arg)) { fprintf(fp,"\n" " (temp%d == Py_None ? NULL : vtkPythonVoidFunc),\n" " (temp%d == Py_None ? NULL : temp%d));\n", i, i, i); fprintf(fp, " if (temp%d != Py_None)\n" " {\n" " Py_INCREF(temp%d);\n" " }\n" " %sArgDelete(\n" " (temp%d == Py_None ? NULL : vtkPythonVoidFuncArgDelete)", i, i, methodname, i); break; } if (i) { fprintf(fp,", "); } if ((vtkWrap_IsSpecialObject(arg) || vtkWrap_IsQtObject(arg)) && !vtkWrap_IsPointer(arg)) { fprintf(fp, "*temp%i", i); } else { fprintf(fp, "temp%i", i); } } fprintf(fp, ")"); /* handle ternary operator for ap.IsBound() */ if (n == 2) { if (!is_constructor && !vtkWrap_IsVoid(currentFunction->ReturnValue)) { fprintf(fp, (k == 0 ? " :\n " : ");\n")); } else if (k == 0) { fprintf(fp, ";\n" " }\n" " else\n" " {\n" " "); } else { fprintf(fp, ";\n" " }\n"); } } else { fprintf(fp, ";\n"); } } if (is_constructor) { /* initialize tuples created with default constructor */ if (currentFunction->NumberOfParameters == 0 && hinfo) { n = vtkWrap_GetTupleSize(data, hinfo); for (i = 0; i < n; i++) { fprintf(fp, " (*op)[%d] = 0;\n", i); } } } fprintf(fp, "\n"); }
/* Convert values into python object and return them within python */ void vtkWrapPython_ReturnValue( FILE *fp, ClassInfo *data, ValueInfo *val, int static_call) { char pythonname[1024]; const char *deref = ""; const char *prefix = "ap."; if (static_call) { prefix = "vtkPythonArgs::"; fprintf(fp, " if (PyErr_Occurred() == NULL)\n" " {\n"); } else { fprintf(fp, " if (!ap.ErrorOccurred())\n" " {\n"); } if (val && vtkWrap_IsRef(val)) { deref = "*"; } if (vtkWrap_IsVoid(val)) { fprintf(fp, " result = %sBuildNone();\n", prefix); } else if (vtkWrap_IsEnumMember(data, val)) { fprintf(fp, " result = Py%s_%s_FromEnum(tempr);\n", data->Name, val->Class); } else if (vtkWrap_IsPythonObject(val)) { fprintf(fp, " result = tempr;\n"); } else if (vtkWrap_IsVTKObject(val)) { fprintf(fp, " result = %sBuildVTKObject(tempr);\n", prefix); if (vtkWrap_IsNewInstance(val)) { fprintf(fp, " if (result && PyVTKObject_Check(result))\n" " {\n" " PyVTKObject_GetObject(result)->UnRegister(0);\n" " PyVTKObject_SetFlag(result, VTK_PYTHON_IGNORE_UNREGISTER, 1);\n" " }\n"); } } else if (vtkWrap_IsSpecialObject(val) && vtkWrap_IsRef(val)) { vtkWrapText_PythonName(val->Class, pythonname); fprintf(fp, " result = %sBuildSpecialObject(tempr, \"%s\");\n", prefix, pythonname); } else if (vtkWrap_IsSpecialObject(val) && !vtkWrap_IsRef(val)) { vtkWrapText_PythonName(val->Class, pythonname); fprintf(fp, " result = %sBuildSpecialObject(&tempr, \"%s\");\n", prefix, pythonname); } else if (vtkWrap_IsQtObject(val) && (vtkWrap_IsRef(val) || vtkWrap_IsPointer(val))) { fprintf(fp, " result = %sBuildSIPObject(tempr, \"%s\", false);\n", prefix, val->Class); } else if (vtkWrap_IsQtObject(val) && !vtkWrap_IsRef(val) && !vtkWrap_IsPointer(val)) { fprintf(fp, " result = %sBuildSIPObject(new %s(tempr), \"%s\", false);\n", prefix, val->Class, val->Class); } else if (vtkWrap_IsQtEnum(val)) { fprintf(fp, " result = %sBuildSIPEnumValue(tempr, \"%s\");\n", prefix, val->Class); } else if (vtkWrap_IsCharPointer(val)) { fprintf(fp, " result = %sBuildValue(tempr);\n", prefix); } else if (vtkWrap_IsVoidPointer(val)) { fprintf(fp, " result = %sBuildValue(tempr);\n", prefix); } else if (vtkWrap_IsChar(val) && vtkWrap_IsArray(val)) { fprintf(fp, " result = %sBuildBytes(tempr, sizer);\n", prefix); } else if (vtkWrap_IsArray(val)) { fprintf(fp, " result = %sBuildTuple(tempr, sizer);\n", prefix); } else { fprintf(fp, " result = %sBuildValue(%stempr);\n", prefix, deref); } fprintf(fp, " }\n"); }
void vtkWrap_DeclareVariable( FILE *fp, ValueInfo *val, const char *name, int i, int flags) { unsigned int aType; int j; if (val == NULL) { return; } aType = (val->Type & VTK_PARSE_UNQUALIFIED_TYPE); /* do nothing for void */ if (aType == VTK_PARSE_VOID || (aType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_FUNCTION) { return; } /* add a couple spaces */ fprintf(fp," "); /* for const * return types, prepend with const */ if ((flags & VTK_WRAP_RETURN) != 0) { if ((val->Type & VTK_PARSE_CONST) != 0 && (aType & VTK_PARSE_INDIRECT) != 0) { fprintf(fp,"const "); } } /* do the same for "const char *" with initializer */ else { if ((val->Type & VTK_PARSE_CONST) != 0 && aType == VTK_PARSE_CHAR_PTR && val->Value && strcmp(val->Value, "0") != 0 && strcmp(val->Value, "NULL") != 0) { fprintf(fp,"const "); } } /* print the type name */ fprintf(fp, "%s ", vtkWrap_GetTypeName(val)); /* indirection */ if ((flags & VTK_WRAP_RETURN) != 0) { /* ref and pointer return values are stored as pointers */ if ((aType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER || (aType & VTK_PARSE_INDIRECT) == VTK_PARSE_REF) { fprintf(fp, "*"); } } else { /* objects refs and pointers are always handled via pointers, * other refs are passed by value */ if (aType == VTK_PARSE_CHAR_PTR || aType == VTK_PARSE_VOID_PTR || aType == VTK_PARSE_OBJECT_PTR || aType == VTK_PARSE_OBJECT_REF || aType == VTK_PARSE_OBJECT || vtkWrap_IsQtObject(val)) { fprintf(fp, "*"); } /* arrays of unknown size are handled via pointers */ else if (val->CountHint || vtkWrap_IsPODPointer(val)) { fprintf(fp, "*"); } } /* the variable name */ if (i >= 0) { fprintf(fp,"%s%i", name, i); } else { fprintf(fp,"%s", name); } if ((flags & VTK_WRAP_ARG) != 0) { /* print the array decorators */ if (((aType & VTK_PARSE_POINTER_MASK) != 0) && aType != VTK_PARSE_CHAR_PTR && aType != VTK_PARSE_VOID_PTR && aType != VTK_PARSE_OBJECT_PTR && !vtkWrap_IsQtObject(val) && val->CountHint == NULL && !vtkWrap_IsPODPointer(val)) { if (val->NumberOfDimensions == 1 && val->Count > 0) { fprintf(fp, "[%d]", val->Count); } else { for (j = 0; j < val->NumberOfDimensions; j++) { fprintf(fp, "[%s]", val->Dimensions[j]); } } } /* add a default value */ else if (val->Value) { fprintf(fp, " = %s", val->Value); } else if (aType == VTK_PARSE_CHAR_PTR || aType == VTK_PARSE_VOID_PTR || aType == VTK_PARSE_OBJECT_PTR || aType == VTK_PARSE_OBJECT_REF || aType == VTK_PARSE_OBJECT || vtkWrap_IsQtObject(val)) { fprintf(fp, " = NULL"); } else if (val->CountHint || vtkWrap_IsPODPointer(val)) { fprintf(fp, " = NULL"); } else if (aType == VTK_PARSE_BOOL) { fprintf(fp, " = false"); } } /* finish off with a semicolon */ if ((flags & VTK_WRAP_NOSEMI) == 0) { fprintf(fp, ";\n"); } }
/* Write the code to convert one argument with vtkPythonArgs */ void vtkWrapPython_GetSingleArgument( FILE *fp, ClassInfo *data, int i, ValueInfo *arg, int static_call) { const char *prefix = "ap."; const char *cp; char argname[32]; char pythonname[1024]; size_t l; argname[0] = '\0'; if (static_call) { prefix = "vtkPythonArgs::"; sprintf(argname, "arg%d, ", i); } if (vtkWrap_IsEnumMember(data, arg)) { fprintf(fp, "%sGetEnumValue(%stemp%d, \"%s.%s\")", prefix, argname, i, data->Name, arg->Class); } else if (arg->IsEnum) { cp = arg->Class; for (l = 0; cp[l] != '\0'; l++) { if (cp[l] == ':') { break; } } if (cp[l] == ':' && cp[l+1] == ':') { fprintf(fp, "%sGetEnumValue(%stemp%d, \"%*.*s.%s\")", prefix, argname, i, (int)l, (int)l, cp, &cp[l+2]); } else { fprintf(fp, "%sGetEnumValue(%stemp%d, \"%s\")", prefix, argname, i, cp); } } else if (vtkWrap_IsPythonObject(arg)) { fprintf(fp, "%s%sGetPythonObject(temp%d)", prefix, argname, i); } else if (vtkWrap_IsVTKObject(arg)) { vtkWrapText_PythonName(arg->Class, pythonname); if (strcmp(arg->Class, pythonname) != 0) { /* use typeid() for templated names */ fprintf(fp, "%sGetVTKObject(%stemp%d, typeid(%s).name())", prefix, argname, i, arg->Class); } else { fprintf(fp, "%sGetVTKObject(%stemp%d, \"%s\")", prefix, argname, i, pythonname); } } else if (vtkWrap_IsSpecialObject(arg) && !vtkWrap_IsNonConstRef(arg)) { vtkWrapText_PythonName(arg->Class, pythonname); fprintf(fp, "%sGetSpecialObject(%stemp%d, pobj%d, \"%s\")", prefix, argname, i, i, pythonname); } else if (vtkWrap_IsSpecialObject(arg) && vtkWrap_IsNonConstRef(arg)) { vtkWrapText_PythonName(arg->Class, pythonname); fprintf(fp, "%sGetSpecialObject(%stemp%d, \"%s\")", prefix, argname, i, pythonname); } else if (vtkWrap_IsQtEnum(arg)) { fprintf(fp, "%sGetSIPEnumValue(%stemp%d, \"%s\")", prefix, argname, i, arg->Class); } else if (vtkWrap_IsQtObject(arg)) { fprintf(fp, "%sGetSIPObject(%stemp%d, \"%s\")", prefix, argname, i, arg->Class); } else if (vtkWrap_IsFunction(arg)) { fprintf(fp, "%sGetFunction(%stemp%d)", prefix, argname, i); } else if (vtkWrap_IsVoidPointer(arg)) { fprintf(fp, "%sGetBuffer(%stemp%d, &pbuf%d)", prefix, argname, i, i); } else if (vtkWrap_IsString(arg) || vtkWrap_IsCharPointer(arg)) { fprintf(fp, "%sGetValue(%stemp%d)", prefix, argname, i); } else if (vtkWrap_IsNumeric(arg) && vtkWrap_IsScalar(arg)) { fprintf(fp, "%sGetValue(%stemp%d)", prefix, argname, i); } else if (vtkWrap_IsNArray(arg)) { fprintf(fp, "%sGetNArray(%s%.*stemp%d, %d, size%d)", prefix, argname, (int)(arg->NumberOfDimensions-1), "**********", i, arg->NumberOfDimensions, i); } else if (vtkWrap_IsArray(arg)) { fprintf(fp, "%sGetArray(%stemp%d, size%d)", prefix, argname, i, i); } else if (vtkWrap_IsPODPointer(arg)) { fprintf(fp, "%sGetArray(%stemp%d, size%d)", prefix, argname, i, i); } }
void vtkWrap_DeclareVariable( FILE *fp, ClassInfo *data, ValueInfo *val, const char *name, int i, int flags) { unsigned int aType; int j; const char *typeName; char *newTypeName = NULL; if (val == NULL) { return; } aType = (val->Type & VTK_PARSE_UNQUALIFIED_TYPE); /* do nothing for void */ if (aType == VTK_PARSE_VOID || (aType & VTK_PARSE_BASE_TYPE) == VTK_PARSE_FUNCTION) { return; } typeName = vtkWrap_GetTypeName(val); if (vtkWrap_IsEnumMember(data, val)) { /* use a typedef to work around compiler issues when someone used the same name for the enum type as for a variable or method */ newTypeName = (char *)malloc(strlen(name) + 16); if (i >= 0) { sprintf(newTypeName, "%s%i_type", name, i); } else { sprintf(newTypeName, "%s_type", name); } fprintf(fp, " typedef %s::%s %s;\n", data->Name, typeName, newTypeName); typeName = newTypeName; } /* add a couple spaces for indentation*/ fprintf(fp," "); /* for const * return types, prepend with const */ if ((flags & VTK_WRAP_RETURN) != 0) { if ((val->Type & VTK_PARSE_CONST) != 0 && (aType & VTK_PARSE_INDIRECT) != 0) { fprintf(fp,"const "); } } /* do the same for "const char *" with initializer */ else { if ((val->Type & VTK_PARSE_CONST) != 0 && aType == VTK_PARSE_CHAR_PTR && val->Value && strcmp(val->Value, "0") != 0 && strcmp(val->Value, "NULL") != 0) { fprintf(fp,"const "); } } /* print the type name */ fprintf(fp, "%s ", typeName); /* indirection */ if ((flags & VTK_WRAP_RETURN) != 0) { /* ref and pointer return values are stored as pointers */ if ((aType & VTK_PARSE_INDIRECT) == VTK_PARSE_POINTER || (aType & VTK_PARSE_INDIRECT) == VTK_PARSE_REF) { fprintf(fp, "*"); } } else { /* objects refs and pointers are always handled via pointers, * other refs are passed by value */ if (aType == VTK_PARSE_CHAR_PTR || aType == VTK_PARSE_VOID_PTR || aType == VTK_PARSE_OBJECT_PTR || aType == VTK_PARSE_OBJECT_REF || aType == VTK_PARSE_OBJECT || vtkWrap_IsQtObject(val)) { fprintf(fp, "*"); } /* arrays of unknown size are handled via pointers */ else if (val->CountHint || vtkWrap_IsPODPointer(val)) { fprintf(fp, "*"); } } /* the variable name */ if (i >= 0) { fprintf(fp,"%s%i", name, i); } else { fprintf(fp,"%s", name); } if ((flags & VTK_WRAP_ARG) != 0) { /* print the array decorators */ if (((aType & VTK_PARSE_POINTER_MASK) != 0) && aType != VTK_PARSE_CHAR_PTR && aType != VTK_PARSE_VOID_PTR && aType != VTK_PARSE_OBJECT_PTR && !vtkWrap_IsQtObject(val) && val->CountHint == NULL && !vtkWrap_IsPODPointer(val)) { if (val->NumberOfDimensions == 1 && val->Count > 0) { fprintf(fp, "[%d]", val->Count); } else { for (j = 0; j < val->NumberOfDimensions; j++) { fprintf(fp, "[%s]", val->Dimensions[j]); } } } /* add a default value */ else if (val->Value) { fprintf(fp, " = %s", val->Value); } else if (aType == VTK_PARSE_CHAR_PTR || aType == VTK_PARSE_VOID_PTR || aType == VTK_PARSE_OBJECT_PTR || aType == VTK_PARSE_OBJECT_REF || aType == VTK_PARSE_OBJECT || vtkWrap_IsQtObject(val)) { fprintf(fp, " = NULL"); } else if (val->CountHint || vtkWrap_IsPODPointer(val)) { fprintf(fp, " = NULL"); } else if (aType == VTK_PARSE_BOOL) { fprintf(fp, " = false"); } } /* finish off with a semicolon */ if ((flags & VTK_WRAP_NOSEMI) == 0) { fprintf(fp, ";\n"); } free(newTypeName); }