1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Add zend_object_alloc() API

Using ecalloc() to create objects is expensive, because the
dynamic-size memset() is unreasonably slow. Make sure we only
zero the main object structure with known size, as the properties
are intialized separately anyway.

Technically we do not need to zero the embedded zend_object
structure either, but as long as the memset argument is constant,
a couple more bytes don't really matter.
This commit is contained in:
Nikita Popov
2017-11-25 16:07:51 +01:00
parent 8795893f4f
commit b72b1a4e4d
31 changed files with 53 additions and 59 deletions

View File

@@ -86,6 +86,15 @@ static zend_always_inline size_t zend_object_properties_size(zend_class_entry *c
((ce->ce_flags & ZEND_ACC_USE_GUARDS) ? 0 : 1));
}
/* Allocates object type and zeros it, but not the properties.
* Properties MUST be initialized using object_properties_init(). */
static zend_always_inline void *zend_object_alloc(size_t obj_size, zend_class_entry *ce) {
void *obj = emalloc(obj_size + zend_object_properties_size(ce));
memset(obj, 0, obj_size);
return obj;
}
#endif /* ZEND_OBJECTS_H */
/*

View File

@@ -2187,9 +2187,7 @@ static void date_register_classes(void) /* {{{ */
static inline zend_object *date_object_new_date_ex(zend_class_entry *class_type, int init_props) /* {{{ */
{
php_date_obj *intern;
intern = ecalloc(1, sizeof(php_date_obj) + zend_object_properties_size(class_type));
php_date_obj *intern = zend_object_alloc(sizeof(php_date_obj), class_type);
zend_object_std_init(&intern->std, class_type);
if (init_props) {
@@ -2318,9 +2316,7 @@ static HashTable *date_object_get_properties(zval *object) /* {{{ */
static inline zend_object *date_object_new_timezone_ex(zend_class_entry *class_type, int init_props) /* {{{ */
{
php_timezone_obj *intern;
intern = ecalloc(1, sizeof(php_timezone_obj) + zend_object_properties_size(class_type));
php_timezone_obj *intern = zend_object_alloc(sizeof(php_timezone_obj), class_type);
zend_object_std_init(&intern->std, class_type);
if (init_props) {
@@ -2409,9 +2405,7 @@ static HashTable *date_object_get_properties_timezone(zval *object) /* {{{ */
static inline zend_object *date_object_new_interval_ex(zend_class_entry *class_type, int init_props) /* {{{ */
{
php_interval_obj *intern;
intern = ecalloc(1, sizeof(php_interval_obj) + zend_object_properties_size(class_type));
php_interval_obj *intern = zend_object_alloc(sizeof(php_interval_obj), class_type);
zend_object_std_init(&intern->std, class_type);
if (init_props) {
@@ -2495,9 +2489,7 @@ static HashTable *date_object_get_properties_interval(zval *object) /* {{{ */
static inline zend_object *date_object_new_period_ex(zend_class_entry *class_type, int init_props) /* {{{ */
{
php_period_obj *intern;
intern = ecalloc(1, sizeof(php_period_obj) + zend_object_properties_size(class_type));
php_period_obj *intern = zend_object_alloc(sizeof(php_period_obj), class_type);
zend_object_std_init(&intern->std, class_type);
if (init_props) {

View File

@@ -1075,7 +1075,7 @@ void dom_namednode_iter(dom_object *basenode, int ntype, dom_object *intern, xml
static dom_object* dom_objects_set_class(zend_class_entry *class_type, zend_bool hash_copy) /* {{{ */
{
dom_object *intern = ecalloc(1, sizeof(dom_object) + zend_object_properties_size(class_type));
dom_object *intern = zend_object_alloc(sizeof(dom_object), class_type);
zend_class_entry *base_class = class_type;
while ((base_class->type != ZEND_INTERNAL_CLASS || base_class->info.internal.module->module_number != dom_module_entry.module_number) && base_class->parent != NULL) {
@@ -1106,7 +1106,7 @@ zend_object *dom_objects_new(zend_class_entry *class_type)
/* {{{ zend_object dom_xpath_objects_new(zend_class_entry *class_type) */
zend_object *dom_xpath_objects_new(zend_class_entry *class_type)
{
dom_xpath_object *intern = ecalloc(1, sizeof(dom_xpath_object) + zend_object_properties_size(class_type));
dom_xpath_object *intern = zend_object_alloc(sizeof(dom_xpath_object), class_type);
intern->registered_phpfunctions = zend_new_array(0);

View File

@@ -100,7 +100,7 @@ PHP_FILEINFO_API zend_object *finfo_objects_new(zend_class_entry *class_type)
{
finfo_object *intern;
intern = ecalloc(1, sizeof(finfo_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(finfo_object), class_type);
zend_object_std_init(&intern->zo, class_type);
object_properties_init(&intern->zo, class_type);

View File

@@ -1106,11 +1106,11 @@ PHP_FUNCTION(mhash_keygen_s2k)
/* {{{ php_hashcontext_create */
static zend_object* php_hashcontext_create(zend_class_entry *ce) {
php_hashcontext_object *objval = ecalloc(1,
sizeof(php_hashcontext_object) + zend_object_properties_size(ce));
zend_object *zobj = &(objval->std);
php_hashcontext_object *objval = zend_object_alloc(sizeof(php_hashcontext_object), ce);
zend_object *zobj = &objval->std;
zend_object_std_init(zobj, ce);
object_properties_init(zobj, ce);
zobj->handlers = &php_hashcontext_handlers;
return zobj;

View File

@@ -49,9 +49,7 @@ void Collator_objects_free(zend_object *object )
/* {{{ Collator_object_create */
zend_object *Collator_object_create(zend_class_entry *ce )
{
Collator_object* intern;
intern = ecalloc(1, sizeof(Collator_object) + zend_object_properties_size(ce));
Collator_object *intern = zend_object_alloc(sizeof(Collator_object), ce);
intl_error_init(COLLATOR_ERROR_P(intern));
zend_object_std_init(&intern->zo, ce );
object_properties_init(&intern->zo, ce);

View File

@@ -1018,9 +1018,10 @@ static void php_converter_dtor_object(zend_object *obj) {
static zend_object *php_converter_object_ctor(zend_class_entry *ce, php_converter_object **pobjval) {
php_converter_object *objval;
objval = ecalloc(1, sizeof(php_converter_object) + zend_object_properties_size(ce));
objval = zend_object_alloc(sizeof(php_converter_object), ce);
zend_object_std_init(&objval->obj, ce );
zend_object_std_init(&objval->obj, ce);
object_properties_init(&objval->obj, ce);
intl_error_init(&(objval->error));
objval->obj.handlers = &php_converter_object_handlers;

View File

@@ -61,7 +61,7 @@ zend_object *IntlDateFormatter_object_create(zend_class_entry *ce)
{
IntlDateFormatter_object* intern;
intern = ecalloc( 1, sizeof(IntlDateFormatter_object) + zend_object_properties_size(ce));
intern = zend_object_alloc(sizeof(IntlDateFormatter_object), ce);
dateformat_data_init( &intern->datef_data );
zend_object_std_init( &intern->zo, ce );
object_properties_init(&intern->zo, ce);
@@ -70,7 +70,6 @@ zend_object *IntlDateFormatter_object_create(zend_class_entry *ce)
intern->calendar = -1;
intern->requested_locale = NULL;
intern->zo.handlers = &IntlDateFormatter_handlers;
return &intern->zo;

View File

@@ -49,7 +49,7 @@ zend_object *NumberFormatter_object_create(zend_class_entry *ce)
{
NumberFormatter_object* intern;
intern = ecalloc( 1, sizeof(NumberFormatter_object) + zend_object_properties_size(ce));
intern = zend_object_alloc(sizeof(NumberFormatter_object), ce);
formatter_data_init( &intern->nf_data );
zend_object_std_init( &intern->zo, ce );
object_properties_init(&intern->zo, ce);

View File

@@ -49,7 +49,7 @@ zend_object *MessageFormatter_object_create(zend_class_entry *ce)
{
MessageFormatter_object* intern;
intern = ecalloc( 1, sizeof(MessageFormatter_object) + zend_object_properties_size(ce));
intern = zend_object_alloc(sizeof(MessageFormatter_object), ce);
msgformat_data_init( &intern->mf_data );
zend_object_std_init( &intern->zo, ce );
object_properties_init(&intern->zo, ce);

View File

@@ -57,7 +57,7 @@ static zend_object *ResourceBundle_object_create( zend_class_entry *ce )
{
ResourceBundle_object *rb;
rb = ecalloc( 1, sizeof(ResourceBundle_object) + zend_object_properties_size(ce));
rb = zend_object_alloc(sizeof(ResourceBundle_object), ce);
zend_object_std_init( &rb->zend, ce );
object_properties_init( &rb->zend, ce);

View File

@@ -41,12 +41,11 @@ void Spoofchecker_objects_free(zend_object *object)
/* }}} */
/* {{{ Spoofchecker_object_create */
zend_object *Spoofchecker_object_create(
zend_class_entry *ce)
zend_object *Spoofchecker_object_create(zend_class_entry *ce)
{
Spoofchecker_object* intern;
intern = ecalloc(1, sizeof(Spoofchecker_object) + zend_object_properties_size(ce));
intern = zend_object_alloc(sizeof(Spoofchecker_object), ce);
intl_error_init(SPOOFCHECKER_ERROR_P(intern));
zend_object_std_init(&intern->zo, ce);
object_properties_init(&intern->zo, ce);

View File

@@ -109,12 +109,11 @@ static void Transliterator_objects_free( zend_object *object )
/* }}} */
/* {{{ Transliterator_object_create */
static zend_object *Transliterator_object_create(
zend_class_entry *ce )
static zend_object *Transliterator_object_create( zend_class_entry *ce )
{
Transliterator_object* intern;
intern = ecalloc( 1, sizeof( Transliterator_object ) + zend_object_properties_size(ce));
intern = zend_object_alloc(sizeof(Transliterator_object), ce);
zend_object_std_init( &intern->zo, ce );
object_properties_init( &intern->zo, ce );

View File

@@ -448,7 +448,7 @@ PHP_MYSQLI_EXPORT(zend_object *) mysqli_objects_new(zend_class_entry *class_type
zend_class_entry *mysqli_base_class;
zend_object_handlers *handlers;
intern = ecalloc(1, sizeof(mysqli_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(mysqli_object), class_type);
mysqli_base_class = class_type;
while (mysqli_base_class->type != ZEND_INTERNAL_CLASS &&

View File

@@ -1554,7 +1554,7 @@ zend_object *pdo_dbh_new(zend_class_entry *ce)
{
pdo_dbh_object_t *dbh;
dbh = ecalloc(1, sizeof(pdo_dbh_object_t) + zend_object_properties_size(ce));
dbh = zend_object_alloc(sizeof(pdo_dbh_object_t), ce);
zend_object_std_init(&dbh->std, ce);
object_properties_init(&dbh->std, ce);
rebuild_object_properties(&dbh->std);

View File

@@ -2267,7 +2267,7 @@ static zend_object *dbstmt_clone_obj(zval *zobject)
pdo_stmt_t *stmt;
pdo_stmt_t *old_stmt;
stmt = ecalloc(1, sizeof(pdo_stmt_t) + zend_object_properties_size(Z_OBJCE_P(zobject)));
stmt = zend_object_alloc(sizeof(pdo_stmt_t), Z_OBJCE_P(zobject));
zend_object_std_init(&stmt->std, Z_OBJCE_P(zobject));
object_properties_init(&stmt->std, Z_OBJCE_P(zobject));
@@ -2375,7 +2375,7 @@ zend_object *pdo_dbstmt_new(zend_class_entry *ce)
{
pdo_stmt_t *stmt;
stmt = ecalloc(1, sizeof(pdo_stmt_t) + zend_object_properties_size(ce));
stmt = zend_object_alloc(sizeof(pdo_stmt_t), ce);
zend_object_std_init(&stmt->std, ce);
object_properties_init(&stmt->std, ce);

View File

@@ -270,10 +270,7 @@ static HashTable *reflection_get_gc(zval *obj, zval **gc_data, int *gc_data_coun
static zend_object *reflection_objects_new(zend_class_entry *class_type) /* {{{ */
{
reflection_object *intern;
intern = ecalloc(1, sizeof(reflection_object) + zend_object_properties_size(class_type));
intern->zo.ce = class_type;
reflection_object *intern = zend_object_alloc(sizeof(reflection_object), class_type);
zend_object_std_init(&intern->zo, class_type);
object_properties_init(&intern->zo, class_type);

View File

@@ -2166,7 +2166,7 @@ static php_sxe_object* php_sxe_object_new(zend_class_entry *ce, zend_function *f
{
php_sxe_object *intern;
intern = ecalloc(1, sizeof(php_sxe_object) + zend_object_properties_size(ce));
intern = zend_object_alloc(sizeof(php_sxe_object), ce);
intern->iter.type = SXE_ITER_NONE;
intern->iter.nsprefix = NULL;

View File

@@ -475,7 +475,7 @@ static zend_object *php_snmp_object_new(zend_class_entry *class_type) /* {{{ */
php_snmp_object *intern;
/* Allocate memory for it */
intern = ecalloc(1, sizeof(php_snmp_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(php_snmp_object), class_type);
zend_object_std_init(&intern->zo, class_type);
object_properties_init(&intern->zo, class_type);

View File

@@ -173,7 +173,7 @@ static zend_object *spl_array_object_new_ex(zend_class_entry *class_type, zval *
zend_class_entry *parent = class_type;
int inherited = 0;
intern = ecalloc(1, sizeof(spl_array_object) + zend_object_properties_size(parent));
intern = zend_object_alloc(sizeof(spl_array_object), parent);
zend_object_std_init(&intern->std, class_type);
object_properties_init(&intern->std, class_type);

View File

@@ -157,7 +157,7 @@ static zend_object *spl_filesystem_object_new_ex(zend_class_entry *class_type)
{
spl_filesystem_object *intern;
intern = ecalloc(1, sizeof(spl_filesystem_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(spl_filesystem_object), class_type);
/* intern->type = SPL_FS_INFO; done by set 0 */
intern->file_class = spl_ce_SplFileObject;
intern->info_class = spl_ce_SplFileInfo;

View File

@@ -373,7 +373,7 @@ static zend_object *spl_dllist_object_new_ex(zend_class_entry *class_type, zval
zend_class_entry *parent = class_type;
int inherited = 0;
intern = ecalloc(1, sizeof(spl_dllist_object) + zend_object_properties_size(parent));
intern = zend_object_alloc(sizeof(spl_dllist_object), parent);
zend_object_std_init(&intern->std, class_type);
object_properties_init(&intern->std, class_type);

View File

@@ -210,7 +210,7 @@ static zend_object *spl_fixedarray_object_new_ex(zend_class_entry *class_type, z
zend_class_entry *parent = class_type;
int inherited = 0;
intern = ecalloc(1, sizeof(spl_fixedarray_object) + zend_object_properties_size(parent));
intern = zend_object_alloc(sizeof(spl_fixedarray_object), parent);
zend_object_std_init(&intern->std, class_type);
object_properties_init(&intern->std, class_type);

View File

@@ -363,7 +363,7 @@ static zend_object *spl_heap_object_new_ex(zend_class_entry *class_type, zval *o
zend_class_entry *parent = class_type;
int inherited = 0;
intern = ecalloc(1, sizeof(spl_heap_object) + zend_object_properties_size(parent));
intern = zend_object_alloc(sizeof(spl_heap_object), parent);
zend_object_std_init(&intern->std, class_type);
object_properties_init(&intern->std, class_type);

View File

@@ -961,7 +961,7 @@ static zend_object *spl_RecursiveIteratorIterator_new_ex(zend_class_entry *class
{
spl_recursive_it_object *intern;
intern = ecalloc(1, sizeof(spl_recursive_it_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(spl_recursive_it_object), class_type);
if (init_prefix) {
smart_str_appendl(&intern->prefix[0], "", 0);
@@ -2360,7 +2360,7 @@ static zend_object *spl_dual_it_new(zend_class_entry *class_type)
{
spl_dual_it_object *intern;
intern = ecalloc(1, sizeof(spl_dual_it_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(spl_dual_it_object), class_type);
intern->dit_type = DIT_Unknown;
zend_object_std_init(&intern->std, class_type);

View File

@@ -2204,7 +2204,7 @@ static zend_object *php_sqlite3_object_new(zend_class_entry *class_type) /* {{{
php_sqlite3_db_object *intern;
/* Allocate memory for it */
intern = ecalloc(1, sizeof(php_sqlite3_db_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(php_sqlite3_db_object), class_type);
/* Need to keep track of things to free */
zend_llist_init(&(intern->free_list), sizeof(php_sqlite3_free_list *), (llist_dtor_func_t)php_sqlite3_free_list_dtor, 0);
@@ -2223,7 +2223,7 @@ static zend_object *php_sqlite3_stmt_object_new(zend_class_entry *class_type) /*
php_sqlite3_stmt *intern;
/* Allocate memory for it */
intern = ecalloc(1, sizeof(php_sqlite3_stmt) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(php_sqlite3_stmt), class_type);
zend_object_std_init(&intern->zo, class_type);
object_properties_init(&intern->zo, class_type);
@@ -2239,7 +2239,7 @@ static zend_object *php_sqlite3_result_object_new(zend_class_entry *class_type)
php_sqlite3_result *intern;
/* Allocate memory for it */
intern = ecalloc(1, sizeof(php_sqlite3_result) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(php_sqlite3_result), class_type);
zend_object_std_init(&intern->zo, class_type);
object_properties_init(&intern->zo, class_type);

View File

@@ -685,7 +685,7 @@ static zend_object *tidy_object_new(zend_class_entry *class_type, zend_object_ha
{
PHPTidyObj *intern;
intern = ecalloc(1, sizeof(PHPTidyObj) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(PHPTidyObj), class_type);
zend_object_std_init(&intern->std, class_type);
object_properties_init(&intern->std, class_type);

View File

@@ -389,7 +389,7 @@ zend_object *xmlreader_objects_new(zend_class_entry *class_type)
{
xmlreader_object *intern;
intern = ecalloc(1, sizeof(xmlreader_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(xmlreader_object), class_type);
zend_object_std_init(&intern->std, class_type);
object_properties_init(&intern->std, class_type);
intern->prop_handler = &xmlreader_prop_handlers;

View File

@@ -141,7 +141,7 @@ static zend_object *xmlwriter_object_new(zend_class_entry *class_type)
{
ze_xmlwriter_object *intern;
intern = ecalloc(1, sizeof(ze_xmlwriter_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(ze_xmlwriter_object), class_type);
zend_object_std_init(&intern->std, class_type);
object_properties_init(&intern->std, class_type);
intern->std.handlers = &xmlwriter_object_handlers;

View File

@@ -108,7 +108,7 @@ zend_object *xsl_objects_new(zend_class_entry *class_type)
{
xsl_object *intern;
intern = ecalloc(1, sizeof(xsl_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(xsl_object), class_type);
intern->securityPrefs = XSL_SECPREF_DEFAULT;
zend_object_std_init(&intern->std, class_type);

View File

@@ -1064,7 +1064,7 @@ static zend_object *php_zip_object_new(zend_class_entry *class_type) /* {{{ */
{
ze_zip_object *intern;
intern = ecalloc(1, sizeof(ze_zip_object) + zend_object_properties_size(class_type));
intern = zend_object_alloc(sizeof(ze_zip_object), class_type);
intern->prop_handler = &zip_prop_handlers;
zend_object_std_init(&intern->zo, class_type);
object_properties_init(&intern->zo, class_type);