@@ -67,6 +67,10 @@ ZEND_BEGIN_ARG_INFO_EX(gene_view_arg_assign, 0, 0, 1)
67
67
ZEND_END_ARG_INFO ()
68
68
69
69
70
+ ZEND_BEGIN_ARG_INFO_EX (gene_view_arg_scope , 0 , 0 , 1 )
71
+ ZEND_ARG_INFO (0 , num )
72
+ ZEND_END_ARG_INFO ()
73
+
70
74
/** {{{ gene_view_contains
71
75
*/
72
76
void gene_view_contains (char * file , zval * ret ) {
@@ -316,35 +320,62 @@ static int parser_templates(php_stream **stream, char *compile_path) {
316
320
* {{{ int gene_view_clear_vars()
317
321
*/
318
322
void gene_view_clear_vars () {
319
- zend_update_static_property_null (gene_view_ce , ZEND_STRL (GENE_VIEW_VARS ));
323
+ zval * no = NULL , * vars = NULL ;
324
+ vars = zend_read_static_property (gene_view_ce , GENE_VIEW_VARS , strlen (GENE_VIEW_VARS ), 1 );
325
+ if (Z_TYPE_P (vars ) == IS_ARRAY ) {
326
+ no = zend_read_static_property (gene_view_ce , GENE_VIEW_VERSION_NO , strlen (GENE_VIEW_VERSION_NO ), 1 );
327
+ zend_long num = Z_LVAL_P (no );
328
+ zend_hash_index_del (Z_ARRVAL_P (vars ), num );
329
+ }
320
330
}
321
331
/* }}} */
322
332
323
333
/*
324
334
* {{{ int gene_view_get_vars()
325
335
*/
326
336
zval * gene_view_get_vars () {
327
- return zend_read_static_property (gene_view_ce , GENE_VIEW_VARS , strlen (GENE_VIEW_VARS ), 1 );
337
+ zval * no = NULL , * vars = NULL , * nodata = NULL ;
338
+ no = zend_read_static_property (gene_view_ce , GENE_VIEW_VERSION_NO , strlen (GENE_VIEW_VERSION_NO ), 1 );
339
+ zend_long num = Z_LVAL_P (no );
340
+ vars = zend_read_static_property (gene_view_ce , GENE_VIEW_VARS , strlen (GENE_VIEW_VARS ), 1 );
341
+ if (Z_TYPE_P (vars ) != IS_ARRAY ) {
342
+ return NULL ;
343
+ }
344
+ nodata = zend_hash_index_find (Z_ARRVAL_P (vars ), num );
345
+ return Z_TYPE_P (nodata ) == IS_ARRAY ? nodata : NULL ;
328
346
}
329
347
/* }}} */
330
348
331
349
/*
332
350
* {{{ int gene_view_set_vars(zend_string *name, zval *value)
333
351
*/
334
352
int gene_view_set_vars (zend_string * name , zval * value ) {
335
- zval * vars = NULL ;
353
+ zval * vars = NULL , * no = NULL , * nodata = NULL ;
336
354
vars = zend_read_static_property (gene_view_ce , GENE_VIEW_VARS , strlen (GENE_VIEW_VARS ), 1 );
355
+ no = zend_read_static_property (gene_view_ce , GENE_VIEW_VERSION_NO , strlen (GENE_VIEW_VERSION_NO ), 1 );
356
+ zend_long num = Z_LVAL_P (no );
337
357
338
- if (Z_TYPE_P (vars ) == IS_ARRAY ) {
339
- Z_TRY_ADDREF_P (value );
340
- zend_hash_update (Z_ARRVAL_P (vars ), name , value );
341
- } else {
342
- zval params ;
343
- array_init (& params );
358
+ if (Z_TYPE_P (vars ) != IS_ARRAY ) {
359
+ zval params , nodata_tmp ;
360
+ array_init (& params );
361
+ array_init (& nodata_tmp );
344
362
Z_TRY_ADDREF_P (value );
345
- zend_hash_update (Z_ARRVAL (params ), name , value );
346
- zend_update_static_property (gene_view_ce , GENE_VIEW_VARS , strlen (GENE_VIEW_VARS ), & params );
347
- zval_ptr_dtor (& params );
363
+ zend_hash_update (Z_ARRVAL (nodata_tmp ), name , value );
364
+ zend_hash_index_update (Z_ARRVAL (params ), num , & nodata_tmp );
365
+ zend_update_static_property (gene_view_ce , GENE_VIEW_VARS , strlen (GENE_VIEW_VARS ), & params );
366
+ zval_ptr_dtor (& params );
367
+ } else {
368
+ nodata = zend_hash_index_find (Z_ARRVAL_P (vars ), num );
369
+ if (nodata == NULL || Z_TYPE_P (nodata ) != IS_ARRAY ) {
370
+ zval nodata_tmp ;
371
+ array_init (& nodata_tmp );
372
+ Z_TRY_ADDREF_P (value );
373
+ zend_hash_update (Z_ARRVAL (nodata_tmp ), name , value );
374
+ zend_hash_index_update (Z_ARRVAL_P (vars ), num , & nodata_tmp );
375
+ } else {
376
+ Z_TRY_ADDREF_P (value );
377
+ zend_hash_update (Z_ARRVAL_P (nodata ), name , value );
378
+ }
348
379
}
349
380
return 1 ;
350
381
}
@@ -371,7 +402,7 @@ PHP_METHOD(gene_view, display) {
371
402
}
372
403
zval * self = getThis ();
373
404
zval * vars = gene_view_get_vars ();
374
- zend_array * table = (Z_TYPE_P (vars ) == IS_ARRAY ) ? Z_ARRVAL_P (vars ) : NULL ;
405
+ zend_array * table = (vars && Z_TYPE_P (vars ) == IS_ARRAY ) ? Z_ARRVAL_P (vars ) : NULL ;
375
406
376
407
if (parent_file && ZSTR_LEN (parent_file ) > 0 ) {
377
408
if (GENE_G (child_views )) {
@@ -399,7 +430,7 @@ PHP_METHOD(gene_view, displayExt) {
399
430
}
400
431
zval * self = getThis ();
401
432
zval * vars = gene_view_get_vars ();
402
- zend_array * table = (Z_TYPE_P (vars ) == IS_ARRAY ) ? Z_ARRVAL_P (vars ) : NULL ;
433
+ zend_array * table = (vars && Z_TYPE_P (vars ) == IS_ARRAY ) ? Z_ARRVAL_P (vars ) : NULL ;
403
434
404
435
if (parent_file && ZSTR_LEN (parent_file )) {
405
436
if (GENE_G (child_views )) {
@@ -467,6 +498,26 @@ PHP_METHOD(gene_view, __set)
467
498
}
468
499
/* }}} */
469
500
501
+ /*
502
+ * {{{ gene_view
503
+ */
504
+ PHP_METHOD (gene_view , scope )
505
+ {
506
+ zend_long num = 0 ;
507
+ zval * no = NULL ;
508
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "|l" , & num ) == FAILURE ) {
509
+ return ;
510
+ }
511
+ if (num == 0 ) {
512
+ no = zend_read_static_property (gene_view_ce , GENE_VIEW_VERSION_NO , strlen (GENE_VIEW_VERSION_NO ), 1 );
513
+ num = Z_LVAL_P (no );
514
+ num = num + 1 ;
515
+ }
516
+ zend_update_static_property_long (gene_view_ce , GENE_VIEW_VERSION_NO , strlen (GENE_VIEW_VERSION_NO ), num );
517
+ RETURN_TRUE ;
518
+ }
519
+ /* }}} */
520
+
470
521
/*
471
522
* {{{ gene_view
472
523
*/
@@ -506,6 +557,7 @@ zend_function_entry gene_view_methods[] = {
506
557
PHP_ME (gene_view , assign , gene_view_arg_assign , ZEND_ACC_PUBLIC )
507
558
PHP_ME (gene_view , contains , gene_view_void_arginfo , ZEND_ACC_PUBLIC )
508
559
PHP_ME (gene_view , containsExt , gene_view_void_arginfo , ZEND_ACC_PUBLIC )
560
+ PHP_ME (gene_view , scope , gene_view_arg_scope , ZEND_ACC_PUBLIC )
509
561
PHP_ME (gene_view , __get , gene_view_arg_get , ZEND_ACC_PUBLIC )
510
562
PHP_ME (gene_view , __set , gene_view_arg_set , ZEND_ACC_PUBLIC )
511
563
{ NULL ,NULL , NULL }
@@ -521,6 +573,7 @@ GENE_MINIT_FUNCTION(view) {
521
573
gene_view_ce = zend_register_internal_class (& gene_view );
522
574
523
575
zend_declare_property_null (gene_view_ce , GENE_VIEW_VARS , strlen (GENE_VIEW_VARS ), ZEND_ACC_PROTECTED | ZEND_ACC_STATIC );
576
+ zend_declare_property_long (gene_view_ce , GENE_VIEW_VERSION_NO , strlen (GENE_VIEW_VERSION_NO ), 0 , ZEND_ACC_PROTECTED | ZEND_ACC_STATIC );
524
577
return SUCCESS ; // @suppress("Symbol is not resolved")
525
578
}
526
579
/* }}} */
0 commit comments