SVN commit 597568 by rdale: * Reversed the decision to get rid of ALLOC, and replaced all mallocs with ALLOC and all callocs with ALLOCA_N * Commented out some code that mapped an instance which was allocated in the C++ world onto the corresponding ruby instance. It doesn't work if the C++ address is reused and the Ruby side doesn't know about it. CCMAIL: kde-bindings@kde.org M +7 -0 ChangeLog M +22 -24 rubylib/qtruby/Qt.cpp M +1 -1 rubylib/qtruby/handlers.cpp M +11 -2 rubylib/qtruby/marshall_basetypes.h --- trunk/KDE/kdebindings/qtruby/ChangeLog #597567:597568 @@ -6,6 +6,13 @@ some with malloc(). Now they are all created with malloc(). * Removed a call to ALLOC_N and replaced it will calloc(). + * Reversed the decision to get rid of ALLOC, and replaced all mallocs + with ALLOC and all callocs with ALLOCA_N + * Commented out some code that mapped an instance which was allocated + in the C++ world onto the corresponding ruby instance. It doesn't + work if the C++ address is reused and the Ruby side doesn't know + about it. + 2006-10-19 Richard Dale * A Qt::DBusArgument can be obtained via a call to qVariantValue(), like --- trunk/KDE/kdebindings/qtruby/rubylib/qtruby/Qt.cpp #597567:597568 @@ -142,7 +142,8 @@ smokeruby_object * alloc_smokeruby_object(bool allocated, Smoke * smoke, int classId, void * ptr) { - smokeruby_object * o = (smokeruby_object *) malloc(sizeof(smokeruby_object)); + smokeruby_object * o = ALLOC(smokeruby_object); +// smokeruby_object * o = (smokeruby_object *) malloc(sizeof(smokeruby_object)); o->classId = classId; o->smoke = smoke; o->ptr = ptr; @@ -153,7 +154,7 @@ void free_smokeruby_object(smokeruby_object * o) { - free(o); + xfree(o); return; } @@ -210,9 +211,15 @@ } VALUE getPointerObject(void *ptr) { - if (pointer_map[ptr] == 0) { + if (!pointer_map.contains(ptr)) { + if (do_debug & qtdb_gc) { + qWarning("getPointerObject %p -> nil", ptr); + } return Qnil; } else { + if (do_debug & qtdb_gc) { + qWarning("getPointerObject %p -> %p", ptr, (void *) *(pointer_map[ptr])); + } return *(pointer_map[ptr]); } } @@ -221,16 +228,16 @@ void *ptr = o->smoke->cast(o->ptr, o->classId, classId); if(ptr != lastptr) { lastptr = ptr; - if (pointer_map[ptr] != 0) { + if (pointer_map.contains(ptr)) { VALUE * obj_ptr = pointer_map[ptr]; if (do_debug & qtdb_gc) { const char *className = o->smoke->classes[o->classId].className; - qWarning("unmapPointer (%s*)%p -> %p", className, ptr, obj_ptr); + qWarning("unmapPointer (%s*)%p -> %p size: %d", className, ptr, obj_ptr, pointer_map.size() - 1); } pointer_map.remove(ptr); - free((void*) obj_ptr); + xfree((void*) obj_ptr); } } for(Smoke::Index *i = o->smoke->inheritanceList + o->smoke->classes[classId].parents; @@ -248,12 +255,13 @@ if (ptr != lastptr) { lastptr = ptr; - VALUE * obj_ptr = (VALUE *) malloc(sizeof(VALUE)); + VALUE * obj_ptr = ALLOC(VALUE); +// VALUE * obj_ptr = (VALUE *) malloc(sizeof(VALUE)); memcpy(obj_ptr, &obj, sizeof(VALUE)); if (do_debug & qtdb_gc) { const char *className = o->smoke->classes[o->classId].className; - qWarning("mapPointer (%s*)%p -> %p", className, ptr, (void*)obj); + qWarning("mapPointer (%s*)%p -> %p size: %d", className, ptr, (void*)obj, pointer_map.size() + 1); } pointer_map.insert(ptr, obj_ptr); @@ -1527,7 +1535,7 @@ } } - VALUE * temp_stack = (VALUE *) calloc(argc+3, sizeof(VALUE)); + VALUE * temp_stack = ALLOCA_N(VALUE, argc+3); temp_stack[0] = rb_str_new2("Qt"); temp_stack[1] = rb_str_new2(methodName); temp_stack[2] = klass; @@ -1561,7 +1569,6 @@ } if (_current_method == -1) { - free(temp_stack); // Check for property getter/setter calls smokeruby_object *o = value_obj_info(self); @@ -1610,7 +1617,6 @@ MethodCall c(qt_Smoke, _current_method, self, temp_stack+4, argc-1); c.next(); VALUE result = *(c.var()); - free(temp_stack); return result; } @@ -1619,7 +1625,7 @@ { VALUE result = Qnil; char * methodName = rb_id2name(SYM2ID(argv[0])); - VALUE * temp_stack = (VALUE *) calloc(argc+3, sizeof(VALUE)); + VALUE * temp_stack = ALLOCA_N(VALUE, argc+3); temp_stack[0] = rb_str_new2("Qt"); temp_stack[1] = rb_str_new2(methodName); temp_stack[2] = klass; @@ -1650,17 +1656,14 @@ if (rx->indexIn(methodName) == -1) { // If an operator method hasn't been found as an instance method, // then look for a class method - after 'op(self,a)' try 'self.op(a)' - VALUE * method_stack = (VALUE *) calloc(argc - 1, sizeof(VALUE)); + VALUE * method_stack = ALLOCA_N(VALUE, argc - 1); method_stack[0] = argv[0]; for (int count = 1; count < argc - 1; count++) { method_stack[count] = argv[count+1]; } result = method_missing(argc-1, method_stack, argv[1]); - free(method_stack); - free(temp_stack); return result; } else { - free(temp_stack); return rb_call_super(argc, argv); } } @@ -1668,7 +1671,6 @@ MethodCall c(qt_Smoke, _current_method, Qnil, temp_stack+4, argc-1); c.next(); result = *(c.var()); - free(temp_stack); return result; } @@ -1724,7 +1726,7 @@ VALUE klass = rb_funcall(self, rb_intern("class"), 0); VALUE constructor_name = rb_str_new2("new"); - VALUE * temp_stack = (VALUE *) calloc(argc+4, sizeof(VALUE)); + VALUE * temp_stack = ALLOCA_N(VALUE, argc+4); temp_stack[0] = rb_str_new2("Qt"); temp_stack[1] = constructor_name; @@ -1750,7 +1752,6 @@ } if (_current_method == -1) { - free(temp_stack); // Another longjmp here.. rb_raise(rb_eArgError, "unresolved constructor call %s\n", rb_class2name(klass)); } @@ -1773,7 +1774,6 @@ p->ptr = 0; p->allocated = false; - free(temp_stack); VALUE result = Data_Wrap_Struct(klass, smokeruby_mark, smokeruby_free, o); mapObject(result, result); // Off with a longjmp, never to return.. @@ -1785,7 +1785,7 @@ VALUE new_qt(int argc, VALUE * argv, VALUE klass) { - VALUE * temp_stack = (VALUE *) calloc(argc + 1, sizeof(VALUE)); + VALUE * temp_stack = ALLOCA_N(VALUE, argc + 1); temp_stack[0] = rb_obj_alloc(klass); for (int count = 0; count < argc; count++) { @@ -1795,7 +1795,6 @@ VALUE result = rb_funcall2(qt_internal_module, rb_intern("try_initialize"), argc+1, temp_stack); rb_obj_call_init(result, argc, argv); - free(temp_stack); return result; } @@ -1806,13 +1805,12 @@ if (argc == 1 && TYPE(argv[0]) == T_ARRAY) { // Convert '(ARGV)' to '(NUM, [$0]+ARGV)' - VALUE * local_argv = (VALUE *) calloc(argc + 1, sizeof(VALUE)); + VALUE * local_argv = ALLOCA_N(VALUE, argc + 1); VALUE temp = rb_ary_dup(argv[0]); rb_ary_unshift(temp, rb_gv_get("$0")); local_argv[0] = INT2NUM(RARRAY(temp)->len); local_argv[1] = temp; result = new_qt(2, local_argv, klass); - free(local_argv); } else { result = new_qt(argc, argv, klass); } --- trunk/KDE/kdebindings/qtruby/rubylib/qtruby/handlers.cpp #597567:597568 @@ -143,7 +143,7 @@ const char *className = o->smoke->classes[o->classId].className; if (do_debug & qtdb_gc) qWarning("Checking for mark (%s*)%p", className, o->ptr); - + if (o->ptr && o->allocated) { if (isDerivedFromByName(o->smoke, className, "QListWidget")) { QListWidget * listwidget = (QListWidget *) o->smoke->cast(o->ptr, o->classId, o->smoke->idClass("QListWidget")); --- trunk/KDE/kdebindings/qtruby/rubylib/qtruby/marshall_basetypes.h #597567:597568 @@ -102,6 +102,9 @@ void *ptr = o->ptr; if(!m->cleanup() && m->type().isStack()) { ptr = construct_copy(o); + if (do_debug & qtdb_gc) { + qWarning("copying %s %p to %p\n", resolve_classname(o->smoke, o->classId, o->ptr), o->ptr, ptr); + } } const Smoke::Class &cl = m->smoke()->classes[m->type().classId()]; @@ -135,6 +138,10 @@ const char * classname = resolve_classname(o->smoke, o->classId, o->ptr); if(m->type().isConst() && m->type().isRef()) { p = construct_copy( o ); + if (do_debug & qtdb_gc) { + qWarning("copying %s %p to %p\n", classname, o->ptr, p); + } + if(p) { o->ptr = p; o->allocated = true; @@ -142,16 +149,18 @@ } obj = set_obj_info(classname, o); - if (do_debug & qtdb_calls) { + if (do_debug & qtdb_gc) { qWarning("allocating %s %p -> %p\n", classname, o->ptr, (void*)obj); } +/* if(m->type().isStack()) { o->allocated = true; // Keep a mapping of the pointer so that it is only wrapped once as a ruby VALUE mapPointer(obj, o, o->classId, 0); } - +*/ + *(m->var()) = obj; } _______________________________________________ Kde-bindings mailing list Kde-bindings@kde.org https://mail.kde.org/mailman/listinfo/kde-bindings