Changeset 1558 in svn for trunk/processor/processor.m4


Ignore:
Timestamp:
2014-11-10T06:08:07Z (5 years ago)
Author:
Xuefer
Message:

closes #342: object caching

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/processor/processor.m4

    r1546 r1558  
    119119dnl }}}
    120120#endif
     121DEF_STRUCT_P_FUNC(`zend_object', , `dnl {{{
     122    dnl handle ce
     123    dnl IFCALCSTORE(`
     124    dnl     pushdef(`SRC', `ifelse(`$1', `ce', `src->ce->name', `')')
     125    dnl     pushdef(`DST', `ifelse(`$1', `ce', `(*(char **)&dst->ce)', `')')
     126    dnl     PROC_STRING(`ce')
     127    dnl     popdef(`SRC')
     128    dnl     popdef(`DST')
     129    dnl ', `IFRESTORE(`
     130    dnl     if (!(DST(`ce') = xc_lookup_class((const char *) SRC(`ce') TSRMLS_CC))) {
     131    dnl         DST(`ce') = zend_standard_class_def;
     132    dnl         php_error_docref(NULL TSRMLS_CC, E_WARNING, "Class %s not found when restroing variable", (const char *) SRC(`ce'));
     133    dnl     }
     134    dnl     DONE(`ce')
     135    dnl ', `
     136    dnl     PROCESS(zend_ulong, ce)
     137    dnl ')')
     138    IFCALC(`
     139        xc_var_collect_class(processor, SRC(ce) TSRMLS_CC);
     140        DONE(ce)
     141    ', `IFSTORE(`
     142        DST(ce) = (zend_class_entry *) xc_var_ce_to_index(processor, DST(ce) TSRMLS_CC);
     143        DONE(ce)
     144    ', `IFRESTORE(`
     145        DST(ce) = xc_var_index_to_ec(processor, (size_t) DST(ce) TSRMLS_CC);
     146        DONE(ce)
     147    ', `
     148        PROCESS_SCALAR(ce, %lu, unsigned long)
     149    ')')')
     150
     151    STRUCT_P(HashTable, properties, HashTable_zval_ptr)
     152#ifdef ZEND_ENGINE_2_4
     153    dnl TODO: how to rebuild properties_table
     154    STRUCT_ARRAY(int, ce->default_properties_count, zval_ptr, properties_table)
     155#endif
     156#ifdef ZEND_ENGINE_2
     157    COPYNULL(`guards')
     158#endif
     159')
     160dnl }}}
     161#ifdef ZEND_ENGINE_2
     162DEF_STRUCT_P_FUNC(`zend_object_value', , `dnl {{{
     163    IFCALC(`
     164        xc_var_collect_object(processor, SRC(handle) TSRMLS_CC);
     165        DONE(handle)
     166    ', `IFSTORE(`
     167        DST(handle) = (zend_object_handle) xc_var_store_handle(processor, DST(handle) TSRMLS_CC);
     168        DONE(handle)
     169    ', `IFRESTORE(`
     170        DST(handle) = xc_var_restore_handle(processor, (size_t) DST(handle) TSRMLS_CC);
     171        DONE(handle)
     172    ', `
     173        PROCESS(zend_object_handle, handle)
     174    ')')')
     175    COPY(handlers)
     176')
     177dnl }}}
     178#endif
    121179DEF_STRUCT_P_FUNC(`zval', , `dnl {{{
    122180    IFDASM(`do {
     
    142200        switch ((Z_TYPE_P(SRC()) & IS_CONSTANT_TYPE_MASK)) {
    143201            case IS_LONG:
    144             case IS_RESOURCE:
    145202            case IS_BOOL:
    146203                PROCESS(long, value.lval)
     
    196253
    197254            case IS_OBJECT:
    198                 IFNOTMEMCPY(`IFCOPY(`memcpy(DST(), SRC(), sizeof(SRC()[0]));')')
    199                 dnl STRUCT(value.obj)
    200 #ifndef ZEND_ENGINE_2
    201                 STRUCT_P(zend_class_entry, value.obj.ce)
    202                 STRUCT_P(HashTable, value.obj.properties, HashTable_zval_ptr)
     255#ifdef ZEND_ENGINE_2
     256                STRUCT(zend_object_value, value.obj)
     257#else
     258                STRUCT(zend_object, value.obj)
    203259#endif
    204260                break;
    205261
    206262            default:
    207                 assert(0);
     263                /* IS_RESOURCE */
     264                IFCOPY(`Z_TYPE_P(DST()) = IS_LONG;')
     265                PROCESS(long, value.lval)
     266                break;
    208267        }
    209268        ')
     
    13401399dnl }}}
    13411400DEF_STRUCT_P_FUNC(`xc_entry_var_t', , `dnl {{{
     1401    IFCALCSTORE(`xc_entry_var_t *vsrc = /* const_cast */ (xc_entry_var_t *) src;')
     1402
     1403    dnl restore is done in foot.m4
    13421404    STRUCT(xc_entry_t, entry)
    13431405
     
    13691431    IFDPRINT(`INDENT()`'fprintf(stderr, "zval:value");')
    13701432    STRUCT_P_EX(zval_ptr, DST(`value'), SRC(`value'), `value', `', `&')
     1433
     1434#ifdef ZEND_ENGINE_2
     1435    IFCALC(`
     1436        dnl objects = collect_from(value);
     1437        pushdef(`src', `vsrc')
     1438        SRC(objects_count) = xc_vector_size(&processor->objects);
     1439        SRC(objects) = xc_vector_detach(zend_object, &processor->objects);
     1440        popdef(`src')
     1441        xc_vector_destroy(&processor->objects);
     1442        if (SRC(`objects_count')) {
     1443            xc_vector_init(xc_constant_string_t, &processor->class_names, 0);
     1444            zend_hash_init(&processor->class_name_to_index, 0, NULL, NULL, 0);
     1445        }
     1446    ')
     1447    dnl must be after calc .value
     1448    PROCESS(zend_uint, objects_count)
     1449    STRUCT_ARRAY(zend_uint, objects_count, zend_object, objects)
     1450    IFSTORE(`{
     1451        /* no longer needed */
     1452        if (vsrc->objects_count) {
     1453            efree(vsrc->objects);
     1454            vsrc->objects_count = 0;
     1455            vsrc->objects = NULL;
     1456            zend_hash_destroy(&processor->handle_to_index);
     1457        }
     1458    }')
     1459#endif
     1460
     1461    dnl classe_
     1462    IFCALC(`
     1463        dnl class_names = collect_from(objects);
     1464        pushdef(`src', `vsrc')
     1465        SRC(class_names_count) = xc_vector_size(&processor->class_names);
     1466        SRC(class_names) = xc_vector_detach(xc_constant_string_t, &processor->class_names);
     1467        popdef(`src')
     1468        xc_vector_destroy(&processor->class_names);
     1469    ')
     1470    PROCESS(zend_uint, class_names_count)
     1471    STRUCT_ARRAY(zend_uint, class_names_count, xc_constant_string_t, class_names)
     1472    IFSTORE(`
     1473        /* no longer needed */
     1474        if (vsrc->class_names_count) {
     1475            dnl size_t i;
     1476            dnl for (i = 0; i < vsrc->class_names_count; ++i) {
     1477            dnl     efree(vsrc->class_names[i]);
     1478            dnl }
     1479            efree(vsrc->class_names);
     1480            vsrc->class_names_count = 0;
     1481            vsrc->class_names = NULL;
     1482            zend_hash_destroy(&processor->class_name_to_index);
     1483        }
     1484    ')
     1485
    13711486    PROCESS(zend_bool, have_references)
    13721487    DONE(value)
Note: See TracChangeset for help on using the changeset viewer.