From: <je...@us...> - 2008-07-18 23:28:33
|
Revision: 10679 http://swig.svn.sourceforge.net/swig/?rev=10679&view=rev Author: jezabek Date: 2008-07-18 23:28:29 +0000 (Fri, 18 Jul 2008) Log Message: ----------- Define error numbers for COM and use them. First shot at a test-suite. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/Makefile.in branches/gsoc2008-jezabek/Makefile.in branches/gsoc2008-jezabek/Source/Include/swigwarn.h branches/gsoc2008-jezabek/Source/Modules/com.cxx branches/gsoc2008-jezabek/configure.in Modified: branches/gsoc2008-jezabek/Examples/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/Makefile.in 2008-07-18 19:07:38 UTC (rev 10678) +++ branches/gsoc2008-jezabek/Examples/Makefile.in 2008-07-18 23:28:29 UTC (rev 10679) @@ -1089,3 +1089,42 @@ rm -f *.@OBJEXT@ *@SO@ NAMESPACE rm -f $(RRSRC) runme.Rout .RData +################################################################## +##### COM ###### +################################################################## + +# COM intermediate files +COM_RC_FILE = $(INTERFACE:.i=_rc.rc) +COM_RES_FILE = $(INTERFACE:.i=_rc.res) +COM_IDL_FILE = $(INTERFACE:.i=.idl) +COM_DEF_FILE = $(INTERFACE:.i=.def) +COM_IDL = @COM_IDL@ +COM_RC = @COM_RC@ +COM_CC = @COM_CC@ +COM_CXX = @COM_CXX@ +COM_LIBS = @COM_LIBS@ +COM_IDL_SWITCHES = @COM_IDL_SWITCHES@ +COM_RC_IN_SWITCHES = @COM_RC_IN_SWITCHES@ +COM_RC_OUT_SWITCHES = @COM_RC_OUT_SWITCHES@ +COM_CC_SHARED_SWITCHES = @COM_CC_SHARED_SWITCHES@ +COM_CC_OUT_SWITCHES = @COM_CC_OUT_SWITCHES@ +COM_CXX_SHARED_SWITCHES = @COM_CXX_SHARED_SWITCHES@ +COM_CXX_OUT_SWITCHES = @COM_CXX_OUT_SWITCHES@ +COM_CC_SWITCHES = @COM_CC_SWITCHES@ +COM_EXEC_SUFFIX = @COM_EXEC_SUFFIX@ + +com: $(SRCS) + $(SWIG) -com $(SWIGOPT) $(INTERFACE) + $(COM_IDL) $(COM_IDL_SWITCHES) $(COM_IDL_FILE) + $(COM_RC) $(COM_RC_IN_SWITCHES) $(COM_RC_FILE) $(COM_RC_OUT_SWITCHES) $(COM_RES_FILE) + $(COM_CC) $(COM_CC_SHARED_SWITCHES) $(COM_CC_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(ISRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) + +com_cpp: $(SRCS) + $(SWIG) -com -c++ $(SWIGOPT) $(INTERFACE) + $(COM_IDL) $(COM_IDL_SWITCHES) $(COM_IDL_FILE) + $(COM_RC) $(COM_RC_IN_SWITCHES) $(COM_RC_FILE) $(COM_RC_OUT_SWITCHES) $(COM_RES_FILE) + $(COM_CXX) $(COM_CXX_SHARED_SWITCHES) $(COM_CXX_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) + +com_compile: $(SRCS) + $(COM_CC) $(COM_CC_SWITCHES) $(COM_CC_OUT_SWITCHES) $(TARGET)$(COM_EXEC_SUFFIX) $(COMSRCS) $(COM_LIBS) + Modified: branches/gsoc2008-jezabek/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Makefile.in 2008-07-18 19:07:38 UTC (rev 10678) +++ branches/gsoc2008-jezabek/Makefile.in 2008-07-18 23:28:29 UTC (rev 10679) @@ -57,6 +57,7 @@ skip-cffi = test -n "@SKIP_CFFI@" skip-uffi = test -n "@SKIP_UFFI@" skip-r = test -n "@SKIP_R@" +skip-com = test -n "@SKIP_COM@" # Additional dependencies for some tests skip-gcj = test -n "@SKIP_GCJ@" @@ -91,6 +92,7 @@ @$(skip-modula3) || ./$(TARGET) -modula3 -help @$(skip-lua) || ./$(TARGET) -lua -help @$(skip-r) || ./$(TARGET) -r -help + @$(skip-com) || ./$(TARGET) -com -help # Checks examples for compilation (does not run them) check-examples: \ @@ -113,7 +115,8 @@ check-clisp-examples \ check-uffi-examples \ check-cffi-examples \ - check-r-examples + check-r-examples \ + check-com-examples tcl_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/tcl/check.list) perl5_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/perl5/check.list) @@ -135,6 +138,7 @@ uffi_examples := cffi_examples := r_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/r/check.list) +com_examples :=$(shell sed '/^\#/d' $(srcdir)/Examples/com/check.list) # all examples check-%-examples : @@ -178,7 +182,8 @@ check-octave-gifplot \ check-php4-gifplot \ check-pike-gifplot \ - check-chicken-gifplot \ + check-chicken-gifplot \ + check-com-gifplot \ # check-lua-gifplot \ # check-csharp-gifplot \ # check-modula3-gifplot @@ -228,7 +233,8 @@ check-uffi-test-suite \ check-cffi-test-suite \ check-chicken-test-suite \ - check-r-test-suite + check-r-test-suite \ + check-com-test-suite check-%-test-suite: @if test -z "$(skip-$*)"; then \ @@ -279,7 +285,8 @@ all-uffi-test-suite \ all-cffi-test-suite \ all-chicken-test-suite \ - all-r-test-suite + all-r-test-suite \ + all-com-test-suite all-%-test-suite: @$(MAKE) -k -s check-$*-test-suite ACTION=all @@ -306,7 +313,8 @@ broken-uffi-test-suite \ broken-cffi-test-suite \ broken-chicken-test-suite \ - broken-r-test-suite + broken-r-test-suite \ + broken-com-test-suite broken-%-test-suite: @$(MAKE) -k -s check-$*-test-suite ACTION=broken @@ -391,7 +399,8 @@ noskip-uffi-test-suite \ noskip-cffi-test-suite \ noskip-chicken-test-suite \ - noskip-r-test-suite + noskip-r-test-suite \ + noskip-com-test-suite noskip-%-test-suite: dir="Examples/test-suite/$*"; \ Modified: branches/gsoc2008-jezabek/Source/Include/swigwarn.h =================================================================== --- branches/gsoc2008-jezabek/Source/Include/swigwarn.h 2008-07-18 19:07:38 UTC (rev 10678) +++ branches/gsoc2008-jezabek/Source/Include/swigwarn.h 2008-07-18 23:28:29 UTC (rev 10679) @@ -259,7 +259,14 @@ /* please leave 870-889 free for PHP */ +#define WARN_COM_TYPEMAP_CTYPE_UNDEF 910 +#define WARN_COM_TYPEMAP_COMTYPE_UNDEF 911 +#define WARN_COM_MULTIPLE_INHERITANCE 912 +#define WARN_COM_TYPEMAP_COMBODY_UNDEF 913 +#define WARN_COM_COVARIANT_RET 914 +/* please leave 910-929 free for COM */ + /* Feel free to claim any number in this space that's not currently being used. Just make sure you add an entry here */ Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-18 19:07:38 UTC (rev 10678) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-18 23:28:29 UTC (rev 10679) @@ -332,7 +332,8 @@ Printf(f_module, ")\n]\nlibrary %sTLB {\n\n", module_class_name); // Import IDispatch - Printf(f_module, " importlib(\"stdole32.tlb\");\n\n"); + // FIXME: Printf(f_module, " importlib(\"stdole32.tlb\");\n\n"); + Printf(f_module, " importlib(\"stdole2.tlb\");\n\n"); Printv(f_module, f_proxy_forward_defs, "\n", NIL); @@ -340,6 +341,8 @@ Printf(f_module, " [\n object,\n local,\n uuid("); formatGUID(f_module, &module_iid, false); Printf(f_module, "),\n dual\n ]\n interface %s : IDispatch {\n", module_class_name); + // FIXME: a temporary workaround for a possible WIDL bug + Printf(f_module, " import \"stdole2.idl\";\n"); // Add the wrapper methods Printv(f_module, module_class_code, NIL); @@ -438,7 +441,7 @@ tm = ctypeout; Printf(c_return_type, "%s", tm); } else { - Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(t, 0)); + Swig_warning(WARN_COM_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(t, 0)); } is_void_return = (Cmp(c_return_type, "void") == 0); @@ -488,7 +491,7 @@ if ((tm = Getattr(p, "tmap:ctype"))) { Printv(c_param_type, tm, NIL); } else { - Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(pt, 0)); + Swig_warning(WARN_COM_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(pt, 0)); } // Add parameter to C function @@ -722,7 +725,7 @@ } else if (constructor_flag) { Printf(return_type, "%s *", proxy_class_name); } else { - Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No comtype typemap defined for %s\n", SwigType_str(t, 0)); + Swig_warning(WARN_COM_TYPEMAP_COMTYPE_UNDEF, input_file, line_number, "No comtype typemap defined for %s\n", SwigType_str(t, 0)); } if (proxy_flag && global_variable_flag) { @@ -764,7 +767,7 @@ substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { - Swig_warning(WARN_CSHARP_TYPEMAP_CSWTYPE_UNDEF, input_file, line_number, "No comtype typemap defined for %s\n", SwigType_str(pt, 0)); + Swig_warning(WARN_COM_TYPEMAP_COMTYPE_UNDEF, input_file, line_number, "No comtype typemap defined for %s\n", SwigType_str(pt, 0)); } /* FIXME: get the real argument name, it is important in the IDL */ @@ -828,7 +831,7 @@ } String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); - Swig_warning(WARN_CSHARP_MULTIPLE_INHERITANCE, input_file, line_number, + Swig_warning(WARN_COM_MULTIPLE_INHERITANCE, input_file, line_number, "Warning for %s proxy: Base %s ignored. Multiple inheritance is not supported in C#.\n", proxyclassname, baseclassname); base = Next(base); } @@ -1186,10 +1189,10 @@ substituteClassname(covariant ? covariant : t, tm); Printf(return_type, "%s", tm); if (covariant) - Swig_warning(WARN_CSHARP_COVARIANT_RET, input_file, line_number, + Swig_warning(WARN_COM_COVARIANT_RET, input_file, line_number, "Covariant return types not supported in COM. Proxy method will return %s.\n", SwigType_str(covariant, 0)); } else { - Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No comstype typemap defined for %s\n", SwigType_str(t, 0)); + Swig_warning(WARN_COM_TYPEMAP_COMTYPE_UNDEF, input_file, line_number, "No comstype typemap defined for %s\n", SwigType_str(t, 0)); } if (wrapping_member_flag && !enum_constant_flag) { @@ -1237,7 +1240,7 @@ substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { - Swig_warning(WARN_CSHARP_TYPEMAP_CSTYPE_UNDEF, input_file, line_number, "No comtype typemap defined for %s\n", SwigType_str(pt, 0)); + Swig_warning(WARN_COM_TYPEMAP_COMTYPE_UNDEF, input_file, line_number, "No comtype typemap defined for %s\n", SwigType_str(pt, 0)); } // FIXME: String *arg = makeParameterName(n, p, i, setter_flag); @@ -1286,7 +1289,7 @@ Printv(proxy_class_def, " [\n object,\n local,\n uuid(", NIL); formatGUID(proxy_class_def, proxy_iid, false); Printv(proxy_class_def, ")\n ]\n interface $comclassname {\n", - typemapLookup("combody", type, WARN_CSHARP_TYPEMAP_CSBODY_UNDEF), + typemapLookup("combody", type, WARN_COM_TYPEMAP_COMBODY_UNDEF), typemapLookup("comcode", type, WARN_NONE), " };\n\n", NIL); Modified: branches/gsoc2008-jezabek/configure.in =================================================================== --- branches/gsoc2008-jezabek/configure.in 2008-07-18 19:07:38 UTC (rev 10678) +++ branches/gsoc2008-jezabek/configure.in 2008-07-18 23:28:29 UTC (rev 10679) @@ -1816,6 +1816,124 @@ AC_SUBST(RBIN) #---------------------------------------------------------------- +# Look for COM +#---------------------------------------------------------------- + +AC_ARG_WITH(com, AS_HELP_STRING([--without-com], [Disable COM]), [with_com="$withval"], [with_com=yes]) +AC_ARG_WITH(com-runtool, [ --with-com-runtool=path Set location of the COM run tool (e.g. WINE)],[COM_RUNTOOL="$withval"], [COM_RUNTOOL=]) +AC_ARG_WITH(com-cc, [ --with-com-cc=path Set location of C compiler for COM],[COM_CC="$withval"], [COM_CC=]) +AC_ARG_WITH(com-cxx, [ --with-com-cxx=path Set location of C++ compiler for COM],[COM_CXX="$withval"], [COM_CXX=]) +AC_ARG_WITH(com-idl, [ --with-com-idl=path Set location of COM IDL compiler],[COM_IDL="$withval"], [COM_IDL=]) +AC_ARG_WITH(com-rc, [ --with-com-rc=path Set location of Resource Compiler fom COM],[COM_RC="$withval"],[COM_RC=]) + +# Check if COM is requested +if test x"${with_com}" = xno -o x"${with_alllang}" = xno ; then +AC_MSG_NOTICE([Disabling COM]) + +else + +case $host in +*-*-cygwin* | *-*-mingw*) + COM_CYGPATH_W='cygpath -w' + + if test -z "$COM_RUNTOOL" ; then + COM_RUNTOOL= + fi + if test -z "$COM_CC" ; then + AC_CHECK_PROGS(COM_CC, gcc cl) + fi + if test -z "$COM_CXX" ; then + AC_CHECK_PROGS(COM_CXX, g++ cl) + fi + if test -z "$COM_IDL" ; then + # There seems to be no IDL compiler in MinGW/Cygwin + AC_CHECK_PROGS(COM_IDL, widl midl) + fi + if test -z "$COM_RC" ; then + AC_CHECK_PROGS(COM_RC, windres rc wrc) + fi +;; +*) + COM_CYGPATH_W=echo + + if test -z "$COM_RUNTOOL" ; then + AC_CHECK_PROGS(COM_RUNTOOL, wine) + fi + if test -z "$COM_CC" ; then + AC_CHECK_PROGS(COM_CC, winegcc i586-mingw32msvc-gcc) + fi + if test -z "$COM_CXX" ; then + AC_CHECK_PROGS(COM_CXX, wineg++ i586-mingw32msvc-g++) + fi + if test -z "$COM_IDL" ; then + AC_CHECK_PROGS(COM_IDL, widl) + fi + if test -z "$COM_RC" ; then + AC_CHECK_PROGS(COM_RC, wrc i586-mingw32msvc-windres) + fi + ;; +esac + +if test "widl" = "$COM_IDL" ; then + COM_IDL_SWITCHES=-t +fi + +if test "rc" = "$COM_RC" ; then + COM_RC_OUT_SWITCHES=/fo + COM_RC_IN_SWITCHES= +else + COM_RC_OUT_SWITCHES=-o + COM_RC_IN_SWITCHES=-i +fi + +if test "gcc" = "$COM_CC" -o "i586-mingw32msvc-gcc" = "$COM_CC" ; then + # FIXME + false +elif test "winegcc" = "$COM_CC" ; then + COM_CC_SHARED_SWITCHES=-shared + COM_CC_OUT_SWITCHES='-o ' + COM_CC_SWITCHES= + COM_LIBS='-lole32 -luuid -ladvapi32 -loleaut32' + COM_EXEC_SUFFIX=.so +elif test "cl" = "$COM_CC" ; then + COM_CC_SHARED_SWITCHES=/LD + COM_CC_OUT_SWITCHES=/Fe + COM_CC_SWITCHES= + COM_LIBS='ole32.lib uuid.lib advapi32.lib oleaut32.lib' + COM_EXEC_SUFFIX= +fi + +if test "g++" = "$COM_CXX" -o "i586-mingw32msvc-g++" = "$COM_CXX" ; then + # FIXME + false +elif test "wineg++" = "$COM_CXX" ; then + COM_CXX_SHARED_SWITCHES=-shared + COM_CXX_OUT_SWITCHES="-o " +elif test "cl" = "$COM_CC" ; then + COM_CXX_SHARED_SWITCHES=/LD + COM_CXX_OUT_SWITCHES=/Fe +fi + +fi + +AC_SUBST(COM_RUNTOOL) +AC_SUBST(COM_CC) +AC_SUBST(COM_CXX) +AC_SUBST(COM_IDL) +AC_SUBST(COM_RC) +AC_SUBST(COM_LIBS) +AC_SUBST(COM_IDL_SWITCHES) +AC_SUBST(COM_RC_IN_SWITCHES) +AC_SUBST(COM_RC_OUT_SWITCHES) +AC_SUBST(COM_CC_SHARED_SWITCHES) +AC_SUBST(COM_CC_OUT_SWITCHES) +AC_SUBST(COM_CXX_SHARED_SWITCHES) +AC_SUBST(COM_CXX_OUT_SWITCHES) +AC_SUBST(COM_CC_SWITCHES) +AC_SUBST(COM_EXEC_SUFFIX) +AC_SUBST(COM_CYGPATH_W) + +#---------------------------------------------------------------- # Determine which languages to use for examples/test-suite #---------------------------------------------------------------- @@ -1959,6 +2077,12 @@ #fi AC_SUBST(SKIP_UFFI) +SKIP_COM= +if test -z "$WINE" ; then + SKIP_COM="1" +fi +AC_SUBST(SKIP_COM) + #---------------------------------------------------------------- # Additional language dependencies #---------------------------------------------------------------- @@ -2039,6 +2163,7 @@ Examples/test-suite/cffi/Makefile \ Examples/test-suite/uffi/Makefile \ Examples/test-suite/r/Makefile \ + Examples/test-suite/com/Makefile \ Lib/ocaml/swigp4.ml ]) AC_CONFIG_FILES([preinst-swig], [chmod +x preinst-swig]) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-19 22:47:31
|
Revision: 10684 http://swig.svn.sourceforge.net/swig/?rev=10684&view=rev Author: jezabek Date: 2008-07-19 22:46:15 +0000 (Sat, 19 Jul 2008) Log Message: ----------- Work around a Wine bug in GetModuleFileName (and make the code uglier). Use TCHARs for strings (and make the code even uglier). Wrapper now compiles in MSVC and MinGW in Unicode mode, but does not work due to some bugs. It does not compile in winegcc. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-19 22:45:54 UTC (rev 10683) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-19 22:46:15 UTC (rev 10684) @@ -120,6 +120,7 @@ #include <windows.h> #include <olectl.h> +#include <tchar.h> #include <string.h> #include <memory.h> @@ -278,7 +279,7 @@ typedef struct { SWIG_funcptr newInstance; GUID *guid; - char *guid_string; + TCHAR *guid_string; } SWIGClassDescription_t; HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface1(void *that, GUID *iid, void ** ppvObject) { @@ -376,36 +377,39 @@ } STDAPI DllRegisterServer(void) { - char *module_name; - char *typelib_name; - int allocated = 256; - int used; + TCHAR *module_name; + TCHAR *typelib_name; int i; HRESULT hres = S_OK; + int module_name_len; - do { #ifdef __cplusplus - module_name = new char[allocated]; - typelib_name = new char[allocated]; + module_name = new TCHAR[MAX_PATH + 1]; + typelib_name = new TCHAR[MAX_PATH + 1]; #else - module_name = (char *) malloc(allocated); - typelib_name = (char *) malloc(allocated); + module_name = (TCHAR *) malloc(sizeof(TCHAR) * (MAX_PATH + 1)); + typelib_name = (TCHAR *) malloc(sizeof(TCHAR) * (MAX_PATH + 1)); #endif - used = GetModuleFileName(SWIGModule, module_name, allocated); - if (used == allocated) { -#ifdef __cplusplus - delete module_name; - delete typelib_name; +#ifdef __WINE__ + /* + * Wine has a broken implementation of GetModuleFileName, which does not + * work correctly with Winelib DLLs. This is a very dumb workaround. + * If you know how to fix it properly, please send a patch :) + */ + if (GetCurrentDirectory(MAX_PATH + 1, module_name) == 0 || + _tcslen(module_name) + _tcslen(_T("\\$module.dll.so")) > MAX_PATH) { + /* DLL name will not fit into MAX_PATH characters */ + return E_UNEXPECTED; + } + + _tcscat(module_name, _T("\\$module.dll.so")); #else - free(module_name); - free(typelib_name); + GetModuleFileName(SWIGModule, module_name, MAX_PATH + 1); #endif - allocated *= 2; - } - } while (used == allocated); - strcpy(typelib_name, module_name); + _tcscpy(typelib_name, module_name); + module_name_len = _tcslen(module_name); /* This needs to be made more flexible */ /* For now we assume that the TLB is a resource in the DLL */ @@ -422,7 +426,7 @@ hsubkey = NULL; if (hres == S_OK && - RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID", 0, KEY_ALL_ACCESS, &hkey_clsid) != ERROR_SUCCESS) { + RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hkey_clsid) != ERROR_SUCCESS) { hres = SELFREG_E_CLASS; } @@ -433,18 +437,20 @@ } if (hres == S_OK && - RegCreateKeyEx(hkey, "InprocServer32", 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hsubkey, NULL) != + RegCreateKeyEx(hkey, _T("InprocServer32"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hsubkey, NULL) != ERROR_SUCCESS) { hres = SELFREG_E_CLASS; } if (hres == S_OK && - RegSetValueEx(hsubkey, "", 0, REG_SZ, (BYTE *) module_name, used + 1) != ERROR_SUCCESS) { + RegSetValueEx(hsubkey, _T(""), 0, REG_SZ, (BYTE *) module_name, + sizeof(TCHAR) * (module_name_len + 1)) != ERROR_SUCCESS) { hres = SELFREG_E_CLASS; } if (hres == S_OK && - RegSetValueEx(hsubkey, "ThreadingModel", 0, REG_SZ, (BYTE *) "Both", 5) != ERROR_SUCCESS) { + RegSetValueEx(hsubkey, _T("ThreadingModel"), 0, REG_SZ, (BYTE *) _T("Both"), + sizeof(TCHAR) * 5) != ERROR_SUCCESS) { hres = SELFREG_E_CLASS; } @@ -466,7 +472,7 @@ hkey_win32 = NULL; if (hres == S_OK && - RegOpenKeyEx(HKEY_CLASSES_ROOT, "TypeLib", 0, KEY_ALL_ACCESS, &hkey_typelib) != ERROR_SUCCESS) { + RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("TypeLib"), 0, KEY_ALL_ACCESS, &hkey_typelib) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } @@ -477,52 +483,56 @@ } if (hres == S_OK && - RegCreateKeyEx(hkey, /* FIXME */ "1.0", 0, NULL, + RegCreateKeyEx(hkey, /* FIXME */ _T("1.0"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey_version, NULL) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } if (hres == S_OK && - RegSetValueEx(hkey_version, "", 0, REG_SZ, (BYTE *) "$module", strlen("$module")) != ERROR_SUCCESS) { + RegSetValueEx(hkey_version, _T(""), 0, REG_SZ, (BYTE *) _T("$module"), + sizeof(TCHAR) * _tcslen(_T("$module"))) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } if (hres == S_OK && - RegCreateKeyEx(hkey_version, "HELPDIR", 0, NULL, + RegCreateKeyEx(hkey_version, _T("HELPDIR"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey_helpdir, NULL) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } if (hres == S_OK && - RegSetValueEx(hkey_helpdir, "", 0, REG_SZ, (BYTE *) "0", 2) != ERROR_SUCCESS) { + RegSetValueEx(hkey_helpdir, _T(""), 0, REG_SZ, (BYTE *) "0", + sizeof(TCHAR) * 2) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } if (hres == S_OK && - RegCreateKeyEx(hkey_version, "FLAGS", 0, NULL, + RegCreateKeyEx(hkey_version, _T("FLAGS"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey_flags, NULL) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } if (hres == S_OK && - RegSetValueEx(hkey_flags, "", 0, REG_SZ, (BYTE *) "0", 2) != ERROR_SUCCESS) { + RegSetValueEx(hkey_flags, _T(""), 0, REG_SZ, (BYTE *) _T("0"), + sizeof(TCHAR) * 2) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } if (hres == S_OK && - RegCreateKeyEx(hkey_version, "0", 0, NULL, + RegCreateKeyEx(hkey_version, _T("0"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey_0, NULL) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } if (hres == S_OK && - RegCreateKeyEx(hkey_0, "win32", 0, NULL, + RegCreateKeyEx(hkey_0, _T("win32"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey_win32, NULL) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } if (hres == S_OK && - RegSetValueEx(hkey_win32, "", 0, REG_SZ, (BYTE *) typelib_name, used + 1) != ERROR_SUCCESS) { + RegSetValueEx(hkey_win32, _T(""), 0, REG_SZ, (BYTE *) typelib_name, + sizeof(TCHAR) * (module_name_len + 1)) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } @@ -571,8 +581,63 @@ SWIG_typelib_path = (OLECHAR *) malloc((MAX_PATH + 1) * sizeof(OLECHAR)); #endif - GetModuleFileNameW(SWIGModule, SWIG_typelib_path, MAX_PATH + 1); - LoadTypeLib(SWIG_typelib_path, &SWIG_typelib); + HRESULT hres = S_OK; + +#ifdef __WINE__ + /* + * Wine has a broken implementation of GetModuleFileName, which does not + * work correctly with Winelib DLLs. Here we try to get the module file + * name from the registry. + */ + { + HKEY hkey_typelib = NULL, + hkey = NULL, + hkey_version = NULL, + hkey_0 = NULL; + LONG bytesRead = MAX_PATH + 1; + + if (hres == S_OK && + RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("Typelib"), 0, KEY_ALL_ACCESS, &hkey_typelib) != ERROR_SUCCESS) { + hres = E_UNEXPECTED; + } + + if (hres == S_OK && + RegOpenKeyEx(hkey_typelib, SWIG_tlb_guid_string, 0, KEY_ALL_ACCESS, &hkey) != ERROR_SUCCESS) { + hres = E_UNEXPECTED; + } + + if (hres == S_OK && + RegOpenKeyEx(hkey, /* FIXME */ _T("1.0"), 0, KEY_ALL_ACCESS, &hkey_version) != ERROR_SUCCESS) { + hres = E_UNEXPECTED; + } + + if (hres == S_OK && + RegOpenKeyEx(hkey_version, _T("0"), 0, KEY_ALL_ACCESS, &hkey_0) != ERROR_SUCCESS) { + hres = E_UNEXPECTED; + } + + if (hres == S_OK && + /* NOTE: we explicitly need to use the wide-char version here */ + RegQueryValueW(hkey_0, L"win32", SWIG_typelib_path, &bytesRead) != ERROR_SUCCESS) { + hres = E_UNEXPECTED; + } + + if (hkey_typelib != NULL) + CloseHandle(hkey_typelib); + if (hkey != NULL) + CloseHandle(hkey); + if (hkey_version != NULL) + CloseHandle(hkey_version); + if (hkey_0 != NULL) + CloseHandle(hkey_0); + } +#else + hres = GetModuleFileNameW(SWIGModule, SWIG_typelib_path, MAX_PATH + 1); +#endif + + if (hres == S_OK) { + LoadTypeLib(SWIG_typelib_path, &SWIG_typelib); + } } return TRUE; Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-19 22:45:54 UTC (rev 10683) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-19 22:46:15 UTC (rev 10684) @@ -251,14 +251,14 @@ "\n (SWIG_funcptr) SWIGInvoke", module_class_name, module_class_name); - Printf(clsid_list, "static char * SWIG_tlb_guid_string = \"{"); + Printf(clsid_list, "static TCHAR * SWIG_tlb_guid_string = _T(\"{"); formatGUID(clsid_list, &typelib_guid, false); - Printf(clsid_list, "}\";\n\n"); + Printf(clsid_list, "}\");\n\n"); Printf(clsid_list, "static SWIGClassDescription_t SWIGClassDescription[] = {\n"); - Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, \"{", module_class_name, module_class_name); + Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, _T(\"{", module_class_name, module_class_name); formatGUID(clsid_list, &module_clsid, false); - Printf(clsid_list, "}\" },\n"); + Printf(clsid_list, "}\") },\n"); /* Emit code */ Language::top(n); @@ -956,9 +956,9 @@ formatGUID(proxy_class_vtable_code, proxy_clsid, true); Printf(proxy_class_vtable_code, ";\n\n"); - Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, \"{", proxy_class_name, proxy_class_name); + Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, _T(\"{", proxy_class_name, proxy_class_name); formatGUID(clsid_list, proxy_clsid, false); - Printf(clsid_list, "}\" },\n"); + Printf(clsid_list, "}\") },\n"); } Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface1(void *that, GUID *iid, " This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-19 23:29:12
|
Revision: 10685 http://swig.svn.sourceforge.net/swig/?rev=10685&view=rev Author: jezabek Date: 2008-07-19 23:28:39 +0000 (Sat, 19 Jul 2008) Log Message: ----------- Generate headers from IDL before compiling tests. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in branches/gsoc2008-jezabek/configure.in Modified: branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-07-19 22:46:15 UTC (rev 10684) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-07-19 23:28:39 UTC (rev 10685) @@ -7,6 +7,8 @@ COM_CYGPATH_W = @COM_CYGPATH_W@ COM_EXEC_SUFFIX = @COM_EXEC_SUFFIX@ COM_RUNTOOL = @COM_RUNTOOL@ +COM_IDL = @COM_IDL@ +COM_IDL_HEADER_SWITCHES = @COM_IDL_HEADER_SWITCHES@ srcdir = @srcdir@ top_srcdir = @top_srcdir@/.. top_builddir = @top_builddir@/.. @@ -22,6 +24,7 @@ %.cpptest: $(setup) +(cd $* && $(swig_and_compile_cpp)) + +$(generate_headers) +(cd $* && $(register_component)) +$(run_testcase) +(cd $* && $(unregister_component)) @@ -29,6 +32,7 @@ %.ctest: $(setup) +(cd $* && $(swig_and_compile_c)) + +$(generate_headers) +(cd $* && $(register_component)) +$(run_testcase) +(cd $* && $(unregister_component)) @@ -36,6 +40,7 @@ %.multicpptest: $(setup) +(cd $* && $(swig_and_compile_multi_cpp)) + +$(generate_headers) +(cd $* && $(register_component)) +$(run_testcase) +(cd $* && $(unregister_component)) @@ -58,6 +63,10 @@ unregister_component = \ regsvr32 /u $*.dll$(COM_EXEC_SUFFIX); +# Generates headers from the IDL file +generate_headers = \ + $(COM_IDL) $(COM_IDL_HEADER_SWITCHES) $*.h $*/$*.idl; + # Compiles COM files then runs the testcase. A testcase is only run if # a file is found which has _runme.c appended after the testcase name. run_testcase = \ Modified: branches/gsoc2008-jezabek/configure.in =================================================================== --- branches/gsoc2008-jezabek/configure.in 2008-07-19 22:46:15 UTC (rev 10684) +++ branches/gsoc2008-jezabek/configure.in 2008-07-19 23:28:39 UTC (rev 10685) @@ -1876,6 +1876,10 @@ if test "widl" = "$COM_IDL" ; then COM_IDL_SWITCHES=-t + COM_IDL_HEADER_SWITCHES='-h -H' +elif test "midl" = "$COM_IDL" ; then + COM_IDL_SWITCHES= + COM_IDL_HEADER_SWITCHES='/notlb /h' fi if test "rc" = "$COM_RC" ; then @@ -1921,6 +1925,7 @@ AC_SUBST(COM_RC) AC_SUBST(COM_LIBS) AC_SUBST(COM_IDL_SWITCHES) +AC_SUBST(COM_IDL_HEADER_SWITCHES) AC_SUBST(COM_RC_IN_SWITCHES) AC_SUBST(COM_RC_OUT_SWITCHES) AC_SUBST(COM_CC_SHARED_SWITCHES) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-20 23:22:16
|
Revision: 10688 http://swig.svn.sourceforge.net/swig/?rev=10688&view=rev Author: jezabek Date: 2008-07-20 23:21:32 +0000 (Sun, 20 Jul 2008) Log Message: ----------- Implement DllUnregisterServer. Minor cleanups in registration code. Make inclusion of stdole2.idl conditional on __WIDL__ - makes MIDL work again. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx branches/gsoc2008-jezabek/configure.in Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-20 18:25:20 UTC (rev 10687) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-20 23:21:32 UTC (rev 10688) @@ -377,20 +377,12 @@ } STDAPI DllRegisterServer(void) { - TCHAR *module_name; - TCHAR *typelib_name; + TCHAR module_name[MAX_PATH + 1]; + TCHAR typelib_name[MAX_PATH + 1]; int i; HRESULT hres = S_OK; int module_name_len; -#ifdef __cplusplus - module_name = new TCHAR[MAX_PATH + 1]; - typelib_name = new TCHAR[MAX_PATH + 1]; -#else - module_name = (TCHAR *) malloc(sizeof(TCHAR) * (MAX_PATH + 1)); - typelib_name = (TCHAR *) malloc(sizeof(TCHAR) * (MAX_PATH + 1)); -#endif - #ifdef __WINE__ /* * Wine has a broken implementation of GetModuleFileName, which does not @@ -468,7 +460,7 @@ hkey_version = NULL, hkey_helpdir = NULL, hkey_flags = NULL, - hkey_0 = NULL, + hkey_lcid = NULL, hkey_win32 = NULL; if (hres == S_OK && @@ -520,12 +512,12 @@ if (hres == S_OK && RegCreateKeyEx(hkey_version, _T("0"), 0, NULL, - 0, KEY_ALL_ACCESS, NULL, &hkey_0, NULL) != ERROR_SUCCESS) { + 0, KEY_ALL_ACCESS, NULL, &hkey_lcid, NULL) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } if (hres == S_OK && - RegCreateKeyEx(hkey_0, _T("win32"), 0, NULL, + RegCreateKeyEx(hkey_lcid, _T("win32"), 0, NULL, 0, KEY_ALL_ACCESS, NULL, &hkey_win32, NULL) != ERROR_SUCCESS) { hres = SELFREG_E_TYPELIB; } @@ -546,25 +538,131 @@ CloseHandle(hkey); if (hkey_version != NULL) CloseHandle(hkey_version); - if (hkey_0 != NULL) - CloseHandle(hkey_0); + if (hkey_lcid != NULL) + CloseHandle(hkey_lcid); if (hkey_win32 != NULL) CloseHandle(hkey_win32); } -#ifdef __cplusplus - delete module_name; - delete typelib_name; -#else - free(module_name); - free(typelib_name); -#endif - return hres; } STDAPI DllUnregisterServer(void) { - return S_OK; + HRESULT hres = S_OK; + /* + * We may only remove keys that we created. Therefore some operation may fail + * if we are trying to delete a non-empty key, but this is not an error. + */ + int leftovers = 0; + int i; + + for (i = 0; SWIGClassDescription[i].newInstance != NULL; ++i) { + HKEY hkey_clsid = NULL, + hkey = NULL; + + if (hres == S_OK && + RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("CLSID"), 0, KEY_ALL_ACCESS, &hkey_clsid) != ERROR_SUCCESS) { + hres = SELFREG_E_CLASS; + } + + if (hres == S_OK && + RegOpenKeyEx(hkey_clsid, SWIGClassDescription[i].guid_string, 0, KEY_ALL_ACCESS, &hkey) != ERROR_SUCCESS) { + hres = SELFREG_E_CLASS; + } + + if (hres == S_OK && + RegDeleteKey(hkey, _T("InprocServer32")) != ERROR_SUCCESS) { + hres = SELFREG_E_CLASS; + } + + if (hkey != NULL) + CloseHandle(hkey); + + if (hres == S_OK && + RegDeleteKey(hkey_clsid, SWIGClassDescription[i].guid_string) != ERROR_SUCCESS) { + leftovers = 1; + hres = SELFREG_E_CLASS; + } + + if (hkey_clsid != NULL) + CloseHandle(hkey_clsid); + } + + { + HKEY hkey_typelib = NULL, + hkey = NULL, + hkey_version = NULL, + hkey_lcid = NULL; + + if (hres == S_OK && + RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("TypeLib"), 0, KEY_ALL_ACCESS, &hkey_typelib) != ERROR_SUCCESS) { + hres = SELFREG_E_TYPELIB; + } + + if (hres == S_OK && + RegOpenKeyEx(hkey_typelib, SWIG_tlb_guid_string, 0, KEY_ALL_ACCESS, &hkey) != ERROR_SUCCESS) { + hres = SELFREG_E_TYPELIB; + } + + if (hres == S_OK && + RegOpenKeyEx(hkey, /* FIXME */ _T("1.0"), 0, KEY_ALL_ACCESS, &hkey_version) != ERROR_SUCCESS) { + hres = SELFREG_E_TYPELIB; + } + + if (hres == S_OK && + RegDeleteKey(hkey_version, _T("HELPDIR")) != ERROR_SUCCESS) { + hres = SELFREG_E_TYPELIB; + } + + if (hres == S_OK && + RegDeleteKey(hkey_version, _T("FLAGS")) != ERROR_SUCCESS) { + hres = SELFREG_E_TYPELIB; + } + + if (hres == S_OK && + RegOpenKeyEx(hkey_version, _T("0"), 0, KEY_ALL_ACCESS, &hkey_lcid) != ERROR_SUCCESS) { + hres = SELFREG_E_TYPELIB; + } + + if (hres == S_OK && + RegDeleteKey(hkey_lcid, _T("win32")) != ERROR_SUCCESS) { + hres = SELFREG_E_TYPELIB; + } + + if (hkey_lcid != NULL) + CloseHandle(hkey_lcid); + + if (hres == S_OK && + RegDeleteKey(hkey_version, _T("0")) != ERROR_SUCCESS) { + hres = SELFREG_E_TYPELIB; + } + + if (hkey_version != NULL) + CloseHandle(hkey_version); + + if (hres == S_OK && + RegDeleteKey(hkey, _T("1.0")) != ERROR_SUCCESS) { + hres = SELFREG_E_TYPELIB; + } + + if (hkey != NULL) + CloseHandle(hkey); + + if (hres == S_OK && + RegDeleteKey(hkey_typelib, SWIG_tlb_guid_string) != ERROR_SUCCESS) { + leftovers = 1; + } + + if (hkey_typelib != NULL) + CloseHandle(hkey_typelib); + } + + if (hres == S_OK && leftovers) { + /* Procedure successful, but some leftover keys present */ + return S_FALSE; + } + + return hres; } #ifdef __cplusplus @@ -593,11 +691,11 @@ HKEY hkey_typelib = NULL, hkey = NULL, hkey_version = NULL, - hkey_0 = NULL; + hkey_lcid = NULL; LONG bytesRead = MAX_PATH + 1; if (hres == S_OK && - RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("Typelib"), 0, KEY_ALL_ACCESS, &hkey_typelib) != ERROR_SUCCESS) { + RegOpenKeyEx(HKEY_CLASSES_ROOT, _T("TypeLib"), 0, KEY_ALL_ACCESS, &hkey_typelib) != ERROR_SUCCESS) { hres = E_UNEXPECTED; } @@ -612,13 +710,13 @@ } if (hres == S_OK && - RegOpenKeyEx(hkey_version, _T("0"), 0, KEY_ALL_ACCESS, &hkey_0) != ERROR_SUCCESS) { + RegOpenKeyEx(hkey_version, _T("0"), 0, KEY_ALL_ACCESS, &hkey_lcid) != ERROR_SUCCESS) { hres = E_UNEXPECTED; } if (hres == S_OK && /* NOTE: we explicitly need to use the wide-char version here */ - RegQueryValueW(hkey_0, L"win32", SWIG_typelib_path, &bytesRead) != ERROR_SUCCESS) { + RegQueryValueW(hkey_lcid, L"win32", SWIG_typelib_path, &bytesRead) != ERROR_SUCCESS) { hres = E_UNEXPECTED; } @@ -628,8 +726,8 @@ CloseHandle(hkey); if (hkey_version != NULL) CloseHandle(hkey_version); - if (hkey_0 != NULL) - CloseHandle(hkey_0); + if (hkey_lcid != NULL) + CloseHandle(hkey_lcid); } #else hres = GetModuleFileNameW(SWIGModule, SWIG_typelib_path, MAX_PATH + 1); Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-20 18:25:20 UTC (rev 10687) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-20 23:21:32 UTC (rev 10688) @@ -342,7 +342,9 @@ formatGUID(f_module, &module_iid, false); Printf(f_module, "),\n dual\n ]\n interface %s : IDispatch {\n", module_class_name); // FIXME: a temporary workaround for a possible WIDL bug + Printf(f_module, "#ifdef __WIDL__\n"); Printf(f_module, " import \"stdole2.idl\";\n"); + Printf(f_module, "#endif\n"); // Add the wrapper methods Printv(f_module, module_class_code, NIL); Modified: branches/gsoc2008-jezabek/configure.in =================================================================== --- branches/gsoc2008-jezabek/configure.in 2008-07-20 18:25:20 UTC (rev 10687) +++ branches/gsoc2008-jezabek/configure.in 2008-07-20 23:21:32 UTC (rev 10688) @@ -1891,9 +1891,9 @@ fi if test "gcc" = "$COM_CC" -o "i586-mingw32msvc-gcc" = "$COM_CC" -o "winegcc" = "$COM_CC" ; then - COM_CC_SHARED_SWITCHES=-shared + COM_CC_SHARED_SWITCHES='-shared -mno-cygwin' COM_CC_OUT_SWITCHES='-o ' - COM_CC_SWITCHES= + COM_CC_SWITCHES=-mno-cygwin COM_LIBS='-lole32 -luuid -ladvapi32 -loleaut32' if test "winegcc" = "$COM_CC" ; then COM_EXEC_SUFFIX=.so @@ -1909,7 +1909,7 @@ fi if test "g++" = "$COM_CXX" -o "i586-mingw32msvc-g++" = "$COM_CXX" -o "wineg++" = "$COM_CXX" ; then - COM_CXX_SHARED_SWITCHES=-shared + COM_CXX_SHARED_SWITCHES='-shared -mno-cygwin' COM_CXX_OUT_SWITCHES="-o " elif test "cl" = "$COM_CC" ; then COM_CXX_SHARED_SWITCHES=/LD This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-21 00:13:01
|
Revision: 10689 http://swig.svn.sourceforge.net/swig/?rev=10689&view=rev Author: jezabek Date: 2008-07-21 00:12:52 +0000 (Mon, 21 Jul 2008) Log Message: ----------- Use InterlockedIncrement/Decrement for reference counting. Add a global reference count. Implement DllCanUnloadNow. Delete proxies if their reference counts reach 0 (underlying objects are not affected - proxies need to handle ownership before that is possible). Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-20 23:21:32 UTC (rev 10688) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-21 00:12:52 UTC (rev 10689) @@ -132,21 +132,22 @@ SWIG_funcptr *SWIGWrappedObject_vtable; /* vtable for helper methods */ void *cPtr; /* pointer to the wrapped object */ int cMemOwn; /* memory owned by the proxy? */ - long refCount; /* reference count */ + LONG refCount; /* reference count */ ITypeInfo *typeInfo; /* ITypeInfo object for IDispatch */ } SWIGWrappedObject; GUID IID_ISWIGWrappedObject = { 0x73738294, 0x8833, 0x1182, { 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78 }}; +static LONG globalRefCount = 0; static int SWIGIsEqual(const GUID *a, const GUID *b) { return memcmp(a, b, sizeof(GUID)) == 0; } long SWIGSTDCALL SWIGAddRef1(void *iunk) { - /* FIXME: use InterlockedIncrement */ SWIGWrappedObject *obj = (SWIGWrappedObject *) iunk; - return ++obj->refCount; + InterlockedIncrement(&globalRefCount); + return InterlockedIncrement(&obj->refCount); } long SWIGSTDCALL SWIGAddRef2(void *iunk) { @@ -154,10 +155,20 @@ } long SWIGSTDCALL SWIGRelease1(void *iunk) { - /* FIXME: use InterlockedDecrement */ SWIGWrappedObject *obj = (SWIGWrappedObject *) iunk; - return --obj->refCount; + LONG res = InterlockedDecrement(&obj->refCount); + + if (res == 0) { +#ifdef __cplusplus + delete obj; +#else + free(obj); +#endif + } + + InterlockedDecrement(&globalRefCount); + return res; } long SWIGSTDCALL SWIGRelease2(void *iunk) { @@ -200,13 +211,13 @@ return hres; } -static OLECHAR *SWIG_typelib_path; -static ITypeLib *SWIG_typelib; +static OLECHAR SWIG_typelib_path[MAX_PATH + 1]; +static ITypeLib *SWIG_typelib = NULL; typedef struct { SWIG_funcptr *vtable; SWIG_funcptr newInstance; - long refCount; + LONG refCount; } SWIGClassFactory; /* For consistent manipulation regardless of C or C++ mode */ @@ -215,11 +226,23 @@ } SWIGIUnknown; long SWIGSTDCALL SWIGClassFactoryAddRef(SWIGClassFactory *factory) { - return ++factory->refCount; + InterlockedIncrement(&globalRefCount); + return InterlockedIncrement(&factory->refCount); } long SWIGSTDCALL SWIGClassFactoryRelease(SWIGClassFactory *factory) { - return --factory->refCount; + LONG res = InterlockedDecrement(&factory->refCount); + + if (res == 0) { +#ifdef __cplusplus + delete factory; +#else + free(factory); +#endif + } + + InterlockedDecrement(&globalRefCount); + return res; } HRESULT SWIGSTDCALL SWIGClassFactoryQueryInterface(SWIGClassFactory *factory, GUID *iid, void **ppvObject) { @@ -251,9 +274,6 @@ return E_OUTOFMEMORY; } - /* Add reference */ - ((long (SWIGSTDCALL *)(SWIGIUnknown *)) (obj->vtable[1]))(obj); - hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) obj->vtable[0])(obj, riid, ppvObject); /* Release reference */ @@ -327,7 +347,8 @@ res->SWIGWrappedObject_vtable = _wrap_opaque_SWIGWrappedObject_vtable; res->cPtr = arg; res->cMemOwn = 0; - res->refCount = 0; + InterlockedIncrement(&globalRefCount); + res->refCount = 1; return (void *) res; } @@ -362,6 +383,7 @@ #endif (*ppv)->vtable = SWIGClassFactory_vtable; (*ppv)->newInstance = SWIGClassDescription[i].newInstance; + InterlockedIncrement(&globalRefCount); (*ppv)->refCount = 1; return S_OK; @@ -372,8 +394,22 @@ } STDAPI DllCanUnloadNow(void) { - /* FIXME */ - return S_FALSE; + /* Get the value of globalRefCount in a thread-safe manner */ + /* Could be maybe more elegant */ + LONG value = InterlockedExchangeAdd(&globalRefCount, 0); + + /* + * Note - we have a guarantee that while we are in DllCanUnloadNow + * all CoGetClassObject calls are put on hold. There is a really tiny + * possibility of a race condition if there is a thread that + * just decremented globalRefCount to 0 and is just performing the + * return instruction. + */ + + if (value == 0) + return S_OK; + else + return S_FALSE; } STDAPI DllRegisterServer(void) { @@ -673,12 +709,6 @@ if (fdwReason == DLL_PROCESS_ATTACH) { SWIGModule = hinstDLL; -#ifdef __cplusplus - SWIG_typelib_path = new OLECHAR[MAX_PATH + 1]; -#else - SWIG_typelib_path = (OLECHAR *) malloc((MAX_PATH + 1) * sizeof(OLECHAR)); -#endif - HRESULT hres = S_OK; #ifdef __WINE__ @@ -736,6 +766,12 @@ if (hres == S_OK) { LoadTypeLib(SWIG_typelib_path, &SWIG_typelib); } + } else if (fdwReason == DLL_PROCESS_DETACH) { + if (SWIG_typelib != NULL) { + /* Call release on the typelib */ + SWIGIUnknown *tlb_unknown = (SWIGIUnknown *) SWIG_typelib; + ((long (SWIGSTDCALL *)(SWIGIUnknown *)) (tlb_unknown->vtable[2]))(tlb_unknown); + } } return TRUE; Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-20 23:21:32 UTC (rev 10688) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-21 00:12:52 UTC (rev 10689) @@ -234,7 +234,8 @@ " res->SWIGWrappedObject_vtable = NULL;\n" " res->cPtr = NULL;\n" " res->cMemOwn = 0;\n" - " res->refCount = 0;\n" + " InterlockedIncrement(&globalRefCount);\n" + " res->refCount = 1;\n" " /* GetTypeInfoOfGuid */\n" " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" " return (void *) res;\n" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-21 12:19:47
|
Revision: 10692 http://swig.svn.sourceforge.net/swig/?rev=10692&view=rev Author: jezabek Date: 2008-07-21 12:17:13 +0000 (Mon, 21 Jul 2008) Log Message: ----------- Handle memory ownership. Underlying objects are now deleted when their owning proxies reach refCount 0, and proper destructors are called. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-21 10:55:05 UTC (rev 10691) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-21 12:17:13 UTC (rev 10692) @@ -92,21 +92,21 @@ %typemap(out) void "" %typemap(out) SWIGTYPE * %{ - $result = (SWIGIUnknown *) SWIG_wrap$comclassname((void *) $1); + $result = (SWIGIUnknown *) SWIG_wrap$comclassname((void *) $1, $owner); %} %typemap(out) SWIGTYPE & %{ - $result = (SWIGIUnknown *) SWIG_wrap$comclassname((void *) $1); + $result = (SWIGIUnknown *) SWIG_wrap$comclassname((void *) $1, $owner); %} %typemap(out) SWIGTYPE #ifdef __cplusplus -%{ $result = (SWIGIUnknown *) SWIG_wrap$comclassname((void *) new $1_ltype((const $1_ltype &)$1)); %} +%{ $result = (SWIGIUnknown *) SWIG_wrap$comclassname((void *) new $1_ltype((const $1_ltype &)$1), $owner); %} #else { $&1_ltype $1ptr = ($&1_ltype) malloc(sizeof($1_ltype)); memmove($1ptr, &$1, sizeof($1_type)); - $result = (SWIGIUnknown *) SWIG_wrap$comclassname((void *) $1ptr); + $result = (SWIGIUnknown *) SWIG_wrap$comclassname((void *) $1ptr, $owner); } #endif @@ -128,11 +128,23 @@ typedef void (SWIGSTDCALL *SWIG_funcptr)(void); typedef struct { + SWIG_funcptr *vtable; + SWIG_funcptr newInstance; + LONG refCount; +} SWIGClassFactory; + +/* For consistent manipulation regardless of C or C++ mode */ +typedef struct { + SWIG_funcptr *vtable; +} SWIGIUnknown; + +typedef struct { SWIG_funcptr *vtable; /* vtable for the methods of the wrapped object */ SWIG_funcptr *SWIGWrappedObject_vtable; /* vtable for helper methods */ void *cPtr; /* pointer to the wrapped object */ int cMemOwn; /* memory owned by the proxy? */ LONG refCount; /* reference count */ + void (SWIGSTDCALL *deleteInstance)(SWIGIUnknown *); /* destructor */ ITypeInfo *typeInfo; /* ITypeInfo object for IDispatch */ } SWIGWrappedObject; @@ -160,6 +172,10 @@ LONG res = InterlockedDecrement(&obj->refCount); if (res == 0) { + if (obj->cMemOwn && obj->deleteInstance != 0) { + obj->deleteInstance((SWIGIUnknown *) obj); + } + #ifdef __cplusplus delete obj; #else @@ -214,17 +230,6 @@ static OLECHAR SWIG_typelib_path[MAX_PATH + 1]; static ITypeLib *SWIG_typelib = NULL; -typedef struct { - SWIG_funcptr *vtable; - SWIG_funcptr newInstance; - LONG refCount; -} SWIGClassFactory; - -/* For consistent manipulation regardless of C or C++ mode */ -typedef struct { - SWIG_funcptr *vtable; -} SWIGIUnknown; - long SWIGSTDCALL SWIGClassFactoryAddRef(SWIGClassFactory *factory) { InterlockedIncrement(&globalRefCount); return InterlockedIncrement(&factory->refCount); @@ -337,7 +342,7 @@ (SWIG_funcptr) SWIGRelease1, }; -void * SWIGSTDCALL SWIG_wrap_opaque(void *arg) { +void * SWIGSTDCALL SWIG_wrap_opaque(void *arg, int cMemOwn) { #ifdef __cplusplus SWIGWrappedObject *res = new SWIGWrappedObject; #else @@ -346,7 +351,7 @@ res->vtable = _wrap_opaque_vtable; res->SWIGWrappedObject_vtable = _wrap_opaque_SWIGWrappedObject_vtable; res->cPtr = arg; - res->cMemOwn = 0; + res->cMemOwn = cMemOwn; InterlockedIncrement(&globalRefCount); res->refCount = 1; return (void *) res; Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-21 10:55:05 UTC (rev 10691) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-21 12:17:13 UTC (rev 10692) @@ -232,10 +232,12 @@ "#endif\n" " res->vtable = _wrap%s_vtable;\n" " res->SWIGWrappedObject_vtable = NULL;\n" + " /* cPtr and cMemOwn make no sense for the module class */\n" " res->cPtr = NULL;\n" " res->cMemOwn = 0;\n" " InterlockedIncrement(&globalRefCount);\n" " res->refCount = 1;\n" + " res->deleteInstance = 0;\n" " /* GetTypeInfoOfGuid */\n" " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" " return (void *) res;\n" @@ -1077,7 +1079,7 @@ Printv(proxy_class_vtable_code, "\n};\n\n", NIL); - Printf(proxy_class_vtable_code, "void * SWIGSTDCALL SWIG_wrap%s(void *arg) {\n" + Printf(proxy_class_vtable_code, "void * SWIGSTDCALL SWIG_wrap%s(void *arg, int cMemOwn) {\n" "#ifdef __cplusplus\n" " SWIGWrappedObject *res = new SWIGWrappedObject;\n" "#else\n" @@ -1086,15 +1088,16 @@ " res->vtable = _wrap%svtable;\n" " res->SWIGWrappedObject_vtable = _wrap%sSWIGWrappedObject_vtable;\n" " res->cPtr = arg;\n" - " res->cMemOwn = 0;\n" + " res->cMemOwn = cMemOwn;\n" " res->refCount = 0;\n" + " res->deleteInstance = _wrap_delete_%s;\n" " /* GetTypeInfoOfGuid */\n" " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" " return (void *) res;\n" "}\n\n", - proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name); + proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name); - Printf(proxy_class_vtable_defs, "void * SWIGSTDCALL SWIG_wrap%s(void *arg);\n", proxy_class_name); + Printf(proxy_class_vtable_defs, "void * SWIGSTDCALL SWIG_wrap%s(void *arg, int cMemOwn);\n", proxy_class_name); Printv(f_vtables, proxy_class_vtable_code, NIL); Printv(f_vtable_defs, proxy_class_vtable_defs, NIL); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-21 18:55:55
|
Revision: 10697 http://swig.svn.sourceforge.net/swig/?rev=10697&view=rev Author: jezabek Date: 2008-07-21 18:55:52 +0000 (Mon, 21 Jul 2008) Log Message: ----------- Use DEFINE_GUID. Use REFGUID instead of GUID*. Remove SWIGIsEqual and replace it with IsEqualGUID. No functional differences. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-21 18:22:43 UTC (rev 10696) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-21 18:55:52 UTC (rev 10697) @@ -31,8 +31,8 @@ SWIGIUnknown *wrapper; /* Call to QueryInterface */ - HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) - $input->vtable[0])($input, &IID_ISWIGWrappedObject, (void **) &wrapper); + HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, REFIID, void **)) + $input->vtable[0])($input, IID_ISWIGWrappedObject, (void **) &wrapper); if (hr != S_OK) { /* Argument was not wrapped by SWIG - directors will be needed */ @@ -51,8 +51,8 @@ SWIGIUnknown *wrapper; /* Call to QueryInterface */ - HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) - $input->vtable[0])($input, &IID_ISWIGWrappedObject, (void **) &wrapper); + HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, REFIID, void **)) + $input->vtable[0])($input, IID_ISWIGWrappedObject, (void **) &wrapper); if (hr != S_OK) { /* Argument was not wrapped by SWIG - directors will be needed */ @@ -71,8 +71,8 @@ SWIGIUnknown *wrapper; /* Call to QueryInterface */ - HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) - $input->vtable[0])($input, &IID_ISWIGWrappedObject, (void **) &wrapper); + HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, REFIID, void **)) + $input->vtable[0])($input, IID_ISWIGWrappedObject, (void **) &wrapper); if (hr != S_OK) { /* Argument was not wrapped by SWIG - directors will be needed */ @@ -121,6 +121,7 @@ #include <windows.h> #include <olectl.h> #include <tchar.h> +#include <initguid.h> #include <string.h> #include <memory.h> @@ -148,13 +149,9 @@ ITypeInfo *typeInfo; /* ITypeInfo object for IDispatch */ } SWIGWrappedObject; -GUID IID_ISWIGWrappedObject = { 0x73738294, 0x8833, 0x1182, { 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78 }}; +DEFINE_GUID(IID_ISWIGWrappedObject, 0x73738294, 0x8833, 0x1182, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78); static LONG globalRefCount = 0; -static int SWIGIsEqual(const GUID *a, const GUID *b) { - return memcmp(a, b, sizeof(GUID)) == 0; -} - long SWIGSTDCALL SWIGAddRef1(void *iunk) { SWIGWrappedObject *obj = (SWIGWrappedObject *) iunk; @@ -250,8 +247,8 @@ return res; } -HRESULT SWIGSTDCALL SWIGClassFactoryQueryInterface(SWIGClassFactory *factory, GUID *iid, void **ppvObject) { - if (SWIGIsEqual(iid, &IID_IUnknown) || SWIGIsEqual(iid, &IID_IClassFactory)) { +HRESULT SWIGSTDCALL SWIGClassFactoryQueryInterface(SWIGClassFactory *factory, REFIID iid, void **ppvObject) { + if (IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IClassFactory)) { SWIGClassFactoryAddRef(factory); *ppvObject = factory; @@ -261,7 +258,7 @@ } } -HRESULT SWIGSTDCALL SWIGClassFactoryCreateInstance(SWIGClassFactory *factory, IUnknown *punkOuter, GUID *riid, void **ppvObject) +HRESULT SWIGSTDCALL SWIGClassFactoryCreateInstance(SWIGClassFactory *factory, IUnknown *punkOuter, REFIID riid, void **ppvObject) { HRESULT hr; SWIGIUnknown *obj; @@ -279,7 +276,7 @@ return E_OUTOFMEMORY; } - hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) obj->vtable[0])(obj, riid, ppvObject); + hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, REFIID, void **)) obj->vtable[0])(obj, riid, ppvObject); /* Release reference */ ((long (SWIGSTDCALL *)(SWIGIUnknown *)) (obj->vtable[2]))(obj); @@ -303,19 +300,19 @@ typedef struct { SWIG_funcptr newInstance; - GUID *guid; + REFGUID guid; TCHAR *guid_string; } SWIGClassDescription_t; -HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface1(void *that, GUID *iid, void ** ppvObject) { - if (SWIGIsEqual(iid, &IID_ISWIGWrappedObject)) { +HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface1(void *that, REFIID iid, void ** ppvObject) { + if (IsEqualIID(iid, IID_ISWIGWrappedObject)) { /* FIXME: This could be more elegant */ SWIGAddRef1(that); *ppvObject = (void *) ((void **)that + 1); return S_OK; } - if (SWIGIsEqual(iid, &IID_IUnknown)) { + if (IsEqualIID(iid, IID_IUnknown)) { /* FIXME: This could be more elegant */ SWIGAddRef1(that); *ppvObject = that; @@ -325,7 +322,7 @@ return E_NOINTERFACE; } -HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface2(void *that, GUID *iid, void ** ppvObject) { +HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface2(void *that, REFIID iid, void ** ppvObject) { return _wrap_opaque_QueryInterface1((void *) ((void **) that - 1), iid, ppvObject); } @@ -363,23 +360,16 @@ static HMODULE SWIGModule; -STDAPI DllGetClassObject(REFCLSID _rclsid, REFIID _riid, LPVOID *_ppv) { -#ifdef __cplusplus - const GUID *rclsid = &_rclsid; - const GUID *riid = &_riid; -#else - const GUID *rclsid = _rclsid; - const GUID *riid = _riid; -#endif +STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *_ppv) { int i; SWIGClassFactory **ppv = (SWIGClassFactory **)(void *) _ppv; - if (!SWIGIsEqual(riid, &IID_IUnknown) && !SWIGIsEqual(riid, &IID_IClassFactory)) + if (!IsEqualIID(riid, IID_IUnknown) && !IsEqualIID(riid, IID_IClassFactory)) return E_NOINTERFACE; for (i = 0; SWIGClassDescription[i].newInstance != NULL; ++i) { - if (SWIGIsEqual(rclsid, SWIGClassDescription[i].guid)) { + if (IsEqualCLSID(rclsid, SWIGClassDescription[i].guid)) { /* Create a new class factory for the requested CLSID */ #ifdef __cplusplus *ppv = new SWIGClassFactory; Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-21 18:22:43 UTC (rev 10696) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-21 18:55:52 UTC (rev 10697) @@ -197,20 +197,20 @@ module_class_vtable_code = NewString(""); - Printf(module_class_vtable_code, "GUID IID_%s = ", module_class_name); + Printf(module_class_vtable_code, "DEFINE_GUID(IID_%s, ", module_class_name); formatGUID(module_class_vtable_code, &module_iid, true); - Printf(module_class_vtable_code, ";\n\n"); + Printf(module_class_vtable_code, ");\n\n"); - Printf(module_class_vtable_code, "GUID CLSID_%s = ", module_class_name); + Printf(module_class_vtable_code, "DEFINE_GUID(CLSID_%s, ", module_class_name); formatGUID(module_class_vtable_code, &module_clsid, true); - Printf(module_class_vtable_code, ";\n\n"); + Printf(module_class_vtable_code, ");\n\n"); - Printf(module_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface(void *that, GUID *iid, " + Printf(module_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface(void *that, REFIID iid, " "void ** ppvObject) {\n", module_class_name); - Printf(module_class_vtable_code, " if (SWIGIsEqual(iid, &IID_IUnknown) ||\n" - " SWIGIsEqual(iid, &IID_IDispatch) ||\n" - " SWIGIsEqual(iid, &IID_%s)", module_class_name); + Printf(module_class_vtable_code, " if (IsEqualIID(iid, IID_IUnknown) ||\n" + " IsEqualIID(iid, IID_IDispatch) ||\n" + " IsEqualIID(iid, IID_%s)", module_class_name); Printf(module_class_vtable_code, ") {\n" " /* FIXME: This could be more elegant */\n" @@ -239,7 +239,7 @@ " res->refCount = 1;\n" " res->deleteInstance = 0;\n" " /* GetTypeInfoOfGuid */\n" - " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" + " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, REFGUID, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, IID_%s, &res->typeInfo);\n" " return (void *) res;\n" "};\n\n", module_class_name, module_class_name, module_class_name); @@ -259,7 +259,7 @@ Printf(clsid_list, "}\");\n\n"); Printf(clsid_list, "static SWIGClassDescription_t SWIGClassDescription[] = {\n"); - Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, _T(\"{", module_class_name, module_class_name); + Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, CLSID_%s, _T(\"{", module_class_name, module_class_name); formatGUID(clsid_list, &module_clsid, false); Printf(clsid_list, "}\") },\n"); @@ -267,7 +267,7 @@ Language::top(n); /* Insert guard element */ - Printf(clsid_list, " { NULL, NULL, NULL } /* guard element */\n"); + Printf(clsid_list, " { NULL, IID_IUnknown, NULL } /* guard element */\n"); Printf(clsid_list, "};\n\n"); @@ -902,7 +902,7 @@ void formatGUID(File *output, GUID *input, bool cFormat) { if (cFormat) { Printf(output, - "{ 0x%08x, 0x%04x, 0x%04x, { 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x}}", + "0x%08x, 0x%04x, 0x%04x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x", input->Data1, input->Data2, input->Data3, input->Data4[0], input->Data4[1], input->Data4[2], input->Data4[3], input->Data4[4], input->Data4[5], input->Data4[6], input->Data4[7]); } else { @@ -948,30 +948,30 @@ generateGUID(proxy_iid); Setattr(n, "wrap:iid", proxy_iid); - Printf(proxy_class_vtable_code, "GUID IID_%s = ", proxy_class_name); + Printf(proxy_class_vtable_code, "DEFINE_GUID(IID_%s, ", proxy_class_name); formatGUID(proxy_class_vtable_code, proxy_iid, true); - Printf(proxy_class_vtable_code, ";\n\n"); + Printf(proxy_class_vtable_code, ");\n\n"); if (!Getattr(n, "abstract")) { /* Generate class object */ proxy_clsid = new GUID; generateGUID(proxy_clsid); - Printf(proxy_class_vtable_code, "GUID CLSID_%s = ", proxy_class_name); + Printf(proxy_class_vtable_code, "DEFINE_GUID(CLSID_%s, ", proxy_class_name); formatGUID(proxy_class_vtable_code, proxy_clsid, true); - Printf(proxy_class_vtable_code, ";\n\n"); + Printf(proxy_class_vtable_code, ");\n\n"); - Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, _T(\"{", proxy_class_name, proxy_class_name); + Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, CLSID_%s, _T(\"{", proxy_class_name, proxy_class_name); formatGUID(clsid_list, proxy_clsid, false); Printf(clsid_list, "}\") },\n"); } - Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface1(void *that, GUID *iid, " + Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface1(void *that, REFIID iid, " "void ** ppvObject) {\n", proxy_class_name); /* Look if the requested interface is ISWIGWrappedObject */ Printf(proxy_class_vtable_code, - " if (SWIGIsEqual(iid, &IID_ISWIGWrappedObject)) {\n" + " if (IsEqualIID(iid, IID_ISWIGWrappedObject)) {\n" " /* FIXME: This could be more elegant */\n" " SWIGAddRef1(that);\n" /* Address of current object, incremented by the size of a pointer */ @@ -979,9 +979,9 @@ " return S_OK;\n" " }\n\n"); - Printf(proxy_class_vtable_code, " if (SWIGIsEqual(iid, &IID_IUnknown) ||\n" - " SWIGIsEqual(iid, &IID_IDispatch) ||\n" - " SWIGIsEqual(iid, &IID_%s)", proxy_class_name); + Printf(proxy_class_vtable_code, " if (IsEqualIID(iid, IID_IUnknown) ||\n" + " IsEqualIID(iid, IID_IDispatch) ||\n" + " IsEqualIID(iid, IID_%s)", proxy_class_name); bases = Getattr(n, "bases"); @@ -989,7 +989,7 @@ while (bases) { Iterator base = First(bases); - Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_%s)", Getattr(base.item, "sym:name")); + Printf(proxy_class_vtable_code, " ||\n IsEqualIID(iid, IID_%s)", Getattr(base.item, "sym:name")); /* Get next base */ bases = Getattr(base.item, "bases"); @@ -1006,7 +1006,7 @@ bases = NULL; - Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface2(void *that, GUID *iid, " + Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface2(void *that, REFIID iid, " "void ** ppvObject) {\n", proxy_class_name); Printf(proxy_class_vtable_code, @@ -1092,7 +1092,7 @@ " res->refCount = 0;\n" " res->deleteInstance = _wrap_delete_%s;\n" " /* GetTypeInfoOfGuid */\n" - " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" + " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, REFGUID, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, IID_%s, &res->typeInfo);\n" " return (void *) res;\n" "}\n\n", proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-22 20:27:23
|
Revision: 10700 http://swig.svn.sourceforge.net/swig/?rev=10700&view=rev Author: jezabek Date: 2008-07-22 20:27:21 +0000 (Tue, 22 Jul 2008) Log Message: ----------- Merged revisions 10672,10676-10677,10682-10683 via svnmerge from https://swig.svn.sourceforge.net/svnroot/swig/trunk ........ r10672 | olly | 2008-07-17 03:17:08 +0200 (Thu, 17 Jul 2008) | 2 lines Fix a typo; improve wording. ........ r10676 | wsfulton | 2008-07-17 23:05:49 +0200 (Thu, 17 Jul 2008) | 1 line SF #2019156 Configuring with --without-octave or --without-alllang did not disable octave. ........ r10677 | wsfulton | 2008-07-17 23:08:22 +0200 (Thu, 17 Jul 2008) | 1 line tidy output after detecting X11 headers ........ r10682 | wsfulton | 2008-07-19 20:08:06 +0200 (Sat, 19 Jul 2008) | 1 line a bit more on pgcpp ........ r10683 | wsfulton | 2008-07-20 00:45:54 +0200 (Sun, 20 Jul 2008) | 1 line Fix building of Tcl examples/test-suite on Mac OSX ........ Modified Paths: -------------- branches/gsoc2008-jezabek/CHANGES.current branches/gsoc2008-jezabek/Doc/Manual/Java.html branches/gsoc2008-jezabek/Examples/Makefile.in branches/gsoc2008-jezabek/configure.in Property Changed: ---------------- branches/gsoc2008-jezabek/ Property changes on: branches/gsoc2008-jezabek ___________________________________________________________________ Modified: svnmerge-integrated - /trunk:1-10663 + /trunk:1-10699 Modified: branches/gsoc2008-jezabek/CHANGES.current =================================================================== --- branches/gsoc2008-jezabek/CHANGES.current 2008-07-22 18:20:29 UTC (rev 10699) +++ branches/gsoc2008-jezabek/CHANGES.current 2008-07-22 20:27:21 UTC (rev 10700) @@ -1,13 +1,20 @@ Version 1.3.37 (in progress) ============================= +2008-07-19: wsfulton + Fix building of Tcl examples/test-suite on Mac OSX reported by Gideon Simpson. + +2008-07-17: wsfulton + Fix SF #2019156 Configuring with --without-octave or --without-alllang + did not disable octave. + 2008-07-14: wsfultonn [Java, C#] Fix director typemaps for pointers so that NULL pointers are correctly marshalled to C#/Java null in director methods. 2008-07-04: olly [PHP] For std_vector.i and std_map.i, rename empty() to is_empty() - since "empty" is a PHP reserved word. Based of patch from Mark Klein + since "empty" is a PHP reserved word. Based on patch from Mark Klein in SF#1943417. 2008-07-04: olly @@ -25,8 +32,8 @@ 2008-07-02: olly [PHP4] Support for PHP4 has been removed. The PHP developers are - no longer making new PHP4 releases, and won't even be patching - critical security issues after 2008-08-08. + no longer making new PHP4 releases, and won't even be providing + patches for critical security issues after 2008-08-08. 2008-07-02: olly [Python] Import the C extension differently for Python 2.6 and Modified: branches/gsoc2008-jezabek/Doc/Manual/Java.html =================================================================== --- branches/gsoc2008-jezabek/Doc/Manual/Java.html 2008-07-22 18:20:29 UTC (rev 10699) +++ branches/gsoc2008-jezabek/Doc/Manual/Java.html 2008-07-22 20:27:21 UTC (rev 10700) @@ -2857,7 +2857,11 @@ <p> The premature garbage collection prevention parameter for proxy classes is generated by default whenever proxy classes are passed by value, reference or with a pointer. -The additional parameters do impose a slight performance overhead and the parameter generation can be suppressed globally with the <tt>-nopgcpp</tt> commandline option. +The implementation for this extra parameter generation requires the "jtype" typemap to contain <tt>long</tt> and the "jstype" typemap to contain the name of a proxy class. +<p> + +<p> +The additional parameter does impose a slight performance overhead and the parameter generation can be suppressed globally with the <tt>-nopgcpp</tt> commandline option. More selective suppression is possible with the 'nopgcpp' attribute in the "jtype" <a href="#java_typemaps">Java typemap</a>. The attribute is a flag and so should be set to "1" to enable the suppression, or it can be omitted or set to "0" to disable. For example: Modified: branches/gsoc2008-jezabek/Examples/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/Makefile.in 2008-07-22 18:20:29 UTC (rev 10699) +++ branches/gsoc2008-jezabek/Examples/Makefile.in 2008-07-22 20:27:21 UTC (rev 10700) @@ -96,6 +96,8 @@ # Extra Tcl specific dynamic linking options TCL_DLNK = @TCLDYNAMICLINKING@ TCL_SO = @TCL_SO@ +TCLLDSHARED = @TCLLDSHARED@ +TCLCXXSHARED = @TCLCXXSHARED@ # ----------------------------------------------------------- # Build a new version of the tclsh shell @@ -134,7 +136,7 @@ tcl: $(SRCS) $(SWIG) -tcl8 $(SWIGOPT) $(TCL_SWIGOPTS) $(INTERFACE) $(CC) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(ISRCS) $(INCLUDES) $(TCL_INCLUDE) - $(LDSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(TCL_DLNK) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(TCL_SO) + $(TCLLDSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(TCL_DLNK) $(LIBS) -o $(LIBPREFIX)$(TARGET)$(TCL_SO) # ----------------------------------------------------------- # Build a Tcl7.5 dynamic loadable module for C++ @@ -143,7 +145,7 @@ tcl_cpp: $(SRCS) $(SWIG) -tcl8 -c++ $(SWIGOPT) $(TCL_SWIGOPTS) $(INTERFACE) $(CXX) -c $(CCSHARED) $(CFLAGS) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(INCLUDES) $(TCL_INCLUDE) - $(CXXSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(TCL_DLNK) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(TCL_SO) + $(TCLCXXSHARED) $(CFLAGS) $(OBJS) $(IOBJS) $(TCL_DLNK) $(LIBS) $(CPP_DLLIBS) -o $(LIBPREFIX)$(TARGET)$(TCL_SO) # ----------------------------------------------------------------- # Cleaning the Tcl examples Modified: branches/gsoc2008-jezabek/configure.in =================================================================== --- branches/gsoc2008-jezabek/configure.in 2008-07-22 18:20:29 UTC (rev 10699) +++ branches/gsoc2008-jezabek/configure.in 2008-07-22 20:27:21 UTC (rev 10700) @@ -376,12 +376,12 @@ dirs="/usr/unsupported/include /usr/local/include /usr/X386/include /usr/include/X11R4 /usr/X11R5/include /usr/include/X11R5 /usr/openwin/include /usr/X11/include /usr/sww/include /usr/X11R6/include /usr/include/X11R6" for i in $dirs ; do if test -r $i/X11/Intrinsic.h; then - AC_MSG_RESULT($i) XINCLUDES=" -I$i" break fi done fi + AC_MSG_RESULT($XINCLUDES) else if test "$x_includes" != ""; then XINCLUDES=-I$x_includes @@ -533,14 +533,27 @@ # Cygwin (Windows) needs the library for dynamic linking case $host in *-*-cygwin* | *-*-mingw*) TCLDYNAMICLINKING="$TCLLIB";; -*-*-darwin*) TCLDYNAMICLINKING="-dynamiclib -flat_namespace -undefined suppress";; *)TCLDYNAMICLINKING="";; esac + +case $host in +*-*-darwin*) + TCLLDSHARED='$(CC) -dynamiclib -undefined suppress -flat_namespace' + TCLCXXSHARED='$(CXX) -dynamiclib -undefined suppress -flat_namespace' + ;; +*) + TCLLDSHARED='$(LDSHARED)' + TCLCXXSHARED='$(CXXSHARED)' + ;; +esac + fi AC_SUBST(TCLINCLUDE) AC_SUBST(TCLLIB) AC_SUBST(TCLDYNAMICLINKING) +AC_SUBST(TCLLDSHARED) +AC_SUBST(TCLCXXSHARED) #---------------------------------------------------------------- # Look for Python @@ -732,13 +745,13 @@ OCTAVE_SO=.oct AC_ARG_WITH(octave, AS_HELP_STRING([--without-octave], [Disable Octave]) -AS_HELP_STRING([--with-octave=path], [Set location of Octave executable]),[ OCTAVEBIN="$withval"], [OCTAVEBIN=yes]) +AS_HELP_STRING([--with-octave=path], [Set location of Octave executable]),[OCTAVEBIN="$withval"], [OCTAVEBIN=yes]) # First, check for "--without-octave" or "--with-octave=no". if test x"${OCTAVEBIN}" = xno -o x"${with_alllang}" = xno ; then AC_MSG_NOTICE([Disabling Octave]) OCTAVE= -fi +else # First figure out what the name of Octave is @@ -779,6 +792,8 @@ AC_MSG_RESULT(could not figure out how to run octave) fi +fi + AC_SUBST(OCTAVE) AC_SUBST(OCTAVEEXT) AC_SUBST(OCTAVE_SO) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-22 22:04:34
|
Revision: 10701 http://swig.svn.sourceforge.net/swig/?rev=10701&view=rev Author: jezabek Date: 2008-07-22 22:04:31 +0000 (Tue, 22 Jul 2008) Log Message: ----------- Add OLE Automation names into the registry (by default <module_name>.<class_name>). Add -namespace parameter to specify custom prefixes. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-22 20:27:21 UTC (rev 10700) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-22 22:04:31 UTC (rev 10701) @@ -302,6 +302,7 @@ SWIG_funcptr newInstance; REFGUID guid; TCHAR *guid_string; + TCHAR *oleaut_string; } SWIGClassDescription_t; HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface1(void *that, REFIID iid, void ** ppvObject) { @@ -483,6 +484,31 @@ CloseHandle(hkey); if (hsubkey != NULL) CloseHandle(hsubkey); + + hkey = hkey_clsid = NULL; + + if (hres == S_OK && + RegCreateKeyEx(HKEY_CLASSES_ROOT, SWIGClassDescription[i].oleaut_string, 0, NULL, + 0, KEY_ALL_ACCESS, NULL, &hkey, NULL) != ERROR_SUCCESS) { + hres = SELFREG_E_CLASS; + } + + if (hres == S_OK && + RegCreateKeyEx(hkey, _T("CLSID"), 0, NULL, + 0, KEY_ALL_ACCESS, NULL, &hkey_clsid, NULL) != ERROR_SUCCESS) { + hres = SELFREG_E_CLASS; + } + + if (hres == S_OK && + RegSetValueEx(hkey_clsid, _T(""), 0, REG_SZ, (BYTE *) SWIGClassDescription[i].guid_string, + sizeof(TCHAR) * 39) != ERROR_SUCCESS) { + hres = SELFREG_E_CLASS; + } + + if (hkey_clsid != NULL) + CloseHandle(hkey_clsid); + if (hkey != NULL) + CloseHandle(hkey); } { @@ -612,11 +638,30 @@ if (hres == S_OK && RegDeleteKey(hkey_clsid, SWIGClassDescription[i].guid_string) != ERROR_SUCCESS) { leftovers = 1; - hres = SELFREG_E_CLASS; } if (hkey_clsid != NULL) CloseHandle(hkey_clsid); + + hkey = NULL; + + if (hres == S_OK && + RegOpenKeyEx(HKEY_CLASSES_ROOT, SWIGClassDescription[i].oleaut_string, 0, KEY_ALL_ACCESS, &hkey) != ERROR_SUCCESS) { + hres = SELFREG_E_CLASS; + } + + if (hres == S_OK && + RegDeleteKey(hkey, _T("CLSID")) != ERROR_SUCCESS) { + hres = SELFREG_E_CLASS; + } + + if (hkey != NULL) + CloseHandle(hkey); + + if (hres == S_OK && + RegDeleteKey(HKEY_CLASSES_ROOT, SWIGClassDescription[i].oleaut_string) != ERROR_SUCCESS) { + leftovers = 1; + } } { Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-22 20:27:21 UTC (rev 10700) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-22 22:04:31 UTC (rev 10701) @@ -202,6 +202,7 @@ String *module_class_name; // module class name String *module_class_code; + String *namespce; public: @@ -217,7 +218,8 @@ enum_constant_flag(false), proxy_class_vtable_code(NewString("")), proxy_class_vtable_defs(NewString("")), - clsid_list(NewString("")) { + clsid_list(NewString("")), + namespce(NULL) { /* Use NIL GUID by default */ memset(&guid_seed, 0, sizeof(GUID)); memset(&typelib_guid, 0, sizeof(GUID)); @@ -266,6 +268,16 @@ } else if (strcmp(argv[i], "-norcfile") == 0) { Swig_mark_arg(i); rcfile_flag = false; + } else if (strcmp(argv[i], "-namespace") == 0) { + if (argv[i + 1]) { + namespce = NewString(""); + Printf(namespce, argv[i + 1]); + Swig_mark_arg(i); + Swig_mark_arg(i + 1); + i++; + } else { + Swig_arg_error(); + } } } } @@ -349,6 +361,9 @@ /* FIXME: do it as it is done in other targets */ module_class_name = Copy(Getattr(n, "name")); + if (!namespce) + namespce = Copy(module_class_name); + module_class_code = NewString(""); proxy_class_def = NewString(""); proxy_class_forward_def = NewString(""); @@ -438,13 +453,13 @@ Printf(clsid_list, "static SWIGClassDescription_t SWIGClassDescription[] = {\n"); Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, CLSID_%s, _T(\"{", module_class_name, module_class_name); formatGUID(clsid_list, &module_clsid, false); - Printf(clsid_list, "}\") },\n"); + Printf(clsid_list, "}\"), _T(\"%s.%s\") },\n", namespce, module_class_name); /* Emit code */ Language::top(n); /* Insert guard element */ - Printf(clsid_list, " { NULL, IID_IUnknown, NULL } /* guard element */\n"); + Printf(clsid_list, " { NULL, IID_IUnknown, NULL, NULL } /* guard element */\n"); Printf(clsid_list, "};\n\n"); @@ -571,6 +586,7 @@ Close(f_rcfile); Delete(f_rcfile); } + Delete(namespce); return SWIG_OK; } @@ -1268,7 +1284,7 @@ Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, CLSID_%s, _T(\"{", proxy_class_name, proxy_class_name); formatGUID(clsid_list, proxy_clsid, false); - Printf(clsid_list, "}\") },\n"); + Printf(clsid_list, "}\"), _T(\"%s.%s\") },\n", namespce, proxy_class_name); } Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface1(void *that, REFIID iid, " @@ -1750,6 +1766,8 @@ const char *COM::usage = (char *) "\ COM Options (available with -com)\n\ + -namespace <nm> - Use <nm> as prefix for Automation names\n\ + (defaults to module name)\n\ -norcfile - Do not generate RC (resource definition) file\n\ -nodeffile - Do not generate DEF file\n\ -nodllexports - Do not generate DllGetClassObject and DllCanUnloadNow\n\ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-22 22:44:21
|
Revision: 10702 http://swig.svn.sourceforge.net/swig/?rev=10702&view=rev Author: jezabek Date: 2008-07-22 22:44:19 +0000 (Tue, 22 Jul 2008) Log Message: ----------- Revert commit 10696 - DEFINE_GUID, REFIID, REFGUID have all been changed back to GUID*. C modules work again. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-22 22:04:31 UTC (rev 10701) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-22 22:44:19 UTC (rev 10702) @@ -31,8 +31,8 @@ SWIGIUnknown *wrapper; /* Call to QueryInterface */ - HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, REFIID, void **)) - $input->vtable[0])($input, IID_ISWIGWrappedObject, (void **) &wrapper); + HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) + $input->vtable[0])($input, &IID_ISWIGWrappedObject, (void **) &wrapper); if (hr != S_OK) { /* Argument was not wrapped by SWIG - directors will be needed */ @@ -51,8 +51,8 @@ SWIGIUnknown *wrapper; /* Call to QueryInterface */ - HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, REFIID, void **)) - $input->vtable[0])($input, IID_ISWIGWrappedObject, (void **) &wrapper); + HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) + $input->vtable[0])($input, &IID_ISWIGWrappedObject, (void **) &wrapper); if (hr != S_OK) { /* Argument was not wrapped by SWIG - directors will be needed */ @@ -71,8 +71,8 @@ SWIGIUnknown *wrapper; /* Call to QueryInterface */ - HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, REFIID, void **)) - $input->vtable[0])($input, IID_ISWIGWrappedObject, (void **) &wrapper); + HRESULT hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) + $input->vtable[0])($input, &IID_ISWIGWrappedObject, (void **) &wrapper); if (hr != S_OK) { /* Argument was not wrapped by SWIG - directors will be needed */ @@ -121,7 +121,6 @@ #include <windows.h> #include <olectl.h> #include <tchar.h> -#include <initguid.h> #include <string.h> #include <memory.h> @@ -149,9 +148,13 @@ ITypeInfo *typeInfo; /* ITypeInfo object for IDispatch */ } SWIGWrappedObject; -DEFINE_GUID(IID_ISWIGWrappedObject, 0x73738294, 0x8833, 0x1182, 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78); +GUID IID_ISWIGWrappedObject = { 0x73738294, 0x8833, 0x1182, { 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78 }}; static LONG globalRefCount = 0; +static int SWIGIsEqual(const GUID *a, const GUID *b) { + return memcmp(a, b, sizeof(GUID)) == 0; +} + long SWIGSTDCALL SWIGAddRef1(void *iunk) { SWIGWrappedObject *obj = (SWIGWrappedObject *) iunk; @@ -247,8 +250,8 @@ return res; } -HRESULT SWIGSTDCALL SWIGClassFactoryQueryInterface(SWIGClassFactory *factory, REFIID iid, void **ppvObject) { - if (IsEqualIID(iid, IID_IUnknown) || IsEqualIID(iid, IID_IClassFactory)) { +HRESULT SWIGSTDCALL SWIGClassFactoryQueryInterface(SWIGClassFactory *factory, GUID *iid, void **ppvObject) { + if (SWIGIsEqual(iid, &IID_IUnknown) || SWIGIsEqual(iid, &IID_IClassFactory)) { SWIGClassFactoryAddRef(factory); *ppvObject = factory; @@ -258,7 +261,7 @@ } } -HRESULT SWIGSTDCALL SWIGClassFactoryCreateInstance(SWIGClassFactory *factory, IUnknown *punkOuter, REFIID riid, void **ppvObject) +HRESULT SWIGSTDCALL SWIGClassFactoryCreateInstance(SWIGClassFactory *factory, IUnknown *punkOuter, GUID *riid, void **ppvObject) { HRESULT hr; SWIGIUnknown *obj; @@ -276,7 +279,7 @@ return E_OUTOFMEMORY; } - hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, REFIID, void **)) obj->vtable[0])(obj, riid, ppvObject); + hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) obj->vtable[0])(obj, riid, ppvObject); /* Release reference */ ((long (SWIGSTDCALL *)(SWIGIUnknown *)) (obj->vtable[2]))(obj); @@ -300,20 +303,20 @@ typedef struct { SWIG_funcptr newInstance; - REFGUID guid; + GUID *guid; TCHAR *guid_string; TCHAR *oleaut_string; } SWIGClassDescription_t; -HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface1(void *that, REFIID iid, void ** ppvObject) { - if (IsEqualIID(iid, IID_ISWIGWrappedObject)) { +HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface1(void *that, GUID *iid, void ** ppvObject) { + if (SWIGIsEqual(iid, &IID_ISWIGWrappedObject)) { /* FIXME: This could be more elegant */ SWIGAddRef1(that); *ppvObject = (void *) ((void **)that + 1); return S_OK; } - if (IsEqualIID(iid, IID_IUnknown)) { + if (SWIGIsEqual(iid, &IID_IUnknown)) { /* FIXME: This could be more elegant */ SWIGAddRef1(that); *ppvObject = that; @@ -323,7 +326,7 @@ return E_NOINTERFACE; } -HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface2(void *that, REFIID iid, void ** ppvObject) { +HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface2(void *that, GUID *iid, void ** ppvObject) { return _wrap_opaque_QueryInterface1((void *) ((void **) that - 1), iid, ppvObject); } @@ -361,16 +364,23 @@ static HMODULE SWIGModule; -STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *_ppv) { +STDAPI DllGetClassObject(REFCLSID _rclsid, REFIID _riid, LPVOID *_ppv) { +#if defined(__cplusplus) || defined(CINTERFACE) + const GUID *rclsid = &_rclsid; + const GUID *riid = &_riid; +#else + const GUID *rclsid = _rclsid; + const GUID *riid = _riid; +#endif int i; SWIGClassFactory **ppv = (SWIGClassFactory **)(void *) _ppv; - if (!IsEqualIID(riid, IID_IUnknown) && !IsEqualIID(riid, IID_IClassFactory)) + if (!SWIGIsEqual(riid, &IID_IUnknown) && !SWIGIsEqual(riid, &IID_IClassFactory)) return E_NOINTERFACE; for (i = 0; SWIGClassDescription[i].newInstance != NULL; ++i) { - if (IsEqualCLSID(rclsid, SWIGClassDescription[i].guid)) { + if (SWIGIsEqual(rclsid, SWIGClassDescription[i].guid)) { /* Create a new class factory for the requested CLSID */ #ifdef __cplusplus *ppv = new SWIGClassFactory; Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-22 22:04:31 UTC (rev 10701) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-22 22:44:19 UTC (rev 10702) @@ -389,20 +389,20 @@ module_class_vtable_code = NewString(""); - Printf(module_class_vtable_code, "DEFINE_GUID(IID_%s, ", module_class_name); + Printf(module_class_vtable_code, "GUID IID_%s = ", module_class_name); formatGUID(module_class_vtable_code, &module_iid, true); - Printf(module_class_vtable_code, ");\n\n"); + Printf(module_class_vtable_code, ";\n\n"); - Printf(module_class_vtable_code, "DEFINE_GUID(CLSID_%s, ", module_class_name); + Printf(module_class_vtable_code, "GUID CLSID_%s = ", module_class_name); formatGUID(module_class_vtable_code, &module_clsid, true); - Printf(module_class_vtable_code, ");\n\n"); + Printf(module_class_vtable_code, ";\n\n"); - Printf(module_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface(void *that, REFIID iid, " + Printf(module_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface(void *that, GUID *iid, " "void ** ppvObject) {\n", module_class_name); - Printf(module_class_vtable_code, " if (IsEqualIID(iid, IID_IUnknown) ||\n" - " IsEqualIID(iid, IID_IDispatch) ||\n" - " IsEqualIID(iid, IID_%s)", module_class_name); + Printf(module_class_vtable_code, " if (SWIGIsEqual(iid, &IID_IUnknown) ||\n" + " SWIGIsEqual(iid, &IID_IDispatch) ||\n" + " SWIGIsEqual(iid, &IID_%s)", module_class_name); Printf(module_class_vtable_code, ") {\n" " /* FIXME: This could be more elegant */\n" @@ -431,7 +431,7 @@ " res->refCount = 1;\n" " res->deleteInstance = 0;\n" " /* GetTypeInfoOfGuid */\n" - " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, REFGUID, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, IID_%s, &res->typeInfo);\n" + " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" " return (void *) res;\n" "};\n\n", module_class_name, module_class_name, module_class_name); @@ -451,7 +451,7 @@ Printf(clsid_list, "}\");\n\n"); Printf(clsid_list, "static SWIGClassDescription_t SWIGClassDescription[] = {\n"); - Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, CLSID_%s, _T(\"{", module_class_name, module_class_name); + Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, _T(\"{", module_class_name, module_class_name); formatGUID(clsid_list, &module_clsid, false); Printf(clsid_list, "}\"), _T(\"%s.%s\") },\n", namespce, module_class_name); @@ -459,7 +459,7 @@ Language::top(n); /* Insert guard element */ - Printf(clsid_list, " { NULL, IID_IUnknown, NULL, NULL } /* guard element */\n"); + Printf(clsid_list, " { NULL, NULL, NULL, NULL } /* guard element */\n"); Printf(clsid_list, "};\n\n"); @@ -1148,7 +1148,7 @@ void formatGUID(File *output, GUID *input, bool cFormat) { if (cFormat) { Printf(output, - "0x%08x, 0x%04x, 0x%04x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x", + "{ 0x%08x, 0x%04x, 0x%04x, { 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x, 0x%02x}}", input->Data1, input->Data2, input->Data3, input->Data4[0], input->Data4[1], input->Data4[2], input->Data4[3], input->Data4[4], input->Data4[5], input->Data4[6], input->Data4[7]); } else { @@ -1263,9 +1263,9 @@ } Setattr(n, "wrap:iid", proxy_iid); - Printf(proxy_class_vtable_code, "DEFINE_GUID(IID_%s, ", proxy_class_name); + Printf(proxy_class_vtable_code, "GUID IID_%s = ", proxy_class_name); formatGUID(proxy_class_vtable_code, proxy_iid, true); - Printf(proxy_class_vtable_code, ");\n\n"); + Printf(proxy_class_vtable_code, ";\n\n"); if (!Getattr(n, "abstract")) { /* Generate class object */ @@ -1278,21 +1278,21 @@ Delete(proxy_clsid_ident); } - Printf(proxy_class_vtable_code, "DEFINE_GUID(CLSID_%s, ", proxy_class_name); + Printf(proxy_class_vtable_code, "GUID CLSID_%s = ", proxy_class_name); formatGUID(proxy_class_vtable_code, proxy_clsid, true); - Printf(proxy_class_vtable_code, ");\n\n"); + Printf(proxy_class_vtable_code, ";\n\n"); - Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, CLSID_%s, _T(\"{", proxy_class_name, proxy_class_name); + Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, _T(\"{", proxy_class_name, proxy_class_name); formatGUID(clsid_list, proxy_clsid, false); Printf(clsid_list, "}\"), _T(\"%s.%s\") },\n", namespce, proxy_class_name); } - Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface1(void *that, REFIID iid, " + Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface1(void *that, GUID *iid, " "void ** ppvObject) {\n", proxy_class_name); /* Look if the requested interface is ISWIGWrappedObject */ Printf(proxy_class_vtable_code, - " if (IsEqualIID(iid, IID_ISWIGWrappedObject)) {\n" + " if (SWIGIsEqual(iid, &IID_ISWIGWrappedObject)) {\n" " /* FIXME: This could be more elegant */\n" " SWIGAddRef1(that);\n" /* Address of current object, incremented by the size of a pointer */ @@ -1300,9 +1300,9 @@ " return S_OK;\n" " }\n\n"); - Printf(proxy_class_vtable_code, " if (IsEqualIID(iid, IID_IUnknown) ||\n" - " IsEqualIID(iid, IID_IDispatch) ||\n" - " IsEqualIID(iid, IID_%s)", proxy_class_name); + Printf(proxy_class_vtable_code, " if (SWIGIsEqual(iid, &IID_IUnknown) ||\n" + " SWIGIsEqual(iid, &IID_IDispatch) ||\n" + " SWIGIsEqual(iid, &IID_%s)", proxy_class_name); bases = Getattr(n, "bases"); @@ -1310,7 +1310,7 @@ while (bases) { Iterator base = First(bases); - Printf(proxy_class_vtable_code, " ||\n IsEqualIID(iid, IID_%s)", Getattr(base.item, "sym:name")); + Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_%s)", Getattr(base.item, "sym:name")); /* Get next base */ bases = Getattr(base.item, "bases"); @@ -1327,7 +1327,7 @@ bases = NULL; - Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface2(void *that, REFIID iid, " + Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface2(void *that, GUID *iid, " "void ** ppvObject) {\n", proxy_class_name); Printf(proxy_class_vtable_code, @@ -1413,7 +1413,7 @@ " res->refCount = 0;\n" " res->deleteInstance = _wrap_delete_%s;\n" " /* GetTypeInfoOfGuid */\n" - " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, REFGUID, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, IID_%s, &res->typeInfo);\n" + " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" " return (void *) res;\n" "}\n\n", proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-24 23:26:16
|
Revision: 10707 http://swig.svn.sourceforge.net/swig/?rev=10707&view=rev Author: jezabek Date: 2008-07-24 23:26:13 +0000 (Thu, 24 Jul 2008) Log Message: ----------- Make proxy objects aggregatable. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-24 18:17:03 UTC (rev 10706) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-24 23:26:13 UTC (rev 10707) @@ -131,6 +131,7 @@ SWIG_funcptr *vtable; SWIG_funcptr newInstance; LONG refCount; + int aggregatable; } SWIGClassFactory; /* For consistent manipulation regardless of C or C++ mode */ @@ -141,11 +142,13 @@ typedef struct { SWIG_funcptr *vtable; /* vtable for the methods of the wrapped object */ SWIG_funcptr *SWIGWrappedObject_vtable; /* vtable for helper methods */ + SWIG_funcptr *aggregated_vtable; /* vtable to present to the outer object */ void *cPtr; /* pointer to the wrapped object */ int cMemOwn; /* memory owned by the proxy? */ LONG refCount; /* reference count */ void (SWIGSTDCALL *deleteInstance)(SWIGIUnknown *); /* destructor */ ITypeInfo *typeInfo; /* ITypeInfo object for IDispatch */ + SWIGIUnknown *outer; /* outer type in COM aggregation */ } SWIGWrappedObject; GUID IID_ISWIGWrappedObject = { 0x73738294, 0x8833, 0x1182, { 0x01, 0x12, 0x23, 0x34, 0x45, 0x56, 0x67, 0x78 }}; @@ -158,17 +161,57 @@ long SWIGSTDCALL SWIGAddRef1(void *iunk) { SWIGWrappedObject *obj = (SWIGWrappedObject *) iunk; - InterlockedIncrement(&globalRefCount); - return InterlockedIncrement(&obj->refCount); + if (obj->outer != NULL) { + return ((long (SWIGSTDCALL *)(SWIGIUnknown *)) (obj->outer->vtable[1]))(obj->outer); + } else { + InterlockedIncrement(&globalRefCount); + return InterlockedIncrement(&obj->refCount); + } } long SWIGSTDCALL SWIGAddRef2(void *iunk) { return SWIGAddRef1((void **)iunk - 1); } +long SWIGSTDCALL SWIGAddRef3(void *iunk) { + SWIGWrappedObject *obj = (SWIGWrappedObject *) ((void **)iunk - 2); + + InterlockedIncrement(&globalRefCount); + return InterlockedIncrement(&obj->refCount); +} + long SWIGSTDCALL SWIGRelease1(void *iunk) { SWIGWrappedObject *obj = (SWIGWrappedObject *) iunk; + if (obj->outer != NULL) { + return ((long (SWIGSTDCALL *)(SWIGIUnknown *)) (obj->outer->vtable[2]))(obj->outer); + } else { + LONG res = InterlockedDecrement(&obj->refCount); + + if (res == 0) { + if (obj->cMemOwn && obj->deleteInstance != 0) { + obj->deleteInstance((SWIGIUnknown *) obj); + } + +#ifdef __cplusplus + delete obj; +#else + free(obj); +#endif + } + + InterlockedDecrement(&globalRefCount); + return res; + } +} + +long SWIGSTDCALL SWIGRelease2(void *iunk) { + return SWIGRelease1((void **)iunk - 1); +} + +long SWIGSTDCALL SWIGRelease3(void *iunk) { + SWIGWrappedObject *obj = (SWIGWrappedObject *) ((void **)iunk - 2); + LONG res = InterlockedDecrement(&obj->refCount); if (res == 0) { @@ -187,10 +230,6 @@ return res; } -long SWIGSTDCALL SWIGRelease2(void *iunk) { - return SWIGRelease1((void **)iunk - 1); -} - void * SWIGSTDCALL SWIGGetCPtr(void *iunk) { SWIGWrappedObject *obj = (SWIGWrappedObject *) ((void **)iunk - 1); @@ -261,29 +300,39 @@ } } -HRESULT SWIGSTDCALL SWIGClassFactoryCreateInstance(SWIGClassFactory *factory, IUnknown *punkOuter, GUID *riid, void **ppvObject) +HRESULT SWIGSTDCALL SWIGClassFactoryCreateInstance(SWIGClassFactory *factory, SWIGIUnknown *punkOuter, GUID *riid, void **ppvObject) { HRESULT hr; - SWIGIUnknown *obj; + SWIGWrappedObject *obj; if (ppvObject == NULL) return E_INVALIDARG; - if (punkOuter) + if (punkOuter && (!factory->aggregatable || !SWIGIsEqual(riid, &IID_IUnknown))) return CLASS_E_NOAGGREGATION; /* Create the instance */ - obj = (SWIGIUnknown *) ((void* (SWIGSTDCALL *)(void *)) factory->newInstance)(NULL); + obj = (SWIGWrappedObject *) ((void* (SWIGSTDCALL *)(void *)) factory->newInstance)(NULL); if (obj == NULL) { return E_OUTOFMEMORY; } - hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) obj->vtable[0])(obj, riid, ppvObject); + if (!punkOuter) { + hr = ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **)) obj->vtable[0]) + ((SWIGIUnknown *) obj, riid, ppvObject); - /* Release reference */ - ((long (SWIGSTDCALL *)(SWIGIUnknown *)) (obj->vtable[2]))(obj); + /* Release reference */ + ((long (SWIGSTDCALL *)(SWIGIUnknown *)) (obj->vtable[2]))((SWIGIUnknown *) obj); + } else { + obj->outer = punkOuter; + /* We need to return the address of aggregate_vtable */ + *ppvObject = &obj->aggregated_vtable; + + hr = S_OK; + } + return hr; } @@ -306,6 +355,7 @@ GUID *guid; TCHAR *guid_string; TCHAR *oleaut_string; + int aggregatable; } SWIGClassDescription_t; HRESULT SWIGSTDCALL _wrap_opaque_QueryInterface1(void *that, GUID *iid, void ** ppvObject) { @@ -389,6 +439,7 @@ #endif (*ppv)->vtable = SWIGClassFactory_vtable; (*ppv)->newInstance = SWIGClassDescription[i].newInstance; + (*ppv)->aggregatable = SWIGClassDescription[i].aggregatable; InterlockedIncrement(&globalRefCount); (*ppv)->refCount = 1; Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-24 18:17:03 UTC (rev 10706) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-24 23:26:13 UTC (rev 10707) @@ -167,6 +167,7 @@ File *f_vtables; File *f_vtable_defs; File *f_factory; + File *f_directors; bool proxy_flag; // Flag for generating proxy classes bool dllexports_flag; @@ -225,6 +226,7 @@ memset(&typelib_guid, 0, sizeof(GUID)); memset(&module_iid, 0, sizeof(GUID)); memset(&module_clsid, 0, sizeof(GUID)); + director_language = 1; } /* ----------------------------------------------------------------------------- @@ -325,6 +327,9 @@ /* FIXME: report an error */ } } + if (Getattr(optionsnode, "directors")) { + allow_directors(); + } } /* Initialize all of the output files */ @@ -348,6 +353,7 @@ f_proxy_forward_defs = NewString(""); f_vtables = NewString(""); f_vtable_defs = NewString(""); + f_directors = NewString(""); f_factory = NewString(""); /* Register file targets with the SWIG file handler */ @@ -432,6 +438,7 @@ " res->deleteInstance = 0;\n" " /* GetTypeInfoOfGuid */\n" " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" + " res->outer = NULL;\n" " return (void *) res;\n" "};\n\n", module_class_name, module_class_name, module_class_name); @@ -453,7 +460,7 @@ Printf(clsid_list, "static SWIGClassDescription_t SWIGClassDescription[] = {\n"); Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, _T(\"{", module_class_name, module_class_name); formatGUID(clsid_list, &module_clsid, false); - Printf(clsid_list, "}\"), _T(\"%s.%s\") },\n", namespce, module_class_name); + Printf(clsid_list, "}\"), _T(\"%s.%s\"), 0 },\n", namespce, module_class_name); /* Emit code */ Language::top(n); @@ -564,6 +571,8 @@ Delete(f_vtable_defs); Dump(f_wrappers, f_runtime); Delete(f_wrappers); + Dump(f_directors, f_runtime); + Delete(f_directors); // Vtable for the module class Printv(f_runtime, module_class_vtable_code, NIL); Dump(f_vtables, f_runtime); @@ -1048,7 +1057,7 @@ } Printv(proxy_class_forward_def, " interface $comclassname;\n", NIL); - Printv(proxy_class_def, " [\n object,\n local,\n uuid(", NIL); + Printv(proxy_class_def, " [\n object,\n local,\n aggregatable,\n uuid(", NIL); formatGUID(proxy_class_def, proxy_iid, false); /* Printv(proxy_class_def, ")\n ]\n interface $comclassname", @@ -1284,24 +1293,97 @@ Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, _T(\"{", proxy_class_name, proxy_class_name); formatGUID(clsid_list, proxy_clsid, false); - Printf(clsid_list, "}\"), _T(\"%s.%s\") },\n", namespce, proxy_class_name); + Printf(clsid_list, "}\"), _T(\"%s.%s\"), 1 },\n", namespce, proxy_class_name); } Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface1(void *that, GUID *iid, " "void ** ppvObject) {\n", proxy_class_name); + Printf(proxy_class_vtable_code, + " SWIGWrappedObject *obj = (SWIGWrappedObject *) that;\n\n"); + + /* Look if we are an aggregated object */ + Printf(proxy_class_vtable_code, + " if (obj->outer != NULL) {\n" + " return ((HRESULT (SWIGSTDCALL *)(SWIGIUnknown *, GUID *, void **))\n" + " obj->outer->vtable[0])(obj->outer, iid, ppvObject);\n" + " } else {\n"); + /* Look if the requested interface is ISWIGWrappedObject */ Printf(proxy_class_vtable_code, + " if (SWIGIsEqual(iid, &IID_ISWIGWrappedObject)) {\n" + " /* FIXME: This could be more elegant */\n" + " SWIGAddRef1(that);\n" + " *ppvObject = &obj->SWIGWrappedObject_vtable;\n" + " return S_OK;\n" + " }\n\n"); + + Printf(proxy_class_vtable_code, " if (SWIGIsEqual(iid, &IID_IUnknown) ||\n" + " SWIGIsEqual(iid, &IID_IDispatch) ||\n" + " SWIGIsEqual(iid, &IID_%s)", proxy_class_name); + + bases = Getattr(n, "bases"); + + /* Iterate through the ancestors */ + while (bases) { + Iterator base = First(bases); + + Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_%s)", Getattr(base.item, "sym:name")); + + /* Get next base */ + bases = Getattr(base.item, "bases"); + } + + Printf(proxy_class_vtable_code, ") {\n" + " /* FIXME: This could be more elegant */\n" + " SWIGAddRef1(that);\n" + " *ppvObject = obj;\n" + " return S_OK;\n" + " }\n\n"); + + Printf(proxy_class_vtable_code, " return E_NOINTERFACE;\n }\n"); + + Printf(proxy_class_vtable_code, "}\n\n"); + + bases = NULL; + + Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface2(void *that, GUID *iid, " + "void ** ppvObject) {\n", proxy_class_name); + + Printf(proxy_class_vtable_code, + " return _wrap%sQueryInterface1((void *) ((void **) that - 1), iid, ppvObject);\n", proxy_class_name); + + Printf(proxy_class_vtable_code, "}\n\n"); + + /* + * This code is only slightly different from *QueryInterface1 but there are + * subtle differences because of COM aggregation rules. + */ + Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface3(void *that, GUID *iid, " + "void ** ppvObject) {\n", proxy_class_name); + + Printf(proxy_class_vtable_code, + " SWIGWrappedObject *obj = (SWIGWrappedObject *) ((void **)that - 2);\n\n"); + + /* Look if the requested interface is ISWIGWrappedObject */ + Printf(proxy_class_vtable_code, " if (SWIGIsEqual(iid, &IID_ISWIGWrappedObject)) {\n" " /* FIXME: This could be more elegant */\n" - " SWIGAddRef1(that);\n" - /* Address of current object, incremented by the size of a pointer */ - " *ppvObject = (void *) ((void **)that + 1);\n" + " SWIGAddRef3(that);\n" + " *ppvObject = &obj->SWIGWrappedObject_vtable;\n" " return S_OK;\n" " }\n\n"); - Printf(proxy_class_vtable_code, " if (SWIGIsEqual(iid, &IID_IUnknown) ||\n" - " SWIGIsEqual(iid, &IID_IDispatch) ||\n" + /* Special case for aggregation - IUnknown has to be different */ + Printf(proxy_class_vtable_code, + " if (SWIGIsEqual(iid, &IID_IUnknown)) {\n" + " /* FIXME: This could be more elegant */\n" + " SWIGAddRef3(that);\n" + " *ppvObject = &obj->aggregated_vtable;\n" + " return S_OK;\n" + " }\n\n"); + + Printf(proxy_class_vtable_code, " if (SWIGIsEqual(iid, &IID_IDispatch) ||\n" " SWIGIsEqual(iid, &IID_%s)", proxy_class_name); bases = Getattr(n, "bases"); @@ -1318,23 +1400,17 @@ Printf(proxy_class_vtable_code, ") {\n" " /* FIXME: This could be more elegant */\n" - " SWIGAddRef1(that);\n" - " *ppvObject = that;\n" + " SWIGAddRef3(that);\n" + " *ppvObject = obj;\n" " return S_OK;\n" " }\n\n"); - Printf(proxy_class_vtable_code, " return E_NOINTERFACE;\n}\n\n"); + Printf(proxy_class_vtable_code, " return E_NOINTERFACE;\n"); + Printf(proxy_class_vtable_code, "}\n\n"); + bases = NULL; - Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface2(void *that, GUID *iid, " - "void ** ppvObject) {\n", proxy_class_name); - - Printf(proxy_class_vtable_code, - " return _wrap%sQueryInterface1((void *) ((void **) that - 1), iid, ppvObject);\n", proxy_class_name); - - Printf(proxy_class_vtable_code, "}\n\n"); - Printf(proxy_class_vtable_code, "SWIG_funcptr _wrap%sSWIGWrappedObject_vtable[] = " "{\n (SWIG_funcptr) _wrap%sQueryInterface2," "\n (SWIG_funcptr) SWIGAddRef2," @@ -1343,6 +1419,13 @@ "\n};\n\n", proxy_class_name, proxy_class_name); + Printf(proxy_class_vtable_code, "SWIG_funcptr _wrap%saggregated_vtable[] = " + "{\n (SWIG_funcptr) _wrap%sQueryInterface3," + "\n (SWIG_funcptr) SWIGAddRef3," + "\n (SWIG_funcptr) SWIGRelease3" + "\n};\n\n", + proxy_class_name, proxy_class_name); + Printf(proxy_class_vtable_code, "SWIG_funcptr _wrap%svtable[] = " "{\n (SWIG_funcptr) _wrap%sQueryInterface1," "\n (SWIG_funcptr) SWIGAddRef1," @@ -1408,17 +1491,21 @@ "#endif\n" " res->vtable = _wrap%svtable;\n" " res->SWIGWrappedObject_vtable = _wrap%sSWIGWrappedObject_vtable;\n" + " res->aggregated_vtable = _wrap%saggregated_vtable;\n" " res->cPtr = arg;\n" " res->cMemOwn = cMemOwn;\n" + " res->outer = NULL;\n" " res->refCount = 0;\n" " res->deleteInstance = _wrap_delete_%s;\n" " /* GetTypeInfoOfGuid */\n" " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" " return (void *) res;\n" "}\n\n", - proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name); + proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name, + proxy_class_name, proxy_class_name); - Printf(proxy_class_vtable_defs, "void * SWIGSTDCALL SWIG_wrap%s(void *arg, int cMemOwn);\n", proxy_class_name); + Printf(proxy_class_vtable_defs, + "void * SWIGSTDCALL SWIG_wrap%s(void *arg, int cMemOwn);\n", proxy_class_name); Printv(f_vtables, proxy_class_vtable_code, NIL); Printv(f_vtable_defs, proxy_class_vtable_defs, NIL); @@ -1649,6 +1736,43 @@ } /* ----------------------------------------------------------------------------- + * classDirectorInit() + * ----------------------------------------------------------------------------- */ + virtual int classDirectorInit(Node *n) { + String *base = Getattr(n, "classtype"); + String *classname = Swig_class_name(n); + + Delete(director_ctor_code); + director_ctor_code = NewString("$director_new"); + + + Printf(f_directors, "class SwigDirector_%s : public %s {\n", classname, base); + Printf(f_directors, "public:\n"); + + Language::classDirectorInit(n); + + return SWIG_OK; + } + + /* ----------------------------------------------------------------------------- + * classDirectorEnd() + * ----------------------------------------------------------------------------- */ + virtual int classDirectorEnd(Node *n) { + Printf(f_directors, "};\n\n"); + + Language::classDirectorEnd(n); + + return SWIG_OK; + } + + /* ----------------------------------------------------------------------------- + * extraDirectorProtectedCPPMethodsRequired() + * ----------------------------------------------------------------------------- */ + virtual bool extraDirectorProtectedCPPMethodsRequired() const { + return false; + } + + /* ----------------------------------------------------------------------------- * typemapLookup() * ----------------------------------------------------------------------------- */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-25 00:40:47
|
Revision: 10709 http://swig.svn.sourceforge.net/swig/?rev=10709&view=rev Author: jezabek Date: 2008-07-25 00:40:45 +0000 (Fri, 25 Jul 2008) Log Message: ----------- Various bugfixes: newly created objects should have refCount 1; fix stack overflow occuring when object is deallocated (QueryInterface and Release were called, which was leading to infinite recursion); GetModuleFileName returns a number, not a HRESULT. Generated modules should be in working condition again. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-24 23:50:38 UTC (rev 10708) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-25 00:40:45 UTC (rev 10709) @@ -146,7 +146,7 @@ void *cPtr; /* pointer to the wrapped object */ int cMemOwn; /* memory owned by the proxy? */ LONG refCount; /* reference count */ - void (SWIGSTDCALL *deleteInstance)(SWIGIUnknown *); /* destructor */ + void (*deleteInstance)(void *); /* destructor */ ITypeInfo *typeInfo; /* ITypeInfo object for IDispatch */ SWIGIUnknown *outer; /* outer type in COM aggregation */ } SWIGWrappedObject; @@ -190,7 +190,7 @@ if (res == 0) { if (obj->cMemOwn && obj->deleteInstance != 0) { - obj->deleteInstance((SWIGIUnknown *) obj); + obj->deleteInstance(obj->cPtr); } #ifdef __cplusplus @@ -861,7 +861,7 @@ CloseHandle(hkey_lcid); } #else - hres = GetModuleFileNameW(SWIGModule, SWIG_typelib_path, MAX_PATH + 1); + GetModuleFileNameW(SWIGModule, SWIG_typelib_path, MAX_PATH + 1); #endif if (hres == S_OK) { Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-24 23:50:38 UTC (rev 10708) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-25 00:40:45 UTC (rev 10709) @@ -1483,6 +1483,9 @@ Printv(proxy_class_vtable_code, "\n};\n\n", NIL); + Printf(proxy_class_vtable_code, "void SWIG_delete_%s(%s *arg) {\n" + " delete arg;\n}\n\n", proxy_class_name, proxy_class_name); + Printf(proxy_class_vtable_code, "void * SWIGSTDCALL SWIG_wrap%s(void *arg, int cMemOwn) {\n" "#ifdef __cplusplus\n" " SWIGWrappedObject *res = new SWIGWrappedObject;\n" @@ -1495,8 +1498,9 @@ " res->cPtr = arg;\n" " res->cMemOwn = cMemOwn;\n" " res->outer = NULL;\n" - " res->refCount = 0;\n" - " res->deleteInstance = _wrap_delete_%s;\n" + " InterlockedIncrement(&globalRefCount);\n" + " res->refCount = 1;\n" + " res->deleteInstance = (void (*)(void *)) SWIG_delete_%s;\n" " /* GetTypeInfoOfGuid */\n" " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" " return (void *) res;\n" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-25 20:01:14
|
Revision: 10711 http://swig.svn.sourceforge.net/swig/?rev=10711&view=rev Author: jezabek Date: 2008-07-25 20:01:10 +0000 (Fri, 25 Jul 2008) Log Message: ----------- Fix IDL imports - WIDL is very sensitive wrt. to imports; MIDL does not care ;). Fix a bug when a parent's method list could be updated by a child. Add a non-trivial, working test-case. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/test-suite/virtual_poly.i branches/gsoc2008-jezabek/Source/Modules/com.cxx Added Paths: ----------- branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c Removed Paths: ------------- branches/gsoc2008-jezabek/Examples/test-suite/com/sizet_runme.c Deleted: branches/gsoc2008-jezabek/Examples/test-suite/com/sizet_runme.c =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/sizet_runme.c 2008-07-25 06:15:32 UTC (rev 10710) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/sizet_runme.c 2008-07-25 20:01:10 UTC (rev 10711) @@ -1,8 +0,0 @@ -#include <stdio.h> -#include <windows.h> - -int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - printf("Hello!\n"); - - return 0; -} Added: branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c (rev 0) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c 2008-07-25 20:01:10 UTC (rev 10711) @@ -0,0 +1,116 @@ +#define CINTERFACE +#include <stdio.h> +#include <windows.h> +#include <initguid.h> +#include "virtual_poly.h" + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + CoInitialize(NULL); + + virtual_poly *vp; + + CoCreateInstance(&CLSID_virtual_polyImpl, NULL, CLSCTX_INPROC_SERVER, &IID_virtual_poly, (void **) &vp); + + NDouble *d = vp->lpVtbl->new_NDouble(vp, 3.5); + NInt *i = vp->lpVtbl->new_NInt(vp, 2); + + /* + * These two natural 'copy' forms fail because no covariant (polymorphic) return types + * are supported in C#. + * + * NDouble dc = d.copy(); + * NInt ic = i.copy(); + * + * + * Unlike C++, we have to downcast instead. + */ + + NNumber *dc_as_nnumber = d->lpVtbl->copy(d); + +#if 0 + // This should work when covariant return types are handled properly + // Currently we are not able to cast dc_as_nnumber to IID_NDouble, etc. + + NDouble *dc = NULL; + + dc_as_nnumber->lpVtbl->QueryInterface(dc_as_nnumber, &IID_NDouble, (void **) &dc); +#endif + + NNumber *ic_as_nnumber = i->lpVtbl->copy(i); + +#if 0 + // Same as above + NInt *ic = NULL; + + ic_as_nnumber->lpVtbl->QueryInterface(ic_as_nnumber, &IID_NInt, (void **) &ic); + + NDouble *ddc = dc->lpVtbl->narrow(dc, dc_as_nnumber); + + NInt *dic = ic->lpVtbl->narrow(ic, dc_as_nnumber); +#endif + + + // Static member calls; d and i are not really used here + NDouble *ddc = d->lpVtbl->narrow(d, dc_as_nnumber); + + dc_as_nnumber->lpVtbl->Release(dc_as_nnumber); + + NInt *dic = i->lpVtbl->narrow(i, ic_as_nnumber); + + ic_as_nnumber->lpVtbl->Release(ic_as_nnumber); + + NInt *ic = dic; + NDouble *dc = ddc; + + vp->lpVtbl->incr(vp, ic); + + if (i->lpVtbl->get(i) + 1 != ic->lpVtbl->get(ic)) { + fprintf(stderr, "incr test failed\n"); + exit(1); + } + + /* + * Checking a pure user downcast + */ + NNumber *n1 = d->lpVtbl->copy(d); + NNumber *n2 = d->lpVtbl->nnumber(d); + NDouble *dn1 = d->lpVtbl->narrow(d, n1); + NDouble *dn2 = d->lpVtbl->narrow(d, n2); + + if (dn1->lpVtbl->get(dn1) != dn2->lpVtbl->get(dn2)) { + fprintf(stderr, "copy/narrow test failed\n"); + exit(1); + } + + n1->lpVtbl->Release(n1); + n2->lpVtbl->Release(n2); + dn1->lpVtbl->Release(dn1); + dn2->lpVtbl->Release(dn2); + + /* + * Checking the ref polymorphic case + */ + NNumber *nr = d->lpVtbl->ref_this(d); + NDouble *dr1 = d->lpVtbl->narrow(d, nr); + + /* FIXME: this should just need a QueryInterface, instead of 'narrow' */ + NNumber *dr2_as_nnumber = d->lpVtbl->ref_this(d); + NDouble *dr2 = d->lpVtbl->narrow(d, dr2_as_nnumber); + + if (dr1->lpVtbl->get(dr1) != dr2->lpVtbl->get(dr2)) { + fprintf(stderr, "copy/narrow test failed\n"); + exit(1); + } + + nr->lpVtbl->Release(nr); + dr1->lpVtbl->Release(dr1); + dr2_as_nnumber->lpVtbl->Release(dr2_as_nnumber); + dr2->lpVtbl->Release(dr2); + + i->lpVtbl->Release(i); + d->lpVtbl->Release(d); + + vp->lpVtbl->Release(vp); + + return 0; +} Modified: branches/gsoc2008-jezabek/Examples/test-suite/virtual_poly.i =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/virtual_poly.i 2008-07-25 06:15:32 UTC (rev 10710) +++ branches/gsoc2008-jezabek/Examples/test-suite/virtual_poly.i 2008-07-25 20:01:10 UTC (rev 10711) @@ -1,12 +1,22 @@ %module(directors="1") virtual_poly -%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET) copy; /* Java, C# covariant return types */ -%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET) ref_this; /* Java, C# covariant return types */ -%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET) covariant; /* Java, C# covariant return types */ -%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET) covariant2; /* Java, C# covariant return types */ -%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET) covariant3; /* Java, C# covariant return types */ -%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET) covariant4; /* Java, C# covariant return types */ +%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET, SWIGWARN_COM_COVARIANT_RET) copy; /* Java, C# covariant return types */ +%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET, SWIGWARN_COM_COVARIANT_RET) ref_this; /* Java, C# covariant return types */ +%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET, SWIGWARN_COM_COVARIANT_RET) covariant; /* Java, C# covariant return types */ +%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET, SWIGWARN_COM_COVARIANT_RET) covariant2; /* Java, C# covariant return types */ +%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET, SWIGWARN_COM_COVARIANT_RET) covariant3; /* Java, C# covariant return types */ +%warnfilter(SWIGWARN_JAVA_COVARIANT_RET, SWIGWARN_CSHARP_COVARIANT_RET, SWIGWARN_COM_COVARIANT_RET) covariant4; /* Java, C# covariant return types */ +#if defined (SWIGCOM) +%rename("foxy2") Base::foxy(int a) const; +%rename("foxy3") Base::foxy(int*& a); +%rename("AmIAmINotVirtual2") Derived::AmIAmINotVirtual; +%rename("AmIAmINotVirtual3") Bottom::AmIAmINotVirtual; +%rename("NotVirtual2") Derived::NotVirtual; +%rename("NotVirtual3") Bottom::NotVirtual; +%rename("StaticHidden2") Bottom::StaticHidden; +#endif + // // Check this example with directors wherever possible. // Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-25 06:15:32 UTC (rev 10710) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-25 20:01:10 UTC (rev 10711) @@ -528,13 +528,16 @@ // Banner for the IDL file emitBanner(f_module); - // Standard imports + // Header containing IDispatch declaration + // NOTE: MIDL does not need this, but WIDL does (and is sensitive to the position + // in the file where it is imported) + Printf(f_module, "import \"oaidl.idl\";\n\n"); + Printf(f_module, "[\n uuid("); formatGUID(f_module, &typelib_guid, false); Printf(f_module, ")\n]\nlibrary %sTLB {\n\n", module_class_name); - // Import IDispatch - // FIXME: Printf(f_module, " importlib(\"stdole32.tlb\");\n\n"); + // Import IDispatch declaration, part 2 Printf(f_module, " importlib(\"stdole2.tlb\");\n\n"); Printv(f_module, f_proxy_forward_defs, "\n", NIL); @@ -543,10 +546,6 @@ Printf(f_module, " [\n object,\n local,\n uuid("); formatGUID(f_module, &module_iid, false); Printf(f_module, "),\n dual\n ]\n interface %s : IDispatch {\n", module_class_name); - // FIXME: a temporary workaround for a possible WIDL bug - Printf(f_module, "#ifdef __WIDL__\n"); - Printf(f_module, " import \"stdole2.idl\";\n"); - Printf(f_module, "#endif\n"); // Add the wrapper methods Printv(f_module, module_class_code, NIL); @@ -1440,18 +1439,20 @@ if (!bases) { proxy_class_member_functions = NewList(); - Setattr(n, "wrap:member_functions", proxy_class_member_functions); } else { Iterator base = First(bases); List *base_member_functions = Getattr(base.item, "wrap:member_functions"); - Setattr(n, "wrap:member_functions", Copy(base_member_functions)); + proxy_class_member_functions = NewList(); for (Iterator func = First(base_member_functions); func.item; func = Next(func)) { Printf(proxy_class_vtable_code, ",\n (SWIG_funcptr)%s", func.item); + Append(proxy_class_member_functions, func.item); } } + Setattr(n, "wrap:member_functions", proxy_class_member_functions); + // FIXME: destructor_call = NewString(""); proxy_class_constants_code = NewString(""); } @@ -1484,7 +1485,7 @@ Printv(proxy_class_vtable_code, "\n};\n\n", NIL); Printf(proxy_class_vtable_code, "void SWIG_delete_%s(%s *arg) {\n" - " delete arg;\n}\n\n", proxy_class_name, proxy_class_name); + " delete arg;\n}\n\n", proxy_class_name, Getattr(n, "classtype")); Printf(proxy_class_vtable_code, "void * SWIGSTDCALL SWIG_wrap%s(void *arg, int cMemOwn) {\n" "#ifdef __cplusplus\n" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-26 00:15:23
|
Revision: 10712 http://swig.svn.sourceforge.net/swig/?rev=10712&view=rev Author: jezabek Date: 2008-07-26 00:15:21 +0000 (Sat, 26 Jul 2008) Log Message: ----------- Better handling of covariant return values; a downcast using QueryInterface will now work. Fixed virtual_poly test case to reflect this. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c 2008-07-25 20:01:10 UTC (rev 10711) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c 2008-07-26 00:15:21 UTC (rev 10712) @@ -27,40 +27,31 @@ NNumber *dc_as_nnumber = d->lpVtbl->copy(d); -#if 0 - // This should work when covariant return types are handled properly - // Currently we are not able to cast dc_as_nnumber to IID_NDouble, etc. - NDouble *dc = NULL; dc_as_nnumber->lpVtbl->QueryInterface(dc_as_nnumber, &IID_NDouble, (void **) &dc); -#endif NNumber *ic_as_nnumber = i->lpVtbl->copy(i); -#if 0 - // Same as above NInt *ic = NULL; ic_as_nnumber->lpVtbl->QueryInterface(ic_as_nnumber, &IID_NInt, (void **) &ic); + /* + * Static methods + */ + NDouble *ddc = dc->lpVtbl->narrow(dc, dc_as_nnumber); - NInt *dic = ic->lpVtbl->narrow(ic, dc_as_nnumber); -#endif + NInt *dic = ic->lpVtbl->narrow(ic, ic_as_nnumber); - - // Static member calls; d and i are not really used here - NDouble *ddc = d->lpVtbl->narrow(d, dc_as_nnumber); - dc_as_nnumber->lpVtbl->Release(dc_as_nnumber); - - NInt *dic = i->lpVtbl->narrow(i, ic_as_nnumber); - ic_as_nnumber->lpVtbl->Release(ic_as_nnumber); + dc->lpVtbl->Release(dc); + ic->lpVtbl->Release(ic); - NInt *ic = dic; - NDouble *dc = ddc; + ic = dic; + dc = ddc; vp->lpVtbl->incr(vp, ic); @@ -69,6 +60,9 @@ exit(1); } + dc->lpVtbl->Release(dc); + ic->lpVtbl->Release(ic); + /* * Checking a pure user downcast */ @@ -92,10 +86,9 @@ */ NNumber *nr = d->lpVtbl->ref_this(d); NDouble *dr1 = d->lpVtbl->narrow(d, nr); - - /* FIXME: this should just need a QueryInterface, instead of 'narrow' */ NNumber *dr2_as_nnumber = d->lpVtbl->ref_this(d); - NDouble *dr2 = d->lpVtbl->narrow(d, dr2_as_nnumber); + NDouble *dr2 = NULL; + dr2_as_nnumber->lpVtbl->QueryInterface(dr2_as_nnumber, &IID_NDouble, (void **) &dr2); if (dr1->lpVtbl->get(dr1) != dr2->lpVtbl->get(dr2)) { fprintf(stderr, "copy/narrow test failed\n"); Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-25 20:01:10 UTC (rev 10711) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-26 00:15:21 UTC (rev 10712) @@ -11,6 +11,7 @@ #include "swigmod.h" #include "cparse.h" +#include <stdio.h> typedef struct { unsigned long Data1; @@ -1446,7 +1447,6 @@ proxy_class_member_functions = NewList(); for (Iterator func = First(base_member_functions); func.item; func = Next(func)) { - Printf(proxy_class_vtable_code, ",\n (SWIG_funcptr)%s", func.item); Append(proxy_class_member_functions, func.item); } } @@ -1460,6 +1460,9 @@ Language::classHandler(n); if (proxy_flag) { + for (Iterator func = First(proxy_class_member_functions); func.item; func = Next(func)) { + Printf(proxy_class_vtable_code, ",\n (SWIG_funcptr)%s", func.item); + } emitProxyClassDefAndCPPCasts(n); @@ -1586,8 +1589,18 @@ if (!Getattr(n, "override")) { String *wname = Getattr(n, "wrap:name"); - Printf(proxy_class_vtable_code, ",\n (SWIG_funcptr)%s", wname); + // FIXME: do we have to use strings? + Setattr(n, "wrap:vtable_index", NewStringf("%d", Len(proxy_class_member_functions))); Append(proxy_class_member_functions, wname); + } else { + String *wname = Getattr(n, "wrap:name"); + Node *prev = Getattr(n, "override"); + int index; + + // HACK: maybe there is a simpler way to store an integer in a node? :) + sscanf(Char(Getattr(prev, "wrap:vtable_index")), "%d", &index); + Setattr(n, "wrap:vtable_index", NewStringf("%d", index)); + Setitem(proxy_class_member_functions, index, wname); } if (l) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-27 13:07:06
|
Revision: 10715 http://swig.svn.sourceforge.net/swig/?rev=10715&view=rev Author: jezabek Date: 2008-07-27 13:07:03 +0000 (Sun, 27 Jul 2008) Log Message: ----------- Merged revisions 10714 via svnmerge from https://swig.svn.sourceforge.net/svnroot/swig/trunk ........ r10714 | olly | 2008-07-27 14:51:16 +0200 (Sun, 27 Jul 2008) | 2 lines Fix "can can" typo in docs (SF#2026756) ........ Modified Paths: -------------- branches/gsoc2008-jezabek/Doc/Manual/SWIG.html Property Changed: ---------------- branches/gsoc2008-jezabek/ Property changes on: branches/gsoc2008-jezabek ___________________________________________________________________ Modified: svnmerge-integrated - /trunk:1-10699 + /trunk:1-10714 Modified: branches/gsoc2008-jezabek/Doc/Manual/SWIG.html =================================================================== --- branches/gsoc2008-jezabek/Doc/Manual/SWIG.html 2008-07-27 12:51:16 UTC (rev 10714) +++ branches/gsoc2008-jezabek/Doc/Manual/SWIG.html 2008-07-27 13:07:03 UTC (rev 10715) @@ -53,7 +53,7 @@ <li><a href="#SWIG_nn33">Character strings and structures</a> <li><a href="#SWIG_nn34">Array members</a> <li><a href="#SWIG_structure_data_members">Structure data members</a> -<li><a href="#SWIG_nn36">C constructors and destructors </a> +<li><a href="#SWIG_nn36">C constructors and destructors</a> <li><a href="#SWIG_adding_member_functions">Adding member functions to C structures</a> <li><a href="#SWIG_nested_structs">Nested structures</a> <li><a href="#SWIG_nn39">Other things to note about structure wrapping</a> @@ -224,7 +224,7 @@ contains everything that is needed to construct a extension module for the target scripting language. SWIG is not a stub compiler nor is it usually necessary to edit the output file (and if you look at the output, -you probably won't want to). To build the final extension module, the +you probably won't want to). To build the final extension module, the SWIG output file is compiled and linked with the rest of your C/C++ program to create a shared library. </p> @@ -232,7 +232,7 @@ <p> Many target languages will also generate proxy class files in the target language. The default output directory for these language -specific files is the same directory as the generated C/C++ file. This can +specific files is the same directory as the generated C/C++ file. This can be modified using the <tt>-outdir</tt> option. For example: </p> @@ -2219,13 +2219,13 @@ <p> -<b>Compatibility Note: </b> SWIG-1.3.11 and earlier releases transformed all non-primitive member datatypes -to pointers. Starting in SWIG-1.3.12, this transformation <em>only</em> occurs if a datatype is known to be a structure, -class, or union. This is unlikely to break existing code. However, if you need to tell SWIG that an undeclared +<b>Compatibility Note:</b> SWIG-1.3.11 and earlier releases transformed all non-primitive member datatypes +to pointers. Starting in SWIG-1.3.12, this transformation <em>only</em> occurs if a datatype is known to be a structure, +class, or union. This is unlikely to break existing code. However, if you need to tell SWIG that an undeclared datatype is really a struct, simply use a forward struct declaration such as <tt>"struct Foo;"</tt>. </p> -<H3><a name="SWIG_nn36"></a>5.5.5 C constructors and destructors </H3> +<H3><a name="SWIG_nn36"></a>5.5.5 C constructors and destructors</H3> <p> @@ -2282,7 +2282,7 @@ Since ignoring the implicit or default destructors most of the times produce memory leaks, SWIG will always try to generate them. If needed, however, you can selectively disable the generation of the -default/implicit destructor by using <tt>%nodefaultdtor </tt> +default/implicit destructor by using <tt>%nodefaultdtor</tt> </p> <div class="code"> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-30 20:50:37
|
Revision: 10719 http://swig.svn.sourceforge.net/swig/?rev=10719&view=rev Author: jezabek Date: 2008-07-30 20:50:31 +0000 (Wed, 30 Jul 2008) Log Message: ----------- Added some (not working, ifdef-d) prototype director code. I am not planning to work on this for some time, but don't want it to get lost. Removed unused "wrap:iid" attribute. Changed the prefix of COM-specific attributes from "wrap:*" to "com:*". Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Include/swigwarn.h branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-28 21:03:21 UTC (rev 10718) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-30 20:50:31 UTC (rev 10719) @@ -110,6 +110,13 @@ } #endif +#if 0 +%typemap(directorin) void "" +%typemap(directorin) int, double, long %{ /* directorin */ $input = $1; %} + +%typemap(directorout) int, double, long %{ /* directorout */ $result = ($1_ltype)$input; %} +#endif + %typemap(combody) SWIGTYPE * %{ %} Modified: branches/gsoc2008-jezabek/Source/Include/swigwarn.h =================================================================== --- branches/gsoc2008-jezabek/Source/Include/swigwarn.h 2008-07-28 21:03:21 UTC (rev 10718) +++ branches/gsoc2008-jezabek/Source/Include/swigwarn.h 2008-07-30 20:50:31 UTC (rev 10719) @@ -259,11 +259,12 @@ /* please leave 870-889 free for PHP */ -#define WARN_COM_TYPEMAP_CTYPE_UNDEF 910 -#define WARN_COM_TYPEMAP_COMTYPE_UNDEF 911 -#define WARN_COM_MULTIPLE_INHERITANCE 912 -#define WARN_COM_TYPEMAP_COMBODY_UNDEF 913 -#define WARN_COM_COVARIANT_RET 914 +#define WARN_COM_TYPEMAP_CTYPE_UNDEF 910 +#define WARN_COM_TYPEMAP_COMTYPE_UNDEF 911 +#define WARN_COM_MULTIPLE_INHERITANCE 912 +#define WARN_COM_TYPEMAP_COMBODY_UNDEF 913 +#define WARN_COM_COVARIANT_RET 914 +#define WARN_COM_TYPEMAP_DIRECTORIN_UNDEF 915 /* please leave 910-929 free for COM */ Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-28 21:03:21 UTC (rev 10718) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-30 20:50:31 UTC (rev 10719) @@ -206,6 +206,17 @@ String *module_class_code; String *namespce; +#if 0 + + static Parm *NewParmFromNode(SwigType *type, const String_or_char *name, Node *n) { + Parm *p = NewParm(type, name); + Setfile(p, Getfile(n)); + Setline(p, Getline(n)); + return p; + } + +#endif + public: /* ----------------------------------------------------------------------------- @@ -227,7 +238,7 @@ memset(&typelib_guid, 0, sizeof(GUID)); memset(&module_iid, 0, sizeof(GUID)); memset(&module_clsid, 0, sizeof(GUID)); - director_language = 1; + director_language = 0; } /* ----------------------------------------------------------------------------- @@ -328,9 +339,11 @@ /* FIXME: report an error */ } } +#if 0 if (Getattr(optionsnode, "directors")) { allow_directors(); } +#endif } /* Initialize all of the output files */ @@ -1270,7 +1283,6 @@ generateGUID(proxy_iid, proxy_iid_ident); Delete(proxy_iid_ident); } - Setattr(n, "wrap:iid", proxy_iid); Printf(proxy_class_vtable_code, "GUID IID_%s = ", proxy_class_name); formatGUID(proxy_class_vtable_code, proxy_iid, true); @@ -1443,7 +1455,7 @@ } else { Iterator base = First(bases); - List *base_member_functions = Getattr(base.item, "wrap:member_functions"); + List *base_member_functions = Getattr(base.item, "com:member_functions"); proxy_class_member_functions = NewList(); for (Iterator func = First(base_member_functions); func.item; func = Next(func)) { @@ -1451,7 +1463,7 @@ } } - Setattr(n, "wrap:member_functions", proxy_class_member_functions); + Setattr(n, "com:member_functions", proxy_class_member_functions); // FIXME: destructor_call = NewString(""); proxy_class_constants_code = NewString(""); @@ -1590,7 +1602,7 @@ if (!Getattr(n, "override")) { String *wname = Getattr(n, "wrap:name"); // FIXME: do we have to use strings? - Setattr(n, "wrap:vtable_index", NewStringf("%d", Len(proxy_class_member_functions))); + Setattr(n, "com:vtable_index", NewStringf("%d", Len(proxy_class_member_functions))); Append(proxy_class_member_functions, wname); } else { String *wname = Getattr(n, "wrap:name"); @@ -1598,8 +1610,8 @@ int index; // HACK: maybe there is a simpler way to store an integer in a node? :) - sscanf(Char(Getattr(prev, "wrap:vtable_index")), "%d", &index); - Setattr(n, "wrap:vtable_index", NewStringf("%d", index)); + sscanf(Char(Getattr(prev, "com:vtable_index")), "%d", &index); + Setattr(n, "com:vtable_index", NewStringf("%d", index)); Setitem(proxy_class_member_functions, index, wname); } @@ -1753,6 +1765,8 @@ delete proxy_iid; } +#if 0 + /* ----------------------------------------------------------------------------- * classDirectorInit() * ----------------------------------------------------------------------------- */ @@ -1784,6 +1798,282 @@ } /* ----------------------------------------------------------------------------- + * classDirectorMethod() + * ----------------------------------------------------------------------------- */ + virtual int classDirectorMethod(Node *n, Node *parent, String *super) { + String *empty_str = NewString(""); + String *classname = Getattr(parent, "sym:name"); + String *c_classname = Getattr(parent, "name"); + String *name = Getattr(n, "name"); + String *symname = Getattr(n, "sym:name"); + SwigType *type = Getattr(n, "type"); + SwigType *returntype = Getattr(n, "returntype"); + String *overloaded_name = Getattr(n, "sym:name"); + // FIXME: String *overloaded_name = getOverloadedName(n); + String *storage = Getattr(n, "storage"); + String *value = Getattr(n, "value"); + String *decl = Getattr(n, "decl"); + //String *declaration = NewString(""); + String *tm; + Parm *p; + int i; + Wrapper *w = NewWrapper(); + ParmList *l = Getattr(n, "parms"); + bool is_void = !(Cmp(returntype, "void")); + String *qualified_return = NewString(""); + bool pure_virtual = (!(Cmp(storage, "virtual")) && !(Cmp(value, "0"))); + int status = SWIG_OK; + bool output_director = true; + String *dirclassname = directorClassName(parent); + String *qualified_name = NewStringf("%s::%s", dirclassname, name); + SwigType *c_ret_type = NULL; + String *jupcall_args = NewString(""); + //String *imclass_dmethod; + //String *callback_typedef_parms = NewString(""); + //String *delegate_parms = NewString(""); + //String *proxy_method_types = NewString(""); + //String *callback_def = NewString(""); + //String *callback_code = NewString(""); + //String *imcall_args = NewString(""); + int gencomma = 0; + bool ignored_method = GetFlag(n, "feature:ignore") ? true : false; + + if (returntype) { + + qualified_return = SwigType_rcaststr(returntype, "c_result"); + + if (!is_void && !ignored_method) { + if (!SwigType_isclass(returntype)) { + if (!(SwigType_ispointer(returntype) || SwigType_isreference(returntype))) { + String *construct_result = NewStringf("= SwigValueInit< %s >()", SwigType_lstr(returntype, 0)); + Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), construct_result, NIL); + Delete(construct_result); + } else { + String *base_typename = SwigType_base(returntype); + String *resolved_typename = SwigType_typedef_resolve_all(base_typename); + Symtab *symtab = Getattr(n, "sym:symtab"); + Node *typenode = Swig_symbol_clookup(resolved_typename, symtab); + + if (SwigType_ispointer(returntype) || (typenode && Getattr(typenode, "abstract"))) { + /* initialize pointers to something sane. Same for abstract + classes when a reference is returned. */ + Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= 0", NIL); + } else { + /* If returning a reference, initialize the pointer to a sane + default - if a C# exception occurs, then the pointer returns + something other than a NULL-initialized reference. */ + String *non_ref_type = Copy(returntype); + + /* Remove reference and const qualifiers */ + Replaceall(non_ref_type, "r.", ""); + Replaceall(non_ref_type, "q(const).", ""); + Wrapper_add_localv(w, "result_default", "static", SwigType_str(non_ref_type, "result_default"), "=", SwigType_str(non_ref_type, "()"), NIL); + Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), "= &result_default", NIL); + + Delete(non_ref_type); + } + + Delete(base_typename); + Delete(resolved_typename); + } + } else { + SwigType *vt; + + vt = cplus_value_type(returntype); + if (!vt) { + Wrapper_add_localv(w, "c_result", SwigType_lstr(returntype, "c_result"), NIL); + } else { + Wrapper_add_localv(w, "c_result", SwigType_lstr(vt, "c_result"), NIL); + Delete(vt); + } + } + } + + Parm *retpm = NewParmFromNode(returntype, empty_str, n); + + if ((c_ret_type = Swig_typemap_lookup("ctype", retpm, "", 0))) { + + if (!is_void && !ignored_method) { + String *jretval_decl = NewStringf("%s jresult", c_ret_type); + Wrapper_add_localv(w, "jresult", jretval_decl, "= 0", NIL); + Delete(jretval_decl); + } + } else { + Swig_warning(WARN_CSHARP_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(returntype, 0)); + output_director = false; + } + + Delete(retpm); + } + + /* Go through argument list, attach lnames for arguments */ + for (i = 0, p = l; p; p = nextSibling(p), ++i) { + String *arg = Getattr(p, "name"); + String *lname = NewString(""); + + if (!arg && Cmp(Getattr(p, "type"), "void")) { + lname = NewStringf("arg%d", i); + Setattr(p, "name", lname); + } else + lname = arg; + + Setattr(p, "lname", lname); + } + + /* Attach the standard typemaps */ + Swig_typemap_attach_parms("out", l, 0); + Swig_typemap_attach_parms("ctype", l, 0); + Swig_typemap_attach_parms("comtype", l, 0); + Swig_typemap_attach_parms("directorin", l, 0); + + /* Go through argument list, convert from native to Java */ + for (p = l; p; /* empty */ ) { + /* Is this superfluous? */ + while (checkAttribute(p, "tmap:directorin:numinputs", "0")) { + p = Getattr(p, "tmap:directorin:next"); + } + + SwigType *pt = Getattr(p, "type"); + String *ln = Copy(Getattr(p, "name")); + String *c_param_type = NULL; + String *c_decl = NewString(""); + String *arg = NewString(""); + + Printf(arg, "j%s", ln); + + /* Add various typemap's 'throws' clauses */ + //addThrows(n, "tmap:directorin", p); + //addThrows(n, "tmap:out", p); + + /* And add to the upcall args */ + if (gencomma > 0) + Printf(jupcall_args, ", "); + Printf(jupcall_args, "%s", arg); + + /* Get parameter's intermediary C type */ + if ((c_param_type = Getattr(p, "tmap:ctype"))) { + String *ctypeout = Getattr(p, "tmap:ctype:out"); // the type in the ctype typemap's out attribute overrides the type in the typemap + if (ctypeout) + c_param_type = ctypeout; + + Parm *tp = NewParmFromNode(c_param_type, empty_str, n); + String *desc_tm = NULL; + + /* Add to local variables */ + Printf(c_decl, "%s %s", c_param_type, arg); + if (!ignored_method) + Wrapper_add_localv(w, arg, c_decl, (!(SwigType_ispointer(pt) || SwigType_isreference(pt)) ? "" : "= 0"), NIL); + + /* Add input marshalling code */ + if (/* FIXME: (desc_tm = Swig_typemap_lookup("directorin", tp, "", 0)) + && */ (tm = Getattr(p, "tmap:directorin"))) { + + Replaceall(tm, "$input", arg); + Replaceall(tm, "$owner", "0"); + + if (Len(tm)) + if (!ignored_method) + Printf(w->code, "%s\n", tm); + + Delete(tm); + + p = Getattr(p, "tmap:directorin:next"); + + Delete(desc_tm); + } else { + Swig_warning(WARN_COM_TYPEMAP_DIRECTORIN_UNDEF, input_file, line_number, + "No or improper directorin typemap defined for argument %s\n", SwigType_str(pt, 0)); + p = nextSibling(p); + output_director = false; + } + Delete(tp); + } else { + Swig_warning(WARN_COM_TYPEMAP_CTYPE_UNDEF, input_file, line_number, "No ctype typemap defined for %s\n", SwigType_str(pt, 0)); + output_director = false; + p = nextSibling(p); + } + + gencomma++; + Delete(arg); + Delete(c_decl); + Delete(c_param_type); + } + + /* start wrapper definition */ + String *target; + SwigType *rtype = Getattr(n, "conversion_operator") ? 0 : type; + target = Swig_method_decl(rtype, decl, name, l, 0, 0); + Printf(w->def, "%s", target); + Delete(qualified_name); + Delete(target); + //target = Swig_method_decl(rtype, decl, name, l, 0, 1); + //Printf(stdout, " virtual %s", target); + //Delete(target); + + Printf(w->def, " {"); + + if (!ignored_method) { + if (!is_void) + Printf(w->code, "jresult = (%s) ", c_ret_type); + + Printf(w->code, "<place_correct_method_here>(%s);\n", jupcall_args); + + if (!is_void) { + String *jresult_str = NewString("jresult"); + String *result_str = NewString("c_result"); + Parm *tp = NewParmFromNode(returntype, result_str, n); + + /* Copy jresult into c_result... */ + if ((tm = Swig_typemap_lookup("directorout", tp, result_str, w))) { + //+addThrows(n, "tmap:directorout", tp); + Replaceall(tm, "$input", jresult_str); + Replaceall(tm, "$result", result_str); + Printf(w->code, "%s\n", tm); + } else { + Swig_warning(WARN_TYPEMAP_DIRECTOROUT_UNDEF, input_file, line_number, + "Unable to use return type %s in director method %s::%s (skipping method).\n", SwigType_str(returntype, 0), + SwigType_namestr(c_classname), SwigType_namestr(name)); + output_director = false; + } + + Delete(tp); + Delete(jresult_str); + Delete(result_str); + } + + /* Terminate wrapper code */ + if (!is_void) + Printf(w->code, "return %s;", qualified_return); + } + + Printf(w->code, "}"); + + /* emit code */ + if (status == SWIG_OK && output_director) { + if (!is_void) { + Replaceall(w->code, "$null", qualified_return); + } else { + Replaceall(w->code, "$null", ""); + } + if (!Getattr(n, "defaultargs")) { + Wrapper_print(w, f_directors); + } + } + + Delete(qualified_return); + Delete(c_ret_type); + // Delete(declaration); + // Delete(callback_typedef_parms); + // Delete(delegate_parms); + // Delete(proxy_method_types); + // Delete(callback_def); + // Delete(callback_code); + DelWrapper(w); + + return status; + } + + /* ----------------------------------------------------------------------------- * extraDirectorProtectedCPPMethodsRequired() * ----------------------------------------------------------------------------- */ virtual bool extraDirectorProtectedCPPMethodsRequired() const { @@ -1791,6 +2081,26 @@ } /* ----------------------------------------------------------------------------- + * directorClassName() + * ----------------------------------------------------------------------------- */ + + String *directorClassName(Node *n) { + String *dirclassname; + const char *attrib = "director:classname"; + + if (!(dirclassname = Getattr(n, attrib))) { + String *classname = Getattr(n, "sym:name"); + + dirclassname = NewStringf("SwigDirector_%s", classname); + Setattr(n, attrib, dirclassname); + } + + return dirclassname; + } + +#endif + + /* ----------------------------------------------------------------------------- * typemapLookup() * ----------------------------------------------------------------------------- */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-31 17:18:41
|
Revision: 10722 http://swig.svn.sourceforge.net/swig/?rev=10722&view=rev Author: jezabek Date: 2008-07-31 17:06:37 +0000 (Thu, 31 Jul 2008) Log Message: ----------- Support for type-unsafe enums. Type-safe enums will follow soon. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx branches/gsoc2008-jezabek/Source/Modules/java.cxx Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-31 10:45:10 UTC (rev 10721) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-31 17:06:37 UTC (rev 10722) @@ -14,6 +14,7 @@ %typemap(ctype) SWIGTYPE * "/* ctype */ SWIGIUnknown *" %typemap(ctype) SWIGTYPE "/* ctype */ SWIGIUnknown *" %typemap(ctype) SWIGTYPE & "/* ctype */ SWIGIUnknown *" +%typemap(ctype) enum SWIGTYPE "/* ctype */ int" %typemap(comtype) void "void" %typemap(comtype) int, const int & "/* comtype */ int" @@ -23,6 +24,7 @@ %typemap(comtype) SWIGTYPE "/* comtype */ $&comclassname *" %typemap(comtype) SWIGTYPE & "/* comtype */ $comclassname *" %typemap(comtype) SWIGTYPE *& "/* comtype */ $*comclassname *" +%typemap(comtype) enum SWIGTYPE "/* comtype */ int" %typemap(in) int, double, long %{ /* in */ $1 = ($1_ltype)$input; %} @@ -88,6 +90,8 @@ $1 = *argp; %} +%typemap(in) enum SWIGTYPE %{ /* in */ $1 = ($1_ltype)$input; %} + %typemap(out) int, double, long %{ /* out */ $result = $1; %} %typemap(out) void "" @@ -110,6 +114,8 @@ } #endif +%typemap(out) enum SWIGTYPE %{ /* out */ $result = $1; %} + #if 0 %typemap(directorin) void "" %typemap(directorin) int, double, long %{ /* directorin */ $input = $1; %} Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-31 10:45:10 UTC (rev 10721) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-31 17:06:37 UTC (rev 10722) @@ -931,7 +931,6 @@ variable_name = Getattr(n, "sym:name"); wrapping_member_flag = true; Language::memberconstantHandler(n); - constantWrapper(n); wrapping_member_flag = false; return SWIG_OK; Modified: branches/gsoc2008-jezabek/Source/Modules/java.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/java.cxx 2008-07-31 10:45:10 UTC (rev 10721) +++ branches/gsoc2008-jezabek/Source/Modules/java.cxx 2008-07-31 17:06:37 UTC (rev 10722) @@ -2658,12 +2658,16 @@ Node *n = enumLookup(t); if (n) { String *symname = Getattr(n, "sym:name"); + Printf(stdout, "symname: %s\n", symname); if (symname) { // Add in class scope when referencing enum if not a global enum String *scopename_prefix = Swig_scopename_prefix(Getattr(n, "name")); + Printf(stdout, "scopename_prefix: %s\n", scopename_prefix); + String *proxyname = 0; if (scopename_prefix) { proxyname = getProxyName(scopename_prefix); + Printf(stdout, "proxyname: %s\n", proxyname); } if (proxyname) { const char *class_separator = jnidescriptor ? "$" : "."; @@ -2671,6 +2675,7 @@ } else { enum_name = NewStringf("%s", symname); } + Printf(stdout, "enum_name: %s\n", enum_name); Delete(scopename_prefix); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-07-31 22:52:46
|
Revision: 10724 http://swig.svn.sourceforge.net/swig/?rev=10724&view=rev Author: jezabek Date: 2008-07-31 22:52:41 +0000 (Thu, 31 Jul 2008) Log Message: ----------- Reverted accidental changes to Java module. Added typemaps for most basic types. Added typemaps for char * - mapped to OLE BSTR. Fixed a build problem with the test suite which prevented cases without a run test from building. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx branches/gsoc2008-jezabek/Source/Modules/java.cxx Modified: branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-07-31 20:30:09 UTC (rev 10723) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-07-31 22:52:41 UTC (rev 10724) @@ -76,11 +76,6 @@ COMSRCS=`$(COM_CYGPATH_W) $(srcdir)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX)` \ com_compile && \ $(RUNTOOL) $(COM_RUNTOOL) $*_runme.exe$(COM_EXEC_SUFFIX); ) \ - else ( \ - cd $* && \ - $(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile \ - TARGET='$*.dll' \ - COMSRCS='*.c' com_compile; ); \ fi; # Clean: remove testcase directories Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-31 20:30:09 UTC (rev 10723) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-07-31 22:52:41 UTC (rev 10724) @@ -7,27 +7,67 @@ * COM typemaps * ----------------------------------------------------------------------------- */ -%typemap(ctype) void "void" -%typemap(ctype) int, const int & "/* ctype */ int" -%typemap(ctype) double, const double & "/*ctype */ double" -%typemap(ctype) long, const long & "/* ctype */ long" -%typemap(ctype) SWIGTYPE * "/* ctype */ SWIGIUnknown *" -%typemap(ctype) SWIGTYPE "/* ctype */ SWIGIUnknown *" -%typemap(ctype) SWIGTYPE & "/* ctype */ SWIGIUnknown *" -%typemap(ctype) enum SWIGTYPE "/* ctype */ int" +%typemap(ctype) bool, const bool & "unsigned int" +%typemap(ctype) char, const char & "char" +%typemap(ctype) signed char, const signed char & "signed char" +%typemap(ctype) unsigned char, const unsigned char & "unsigned char" +%typemap(ctype) short, const short & "short" +%typemap(ctype) unsigned short, const unsigned short & "unsigned short" +%typemap(ctype) int, const int & "int" +%typemap(ctype) unsigned int, const unsigned int & "unsigned int" +%typemap(ctype) long, const long & "long" +%typemap(ctype) unsigned long, const unsigned long & "unsigned long" +%typemap(ctype) long long, const long long & "long long" +%typemap(ctype) unsigned long long, const unsigned long long & "unsigned long long" +%typemap(ctype) float, const float & "float" +%typemap(ctype) double, const double & "double" +%typemap(ctype) void "void" +%typemap(ctype) SWIGTYPE * "SWIGIUnknown *" +%typemap(ctype) SWIGTYPE "SWIGIUnknown *" +%typemap(ctype) SWIGTYPE & "SWIGIUnknown *" +%typemap(ctype) enum SWIGTYPE "int" -%typemap(comtype) void "void" -%typemap(comtype) int, const int & "/* comtype */ int" -%typemap(comtype) double, const double & "/* comtype */ double" -%typemap(comtype) long, const long & "/* comtype */ long" -%typemap(comtype) SWIGTYPE * "/* comtype */ $comclassname *" -%typemap(comtype) SWIGTYPE "/* comtype */ $&comclassname *" -%typemap(comtype) SWIGTYPE & "/* comtype */ $comclassname *" -%typemap(comtype) SWIGTYPE *& "/* comtype */ $*comclassname *" -%typemap(comtype) enum SWIGTYPE "/* comtype */ int" +%typemap(comtype) bool, const bool & "unsigned int" +%typemap(comtype) char, const char & "char" +%typemap(comtype) signed char, const signed char & "signed char" +%typemap(comtype) unsigned char, const unsigned char & "unsigned char" +%typemap(comtype) short, const short & "short" +%typemap(comtype) unsigned short, const unsigned short & "unsigned short" +%typemap(comtype) int, const int & "int" +%typemap(comtype) unsigned int, const unsigned int & "unsigned int" +%typemap(comtype) long, const long & "long" /* Probably should be __int3264 */ +%typemap(comtype) unsigned long, const unsigned long & "unsigned long" /* As above */ +%typemap(comtype) long long, const long long & "hyper" +%typemap(comtype) unsigned long long, const unsigned long long & "unsigned hyper" +%typemap(comtype) float, const float & "float" +%typemap(comtype) double, const double & "double" +%typemap(comtype) void "void" +%typemap(comtype) SWIGTYPE * "$comclassname *" +%typemap(comtype) SWIGTYPE "$&comclassname *" +%typemap(comtype) SWIGTYPE & "$comclassname *" +%typemap(comtype) SWIGTYPE *& "$*comclassname *" +%typemap(comtype) enum SWIGTYPE "int" -%typemap(in) int, double, long %{ /* in */ $1 = ($1_ltype)$input; %} +%typemap(in) bool +%{ $1 = $input ? true : false; %} +%typemap(in) char, + signed char, + unsigned char, + short, + unsigned short, + int, + unsigned int, + long, + unsigned long, + long long, + unsigned long long, + float, + double +%{ $1 = ($1_ltype)$input; %} + +%typemap(in) void "" + %typemap(in) SWIGTYPE * %{ { SWIGIUnknown *wrapper; @@ -90,11 +130,53 @@ $1 = *argp; %} -%typemap(in) enum SWIGTYPE %{ /* in */ $1 = ($1_ltype)$input; %} +%typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} -%typemap(out) int, double, long %{ /* out */ $result = $1; %} +%typemap(out) bool %{ $result = (unsigned int) $1; %} +%typemap(out) char %{ $result = $1; %} +%typemap(out) signed char %{ $result = $1; %} +%typemap(out) unsigned char %{ $result = $1; %} +%typemap(out) short %{ $result = $1; %} +%typemap(out) unsigned short %{ $result = $1; %} +%typemap(out) int %{ $result = $1; %} +%typemap(out) unsigned int %{ $result = $1; %} +%typemap(out) long %{ $result = $1; %} +%typemap(out) unsigned long %{ $result = $1; %} +%typemap(out) long long %{ $result = $1; %} +%typemap(out) unsigned long long %{ $result = $1; %} +%typemap(out) float %{ $result = $1; %} +%typemap(out) double %{ $result = $1; %} + %typemap(out) void "" +%typemap(ctype) char * "WCHAR *" +%typemap(comtype) char * "BSTR" + +%typemap(in) char * { + if ($input) { + int SWIG_len = WideCharToMultiByte(CP_ACP, 0, $input, -1, 0, 0, 0, 0); + $1 = (char *) malloc(SWIG_len); + WideCharToMultiByte(CP_ACP, 0, $input, -1, $1, SWIG_len, 0, 0); + } +} + +%typemap(freearg) char * { + if ($input) { + free($1); + } +} + +%typemap(out) char * %{ + if ($1) { + int SWIG_len = MultiByteToWideChar(CP_ACP, 0, $1, -1, 0, 0); + WCHAR *SWIG_res = (WCHAR *) CoTaskMemAlloc((SWIG_len + 2) * sizeof(WCHAR)); + /* First 4 bytes contain length in bytes */ + *((unsigned int *) SWIG_res) = (unsigned int) (SWIG_len - 1) * sizeof(WCHAR); + MultiByteToWideChar(CP_ACP, 0, $1, -1, SWIG_res + 2, SWIG_len); + $result = SWIG_res + 2; + } +%} + %typemap(out) SWIGTYPE * %{ $result = (SWIGIUnknown *) SWIG_wrap$comclassname((void *) $1, $owner); %} @@ -114,21 +196,8 @@ } #endif -%typemap(out) enum SWIGTYPE %{ /* out */ $result = $1; %} +%typemap(out) enum SWIGTYPE %{ $result = $1; %} -#if 0 -%typemap(directorin) void "" -%typemap(directorin) int, double, long %{ /* directorin */ $input = $1; %} - -%typemap(directorout) int, double, long %{ /* directorout */ $result = ($1_ltype)$input; %} -#endif - -%typemap(combody) SWIGTYPE * %{ -%} - -%typemap(combody) SWIGTYPE %{ -%} - %insert("runtime") %{ #include <windows.h> Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-31 20:30:09 UTC (rev 10723) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-07-31 22:52:41 UTC (rev 10724) @@ -372,6 +372,7 @@ /* Register file targets with the SWIG file handler */ Swig_register_filebyname("header", f_header); + Swig_register_filebyname("wrapper", f_wrappers); Swig_register_filebyname("runtime", f_runtime); Swig_register_filebyname("factory", f_factory); @@ -1118,7 +1119,7 @@ *Char(wanted_base) ? wanted_base : "", " {", NIL); */ Printv(proxy_class_def, "),\n dual\n ]\n interface $comclassname : ", - *Char(wanted_base) ? wanted_base : "IDispatch", " {", NIL); + *Char(wanted_base) ? wanted_base : "IDispatch", " {\n", NIL); Delete(attributes); Modified: branches/gsoc2008-jezabek/Source/Modules/java.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/java.cxx 2008-07-31 20:30:09 UTC (rev 10723) +++ branches/gsoc2008-jezabek/Source/Modules/java.cxx 2008-07-31 22:52:41 UTC (rev 10724) @@ -2658,16 +2658,12 @@ Node *n = enumLookup(t); if (n) { String *symname = Getattr(n, "sym:name"); - Printf(stdout, "symname: %s\n", symname); if (symname) { // Add in class scope when referencing enum if not a global enum String *scopename_prefix = Swig_scopename_prefix(Getattr(n, "name")); - Printf(stdout, "scopename_prefix: %s\n", scopename_prefix); - String *proxyname = 0; if (scopename_prefix) { proxyname = getProxyName(scopename_prefix); - Printf(stdout, "proxyname: %s\n", proxyname); } if (proxyname) { const char *class_separator = jnidescriptor ? "$" : "."; @@ -2675,7 +2671,6 @@ } else { enum_name = NewStringf("%s", symname); } - Printf(stdout, "enum_name: %s\n", enum_name); Delete(scopename_prefix); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-08-02 13:49:51
|
Revision: 10728 http://swig.svn.sourceforge.net/swig/?rev=10728&view=rev Author: jezabek Date: 2008-08-02 13:49:48 +0000 (Sat, 02 Aug 2008) Log Message: ----------- Include /usr/include/wine/windows in widl search path. Modified Paths: -------------- branches/gsoc2008-jezabek/Source/Modules/com.cxx branches/gsoc2008-jezabek/configure.in Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-02 08:49:43 UTC (rev 10727) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-02 13:49:48 UTC (rev 10728) @@ -1113,7 +1113,7 @@ String *proxyclassname = SwigType_str(Getattr(n, "classtypeobj"), 0); String *baseclassname = SwigType_str(Getattr(base.item, "name"), 0); Swig_warning(WARN_COM_MULTIPLE_INHERITANCE, input_file, line_number, - "Warning for %s proxy: Base %s ignored. Multiple inheritance is not supported in C#.\n", proxyclassname, baseclassname); + "Warning for %s proxy: Base %s ignored. Multiple inheritance is not supported in COM.\n", proxyclassname, baseclassname); base = Next(base); } } @@ -1143,6 +1143,7 @@ Delete(attributes); +#if 0 // FIXME: temporary Printv(proxy_class_def, typemapLookup("combody", typemap_lookup_type, WARN_NONE), NIL); @@ -1150,6 +1151,7 @@ // Emit extra user code Printv(proxy_class_def, typemapLookup("comcode", typemap_lookup_type, WARN_NONE), NIL); +#endif // Substitute various strings into the above template Replaceall(proxy_class_code, "$comclassname", proxy_class_name); Modified: branches/gsoc2008-jezabek/configure.in =================================================================== --- branches/gsoc2008-jezabek/configure.in 2008-08-02 08:49:43 UTC (rev 10727) +++ branches/gsoc2008-jezabek/configure.in 2008-08-02 13:49:48 UTC (rev 10728) @@ -1890,8 +1890,8 @@ esac if test "widl" = "$COM_IDL" ; then - COM_IDL_SWITCHES=-t - COM_IDL_HEADER_SWITCHES='-h -H' + COM_IDL_SWITCHES='-I /usr/include/wine/windows -t' + COM_IDL_HEADER_SWITCHES='-I /usr/include/wine/windows -h -H' elif test "midl" = "$COM_IDL" ; then COM_IDL_SWITCHES= COM_IDL_HEADER_SWITCHES='/notlb /h' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-08-03 00:49:16
|
Revision: 10730 http://swig.svn.sourceforge.net/swig/?rev=10730&view=rev Author: jezabek Date: 2008-08-03 00:49:13 +0000 (Sun, 03 Aug 2008) Log Message: ----------- Added std_string.i. Fixed class construction using class factory - now only available if the class has a default constructor. Destructor wrapper is now only generated if a public destructor is available. Added typemaps for const references. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Added Paths: ----------- branches/gsoc2008-jezabek/Lib/com/std_string.i Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-02 16:38:27 UTC (rev 10729) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-03 00:49:13 UTC (rev 10730) @@ -66,6 +66,25 @@ double %{ $1 = ($1_ltype)$input; %} +%typemap(in) const bool & ($*1_ltype temp) +%{ temp = $input ? true : false; + $1 = &temp; %} + +%typemap(in) const char & ($*1_ltype temp), + const signed char & ($*1_ltype temp), + const unsigned char & ($*1_ltype temp), + const short & ($*1_ltype temp), + const unsigned short & ($*1_ltype temp), + const int & ($*1_ltype temp), + const unsigned int & ($*1_ltype temp), + const long & ($*1_ltype temp), + const unsigned long & ($*1_ltype temp), + const long long & ($*1_ltype temp), + const float & ($*1_ltype temp), + const double & ($*1_ltype temp) +%{ temp = ($*1_ltype)$input; + $1 = &temp; %} + %typemap(in) void "" %typemap(in) SWIGTYPE * %{ @@ -132,27 +151,43 @@ %typemap(in) enum SWIGTYPE %{ $1 = ($1_ltype)$input; %} -%typemap(out) bool %{ $result = (unsigned int) $1; %} -%typemap(out) char %{ $result = $1; %} -%typemap(out) signed char %{ $result = $1; %} -%typemap(out) unsigned char %{ $result = $1; %} -%typemap(out) short %{ $result = $1; %} -%typemap(out) unsigned short %{ $result = $1; %} -%typemap(out) int %{ $result = $1; %} -%typemap(out) unsigned int %{ $result = $1; %} -%typemap(out) long %{ $result = $1; %} -%typemap(out) unsigned long %{ $result = $1; %} -%typemap(out) long long %{ $result = $1; %} -%typemap(out) unsigned long long %{ $result = $1; %} -%typemap(out) float %{ $result = $1; %} -%typemap(out) double %{ $result = $1; %} +%typemap(out) bool, + char, + signed char, + unsigned char, + short, + unsigned short, + int, + unsigned int, + long, + unsigned long, + long long, + unsigned long long, + float, + double +%{ $result = $1; %} +%typemap(out) const bool &, + const char &, + const signed char &, + const unsigned char &, + const short &, + const unsigned short &, + const int &, + const unsigned int &, + const long &, + const unsigned long &, + const long long &, + const float &, + const double & +%{ $result = *$1; %} + %typemap(out) void "" -%typemap(ctype) char * "WCHAR *" -%typemap(comtype) char * "BSTR" +%typemap(ctype) char *, char[], char[ANY] "WCHAR *" +%typemap(comtype) char *, char[], char[ANY] "BSTR" -%typemap(in) char * { +%typemap(in) char *, char[], char[ANY] { if ($input) { int SWIG_len = WideCharToMultiByte(CP_ACP, 0, $input, -1, 0, 0, 0, 0); $1 = (char *) malloc(SWIG_len); @@ -160,13 +195,13 @@ } } -%typemap(freearg) char * { +%typemap(freearg) char *, char[], char[ANY] { if ($input) { free($1); } } -%typemap(out) char * %{ +%typemap(out) char *, char[], char[ANY] %{ if ($1) { int SWIG_len = MultiByteToWideChar(CP_ACP, 0, $1, -1, 0, 0); WCHAR *SWIG_res = (WCHAR *) CoTaskMemAlloc((SWIG_len + 2) * sizeof(WCHAR)); @@ -198,6 +233,29 @@ %typemap(out) enum SWIGTYPE %{ $result = $1; %} +%typemap(throws) char, + signed char, + unsigned char, + short, + unsigned short, + int, + unsigned int, + long, + unsigned long, + long long, + unsigned long long, + float, + double, + SWIGTYPE *, + SWIGTYPE &, + SWIGTYPE, + SWIGTYPE[], + SWIGTYPE[ANY] +%{ + return $null; +%} + + %insert("runtime") %{ #include <windows.h> Added: branches/gsoc2008-jezabek/Lib/com/std_string.i =================================================================== --- branches/gsoc2008-jezabek/Lib/com/std_string.i (rev 0) +++ branches/gsoc2008-jezabek/Lib/com/std_string.i 2008-08-03 00:49:13 UTC (rev 10730) @@ -0,0 +1,34 @@ +%{ +#include <string> +%} + +namespace std { + +%naturalvar string; +class string; + +%typemap(ctype) string "WCHAR *" +%typemap(comtype) string "BSTR" + +%typemap(in) string { + if ($input) { + int SWIG_len = WideCharToMultiByte(CP_ACP, 0, $input, -1, 0, 0, 0, 0); + char *$1_pstr = (char *) malloc(SWIG_len); + WideCharToMultiByte(CP_ACP, 0, $input, -1, $1_pstr, SWIG_len, 0, 0); + $1.assign($1_pstr); + free($1_pstr); + } +} + +%typemap(out) string %{ + { + int SWIG_len = MultiByteToWideChar(CP_ACP, 0, $1.c_str(), -1, 0, 0); + WCHAR *SWIG_res = (WCHAR *) CoTaskMemAlloc((SWIG_len + 2) * sizeof(WCHAR)); + /* First 4 bytes contain length in bytes */ + *((unsigned int *) SWIG_res) = (unsigned int) (SWIG_len - 1) * sizeof(WCHAR); + MultiByteToWideChar(CP_ACP, 0, $1.c_str(), -1, SWIG_res + 2, SWIG_len); + $result = SWIG_res + 2; + } +%} + +} Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-02 16:38:27 UTC (rev 10729) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-03 00:49:13 UTC (rev 10730) @@ -206,6 +206,8 @@ String *module_class_code; String *namespce; + String *default_ctor_wname; + #if 0 static Parm *NewParmFromNode(SwigType *type, const String_or_char *name, Node *n) { @@ -785,7 +787,6 @@ /* Insert cleanup code */ for (p = l; p;) { if ((tm = Getattr(p, "tmap:freearg"))) { - //addThrows(n, "tmap:freearg", p); Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ Replaceall(tm, "$input", Getattr(p, "emit:input")); @@ -805,6 +806,11 @@ Printv(f->code, " return jresult;\n", NIL); Printf(f->code, "}\n"); + if (!is_void_return) + Replaceall(f->code, "$null", "0"); + else + Replaceall(f->code, "$null", ""); + Wrapper_print(f, f_wrappers); if (!(proxy_flag && is_wrapping_class() && !constructor_flag) && !enum_constant_flag) { @@ -968,6 +974,10 @@ constructor_flag = false; static_flag = false; + if (Getattr(n, "default_constructor")) { + default_ctor_wname = Copy(Getattr(n, "wrap:name")); + } + return SWIG_OK; } @@ -1123,7 +1133,7 @@ const String *wanted_base = baseclass ? baseclass : pure_baseclass; bool derived = baseclass && getProxyName(c_baseclassname); - if (!Getattr(n, "abstract")) { + if (!Getattr(n, "abstract") && default_ctor_wname != NULL) { Printv(proxy_class_def, " [\n aggregatable,\n uuid(", NIL); formatGUID(proxy_class_def, proxy_clsid, false); Printv(proxy_class_def, ")\n ]\n coclass $comclassnameImpl {\n" @@ -1338,6 +1348,8 @@ Clear(proxy_class_vtable_code); Clear(proxy_class_vtable_defs); + default_ctor_wname = NULL; + proxy_iid = new GUID; if (Getattr(n, "feature:iid")) { parseGUID(Getattr(n, "feature:iid"), proxy_iid); @@ -1351,26 +1363,6 @@ formatGUID(proxy_class_vtable_code, proxy_iid, true); Printf(proxy_class_vtable_code, ";\n\n"); - if (!Getattr(n, "abstract")) { - /* Generate class object */ - proxy_clsid = new GUID; - if (Getattr(n, "feature:clsid")) { - parseGUID(Getattr(n, "feature:clsid"), proxy_clsid); - } else { - String *proxy_clsid_ident = NewStringf("%s.%s.CLSID", namespce, proxy_class_name); - generateGUID(proxy_clsid, proxy_clsid_ident); - Delete(proxy_clsid_ident); - } - - Printf(proxy_class_vtable_code, "GUID CLSID_%s = ", proxy_class_name); - formatGUID(proxy_class_vtable_code, proxy_clsid, true); - Printf(proxy_class_vtable_code, ";\n\n"); - - Printf(clsid_list, " { (SWIG_funcptr) _wrap_new_%s, &CLSID_%s, _T(\"{", proxy_class_name, proxy_class_name); - formatGUID(clsid_list, proxy_clsid, false); - Printf(clsid_list, "}\"), _T(\"%s.%s\"), 1 },\n", namespce, proxy_class_name); - } - Printf(proxy_class_vtable_code, "HRESULT SWIGSTDCALL _wrap%sQueryInterface1(void *that, GUID *iid, " "void ** ppvObject) {\n", proxy_class_name); @@ -1535,9 +1527,21 @@ Language::classHandler(n); if (proxy_flag) { - for (Iterator func = First(proxy_class_member_functions); func.item; func = Next(func)) { - Printf(proxy_class_vtable_code, ",\n (SWIG_funcptr) %s", func.item); + for (Iterator func = First(proxy_class_member_functions); func.item; func = Next(func)) { + Printf(proxy_class_vtable_code, ",\n (SWIG_funcptr) %s", func.item); + } + + if (!Getattr(n, "abstract") && default_ctor_wname != NULL) { + /* Generate class object */ + proxy_clsid = new GUID; + if (Getattr(n, "feature:clsid")) { + parseGUID(Getattr(n, "feature:clsid"), proxy_clsid); + } else { + String *proxy_clsid_ident = NewStringf("%s.%s.CLSID", namespce, proxy_class_name); + generateGUID(proxy_clsid, proxy_clsid_ident); + Delete(proxy_clsid_ident); } + } emitProxyClassDefAndCPPCasts(n); @@ -1562,9 +1566,21 @@ Printv(proxy_class_vtable_code, "\n};\n\n", NIL); - Printf(proxy_class_vtable_code, "void SWIG_delete_%s(%s *arg) {\n" - " delete arg;\n}\n\n", proxy_class_name, Getattr(n, "classtype")); + if (!Getattr(n, "abstract") && default_ctor_wname != NULL) { + Printf(proxy_class_vtable_code, "GUID CLSID_%s = ", proxy_class_name); + formatGUID(proxy_class_vtable_code, proxy_clsid, true); + Printf(proxy_class_vtable_code, ";\n\n"); + Printf(clsid_list, " { (SWIG_funcptr) %s, &CLSID_%s, _T(\"{", default_ctor_wname, proxy_class_name); + formatGUID(clsid_list, proxy_clsid, false); + Printf(clsid_list, "}\"), _T(\"%s.%s\"), 1 },\n", namespce, proxy_class_name); + } + + if (Getattr(n, "has_destructor")) { + Printf(proxy_class_vtable_code, "void SWIG_delete_%s(%s *arg) {\n" + " delete arg;\n}\n\n", proxy_class_name, Getattr(n, "classtype")); + } + Printf(proxy_class_vtable_code, "void * SWIGSTDCALL SWIG_wrap%s(void *arg, int cMemOwn) {\n" "#ifdef __cplusplus\n" " SWIGWrappedObject *res = new SWIGWrappedObject;\n" @@ -1578,14 +1594,24 @@ " res->cMemOwn = cMemOwn;\n" " res->outer = NULL;\n" " InterlockedIncrement(&globalRefCount);\n" - " res->refCount = 1;\n" - " res->deleteInstance = (void (*)(void *)) SWIG_delete_%s;\n" + " res->refCount = 1;\n", + proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name); + + if (Getattr(n, "has_destructor")) { + Printf(proxy_class_vtable_code, + " res->deleteInstance = (void (*)(void *)) SWIG_delete_%s;\n", + proxy_class_name); + } else { + Printf(proxy_class_vtable_code, + " res->deleteInstance = (void (*)(void *)) 0;\n"); + } + + Printf(proxy_class_vtable_code, " /* GetTypeInfoOfGuid */\n" " ((HRESULT (SWIGSTDCALL *)(ITypeLib *, GUID *, ITypeInfo **)) (((SWIGIUnknown *) SWIG_typelib)->vtable[6]))(SWIG_typelib, &IID_%s, &res->typeInfo);\n" " return (void *) res;\n" "}\n\n", - proxy_class_name, proxy_class_name, proxy_class_name, proxy_class_name, - proxy_class_name, proxy_class_name); + proxy_class_name); Printf(proxy_class_vtable_defs, "void * SWIGSTDCALL SWIG_wrap%s(void *arg, int cMemOwn);\n", proxy_class_name); @@ -1598,6 +1624,8 @@ Delete(proxy_class_constants_code); proxy_class_constants_code = NULL; delete proxy_iid; + if (default_ctor_wname != NULL) + Delete(default_ctor_wname); } return SWIG_OK; @@ -1810,10 +1838,7 @@ Printv(proxy_class_def, " [\n object,\n local,\n uuid(", NIL); formatGUID(proxy_class_def, proxy_iid, false); - Printv(proxy_class_def, ")\n ]\n interface $comclassname {\n", - typemapLookup("combody", type, WARN_COM_TYPEMAP_COMBODY_UNDEF), - typemapLookup("comcode", type, WARN_NONE), - " };\n\n", NIL); + Printv(proxy_class_def, ")\n ]\n interface $comclassname {\n };\n\n", NIL); Replaceall(proxy_class_forward_def, "$comclassname", classname); Replaceall(proxy_class_def, "$comclassname", classname); @@ -2004,10 +2029,6 @@ Printf(arg, "j%s", ln); - /* Add various typemap's 'throws' clauses */ - //addThrows(n, "tmap:directorin", p); - //addThrows(n, "tmap:out", p); - /* And add to the upcall args */ if (gencomma > 0) Printf(jupcall_args, ", "); @@ -2088,7 +2109,6 @@ /* Copy jresult into c_result... */ if ((tm = Swig_typemap_lookup("directorout", tp, result_str, w))) { - //+addThrows(n, "tmap:directorout", tp); Replaceall(tm, "$input", jresult_str); Replaceall(tm, "$result", result_str); Printf(w->code, "%s\n", tm); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-08-03 23:04:29
|
Revision: 10732 http://swig.svn.sourceforge.net/swig/?rev=10732&view=rev Author: jezabek Date: 2008-08-03 23:04:26 +0000 (Sun, 03 Aug 2008) Log Message: ----------- Change function definitions to return HRESULT, as required by Automation; this will be optional once I add a command line flag. This change is practically invisible from VBScript, JScript, etc., but visible from C. Changed virtual_poly_runme test case accordingly. Exception handlers now return E_ABORT, but better exception reporting is now possible. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c 2008-08-03 09:51:45 UTC (rev 10731) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c 2008-08-03 23:04:26 UTC (rev 10732) @@ -5,14 +5,35 @@ #include "virtual_poly.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { + virtual_poly *vp = NULL; + NDouble *d = NULL; + NInt *i = NULL; + NNumber *dc_as_nnumber = NULL; + NDouble *dc = NULL; + NNumber *ic_as_nnumber = NULL; + NInt *ic = NULL; + NDouble *ddc = NULL; + NInt *dic = NULL; + NNumber *n1 = NULL; + NNumber *n2 = NULL; + NDouble *dn1 = NULL; + NDouble *dn2 = NULL; + NNumber *nr = NULL; + NDouble *dr1 = NULL; + NNumber *dr2_as_nnumber = NULL; + NDouble *dr2 = NULL; + NInt *ic_temp = NULL; + int temp1; + int temp2; + double dtemp1; + double dtemp2; + CoInitialize(NULL); - virtual_poly *vp; - CoCreateInstance(&CLSID_virtual_polyImpl, NULL, CLSCTX_INPROC_SERVER, &IID_virtual_poly, (void **) &vp); - NDouble *d = vp->lpVtbl->new_NDouble(vp, 3.5); - NInt *i = vp->lpVtbl->new_NInt(vp, 2); + vp->lpVtbl->new_NDouble(vp, 3.5, &d); + vp->lpVtbl->new_NInt(vp, 2, &i); /* * These two natural 'copy' forms fail because no covariant (polymorphic) return types @@ -25,25 +46,21 @@ * Unlike C++, we have to downcast instead. */ - NNumber *dc_as_nnumber = d->lpVtbl->copy(d); + d->lpVtbl->copy(d, &dc_as_nnumber); - NDouble *dc = NULL; - dc_as_nnumber->lpVtbl->QueryInterface(dc_as_nnumber, &IID_NDouble, (void **) &dc); - NNumber *ic_as_nnumber = i->lpVtbl->copy(i); + i->lpVtbl->copy(i, &ic_as_nnumber); - NInt *ic = NULL; - ic_as_nnumber->lpVtbl->QueryInterface(ic_as_nnumber, &IID_NInt, (void **) &ic); /* * Static methods */ - NDouble *ddc = dc->lpVtbl->narrow(dc, dc_as_nnumber); + dc->lpVtbl->narrow(dc, dc_as_nnumber, &ddc); - NInt *dic = ic->lpVtbl->narrow(ic, ic_as_nnumber); + ic->lpVtbl->narrow(ic, ic_as_nnumber, &dic); dc_as_nnumber->lpVtbl->Release(dc_as_nnumber); ic_as_nnumber->lpVtbl->Release(ic_as_nnumber); @@ -53,9 +70,13 @@ ic = dic; dc = ddc; - vp->lpVtbl->incr(vp, ic); + vp->lpVtbl->incr(vp, ic, &ic_temp); + ic_temp->lpVtbl->Release(ic_temp); - if (i->lpVtbl->get(i) + 1 != ic->lpVtbl->get(ic)) { + i->lpVtbl->get(i, &temp1); + ic->lpVtbl->get(ic, &temp2); + + if (temp1 + 1 != temp2) { fprintf(stderr, "incr test failed\n"); exit(1); } @@ -66,12 +87,15 @@ /* * Checking a pure user downcast */ - NNumber *n1 = d->lpVtbl->copy(d); - NNumber *n2 = d->lpVtbl->nnumber(d); - NDouble *dn1 = d->lpVtbl->narrow(d, n1); - NDouble *dn2 = d->lpVtbl->narrow(d, n2); + d->lpVtbl->copy(d, &n1); + d->lpVtbl->nnumber(d, &n2); + d->lpVtbl->narrow(d, n1, &dn1); + d->lpVtbl->narrow(d, n2, &dn2); - if (dn1->lpVtbl->get(dn1) != dn2->lpVtbl->get(dn2)) { + dn1->lpVtbl->get(dn1, &dtemp1); + dn2->lpVtbl->get(dn2, &dtemp2); + + if (dtemp1 != dtemp2) { fprintf(stderr, "copy/narrow test failed\n"); exit(1); } @@ -84,13 +108,16 @@ /* * Checking the ref polymorphic case */ - NNumber *nr = d->lpVtbl->ref_this(d); - NDouble *dr1 = d->lpVtbl->narrow(d, nr); - NNumber *dr2_as_nnumber = d->lpVtbl->ref_this(d); - NDouble *dr2 = NULL; + d->lpVtbl->ref_this(d, &nr); + d->lpVtbl->narrow(d, nr, &dr1); + d->lpVtbl->ref_this(d, &dr2_as_nnumber); + dr2_as_nnumber->lpVtbl->QueryInterface(dr2_as_nnumber, &IID_NDouble, (void **) &dr2); - if (dr1->lpVtbl->get(dr1) != dr2->lpVtbl->get(dr2)) { + dr1->lpVtbl->get(dr1, &dtemp1); + dr2->lpVtbl->get(dr2, &dtemp2); + + if (dtemp1 != dtemp2) { fprintf(stderr, "copy/narrow test failed\n"); exit(1); } Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-03 09:51:45 UTC (rev 10731) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-03 23:04:26 UTC (rev 10732) @@ -252,7 +252,7 @@ SWIGTYPE[], SWIGTYPE[ANY] %{ - return $null; + return E_ABORT; %} Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-03 09:51:45 UTC (rev 10731) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-03 23:04:26 UTC (rev 10732) @@ -174,6 +174,7 @@ bool dllexports_flag; bool deffile_flag; bool rcfile_flag; + bool hresult_flag; // Flag specifying whether to use HRESULT as return type bool enum_constant_flag; // Flag for when wrapping an enum or constant bool static_flag; // Flag for when wrapping a static functions or member variables bool variable_wrapper_flag; // Flag for when wrapping a nonstatic member variable @@ -226,6 +227,7 @@ * ----------------------------------------------------------------------------- */ COM():empty_string(NewString("")), + hresult_flag(true), proxy_flag(true), deffile_flag(true), rcfile_flag(true), @@ -672,7 +674,12 @@ if (!is_void_return) Wrapper_add_localv(f, "jresult", c_return_type, "jresult", NIL); - Printv(f->def, c_return_type, " SWIGSTDCALL ", wname, "(", NIL); + if (hresult_flag) { + Wrapper_add_localv(f, "hres", "HRESULT", "hres", NIL); + Printv(f->def, "HRESULT SWIGSTDCALL ", wname, "(", NIL); + } else { + Printv(f->def, c_return_type, " SWIGSTDCALL ", wname, "(", NIL); + } // Emit all of the local variables for holding arguments. emit_parameter_variables(l, f); @@ -741,6 +748,11 @@ Delete(arg); } + if (!is_void_return && hresult_flag) { + Printv(f->def, gencomma ? ", " : "", c_return_type, " *SWIG_result_ptr", NIL); + gencomma = 1; + } + String *null_attribute = 0; // Now write code to make the function call /* FIXME: if (!native_function_flag) */ { @@ -761,10 +773,14 @@ /* Return value if necessary */ if ((tm = Swig_typemap_lookup_out("out", n, "result", f, actioncode))) { - // FIXME: canThrow(n, "out", n); Replaceall(tm, "$source", "result"); /* deprecated */ - Replaceall(tm, "$target", "jresult"); /* deprecated */ - Replaceall(tm, "$result", "jresult"); + if (!hresult_flag) { + Replaceall(tm, "$target", "jresult"); /* deprecated */ + Replaceall(tm, "$result", "jresult"); + } else { + Replaceall(tm, "$target", "*SWIG_result_ptr"); /* deprecated */ + Replaceall(tm, "$result", "*SWIG_result_ptr"); + } if (GetFlag(n, "feature:new")) Replaceall(tm, "$owner", "1"); @@ -802,8 +818,10 @@ Printf(f->def, ") {"); - if (!is_void_return) + if (!is_void_return && !hresult_flag) Printv(f->code, " return jresult;\n", NIL); + if (hresult_flag) + Printv(f->code, " return S_OK;\n", NIL); Printf(f->code, "}\n"); if (!is_void_return) @@ -995,6 +1013,7 @@ int i; String *func_name = NULL; bool setter_flag = false; + bool is_void_return; if (l) { if (SwigType_type(Getattr(l, "type")) == T_VOID) { @@ -1019,6 +1038,8 @@ Swig_warning(WARN_COM_TYPEMAP_COMTYPE_UNDEF, input_file, line_number, "No comtype typemap defined for %s\n", SwigType_str(t, 0)); } + is_void_return = (Cmp(return_type, "void") == 0); + if (proxy_flag && global_variable_flag) { func_name = NewString(""); setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(variable_name)) == 0); @@ -1034,7 +1055,11 @@ func_name = Getattr(n, "sym:name"); } - Printf(function_code, " %s %s(", return_type, func_name); + if (hresult_flag) { + Printf(function_code, " HRESULT %s(", func_name); + } else { + Printf(function_code, " %s %s(", return_type, func_name); + } /* Get number of required and total arguments */ int num_arguments = emit_num_arguments(l); @@ -1075,6 +1100,11 @@ Delete(param_type); } + if (hresult_flag && !is_void_return) { + Printv(function_code, gencomma ? ", " : "", "[ retval, out ] ", return_type, " *SWIG_result_ptr", NIL); + gencomma = 2; + } + Printf(function_code, ");\n"); Printv(module_class_code, function_code, NIL); @@ -1678,6 +1708,7 @@ bool setter_flag = false; String *pre_code = NewString(""); String *post_code = NewString(""); + bool is_void_return; if (!proxy_flag) return; @@ -1730,6 +1761,8 @@ Swig_warning(WARN_COM_TYPEMAP_COMTYPE_UNDEF, input_file, line_number, "No comstype typemap defined for %s\n", SwigType_str(t, 0)); } + is_void_return = (Cmp(return_type, "void") == 0); + if (wrapping_member_flag && !enum_constant_flag) { // Properties setter_flag = (Cmp(Getattr(n, "sym:name"), Swig_name_set(Swig_name_member(proxy_class_name, variable_name))) == 0); @@ -1743,7 +1776,11 @@ /* Start generating the proxy function */ - Printf(function_code, " %s %s(", return_type, proxy_function_name); + if (hresult_flag) { + Printf(function_code, " HRESULT %s(", proxy_function_name); + } else { + Printf(function_code, " %s %s(", return_type, proxy_function_name); + } emit_mark_varargs(l); @@ -1793,6 +1830,11 @@ p = Getattr(p, "tmap:in:next"); } + if (hresult_flag && !is_void_return) { + Printv(function_code, (gencomma >= 2) ? ", " : "", "[ retval, out ] ", return_type, " *SWIG_result_ptr", NIL); + gencomma = 2; + } + Printf(function_code, ")"); // FIXME: generateThrowsClause(n, function_code); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-08-04 00:09:48
|
Revision: 10733 http://swig.svn.sourceforge.net/swig/?rev=10733&view=rev Author: jezabek Date: 2008-08-04 00:09:45 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Test suite bug hunt: Prevent using IIDs of ignored classes; minor unsigned char fixes; opt-out from the import_nomodule test; set include directories when compiling the test suite; change location of headers generated from the IDL files to prevent name clashes. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/Makefile.in branches/gsoc2008-jezabek/Examples/test-suite/char_strings.i branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c branches/gsoc2008-jezabek/Examples/test-suite/import_nomodule.i branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Examples/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/Makefile.in 2008-08-03 23:04:26 UTC (rev 10732) +++ branches/gsoc2008-jezabek/Examples/Makefile.in 2008-08-04 00:09:45 UTC (rev 10733) @@ -1119,13 +1119,13 @@ $(SWIG) -com $(SWIGOPT) $(INTERFACE) $(COMPILETOOL) $(COM_IDL) $(COM_IDL_SWITCHES) $(COM_IDL_FILE) $(COMPILETOOL) $(COM_RC) $(COM_RC_IN_SWITCHES) $(COM_RC_FILE) $(COM_RC_OUT_SWITCHES) $(COM_RES_FILE) - $(COMPILETOOL) $(COM_CC) $(COM_CC_SHARED_SWITCHES) $(COM_CC_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(ISRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) + $(COMPILETOOL) $(COM_CC) $(COM_CC_SHARED_SWITCHES) $(COM_CC_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(ISRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) $(INCLUDES) com_cpp: $(SRCS) $(SWIG) -com -c++ $(SWIGOPT) $(INTERFACE) $(COMPILETOOL) $(COM_IDL) $(COM_IDL_SWITCHES) $(COM_IDL_FILE) $(COMPILETOOL) $(COM_RC) $(COM_RC_IN_SWITCHES) $(COM_RC_FILE) $(COM_RC_OUT_SWITCHES) $(COM_RES_FILE) - $(COMPILETOOL) $(COM_CXX) $(COM_CXX_SHARED_SWITCHES) $(COM_CXX_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) + $(COMPILETOOL) $(COM_CXX) $(COM_CXX_SHARED_SWITCHES) $(COM_CXX_OUT_SWITCHES)$(TARGET).dll$(COM_EXEC_SUFFIX) $(SRCS) $(CXXSRCS) $(ICXXSRCS) $(COM_RES_FILE) $(COM_DEF_FILE) $(COM_LIBS) $(INCLUDES) com_compile: $(SRCS) $(COMPILETOOL) $(COM_CC) $(COM_CC_SWITCHES) $(COM_CC_OUT_SWITCHES) $(TARGET)$(COM_EXEC_SUFFIX) $(COMSRCS) $(COM_LIBS) Modified: branches/gsoc2008-jezabek/Examples/test-suite/char_strings.i =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/char_strings.i 2008-08-03 23:04:26 UTC (rev 10732) +++ branches/gsoc2008-jezabek/Examples/test-suite/char_strings.i 2008-08-04 00:09:45 UTC (rev 10733) @@ -10,6 +10,7 @@ %warnfilter(SWIGWARN_TYPEMAP_CHARLEAK_MSG) global_const_char; // Setting a const char * variable may leak memory. %{ +#include <stdio.h> #define OTHERLAND_MSG "Little message from the safe world." #define CPLUSPLUS_MSG "A message from the deep dark world of C++, where anything is possible." static char *global_str = NULL; Modified: branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-08-03 23:04:26 UTC (rev 10732) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-08-04 00:09:45 UTC (rev 10733) @@ -65,7 +65,7 @@ # Generates headers from the IDL file generate_headers = \ - $(COMPILETOOL) $(COM_IDL) $(COM_IDL_HEADER_SWITCHES) $*.h $*/$*.idl; + $(COMPILETOOL) $(COM_IDL) $(COM_IDL_HEADER_SWITCHES) $*/$*.h $*/$*.idl; # Compiles COM files then runs the testcase. A testcase is only run if # a file is found which has _runme.c appended after the testcase name. Modified: branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c 2008-08-03 23:04:26 UTC (rev 10732) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c 2008-08-04 00:09:45 UTC (rev 10733) @@ -2,7 +2,7 @@ #include <stdio.h> #include <windows.h> #include <initguid.h> -#include "virtual_poly.h" +#include "virtual_poly/virtual_poly.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { virtual_poly *vp = NULL; Modified: branches/gsoc2008-jezabek/Examples/test-suite/import_nomodule.i =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/import_nomodule.i 2008-08-03 23:04:26 UTC (rev 10732) +++ branches/gsoc2008-jezabek/Examples/test-suite/import_nomodule.i 2008-08-04 00:09:45 UTC (rev 10733) @@ -5,7 +5,7 @@ %import "import_nomodule.h" -#if !defined(SWIGJAVA) && !defined(SWIGRUBY) && !defined(SWIGCSHARP) +#if !defined(SWIGJAVA) && !defined(SWIGRUBY) && !defined(SWIGCSHARP) && !defined(SWIGCOM) /** * The proxy class does not have Bar derived from Foo, yet an instance of Bar Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-03 23:04:26 UTC (rev 10732) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-04 00:09:45 UTC (rev 10733) @@ -190,8 +190,8 @@ %typemap(in) char *, char[], char[ANY] { if ($input) { int SWIG_len = WideCharToMultiByte(CP_ACP, 0, $input, -1, 0, 0, 0, 0); - $1 = (char *) malloc(SWIG_len); - WideCharToMultiByte(CP_ACP, 0, $input, -1, $1, SWIG_len, 0, 0); + $1 = ($1_ltype) malloc(SWIG_len); + WideCharToMultiByte(CP_ACP, 0, $input, -1, (char *) $1, SWIG_len, 0, 0); } } @@ -203,11 +203,11 @@ %typemap(out) char *, char[], char[ANY] %{ if ($1) { - int SWIG_len = MultiByteToWideChar(CP_ACP, 0, $1, -1, 0, 0); + int SWIG_len = MultiByteToWideChar(CP_ACP, 0, (char *) $1, -1, 0, 0); WCHAR *SWIG_res = (WCHAR *) CoTaskMemAlloc((SWIG_len + 2) * sizeof(WCHAR)); /* First 4 bytes contain length in bytes */ *((unsigned int *) SWIG_res) = (unsigned int) (SWIG_len - 1) * sizeof(WCHAR); - MultiByteToWideChar(CP_ACP, 0, $1, -1, SWIG_res + 2, SWIG_len); + MultiByteToWideChar(CP_ACP, 0, (char *) $1, -1, SWIG_res + 2, SWIG_len); $result = SWIG_res + 2; } %} Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-03 23:04:26 UTC (rev 10732) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-04 00:09:45 UTC (rev 10733) @@ -1425,7 +1425,8 @@ while (bases) { Iterator base = First(bases); - Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_%s)", Getattr(base.item, "sym:name")); + if (!Getattr(base.item, "feature:ignore")) + Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_%s)", Getattr(base.item, "sym:name")); /* Get next base */ bases = Getattr(base.item, "bases"); @@ -1489,7 +1490,8 @@ while (bases) { Iterator base = First(bases); - Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_%s)", Getattr(base.item, "sym:name")); + if (!Getattr(base.item, "feature:ignore")) + Printf(proxy_class_vtable_code, " ||\n SWIGIsEqual(iid, &IID_%s)", Getattr(base.item, "sym:name")); /* Get next base */ bases = Getattr(base.item, "bases"); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-08-04 17:53:41
|
Revision: 10734 http://swig.svn.sourceforge.net/swig/?rev=10734&view=rev Author: jezabek Date: 2008-08-04 17:53:24 +0000 (Mon, 04 Aug 2008) Log Message: ----------- Minor features and bug fixes: contract support; fixed object deallocation in C (free instead of delete); fix input typemap to support pointers to member functions; changed name of header generated from IDL to prevent name clashes; added /s switch to regsvr32 to prevent displaying message boxes on Windows and to reduce noise on Unix/Wine. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Source/Modules/com.cxx Modified: branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-08-04 00:09:45 UTC (rev 10733) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/Makefile.in 2008-08-04 17:53:24 UTC (rev 10734) @@ -58,14 +58,14 @@ # Calls Dll[Un]RegisterServer on created component register_component = \ - $(RUNTOOL) regsvr32 $*.dll$(COM_EXEC_SUFFIX); + $(RUNTOOL) regsvr32 /s $*.dll$(COM_EXEC_SUFFIX); unregister_component = \ - $(RUNTOOL) regsvr32 /u $*.dll$(COM_EXEC_SUFFIX); + $(RUNTOOL) regsvr32 /s /u $*.dll$(COM_EXEC_SUFFIX); # Generates headers from the IDL file generate_headers = \ - $(COMPILETOOL) $(COM_IDL) $(COM_IDL_HEADER_SWITCHES) $*/$*.h $*/$*.idl; + $(COMPILETOOL) $(COM_IDL) $(COM_IDL_HEADER_SWITCHES) $*/$*_generated.h $*/$*.idl; # Compiles COM files then runs the testcase. A testcase is only run if # a file is found which has _runme.c appended after the testcase name. Modified: branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c 2008-08-04 00:09:45 UTC (rev 10733) +++ branches/gsoc2008-jezabek/Examples/test-suite/com/virtual_poly_runme.c 2008-08-04 17:53:24 UTC (rev 10734) @@ -2,7 +2,7 @@ #include <stdio.h> #include <windows.h> #include <initguid.h> -#include "virtual_poly/virtual_poly.h" +#include "virtual_poly/virtual_poly_generated.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { virtual_poly *vp = NULL; Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-04 00:09:45 UTC (rev 10733) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-04 17:53:24 UTC (rev 10734) @@ -23,6 +23,7 @@ %typemap(ctype) double, const double & "double" %typemap(ctype) void "void" %typemap(ctype) SWIGTYPE * "SWIGIUnknown *" +%typemap(ctype) SWIGTYPE (CLASS::*) "SWIGIUnknown *" %typemap(ctype) SWIGTYPE "SWIGIUnknown *" %typemap(ctype) SWIGTYPE & "SWIGIUnknown *" %typemap(ctype) enum SWIGTYPE "int" @@ -43,6 +44,7 @@ %typemap(comtype) double, const double & "double" %typemap(comtype) void "void" %typemap(comtype) SWIGTYPE * "$comclassname *" +%typemap(comtype) SWIGTYPE (CLASS::*) "$comclassname *" %typemap(comtype) SWIGTYPE "$&comclassname *" %typemap(comtype) SWIGTYPE & "$comclassname *" %typemap(comtype) SWIGTYPE *& "$*comclassname *" @@ -87,7 +89,7 @@ %typemap(in) void "" -%typemap(in) SWIGTYPE * %{ +%typemap(in) SWIGTYPE *, SWIGTYPE (CLASS::*) %{ { SWIGIUnknown *wrapper; @@ -99,7 +101,8 @@ /* Argument was not wrapped by SWIG - directors will be needed */ } else { /* GetCPtr */ - $1 = ($1_ltype) ((void * (SWIGSTDCALL *)(SWIGIUnknown *)) (wrapper->vtable[3]))(wrapper); + void *c_ptr = ((void * (SWIGSTDCALL *)(SWIGIUnknown *)) (wrapper->vtable[3]))(wrapper); + $1 = *($&1_ltype) &c_ptr; /* Release */ ((long (SWIGSTDCALL *)(SWIGIUnknown *)) (wrapper->vtable[2]))(wrapper); @@ -212,8 +215,8 @@ } %} -%typemap(out) SWIGTYPE * %{ - $result = (SWIGIUnknown *) SWIG_wrap$comclassname((void *) $1, $owner); +%typemap(out) SWIGTYPE *, SWIGTYPE (CLASS::*) %{ + $result = (SWIGIUnknown *) SWIG_wrap$comclassname(*(void **) &$1, $owner); %} %typemap(out) SWIGTYPE & %{ @@ -252,7 +255,7 @@ SWIGTYPE[], SWIGTYPE[ANY] %{ - return E_ABORT; + return $null; %} @@ -265,6 +268,8 @@ #include <string.h> #include <memory.h> +#define SWIG_contract_assert(nullreturn, expr, msg) if (!(expr)) { return nullreturn; } else + typedef void (SWIGSTDCALL *SWIG_funcptr)(void); typedef struct { Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-04 00:09:45 UTC (rev 10733) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-04 17:53:24 UTC (rev 10734) @@ -824,7 +824,12 @@ Printv(f->code, " return S_OK;\n", NIL); Printf(f->code, "}\n"); - if (!is_void_return) + /* Contract macro modification */ + Replaceall(f->code, "SWIG_contract_assert(", "SWIG_contract_assert($null, "); + + if (hresult_flag) + Replaceall(f->code, "$null", "E_ABORT"); + else if (!is_void_return) Replaceall(f->code, "$null", "0"); else Replaceall(f->code, "$null", ""); @@ -1610,7 +1615,12 @@ if (Getattr(n, "has_destructor")) { Printf(proxy_class_vtable_code, "void SWIG_delete_%s(%s *arg) {\n" - " delete arg;\n}\n\n", proxy_class_name, Getattr(n, "classtype")); + "#ifdef __cplusplus\n" + " delete arg;\n" + "#else\n" + " free(arg);\n" + "#endif\n" + "}\n\n", proxy_class_name, Getattr(n, "classtype")); } Printf(proxy_class_vtable_code, "void * SWIGSTDCALL SWIG_wrap%s(void *arg, int cMemOwn) {\n" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-08-05 20:14:56
|
Revision: 10735 http://swig.svn.sourceforge.net/swig/?rev=10735&view=rev Author: jezabek Date: 2008-08-05 20:14:48 +0000 (Tue, 05 Aug 2008) Log Message: ----------- Support for argout typemaps (taken from Java module). Added typemaps.i with INPUT, OUTPUT and INOUT typemaps for primitive types. Modified Paths: -------------- branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Lib/com/std_string.i branches/gsoc2008-jezabek/Source/Modules/com.cxx Added Paths: ----------- branches/gsoc2008-jezabek/Lib/com/typemaps.i Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-04 17:53:24 UTC (rev 10734) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-05 20:14:48 UTC (rev 10735) @@ -82,6 +82,7 @@ const long & ($*1_ltype temp), const unsigned long & ($*1_ltype temp), const long long & ($*1_ltype temp), + const unsigned long long & ($*1_ltype temp), const float & ($*1_ltype temp), const double & ($*1_ltype temp) %{ temp = ($*1_ltype)$input; @@ -181,6 +182,7 @@ const long &, const unsigned long &, const long long &, + const unsigned long long &, const float &, const double & %{ $result = *$1; %} Modified: branches/gsoc2008-jezabek/Lib/com/std_string.i =================================================================== --- branches/gsoc2008-jezabek/Lib/com/std_string.i 2008-08-04 17:53:24 UTC (rev 10734) +++ branches/gsoc2008-jezabek/Lib/com/std_string.i 2008-08-05 20:14:48 UTC (rev 10735) @@ -1,3 +1,12 @@ +/* ----------------------------------------------------------------------------- + * See the LICENSE file for information on copyright, usage and redistribution + * of SWIG, and the README file for authors - http://www.swig.org/release.html. + * + * std_string.swg + * + * COM typemaps for std::string and const std::string& + * ----------------------------------------------------------------------------- */ + %{ #include <string> %} Added: branches/gsoc2008-jezabek/Lib/com/typemaps.i =================================================================== --- branches/gsoc2008-jezabek/Lib/com/typemaps.i (rev 0) +++ branches/gsoc2008-jezabek/Lib/com/typemaps.i 2008-08-05 20:14:48 UTC (rev 10735) @@ -0,0 +1,241 @@ +/* ----------------------------------------------------------------------------- + * See the LICENSE file for information on copyright, usage and redistribution + * of SWIG, and the README file for authors - http://www.swig.org/release.html. + * + * typemaps.swg + * + * COM typemaps for input/output arguments + * ----------------------------------------------------------------------------- */ + +/* INPUT typemaps */ + +%typemap(ctype) bool *INPUT, bool &INPUT "unsigned int *" +%typemap(ctype) signed char *INPUT, signed char &INPUT "signed char *" +%typemap(ctype) unsigned char *INPUT, unsigned char &INPUT "unsigned char *" +%typemap(ctype) short *INPUT, short &INPUT "short *" +%typemap(ctype) unsigned short *INPUT, unsigned short &INPUT "unsigned short *" +%typemap(ctype) int *INPUT, int &INPUT "int *" +%typemap(ctype) unsigned int *INPUT, unsigned int &INPUT "unsigned int *" +%typemap(ctype) long *INPUT, long &INPUT "long *" +%typemap(ctype) unsigned long *INPUT, unsigned long &INPUT "unsigned long *" +%typemap(ctype) long long *INPUT, long long &INPUT "long long *" +%typemap(ctype) unsigned long long *INPUT, unsigned long long &INPUT "unsigned long long *" +%typemap(ctype) float *INPUT, float &INPUT "float *" +%typemap(ctype) double *INPUT, double &INPUT "double *" + +%typemap(comtype, attribute="in") bool *INPUT, bool &INPUT "unsigned int *" +%typemap(comtype, attribute="in") signed char *INPUT, signed char &INPUT "signed char *" +%typemap(comtype, attribute="in") unsigned char *INPUT, unsigned char &INPUT "unsigned char *" +%typemap(comtype, attribute="in") short *INPUT, short &INPUT "short *" +%typemap(comtype, attribute="in") unsigned short *INPUT, unsigned short &INPUT "unsigned short *" +%typemap(comtype, attribute="in") int *INPUT, int &INPUT "int *" +%typemap(comtype, attribute="in") unsigned int *INPUT, unsigned int &INPUT "unsigned int *" +%typemap(comtype, attribute="in") long *INPUT, long &INPUT "long *" +%typemap(comtype, attribute="in") unsigned long *INPUT, unsigned long &INPUT "unsigned long *" +%typemap(comtype, attribute="in") long long *INPUT, long long &INPUT "hyper *" +%typemap(comtype, attribute="in") unsigned long long *INPUT, unsigned long long &INPUT "unsigned hyper *" +%typemap(comtype, attribute="in") float *INPUT, float &INPUT "float *" +%typemap(comtype, attribute="in") double *INPUT, double &INPUT "double *" + +%typemap(in) bool *INPUT ($*1_ltype temp), bool &INPUT ($*1_ltype temp) +%{ temp = *$input ? true : false; + $1 = &temp; %} + +%typemap(in) signed char *INPUT, signed char &INPUT, + unsigned char *INPUT, unsigned char &INPUT, + short *INPUT, short &INPUT, + unsigned short *INPUT, unsigned short &INPUT, + int *INPUT, int &INPUT, + unsigned int *INPUT, unsigned int &INPUT, + long *INPUT, long &INPUT, + unsigned long *INPUT, unsigned long &INPUT, + long long *INPUT, long long &INPUT, + unsigned long long *INPUT, unsigned long long &INPUT, + float *INPUT, float &INPUT, + double *INPUT, double &INPUT +%{ $1 = ($1_ltype)&$input; %} + +%typemap(freearg) bool *INPUT, bool &INPUT, + signed char *INPUT, signed char &INPUT, + unsigned char *INPUT, unsigned char &INPUT, + short *INPUT, short &INPUT, + unsigned short *INPUT, unsigned short &INPUT, + int *INPUT, int &INPUT, + unsigned int *INPUT, unsigned int &INPUT, + long *INPUT, long &INPUT, + unsigned long *INPUT, unsigned long &INPUT, + long long *INPUT, long long &INPUT, + unsigned long long *INPUT, unsigned long long &INPUT, + float *INPUT, float &INPUT, + double *INPUT, double &INPUT "" + +%typemap(argout) bool *INPUT, bool &INPUT, + signed char *INPUT, signed char &INPUT, + unsigned char *INPUT, unsigned char &INPUT, + short *INPUT, short &INPUT, + unsigned short *INPUT, unsigned short &INPUT, + int *INPUT, int &INPUT, + unsigned int *INPUT, unsigned int &INPUT, + long *INPUT, long &INPUT, + unsigned long *INPUT, unsigned long &INPUT, + long long *INPUT, long long &INPUT, + unsigned long long *INPUT, unsigned long long &INPUT, + float *INPUT, float &INPUT, + double *INPUT, double &INPUT "" + +/* OUTPUT typemaps */ + +%typemap(ctype) bool *OUTPUT, bool &OUTPUT "unsigned int *" +%typemap(ctype) signed char *OUTPUT, signed char &OUTPUT "signed char *" +%typemap(ctype) unsigned char *OUTPUT, unsigned char &OUTPUT "unsigned char *" +%typemap(ctype) short *OUTPUT, short &OUTPUT "short *" +%typemap(ctype) unsigned short *OUTPUT, unsigned short &OUTPUT "unsigned short *" +%typemap(ctype) int *OUTPUT, int &OUTPUT "int *" +%typemap(ctype) unsigned int *OUTPUT, unsigned int &OUTPUT "unsigned int *" +%typemap(ctype) long *OUTPUT, long &OUTPUT "long *" +%typemap(ctype) unsigned long *OUTPUT, unsigned long &OUTPUT "unsigned long *" +%typemap(ctype) long long *OUTPUT, long long &OUTPUT "long long *" +%typemap(ctype) unsigned long long *OUTPUT, unsigned long long &OUTPUT "unsigned long long *" +%typemap(ctype) float *OUTPUT, float &OUTPUT "float *" +%typemap(ctype) double *OUTPUT, double &OUTPUT "double *" + +%typemap(comtype, attribute="out") bool *OUTPUT, bool &OUTPUT "unsigned int *" +%typemap(comtype, attribute="out") signed char *OUTPUT, signed char &OUTPUT "signed char *" +%typemap(comtype, attribute="out") unsigned char *OUTPUT, unsigned char &OUTPUT "unsigned char *" +%typemap(comtype, attribute="out") short *OUTPUT, short &OUTPUT "short *" +%typemap(comtype, attribute="out") unsigned short *OUTPUT, unsigned short &OUTPUT "unsigned short *" +%typemap(comtype, attribute="out") int *OUTPUT, int &OUTPUT "int *" +%typemap(comtype, attribute="out") unsigned int *OUTPUT, unsigned int &OUTPUT "unsigned int *" +%typemap(comtype, attribute="out") long *OUTPUT, long &OUTPUT "long *" +%typemap(comtype, attribute="out") unsigned long *OUTPUT, unsigned long &OUTPUT "unsigned long *" +%typemap(comtype, attribute="out") long long *OUTPUT, long long &OUTPUT "hyper *" +%typemap(comtype, attribute="out") unsigned long long *OUTPUT, unsigned long long &OUTPUT "unsigned hyper *" +%typemap(comtype, attribute="out") float *OUTPUT, float &OUTPUT "float *" +%typemap(comtype, attribute="out") double *OUTPUT, double &OUTPUT "double *" + +%typemap(in) bool *OUTPUT ($*1_ltype temp), bool &OUTPUT ($*1_ltype temp) +%{ temp = *$input ? true : false; + $1 = &temp; %} + +%typemap(in) signed char *OUTPUT, signed char &OUTPUT, + unsigned char *OUTPUT, unsigned char &OUTPUT, + short *OUTPUT, short &OUTPUT, + unsigned short *OUTPUT, unsigned short &OUTPUT, + int *OUTPUT, int &OUTPUT, + unsigned int *OUTPUT, unsigned int &OUTPUT, + long *OUTPUT, long &OUTPUT, + unsigned long *OUTPUT, unsigned long &OUTPUT, + long long *OUTPUT, long long &OUTPUT, + unsigned long long *OUTPUT, unsigned long long &OUTPUT, + float *OUTPUT, float &OUTPUT, + double *OUTPUT, double &OUTPUT +%{ $1 = ($1_ltype)&$input; %} + +%typemap(freearg) bool *OUTPUT, bool &OUTPUT, + signed char *OUTPUT, signed char &OUTPUT, + unsigned char *OUTPUT, unsigned char &OUTPUT, + short *OUTPUT, short &OUTPUT, + unsigned short *OUTPUT, unsigned short &OUTPUT, + int *OUTPUT, int &OUTPUT, + unsigned int *OUTPUT, unsigned int &OUTPUT, + long *OUTPUT, long &OUTPUT, + unsigned long *OUTPUT, unsigned long &OUTPUT, + long long *OUTPUT, long long &OUTPUT, + unsigned long long *OUTPUT, unsigned long long &OUTPUT, + float *OUTPUT, float &OUTPUT, + double *OUTPUT, double &OUTPUT "" + +%typemap(argout) bool *OUTPUT, bool &OUTPUT +%{ *$input = temp$argnum ? 1 : 0; %} + +%typemap(argout) signed char *OUTPUT, signed char &OUTPUT, + unsigned char *OUTPUT, unsigned char &OUTPUT, + short *OUTPUT, short &OUTPUT, + unsigned short *OUTPUT, unsigned short &OUTPUT, + int *OUTPUT, int &OUTPUT, + unsigned int *OUTPUT, unsigned int &OUTPUT, + long *OUTPUT, long &OUTPUT, + unsigned long *OUTPUT, unsigned long &OUTPUT, + long long *OUTPUT, long long &OUTPUT, + unsigned long long *OUTPUT, unsigned long long &OUTPUT, + float *OUTPUT, float &OUTPUT, + double *OUTPUT, double &OUTPUT "" + +/* INOUT typemaps */ + +%typemap(ctype) bool *INOUT, bool &INOUT "unsigned int *" +%typemap(ctype) signed char *INOUT, signed char &INOUT "signed char *" +%typemap(ctype) unsigned char *INOUT, unsigned char &INOUT "unsigned char *" +%typemap(ctype) short *INOUT, short &INOUT "short *" +%typemap(ctype) unsigned short *INOUT, unsigned short &INOUT "unsigned short *" +%typemap(ctype) int *INOUT, int &INOUT "int *" +%typemap(ctype) unsigned int *INOUT, unsigned int &INOUT "unsigned int *" +%typemap(ctype) long *INOUT, long &INOUT "long *" +%typemap(ctype) unsigned long *INOUT, unsigned long &INOUT "unsigned long *" +%typemap(ctype) long long *INOUT, long long &INOUT "long long *" +%typemap(ctype) unsigned long long *INOUT, unsigned long long &INOUT "unsigned long long *" +%typemap(ctype) float *INOUT, float &INOUT "float *" +%typemap(ctype) double *INOUT, double &INOUT "double *" + +%typemap(comtype, attribute="in, out") bool *INOUT, bool &INOUT "unsigned int *" +%typemap(comtype, attribute="in, out") signed char *INOUT, signed char &INOUT "signed char *" +%typemap(comtype, attribute="in, out") unsigned char *INOUT, unsigned char &INOUT "unsigned char *" +%typemap(comtype, attribute="in, out") short *INOUT, short &INOUT "short *" +%typemap(comtype, attribute="in, out") unsigned short *INOUT, unsigned short &INOUT "unsigned short *" +%typemap(comtype, attribute="in, out") int *INOUT, int &INOUT "int *" +%typemap(comtype, attribute="in, out") unsigned int *INOUT, unsigned int &INOUT "unsigned int *" +%typemap(comtype, attribute="in, out") long *INOUT, long &INOUT "long *" +%typemap(comtype, attribute="in, out") unsigned long *INOUT, unsigned long &INOUT "unsigned long *" +%typemap(comtype, attribute="in, out") long long *INOUT, long long &INOUT "hyper *" +%typemap(comtype, attribute="in, out") unsigned long long *INOUT, unsigned long long &INOUT "unsigned hyper *" +%typemap(comtype, attribute="in, out") float *INOUT, float &INOUT "float *" +%typemap(comtype, attribute="in, out") double *INOUT, double &INOUT "double *" + +%typemap(in) bool *INOUT ($*1_ltype temp), bool &INOUT ($*1_ltype temp) +%{ temp = *$input ? true : false; + $1 = &temp; %} + +%typemap(in) signed char *INOUT, signed char &INOUT, + unsigned char *INOUT, unsigned char &INOUT, + short *INOUT, short &INOUT, + unsigned short *INOUT, unsigned short &INOUT, + int *INOUT, int &INOUT, + unsigned int *INOUT, unsigned int &INOUT, + long *INOUT, long &INOUT, + unsigned long *INOUT, unsigned long &INOUT, + long long *INOUT, long long &INOUT, + unsigned long long *INOUT, unsigned long long &INOUT, + float *INOUT, float &INOUT, + double *INOUT, double &INOUT +%{ $1 = ($1_ltype)&$input; %} + +%typemap(freearg) bool *INOUT, bool &INOUT, + signed char *INOUT, signed char &INOUT, + unsigned char *INOUT, unsigned char &INOUT, + short *INOUT, short &INOUT, + unsigned short *INOUT, unsigned short &INOUT, + int *INOUT, int &INOUT, + unsigned int *INOUT, unsigned int &INOUT, + long *INOUT, long &INOUT, + unsigned long *INOUT, unsigned long &INOUT, + long long *INOUT, long long &INOUT, + unsigned long long *INOUT, unsigned long long &INOUT, + float *INOUT, float &INOUT, + double *INOUT, double &INOUT "" + +%typemap(argout) bool *INOUT, bool &INOUT +%{ *$input = temp$argnum ? 1 : 0; %} + +%typemap(argout) signed char *INOUT, signed char &INOUT, + unsigned char *INOUT, unsigned char &INOUT, + short *INOUT, short &INOUT, + unsigned short *INOUT, unsigned short &INOUT, + int *INOUT, int &INOUT, + unsigned int *INOUT, unsigned int &INOUT, + long *INOUT, long &INOUT, + unsigned long *INOUT, unsigned long &INOUT, + long long *INOUT, long long &INOUT, + unsigned long long *INOUT, unsigned long long &INOUT, + float *INOUT, float &INOUT, + double *INOUT, double &INOUT "" + Modified: branches/gsoc2008-jezabek/Source/Modules/com.cxx =================================================================== --- branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-04 17:53:24 UTC (rev 10734) +++ branches/gsoc2008-jezabek/Source/Modules/com.cxx 2008-08-05 20:14:48 UTC (rev 10735) @@ -644,6 +644,7 @@ int i; String *c_return_type = NewString(""); String *cleanup = NewString(""); + String *outarg = NewString(""); bool is_void_return; int num_arguments = 0; int num_required = 0; @@ -732,7 +733,6 @@ // Get typemap for this argument if ((tm = Getattr(p, "tmap:in"))) { - // FIXME: canThrow(n, "in", p); Replaceall(tm, "$source", arg); /* deprecated */ Replaceall(tm, "$target", ln); /* deprecated */ Replaceall(tm, "$arg", arg); /* deprecated? */ @@ -813,6 +813,24 @@ } } + /* Insert argument output code */ + for (p = l; p;) { + if ((tm = Getattr(p, "tmap:argout"))) { + Replaceall(tm, "$source", Getattr(p, "emit:input")); /* deprecated */ + Replaceall(tm, "$target", Getattr(p, "lname")); /* deprecated */ + Replaceall(tm, "$arg", Getattr(p, "emit:input")); /* deprecated? */ + Replaceall(tm, "$result", "jresult"); + Replaceall(tm, "$input", Getattr(p, "emit:input")); + Printv(outarg, tm, "\n", NIL); + p = Getattr(p, "tmap:argout:next"); + } else { + p = nextSibling(p); + } + } + + /* Output argument output code */ + Printv(f->code, outarg, NIL); + /* Output cleanup code */ Printv(f->code, cleanup, NIL); @@ -869,6 +887,7 @@ } Delete(cleanup); + Delete(outarg); return SWIG_OK; } @@ -1085,6 +1104,12 @@ /* Get the COM parameter type */ if ((tm = Getattr(p, "tmap:comtype"))) { + /* Check if we should set any special attributes */ + String *tm_attr; + if (tm_attr = Getattr(p, "tmap:comptype:attribute")) { + Printf(param_type, "[ %s ] ", tm_attr); + } + substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { @@ -1758,7 +1783,6 @@ /* Attach the non-standard typemaps to the parameter list */ Swig_typemap_attach_parms("in", l, NULL); Swig_typemap_attach_parms("comtype", l, NULL); - // FIXME: Swig_typemap_attach_parms("javain", l, NULL); /* Get return types */ if ((tm = Swig_typemap_lookup("comtype", n, "", 0))) { @@ -1821,6 +1845,12 @@ /* Get the COM parameter type */ if ((tm = Getattr(p, "tmap:comtype"))) { + /* Check if we should set any special attributes */ + String *tm_attr; + if (tm_attr = Getattr(p, "tmap:comtype:attribute")) { + Printf(param_type, "[ %s ] ", tm_attr); + } + substituteClassname(pt, tm); Printf(param_type, "%s", tm); } else { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <je...@us...> - 2008-08-06 17:47:07
|
Revision: 10736 http://swig.svn.sourceforge.net/swig/?rev=10736&view=rev Author: jezabek Date: 2008-08-06 17:46:59 +0000 (Wed, 06 Aug 2008) Log Message: ----------- Added various std typemaps: std_vector, std_map, std_pair (all taken from Java with minor tweaks to handle overloading), std_deque (using std/_std_deque.i), std_wstring. Added support for wide strings (wchar_t). Added stdio.h to operator_overload testcase. Modified Paths: -------------- branches/gsoc2008-jezabek/Examples/test-suite/operator_overload.i branches/gsoc2008-jezabek/Lib/com/com.swg branches/gsoc2008-jezabek/Lib/exception.i Added Paths: ----------- branches/gsoc2008-jezabek/Lib/com/std_common.i branches/gsoc2008-jezabek/Lib/com/std_deque.i branches/gsoc2008-jezabek/Lib/com/std_except.i branches/gsoc2008-jezabek/Lib/com/std_map.i branches/gsoc2008-jezabek/Lib/com/std_pair.i branches/gsoc2008-jezabek/Lib/com/std_vector.i branches/gsoc2008-jezabek/Lib/com/std_wstring.i Modified: branches/gsoc2008-jezabek/Examples/test-suite/operator_overload.i =================================================================== --- branches/gsoc2008-jezabek/Examples/test-suite/operator_overload.i 2008-08-05 20:14:48 UTC (rev 10735) +++ branches/gsoc2008-jezabek/Examples/test-suite/operator_overload.i 2008-08-06 17:46:59 UTC (rev 10736) @@ -81,6 +81,7 @@ #endif #include <assert.h> +#include <stdio.h> class Op { public: Modified: branches/gsoc2008-jezabek/Lib/com/com.swg =================================================================== --- branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-05 20:14:48 UTC (rev 10735) +++ branches/gsoc2008-jezabek/Lib/com/com.swg 2008-08-06 17:46:59 UTC (rev 10736) @@ -217,6 +217,34 @@ } %} +%typemap(ctype) wchar_t *, wchar_t[], wchar_t[ANY] "WCHAR *" +%typemap(comtype) wchar_t *, wchar_t[], wchar_t[ANY] "BSTR" + +%typemap(in) wchar_t *, wchar_t[], wchar_t[ANY] { + if ($input) { + int SWIG_len = wcslen($input) + 1; + $1 = ($1_ltype) malloc(SWIG_len * sizeof(wchar_t)); + wcsncpy($1, $input, SWIG_len); + } +} + +%typemap(freearg) wchar_t *, wchar_t[], wchar_t[ANY] { + if ($input) { + free($1); + } +} + +%typemap(out) wchar_t *, wchar_t[], wchar_t[ANY] %{ + if ($1) { + int SWIG_len = wcslen((wchar_t *) $1) + 1; + WCHAR *SWIG_res = (WCHAR *) CoTaskMemAlloc((SWIG_len + 2) * sizeof(WCHAR)); + /* First 4 bytes contain length in bytes */ + *((unsigned int *) SWIG_res) = (unsigned int) (SWIG_len - 1) * sizeof(WCHAR); + wcsncpy(SWIG_res + 2, $1, SWIG_len); + $result = SWIG_res + 2; + } +%} + %typemap(out) SWIGTYPE *, SWIGTYPE (CLASS::*) %{ $result = (SWIGIUnknown *) SWIG_wrap$comclassname(*(void **) &$1, $owner); %} @@ -260,6 +288,8 @@ return $null; %} +%apply unsigned long { size_t }; +%apply const unsigned long & { const size_t & }; %insert("runtime") %{ Added: branches/gsoc2008-jezabek/Lib/com/std_common.i =================================================================== --- branches/gsoc2008-jezabek/Lib/com/std_common.i (rev 0) +++ branches/gsoc2008-jezabek/Lib/com/std_common.i 2008-08-06 17:46:59 UTC (rev 10736) @@ -0,0 +1,5 @@ +%include <std_except.i> + +%apply size_t { std::size_t }; +%apply const size_t& { const std::size_t& }; + Added: branches/gsoc2008-jezabek/Lib/com/std_deque.i =================================================================== --- branches/gsoc2008-jezabek/Lib/com/std_deque.i (rev 0) +++ branches/gsoc2008-jezabek/Lib/com/std_deque.i 2008-08-06 17:46:59 UTC (rev 10736) @@ -0,0 +1,5 @@ +%rename(dequeWithSizeAndVal) std::deque::deque(unsigned int size, const T& value); +%rename(dequeWithSize) std::deque::deque(unsigned int size); +%rename(resizeWithVal) std::deque::resize(unsigned int size, T value); + +%include <std/_std_deque.i> Added: branches/gsoc2008-jezabek/Lib/com/std_except.i =================================================================== --- branches/gsoc2008-jezabek/Lib/com/std_except.i (rev 0) +++ branches/gsoc2008-jezabek/Lib/com/std_except.i 2008-08-06 17:46:59 UTC (rev 10736) @@ -0,0 +1,22 @@ +/* ----------------------------------------------------------------------------- + * See the LICENSE file for information on copyright, usage and redistribution + * of SWIG, and the README file for authors - http://www.swig.org/release.html. + * + * std_except.i + * + * Typemaps used by the STL wrappers that throw exceptions. + * These typemaps are used when methods are declared with an STL exception specification, such as + * size_t at() const throw (std::out_of_range); + * ----------------------------------------------------------------------------- */ + +%{ +#include <stdexcept> +%} + +namespace std +{ + %ignore exception; + struct exception {}; +} + +/* For now there are no special wrappers apart from the defaults */ Added: branches/gsoc2008-jezabek/Lib/com/std_map.i =================================================================== --- branches/gsoc2008-jezabek/Lib/com/std_map.i (rev 0) +++ branches/gsoc2008-jezabek/Lib/com/std_map.i 2008-08-06 17:46:59 UTC (rev 10736) @@ -0,0 +1,179 @@ +/* ----------------------------------------------------------------------------- + * See the LICENSE file for information on copyright, usage and redistribution + * of SWIG, and the README file for authors - http://www.swig.org/release.html. + * + * std_map.i + * + * SWIG typemaps for std::map + * ----------------------------------------------------------------------------- */ + +%include <std_common.i> + +// ------------------------------------------------------------------------ +// std::map +// ------------------------------------------------------------------------ + +%{ +#include <map> +#include <algorithm> +#include <stdexcept> +%} + +// exported class + +namespace std { + + template<class K, class T> class map { + // add typemaps here + public: + typedef size_t size_type; + typedef ptrdiff_t difference_type; + typedef K key_type; + typedef T mapped_type; + map(); + map(const map<K,T> &); + + unsigned int size() const; + bool empty() const; + void clear(); + %extend { + const T& get(const K& key) throw (std::out_of_range) { + std::map<K,T >::iterator i = self->find(key); + if (i != self->end()) + return i->second; + else + throw std::out_of_range("key not found"); + } + void set(const K& key, const T& x) { + (*self)[key] = x; + } + void del(const K& key) throw (std::out_of_range) { + std::map<K,T >::iterator i = self->find(key); + if (i != self->end()) + self->erase(i); + else + throw std::out_of_range("key not found"); + } + bool has_key(const K& key) { + std::map<K,T >::iterator i = self->find(key); + return i != self->end(); + } + } + }; + + + // specializations for built-ins + + %define specialize_std_map_on_key(K,CHECK,CONVERT_FROM,CONVERT_TO) + + template<class T> class map<K,T> { + // add typemaps here + public: + map(); + map(const map<K,T> &); + + unsigned int size() const; + bool empty() const; + void clear(); + %extend { + T& get(K key) throw (std::out_of_range) { + std::map<K,T >::iterator i = self->find(key); + if (i != self->end()) + return i->second; + else + throw std::out_of_range("key not found"); + } + void set(K key, const T& x) { + (*self)[key] = x; + } + void del(K key) throw (std::out_of_range) { + std::map<K,T >::iterator i = self->find(key); + if (i != self->end()) + self->erase(i); + else + throw std::out_of_range("key not found"); + } + bool has_key(K key) { + std::map<K,T >::iterator i = self->find(key); + return i != self->end(); + } + } + }; + %enddef + + %define specialize_std_map_on_value(T,CHECK,CONVERT_FROM,CONVERT_TO) + template<class K> class map<K,T> { + // add typemaps here + public: + map(); + map(const map<K,T> &); + + unsigned int size() const; + bool empty() const; + void clear(); + %extend { + T get(const K& key) throw (std::out_of_range) { + std::map<K,T >::iterator i = self->find(key); + if (i != self->end()) + return i->second; + else + throw std::out_of_range("key not found"); + } + void set(const K& key, T x) { + (*self)[key] = x; + } + void del(const K& key) throw (std::out_of_range) { + std::map<K,T >::iterator i = self->find(key); + if (i != self->end()) + self->erase(i); + else + throw std::out_of_range("key not found"); + } + bool has_key(const K& key) { + std::map<K,T >::iterator i = self->find(key); + return i != self->end(); + } + } + }; + %enddef + + %define specialize_std_map_on_both(K,CHECK_K,CONVERT_K_FROM,CONVERT_K_TO, + T,CHECK_T,CONVERT_T_FROM,CONVERT_T_TO) + template<> class map<K,T> { + // add typemaps here + public: + map(); + map(const map<K,T> &); + + unsigned int size() const; + bool empty() const; + void clear(); + %extend { + T get(K key) throw (std::out_of_range) { + std::map<K,T >::iterator i = self->find(key); + if (i != self->end()) + return i->second; + else + throw std::out_of_range("key not found"); + } + void set(K key, T x) { + (*self)[key] = x; + } + void del(K key) throw (std::out_of_range) { + std::map<K,T >::iterator i = self->find(key); + if (i != self->end()) + self->erase(i); + else + throw std::out_of_range("key not found"); + } + bool has_key(K key) { + std::map<K,T >::iterator i = self->find(key); + return i != self->end(); + } + } + }; + %enddef + + // add specializations here + +} Added: branches/gsoc2008-jezabek/Lib/com/std_pair.i =================================================================== --- branches/gsoc2008-jezabek/Lib/com/std_pair.i (rev 0) +++ branches/gsoc2008-jezabek/Lib/com/std_pair.i 2008-08-06 17:46:59 UTC (rev 10736) @@ -0,0 +1,38 @@ +/* ----------------------------------------------------------------------------- + * See the LICENSE file for information on copyright, usage and redistribution + * of SWIG, and the README file for authors - http://www.swig.org/release.html. + * + * std_pair.i + * + * SWIG typemaps for std::pair + * ----------------------------------------------------------------------------- */ + +%include <std_common.i> +%include <exception.i> + +// ------------------------------------------------------------------------ +// std::pair +// ------------------------------------------------------------------------ + +%{ +#include <utility> +%} + +namespace std { + + template<class T, class U> struct pair { + + %rename(pairEmpty) pair(); + pair(); + pair(T first, U second); + pair(const pair& p); + + template <class U1, class U2> pair(const pair<U1, U2> &p); + + T first; + U second; + }; + + // add specializations here + +} Added: branches/gsoc2008-jezabek/Lib/com/std_vector.i =================================================================== --- branches/gsoc2008-jezabek/Lib/com/std_vector.i (rev 0) +++ branches/gsoc2008-jezabek/Lib/com/std_vector.i 2008-08-06 17:46:59 UTC (rev 10736) @@ -0,0 +1,55 @@ +/* ----------------------------------------------------------------------------- + * See the LICENSE file for information on copyright, usage and redistribution + * of SWIG, and the README file for authors - http://www.swig.org/release.html. + * + * std_vector.i + * ----------------------------------------------------------------------------- */ + +%include <std_common.i> + +%{ +#include <vector> +#include <stdexcept> +%} + +namespace std { + + template<class T> class vector { + public: + typedef size_t size_type; + typedef T value_type; + typedef const value_type& const_reference; + vector(); + %rename(vectorWithSize) vector(size_type); + vector(size_type n); + size_type size() const; + size_type capacity() const; + void reserve(size_type n); + %rename(isEmpty) empty; + bool empty() const; + void clear(); + %rename(add) push_back; + void push_back(const value_type& x); + %extend { + const_reference get(int i) throw (std::out_of_range) { + int size = int(self->size()); + if (i>=0 && i<size) + return (*self)[i]; + else + throw std::out_of_range("vector index out of range"); + } + void set(int i, const value_type& val) throw (std::out_of_range) { + int size = int(self->size()); + if (i>=0 && i<size) + (*self)[i] = val; + else + throw std::out_of_range("vector index out of range"); + } + } + }; +} + +%define specialize_std_vector(T) +#warning "specialize_std_vector - specialization for type T no longer needed" +%enddef + Added: branches/gsoc2008-jezabek/Lib/com/std_wstring.i =================================================================== --- branches/gsoc2008-jezabek/Lib/com/std_wstring.i (rev 0) +++ branches/gsoc2008-jezabek/Lib/com/std_wstring.i 2008-08-06 17:46:59 UTC (rev 10736) @@ -0,0 +1,40 @@ +/* ----------------------------------------------------------------------------- + * See the LICENSE file for information on copyright, usage and redistribution + * of SWIG, and the README file for authors - http://www.swig.org/release.html. + * + * std_wstring.swg + * + * COM typemaps for std::wstring and const std::wstring& + * ----------------------------------------------------------------------------- */ + +%{ +#include <string> +#include <wchar.h> +%} + +namespace std { + +%naturalvar wstring; +class wstring; + +%typemap(ctype) wstring "WCHAR *" +%typemap(comtype) wstring "BSTR" + +%typemap(in) wstring { + if ($input) { + $1.assign($input); + } +} + +%typemap(out) wstring %{ + { + int SWIG_len = $1.size() + 1; + WCHAR *SWIG_res = (WCHAR *) CoTaskMemAlloc((SWIG_len + 2) * sizeof(WCHAR)); + /* First 4 bytes contain length in bytes */ + *((unsigned int *) SWIG_res) = (unsigned int) (SWIG_len - 1) * sizeof(WCHAR); + wcsncpy(SWIG_res + 2, $1.c_str(), SWIG_len); + $result = SWIG_res + 2; + } +%} + +} Modified: branches/gsoc2008-jezabek/Lib/exception.i =================================================================== --- branches/gsoc2008-jezabek/Lib/exception.i 2008-08-05 20:14:48 UTC (rev 10735) +++ branches/gsoc2008-jezabek/Lib/exception.i 2008-08-06 17:46:59 UTC (rev 10736) @@ -212,6 +212,13 @@ #endif // SWIGLUA +#ifdef SWIGCOM + +#define SWIG_exception(code, msg)\ +{ return $null; } + +#endif // SWIGCOM + #ifdef __cplusplus /* You can use the SWIG_CATCH_STDEXCEPT macro with the %exception This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |