This patch allows php extension authors to declare constants on internal objects. This pretty much just duplicates the zend_declare_property_* functions but for constants. Currently there is no way for C level class authors to declare constants on their objects since the engine has to allocate space for them.
Bob Silva
diff -ur php5.orig/Zend/zend_API.c php5/Zend/zend_API.c --- php5.orig/Zend/zend_API.c 2004-09-28 14:45:40.000000000 -0700 +++ php5/Zend/zend_API.c 2004-09-28 14:52:45.000000000 -0700 @@ -2037,6 +2037,67 @@ return value; } +ZEND_API int zend_declare_constant(zend_class_entry *ce, char *name, int name_length, zval *constant TSRMLS_DC) +{ + + switch(Z_TYPE_P(constant)) { + case IS_ARRAY: + case IS_CONSTANT_ARRAY: + case IS_OBJECT: + case IS_RESOURCE: + zend_error(E_CORE_ERROR, "Internal zval's can't be arrays, objects or resources"); + break; + default: + break; + } + + zend_hash_update(&(ce)->constants_table, name, name_length+1, &constant, sizeof(zval *), NULL); + return SUCCESS; +} + +ZEND_API int zend_declare_constant_null(zend_class_entry *ce, char *name, int name_length TSRMLS_DC) +{ + zval *constant; + + if (ce->type & ZEND_INTERNAL_CLASS) { + constant = malloc(sizeof(zval)); + } else { + ALLOC_ZVAL(constant); + } + INIT_ZVAL(*constant); + return zend_declare_constant(ce, name, name_length, constant TSRMLS_CC); +} + +ZEND_API int zend_declare_constant_long(zend_class_entry *ce, char *name, int name_length, long value TSRMLS_DC) +{ + zval *constant; + + if (ce->type & ZEND_INTERNAL_CLASS) { + constant = malloc(sizeof(zval)); + } else { + ALLOC_ZVAL(constant); + } + INIT_PZVAL(constant); + ZVAL_LONG(constant, value); + return zend_declare_constant(ce, name, name_length, constant TSRMLS_CC); +} + +ZEND_API int zend_declare_constant_string(zend_class_entry *ce, char *name, int name_length, char *value TSRMLS_DC) +{ + zval *constant; + int len = strlen(value); + + if (ce->type & ZEND_INTERNAL_CLASS) { + constant = malloc(sizeof(zval)); + ZVAL_STRINGL(constant, zend_strndup(value, len), len, 0); + } else { + ALLOC_ZVAL(constant); + ZVAL_STRINGL(constant, value, len, 1); + } + INIT_PZVAL(constant); + return zend_declare_constant(ce, name, name_length, constant TSRMLS_CC); +} + /* * Local variables: * tab-width: 4 diff -ur php5.orig/Zend/zend_API.h php5/Zend/zend_API.h --- php5.orig/Zend/zend_API.h 2004-09-28 14:45:40.000000000 -0700 +++ php5/Zend/zend_API.h 2004-09-28 14:46:04.000000000 -0700 @@ -195,6 +195,11 @@ ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, char *name, int name_length, zend_bool silent TSRMLS_DC); +ZEND_API int zend_declare_constant(zend_class_entry *ce, char *name, int name_length, zval *property TSRMLS_DC); +ZEND_API int zend_declare_constant_null(zend_class_entry *ce, char *name, int name_length TSRMLS_DC); +ZEND_API int zend_declare_constant_long(zend_class_entry *ce, char *name, int name_length, long value TSRMLS_DC); +ZEND_API int zend_declare_constant_string(zend_class_entry *ce, char *name, int name_length, char *value TSRMLS_DC); + ZEND_API zend_class_entry *zend_get_class_entry(zval *zobject TSRMLS_DC); #define getThis() (this_ptr)
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php