From 6c9410d8de3ddcb70d717a61c3901404638ac8ec Mon Sep 17 00:00:00 2001
From: "Meredith L. Patterson" <mlp@thesmartpolitenerd.com>
Date: Mon, 16 Dec 2013 13:13:17 +0100
Subject: [PATCH] action works! need to clean up xor and ch_range, and write
 attr_bool

---
 src/bindings/php/Tests/ActionTest.php |  3 ---
 src/bindings/php/hammer.i             | 18 ++++++++++--------
 2 files changed, 10 insertions(+), 11 deletions(-)

diff --git a/src/bindings/php/Tests/ActionTest.php b/src/bindings/php/Tests/ActionTest.php
index 00ac776f..ee8f0cf0 100644
--- a/src/bindings/php/Tests/ActionTest.php
+++ b/src/bindings/php/Tests/ActionTest.php
@@ -21,11 +21,8 @@ class ActionTest extends PHPUnit_Framework_TestCase
     public function testSuccess()
     {
         $result1 = h_parse($this->parser, "ab");
-        var_dump($result1);
         $result2 = h_parse($this->parser, "AB");
-        var_dump($result2);
         $result3 = h_parse($this->parser, "aB");
-        var_dump($result3);
         $this->assertEquals("AB", $result1);
         $this->assertEquals("AB", $result2);
         $this->assertEquals("AB", $result3);
diff --git a/src/bindings/php/hammer.i b/src/bindings/php/hammer.i
index d2a5eca4..a5be96ed 100644
--- a/src/bindings/php/hammer.i
+++ b/src/bindings/php/hammer.i
@@ -4,12 +4,12 @@
 %ignore HCountedArray_;
 
 %inline %{
+#define PHP_H_TT_PHP_DESCRIPTOR_RES_NAME "Hammer Token"
   static int h_tt_php;
   static int le_h_tt_php_descriptor;
   %}
 
 %init %{
-#define PHP_H_TT_PHP_DESCRIPTOR_RES_NAME "Hammer Token"
   h_tt_php = h_allocate_token_type("com.upstandinghackers.hammer.php");
   // TODO: implement h_arena_free, register a token dtor here
   le_h_tt_php_descriptor = zend_register_list_destructors_ex(NULL, NULL, PHP_H_TT_PHP_DESCRIPTOR_RES_NAME, module_number);	     
@@ -113,8 +113,9 @@
       break;
     default:
       if (token->token_type == h_tt_php) { 
-	//RETVAL_RESOURCE(token->token_data.user);
-	ZEND_REGISTER_RESOURCE(return_value, token->token_data.user, le_h_tt_php_descriptor);
+	zval *tmp;
+	tmp = (zval*)token->token_data.user;
+	RETVAL_ZVAL(tmp, 0, 0);
       } else {
 	int res = 0;
 	res = SWIG_ConvertPtr(return_value, (void*)token, SWIGTYPE_p_HParsedToken_, 0 | 0);
@@ -129,18 +130,19 @@
 
   static HParsedToken* call_action(const HParseResult *p, void *user_data) {
     zval *args[1];
-    zval ret, func;
+    zval func;
+    zval *ret;
+    ALLOC_INIT_ZVAL(ret);
     ZVAL_STRING(&func, (const char*)user_data, 0);
     hpt_to_php(p->ast, args[0]);
-    int ok = call_user_function(EG(function_table), NULL, &func, &ret, 1, args TSRMLS_CC);
+    int ok = call_user_function(EG(function_table), NULL, &func, ret, 1, args TSRMLS_CC);
     if (ok != SUCCESS) {
       printf("call_user_function failed\n");
       // FIXME throw some error
       return NULL;
     }
-    printf("Value being returned is %s\n", Z_STRVAL(ret));
-    // TODO: add reference to ret to parse-local data
-    HParsedToken *tok = h_make(p->arena, h_tt_php, &ret);
+    // Whatever the zval is, stuff it into a token
+    HParsedToken *tok = h_make(p->arena, h_tt_php, ret);
     return tok;
   }
 
-- 
GitLab