[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;
}
}