Hi Prezmek, Sorry to annoy you with thisbut I became crazy.
I was thinking I understanded how it work and tryed to implement a solution allowing the load and unload of hrb file without changing any structure. So the idea is the following ; 1) if hb_dynsymFind( pSymbol->szName ) find something,I first change the name of the actual symbol, replacing it with a string from the new function pointer, then simply adding the new pSymbol calling hb_dynsymNew( pSymbol ). The idea is that if we unload the HRB file, I could retrieve the original Symbol by doing an hb_dynsymNew( "NewName_fromptr" ) and then restoring the name to the actual name of the unloaded symbol. Doing so, it should work even in case of many hrb load and unload, despite the load/unload order. But I never reach to test load/unload as It simply does'nt work. So, in hb_vmRegisterSymbols(...), when the new function symbol name already exist (found by hb_dynsymNew()), I first change the name of the actual symbol, then add the new symbol. If I then check with hb_dynsymNew( ), it return me the new function symbol, with the good function pointer ... But, in any case, from the prg point of view, it always launch the function from the exe :-( Any idea ? PS : I also tried to simply replace the actual symbol with the new one with the same effect ... PS2 : Trying to just replace the function ptr do cause a GPF :-( .... if( fPublic ) { if( fDynLib && HB_VM_ISFUNC( pSymbol ) ) // ok trying to add dynamic function { PHB_DYNS pDynSym; pDynSym = hb_dynsymFind( pSymbol->szName ); if( pDynSym ) // ok symbol of that name already exist { if( pDynSym->pSymbol != pSymbol && HB_VM_ISFUNC( pDynSym->pSymbol ) ) // not same symbol pointer { if (pSymbol->value.pFunPtr == pDynSym->pSymbol->value.pFunPtr) // keep actual way if function pointer are the same { pSymbol->pDynSym = pDynSym; pSymbol->scope.value = ( pSymbol->scope.value & ~( HB_FS_PCODEFUNC | HB_FS_LOCAL ) ) | ( pDynSym->pSymbol->scope.value & HB_FS_PCODEFUNC ); pSymbol->value.pFunPtr = pDynSym->pSymbol->value.pFunPtr; } else { sprintf((char *) szTmp , (const char *) "~%p", pSymbol->value.pFunPtr) ; pDynSym->pSymbol->szName = szTmp ; // change the name to a string created from the new function pointer printf("Registring: %s:%s scope %04x\r\n", szModuleName, pSymbol->szName, hSymScope ); fflush(stdout); printf("Old funct renamed to %s \r\n", pDynSym->pSymbol->szName ); fflush(stdout); hb_dynsymNew( pSymbol ); // add new symbol ptr } } else { pSymbol->pDynSym = pDynSym; pDynSym->pSymbol = pSymbol; } continue; ... -----Message d'origine----- De : harbour-boun...@harbour-project.org [mailto:harbour-boun...@harbour-project.org] De la part de Przemyslaw Czerpak Envoyé : mardi 9 juin 2009 13:12 À : Harbour Project Main Developer List. Objet : Re: RE: [Harbour] HRB question ??? Possible bug ! On Tue, 09 Jun 2009, J. Lefebvre wrote: Hi, > I just have a look at runner.c as dynsym.c but I must admit ... > I do not see at this time where we actually skip loading symbol > already existing in exe... :-( > Could you just point me in the right direction ? The HRB symbol table is updated inside hb_vmRegisterSymbols() in hvm.c. Look for hb_dynsymFind(). best regards, Przemek _______________________________________________ Harbour mailing list Harbour@harbour-project.org http://lists.harbour-project.org/mailman/listinfo/harbour _______________________________________________ Harbour mailing list Harbour@harbour-project.org http://lists.harbour-project.org/mailman/listinfo/harbour