Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 21d335e

Browse files
committed
Makefile, import.c: Lance's alternative module search (allow .pyc file
without .py file); Bill's dynamic loading for SunOS using shared libraries. pwdmodule.c (mkgrent): remove DECREF of uninitialized variable. classobject.c (instance_getattr): Fix case when class lookup returns unbound method instead of function.
1 parent cbaddb5 commit 21d335e

3 files changed

Lines changed: 130 additions & 104 deletions

File tree

Modules/pwdmodule.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ static object *mkgrent(p)
120120
object *v, *w;
121121
char **member;
122122
if ((w = newlistobject(0)) == NULL) {
123-
DECREF(v);
124123
return NULL;
125124
}
126125
for (member = p->gr_mem; *member != NULL; member++) {

Objects/classobject.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -379,11 +379,24 @@ instance_getattr(inst, name)
379379
}
380380
else
381381
INCREF(v);
382-
if (is_funcobject(v) && class != NULL) {
383-
object *w = newinstancemethodobject(v, (object *)inst,
384-
(object *)class);
385-
DECREF(v);
386-
v = w;
382+
if (class != NULL) {
383+
if (is_funcobject(v)) {
384+
object *w = newinstancemethodobject(v, (object *)inst,
385+
(object *)class);
386+
DECREF(v);
387+
v = w;
388+
}
389+
else if (is_instancemethodobject(v)) {
390+
object *im_class = instancemethodgetclass(v);
391+
/* Only if classes are compatible */
392+
if (issubclass((object *)class, im_class)) {
393+
object *im_func = instancemethodgetfunc(v);
394+
object *w = newinstancemethodobject(im_func,
395+
(object *)inst, im_class);
396+
DECREF(v);
397+
v = w;
398+
}
399+
}
387400
}
388401
return v;
389402
}

Python/import.c

Lines changed: 112 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,21 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4040

4141
extern 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

5259
extern 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+
*/
110121
static 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

162165
static 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

Comments
 (0)