diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 427a4f742a..844f295f9d 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,25 @@ 2009-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org) */ +2009-02-21 08:44 UTC+0100 Viktor Szakats (harbour.01 syenar hu) + * source/vm/hvm.c + + Added hb_vmSetLinkedMain() function to replace direct + access to exported variable hb_vm_pszLinkedMain. + (it's not a public call and caller should always pass + a string literal). + * hb_vm_pszLinkedMain -> s_vm_pszLinkedMain and made static. + + * utils/hbmk2/hbmk2.prg + ! Not adding 'dllimport' for externs in C stub when + MSVC is used, to avoid compiler warning mentioned in + previous entry. + + * utils/hbmk2/hbmk2.prg + * bin/hb-func.sh + * Updated for above change. + + ; TODO: Convert GT defaulting to function call too. + 2009-02-21 08:15 UTC+0100 Viktor Szakats (harbour.01 syenar hu) * contrib/hbfimage/fi_wrp.c ! Added hack to trick around FreeImage.h header not to @@ -63,6 +82,7 @@ with this warning: "hbsc_2nwvzg.obj : warning LNK4217: locally defined symbol \ _hb_vm_pszLinkedMain imported in function __hb_hbmk_setdef_" + [FIXED] + Added code to only accept valid Harbour identified as -main= value. + Added first module detection. diff --git a/harbour/bin/hb-func.sh b/harbour/bin/hb-func.sh index 6625024983..20a8433dc9 100755 --- a/harbour/bin/hb-func.sh +++ b/harbour/bin/hb-func.sh @@ -644,14 +644,14 @@ hb_lnk_request() echo "#include \\"hbinit.h\\"" echo "HB_EXTERN_BEGIN" echo "extern \${HB_LNK_ATTR} const char * hb_gt_szNameDefault;" - echo "extern \${HB_LNK_ATTR} const char * hb_vm_pszLinkedMain;" + echo "extern \${HB_LNK_ATTR} void hb_vmSetLinkedMain( const char * szMain );" echo "HB_EXTERN_END" echo "HB_CALL_ON_STARTUP_BEGIN( hb_lnk_SetDefault_build )" if [ -n "\$gt" ]; then echo " hb_gt_szNameDefault = \\"\$gt\\";" fi if [ -n "\${HB_MAIN_FUNC}" ]; then - echo " hb_vm_pszLinkedMain = \\"\${HB_MAIN_FUNC}\\";" + echo " hb_vmSetLinkedMain( \\"\${HB_MAIN_FUNC}\\" );" fi echo "HB_CALL_ON_STARTUP_END( hb_lnk_SetDefault_build )" fi diff --git a/harbour/source/vm/hvm.c b/harbour/source/vm/hvm.c index 3140a3dae3..d803fc6fdc 100644 --- a/harbour/source/vm/hvm.c +++ b/harbour/source/vm/hvm.c @@ -250,7 +250,7 @@ static BOOL hb_bTracePrgCalls = FALSE; /* prg tracing is off */ # define HB_TRACE_PRG( _TRMSG_ ) #endif -const char * hb_vm_pszLinkedMain = NULL; /* name of startup function set by linker */ +static const char * s_vm_pszLinkedMain = NULL; /* name of startup function set by linker */ /* virtual machine state */ @@ -952,14 +952,14 @@ void hb_vmInit( BOOL bStartMainProc ) in other case it's the name of first public function in first linked moudule which is used if there is no HB_START_PROCEDURE in code */ - if( hb_vm_pszLinkedMain && *hb_vm_pszLinkedMain == '@' ) - pDynSym = hb_dynsymFind( hb_vm_pszLinkedMain + 1 ); + if( s_vm_pszLinkedMain && *s_vm_pszLinkedMain == '@' ) + pDynSym = hb_dynsymFind( s_vm_pszLinkedMain + 1 ); else { pDynSym = hb_dynsymFind( HB_START_PROCEDURE ); - if( ! ( pDynSym && pDynSym->pSymbol->value.pFunPtr ) && hb_vm_pszLinkedMain ) - pDynSym = hb_dynsymFind( hb_vm_pszLinkedMain ); + if( ! ( pDynSym && pDynSym->pSymbol->value.pFunPtr ) && s_vm_pszLinkedMain ) + pDynSym = hb_dynsymFind( s_vm_pszLinkedMain ); } if( pDynSym && pDynSym->pSymbol->value.pFunPtr ) @@ -968,9 +968,9 @@ void hb_vmInit( BOOL bStartMainProc ) hb_errInternal( HB_EI_VMBADSTARTUP, NULL, HB_START_PROCEDURE, NULL ); } #else - else if( hb_vm_pszLinkedMain ) + else if( s_vm_pszLinkedMain ) { - pDynSym = hb_dynsymFind( hb_vm_pszLinkedMain + ( *hb_vm_pszLinkedMain == '@' ? 1 : 0 ) ); + pDynSym = hb_dynsymFind( s_vm_pszLinkedMain + ( *s_vm_pszLinkedMain == '@' ? 1 : 0 ) ); if( pDynSym && pDynSym->pSymbol->value.pFunPtr ) s_pSymStart = pDynSym->pSymbol; } @@ -11054,6 +11054,12 @@ void hb_vmForceLink( void ) HB_FUNC_EXEC( SYSINIT ); } +/* NOTE: Pass string literals only. */ +void hb_vmSetLinkedMain( const char * szMain ) +{ + s_vm_pszLinkedMain = szMain; +} + /* Force linking default language and codepage modules */ HB_CODEPAGE_REQUEST( HB_CODEPAGE_DEFAULT ) HB_LANG_REQUEST( HB_LANG_DEFAULT ) diff --git a/harbour/utils/hbmk2/hbmk2.prg b/harbour/utils/hbmk2/hbmk2.prg index 7f9a065cb9..eb04b68b59 100644 --- a/harbour/utils/hbmk2/hbmk2.prg +++ b/harbour/utils/hbmk2/hbmk2.prg @@ -1305,14 +1305,18 @@ FUNCTION Main( ... ) s_cMAIN := tmp ENDIF - /* HACK: Override entry point requested by user or detected by us. */ + /* HACK: Override entry point requested by user or detected by us, + and override the GT if requested by user. */ IF s_cMAIN != NIL fhnd := hb_FTempCreateEx( @s_cCSTUB, ".", "hbsc_", ".c" ) IF fhnd != F_ERROR /* NOTE: This has to be kept synced with Harbour HB_IMPORT values. */ DO CASE - CASE !( t_cARCH == "win" ) .OR. t_cCOMP == "rsxnt" + CASE !( t_cARCH == "win" ) .OR. t_cCOMP $ "msvc|rsxnt" + /* NOTE: MSVC gives the warning: + "LNK4217: locally defined symbol ... imported in function ..." + if using 'dllimport'. [vszakats] */ tmp := "" CASE t_cCOMP $ "gcc|mingw" ; tmp := "__attribute__ (( dllimport ))" CASE t_cCOMP == "bcc32|owatcom" ; tmp := "__declspec( dllimport )" @@ -1324,11 +1328,11 @@ FUNCTION Main( ... ) '#include "hbinit.h"' + hb_osNewLine() +; '' + hb_osNewLine() +; 'HB_EXTERN_BEGIN' + hb_osNewLine() +; - 'extern ' + tmp + ' const char * hb_vm_pszLinkedMain;' + hb_osNewLine() +; + 'extern ' + tmp + ' void hb_vmSetLinkedMain( const char * szMain );' + hb_osNewLine() +; 'HB_EXTERN_END' + hb_osNewLine() +; '' + hb_osNewLine() +; 'HB_CALL_ON_STARTUP_BEGIN( _hb_hbmk_setdef_ )' + hb_osNewLine() +; - ' hb_vm_pszLinkedMain = "' + Upper( s_cMAIN ) + '";' + hb_osNewLine() +; + ' hb_vmSetLinkedMain( "' + Upper( s_cMAIN ) + '" );' + hb_osNewLine() +; 'HB_CALL_ON_STARTUP_END( _hb_hbmk_setdef_ )' + hb_osNewLine() +; '' + hb_osNewLine() +; '#if defined( HB_PRAGMA_STARTUP )' + hb_osNewLine() +; @@ -1342,8 +1346,8 @@ FUNCTION Main( ... ) ' #pragma data_seg()' + hb_osNewLine() +; '#endif' + hb_osNewLine() ) - /* 'extern ' + tmp + ' const char * hb_gt_szNameDefault;' + hb_osNewLine() +; */ - /* ' hb_gt_szNameDefault = "$gt";' + hb_osNewLine() +; */ + /* 'extern ' + tmp + ' void hb_gtSetDefault( const char * szGtName );' + hb_osNewLine() +; */ + /* ' hb_gtSetDefault( "$gt" );' + hb_osNewLine() +; */ FClose( fhnd ) ELSE OutErr( "hbmk: Warning: Stub helper .c program couldn't be created." + hb_osNewLine() )