[Python-checkins] python/dist/src/Python newcompile.c, 1.1.2.77, 1.1.2.78

nnorwitz at users.sourceforge.net nnorwitz at users.sourceforge.net
Sat Mar 20 14:46:54 EST 2004


Update of /cvsroot/python/python/dist/src/Python
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv15883/Python

Modified Files:
      Tag: ast-branch
	newcompile.c 
Log Message:
get name mangling working

Index: newcompile.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/Attic/newcompile.c,v
retrieving revision 1.1.2.77
retrieving revision 1.1.2.78
diff -C2 -d -r1.1.2.77 -r1.1.2.78
*** newcompile.c	20 Mar 2004 17:44:21 -0000	1.1.2.77
--- newcompile.c	20 Mar 2004 19:46:51 -0000	1.1.2.78
***************
*** 33,37 ****
  
     Invalid behaviour:
-      #: name mangling in classes (__vars) doesn't work
       #: doing from __future__ import division doesn't work 
          doesn't output BINARY_TRUE_DIVISION
--- 33,36 ----
***************
*** 85,88 ****
--- 84,89 ----
  	PyObject *u_freevars;  /* free variables */
  
+ 	PyObject *u_private;	/* for private name mangling */
+ 
  	int u_argcount;    /* number of arguments for block */ 
  	int u_nblocks;     /* number of used blocks in u_blocks
***************
*** 157,186 ****
  static PyObject *__doc__;
  
! int
! _Py_Mangle(char *p, char *name, char *buffer, size_t maxlen)
  {
  	/* Name mangling: __private becomes _classname__private.
  	   This is independent from how the name is used. */
  	size_t nlen, plen;
! 	if (p == NULL || name == NULL || name[0] != '_' || name[1] != '_')
! 		return 0;
  	nlen = strlen(name);
! 	if (nlen+2 >= maxlen)
! 		return 0; /* Don't mangle __extremely_long_names */
! 	if (name[nlen-1] == '_' && name[nlen-2] == '_')
! 		return 0; /* Don't mangle __whatever__ */
  	/* 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-2; /* Truncate class name if too long */
! 	/* buffer = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
! 	buffer[0] = '_';
  	strncpy(buffer+1, p, plen);
  	strcpy(buffer+1+plen, name);
! 	return 1;
  }
  
--- 158,196 ----
  static PyObject *__doc__;
  
! PyObject *
! _Py_Mangle(PyObject *private, PyObject *ident)
  {
  	/* Name mangling: __private becomes _classname__private.
  	   This is independent from how the name is used. */
+         const char *p, *name = PyString_AsString(ident);
+         char *buffer;
  	size_t nlen, plen;
! 	if (private == NULL || name == NULL || name[0] != '_' || name[1] != '_') {
!                 Py_INCREF(ident);
! 		return ident;
!         }
!         p = PyString_AsString(private);
  	nlen = strlen(name);
! 	if (name[nlen-1] == '_' && name[nlen-2] == '_') {
!                 Py_INCREF(ident);
! 		return ident; /* Don't mangle __whatever__ */
!         }
  	/* Strip leading underscores from class name */
  	while (*p == '_')
  		p++;
! 	if (*p == '\0') {
!                 Py_INCREF(ident);
! 		return ident; /* Don't mangle if class is just underscores */
!         }
  	plen = strlen(p);
!         ident = PyString_FromStringAndSize(NULL, 1 + nlen + plen);
!         if (!ident)
!             return 0;
! 	/* ident = "_" + p[:plen] + name # i.e. 1+plen+nlen bytes */
!         buffer = PyString_AS_STRING(ident);
!         buffer[0] = '_';
  	strncpy(buffer+1, p, plen);
  	strcpy(buffer+1+plen, name);
! 	return ident;
  }
  
***************
*** 389,392 ****
--- 399,404 ----
  		return 0;
  
+         u->u_private = NULL;
+ 
  	/* A little debugging output */
  	compiler_display_symbols(name, u->u_ste->ste_symbols);
***************
*** 399,402 ****
--- 411,416 ----
  		Py_DECREF(wrapper);
  		fprintf(stderr, "stack = %s\n", PyObject_REPR(c->c_stack));
+                 u->u_private = c->u->u_private;
+                 Py_XINCREF(u->u_private);
  	}
  	c->u = u;
***************
*** 654,657 ****
--- 668,685 ----
  }
  
+ static int
+ compiler_addop_name(struct compiler *c, int opcode, PyObject *o)
+ {
+     int arg;
+     PyObject *mangled = _Py_Mangle(c->u->u_private, o);
+     if (!mangled)
+         return 0;
+     arg = compiler_add_o(c, c->u->u_names, mangled);
+     Py_DECREF(mangled);
+     if (arg < 0)
+         return 0;
+     return compiler_addop_i(c, opcode, arg);
+ }
+ 
  /* Add an opcode with an integer argument.
     Returns 0 on failure, 1 on success.
***************
*** 723,726 ****
--- 751,761 ----
  }
  
+ #define ADDOP_NAME(C, OP, O) { \
+ 	if (!compiler_addop_name((C), (OP), (O))) { \
+                 Py_DECREF(O); \
+ 		return 0; \
+         } \
+ }
+ 
  #define ADDOP_I(C, OP, O) { \
  	if (!compiler_addop_i((C), (OP), (O))) \
***************
*** 958,961 ****
--- 993,998 ----
  	if (!compiler_enter_scope(c, s->v.ClassDef.name, (void *)s))
  		return 0;
+         c->u->u_private = s->v.ClassDef.name;
+         Py_INCREF(c->u->u_private);
          str = PyString_InternFromString("__name__");
  	if (!str || !compiler_nameop(c, str, Load)) {
***************
*** 1350,1354 ****
  		identifier store_name;
  		ADDOP_O(c, LOAD_CONST, Py_None, consts);
! 		ADDOP_O(c, IMPORT_NAME, alias->name, names);
  
                  /* XXX: handling of store_name should be cleaned up */
--- 1387,1391 ----
  		identifier store_name;
  		ADDOP_O(c, LOAD_CONST, Py_None, consts);
! 		ADDOP_NAME(c, IMPORT_NAME, alias->name);
  
                  /* XXX: handling of store_name should be cleaned up */
***************
*** 1395,1399 ****
  
  	ADDOP_O(c, LOAD_CONST, names, consts);
! 	ADDOP_O(c, IMPORT_NAME, s->v.ImportFrom.module, names);
  	for (i = 0; i < n; i++) {
  		alias_ty alias = asdl_seq_GET(s->v.ImportFrom.names, i);
--- 1432,1436 ----
  
  	ADDOP_O(c, LOAD_CONST, names, consts);
! 	ADDOP_NAME(c, IMPORT_NAME, s->v.ImportFrom.module);
  	for (i = 0; i < n; i++) {
  		alias_ty alias = asdl_seq_GET(s->v.ImportFrom.names, i);
***************
*** 1407,1411 ****
  		}
  		    
! 		ADDOP_O(c, IMPORT_FROM, alias->name, names);
  		store_name = alias->name;
  		if (alias->asname)
--- 1444,1448 ----
  		}
  		    
! 		ADDOP_NAME(c, IMPORT_FROM, alias->name);
  		store_name = alias->name;
  		if (alias->asname)
***************
*** 1761,1765 ****
  
  	assert(op);
! 	ADDOP_O(c, op, name, names);
  	return 1;
  }
--- 1798,1802 ----
  
  	assert(op);
! 	ADDOP_NAME(c, op, name);
  	return 1;
  }
***************
*** 2059,2063 ****
  			/* Fall through to load */
  		case Load:
! 			ADDOP_O(c, LOAD_ATTR, e->v.Attribute.attr, names);
  			break;
  		case AugStore:
--- 2096,2100 ----
  			/* Fall through to load */
  		case Load:
! 			ADDOP_NAME(c, LOAD_ATTR, e->v.Attribute.attr);
  			break;
  		case AugStore:
***************
*** 2065,2072 ****
  			/* Fall through to save */
  		case Store:
! 			ADDOP_O(c, STORE_ATTR, e->v.Attribute.attr, names);
  			break;
  		case Del:
! 			ADDOP_O(c, DELETE_ATTR, e->v.Attribute.attr, names);
  			break;
  		case Param:
--- 2102,2109 ----
  			/* Fall through to save */
  		case Store:
! 			ADDOP_NAME(c, STORE_ATTR, e->v.Attribute.attr);
  			break;
  		case Del:
! 			ADDOP_NAME(c, DELETE_ATTR, e->v.Attribute.attr);
  			break;
  		case Param:




More information about the Python-checkins mailing list