*** empty log message ***

This commit is contained in:
Roger Hughston 2005-05-27 23:40:34 +00:00
parent 05b6a301d5
commit a31108fcb8
2 changed files with 72 additions and 4 deletions

View File

@ -1414,11 +1414,14 @@ void InterfaceMakerPythonNative::write_module_class(ostream &out, Object *obj)
}
}
// compare and hash work together in PY inherit behavior hmm grrr
// __hash__
if(has_local_hash == true)
{
out << " // __hash__\n";
out << " Dtool_" << ClassName <<".As_PyTypeObject().tp_hash = &DTool_HashKey_"<<ClassName <<";\n";
out << " Dtool_" << ClassName <<".As_PyTypeObject().tp_compare = &DTOOL_PyObject_Compare;\n";
}
@ -1987,7 +1990,19 @@ void InterfaceMakerPythonNative::write_function_instance(ostream &out, Interface
expected_params += "long long";
pname_for_pyobject += param_name;
} else if (TypeManager::is_integer(type)) {
}else if(TypeManager::is_unsigned_integer(type))
{
indent(out,indent_level+4) << "PyObject *" << param_name;
format_specifiers += "O";
parameter_list += ", &" + param_name;
extra_convert += " PyObject *" + param_name + "_uint = PyNumber_Long(" + param_name + ");";
extra_param_check += "|| (" + param_name + "_uint == NULL)";
pexpr_string = "PyLong_AsUnsignedLong(" + param_name + "_uint)";
extra_cleanup += " Py_XDECREF(" + param_name + "_uint);";
expected_params += "unsigned int";
pname_for_pyobject += param_name;
}else if (TypeManager::is_integer(type)) {
indent(out,indent_level+4) << "int " << param_name;
format_specifiers += "i";
parameter_list += ", &" + param_name;

View File

@ -194,7 +194,7 @@ EXPORT_THIS Dtool_PyTypedObject Dtool_##CLASS_NAME = {\
0, /*tp_print*/\
0, /*tp_getattr*/\
0, /*tp_setattr*/\
&DTOOL_PyObject_Compare, /*tp_compare*/\
0, /*tp_compare*/\
0, /*tp_repr*/\
&Dtool_PyNumberMethods_##CLASS_NAME, /*tp_as_number*/\
0, /*tp_as_sequence*/\
@ -205,7 +205,7 @@ EXPORT_THIS Dtool_PyTypedObject Dtool_##CLASS_NAME = {\
PyObject_GenericGetAttr, /* tp_getattro */\
PyObject_GenericSetAttr, /* tp_setattro */\
0, /* tp_as_buffer */\
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES, /* tp_flags */\
(Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_CHECKTYPES), /* tp_flags */\
0, /* tp_doc */\
0, /* tp_traverse */\
0, /* tp_clear */\
@ -699,7 +699,7 @@ inline long DTool_HashKey(PyObject * inst)
XXX of error.
*/
inline int DTOOL_PyObject_Compare(PyObject *v1, PyObject *v2)
inline int DTOOL_PyObject_Compare_old(PyObject *v1, PyObject *v2)
{
// if we are related..
if(PyType_IsSubtype(v1->ob_type, v2->ob_type))
@ -753,5 +753,58 @@ inline int DTOOL_PyObject_Compare(PyObject *v1, PyObject *v2)
return 0;
}
inline int DTOOL_PyObject_Compare(PyObject *v1, PyObject *v2)
{
// First try compare to function..
PyObject * func = PyObject_GetAttrString(v1, "compareTo");
if (func == NULL)
{
PyErr_Clear();
}
else
{
PyObject * res = NULL;
PyObject * args = Py_BuildValue("(O)", v2);
if (args != NULL)
{
res = PyObject_Call(func, args, NULL);
Py_DECREF(args);
}
Py_DECREF(func);
PyErr_Clear(); // just in case the function threw an error
// only use if the cuntion return an INT... hmm
if(res != NULL && PyInt_Check(res))
{
int answer = PyInt_AsLong(res);
Py_DECREF(res);
return answer;
}
if(res != NULL)
Py_DECREF(res);
};
// try this compare
void * v1_this = DTOOL_Call_GetPointerThis(v1);
void * v2_this = DTOOL_Call_GetPointerThis(v2);
if(v1_this != NULL && v2_this != NULL) // both are our types...
{
if(v1_this < v2_this)
return -1;
if(v1_this > v2_this)
return 1;
return 0;
}
// ok self compare...
if(v1 < v2)
return -1;
if(v1 > v2)
return 1;
return 0;
}
#endif // PY_PANDA_H_