[svn:PHP-Sandwich] rev 1040 - in PHP-Sandwich/trunk: . t

[email protected] 2 May 2005 20:44:02 -0000
Newsgroups perl.php.sandwich.dev
Message-ID <[email protected]>
Author: gschlossnagle
Date: Mon May  2 13:44:01 2005
New Revision: 1040

Modified:
   PHP-Sandwich/trunk/phpfuncs.c
   PHP-Sandwich/trunk/phpinterp.h
   PHP-Sandwich/trunk/t/14.t
Log:
setVariable

only works for setting scalars, will segfault if you 
pass in an object, as it lacks the sandwich_interp



Modified: PHP-Sandwich/trunk/phpfuncs.c
==============================================================================
--- PHP-Sandwich/trunk/phpfuncs.c	(original)
+++ PHP-Sandwich/trunk/phpfuncs.c	Mon May  2 13:44:01 2005
@@ -121,7 +121,52 @@
   } else {
     RETURN_NULL();
   }
-} 
+}
+
+PHP_METHOD(perl, setvariable)
+{
+  struct plobj *pl;
+  SV           *var;
+  zval         *retval;
+  char         *name;
+  int           namelen;
+  zval         *param;
+  SV           *sparam;
+  pTHX;
+
+  if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sz", &name, &namelen, &param) == FAILURE) {
+    return;
+  }
+
+  if (namelen < 1) {
+    RETURN_NULL();
+  }
+  
+  pl = zend_object_store_get_object(getThis() TSRMLS_CC);
+  aTHX = pl->perl;
+  var = NULL;
+  
+  switch (name[0]) {
+    case '$':
+      var =  get_sv(name + 1, FALSE);
+      sparam = newSVzval(param, NULL);
+      sv_setsv(var, sparam);
+      break;
+    case '@':
+      /* check type require param IS_ARRAY, maybe IS_OBJECT */
+      var = (SV *) get_av(name + 1, FALSE);
+      RETURN_NULL();
+      break;
+    case '%':
+      /* check type require param IS_ARRAY, maybe IS_OBJECT */
+      var = (SV *) get_hv(name + 1, FALSE);
+      RETURN_NULL();
+      break;
+    default:
+      RETURN_NULL();
+  }
+  RETURN_TRUE;
+}
 
 PHP_METHOD(perl, getinstance)
 {
@@ -199,6 +244,7 @@
 static function_entry plobj_functions[] = {
   PHP_ME(perl, eval, NULL, ZEND_ACC_PUBLIC)
   PHP_ME(perl, getvariable, NULL, ZEND_ACC_PUBLIC) 
+  PHP_ME(perl, setvariable, NULL, ZEND_ACC_PUBLIC) 
   {NULL, NULL, NULL}
 };
 

Modified: PHP-Sandwich/trunk/phpinterp.h
==============================================================================
--- PHP-Sandwich/trunk/phpinterp.h	(original)
+++ PHP-Sandwich/trunk/phpinterp.h	Mon May  2 13:44:01 2005
@@ -39,5 +39,6 @@
 #define sandwich_interp_dec_ref(interp)  if(--interp->ref == 0) sandwich_per_interp_shutdown(interp)
 
 zval *SvZval(SV *sv);
+SV *newSVzval(zval *param, sandwich_per_interp *interp);
 
 #endif

Modified: PHP-Sandwich/trunk/t/14.t
==============================================================================
--- PHP-Sandwich/trunk/t/14.t	(original)
+++ PHP-Sandwich/trunk/t/14.t	Mon May  2 13:44:01 2005
@@ -1,6 +1,6 @@
 #!/opt/ecelerity/3rdParty/bin/perl
 use strict;
-use Test::More tests => 5;
+use Test::More tests => 8;
 
 BEGIN {
     use_ok 'PHP' or die;
@@ -8,6 +8,7 @@
 }
 
 our @var;
+our $scalar;
 
 push @var, "hello";
 push @var, "goodbye";
@@ -20,6 +21,19 @@
         $value = $perl->getVariable('@var');
         return $value;
     }
+    function bar() {
+        $perl = Perl::getInstance();
+        $value = $perl->getVariable('$var[0]');
+        return $value;
+    }
 /), 'Define PHP function that returns Perl values';
 my @phpval = $p->foo();
 ok $phpval[0] == 'hello', 'Check return value of PHP foo()';
+my $phpval = $p->bar();
+ok $phpval == 'hello', 'Check return value of PHP bar()';
+ok $p->eval(q/
+  $perl = Perl::getInstance();
+  $perl->setVariable('$scalar', 'george');
+/), 'Test use of Perl::setVariable';
+
+is $scalar, 'george', 'Test scalar version of setVariable';