On 2005/01/12, at 9:24, Andi Gutmans wrote:

Are you sure this is the right fix? After all, last_op->result.u.var should already have a temporary variable assigned for when the opcode was generated. When exactly did you find this is not the case?

As far as I checked, at least a temporary variable is always allocated per opcode in the ZE1 and pre-VM ZE2.

<?php
function op_array() {
  $a; // 1
  $a; // 2
  $a = $a + 2; // 3, 4
  // ... total 4 temporary variables
}
?>

However, it looks like the rule doesn't apply to the current HEAD.

<?php
function op_array() {
  $a; // 1
  $a; // 2
  $a = $a + 2; // 3, 4
  // ... total 4 temporary variables
}
?>

Try the attached patch to check what is going on behind the scene.
Index: Zend/zend_execute.c
===================================================================
RCS file: /repository/ZendEngine2/zend_execute.c,v
retrieving revision 1.687
diff -u -r1.687 zend_execute.c
--- Zend/zend_execute.c 27 Dec 2004 13:43:25 -0000      1.687
+++ Zend/zend_execute.c 12 Jan 2005 08:12:09 -0000
@@ -65,8 +65,17 @@
 
 #define RETURN_VALUE_USED(opline) (!((opline)->result.u.EA.type & 
EXT_TYPE_UNUSED))
 
-#define EX_T(offset) (*(temp_variable *)((char *) EX(Ts) + offset))
-#define T(offset) (*(temp_variable *)((char *) Ts + offset))
+static inline temp_variable *check_tv_overrun(zend_op_array *op,
+               temp_variable *Ts, size_t offset)
+{
+       fprintf(stderr, "Accessing #%d (size=%d)\n",
+                       (int)(offset / sizeof(temp_variable)), op->T);
+
+       return (temp_variable *)((char *)Ts + offset);
+}
+
+#define EX_T(offset) (*check_tv_overrun(EX(op_array), EX(Ts), offset))
+#define T(offset) (*check_tv_overrun(EG(active_op_array), Ts, offset))
 
 #define TEMP_VAR_STACK_LIMIT 2000
 


Moriyoshi

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to