]> granicus.if.org Git - php/commitdiff
- Start adding parsed variable checks.
authorAndi Gutmans <andi@php.net>
Sun, 16 Dec 2001 19:45:49 +0000 (19:45 +0000)
committerAndi Gutmans <andi@php.net>
Sun, 16 Dec 2001 19:45:49 +0000 (19:45 +0000)
Zend/zend_compile.c
Zend/zend_compile.h
Zend/zend_language_parser.y

index 0b753f23d6e60fb17a61eabf47359e11e5ac3e27..b74946b96f00e816d2061796c1220282e64d6f5b 100644 (file)
@@ -528,6 +528,28 @@ void zend_do_if_end(TSRMLS_D)
        DEC_BPC(CG(active_op_array));
 }
 
+#if 0
+/* variable parsing type (compile-time) */
+#define ZEND_PARSED_MEMBER                     (1<<0)
+#define ZEND_PARSED_METHOD_CALL                (1<<1)
+#define ZEND_PARSED_STATIC_MEMBER      (1<<2)
+#define ZEND_PARSED_FUNCTION_CALL      (1<<3)
+#define ZEND_PARSED_VARIABLE           (1<<4)
+
+#endif
+
+void zend_check_writable_variable(znode *variable)
+{
+       zend_uint type = variable->u.EA.type;
+       
+       if (type & ZEND_PARSED_METHOD_CALL) {
+               zend_error(E_ERROR, "Can't use method return value in write context");
+       }
+       if ((type & ZEND_PARSED_FUNCTION_CALL) &&
+               !(type & (ZEND_PARSED_METHOD_CALL|ZEND_PARSED_MEMBER))) {
+               zend_error(E_ERROR, "Can't use function return value in write context");
+       }
+}
 
 zend_bool zend_variable_buffer_empty(TSRMLS_D)
 {
index 76dd43e7a26a542633be9f733af327de4c09e227..a7c8b9159a4ede8f4562669a457b68394573a396 100644 (file)
@@ -259,6 +259,8 @@ void zend_do_post_incdec(znode *result, znode *op1, int op TSRMLS_DC);
 void zend_do_begin_variable_parse(TSRMLS_D);
 void zend_do_end_variable_parse(int type, int arg_offset TSRMLS_DC);
 
+void zend_check_writable_variable(znode *variable);
+
 void zend_do_free(znode *op1 TSRMLS_DC);
 
 void zend_do_init_string(znode *result TSRMLS_DC);
index 09764324e1acb961c4ef4ecee91ef6cfac14c4df..01057699cb52f55bc7dd59ed7ec22aee597006b1 100644 (file)
@@ -613,12 +613,13 @@ r_cvar:
 
 
 w_cvar:
-       cvar { zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC); $$ = $1; }
+       cvar    { zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC); $$ = $1; }
+                       { zend_check_writable_variable(&$$); }
 ;
 
-
 rw_cvar:
-       cvar { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); $$ = $1; }
+       cvar    { zend_do_end_variable_parse(BP_VAR_RW, 0 TSRMLS_CC); $$ = $1; }
+                       { zend_check_writable_variable(&$$); }
 ;
 
 r_cvar_without_static_member: