# HG changeset patch # User eldar_ins@eldar-laptop # Date 1260570174 -18000 # Node ID 55ee4603365d67a0a1e2561b87dcbef66ab7a691 # Parent 4d8481385c71110f474f7f4a7b5c37c1b8848ce3 string arguments for signals diff -r 4d8481385c71 -r 55ee4603365d build/core.makefile --- a/build/core.makefile Tue Dec 08 21:13:24 2009 +0000 +++ b/build/core.makefile Sat Dec 12 03:22:54 2009 +0500 @@ -79,4 +79,5 @@ QBuffer \ QMetaType \ QLibraryInfo \ + QFileSystemWatcher \ QXmlStreamEntityResolver \ No newline at end of file diff -r 4d8481385c71 -r 55ee4603365d build/core.txt --- a/build/core.txt Tue Dec 08 21:13:24 2009 +0000 +++ b/build/core.txt Sat Dec 12 03:22:54 2009 +0500 @@ -79,5 +79,6 @@ QBuffer QLibraryInfo QXmlStreamEntityResolver + QFileSystemWatcher ) diff -r 4d8481385c71 -r 55ee4603365d cpp/qt_core/QString_shell.cpp --- a/cpp/qt_core/QString_shell.cpp Tue Dec 08 21:13:24 2009 +0000 +++ b/cpp/qt_core/QString_shell.cpp Sat Dec 12 03:22:54 2009 +0500 @@ -55,3 +55,13 @@ QString *result = new (place)QString((const QString& )__qt_string0); return (void *) result; } + +extern "C" DLL_PUBLIC void qtd_QString_placed_ctor(void* place) { + new (place) QString(); +} + +extern "C" DLL_PUBLIC void qtd_QString_assign_fromUtf8 +(QString *__qt_this, DArray text) +{ + *__qt_this = QString::fromUtf8((const char *)text.ptr, text.length); +} \ No newline at end of file diff -r 4d8481385c71 -r 55ee4603365d generator/dgenerator.cpp --- a/generator/dgenerator.cpp Tue Dec 08 21:13:24 2009 +0000 +++ b/generator/dgenerator.cpp Sat Dec 12 03:22:54 2009 +0500 @@ -1783,7 +1783,7 @@ << INDENT << cppContainerConversionName(d_class, type, FromCpp) << "(" << arg_ptr << ", &" << arg_name << ");" << endl; } else if (type->isTargetLangString()) { s << INDENT << "auto " << arg_name << "_ptr = " << arg_ptr << ";" << endl - << INDENT << "string " << arg_name << " = QString.toNativeString(" << arg_name << "_ptr);"; + << INDENT << "string " << arg_name << " = QStringUtil.toNativeString(" << arg_name << "_ptr);"; } else if(type->isPrimitive() || type->isEnum() || type->isFlags() || type->typeEntry()->isStructInD()) { QString type_name = argument->type()->typeEntry()->qualifiedTargetLangName(); if (type->isFlags()) @@ -2987,7 +2987,7 @@ s << INDENT << "string " << arg_name << "_d_ref = toUTF8(" << arg_name << "[0.." << arg_name << "_size]);"; else if (type->typeEntry()->isValue() && type->isNativePointer() && type->typeEntry()->name() == "QString") { - s << INDENT << "auto " << arg_name << "_d_qstr = QString(" << arg_name << ", true);" << endl + s << INDENT << "auto " << arg_name << "_d_qstr = QStringUtil(" << arg_name << ", true);" << endl << INDENT << "string " << arg_name << "_d_ref = " << arg_name << "_d_qstr.toNativeString();"; } else if(type->isVariant()) s << INDENT << "scope " << arg_name << "_d_ref = new QVariant(" << arg_name << ", QtdObjectFlags.nativeOwnership);"; diff -r 4d8481385c71 -r 55ee4603365d qt/core/QList.d --- a/qt/core/QList.d Tue Dec 08 21:13:24 2009 +0000 +++ b/qt/core/QList.d Sat Dec 12 03:22:54 2009 +0500 @@ -337,7 +337,7 @@ static if(is(T == string)) { void* ptr = cast(void*)(TI.isLarge || TI.isStatic ? v : &this); - return QString.toNativeString(ptr); + return QStringUtil.toNativeString(ptr); } else static if (isValueType!T) { diff -r 4d8481385c71 -r 55ee4603365d qt/core/QString.d --- a/qt/core/QString.d Tue Dec 08 21:13:24 2009 +0000 +++ b/qt/core/QString.d Sat Dec 12 03:22:54 2009 +0500 @@ -13,30 +13,26 @@ struct QString { - public static QString opCall(void* ptr, bool proxy) { + public static QString opCall() + { QString str; - str.__nativeId = ptr; + qtd_QString_placed_ctor(&str); return str; } - public void* __nativeId; - - public static final string toNativeString(void* qstring) { - wchar* arr = qtd_QString_utf16(qstring); - int size = qtd_QString_size(qstring); - return .toUTF8(arr[0..size]); + ~this() + { + qtd_QString_call_destructor(&this); } - public final string toNativeString() { - return toNativeString(__nativeId); + void opAssign(string str) + { + qtd_QString_assign_fromUtf8(&this, str); } - public void assign(string text) { - qtd_QString_operatorAssign(__nativeId, text); - } - - public static string fromUtf8(string source) { - return source; + this(string str) + { + qtd_QString_new_fromUtf8_at(&this, str); } public static void __constructPlacedQString(void* place, string source) { @@ -67,6 +63,38 @@ enum bool isPointer = false; enum bool isDummy = false; } + +private: + void *dummy; // sizeof(QString) == sizeof(void*) +} + +struct QStringUtil +{ + public static final string toNativeString(void* qstring) { + wchar* arr = qtd_QString_utf16(qstring); + int size = qtd_QString_size(qstring); + return .toUTF8(arr[0..size]); + } + + public static string fromUtf8(string source) { + return source; + } + + public static QStringUtil opCall(void* ptr, bool proxy) { + QStringUtil str; + str.__nativeId = ptr; + return str; + } + + public void* __nativeId; + + public final string toNativeString() { + return QStringUtil.toNativeString(__nativeId); + } + + public void assign(string text) { + qtd_QString_operatorAssign(__nativeId, text); + } } private extern(C) void* qtd_QString_placed_copy(const void* orig, void* place); @@ -78,4 +106,7 @@ private extern (C) wchar* qtd_QString_utf16(void* __this_nativeId); private extern (C) int qtd_QString_size(void* __this_nativeId); private extern (C) void qtd_QString_operatorAssign(void* __this_nativeId, string text); -private extern (C) void qtd_QString_new_fromUtf8_at(void* place, string text); \ No newline at end of file +private extern (C) void* qtd_QString_new_fromUtf8_at(void* place, string text); + +private extern (C) void qtd_QString_placed_ctor(void* place); +private extern (C) void qtd_QString_assign_fromUtf8(QString *__qt_this, string text); \ No newline at end of file diff -r 4d8481385c71 -r 55ee4603365d qt/d2/qt/Signal.d --- a/qt/d2/qt/Signal.d Tue Dec 08 21:13:24 2009 +0000 +++ b/qt/d2/qt/Signal.d Sat Dec 12 03:22:54 2009 +0500 @@ -315,37 +315,13 @@ alias findSymbolsImpl!(prefix, C, 0, pred).result findSymbols; } -string __toString(long v) -{ - if (v == 0) - return "0"; - - string ret; - - bool neg; - if (v < 0) - { - neg = true; - v = -v; - } - - while (v != 0) - { - ret = cast(char)(v % 10 + '0') ~ ret; - v = cast(long)(v / 10); - } - - if (neg) - ret = "-" ~ ret; - - return ret; -} - string convertSignalArguments(Args...)() { // void *_a[] = { 0, const_cast(reinterpret_cast(&_t1)) }; - - string res = "void*[" ~ __toString(Args.length+1) ~ "] _a = [null"; + // at least for string argument need to construct a QString value + string res = prepareSignalArguments!(Args); + + res ~= "void*[" ~ __toString(Args.length+1) ~ "] _a = [null"; foreach(i, _; Args) res ~= ", " ~ "cast(void*) &" ~ convertSignalArgument!(Args[i])("_t" ~ __toString(i)); res ~= "];\n"; @@ -463,7 +439,7 @@ static if (signalType == SignalType.NewSignal) { -// pragma (msg, SignalEmitter!(ArgTypes)(SignalType.NewSignal, getFunc!_Name(fullName), defVals, localIndex)); + pragma (msg, SignalEmitter!(ArgTypes)(SignalType.NewSignal, getFunc!_Name(fullName), defVals, localIndex)); mixin (SignalEmitter!(ArgTypes)(SignalType.NewSignal, getFunc!_Name(fullName), defVals, localIndex)); } } @@ -487,7 +463,10 @@ { if(i > 0) res ~= ","; - res ~= T[i].stringof; + static if (isNativeType!(T[i])) + res ~= Unqual!(T[i]).stringof; + else + res ~= T[i].stringof; } res ~= ")"; return res; diff -r 4d8481385c71 -r 55ee4603365d qt/qtd/MOC.d --- a/qt/qtd/MOC.d Tue Dec 08 21:13:24 2009 +0000 +++ b/qt/qtd/MOC.d Sat Dec 12 03:22:54 2009 +0500 @@ -6,6 +6,7 @@ import qt.Signal; import qt.qtd.MetaMarshall; +public import qt.core.QString; public import std.traits; /** @@ -529,6 +530,6 @@ alias TupleWrapper!(findSymbols!(slotPrefix, typeof(this), ByOwner!(typeof(this)))) Slots; alias TupleWrapper!(findSymbols!(signalPrefix, typeof(this), ByOwner!(typeof(this)))) Signals; -// pragma(msg, generateMetaInfo!((typeof(this)).stringof, Signals, Slots)()); + pragma(msg, generateMetaInfo!((typeof(this)).stringof, Signals, Slots)()); mixin(generateMetaInfo!((typeof(this)).stringof, Signals, Slots)()); } diff -r 4d8481385c71 -r 55ee4603365d qt/qtd/MetaMarshall.d --- a/qt/qtd/MetaMarshall.d Tue Dec 08 21:13:24 2009 +0000 +++ b/qt/qtd/MetaMarshall.d Sat Dec 12 03:22:54 2009 +0500 @@ -2,6 +2,34 @@ import std.traits; +// shouldn't be here + +string __toString(long v) +{ + if (v == 0) + return "0"; + + string ret; + + bool neg; + if (v < 0) + { + neg = true; + v = -v; + } + + while (v != 0) + { + ret = cast(char)(v % 10 + '0') ~ ret; + v = cast(long)(v / 10); + } + + if (neg) + ret = "-" ~ ret; + + return ret; +} + template isQObjectType(T) // is a QObject type that belongs to the library { enum isQObjectType = is(T.__isQObjectType); @@ -19,7 +47,12 @@ template isNativeType(T) // type that doesn't require conversion i.e. is the same in C++ and D { - enum isNativeType = isNumeric!T || is(T == bool); + enum isNativeType = isNumeric!T || is(T == bool) || is(T == struct); +} + +template isStringType(T) // string type +{ + enum isStringType = is(T == string); } // converts an argumnent from C++ to D in qt_metacall @@ -29,6 +62,8 @@ return T.stringof ~ ".__getObject(*cast(void**)(" ~ ptr ~ "))"; else static if (isNativeType!T) return "*(cast(" ~ T.stringof ~ "*)" ~ ptr ~ ")"; + else static if (isStringType!T) + return "QStringUtil.toNativeString(" ~ ptr ~ ")"; else return "*(cast(" ~ T.stringof ~ "*)" ~ ptr ~ ")"; //res = T.stringof; @@ -39,8 +74,10 @@ { static if (isQObjectType!T) return T.stringof ~ "*"; + else static if (isStringType!T) + return "QString"; else static if (isNativeType!T) - return T.stringof; + return Unqual!T.stringof; else return T.stringof; } @@ -50,8 +87,19 @@ { static if (isQObjectType!T) return arg ~ ".__nativeId"; + else static if (isStringType!T) + return "_qt" ~ arg; else static if (isNativeType!T) return arg; else return arg; } + +string prepareSignalArguments(Args...)() +{ + string res; + foreach(i, _; Args) + static if (isStringType!(Args[i])) + res ~= "auto _qt_t" ~ __toString(i) ~ " = QString(_t" ~ __toString(i) ~ ");\n"; + return res; +}