Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
8ff077b0
Kaydet (Commit)
8ff077b0
authored
Agu 24, 1996
tarafından
Guido van Rossum
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
Name mangling, what the heck!
üst
93fccacc
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
80 additions
and
3 deletions
+80
-3
compile.c
Python/compile.c
+80
-3
No files found.
Python/compile.c
Dosyayı görüntüle @
8ff077b0
...
@@ -35,6 +35,10 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
...
@@ -35,6 +35,10 @@ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
XXX other JAR tricks?
XXX other JAR tricks?
*/
*/
#ifndef NO_PRIVATE_NAME_MANGLING
#define PRIVATE_NAME_MANGLING
#endif
#include "allobjects.h"
#include "allobjects.h"
#include "node.h"
#include "node.h"
...
@@ -252,6 +256,9 @@ struct compiling {
...
@@ -252,6 +256,9 @@ struct compiling {
int
c_nblocks
;
/* current block stack level */
int
c_nblocks
;
/* current block stack level */
char
*
c_filename
;
/* filename of current node */
char
*
c_filename
;
/* filename of current node */
char
*
c_name
;
/* name of object (e.g. function) */
char
*
c_name
;
/* name of object (e.g. function) */
#ifdef PRIVATE_NAME_MANGLING
char
*
c_private
;
/* for private name mangling */
#endif
};
};
...
@@ -304,6 +311,8 @@ static void com_addopname PROTO((struct compiling *, int, node *));
...
@@ -304,6 +311,8 @@ static void com_addopname PROTO((struct compiling *, int, node *));
static
void
com_list
PROTO
((
struct
compiling
*
,
node
*
,
int
));
static
void
com_list
PROTO
((
struct
compiling
*
,
node
*
,
int
));
static
int
com_argdefs
PROTO
((
struct
compiling
*
,
node
*
));
static
int
com_argdefs
PROTO
((
struct
compiling
*
,
node
*
));
static
int
com_newlocal
PROTO
((
struct
compiling
*
,
char
*
));
static
int
com_newlocal
PROTO
((
struct
compiling
*
,
char
*
));
static
codeobject
*
icompile
PROTO
((
struct
_node
*
,
struct
compiling
*
));
static
codeobject
*
jcompile
PROTO
((
struct
_node
*
,
char
*
,
struct
compiling
*
));
static
int
static
int
com_init
(
c
,
filename
)
com_init
(
c
,
filename
)
...
@@ -489,6 +498,41 @@ com_addname(c, v)
...
@@ -489,6 +498,41 @@ com_addname(c, v)
return
com_add
(
c
,
c
->
c_names
,
v
);
return
com_add
(
c
,
c
->
c_names
,
v
);
}
}
#ifdef PRIVATE_NAME_MANGLING
static
int
com_mangle
(
c
,
name
,
buffer
,
maxlen
)
struct
compiling
*
c
;
char
*
name
;
char
*
buffer
;
int
maxlen
;
{
/* Name mangling: __private becomes _classname_private.
This is independent from how the name is used. */
char
*
p
;
int
nlen
,
plen
;
nlen
=
strlen
(
name
);
if
(
nlen
+
1
>=
maxlen
)
return
0
;
/* Don't mangle __extremely_long_names */
if
(
name
[
nlen
-
1
]
==
'_'
&&
name
[
nlen
-
2
]
==
'_'
)
return
0
;
/* Don't mangle __whatever__ */
p
=
c
->
c_private
;
/* Strip leading underscores from class name */
while
(
*
p
==
'_'
)
p
++
;
if
(
*
p
==
'\0'
)
return
0
;
/* Don't mangle if class is just underscores */
plen
=
strlen
(
p
);
if
(
plen
+
nlen
>=
maxlen
)
plen
=
maxlen
-
nlen
-
1
;
/* Truncate class name if too long */
/* buffer = "_" + p[:plen] + name[1:] # i.e. plen+nlen bytes */
buffer
[
0
]
=
'_'
;
strncpy
(
buffer
+
1
,
p
,
plen
);
strcpy
(
buffer
+
plen
+
1
,
name
+
1
);
/* fprintf(stderr, "mangle %s -> %s\n", name, buffer); */
return
1
;
}
#endif
static
void
static
void
com_addopnamestr
(
c
,
op
,
name
)
com_addopnamestr
(
c
,
op
,
name
)
struct
compiling
*
c
;
struct
compiling
*
c
;
...
@@ -497,6 +541,13 @@ com_addopnamestr(c, op, name)
...
@@ -497,6 +541,13 @@ com_addopnamestr(c, op, name)
{
{
object
*
v
;
object
*
v
;
int
i
;
int
i
;
#ifdef PRIVATE_NAME_MANGLING
char
buffer
[
256
];
if
(
name
!=
NULL
&&
name
[
0
]
==
'_'
&&
name
[
1
]
==
'_'
&&
c
->
c_private
!=
NULL
&&
com_mangle
(
c
,
name
,
buffer
,
(
int
)
sizeof
(
buffer
)))
name
=
buffer
;
#endif
if
(
name
==
NULL
||
(
v
=
newstringobject
(
name
))
==
NULL
)
{
if
(
name
==
NULL
||
(
v
=
newstringobject
(
name
))
==
NULL
)
{
c
->
c_errors
++
;
c
->
c_errors
++
;
i
=
255
;
i
=
255
;
...
@@ -1382,7 +1433,7 @@ com_test(c, n)
...
@@ -1382,7 +1433,7 @@ com_test(c, n)
object
*
v
;
object
*
v
;
int
i
;
int
i
;
int
ndefs
=
com_argdefs
(
c
,
CHILD
(
n
,
0
));
int
ndefs
=
com_argdefs
(
c
,
CHILD
(
n
,
0
));
v
=
(
object
*
)
compile
(
CHILD
(
n
,
0
),
c
->
c_filename
);
v
=
(
object
*
)
icompile
(
CHILD
(
n
,
0
),
c
);
if
(
v
==
NULL
)
{
if
(
v
==
NULL
)
{
c
->
c_errors
++
;
c
->
c_errors
++
;
i
=
255
;
i
=
255
;
...
@@ -2285,7 +2336,7 @@ com_funcdef(c, n)
...
@@ -2285,7 +2336,7 @@ com_funcdef(c, n)
{
{
object
*
v
;
object
*
v
;
REQ
(
n
,
funcdef
);
/* funcdef: 'def' NAME parameters ':' suite */
REQ
(
n
,
funcdef
);
/* funcdef: 'def' NAME parameters ':' suite */
v
=
(
object
*
)
compile
(
n
,
c
->
c_filename
);
v
=
(
object
*
)
icompile
(
n
,
c
);
if
(
v
==
NULL
)
if
(
v
==
NULL
)
c
->
c_errors
++
;
c
->
c_errors
++
;
else
{
else
{
...
@@ -2333,7 +2384,7 @@ com_classdef(c, n)
...
@@ -2333,7 +2384,7 @@ com_classdef(c, n)
com_addoparg
(
c
,
BUILD_TUPLE
,
0
);
com_addoparg
(
c
,
BUILD_TUPLE
,
0
);
else
else
com_bases
(
c
,
CHILD
(
n
,
3
));
com_bases
(
c
,
CHILD
(
n
,
3
));
v
=
(
object
*
)
compile
(
n
,
c
->
c_filename
);
v
=
(
object
*
)
icompile
(
n
,
c
);
if
(
v
==
NULL
)
if
(
v
==
NULL
)
c
->
c_errors
++
;
c
->
c_errors
++
;
else
{
else
{
...
@@ -2706,6 +2757,9 @@ compile_classdef(c, n)
...
@@ -2706,6 +2757,9 @@ compile_classdef(c, n)
REQ
(
n
,
classdef
);
REQ
(
n
,
classdef
);
/* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
/* classdef: 'class' NAME ['(' testlist ')'] ':' suite */
c
->
c_name
=
STR
(
CHILD
(
n
,
1
));
c
->
c_name
=
STR
(
CHILD
(
n
,
1
));
#ifdef PRIVATE_NAME_MANGLING
c
->
c_private
=
c
->
c_name
;
#endif
ch
=
CHILD
(
n
,
NCH
(
n
)
-
1
);
/* The suite */
ch
=
CHILD
(
n
,
NCH
(
n
)
-
1
);
/* The suite */
doc
=
get_docstring
(
ch
);
doc
=
get_docstring
(
ch
);
if
(
doc
!=
NULL
)
{
if
(
doc
!=
NULL
)
{
...
@@ -2877,11 +2931,34 @@ codeobject *
...
@@ -2877,11 +2931,34 @@ codeobject *
compile
(
n
,
filename
)
compile
(
n
,
filename
)
node
*
n
;
node
*
n
;
char
*
filename
;
char
*
filename
;
{
return
jcompile
(
n
,
filename
,
NULL
);
}
static
codeobject
*
icompile
(
n
,
base
)
node
*
n
;
struct
compiling
*
base
;
{
return
jcompile
(
n
,
base
->
c_filename
,
base
);
}
static
codeobject
*
jcompile
(
n
,
filename
,
base
)
node
*
n
;
char
*
filename
;
struct
compiling
*
base
;
{
{
struct
compiling
sc
;
struct
compiling
sc
;
codeobject
*
co
;
codeobject
*
co
;
if
(
!
com_init
(
&
sc
,
filename
))
if
(
!
com_init
(
&
sc
,
filename
))
return
NULL
;
return
NULL
;
#ifdef PRIVATE_NAME_MANGLING
if
(
base
)
sc
.
c_private
=
base
->
c_private
;
else
sc
.
c_private
=
NULL
;
#endif
compile_node
(
&
sc
,
n
);
compile_node
(
&
sc
,
n
);
com_done
(
&
sc
);
com_done
(
&
sc
);
if
((
TYPE
(
n
)
==
funcdef
||
TYPE
(
n
)
==
lambdef
)
&&
sc
.
c_errors
==
0
)
{
if
((
TYPE
(
n
)
==
funcdef
||
TYPE
(
n
)
==
lambdef
)
&&
sc
.
c_errors
==
0
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment