cvs: ZendEngine2 / zend.c zend.h zend_API.c zend_compile.c zend_language_parser.y zend_language_scanner.l zend_object_handlers.c zend_opcode.c
| From: | Andi Gutmans | Date: | Thu, 21 Feb 2002 11:50:45 +0000 |
| Subject: | cvs: ZendEngine2 / zend.c zend.h zend_API.c zend_compile.c zend_language_parser.y zend_language_scanner.l zend_object_handlers.c zend_opcode.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-9416@lists.php.net to get a copy of this message | ||
andi Thu Feb 21 06:50:45 2002 EDT
Modified files:
/ZendEngine2 zend.c zend.h zend_API.c zend_compile.c
zend_language_parser.y zend_language_scanner.l
zend_object_handlers.c zend_opcode.c
Log:
- Experimental support for private members.
<?
class MyClass {
private $Hello = "Hello, World!\n";
function printHello()
{
print $this->Hello;
}
}
class MyClass2 extends MyClass {
function printHello()
{
MyClass::printHello(); /* Should print */
print $this->Hello; /* Shouldn't print out anything */
}
}
$obj = new MyClass();
print $obj->Hello; /* Shouldn't print out anything */
$obj->printHello(); /* Should print */
$obj = new MyClass2();
print $obj->Hello; /* Shouldn't print out anything */
$obj->printHello();
?>
Index: ZendEngine2/zend.c diff -u ZendEngine2/zend.c:1.161 ZendEngine2/zend.c:1.162 --- ZendEngine2/zend.c:1.161 Sun Jan 6 15:30:41 2002 +++ ZendEngine2/zend.c Thu Feb 21 06:50:41 2002 @@ -251,6 +251,7 @@ zend_standard_class_def.name = zend_strndup("stdClass", zend_standard_class_def.name_length); zend_standard_class_def.parent = NULL; zend_hash_init_ex(&zend_standard_class_def.default_properties, 0, NULL, ZVAL_PTR_DTOR, 1, 0); + zend_hash_init_ex(&zend_standard_class_def.private_properties, 0, NULL, ZVAL_PTR_DTOR, 1, 0); zend_standard_class_def.static_members = (HashTable *) malloc(sizeof(HashTable)); zend_hash_init_ex(zend_standard_class_def.static_members, 0, NULL, ZVAL_PTR_DTOR, 1, 0); zend_hash_init_ex(&zend_standard_class_def.constants_table, 0, NULL, ZVAL_PTR_DTOR, 1, 0); Index: ZendEngine2/zend.h diff -u ZendEngine2/zend.h:1.160 ZendEngine2/zend.h:1.161 --- ZendEngine2/zend.h:1.160 Thu Feb 14 04:20:51 2002 +++ ZendEngine2/zend.h Thu Feb 21 06:50:41 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend.h,v 1.160 2002/02/14 09:20:51 stas Exp $ */ +/* $Id: zend.h,v 1.161 2002/02/21 11:50:41 andi Exp $ */ #ifndef ZEND_H #define ZEND_H @@ -270,6 +270,7 @@ HashTable function_table; HashTable default_properties; + HashTable private_properties; /* This is only needed at compile-time */ HashTable class_table; HashTable *static_members; HashTable constants_table; Index: ZendEngine2/zend_API.c diff -u ZendEngine2/zend_API.c:1.117 ZendEngine2/zend_API.c:1.118 --- ZendEngine2/zend_API.c:1.117 Thu Feb 14 04:20:51 2002 +++ ZendEngine2/zend_API.c Thu Feb 21 06:50:41 2002 @@ -1224,6 +1224,7 @@ *class_entry->refcount = 1; class_entry->constants_updated = 0; zend_hash_init(&class_entry->default_properties, 0, NULL, ZVAL_PTR_DTOR, 1); + zend_hash_init(&class_entry->private_properties, 0, NULL, ZVAL_PTR_DTOR, 1); class_entry->static_members = (HashTable *) malloc(sizeof(HashTable)); zend_hash_init(class_entry->static_members, 0, NULL, ZVAL_PTR_DTOR, 1); zend_hash_init(&class_entry->constants_table, 0, NULL, ZVAL_PTR_DTOR, 1); Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.270 ZendEngine2/zend_compile.c:1.271 --- ZendEngine2/zend_compile.c:1.270 Wed Feb 13 23:01:53 2002 +++ ZendEngine2/zend_compile.c Thu Feb 21 06:50:42 2002 @@ -1366,6 +1366,7 @@ zend_hash_init(&new_class_entry.function_table, 10, NULL, ZEND_FUNCTION_DTOR, 0); zend_hash_init(&new_class_entry.class_table, 10, NULL, ZEND_CLASS_DTOR, 0); zend_hash_init(&new_class_entry.default_properties, 10, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_init(&new_class_entry.private_properties, 10, NULL, ZVAL_PTR_DTOR, 0); ALLOC_HASHTABLE(new_class_entry.static_members); zend_hash_init(new_class_entry.static_members, 10, NULL, ZVAL_PTR_DTOR, 0); zend_hash_init(&new_class_entry.constants_table, 10, NULL, ZVAL_PTR_DTOR, 0); @@ -1520,6 +1521,7 @@ (*ce->refcount)--; zend_hash_destroy(&ce->function_table); zend_hash_destroy(&ce->default_properties); + zend_hash_destroy(&ce->private_properties); zend_hash_destroy(ce->static_members); zend_hash_destroy(&ce->constants_table); return FAILURE; @@ -1856,6 +1858,7 @@ zend_hash_init(&new_class_entry.function_table, 10, NULL, ZEND_FUNCTION_DTOR, 0); zend_hash_init(&new_class_entry.class_table, 10, NULL, ZEND_CLASS_DTOR, 0); zend_hash_init(&new_class_entry.default_properties, 10, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_init(&new_class_entry.private_properties, 10, NULL, ZVAL_PTR_DTOR, 0); ALLOC_HASHTABLE(new_class_entry.static_members); zend_hash_init(new_class_entry.static_members, 10, NULL, ZVAL_PTR_DTOR, 0); zend_hash_init(&new_class_entry.constants_table, 10, NULL, ZVAL_PTR_DTOR, 0); @@ -1963,6 +1966,20 @@ } } +void mangle_private_property_name(char **dest, int *dest_length, char *src1, int src1_length, char *src2, int src2_length) +{ + char *priv_name; + int priv_name_length; + + priv_name_length = 1 + src1_length + 1 + src2_length; + priv_name = emalloc(priv_name_length+1); + priv_name[0] = '\0'; + memcpy(priv_name + 1, src1, src1_length+1); + memcpy(priv_name + 1 + src1_length + 1, src2, src2_length+1); + + *dest = priv_name; + *dest_length = priv_name_length; +} void zend_do_declare_property(znode *var_name, znode *value, int declaration_type TSRMLS_DC) { @@ -1978,6 +1995,19 @@ } switch (declaration_type) { + case T_PRIVATE: + { + char *priv_name; + int priv_name_length; + + mangle_private_property_name(&priv_name, &priv_name_length, CG(active_class_entry)->name, CG(active_class_entry)->name_length, var_name->u.constant.value.str.val, var_name->u.constant.value.str.len); + zend_hash_update(&CG(active_class_entry)->default_properties, priv_name, priv_name_length+1, &property, sizeof(zval *), NULL); + efree(priv_name); + + property->refcount++; + zend_hash_update(&CG(active_class_entry)->private_properties, var_name->u.constant.value.str.val, var_name->u.constant.value.str.len+1, &property, sizeof(zval *), NULL); + break; + } case T_VAR: zend_hash_update(&CG(active_class_entry)->default_properties, var_name->u.constant.value.str.val, var_name->u.constant.value.str.len+1, &property, sizeof(zval *), NULL); break; @@ -2009,6 +2039,17 @@ opline_ptr->op1 = *property; SET_UNUSED(opline_ptr->op2); opline_ptr->op2.u.EA.type = ZEND_FETCH_FROM_THIS; + + if ((opline_ptr->op1.op_type == IS_CONST) && zend_hash_exists(&CG(active_class_entry)->private_properties, opline_ptr->op1.u.constant.value.str.val, opline_ptr->op1.u.constant.value.str.len+1)) { + char *priv_name; + int priv_name_length; + + mangle_private_property_name(&priv_name, &priv_name_length, CG(active_class_entry)->name, CG(active_class_entry)->name_length, opline_ptr->op1.u.constant.value.str.val, opline_ptr->op1.u.constant.value.str.len); + + STR_FREE(opline_ptr->op1.u.constant.value.str.val); + opline_ptr->op1.u.constant.value.str.val = priv_name; + opline_ptr->op1.u.constant.value.str.len = priv_name_length; + } *result = opline_ptr->result; return; Index: ZendEngine2/zend_language_parser.y diff -u ZendEngine2/zend_language_parser.y:1.47 ZendEngine2/zend_language_parser.y:1.48 --- ZendEngine2/zend_language_parser.y:1.47 Wed Feb 13 14:26:07 2002 +++ ZendEngine2/zend_language_parser.y Thu Feb 21 06:50:43 2002 @@ -111,6 +111,7 @@ %token T_USE %token T_GLOBAL %token T_STATIC +%token T_PRIVATE %token T_VAR %token T_UNSET %token T_ISSET @@ -421,6 +422,7 @@ class_decleration_type: T_VAR { $$.op_type = T_VAR; } | T_STATIC { $$.op_type = T_STATIC; } + | T_PRIVATE { $$.op_type = T_PRIVATE; } ; class_constant_decleration: Index: ZendEngine2/zend_language_scanner.l diff -u ZendEngine2/zend_language_scanner.l:1.46 ZendEngine2/zend_language_scanner.l:1.47 --- ZendEngine2/zend_language_scanner.l:1.46 Sun Jan 6 10:21:36 2002 +++ ZendEngine2/zend_language_scanner.l Thu Feb 21 06:50:43 2002 @@ -705,6 +705,10 @@ return T_STATIC; } +<ST_IN_SCRIPTING>"private" { + return T_PRIVATE; +} + <ST_IN_SCRIPTING>"unset" { return T_UNSET; } Index: ZendEngine2/zend_object_handlers.c diff -u ZendEngine2/zend_object_handlers.c:1.1 ZendEngine2/zend_object_handlers.c:1.2 --- ZendEngine2/zend_object_handlers.c:1.1 Thu Feb 7 09:08:43 2002 +++ ZendEngine2/zend_object_handlers.c Thu Feb 21 06:50:44 2002 @@ -5,7 +5,7 @@ #include "zend_objects.h" #include "zend_object_handlers.h" -#define DEBUG_OBJECT_HANDLERS 1 +#define DEBUG_OBJECT_HANDLERS 0 static HashTable *zend_std_get_properties(zval *object TSRMLS_DC) { Index: ZendEngine2/zend_opcode.c diff -u ZendEngine2/zend_opcode.c:1.64 ZendEngine2/zend_opcode.c:1.65 --- ZendEngine2/zend_opcode.c:1.64 Fri Jan 25 07:55:03 2002 +++ ZendEngine2/zend_opcode.c Thu Feb 21 06:50:44 2002 @@ -112,6 +112,7 @@ switch (ce->type) { case ZEND_USER_CLASS: zend_hash_destroy(&ce->default_properties); + zend_hash_destroy(&ce->private_properties); zend_hash_destroy(ce->static_members); efree(ce->name); efree(ce->refcount); @@ -122,6 +123,7 @@ break; case ZEND_INTERNAL_CLASS: zend_hash_destroy(&ce->default_properties); + zend_hash_destroy(&ce->private_properties); zend_hash_destroy(ce->static_members); free(ce->name); free(ce->refcount);
Index: ZendEngine2/zend.c diff -u ZendEngine2/zend.c:1.161 ZendEngine2/zend.c:1.162 --- ZendEngine2/zend.c:1.161 Sun Jan 6 15:30:41 2002 +++ ZendEngine2/zend.c Thu Feb 21 06:50:41 2002 @@ -251,6 +251,7 @@ zend_standard_class_def.name = zend_strndup("stdClass", zend_standard_class_def.name_length); zend_standard_class_def.parent = NULL; zend_hash_init_ex(&zend_standard_class_def.default_properties, 0, NULL, ZVAL_PTR_DTOR, 1, 0); + zend_hash_init_ex(&zend_standard_class_def.private_properties, 0, NULL, ZVAL_PTR_DTOR, 1, 0); zend_standard_class_def.static_members = (HashTable *) malloc(sizeof(HashTable)); zend_hash_init_ex(zend_standard_class_def.static_members, 0, NULL, ZVAL_PTR_DTOR, 1, 0); zend_hash_init_ex(&zend_standard_class_def.constants_table, 0, NULL, ZVAL_PTR_DTOR, 1, 0); Index: ZendEngine2/zend.h diff -u ZendEngine2/zend.h:1.160 ZendEngine2/zend.h:1.161 --- ZendEngine2/zend.h:1.160 Thu Feb 14 04:20:51 2002 +++ ZendEngine2/zend.h Thu Feb 21 06:50:41 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: zend.h,v 1.160 2002/02/14 09:20:51 stas Exp $ */ +/* $Id: zend.h,v 1.161 2002/02/21 11:50:41 andi Exp $ */ #ifndef ZEND_H #define ZEND_H @@ -270,6 +270,7 @@ HashTable function_table; HashTable default_properties; + HashTable private_properties; /* This is only needed at compile-time */ HashTable class_table; HashTable *static_members; HashTable constants_table; Index: ZendEngine2/zend_API.c diff -u ZendEngine2/zend_API.c:1.117 ZendEngine2/zend_API.c:1.118 --- ZendEngine2/zend_API.c:1.117 Thu Feb 14 04:20:51 2002 +++ ZendEngine2/zend_API.c Thu Feb 21 06:50:41 2002 @@ -1224,6 +1224,7 @@ *class_entry->refcount = 1; class_entry->constants_updated = 0; zend_hash_init(&class_entry->default_properties, 0, NULL, ZVAL_PTR_DTOR, 1); + zend_hash_init(&class_entry->private_properties, 0, NULL, ZVAL_PTR_DTOR, 1); class_entry->static_members = (HashTable *) malloc(sizeof(HashTable)); zend_hash_init(class_entry->static_members, 0, NULL, ZVAL_PTR_DTOR, 1); zend_hash_init(&class_entry->constants_table, 0, NULL, ZVAL_PTR_DTOR, 1); Index: ZendEngine2/zend_compile.c diff -u ZendEngine2/zend_compile.c:1.270 ZendEngine2/zend_compile.c:1.271 --- ZendEngine2/zend_compile.c:1.270 Wed Feb 13 23:01:53 2002 +++ ZendEngine2/zend_compile.c Thu Feb 21 06:50:42 2002 @@ -1366,6 +1366,7 @@ zend_hash_init(&new_class_entry.function_table, 10, NULL, ZEND_FUNCTION_DTOR, 0); zend_hash_init(&new_class_entry.class_table, 10, NULL, ZEND_CLASS_DTOR, 0); zend_hash_init(&new_class_entry.default_properties, 10, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_init(&new_class_entry.private_properties, 10, NULL, ZVAL_PTR_DTOR, 0); ALLOC_HASHTABLE(new_class_entry.static_members); zend_hash_init(new_class_entry.static_members, 10, NULL, ZVAL_PTR_DTOR, 0); zend_hash_init(&new_class_entry.constants_table, 10, NULL, ZVAL_PTR_DTOR, 0); @@ -1520,6 +1521,7 @@ (*ce->refcount)--; zend_hash_destroy(&ce->function_table); zend_hash_destroy(&ce->default_properties); + zend_hash_destroy(&ce->private_properties); zend_hash_destroy(ce->static_members); zend_hash_destroy(&ce->constants_table); return FAILURE; @@ -1856,6 +1858,7 @@ zend_hash_init(&new_class_entry.function_table, 10, NULL, ZEND_FUNCTION_DTOR, 0); zend_hash_init(&new_class_entry.class_table, 10, NULL, ZEND_CLASS_DTOR, 0); zend_hash_init(&new_class_entry.default_properties, 10, NULL, ZVAL_PTR_DTOR, 0); + zend_hash_init(&new_class_entry.private_properties, 10, NULL, ZVAL_PTR_DTOR, 0); ALLOC_HASHTABLE(new_class_entry.static_members); zend_hash_init(new_class_entry.static_members, 10, NULL, ZVAL_PTR_DTOR, 0); zend_hash_init(&new_class_entry.constants_table, 10, NULL, ZVAL_PTR_DTOR, 0); @@ -1963,6 +1966,20 @@ } } +void mangle_private_property_name(char **dest, int *dest_length, char *src1, int src1_length, char *src2, int src2_length) +{ + char *priv_name; + int priv_name_length; + + priv_name_length = 1 + src1_length + 1 + src2_length; + priv_name = emalloc(priv_name_length+1); + priv_name[0] = '\0'; + memcpy(priv_name + 1, src1, src1_length+1); + memcpy(priv_name + 1 + src1_length + 1, src2, src2_length+1); + + *dest = priv_name; + *dest_length = priv_name_length; +} void zend_do_declare_property(znode *var_name, znode *value, int declaration_type TSRMLS_DC) { @@ -1978,6 +1995,19 @@ } switch (declaration_type) { + case T_PRIVATE: + { + char *priv_name; + int priv_name_length; + + mangle_private_property_name(&priv_name, &priv_name_length, CG(active_class_entry)->name, CG(active_class_entry)->name_length, var_name->u.constant.value.str.val, var_name->u.constant.value.str.len); + zend_hash_update(&CG(active_class_entry)->default_properties, priv_name, priv_name_length+1, &property, sizeof(zval *), NULL); + efree(priv_name); + + property->refcount++; + zend_hash_update(&CG(active_class_entry)->private_properties, var_name->u.constant.value.str.val, var_name->u.constant.value.str.len+1, &property, sizeof(zval *), NULL); + break; + } case T_VAR: zend_hash_update(&CG(active_class_entry)->default_properties, var_name->u.constant.value.str.val, var_name->u.constant.value.str.len+1, &property, sizeof(zval *), NULL); break; @@ -2009,6 +2039,17 @@ opline_ptr->op1 = *property; SET_UNUSED(opline_ptr->op2); opline_ptr->op2.u.EA.type = ZEND_FETCH_FROM_THIS; + + if ((opline_ptr->op1.op_type == IS_CONST) && zend_hash_exists(&CG(active_class_entry)->private_properties, opline_ptr->op1.u.constant.value.str.val, opline_ptr->op1.u.constant.value.str.len+1)) { + char *priv_name; + int priv_name_length; + + mangle_private_property_name(&priv_name, &priv_name_length, CG(active_class_entry)->name, CG(active_class_entry)->name_length, opline_ptr->op1.u.constant.value.str.val, opline_ptr->op1.u.constant.value.str.len); + + STR_FREE(opline_ptr->op1.u.constant.value.str.val); + opline_ptr->op1.u.constant.value.str.val = priv_name; + opline_ptr->op1.u.constant.value.str.len = priv_name_length; + } *result = opline_ptr->result; return; Index: ZendEngine2/zend_language_parser.y diff -u ZendEngine2/zend_language_parser.y:1.47 ZendEngine2/zend_language_parser.y:1.48 --- ZendEngine2/zend_language_parser.y:1.47 Wed Feb 13 14:26:07 2002 +++ ZendEngine2/zend_language_parser.y Thu Feb 21 06:50:43 2002 @@ -111,6 +111,7 @@ %token T_USE %token T_GLOBAL %token T_STATIC +%token T_PRIVATE %token T_VAR %token T_UNSET %token T_ISSET @@ -421,6 +422,7 @@ class_decleration_type: T_VAR { $$.op_type = T_VAR; } | T_STATIC { $$.op_type = T_STATIC; } + | T_PRIVATE { $$.op_type = T_PRIVATE; } ; class_constant_decleration: Index: ZendEngine2/zend_language_scanner.l diff -u ZendEngine2/zend_language_scanner.l:1.46 ZendEngine2/zend_language_scanner.l:1.47 --- ZendEngine2/zend_language_scanner.l:1.46 Sun Jan 6 10:21:36 2002 +++ ZendEngine2/zend_language_scanner.l Thu Feb 21 06:50:43 2002 @@ -705,6 +705,10 @@ return T_STATIC; } +<ST_IN_SCRIPTING>"private" { + return T_PRIVATE; +} + <ST_IN_SCRIPTING>"unset" { return T_UNSET; } Index: ZendEngine2/zend_object_handlers.c diff -u ZendEngine2/zend_object_handlers.c:1.1 ZendEngine2/zend_object_handlers.c:1.2 --- ZendEngine2/zend_object_handlers.c:1.1 Thu Feb 7 09:08:43 2002 +++ ZendEngine2/zend_object_handlers.c Thu Feb 21 06:50:44 2002 @@ -5,7 +5,7 @@ #include "zend_objects.h" #include "zend_object_handlers.h" -#define DEBUG_OBJECT_HANDLERS 1 +#define DEBUG_OBJECT_HANDLERS 0 static HashTable *zend_std_get_properties(zval *object TSRMLS_DC) { Index: ZendEngine2/zend_opcode.c diff -u ZendEngine2/zend_opcode.c:1.64 ZendEngine2/zend_opcode.c:1.65 --- ZendEngine2/zend_opcode.c:1.64 Fri Jan 25 07:55:03 2002 +++ ZendEngine2/zend_opcode.c Thu Feb 21 06:50:44 2002 @@ -112,6 +112,7 @@ switch (ce->type) { case ZEND_USER_CLASS: zend_hash_destroy(&ce->default_properties); + zend_hash_destroy(&ce->private_properties); zend_hash_destroy(ce->static_members); efree(ce->name); efree(ce->refcount); @@ -122,6 +123,7 @@ break; case ZEND_INTERNAL_CLASS: zend_hash_destroy(&ce->default_properties); + zend_hash_destroy(&ce->private_properties); zend_hash_destroy(ce->static_members); free(ce->name); free(ce->refcount);