[phc-internals] [phc commit] r1200 - in branches/saturn: . src src/generated src/generated_src src/pass_manager src/process_ir

codesite-noreply at google.com codesite-noreply at google.com
Wed Apr 30 17:10:04 IST 2008


Author: paul.biggar
Date: Wed Apr 30 09:09:01 2008
New Revision: 1200

Added:
   branches/saturn/src/process_ir/CLPA_unparser.h
Modified:
   branches/saturn/Makefile.am
   branches/saturn/Makefile.in
   branches/saturn/src/generated/AST-contexts
   branches/saturn/src/generated/AST.cpp
   branches/saturn/src/generated/AST.h
   branches/saturn/src/generated/AST_factory.cpp
   branches/saturn/src/generated/cmdline.c
   branches/saturn/src/generated/cmdline.h
   branches/saturn/src/generated_src/ast.tea
   branches/saturn/src/generated_src/phc.ggo
   branches/saturn/src/pass_manager/Pass_manager.cpp
   branches/saturn/src/phc.cpp

Log:
Initial version of the --sdump flag. This simply prints saturn-like 
declarations of the IR to stdout. Not really tested.

This also adds get_value_as_string() to Identifiers and Literals in the 
AST. I'm not sure why these were missing.

Ports the CAST fix from mainline (not using svnmerge.py -- this should 
still work fine).

Remove Saturn from being analysed by etags. It seems to break vim.


Modified: branches/saturn/Makefile.am
==============================================================================
--- branches/saturn/Makefile.am	(original)
+++ branches/saturn/Makefile.am	Wed Apr 30 09:09:01 2008
@@ -191,6 +191,7 @@
 	src/process_hir/HIR_unparser.h						\
 	src/process_ir/Clone_blank_mixins.cpp				\
 	src/process_ir/Clone_blank_mixins.h					\
+	src/process_ir/CLPA_unparser.h						\
 	src/process_ir/debug.cpp								\
 	src/process_ir/debug.h									\
 	src/process_ir/Foreach.h								\
@@ -607,4 +608,4 @@


 # Generate tags for the test framework.
-ETAGS_ARGS=--recurse test/framework 3rdparty/clpa
+ETAGS_ARGS=--recurse test/framework

Modified: branches/saturn/Makefile.in
==============================================================================
--- branches/saturn/Makefile.in	(original)
+++ branches/saturn/Makefile.in	Wed Apr 30 09:09:01 2008
@@ -727,6 +727,7 @@
 	src/process_hir/HIR_unparser.h						\
 	src/process_ir/Clone_blank_mixins.cpp				\
 	src/process_ir/Clone_blank_mixins.h					\
+	src/process_ir/CLPA_unparser.h						\
 	src/process_ir/debug.cpp								\
 	src/process_ir/debug.h									\
 	src/process_ir/Foreach.h								\
@@ -940,7 +941,7 @@
 MAINTAINERCLEANFILES = Makefile.in src/generated/README.TreeTransform

 # Generate tags for the test framework.
-ETAGS_ARGS = --recurse test/framework 3rdparty/clpa
+ETAGS_ARGS = --recurse test/framework
 all: $(BUILT_SOURCES) config.h
 	$(MAKE) $(AM_MAKEFLAGS) all-recursive


Modified: branches/saturn/src/generated/AST-contexts
==============================================================================
--- branches/saturn/src/generated/AST-contexts	(original)
+++ branches/saturn/src/generated/AST-contexts	Wed Apr 30 09:09:01 2008
@@ -67,7 +67,7 @@
 (Variable_name,Variable_name,)
 (While,Statement,*)
 (BOOL<bool>,Expr,)
-(CAST<String*>,CAST<String*>,)
+(CAST,CAST,)
 (CLASS_NAME,CLASS_NAME,)
 (CONSTANT_NAME,CONSTANT_NAME,)
 (DIRECTIVE_NAME,DIRECTIVE_NAME,)

Modified: branches/saturn/src/generated/AST.cpp
==============================================================================
--- branches/saturn/src/generated/AST.cpp	(original)
+++ branches/saturn/src/generated/AST.cpp	Wed Apr 30 09:09:01 2008
@@ -8259,6 +8259,11 @@
     transform->children_cast(this);
 }

+String* CAST::get_value_as_string()
+{
+    return value;
+}
+
 int CAST::classid()
 {
     return ID;
@@ -8274,63 +8279,41 @@
     CAST* that = dynamic_cast<CAST*>(in);
     if(that == NULL) return false;

-    if(!match_value(that))
-    	return false;
+    if(this->value != NULL && that->value != NULL)
+    	return (*this->value == *that->value);
     else
     	return true;
 }

-bool CAST::match_value(CAST* that)
-{
-    return true;
-}
-
 bool CAST::equals(Node* in)
 {
     CAST* that = dynamic_cast<CAST*>(in);
     if(that == NULL) return false;

-    if(!equals_value(that))
+    if(this->value == NULL || that->value == NULL)
+    {
+    	if(this->value != NULL || that->value != NULL)
+    		return false;
+    }
+    else if(*this->value != *that->value)
     	return false;

     if(!Node::is_mixin_equal(that)) return false;
     return true;
 }

-bool CAST::equals_value(CAST* that)
-{
-    return (*this->value == *that->value);
-}
-
 CAST* CAST::clone()
 {
-    value = clone_value();
+    String* value = new String(*this->value);
     CAST* clone = new CAST(value);
     clone->Node::clone_mixin_from(this);
     return clone;
 }

-String* CAST::clone_value()
-{
-    return value;
-}
-
 void CAST::assert_valid()
 {
-    assert_value_valid();
+    assert(value != NULL);
     Node::assert_mixin_valid();
-}
-
-void CAST::assert_value_valid()
-{
-    // Assume value is valid
-}
-
-String* CAST::get_value_as_string()
-{
-    {
-		return value;
-	}
 }

 CONSTANT_NAME::CONSTANT_NAME(String* value)

Modified: branches/saturn/src/generated/AST.h
==============================================================================
--- branches/saturn/src/generated/AST.h	(original)
+++ branches/saturn/src/generated/AST.h	Wed Apr 30 09:09:01 2008
@@ -788,7 +788,7 @@
     virtual void assert_valid();
 };

-// Identifier ::= INTERFACE_NAME | CLASS_NAME | METHOD_NAME | 
VARIABLE_NAME | CAST<String*> | OP | CONSTANT_NAME | LABEL_NAME | DIRECTIVE_NAME;
+// Identifier ::= INTERFACE_NAME | CLASS_NAME | METHOD_NAME | 
VARIABLE_NAME | CAST | OP | CONSTANT_NAME | LABEL_NAME | DIRECTIVE_NAME;
 class Identifier : virtual public Source_rep
 {
 public:
@@ -806,6 +806,8 @@
     virtual Identifier* clone() = 0;
 public:
     virtual void assert_valid() = 0;
+public:
+    virtual String* get_value_as_string() = 0;
 };

  // Class_def ::= Class_mod CLASS_NAME extends:CLASS_NAME? 
implements:INTERFACE_NAME* Member* ;
@@ -1588,6 +1590,8 @@
     virtual Literal* clone() = 0;
 public:
     virtual void assert_valid() = 0;
+public:
+    virtual String* get_value_as_string() = 0;
 };

 // Assignment ::= Variable is_ref:"&" Expr ;
@@ -1672,7 +1676,7 @@
     virtual void assert_valid();
 };

-// Cast ::= CAST<String*> Expr ;
+// Cast ::= CAST Expr ;
 class Cast : virtual public Expr
 {
 public:
@@ -2214,23 +2218,18 @@
     virtual void transform_children(Transform* transform);
 public:
     String* value;
+    virtual String* get_value_as_string();
 public:
     static const int ID = 74;
     virtual int classid();
 public:
     virtual bool match(Node* in);
-    virtual bool match_value(CAST* that);
 public:
     virtual bool equals(Node* in);
-    virtual bool equals_value(CAST* that);
 public:
     virtual CAST* clone();
-    virtual String* clone_value();
 public:
     virtual void assert_valid();
-    virtual void assert_value_valid();
-public:
-    String* get_value_as_string();
 };

 class CONSTANT_NAME : virtual public Identifier

Modified: branches/saturn/src/generated/AST_factory.cpp
==============================================================================
--- branches/saturn/src/generated/AST_factory.cpp	(original)
+++ branches/saturn/src/generated/AST_factory.cpp	Wed Apr 30 09:09:01 2008
@@ -491,6 +491,12 @@
     	assert(i == args->end());
     	return new OP(value);
     }
+    if(!strcmp(type_id, "CAST"))
+    {
+    	String* value = dynamic_cast<String*>(*i++);
+    	assert(i == args->end());
+    	return new CAST(value);
+    }
     if(!strcmp(type_id, "CONSTANT_NAME"))
     {
     	String* value = dynamic_cast<String*>(*i++);

Modified: branches/saturn/src/generated/cmdline.c
==============================================================================
--- branches/saturn/src/generated/cmdline.c	(original)
+++ branches/saturn/src/generated/cmdline.c	Wed Apr 30 09:09:01 2008
@@ -63,6 +63,7 @@
    "      --udump=passname     Dump input as runnable PHP after the 
pass named \n                             'passname'",
   "      --ddump=passname     Dump input as DOT after the pass named 'passname'",
   "      --xdump=passname     Dump input as XML after the pass named 'passname'",
+  "      --sdump=passname     Dump input into Saturn databases after 
the pass \n                             named 'passname'",
   "      --list-passes        List the passes to be run  (default=off)",
   "      --dont-fail          Dont fail on error (after parsing)  (default=off)",
    "      --no-xml-attrs       When dumping XML, omit node attributes  
\n                             (default=off)",
@@ -154,6 +155,7 @@
   args_info->udump_given = 0 ;
   args_info->ddump_given = 0 ;
   args_info->xdump_given = 0 ;
+  args_info->sdump_given = 0 ;
   args_info->list_passes_given = 0 ;
   args_info->dont_fail_given = 0 ;
   args_info->no_xml_attrs_given = 0 ;
@@ -204,6 +206,8 @@
   args_info->ddump_orig = NULL;
   args_info->xdump_arg = NULL;
   args_info->xdump_orig = NULL;
+  args_info->sdump_arg = NULL;
+  args_info->sdump_orig = NULL;
   args_info->list_passes_flag = 0;
   args_info->dont_fail_flag = 0;
   args_info->no_xml_attrs_flag = 0;
@@ -263,10 +267,13 @@
   args_info->xdump_help = gengetopt_args_info_full_help[34] ;
   args_info->xdump_min = -1;
   args_info->xdump_max = -1;
-  args_info->list_passes_help = gengetopt_args_info_full_help[35] ;
-  args_info->dont_fail_help = gengetopt_args_info_full_help[36] ;
-  args_info->no_xml_attrs_help = gengetopt_args_info_full_help[37] ;
-  args_info->disable_help = gengetopt_args_info_full_help[38] ;
+  args_info->sdump_help = gengetopt_args_info_full_help[35] ;
+  args_info->sdump_min = -1;
+  args_info->sdump_max = -1;
+  args_info->list_passes_help = gengetopt_args_info_full_help[36] ;
+  args_info->dont_fail_help = gengetopt_args_info_full_help[37] ;
+  args_info->no_xml_attrs_help = gengetopt_args_info_full_help[38] ;
+  args_info->disable_help = gengetopt_args_info_full_help[39] ;
   args_info->disable_min = -1;
   args_info->disable_max = -1;

@@ -422,6 +429,7 @@
    free_multiple_string_field (args_info->udump_given, 
&(args_info->udump_arg), &(args_info->udump_orig));
    free_multiple_string_field (args_info->ddump_given, 
&(args_info->ddump_arg), &(args_info->ddump_orig));
    free_multiple_string_field (args_info->xdump_given, 
&(args_info->xdump_arg), &(args_info->xdump_orig));
+  free_multiple_string_field (args_info->sdump_given, 
&(args_info->sdump_arg), &(args_info->sdump_orig));
    free_multiple_string_field (args_info->disable_given, 
&(args_info->disable_arg), &(args_info->disable_orig));


@@ -517,6 +525,7 @@
    write_multiple_into_file(outfile, args_info->udump_given, "udump", 
args_info->udump_orig, 0);
    write_multiple_into_file(outfile, args_info->ddump_given, "ddump", 
args_info->ddump_orig, 0);
    write_multiple_into_file(outfile, args_info->xdump_given, "xdump", 
args_info->xdump_orig, 0);
+  write_multiple_into_file(outfile, args_info->sdump_given, "sdump", 
args_info->sdump_orig, 0);
   if (args_info->list_passes_given)
     write_into_file(outfile, "list-passes", 0, 0 );
   if (args_info->dont_fail_given)
@@ -797,6 +806,9 @@
    if (check_multiple_option_occurrences(prog_name, 
args_info->xdump_given, args_info->xdump_min, args_info->xdump_max, "'--xdump'"))
      error = 1;

+  if (check_multiple_option_occurrences(prog_name, 
args_info->sdump_given, args_info->sdump_min, args_info->sdump_max, "'--sdump'"))
+     error = 1;
+
    if (check_multiple_option_occurrences(prog_name, 
args_info->disable_given, args_info->disable_min, args_info->disable_max, "'--disable'"))
      error = 1;

@@ -1039,6 +1051,7 @@
   struct generic_list * udump_list = NULL;
   struct generic_list * ddump_list = NULL;
   struct generic_list * xdump_list = NULL;
+  struct generic_list * sdump_list = NULL;
   struct generic_list * disable_list = NULL;
   int error = 0;
   struct gengetopt_args_info local_args_info;
@@ -1100,6 +1113,7 @@
         { "udump",	1, NULL, 0 },
         { "ddump",	1, NULL, 0 },
         { "xdump",	1, NULL, 0 },
+        { "sdump",	1, NULL, 0 },
         { "list-passes",	0, NULL, 0 },
         { "dont-fail",	0, NULL, 0 },
         { "no-xml-attrs",	0, NULL, 0 },
@@ -1449,6 +1463,17 @@
               goto failure;

           }
+          /* Dump input into Saturn databases after the pass 
named 'passname'.  */
+          else if (strcmp (long_options[option_index].name, "sdump") 
== 0)
+          {
+
+            if (update_multiple_arg_temp(&sdump_list,
+                &(local_args_info.sdump_given), optarg, 0, 0, ARG_STRING,
+                "sdump", '-',
+                additional_error))
+              goto failure;
+
+          }
           /* List the passes to be run.  */
            else if (strcmp 
(long_options[option_index].name, "list-passes") == 0)
           {
@@ -1541,6 +1566,10 @@
     &(args_info->xdump_orig), args_info->xdump_given,
     local_args_info.xdump_given, 0 ,
     ARG_STRING, xdump_list);
+  update_multiple_arg((void *)&(args_info->sdump_arg),
+    &(args_info->sdump_orig), args_info->sdump_given,
+    local_args_info.sdump_given, 0 ,
+    ARG_STRING, sdump_list);
   update_multiple_arg((void *)&(args_info->disable_arg),
     &(args_info->disable_orig), args_info->disable_given,
     local_args_info.disable_given, 0 ,
@@ -1562,6 +1591,8 @@
   local_args_info.ddump_given = 0;
   args_info->xdump_given += local_args_info.xdump_given;
   local_args_info.xdump_given = 0;
+  args_info->sdump_given += local_args_info.sdump_given;
+  local_args_info.sdump_given = 0;
   args_info->disable_given += local_args_info.disable_given;
   local_args_info.disable_given = 0;

@@ -1610,6 +1641,7 @@
   free_list (udump_list, 1 );
   free_list (ddump_list, 1 );
   free_list (xdump_list, 1 );
+  free_list (sdump_list, 1 );
   free_list (disable_list, 1 );

   cmdline_parser_release (&local_args_info);

Modified: branches/saturn/src/generated/cmdline.h
==============================================================================
--- branches/saturn/src/generated/cmdline.h	(original)
+++ branches/saturn/src/generated/cmdline.h	Wed Apr 30 09:09:01 2008
@@ -119,6 +119,11 @@
    int xdump_min; /**< @brief Dump input as XML after the pass 
named 'passname''s minimum occurreces */
    int xdump_max; /**< @brief Dump input as XML after the pass 
named 'passname''s maximum occurreces */
    const char *xdump_help; /**< @brief Dump input as XML after the pass 
named 'passname' help description.  */
+  char ** sdump_arg;	/**< @brief Dump input into Saturn databases 
after the pass named 'passname'.  */
+  char ** sdump_orig;	/**< @brief Dump input into Saturn databases 
after the pass named 'passname' original value given at command line.  */
+  int sdump_min; /**< @brief Dump input into Saturn databases after 
the pass named 'passname''s minimum occurreces */
+  int sdump_max; /**< @brief Dump input into Saturn databases after 
the pass named 'passname''s maximum occurreces */
+  const char *sdump_help; /**< @brief Dump input into Saturn databases 
after the pass named 'passname' help description.  */
    int list_passes_flag;	/**< @brief List the passes to be run 
(default=off).  */
    const char *list_passes_help; /**< @brief List the passes to be run 
help description.  */
    int dont_fail_flag;	/**< @brief Dont fail on error (after parsing) 
(default=off).  */
@@ -161,6 +166,7 @@
   unsigned int udump_given ;	/**< @brief Whether udump was given.  */
   unsigned int ddump_given ;	/**< @brief Whether ddump was given.  */
   unsigned int xdump_given ;	/**< @brief Whether xdump was given.  */
+  unsigned int sdump_given ;	/**< @brief Whether sdump was given.  */
    unsigned int list_passes_given ;	/**< @brief Whether list-passes was 
given.  */
    unsigned int dont_fail_given ;	/**< @brief Whether dont-fail was 
given.  */
    unsigned int no_xml_attrs_given ;	/**< @brief Whether no-xml-attrs 
was given.  */

Modified: branches/saturn/src/generated_src/ast.tea
==============================================================================
--- branches/saturn/src/generated_src/ast.tea	(original)
+++ branches/saturn/src/generated_src/ast.tea	Wed Apr 30 09:09:01 2008
@@ -135,7 +135,7 @@
 List_element ::= Variable | Nested_list_elements ;
 Nested_list_elements ::= List_element?* ;

-Cast ::= CAST<String*> Expr ;
+Cast ::= CAST Expr ;
 Unary_op ::= OP Expr ;
 Bin_op ::= left:Expr OP right:Expr ;

@@ -176,7 +176,7 @@

 Identifier ::=
 	  INTERFACE_NAME | CLASS_NAME | METHOD_NAME | VARIABLE_NAME
-	  | CAST<String*> | OP | CONSTANT_NAME | LABEL_NAME
+	  | CAST | OP | CONSTANT_NAME | LABEL_NAME
 	  | DIRECTIVE_NAME
 	;

@@ -564,15 +564,6 @@
 	}
 };

-class CAST
-{
-public:
-	String* get_value_as_string ()
-	{
-		return value;
-	}
-};
-
 class HT_ITERATOR
 {
 public:
@@ -609,6 +600,18 @@
 		assert (source_rep != NULL);
 		attrs->set ("phc.unparser.source_rep", source_rep);
 	}
+};
+
+class Identifier
+{
+public:
+	virtual String* get_value_as_string() = 0;
+};
+
+class Literal
+{
+public:
+	virtual String* get_value_as_string() = 0;
 };



Modified: branches/saturn/src/generated_src/phc.ggo
==============================================================================
--- branches/saturn/src/generated_src/phc.ggo	(original)
+++ branches/saturn/src/generated_src/phc.ggo	Wed Apr 30 09:09:01 2008
@@ -36,6 +36,7 @@
  option "udump" - "Dump input as runnable PHP after the pass 
named 'passname'" string typestr="passname" multiple hidden optional
  option "ddump" - "Dump input as DOT after the pass named 'passname'" 
string typestr="passname" multiple hidden optional
  option "xdump" - "Dump input as XML after the pass named 'passname'" 
string typestr="passname" multiple hidden optional
+option "sdump" - "Dump input into Saturn databases after the pass 
named 'passname'" string typestr="passname" multiple hidden optional
 option "list-passes" - "List the passes to be run" flag off hidden
 option "dont-fail" - "Dont fail on error (after parsing)" flag off hidden
  option "no-xml-attrs" - "When dumping XML, omit node attributes" flag 
off hidden

Modified: branches/saturn/src/pass_manager/Pass_manager.cpp
==============================================================================
--- branches/saturn/src/pass_manager/Pass_manager.cpp	(original)
+++ branches/saturn/src/pass_manager/Pass_manager.cpp	Wed Apr 30 
09:09:01 2008
@@ -16,6 +16,7 @@
 #include "Transform_pass.h"

 #include "process_ir/XML_unparser.h"
+#include "process_ir/CLPA_unparser.h"
 #include "process_ast/AST_unparser.h"
 #include "process_hir/HIR_unparser.h"
 #include "process_mir/MIR_unparser.h"
@@ -353,6 +354,14 @@
 			in->visit(	new AST_XML_unparser (cout, attrs),
 							new HIR_XML_unparser (cout, attrs),
 							new MIR_XML_unparser (cout, attrs));
+		}
+	}
+
+	for (unsigned int i = 0; i < args_info->sdump_given; i++)
+	{
+		if (*name == args_info->sdump_arg [i])
+		{
+			in->visit(new AST_CLPA_unparser(), new HIR_CLPA_unparser(), new 
MIR_CLPA_unparser ());
 		}
 	}
 }

Modified: branches/saturn/src/phc.cpp
==============================================================================
--- branches/saturn/src/phc.cpp	(original)
+++ branches/saturn/src/phc.cpp	Wed Apr 30 09:09:01 2008
@@ -185,6 +185,7 @@
 	check_passes (udump);
 	check_passes (xdump);
 	check_passes (ddump);
+	check_passes (sdump);
 	check_passes (debug);
 	check_passes (disable);


Added: branches/saturn/src/process_ir/CLPA_unparser.h
==============================================================================
--- (empty file)
+++ branches/saturn/src/process_ir/CLPA_unparser.h	Wed Apr 30 09:09:01 2008
@@ -0,0 +1,256 @@
+/*
+ * phc -- the open source PHP compiler
+ * See doc/license/README.license for licensing information
+ *
+ * Generate syntax databases for the Calypso interpreter.
+ */
+
+#ifndef PHC_CLPA_UNPARSER
+#define PHC_CLPA_UNPARSER
+
+#include <iostream>
+#include <stack>
+#include "lib/base64.h"
+#include "lib/demangle.h"
+#include "lib/error.h"
+#include "lib/String.h"
+#include "lib/List.h"
+
+template
+<
+	class Script,
+	class Node,
+	class Literal,
+	class Identifier,
+	class Visitor
+>
+class CLPA_unparser : public Visitor
+{
+protected:
+	stack<Object*> ids;
+
+public:
+
+/*	void visit_marker(char const* name, bool value)
+	{
+		ids.push (new Boolean (value));
+	}
+*/
+	void pre_list(char const* type_id, int size)
+	{
+		cout << "LIST" << endl;
+		cout << "<" << type_id << "_list>" << endl;
+	}
+
+	void post_list(char const* type_id, int size)
+	{
+		cout << "POST_LIST" << endl;
+		cout << "</" << type_id << "_list>" << endl;
+	}
+
+	/* Get an id for this node, and add it to the stack. The magic
+	 * happens in post_node. */
+	void pre_node(Node* in)
+	{
+		cdebug << "Adding: " << demangle(in, true);
+		debug(in);
+		cdebug << endl;
+		in->attrs->set ("phc.clpa.id", get_id (in));
+		ids.push (in);
+	}
+
+	void pre_identifier (Identifier* in)
+	{
+		cdebug << "Adding value: " << demangle(in, true);
+		cdebug << endl;
+		ids.push (in->get_value_as_string ());
+	}
+
+	void pre_literal (Literal* in)
+	{
+		cdebug << "Adding value: " << demangle(in, true);
+		cdebug << endl;
+		ids.push (in->get_value_as_string ());
+	}
+
+
+
+	/* If we search backwards down the stack until we find our own
+	 * node, then all subnodes will be parameters to this node. */
+	void post_node(Node* in)
+	{
+		cout << "phc_" << demangle(in, false) << " (";
+
+		
+		// The params are either IDs or literals
+		List<String*>* params = new List<String*>;
+		while (ids.top () != in)
+		{
+			Object* obj = ids.top();
+			cdebug << "Removing: " << demangle(obj, true);
+
+			// Get IDs for nodes
+			if (dynamic_cast<Literal*> (obj))
+			{
+				Literal* lit = dynamic_cast<Literal*> (obj);
+				debug (lit);
+				cdebug << endl;
+				params->push_back (lit->get_value_as_string ());
+			}
+			else if (dynamic_cast<Node*> (obj))
+			{
+				Node* node = dynamic_cast<Node*> (obj);
+				debug (node);
+				cdebug << endl;
+				params->push_back (node->attrs->get_string ("phc.clpa.id"));
+			}
+/*			else if (dynamic_cast<Boolean*> (obj))
+			{
+				Boolean* b = dynamic_cast<Boolean*> (obj);
+				params->push_back (s(b->value() ? "true" : "false"));
+			}
+*/			else if (dynamic_cast<String*> (obj))
+			{
+				String* b = dynamic_cast<String*> (obj);
+				params->push_back (b);
+			}
+			else
+			{
+				cout << "TODO" << endl;
+				assert (0);
+			}
+
+			ids.pop ();
+		}
+
+		List<String*>::const_iterator i = params->begin ();
+		while (i != params->end ())
+		{
+			cout << **i;
+			i++;
+
+			// no comma on final iteration
+			if (i != params->end ())
+				cout << ", ";
+
+		}
+		cout << ")" << endl;
+	}
+
+protected:
+
+	String* get_id (Node* node)
+	{
+		static int id = 0;
+		String* string_id;
+
+		if (node->attrs->has ("phc.clpa.id"))
+			string_id = node->attrs->get_string ("phc.clpa.id");
+		else
+		{
+			stringstream ss;
+			ss << "#" << id;
+			string_id = new String(ss.str());
+			node->attrs->set ("phc.clpa.id", string_id);
+			id++;
+		}
+		return string_id;
+	}
+
+
+	void print_attributes(Node* in)
+	{
+		if(in->attrs->size() == 0)
+		{
+			cout << "<attrs />" << endl;
+		}
+		else
+		{
+			cout << "<attrs>" << endl;
+
+			AttrMap::const_iterator i;
+			for(i = in->attrs->begin(); i != in->attrs->end(); i++)
+			{
+//				print_attribute((*i).first, (*i).second);
+			}
+
+			cout << "</attrs>" << endl;
+		}
+	}
+
+	void print_attribute(string name, Object* attr)
+	{
+		if(String* str = dynamic_cast<String*>(attr))
+		{
+			cout << "<attr key=\"" << name << "\">";
+//			maybe_encode ("string", str);
+			cout << "</attr>" << endl;
+		}
+		else if(Integer* i = dynamic_cast<Integer*>(attr))
+		{
+			cout << "<attr key=\"" << name << "\"><integer>" << i->value () 
<< "</integer></attr>" << endl;
+		}
+		else if(Boolean* b = dynamic_cast<Boolean*>(attr))
+		{
+			cout << "<attr key=\"" << name << "\"><bool>" << 
(b->value() ? "true" : "false") << "</bool></attr>" << endl;
+		}
+		else if(List<String*>* ls = dynamic_cast<List<String*>*>(attr))
+		{
+			cout << "<attr key=\"" << name << "\"><string_list>" << endl;
+
+			List<String*>::const_iterator j;
+			for(j = ls->begin(); j != ls->end(); j++)
+			{
+//				maybe_encode ("string", *j);
+			}
+
+			cout << "</string_list></attr>" << endl;
+		}
+		else if (attr == NULL)
+		{
+			cout << "<!-- skipping NULL attribute " << name << " -->" << endl;
+		}
+		else
+			phc_warning ("Don't know how to deal with attribute '%s' of 
type '%s'", name.c_str(), demangle(attr, false));	
+	}
+
+};
+
+#include "AST_visitor.h"
+class AST_CLPA_unparser : public CLPA_unparser
+<
+	AST::PHP_script,
+	AST::Node,
+	AST::Literal,
+	AST::Identifier,
+	AST::Visitor
+>
+{
+
+};
+
+#include "HIR_visitor.h"
+class HIR_CLPA_unparser : public CLPA_unparser
+<
+	HIR::PHP_script,
+	HIR::Node,
+	HIR::Literal,
+	HIR::Identifier,
+	HIR::Visitor
+>
+{
+};
+
+#include "MIR_visitor.h"
+class MIR_CLPA_unparser : public CLPA_unparser
+<
+	MIR::PHP_script,
+	MIR::Node,
+	MIR::Literal,
+	MIR::Identifier,
+	MIR::Visitor
+>
+{
+};
+
+#endif // PHC_CLPA_UNPARSER


More information about the phc-internals mailing list