@@ -2174,7 +2174,6 @@ static inline void zend_update_jump_target(uint32_t opnum_jump, uint32_t opnum_t
2174
2174
zend_op * opline = & CG (active_op_array )-> opcodes [opnum_jump ];
2175
2175
switch (opline -> opcode ) {
2176
2176
case ZEND_JMP :
2177
- case ZEND_JMP_STATIC_DEF :
2178
2177
opline -> op1 .opline_num = opnum_target ;
2179
2178
break ;
2180
2179
case ZEND_JMPZ :
@@ -2184,6 +2183,7 @@ static inline void zend_update_jump_target(uint32_t opnum_jump, uint32_t opnum_t
2184
2183
case ZEND_JMP_SET :
2185
2184
case ZEND_COALESCE :
2186
2185
case ZEND_JMP_NULL :
2186
+ case ZEND_JMP_STATIC_DEF :
2187
2187
opline -> op2 .opline_num = opnum_target ;
2188
2188
break ;
2189
2189
EMPTY_SWITCH_DEFAULT_CASE ()
@@ -4789,7 +4789,7 @@ static void zend_compile_static_var(zend_ast *ast) /* {{{ */
4789
4789
if (!value_ast ) {
4790
4790
zval value_zv ;
4791
4791
ZVAL_NULL (& value_zv );
4792
- zend_compile_static_var_common (zend_ast_get_str ( var_ast ) , & value_zv , ZEND_BIND_REF );
4792
+ zend_compile_static_var_common (var_name , & value_zv , ZEND_BIND_REF );
4793
4793
} else {
4794
4794
zend_op * opline ;
4795
4795
@@ -4800,31 +4800,43 @@ static void zend_compile_static_var(zend_ast *ast) /* {{{ */
4800
4800
CG (active_op_array )-> static_variables = zend_new_array (8 );
4801
4801
}
4802
4802
4803
+ if (zend_string_equals_literal (var_name , "this" )) {
4804
+ zend_error_noreturn (E_COMPILE_ERROR , "Cannot use $this as static variable" );
4805
+ }
4803
4806
if (zend_hash_exists (CG (active_op_array )-> static_variables , var_name )) {
4804
4807
zend_error_noreturn (E_COMPILE_ERROR , "Duplicate declaration of static variable $%s" , ZSTR_VAL (var_name ));
4805
4808
}
4806
4809
4807
- zval placeholder ;
4808
- ZVAL_UNDEF (& placeholder );
4809
- zval * placeholder_ptr = zend_hash_update (CG (active_op_array )-> static_variables , var_name , & placeholder );
4810
+ zval * placeholder_ptr = zend_hash_update (CG (active_op_array )-> static_variables , var_name , & EG (uninitialized_zval ));
4811
+ Z_TYPE_EXTRA_P (placeholder_ptr ) = IS_TYPE_UNINITIALIZED ;
4810
4812
uint32_t placeholder_offset = (uint32_t )((char * )placeholder_ptr - (char * )CG (active_op_array )-> static_variables -> arData );
4811
4813
4812
- uint32_t jmp_opnum = get_next_op_number ();
4814
+ uint32_t static_def_jmp_opnum = get_next_op_number ();
4813
4815
opline = zend_emit_op (NULL , ZEND_JMP_STATIC_DEF , NULL , NULL );
4814
4816
opline -> extended_value = placeholder_offset ;
4815
4817
4816
4818
znode expr ;
4817
4819
zend_compile_expr (& expr , value_ast );
4818
4820
4819
- opline = zend_emit_op (NULL , ZEND_ASSIGN_STATIC , & expr , NULL );
4820
- opline -> extended_value = placeholder_offset ;
4821
+ opline = zend_emit_op (NULL , ZEND_BIND_STATIC , NULL , NULL );
4822
+ opline -> op1_type = IS_CV ;
4823
+ opline -> op1 .var = lookup_cv (var_name );
4824
+ opline -> extended_value = placeholder_offset | ZEND_BIND_REF ;
4821
4825
4822
- zend_update_jump_target_to_next (jmp_opnum );
4826
+ opline = zend_emit_op (NULL , ZEND_ASSIGN , NULL , & expr );
4827
+ opline -> op1_type = IS_CV ;
4828
+ opline -> op1 .var = lookup_cv (var_name );
4829
+
4830
+ uint32_t skip_bind_static_jmp_opnum = zend_emit_jump (0 );
4831
+
4832
+ zend_update_jump_target_to_next (static_def_jmp_opnum );
4823
4833
4824
4834
opline = zend_emit_op (NULL , ZEND_BIND_STATIC , NULL , NULL );
4825
4835
opline -> op1_type = IS_CV ;
4826
4836
opline -> op1 .var = lookup_cv (var_name );
4827
4837
opline -> extended_value = placeholder_offset | ZEND_BIND_REF ;
4838
+
4839
+ zend_update_jump_target_to_next (skip_bind_static_jmp_opnum );
4828
4840
}
4829
4841
}
4830
4842
/* }}} */
0 commit comments