diff options
Diffstat (limited to 'unix/tclLoadNext.c')
| -rw-r--r-- | unix/tclLoadNext.c | 49 | 
1 files changed, 33 insertions, 16 deletions
| diff --git a/unix/tclLoadNext.c b/unix/tclLoadNext.c index 4168ebb..eb0affa 100644 --- a/unix/tclLoadNext.c +++ b/unix/tclLoadNext.c @@ -6,15 +6,19 @@   *   * Copyright (c) 1995-1997 Sun Microsystems, Inc.   * - * See the file "license.terms" for information on usage and redistribution of - * this file, and for a DISCLAIMER OF ALL WARRANTIES. - * - * RCS: @(#) $Id: tclLoadNext.c,v 1.14 2008/04/27 22:21:34 dkf Exp $ + * See the file "license.terms" for information on usage and redistribution + * of this file, and for a DISCLAIMER OF ALL WARRANTIES.   */  #include "tclInt.h"  #include <mach-o/rld.h>  #include <streams/streams.h> + +/* Static procedures defined within this file */ + +static void *		FindSymbol(Tcl_Interp *interp, +			    Tcl_LoadHandle loadHandle, const char* symbol); +static void		UnloadFile(Tcl_LoadHandle loadHandle);  /*   *---------------------------------------------------------------------- @@ -42,11 +46,13 @@ TclpDlopen(      Tcl_LoadHandle *loadHandle,	/* Filled with token for dynamically loaded  				 * file which will be passed back to  				 * (*unloadProcPtr)() to unload the file. */ -    Tcl_FSUnloadFileProc **unloadProcPtr) +    Tcl_FSUnloadFileProc **unloadProcPtr,  				/* Filled with address of Tcl_FSUnloadFileProc  				 * function which should be used for this  				 * file. */ +    int flags)  { +    Tcl_LoadHandle newHandle;      struct mach_header *header;      char *fileName;      char *files[2]; @@ -87,16 +93,20 @@ TclpDlopen(  	char *data;  	int len, maxlen; -	NXGetMemoryBuffer(errorStream,&data,&len,&maxlen); -	Tcl_AppendResult(interp, "couldn't load file \"", fileName, "\": ", -		data, NULL); +	NXGetMemoryBuffer(errorStream, &data, &len, &maxlen); +	Tcl_SetObjResult(interp, Tcl_ObjPrintf( +		"couldn't load file \"%s\": %s", fileName, data));  	NXCloseMemory(errorStream, NX_FREEBUFFER);  	return TCL_ERROR;      }      NXCloseMemory(errorStream, NX_FREEBUFFER); -    *loadHandle = (Tcl_LoadHandle)1; /* A dummy non-NULL value */ -    *unloadProcPtr = &TclpUnloadFile; +    newHandle = ckalloc(sizeof(Tcl_LoadHandle)); +    newHandle->clientData = INT2PTR(1); +    newHandle->findSymbolProcPtr = &FindSymbol; +    newHandle->unloadFileProcPtr = &UnloadFile; +    *loadHandle = newHandle; +    *unloadProcPtr = &UnloadFile;      return TCL_OK;  } @@ -104,7 +114,7 @@ TclpDlopen(  /*   *----------------------------------------------------------------------   * - * TclpFindSymbol -- + * FindSymbol --   *   *	Looks up a symbol, by name, through a handle associated with a   *	previously loaded piece of code (shared library). @@ -117,20 +127,26 @@ TclpDlopen(   *----------------------------------------------------------------------   */ -Tcl_PackageInitProc * -TclpFindSymbol( +static void * +FindSymbol(      Tcl_Interp *interp,      Tcl_LoadHandle loadHandle,      const char *symbol)  {      Tcl_PackageInitProc *proc = NULL; +      if (symbol) {  	char sym[strlen(symbol) + 2];  	sym[0] = '_';  	sym[1] = 0;  	strcat(sym, symbol); -	rld_lookup(NULL, sym, (unsigned long *)&proc); +	rld_lookup(NULL, sym, (unsigned long *) &proc); +    } +    if (proc == NULL && interp != NULL) { +	Tcl_SetObjResult(interp, Tcl_ObjPrintf( +		"cannot find symbol \"%s\"", symbol)); +	Tcl_SetErrorCode(interp, "TCL", "LOOKUP", "LOAD_SYMBOL", symbol, NULL);      }      return proc;  } @@ -138,7 +154,7 @@ TclpFindSymbol(  /*   *----------------------------------------------------------------------   * - * TclpUnloadFile -- + * UnloadFile --   *   *	Unloads a dynamically loaded binary code file from memory. Code   *	pointers in the formerly loaded file are no longer valid after calling @@ -154,11 +170,12 @@ TclpFindSymbol(   */  void -TclpUnloadFile( +UnloadFile(      Tcl_LoadHandle loadHandle)	/* loadHandle returned by a previous call to  				 * TclpDlopen(). The loadHandle is a token  				 * that represents the loaded file. */  { +    ckfree(loadHandle);  }  /* | 
