[svn:PHP-Sandwich] rev 1431 - PHP-Sandwich/trunk

[email protected] 31 Jul 2005 02:45:43 -0000
Newsgroups perl.php.sandwich.dev
Message-ID <[email protected]>
Author: gschlossnagle
Date: Sat Jul 30 19:45:43 2005
New Revision: 1431

Modified:
   PHP-Sandwich/trunk/PHP.xs
   PHP-Sandwich/trunk/phpfuncs.c
   PHP-Sandwich/trunk/phpinterp.c
Log:
commit a bunch of debug, if I need it back later


Modified: PHP-Sandwich/trunk/PHP.xs
==============================================================================
--- PHP-Sandwich/trunk/PHP.xs	(original)
+++ PHP-Sandwich/trunk/PHP.xs	Sat Jul 30 19:45:43 2005
@@ -544,6 +544,8 @@ SV *SAND_eval(interp, code)
   CODE:
     {
       RETVAL = sandwich_eval(interp, code);
+      fprintf(stderr, "%s:%d StackDepth: %d\n", __FILE__, __LINE__, SP - MARK);
+      sv_dump(RETVAL);
     }
   OUTPUT:
     RETVAL

Modified: PHP-Sandwich/trunk/phpfuncs.c
==============================================================================
--- PHP-Sandwich/trunk/phpfuncs.c	(original)
+++ PHP-Sandwich/trunk/phpfuncs.c	Sat Jul 30 19:45:43 2005
@@ -95,6 +95,7 @@ PHP_METHOD(perl, getvariable)
   char         *name;
   int           namelen;
   pTHX;
+  dSP;
 
   if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &name, &namelen) == FAILURE) {
     return;
@@ -110,7 +111,8 @@ PHP_METHOD(perl, getvariable)
 #endif
   var = NULL;
   if(strchr(name, '[') || strchr(name, '{')) {
-    var = eval_pv(name, FALSE);
+    PUSHMARK(SP);
+    var = eval_pv(name, G_VOID);
   } else {
     switch (name[0]) {
       case '$':
@@ -200,6 +202,8 @@ static int _sandwich_call_method(char *m
   aTHX = pl->perl;
 #endif
   {
+    int cnt;
+    STRLEN n_a;
     dSP;
   
     argc = ZEND_NUM_ARGS();
@@ -222,19 +226,21 @@ static int _sandwich_call_method(char *m
       XPUSHs(var);
     }
     PUTBACK;
-    call_pv(method, G_SCALAR);
+    cnt = call_pv(method, G_SCALAR | G_EVAL | G_KEEPERR);
     SPAGAIN;
-    prv = POPs;
-    /*
-    if(coe && SvTRUE(ERRSV)) {
+    if(SvTRUE(ERRSV)) {
       croak(SvPVx(ERRSV, n_a));
+    } else if(cnt) {
+      fprintf(stderr, "%s:%d  eval_sv returns %d\n", __FILE__, __LINE__, cnt);
+      prv = POPs;
+      SvREFCNT_inc(prv);
+      PUTBACK;
+      retval = SvZval(prv TSRMLS_CC);
+      RETURN_ZVAL(retval, 1, 0);
+      SvREFCNT_dec(prv);
+    } else {
+      RETURN_NULL();
     }
-    */
-    SvREFCNT_inc(prv);
-    PUTBACK;
-    retval = SvZval(prv TSRMLS_CC);
-    RETURN_ZVAL(retval, 1, 0);
-    SvREFCNT_dec(prv);
     FREETMPS;
     LEAVE;
     efree(args);
@@ -254,6 +260,8 @@ PHP_METHOD(perl, call)
   }
   if(zend_get_parameters_array_ex(1, name) == FAILURE) {
       WRONG_PARAM_COUNT;
+  } else if(Z_TYPE_PP(name[0]) != IS_STRING) {
+      WRONG_PARAM_COUNT;
   }
   _sandwich_call_method(Z_STRVAL_PP(name[0]), INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
 }
@@ -308,27 +316,41 @@ PHP_METHOD(perl, getinstance)
 }
 
 SV *my_eval_sv(pTHX_ SV *sv, I32 coe) {
-  SV *retval;
+  SV *retval = &PL_sv_undef;
   STRLEN n_a;
+  int cnt;
   dSP;
+  dMARK;
 
+  fprintf(stderr, "StackDepth: %d\n", SP - MARK);
   ENTER;
   SAVETMPS;
   PUSHMARK(SP);
   PUTBACK;
-  eval_sv(sv, G_SCALAR);
+  fprintf(stderr, "%s:%d\n", __FILE__, __LINE__);
+  sv_dump(sv);
+  cnt = eval_sv(sv, G_SCALAR | G_EVAL | G_KEEPERR);
  
   SPAGAIN;
-  retval = POPs;
-  if(coe && SvTRUE(ERRSV)) {
+  if(cnt) {
+    fprintf(stderr, "%s:%d  eval_sv returns %d\n", __FILE__, __LINE__, cnt);
+    retval = POPs;
+    PUTBACK;
+  }
+  fprintf(stderr, "%s:%d\n", __FILE__, __LINE__);
+  sv_dump(ERRSV);
+  if(SvTRUE(ERRSV)) {
+    fprintf(stderr, "%s:%d\n", __FILE__, __LINE__);
     croak(SvPVx(ERRSV, n_a));
+  } else {
+    fprintf(stderr, "%s:%d\n", __FILE__, __LINE__);
+    sv_dump(SvROK(retval)?SvRV(retval):retval);
+    SvREFCNT_inc(retval);
   }
 
-  SvREFCNT_inc(retval);
-  PUTBACK;
+  fprintf(stderr, "StackDepth: %d\n", SP - MARK);
   FREETMPS;
   LEAVE;
-
   return retval;
 }
 
@@ -356,14 +378,86 @@ PHP_METHOD(perl, eval)
   aTHX = pl->perl;
 #endif
   if((rv = sandwich_perl_eval(aTHX_ func)) == NULL)  { 
+fprintf(stderr, "%s:%d\n", __FILE__, __LINE__);
   } else {
-    sv_dump(SvRV(rv));
+fprintf(stderr, "%s:%d\n", __FILE__, __LINE__);
+    sv_dump(SvROK(rv)?SvRV(rv):rv);
     zval *retval = SvZval(rv TSRMLS_CC);
     RETURN_ZVAL(retval, 1, 0);
-    SvREFCNT_dec(rv);
   }
+fprintf(stderr, "%s:%d\n", __FILE__, __LINE__);
+  sv_dump(ERRSV);
 }
 
+PHP_METHOD(perl, new)
+{
+  struct plobj *pl;
+  SV           *var;
+  zval         *retval;
+  zval         *param;
+  zval         ***args;
+  SV           *sparam;
+  int          argc, i;
+  SV           *prv;
+  zval **name[1];
+
+  pTHX;
+
+  if(ZEND_NUM_ARGS() < 1) {
+    WRONG_PARAM_COUNT;
+  }
+  if(zend_get_parameters_array_ex(1, name) == FAILURE) {
+      WRONG_PARAM_COUNT;
+  } else if(Z_TYPE_PP(name[0]) != IS_STRING) {
+      WRONG_PARAM_COUNT;
+  }
+
+  pl = zend_object_store_get_object(getThis() TSRMLS_CC);
+#ifdef USE_ITHREADS
+  aTHX = pl->perl;
+#endif
+  {
+    int cnt;
+    STRLEN n_a;
+    dSP;
+  
+    argc = ZEND_NUM_ARGS();
+    args = (zval ***) safe_emalloc(sizeof(zval **), argc, 0);
+    if(zend_get_parameters_array_ex(argc, args) == FAILURE) {
+      efree(args);
+      WRONG_PARAM_COUNT;
+    }
+    
+    ENTER;
+    SAVETMPS;
+    PUSHMARK(SP);
+    for(i = 0; i < argc; i++) {
+      var = newSVzval(*args[i], SandwichG(php));
+      var = sv_2mortal(var);
+      XPUSHs(var);
+    }
+    PUTBACK;
+    cnt = call_method("new", G_SCALAR | G_EVAL | G_KEEPERR);
+    SPAGAIN;
+    if(SvTRUE(ERRSV)) {
+      croak(SvPVx(ERRSV, n_a));
+    } else if(cnt) {
+      fprintf(stderr, "%s:%d  eval_sv returns %d\n", __FILE__, __LINE__, cnt);
+      prv = POPs;
+      SvREFCNT_inc(prv);
+      PUTBACK;
+      retval = SvZval(prv TSRMLS_CC);
+      RETURN_ZVAL(retval, 1, 0);
+      SvREFCNT_dec(prv);
+    } else {
+      RETURN_NULL();
+    }
+    POPs;
+    FREETMPS;
+    LEAVE;
+    efree(args);
+  }
+}
 
 static zval *
 sv_prop_read(zval *obj, zval *member, int type TSRMLS_DC)
@@ -485,6 +579,7 @@ static int _sv_call_method(char *method,
   SV           *sparam;
   int          argc, i;
   SV           *prv;
+  int          cnt;
   pTHX;
 
   pl = zend_object_store_get_object(getThis() TSRMLS_CC);
@@ -492,6 +587,7 @@ static int _sv_call_method(char *method,
   aTHX = pl->perl;
 #endif
   {
+    STRLEN n_a;
     dSP;
  
     argc = ZEND_NUM_ARGS();
@@ -516,20 +612,29 @@ static int _sv_call_method(char *method,
       XPUSHs(var);
     }
     PUTBACK;
-    call_method(method, G_SCALAR);
+    cnt = call_method(method, G_SCALAR | G_EVAL | G_KEEPERR);
     SvREFCNT_dec(pl->sv);
     SPAGAIN;
-    prv = POPs;
-    /*
-    if(coe && SvTRUE(ERRSV)) {
+    if(SvTRUE(ERRSV)) {
       croak(SvPVx(ERRSV, n_a));
+    } else if(cnt) {
+        fprintf(stderr, "%s:%d  eval_sv returns %d\n", __FILE__, __LINE__, cnt);
+        prv = POPs;
+      /*
+      if(coe && SvTRUE(ERRSV)) {
+        croak(SvPVx(ERRSV, n_a));
+      }
+      */
+      SvREFCNT_inc(prv);
+      PUTBACK;
+      retval = SvZval(prv TSRMLS_CC);
+      RETURN_ZVAL(retval, 1, 0);
+      SvREFCNT_dec(prv);
+    } else {
+      RETURN_NULL();
     }
-    */
-    SvREFCNT_inc(prv);
+    /* WTF */
     PUTBACK;
-    retval = SvZval(prv TSRMLS_CC);
-    RETURN_ZVAL(retval, 1, 0);
-    SvREFCNT_dec(prv);
     FREETMPS;
     LEAVE;
     efree(args);
@@ -596,7 +701,7 @@ int sv_get_class_name(zval *obj, char **
     } else {
       tmp = HvNAME((SvSTASH(SvRV(pl->sv))));
       if(!tmp) return FAILURE;
-      *class_name_len = strlen(tmp) + sizeof("PerlSV::") - 1;
+      *class_name_len = strlen(tmp) + sizeof("PerlSV::");
       *class_name = emalloc(*class_name_len);
       strncpy(*class_name, "PerlSV::", sizeof("PerlSV::"));
       strcat(*class_name, tmp);
@@ -771,6 +876,7 @@ static function_entry plobj_functions[] 
   PHP_ME(perl, getvariable, NULL, ZEND_ACC_PUBLIC) 
   PHP_ME(perl, setvariable, NULL, ZEND_ACC_PUBLIC) 
   PHP_ME(perl, call, NULL, ZEND_ACC_PUBLIC) 
+  PHP_ME(perl, new, NULL, ZEND_ACC_PUBLIC) 
   {NULL, NULL, NULL}
 };
 
@@ -1014,6 +1120,4 @@ zend_module_entry sandwich_module_entry 
   STANDARD_MODULE_PROPERTIES
 };
 
-
-
 /* vim: set sw=2 ts=2 sts=2 ai bs=2 expandtab : */

Modified: PHP-Sandwich/trunk/phpinterp.c
==============================================================================
--- PHP-Sandwich/trunk/phpinterp.c	(original)
+++ PHP-Sandwich/trunk/phpinterp.c	Sat Jul 30 19:45:43 2005
@@ -35,8 +35,7 @@ static int sandwich_sapi_ub_write(const 
     PUSHMARK(SP);
     XPUSHs(sv_2mortal(newSVpvn(str, str_length)));
     PUTBACK;
-    call_sv(oh, G_VOID);
-    PUTBACK;
+    call_sv(oh, G_VOID | G_EVAL);
     FREETMPS;
     LEAVE;
   } else {
@@ -207,7 +206,7 @@ int my_eval_string(char *str, zval *retv
   }
   pv.type = IS_STRING;
 
-  /* printf("Evaluating '%s'\n", pv.value.str.val); */
+  fprintf(stderr, "%s:%d: Evaluating '%s'\n", __FILE__, __LINE__, pv.value.str.val); 
 
   original_handle_op_arrays = CG(handle_op_arrays);
   CG(handle_op_arrays) = 0;
@@ -275,8 +274,13 @@ cleanup:
   if(rv == -1) {
     croak("PHP Error in eval");
   } else {
+    SV *rv;
     /* FIXME, do i need to copy retval? */
-    return newSVzval(&retval, interp);
+    zend_print_zval(&retval, 2);
+    rv = newSVzval(&retval, interp);
+    fprintf(stderr, "%s:%d\n", __FILE__, __LINE__);
+    sv_dump(rv);
+    return rv;
   }
 }