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

Skip to content

Commit c45611d

Browse files
committed
* import.c (get_module): total rewrite, to ensure proper search order: for
each dir in sys.path, try each possible extension. (Note: C extensions are loaded before Python modules in the same directory, to allow having a C version used when dynamic loading is supported and a Python version as a back-up.) * import.c (reload_module): test for error from getmodulename() * moduleobject.c: implement module name as dict entry '__name__' instead of special-casing it in module_getattr(); this way a module (or function!) can access its own module name, and programs that know what they are doing can rename modules. * stdwinmodule.c (initstdwin): strip ".py" suffix of argv[0].
1 parent 71e57d0 commit c45611d

3 files changed

Lines changed: 228 additions & 193 deletions

File tree

Modules/stdwinmodule.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2598,6 +2598,7 @@ initstdwin()
25982598
{
25992599
object *m, *d;
26002600
static int inited = 0;
2601+
char buf[1000];
26012602

26022603
if (!inited) {
26032604
int argc = 0;
@@ -2607,6 +2608,18 @@ initstdwin()
26072608
if (!checkstringlist(sys_argv, &argv, &argc))
26082609
err_clear();
26092610
}
2611+
if (argc > 0) {
2612+
/* If argv[0] has a ".py" suffix, remove the suffix */
2613+
char *p = strrchr(argv[0], '.');
2614+
if (p != NULL && strcmp(p, ".py") == 0) {
2615+
int n = p - argv[0];
2616+
if (n >= sizeof(buf))
2617+
n = sizeof(buf)-1;
2618+
strncpy(buf, argv[0], n);
2619+
buf[n] = '\0';
2620+
argv[0] = buf;
2621+
}
2622+
}
26102623
winitargs(&argc, &argv);
26112624
if (argv != NULL) {
26122625
if (!putbackstringlist(sys_argv, argv, argc))

Objects/moduleobject.c

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -29,24 +29,31 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2929

3030
typedef struct {
3131
OB_HEAD
32-
object *md_name;
3332
object *md_dict;
3433
} moduleobject;
3534

3635
object *
3736
newmoduleobject(name)
3837
char *name;
3938
{
40-
moduleobject *m = NEWOBJ(moduleobject, &Moduletype);
39+
moduleobject *m;
40+
object *nameobj;
41+
m = NEWOBJ(moduleobject, &Moduletype);
4142
if (m == NULL)
4243
return NULL;
43-
m->md_name = newstringobject(name);
44+
nameobj = newstringobject(name);
4445
m->md_dict = newdictobject();
45-
if (m->md_name == NULL || m->md_dict == NULL) {
46-
DECREF(m);
47-
return NULL;
48-
}
46+
if (m->md_dict == NULL || nameobj == NULL)
47+
goto fail;
48+
if (dictinsert(m->md_dict, "__name__", nameobj) != 0)
49+
goto fail;
50+
DECREF(nameobj);
4951
return (object *)m;
52+
53+
fail:
54+
XDECREF(nameobj);
55+
DECREF(m);
56+
return NULL;
5057
}
5158

5259
object *
@@ -64,11 +71,17 @@ char *
6471
getmodulename(m)
6572
object *m;
6673
{
74+
object *nameobj;
6775
if (!is_moduleobject(m)) {
6876
err_badarg();
6977
return NULL;
7078
}
71-
return getstringvalue(((moduleobject *)m) -> md_name);
79+
nameobj = dictlookup(((moduleobject *)m)->md_dict, "__name__");
80+
if (nameobj == NULL || !is_stringobject(nameobj)) {
81+
err_setstr(SystemError, "nameless module");
82+
return NULL;
83+
}
84+
return getstringvalue(nameobj);
7285
}
7386

7487
/* Methods */
@@ -77,8 +90,6 @@ static void
7790
module_dealloc(m)
7891
moduleobject *m;
7992
{
80-
if (m->md_name != NULL)
81-
DECREF(m->md_name);
8293
if (m->md_dict != NULL)
8394
DECREF(m->md_dict);
8495
free((char *)m);
@@ -89,7 +100,12 @@ module_repr(m)
89100
moduleobject *m;
90101
{
91102
char buf[100];
92-
sprintf(buf, "<module '%.80s'>", getstringvalue(m->md_name));
103+
char *name = getmodulename((object *)m);
104+
if (name == NULL) {
105+
err_clear();
106+
name = "?";
107+
}
108+
sprintf(buf, "<module '%.80s'>", name);
93109
return newstringobject(buf);
94110
}
95111

@@ -103,10 +119,6 @@ module_getattr(m, name)
103119
INCREF(m->md_dict);
104120
return m->md_dict;
105121
}
106-
if (strcmp(name, "__name__") == 0) {
107-
INCREF(m->md_name);
108-
return m->md_name;
109-
}
110122
res = dictlookup(m->md_dict, name);
111123
if (res == NULL)
112124
err_setstr(AttributeError, name);
@@ -126,12 +138,9 @@ module_setattr(m, name, v)
126138
object *v;
127139
{
128140
object *ac;
129-
if (name[0] == '_' && name[1] == '_') {
130-
int n = strlen(name);
131-
if (name[n-1] == '_' && name[n-2] == '_') {
132-
err_setstr(TypeError, "read-only special attribute");
133-
return -1;
134-
}
141+
if (name[0] == '_' && strcmp(name, "__dict__") == 0) {
142+
err_setstr(TypeError, "read-only special attribute");
143+
return -1;
135144
}
136145
ac = dictlookup(m->md_dict, name);
137146
if (ac != NULL && is_accessobject(ac))

0 commit comments

Comments
 (0)