davidg          Fri Feb 23 15:14:42 2001 EDT

  Modified files:              
    /php4/ext/midgard   preparser.c config.m4 
  Log:
  - workaround for the function mgd_eval() to return a value like the PHP eval().
  - changed --with-mgd-experimental to --enable-mgd-experimental
  
  
Index: php4/ext/midgard/preparser.c
diff -u php4/ext/midgard/preparser.c:1.5 php4/ext/midgard/preparser.c:1.6
--- php4/ext/midgard/preparser.c:1.5    Tue Feb 20 03:14:55 2001
+++ php4/ext/midgard/preparser.c        Fri Feb 23 15:14:42 2001
@@ -1,4 +1,4 @@
-/* $Id: preparser.c,v 1.5 2001/02/20 11:14:55 emile Exp $
+/* $Id: preparser.c,v 1.6 2001/02/23 23:14:42 davidg Exp $
 Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]>
 Copyright (C) 2000 The Midgard Project ry
 Copyright (C) 2000 Emile Heyns, Aurora SA <[EMAIL PROTECTED]>
@@ -345,6 +345,77 @@
        mgd_free_pool(pool);
 }
 
+/* DG {HACK ALERT}: Since the function zend_eval_string does not behave like
+ * the statement eval(), thie following function is the exact copy of the
+ * function zend_eval_string with some lines commented out.
+ * This is necessary to keep the compatibility between eval() and mgd_eval()
+ */
+static int mgd_eval_string(char *str, zval *retval_ptr, char *string_name CLS_DC 
+ELS_DC)
+{
+       zval pv;
+       zend_op_array *new_op_array;
+       zend_op_array *original_active_op_array = EG(active_op_array);
+       zend_function_state *original_function_state_ptr = EG(function_state_ptr);
+       int original_handle_op_arrays;
+       int retval;
+
+//     if (retval_ptr) {
+//             pv.value.str.len = strlen(str)+sizeof("return  ;")-1;
+//             pv.value.str.val = emalloc(pv.value.str.len+1);
+//             strcpy(pv.value.str.val, "return ");
+//             strcat(pv.value.str.val, str);
+//             strcat(pv.value.str.val, " ;");
+//     } else {
+               pv.value.str.len = strlen(str);
+               pv.value.str.val = estrndup(str, pv.value.str.len);
+//     }
+       pv.type = IS_STRING;
+
+       /*printf("Evaluating '%s'\n", pv.value.str.val);*/
+
+       original_handle_op_arrays = CG(handle_op_arrays);
+       CG(handle_op_arrays) = 0;
+       new_op_array = compile_string(&pv, string_name CLS_CC);
+       CG(handle_op_arrays) = original_handle_op_arrays;
+
+       if (new_op_array) {
+               zval *local_retval_ptr=NULL;
+               zval **original_return_value_ptr_ptr = EG(return_value_ptr_ptr);
+               zend_op **original_opline_ptr = EG(opline_ptr);
+               
+               EG(return_value_ptr_ptr) = &local_retval_ptr;
+               EG(active_op_array) = new_op_array;
+               EG(no_extensions)=1;
+
+               zend_execute(new_op_array ELS_CC);
+
+               if (local_retval_ptr) {
+                       if (retval_ptr) {
+                               COPY_PZVAL_TO_ZVAL(*retval_ptr, local_retval_ptr);
+                       } else {
+                               zval_ptr_dtor(&local_retval_ptr);
+                       }
+               } else {
+                       if (retval_ptr) {
+                               INIT_ZVAL(*retval_ptr);
+                       }
+               }
+
+               EG(no_extensions)=0;
+               EG(opline_ptr) = original_opline_ptr;
+               EG(active_op_array) = original_active_op_array;
+               EG(function_state_ptr) = original_function_state_ptr;
+               destroy_op_array(new_op_array);
+               efree(new_op_array);
+               EG(return_value_ptr_ptr) = original_return_value_ptr_ptr;
+               retval = SUCCESS;
+       } else {
+               retval = FAILURE;
+       }
+       zval_dtor(&pv);
+       return retval;
+}
+
 MGD_FUNCTION(eval)
 {
        zval **string, **name;
@@ -370,20 +441,9 @@
                        WRONG_PARAM_COUNT;
        }
        if((*string)->value.str.len) {
-#ifdef MGD_PREPARSER_LOG
-               zend_syntax_highlighter_ini syntax_highlighter_ini;
-               php_get_highlight_struct(&syntax_highlighter_ini);
-//             highlight_string(*string, &syntax_highlighter_ini, tmp);
-#endif
                pool = mgd_alloc_pool();
                value = php_eval_midgard(pool, tmp, (*string)->value.str.val, 0);
-#ifdef MGD_PREPARSER_LOG
-MGD_LOG_START("mgd_eval(%s) '%s'\n\n\n\n\n\n\n\n")
-       MGD_LOG_ARG(tmp)
-       MGD_LOG_ARG(value)
-MGD_LOG_END()
-#endif
-               if(zend_eval_string(value, NULL /* return_value */, tmp CLS_CC ELS_CC) 
!= SUCCESS) {
+               if(mgd_eval_string(value, return_value, tmp CLS_CC ELS_CC) != SUCCESS) 
+{
 /* DG: we probably want to turn that off when stable and ready to release
  * or at least offer the user an option to turn it off, as it exposes the
  * PHP source (security issue here)
@@ -449,4 +509,5 @@
                }
        }
 }
+
 #endif /* HAVE_MIDGARD */
Index: php4/ext/midgard/config.m4
diff -u php4/ext/midgard/config.m4:1.9 php4/ext/midgard/config.m4:1.10
--- php4/ext/midgard/config.m4:1.9      Fri Feb 23 04:52:13 2001
+++ php4/ext/midgard/config.m4  Fri Feb 23 15:14:42 2001
@@ -1,4 +1,4 @@
-dnl $Id: config.m4,v 1.9 2001/02/23 12:52:13 sas Exp $
+dnl $Id: config.m4,v 1.10 2001/02/23 23:14:42 davidg Exp $
 
 dnl  Copyright (C) 1999 Jukka Zitting <[EMAIL PROTECTED]>
 dnl  Copyright (C) 2000 The Midgard Project ry
@@ -58,8 +58,8 @@
   PHP_SUBST(GLIBCONFIG)
 
   AC_MSG_CHECKING(for midgard experimental functions support)
-  AC_ARG_WITH(mgd-experimental, 
-  [  --with-mgd-experimental          Include midgard 1.4.1 experimental functions 
support], PHP_MIDGARD_EXPERIMENTAL=[$]withval, PHP_MIDGARD_EXPERIMENTAL="no")
+  AC_ARG_ENABLE(mgd-experimental, 
+  [  --enable-mgd-experimental          Enable midgard 1.4.1 experimental functions 
+support], PHP_MIDGARD_EXPERIMENTAL=[$]enableval, PHP_MIDGARD_EXPERIMENTAL="no")
   echo "$PHP_MIDGARD_EXPERIMENTAL";
   if test "$PHP_MIDGARD_EXPERIMENTAL" = "yes"; then
     AC_DEFINE(YOU_WANT_TO_TEST, 1, [ ])



-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to