From kde-bindings Wed Feb 03 03:54:04 2010 From: Richard Dale Date: Wed, 03 Feb 2010 03:54:04 +0000 To: kde-bindings Subject: [Kde-bindings] KDE/kdebindings/php/phpqt Message-Id: <1265169244.514322.8032.nullmailer () svn ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-bindings&m=126516925514204 SVN commit 1084419 by rdale: * Make a first pass at getting the PHPQt bindings working with the more module Smoke libraries. Needs more work as a single PHPQt::smoke() is a bit hard wired all over the place. CCMAIL: kde-bindings@kde.org M +3 -3 CMakeLists.txt M +10 -3 src/CMakeLists.txt M +14 -20 src/phpqt_internals.cpp M +3 -2 src/phpqt_internals.h M +39 -31 src/smokephp.cpp M +40 -0 src/smokephp.h M +2 -2 src/unittests.cpp M +1 -1 src/zphp/z_extension.cpp M +2 -2 src/zphp/z_handler.cpp M +2 -2 tests/config.php.conf --- trunk/KDE/kdebindings/php/phpqt/CMakeLists.txt #1084418:1084419 @@ -53,11 +53,11 @@ MESSAGE(STATUS "phpunit found: configuring for tests") ENABLE_TESTING() SET(RUNTIME_OUTPUT_DIRECTORY_ORIG) - SET(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}"/tests/") + SET(RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BUILD_DIR}php/phpqt"/tests/") - CONFIGURE_FILE( ${CMAKE_SOURCE_DIR}/tests/config.php.conf ${CMAKE_BUILD_DIR}config.php @ONLY ) + CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/tests/config.php.conf ${CMAKE_BUILD_DIR}php/phpqt/tests/config.php @ONLY ) FOREACH(TEST_CASE ${PHPQT_TEST_FILES} ) - CONFIGURE_FILE( ${CMAKE_SOURCE_DIR}/tests/${TEST_CASE} ${CMAKE_BUILD_DIR}${TEST_CASE} COPYONLY ) + CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/tests/${TEST_CASE} ${CMAKE_BUILD_DIR}php/phpqt/tests/${TEST_CASE} COPYONLY ) ADD_TEST( ${TEST_CASE} ${PHPUNIT_EXECUTABLE} --log-tap ${TEST_CASE}.log ${TEST_CASE} ) MESSAGE(STATUS "added "${TEST_CASE} ) ENDFOREACH(TEST_CASE) --- trunk/KDE/kdebindings/php/phpqt/src/CMakeLists.txt #1084418:1084419 @@ -65,9 +65,16 @@ add_library(php_qt MODULE ${phpqt_LIB_SRCS}) target_link_libraries(php_qt - ${QT_QTCORE_LIBRARY} - ${QT_QTTEST_LIBRARY} - smokeqt + ${QT_QTCORE_LIBRARY} + ${QT_QTTEST_LIBRARY} + smokeqtcore + smokeqtgui + smokeqtxml + smokeqtopengl + smokeqtsql + smokeqtnetwork + smokeqtdbus + smokeqtsvg ) if(${CMAKE_MODULE_LINKER_FLAGS} MATCHES "no-undefined") --- trunk/KDE/kdebindings/php/phpqt/src/phpqt_internals.cpp #1084418:1084419 @@ -37,7 +37,7 @@ extern zend_object_handlers php_qt_handler; extern zend_class_entry* qstring_ce; -extern Smoke::Index cachedQObjectSmokeId; +extern Smoke::ModuleIndex cachedQObjectSmokeId; zend_class_entry* qobject_ce; QHash SmokeQtObjects; @@ -318,7 +318,7 @@ * We go through QMetaObject::activate, because it can either be connected to a C++ Slot or a user space Slot * cast to a QObject using smoke cast * */ - QObject* ptr = (QObject*) o->smoke()->cast( const_cast( o->ptr() ), o->classId(), cachedQObjectSmokeId ); + QObject* ptr = (QObject*) o->smoke()->cast( const_cast( o->ptr() ), Smoke::ModuleIndex(o->smoke(), o->classId()), cachedQObjectSmokeId ); void *_b[] = { 0, ((void**) args[3].s_voidp)[1] }; QMetaObject::activate( ptr, staticMetaObject, 0, _b ); return true; // success @@ -328,19 +328,13 @@ } // time critical -extern Smoke::Index cachedQObjectSmokeId; -bool PHPQt::isQObject(const Smoke::Index classId) +extern Smoke::ModuleIndex cachedQObjectSmokeId; +bool PHPQt::isQObject(const Smoke::ModuleIndex classId) { if( classId == cachedQObjectSmokeId ) return true; - const Smoke* smoke = PHPQt::smoke(); - for(Smoke::Index *p = smoke->inheritanceList + smoke->classes[classId].parents; *p; p++) - { - if( PHPQt::isQObject(*p) ) - return true; - } - return false; + return Smoke::isDerivedFrom(classId, cachedQObjectSmokeId); } // time critical @@ -454,7 +448,7 @@ SmokeBinding *qt_binding; Smoke::Index PHPQt::findMethod( const char* className, const char* methodName, const int argc, zval** args ) { - Smoke::ModuleIndex method = PHPQt::smoke()->findMethod(className, methodName); // qt_Smoke->methods + Smoke::ModuleIndex method = PHPQt::smoke()->findMethod(className, methodName); // qtcore_Smoke->methods Smoke::Index i = PHPQt::smoke()->methodMaps[ method.index ].method; if(i <= 0) @@ -536,14 +530,14 @@ return i; } -void PHPQt::callCppMethod(void *obj, const Smoke::Index method, Smoke::Stack qargs) +void PHPQt::callCppMethod(void *obj, const Smoke::ModuleIndex& method, Smoke::Stack qargs) { - const Smoke::Method *m = PHPQt::smoke()->methods + method; - const Smoke::ClassFn fn = PHPQt::smoke()->classes[m->classId].classFn; + const Smoke::Method *m = method.smoke->methods + method.index; + const Smoke::ClassFn fn = method.smoke->classes[m->classId].classFn; fn(m->method, obj, qargs); } -extern Smoke* qt_Smoke; +extern Smoke* qtcore_Smoke; QList PHPQt::QtToMoc( Smoke* smoke, void** a, const QList methodTypes ) { static QRegExp * rx = 0; @@ -592,7 +586,7 @@ typeName += "*"; } typeId = smoke->idType( typeName.constData() ); - smoke = qt_Smoke; + smoke = qtcore_Smoke; if( typeId == 0 ) { pNotice() << "Cannot handle " << typeName << " as slot argument"; return result; @@ -613,10 +607,10 @@ return result; } -inline Smoke* PHPQt::smoke(){ return qt_Smoke; } +Smoke* PHPQt::smoke(){ return qtcore_Smoke; } -extern SmokeBinding* qt_binding; -SmokeBinding* PHPQt::binding(){ return qt_binding; } +extern SmokeBinding* qtcore_binding; +SmokeBinding* PHPQt::binding(){ return qtcore_binding; } const char* PHPQt::findRealMethodName(const char* methodName) { --- trunk/KDE/kdebindings/php/phpqt/src/phpqt_internals.h #1084418:1084419 @@ -88,7 +88,7 @@ * @param classId * @return */ - bool isQObject( const Smoke::Index classId ); + bool isQObject( const Smoke::ModuleIndex classId ); /** * Prepares the name of the method: it appends certain characters that indicate the argument types. @@ -127,7 +127,7 @@ * @param method * @param qargs */ - void callCppMethod(void *obj, Smoke::Index method, Smoke::Stack qargs); + void callCppMethod(void *obj, const Smoke::ModuleIndex& method, Smoke::Stack qargs); /** * initializes Smoke and creates an instance of the binding @@ -295,6 +295,7 @@ */ const QString printType(int type); + Smoke* smoke(); }; // namespace PHPQt #endif --- trunk/KDE/kdebindings/php/phpqt/src/smokephp.cpp #1084418:1084419 @@ -27,6 +27,15 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include + #include "phpqt_internals.h" #include "php_qt.h" #include "context.h" @@ -43,22 +52,9 @@ extern QHash SmokeQtObjects; extern "C" void init_qt_Smoke(); -/** - * Binding class that handles virtual calls and deletion of objects - */ -class PHPQtSmokeBinding : public SmokeBinding -{ -public: - PHPQtSmokeBinding(Smoke *s) : SmokeBinding(s) {} - - /** - * called by destructors in shell classes of smoke, e.g. from within - * ~x_QByteArray(), ~QMetaObject(), ~QObject(), ~x_QModelIndex(), ~x_QTextStream(),~x_QVariant(), - * ~x_QDomDocument(), ~x_QDomElement(), ~x_QIODevice() - * @param classId - * @param ptr - */ - void deleted( Smoke::Index classId, void* ptr ) { +namespace PHPQt { + + void Binding::deleted( Smoke::Index classId, void* ptr ) { pDebug( PHPQt::Destruct ) << "deleting p" << ptr; if( PHPQt::SmokePHPObjectExists(ptr) ) { smokephp_object *o = (smokephp_object*) PHPQt::getSmokePHPObjectFromQt(ptr); @@ -84,7 +80,7 @@ * @param pureVirtual * @return true if succeeded */ - bool callMethod(Smoke::Index method, void* QtPtr, Smoke::Stack args, bool pureVirtual) { + bool Binding::callMethod(Smoke::Index method, void* QtPtr, Smoke::Stack args, bool pureVirtual) { //! - get a corresponding smokephp_object smokephp_object *o = (smokephp_object*) PHPQt::getSmokePHPObjectFromQt(QtPtr); @@ -136,7 +132,7 @@ return false; } - virtual char *className(Smoke::Index classId) { + char *Binding::className(Smoke::Index classId) { // return a new[] copy of the language-specific name of this Smoke class // poorly designed function, but oh well. Sorry. @@ -145,8 +141,8 @@ strcpy(buf, className); return buf; } - - virtual ~PHPQtSmokeBinding() {} + + QHash modules; }; @@ -168,18 +164,30 @@ return false; } -extern Smoke* qt_Smoke; -extern SmokeBinding* qt_binding; +extern SmokeBinding* qtcore_binding; +#define INIT_BINDING(module) \ + static PHPQt::Binding module##_binding = PHPQt::Binding(module##_Smoke); \ + PHPQt::Module module = { "PHPQt_" #module, &module##_binding }; \ + PHPQt::modules[module##_Smoke] = module; + void PHPQt::init() { - if (qt_Smoke != 0L) - php_error(E_ERROR,"could not initialize smoke"); - - init_qt_Smoke(); - - if(PHPQt::smoke()->numClasses <= 0) - php_error(E_ERROR,"could not initialize smoke (no class definitions)"); - - qt_binding = new PHPQtSmokeBinding( PHPQt::smoke() ); + init_qtcore_Smoke(); + init_qtgui_Smoke(); + init_qtxml_Smoke(); + init_qtsql_Smoke(); + init_qtopengl_Smoke(); + init_qtnetwork_Smoke(); + init_qtsvg_Smoke(); + init_qtdbus_Smoke(); + + INIT_BINDING(qtcore) + INIT_BINDING(qtgui) + INIT_BINDING(qtxml) + INIT_BINDING(qtsql) + INIT_BINDING(qtopengl) + INIT_BINDING(qtnetwork) + INIT_BINDING(qtsvg) + INIT_BINDING(qtdbus) } --- trunk/KDE/kdebindings/php/phpqt/src/smokephp.h #1084418:1084419 @@ -34,6 +34,7 @@ #endif #include "marshall.h" +#include #define Qnil (zval *) NULL @@ -278,7 +279,46 @@ namespace PHPQt { + + /** + * Binding class that handles virtual calls and deletion of objects + */ + class Binding : public SmokeBinding + { + public: + Binding(Smoke *s) : SmokeBinding(s) {} + /** + * called by destructors in shell classes of smoke, e.g. from within + * ~x_QByteArray(), ~QMetaObject(), ~QObject(), ~x_QModelIndex(), ~x_QTextStream(),~x_QVariant(), + * ~x_QDomDocument(), ~x_QDomElement(), ~x_QIODevice() + * @param classId + * @param ptr + */ + void deleted( Smoke::Index classId, void* ptr ); + + /** + * every virtual C++ method call causes a callMethod() to call the PHP method if there is one + * @param method + * @param QtPtr + * @param args + * @param pureVirtual + * @return true if succeeded + */ + bool callMethod(Smoke::Index method, void* QtPtr, Smoke::Stack args, bool pureVirtual); + + virtual char *className(Smoke::Index classId); + + virtual ~Binding() {} + }; + + struct Module { + const char* name; + Binding* binding; + }; + + extern QHash modules; + }; #ifdef THOMAS_TEMP_DISABLED --- trunk/KDE/kdebindings/php/phpqt/src/unittests.cpp #1084418:1084419 @@ -31,10 +31,10 @@ #include "smokephp.h" -extern Smoke* qt_Smoke; +extern Smoke* qtcore_Smoke; TestPHPQt::TestPHPQt( SmokeBinding* binding, zval* z ) - : _binding(binding), _z(z), _smoke( qt_Smoke ) + : _binding(binding), _z(z), _smoke( qtcore_Smoke ) { std::cout << "setting up unittests" << std::endl; } --- trunk/KDE/kdebindings/php/phpqt/src/zphp/z_extension.cpp #1084418:1084419 @@ -245,7 +245,7 @@ // Metaobject // TODO only if derived - if( PHPQt::isQObject( PHPQt::smoke()->idClass(ce->name).index ) ) + if( PHPQt::isQObject( Smoke::findClass(ce->name) ) ) PHPQt::createMetaObject(o, getThis()); // cleanup --- trunk/KDE/kdebindings/php/phpqt/src/zphp/z_handler.cpp #1084418:1084419 @@ -106,7 +106,7 @@ //! - get the Qt value Smoke::Stack args = new Smoke::StackItem; void* dummy; // dummy here - PHPQt::callCppMethod(dummy, method, args); + PHPQt::callCppMethod(dummy, Smoke::ModuleIndex(PHPQt::smoke(), method), args); //! - write the zend return value zval* return_value; @@ -179,7 +179,7 @@ php_error(E_ERROR, "%s can not be cloned", o->ce_ptr()->name); smokephp_object* so = PHPQt::cloneObject( EX_T(opline->result.u.var).var.ptr, o, copyPtr ); - if( PHPQt::isQObject( so->classId() ) ) + if( PHPQt::isQObject( Smoke::ModuleIndex(so->smoke(), so->classId()) ) ) PHPQt::createMetaObject( so, EX_T(opline->result.u.var).var.ptr ); return _ret; --- trunk/KDE/kdebindings/php/phpqt/tests/config.php.conf #1084418:1084419 @@ -2,5 +2,5 @@ /* * helper file, don't touch */ -$tests_path = "@CMAKE_SOURCE_DIR@/tests/unittesthelper/" -?> \ No newline at end of file +$tests_path = "@CMAKE_CURRENT_SOURCE_DIR@/tests/unittesthelper/" +?> _______________________________________________ Kde-bindings mailing list Kde-bindings@kde.org https://mail.kde.org/mailman/listinfo/kde-bindings