More stuff related to extensions

This commit is contained in:
rdb 2011-01-03 08:25:13 +00:00
parent c740c43f4c
commit 319b8c4cb1
5 changed files with 56 additions and 16 deletions

View File

@ -621,7 +621,7 @@
#defer get_igatescan \ #defer get_igatescan \
$[if $[and $[run_interrogate],$[IGATESCAN]], \ $[if $[and $[run_interrogate],$[IGATESCAN]], \
$[if $[eq $[IGATESCAN], all], \ $[if $[eq $[IGATESCAN], all], \
$[filter-out %.I %.T %.lxx %.yxx %.N %_src.cxx,$[get_sources]], \ $[filter-out %.I %.T %.lxx %.yxx %.N %_src.cxx,$[get_sources]] $[filter %_ext.I,$[get_sources]], \
$[IGATESCAN]]] $[IGATESCAN]]]
// This variable returns the name of the interrogate database file // This variable returns the name of the interrogate database file

View File

@ -326,14 +326,11 @@
#define BLOCKING __blocking #define BLOCKING __blocking
#define MAKE_SEQ(seq_name, num_name, element_name) __make_seq(seq_name, num_name, element_name) #define MAKE_SEQ(seq_name, num_name, element_name) __make_seq(seq_name, num_name, element_name)
#undef USE_STL_ALLOCATOR /* Don't try to parse these template classes in interrogate. */ #undef USE_STL_ALLOCATOR /* Don't try to parse these template classes in interrogate. */
#define EXTENSION(x) __extension x; #define EXTENSION(x) __extension x
#define EXTEND __extension #define EXTEND __extension
#define EXT_FUNC(func) ::func() #define EXT_FUNC(func) ::func()
#define EXT_FUNC_ARGS(func, ...) ::func(__VA_ARGS__) #define EXT_FUNC_ARGS(func, ...) ::func(__VA_ARGS__)
#define EXT_METHOD(cl, m) cl::m() #define CALL_EXT_FUNC(func, ...) ::func (__VA_ARGS__)
#define EXT_METHOD_ARGS(cl, m, ...) cl::m(__VA_ARGS__)
#define EXT_CONST_METHOD(cl, m) cl::m() const
#define EXT_CONST_METHOD_ARGS(cl, m, ...) cl::m(__VA_ARGS__) const
#else #else
#define BEGIN_PUBLISH #define BEGIN_PUBLISH
#define END_PUBLISH #define END_PUBLISH
@ -341,13 +338,11 @@
#define MAKE_SEQ(seq_name, num_name, element_name) #define MAKE_SEQ(seq_name, num_name, element_name)
#define EXTENSION(x) #define EXTENSION(x)
#define EXTEND #define EXTEND
/* If you change this, don't forget to also change it in interrogate itself. */ /* If you change these, don't forget to also change it in interrogate itself. */
#define EXT_FUNC(cl, m) _ext__ ## m () #define _EXT_FUNC(func) _ext__ ## func
#define EXT_FUNC_ARGS(cl, m, ...) _ext__ ## m (__VA_ARGS__) #define EXT_FUNC(func) _EXT_FUNC(func) ()
#define EXT_METHOD(cl, m) _ext_ ## cl ## _ ## m (cl * _ext_this) #define EXT_FUNC_ARGS(func, ...) _EXT_FUNC(func) (__VA_ARGS__)
#define EXT_METHOD_ARGS(cl, m, ...) _ext_ ## cl ## _ ## m (cl * _ext_this, __VA_ARGS__) #define CALL_EXT_FUNC(func, ...) _EXT_METHOD(cl, m) (__VA_ARGS__)
#define EXT_CONST_METHOD(cl, m) _ext_ ## cl ## _ ## m (const cl * _ext_this)
#define EXT_CONST_METHOD_ARGS(cl, m, ...) _ext_ ## cl ## _ ## m (const cl * _ext_this, __VA_ARGS__)
#endif #endif
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -215,5 +215,32 @@ private:
#endif // USE_TAU #endif // USE_TAU
#ifdef CPPPARSER
#define EXT_METHOD(cl, m) cl::m()
#define EXT_METHOD_ARGS(cl, m, ...) cl::m(__VA_ARGS__)
#define EXT_CONST_METHOD(cl, m) cl::m() const
#define EXT_CONST_METHOD_ARGS(cl, m, ...) cl::m(__VA_ARGS__) const
#define EXT_NESTED_METHOD(cl1, cl2, m) cl1::cl2::m()
#define EXT_NESTED_METHOD_ARGS(cl1, cl2, m, ...) cl1::cl2::m(__VA_ARGS__)
#define EXT_NESTED_CONST_METHOD(cl1, cl2, m) cl1::cl2::m() const
#define EXT_NESTED_CONST_METHOD_ARGS(cl1, cl2, m, ...) cl1::cl2::m(__VA_ARGS__) const
#define CALL_EXT_METHOD(cl, m, obj, ...) (obj)-> m(__VA_ARGS__)
#else
/* If you change these, don't forget to also change it in interrogate itself. */
#define __EXT_METHOD(cl, m) _ext_ ## cl ## _ ## m
#define _EXT_METHOD(cl, m) __EXT_METHOD(cl, m)
#define __EXT_NEST(cl1, cl2) cl1 ## __ ## cl2
#define _EXT_NEST(cl1, cl2) __EXT_NEST(cl1, cl2)
#define EXT_METHOD(cl, m) _EXT_METHOD(cl, m) (cl * _ext_this)
#define EXT_METHOD_ARGS(cl, m, ...) _EXT_METHOD(cl, m) (cl * _ext_this, __VA_ARGS__)
#define EXT_CONST_METHOD(cl, m) _EXT_METHOD(cl, m) (const cl * _ext_this)
#define EXT_CONST_METHOD_ARGS(cl, m, ...) _EXT_METHOD(cl, m) (const cl * _ext_this, __VA_ARGS__)
#define EXT_NESTED_METHOD(cl1, cl2, m) _EXT_METHOD(_EXT_NEST(cl1, cl2), m) (cl1::cl2 * _ext_this)
#define EXT_NESTED_METHOD_ARGS(cl1, cl2, m, ...) _EXT_METHOD(_EXT_NEST(cl1, cl2), m) (cl1::cl2 * _ext_this, __VA_ARGS__)
#define EXT_NESTED_CONST_METHOD(cl1, cl2, m) _EXT_METHOD(_EXT_NEST(cl1, cl2), m) (const cl1::cl2 * _ext_this)
#define EXT_NESTED_CONST_METHOD_ARGS(cl1, cl2, m, ...) _EXT_METHOD(_EXT_NEST(cl1, cl2), m) (const cl1::cl2 * _ext_this, __VA_ARGS__)
#define CALL_EXT_METHOD(cl, m, ...) _EXT_METHOD(cl, m) (__VA_ARGS__)
#endif
#endif // __cplusplus #endif // __cplusplus
#endif #endif

View File

@ -396,8 +396,16 @@ get_call_str(const string &container, const vector_string &pexprs) const {
// function has to match the EXT_IMPL definition in dtoolbase.h. // function has to match the EXT_IMPL definition in dtoolbase.h.
if (_extension) { if (_extension) {
if (_cpptype != NULL) { if (_cpptype != NULL) {
call << "_ext_" << _cpptype->get_local_name() // Fix nested classes by replacing :: with __
char* nested_name = strdup(_cpptype->get_local_name(&parser).c_str());
for (int i = 0; i < strlen(nested_name); ++i) {
if (nested_name[i] == ':') {
nested_name[i] = '_';
}
}
call << "_ext_" << nested_name << "_"
<< _cppfunc->get_local_name() << "("; << _cppfunc->get_local_name() << "(";
delete[] nested_name;
} else { } else {
call << "_ext__" << _cppfunc->get_local_name() << "("; call << "_ext__" << _cppfunc->get_local_name() << "(";
} }

View File

@ -1580,7 +1580,10 @@ write_module_class(ostream &out, Object *obj) {
out << " return NULL;\n"; out << " return NULL;\n";
out << " };\n"; out << " };\n";
out << " ostringstream os;\n"; out << " ostringstream os;\n";
if (need_repr == 2) { if (need_repr == 3) {
out << " _ext_" << ClassName << "_python_repr(local_this, os, \""
<< classNameFromCppName(ClassName) << "\");\n";
} else if (need_repr == 2) {
out << " local_this->output(os);\n"; out << " local_this->output(os);\n";
} else { } else {
out << " local_this->python_repr(os, \"" out << " local_this->python_repr(os, \""
@ -3651,6 +3654,9 @@ NeedsAStrFunction(const InterrogateType &itype_class) {
// Returns 1 if the class defines python_repr(ostream, string). // Returns 1 if the class defines python_repr(ostream, string).
// //
// Returns 2 if the class defines output(ostream). // Returns 2 if the class defines output(ostream).
//
// Returns 3 if the class defines an extension
// function for python_repr(ostream, string).
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
int InterfaceMakerPythonNative:: int InterfaceMakerPythonNative::
NeedsAReprFunction(const InterrogateType &itype_class) { NeedsAReprFunction(const InterrogateType &itype_class) {
@ -3681,7 +3687,11 @@ NeedsAReprFunction(const InterrogateType &itype_class) {
if (TypeManager::is_string(inst1->_type) || if (TypeManager::is_string(inst1->_type) ||
TypeManager::is_char_pointer(inst1->_type)) { TypeManager::is_char_pointer(inst1->_type)) {
// python_repr(ostream, string) // python_repr(ostream, string)
return 1; if ((cppinst->_storage_class & CPPInstance::SC_extension) != 0) {
return 3;
} else {
return 1;
}
} }
} }
} }