[Kde-bindings] KDE/kdebindings/qtruby/rubylib/qtruby

Richard Dale Richard_Dale at tipitina.demon.co.uk
Sun Sep 11 12:23:30 UTC 2005


SVN commit 459559 by rdale:

* Restored Caleb Tennis's improved QMetaObject creation code.

CCMAIL: kde-bindings at kde.org


 M  +13 -28    Qt.cpp  


--- trunk/KDE/kdebindings/qtruby/rubylib/qtruby/Qt.cpp #459558:459559
@@ -1856,9 +1856,8 @@
 		}
 
 		// Should never happen..
-		rb_raise(	rb_eRuntimeError, 
-					"Cannot find %s::qt_metacall() method\n", 
-					o->smoke->classes[o->classId].className );
+		rb_raise(rb_eRuntimeError, "Cannot find %s::qt_metacall() method\n", 
+			o->smoke->classes[o->classId].className );
 	}
 
     if (_c != QMetaObject::InvokeMetaMethod) {
@@ -2183,37 +2182,26 @@
 	Smoke::StackItem i[1];
 	(*fn)(methodId.method, o->ptr, i);
 
-	// C++ expert needed. Is it possible to allocate a QMetaObject
-	// via 'new', without explicitely setting the d pointer? For
-	// example, in moc generated code a QMetaObject is allocated
-	// statically like this:
-	//
-	//	const QMetaObject LCDRange::staticMetaObject = {
-	//		{ &QWidget::staticMetaObject, qt_meta_stringdata_LCDRange,
-	//		qt_meta_data_LCDRange, 0 }
-	//	};
-	//
-	// Is there a C++ syntax for combining curly brackets with new
-	// to create a new instance in a similar manner to the above,
-	// without needing to refer to the d pointer to set the fields?
-	//
-	// But for now set the d pointer instead..
-	QMetaObject * meta = new QMetaObject;
-	meta->d.superdata = (QMetaObject *) i[0].s_voidp;
+	QMetaObject *superdata = (QMetaObject *) i[0].s_voidp;
+	char *stringdata = new char[RSTRING(stringdata_value)->len];
 
-	meta->d.stringdata = new char[RSTRING(stringdata_value)->len];
-	memcpy(	(void *) meta->d.stringdata, 
-			RSTRING(stringdata_value)->ptr, 
-			RSTRING(stringdata_value)->len );
-	
 	int count = RARRAY(data_value)->len;
 	uint * data = new uint[count];
 
+	memcpy(	(void *) stringdata, RSTRING(stringdata_value)->ptr, RSTRING(stringdata_value)->len );
+	
 	for (long i = 0; i < count; i++) {
 		VALUE rv = rb_ary_entry(data_value, i);
 		data[i] = NUM2UINT(rv);
 	}
+	
+	QMetaObject ob = { 
+		{ superdata, stringdata, data, 0 }
+	} ;
 
+	QMetaObject * meta = new QMetaObject;
+	*meta = ob;
+
 #ifdef DEBUG
 	printf("make_metaObject() superdata: %p\n", meta->d.superdata);
 	printf("stringdata: ");
@@ -2233,9 +2221,6 @@
 	printf("\n");
 #endif
 
-	meta->d.data = (const uint *) data;
-	meta->d.extradata = 0;
-
     smokeruby_object * m = (smokeruby_object *) malloc(sizeof(smokeruby_object));
     m->smoke = qt_Smoke;
     m->classId = qt_Smoke->idClass("QMetaObject");



More information about the Kde-bindings mailing list