[Kde-bindings] KDE/kdebindings/ruby/qtruby/src
Arno Rehn
kde at arnorehn.de
Sun Jul 25 14:22:35 UTC 2010
SVN commit 1154467 by arnorehn:
Choose the const/non-const version of a method based on whether the object
is frozen or not. 'Frozen' objects in Ruby roughly translate to const objects in
C++, so this should work out fine.
Quick testing with the QDBusArgument API (which now doesn't need special casing anymore)
worked well.
CCMAIL: kde-bindings at kde.org
M +6 -0 lib/Qt/qtruby4.rb
M +11 -0 marshall_basetypes.h
M +4 -0 marshall_types.h
M +2 -51 qtruby.cpp
--- trunk/KDE/kdebindings/ruby/qtruby/src/lib/Qt/qtruby4.rb #1154466:1154467
@@ -2727,7 +2727,13 @@
methodIds.each do
|id|
puts "matching => smoke: #{id.smoke} index: #{id.index}" if debug_level >= DebugLevel::High
+
+ if this.frozen?
current_match = (isConstMethod(id) ? 1 : 0)
+ else
+ current_match = (isConstMethod(id) ? 0 : 1)
+ end
+
(0...args.length).each do
|i|
current_match += checkarg(get_value_type(args[i]), get_arg_type_name(id, i))
--- trunk/KDE/kdebindings/ruby/qtruby/src/marshall_basetypes.h #1154466:1154467
@@ -10,6 +10,9 @@
#ifndef MARSHALL_BASETYPES_H
#define MARSHALL_BASETYPES_H
+#include "qtruby.h"
+#include "smokeruby.h"
+
template <class T> T* smoke_ptr(Marshall *m) { return (T*) m->item().s_voidp; }
template<> bool* smoke_ptr<bool>(Marshall *m) { return &m->item().s_bool; }
@@ -144,6 +147,7 @@
smokeruby_object * o = alloc_smokeruby_object(false, m->smoke(), m->type().classId(), p);
const char * classname = resolve_classname(o);
+ bool freeze = false;
if (m->type().isConst() && m->type().isRef()) {
p = construct_copy( o );
if (do_debug & qtdb_gc) {
@@ -153,13 +157,20 @@
if (p) {
o->ptr = p;
o->allocated = true;
+ } else {
+ freeze = true;
}
+ } else if (m->type().isConst() && m->type().isPtr()) {
+ freeze = true;
}
obj = set_obj_info(classname, o);
if (do_debug & qtdb_gc) {
qWarning("allocating %s %p -> %p\n", classname, o->ptr, (void*)obj);
}
+ if (freeze) {
+ rb_obj_freeze(obj);
+ }
/*
if(m->type().isStack()) {
--- trunk/KDE/kdebindings/ruby/qtruby/src/marshall_types.h #1154466:1154467
@@ -133,6 +133,10 @@
rb_raise(rb_eArgError, "%s is not a class method\n", _smoke->methodNames[method().name]);
}
+ if (rb_obj_frozen_p(_target) && !(method().flags & Smoke::mf_const)) {
+ rb_raise(rb_eRuntimeError, "%p (%s) is frozen, can't call non-const method '%s' on it\n", _o->ptr, classname(), _smoke->methodNames[method().name]);
+ }
+
Smoke::ClassFn fn = _smoke->classes[method().classId].classFn;
void * ptr = 0;
--- trunk/KDE/kdebindings/ruby/qtruby/src/qtruby.cpp #1154466:1154467
@@ -40,7 +40,8 @@
#include <QtGui/qwidget.h>
#ifdef QT_QTDBUS
-#include <QtDBus/qdbusargument.h>
+#include <QtDBus/QDBusObjectPath>
+#include <QtDBus/QDBusSignature>
#endif
#include <smoke/smoke.h>
@@ -617,45 +618,6 @@
return rb_str_new((const char *) bytes, image->bytesPerLine());
}
-#ifdef QT_QTDBUS
-static VALUE
-qdbusargument_endarraywrite(VALUE self)
-{
- smokeruby_object *o = value_obj_info(self);
- QDBusArgument * arg = (QDBusArgument *) o->ptr;
- arg->endArray();
- return self;
-}
-
-static VALUE
-qdbusargument_endmapwrite(VALUE self)
-{
- smokeruby_object *o = value_obj_info(self);
- QDBusArgument * arg = (QDBusArgument *) o->ptr;
- arg->endMap();
- return self;
-}
-
-static VALUE
-qdbusargument_endmapentrywrite(VALUE self)
-{
- smokeruby_object *o = value_obj_info(self);
- QDBusArgument * arg = (QDBusArgument *) o->ptr;
- arg->endMapEntry();
- return self;
-}
-
-static VALUE
-qdbusargument_endstructurewrite(VALUE self)
-{
- smokeruby_object *o = value_obj_info(self);
- QDBusArgument * arg = (QDBusArgument *) o->ptr;
- arg->endStructure();
- return self;
-}
-
-#endif
-
// The QtRuby runtime's overloaded method resolution mechanism can't currently
// distinguish between Ruby Arrays containing different sort of instances.
// Unfortunately Qt::Painter.drawLines() and Qt::Painter.drawRects() methods can
@@ -2280,17 +2242,6 @@
rb_define_method(klass, "mapping", (VALUE (*) (...)) qsignalmapper_mapping, -1);
rb_define_method(klass, "setMapping", (VALUE (*) (...)) qsignalmapper_set_mapping, -1);
rb_define_method(klass, "set_mapping", (VALUE (*) (...)) qsignalmapper_set_mapping, -1);
-#ifdef QT_QTDBUS
- } else if (packageName == "Qt::DBusArgument") {
- rb_define_method(klass, "endArrayWrite", (VALUE (*) (...)) qdbusargument_endarraywrite, 0);
- rb_define_method(klass, "end_array_write", (VALUE (*) (...)) qdbusargument_endarraywrite, 0);
- rb_define_method(klass, "endMapEntryWrite", (VALUE (*) (...)) qdbusargument_endmapentrywrite, 0);
- rb_define_method(klass, "end_map_entry_write", (VALUE (*) (...)) qdbusargument_endmapentrywrite, 0);
- rb_define_method(klass, "endMapWrite", (VALUE (*) (...)) qdbusargument_endmapwrite, 0);
- rb_define_method(klass, "end_map_write", (VALUE (*) (...)) qdbusargument_endmapwrite, 0);
- rb_define_method(klass, "endStructureWrite", (VALUE (*) (...)) qdbusargument_endstructurewrite, 0);
- rb_define_method(klass, "end_structure_write", (VALUE (*) (...)) qdbusargument_endstructurewrite, 0);
-#endif
}
foreach(QtRubyModule m, qtruby_modules.values()) {
More information about the Kde-bindings
mailing list