@@ -40,14 +40,21 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4040
4141extern int verbose ; /* Defined in pythonmain.c */
4242
43+ extern long getmtime (); /* Defined in posixmodule.c */
44+
4345#ifdef DEBUG
4446#define D (x ) x
4547#else
4648#define D (x )
4749#endif
4850
4951#ifdef USE_DL
52+ #ifdef SUN_SHLIB
53+ #include <dlfcn.h>
54+ typedef void (* dl_funcptr )();
55+ #else
5056#include "dl.h"
57+ #endif /* SUN_SHLIB */
5158
5259extern char * argv0 ;
5360#endif
@@ -94,44 +101,46 @@ add_module(name)
94101 return m ;
95102}
96103
97- /* Suffixes used by open_module : */
104+ /* Suffixes used by find_module : */
98105
99106#define PY_SUFFIX ".py"
107+ #define PYC_SUFFIX ".pyc"
100108#ifdef USE_DL
109+ #ifdef SUN_SHLIB
110+ #define O_SUFFIX "module.so"
111+ #else
101112#define O_SUFFIX "module.o"
113+ #endif /* SUN_SHLIB */
102114#endif
103115
104- /* Find and open a module file, using sys.path.
105- Return a NULL pointer if no module file is found.
106- When dynamic loading is enabled, the contents of namebuf
107- is important when NULL is returned: if namebuf[0] != '\0'
108- a dl-able object file was found and namebuf is its pathname. */
109-
116+ /* This will search for a module named 'name' with the extension 'ext'
117+ and return it in 'namebuf' and return the mtime of each in 'mtime'.
118+ It returns a file pointer opened for 'mode' if successful, NULL if
119+ unsuccessful.
120+ */
110121static FILE *
111- open_module (name , namebuf )
122+ find_module (name , ext , mode , namebuf , mtime )
112123 char * name ;
113- char * namebuf ; /* XXX No buffer overflow checks! */
124+ char * ext ;
125+ char * mode ;
126+ char * namebuf ;
127+ long * mtime ;
114128{
115129 object * path ;
116130 FILE * fp ;
117-
131+
118132 path = sysget ("path" );
119133 if (path == NULL || !is_listobject (path )) {
120134 /* No path -- at least try current directory */
121- #ifdef USE_DL
122135 strcpy (namebuf , name );
123- strcat (namebuf , O_SUFFIX );
124- if (getmtime ( namebuf ) > 0 )
136+ strcat (namebuf , ext );
137+ if (( fp = fopen ( namebuf , mode )) == NULL )
125138 return NULL ;
126- #endif
127- strcpy (namebuf , name );
128- strcat (namebuf , PY_SUFFIX );
129- fp = fopen (namebuf , "r" );
130- }
131- else {
139+ * mtime = getmtime (namebuf );
140+ return fp ;
141+ } else {
132142 int npath = getlistsize (path );
133143 int i ;
134- fp = NULL ;
135144 for (i = 0 ; i < npath ; i ++ ) {
136145 object * v = getlistitem (path , i );
137146 int len ;
@@ -141,22 +150,16 @@ open_module(name, namebuf)
141150 len = getstringsize (v );
142151 if (len > 0 && namebuf [len - 1 ] != SEP )
143152 namebuf [len ++ ] = SEP ;
144- #ifdef USE_DL
145- strcpy (namebuf + len , name );
146- strcat (namebuf , O_SUFFIX );
147- if (getmtime (namebuf ) > 0 )
148- return NULL ;
149- #endif
150153 strcpy (namebuf + len , name );
151- strcat (namebuf , PY_SUFFIX );
152- fp = fopen (namebuf , "r" );
153- if (fp != NULL )
154- break ;
154+ strcat (namebuf , ext );
155+ if ((fp = fopen (namebuf , mode )) == NULL )
156+ continue ;
157+ * mtime = getmtime (namebuf );
158+ return fp ;
155159 }
156160 }
157- if (fp == NULL )
158- namebuf [0 ] = '\0' ;
159- return fp ;
161+ namebuf [0 ] = '\0' ;
162+ return NULL ;
160163}
161164
162165static object *
@@ -173,66 +176,63 @@ get_module(m, name, m_ret)
173176 char namebuf [MAXPATHLEN + 1 ];
174177 int namelen ;
175178 long mtime ;
176- extern long getmtime ();
177-
178- fp = open_module (name , namebuf );
179- if (fp == NULL ) {
179+
180180#ifdef USE_DL
181- if (namebuf [0 ] != '\0' ) {
182- char funcname [258 ];
183- dl_funcptr p ;
184- D (fprintf (stderr , "Found %s\n" , namebuf ));
185- sprintf (funcname , "init%s" , name );
186- p = dl_loadmod (argv0 , namebuf , funcname );
187- if (p == NULL ) {
188- D (fprintf (stderr , "dl_loadmod failed\n" ));
189- }
190- else {
191- if (verbose )
192- fprintf (stderr ,
193- "import %s # dynamically loaded from \"%s\"\n" ,
194- name , namebuf );
195- (* p )();
196- * m_ret = m = dictlookup (modules , name );
197- if (m == NULL ) {
198- err_setstr (SystemError ,
199- "dynamic module missing" );
200- return NULL ;
201- }
202- else {
203- D (fprintf (stderr ,
204- "module %s loaded!\n" , name ));
205- INCREF (None );
206- return None ;
207- }
208- }
209- }
210- #endif
211- if (m == NULL ) {
212- sprintf (namebuf , "no module named %.200s" , name );
213- err_setstr (ImportError , namebuf );
181+ if ((fpc = find_module (name , O_SUFFIX , "rb" ,
182+ namebuf , & mtime )) != NULL ) {
183+ char funcname [258 ];
184+ dl_funcptr p ;
185+ D (fprintf (stderr , "Found %s\n" , namebuf ));
186+ fclose (fpc );
187+ sprintf (funcname , "init%s" , name );
188+ #ifdef SUN_SHLIB
189+ {
190+ void * handle = dlopen (namebuf , 1 );
191+ p = (dl_funcptr ) dlsym (handle , funcname );
214192 }
215- else {
216- sprintf (namebuf , "no source for module %.200s" , name );
217- err_setstr (ImportError , namebuf );
193+ #else
194+ p = dl_loadmod (argv0 , namebuf , funcname );
195+ #endif /* SUN_SHLIB */
196+ if (p == NULL ) {
197+ D (fprintf (stderr , "dl_loadmod failed\n" ));
198+ } else {
199+ if (verbose )
200+ fprintf (stderr ,
201+ "import %s # dynamically loaded from \"%s\"\n" ,
202+ name , namebuf );
203+ (* p )();
204+ * m_ret = m = dictlookup (modules , name );
205+ if (m == NULL ) {
206+ err_setstr (SystemError ,
207+ "dynamic module missing" );
208+ return NULL ;
209+ } else {
210+ D (fprintf (stderr ,
211+ "module %s loaded!\n" , name ));
212+ INCREF (None );
213+ return None ;
214+ }
218215 }
219- return NULL ;
220216 }
221- /* Get mtime -- always useful */
222- mtime = getmtime (namebuf );
223- /* Check ".pyc" file first */
224- namelen = strlen (namebuf );
225- namebuf [namelen ] = 'c' ;
226- namebuf [namelen + 1 ] = '\0' ;
227- fpc = fopen (namebuf , "rb" );
228- if (fpc != NULL ) {
217+ else
218+ #endif
219+ if ((fpc = find_module (name , PYC_SUFFIX , "rb" ,
220+ namebuf , & mtime )) != NULL ) {
229221 long pyc_mtime ;
230222 long magic ;
223+ namebuf [(strlen (namebuf )- 1 )] = '\0' ;
224+ mtime = getmtime (namebuf );
231225 magic = rd_long (fpc );
232226 pyc_mtime = rd_long (fpc );
233- if (magic == MAGIC && pyc_mtime == mtime && mtime != 0 && mtime != -1 ) {
227+ if (mtime != -1 && mtime > pyc_mtime ) {
228+ fclose (fpc );
229+ fp = fopen (namebuf , "rb" );
230+ goto read_py ;
231+ }
232+ if (magic == MAGIC ) {
234233 v = rd_object (fpc );
235- if (v == NULL || err_occurred () || !is_codeobject (v )) {
234+ if (v == NULL || err_occurred () ||
235+ !is_codeobject (v )) {
236236 err_clear ();
237237 XDECREF (v );
238238 }
@@ -243,27 +243,41 @@ get_module(m, name, m_ret)
243243 if (verbose ) {
244244 if (co != NULL )
245245 fprintf (stderr ,
246- "import %s # precompiled from \"%s\"\n" ,
246+ "import %s # precompiled from \"%s\"\n" ,
247247 name , namebuf );
248248 else
249249 fprintf (stderr ,
250- "# invalid precompiled file \"%s\"\n" ,
250+ "# invalid precompiled file \"%s\"\n" ,
251251 namebuf );
252252 }
253253 }
254- namebuf [namelen ] = '\0' ;
255- if (co == NULL ) {
256- if (verbose )
257- fprintf (stderr ,
258- "import %s # from \"%s\"\n" ,
259- name , namebuf );
260- err = parse_file (fp , namebuf , file_input , & n );
254+ else if ((fp = find_module (name , PY_SUFFIX , "r" ,
255+ namebuf , & mtime )) != NULL ) {
256+ read_py :
257+ namelen = strlen (namebuf );
258+ if (co == NULL ) {
259+ if (verbose )
260+ fprintf (stderr ,
261+ "import %s # from \"%s\"\n" ,
262+ name , namebuf );
263+ err = parse_file (fp , namebuf , file_input , & n );
264+ } else
265+ err = E_DONE ;
266+ fclose (fp );
267+ if (err != E_DONE ) {
268+ err_input (err );
269+ return NULL ;
270+ }
261271 }
262- else
263- err = E_DONE ;
264- fclose (fp );
265- if (err != E_DONE ) {
266- err_input (err );
272+ else {
273+ if (m == NULL ) {
274+ sprintf (namebuf , "no module named %.200s" , name );
275+ err_setstr (ImportError , namebuf );
276+ }
277+ else {
278+ sprintf (namebuf , "no source for module %.200s" , name );
279+ err_setstr (ImportError , namebuf );
280+ }
267281 return NULL ;
268282 }
269283 if (m == NULL ) {
0 commit comments