[phc-internals] [phc commit] r1404 - in trunk/src: generated generated_src parsing process_ir process_mir

codesite-noreply at google.com codesite-noreply at google.com
Wed Jul 2 12:28:22 IST 2008


Author: paul.biggar
Date: Wed Jul  2 04:27:46 2008
New Revision: 1404

Modified:
   trunk/src/generated/MIR-contexts
   trunk/src/generated/MIR.cpp
   trunk/src/generated/MIR.h
   trunk/src/generated/MIR_factory.cpp
   trunk/src/generated/MIR_fold.h
   trunk/src/generated/MIR_transform.cpp
   trunk/src/generated/MIR_transform.h
   trunk/src/generated/MIR_visitor.cpp
   trunk/src/generated/MIR_visitor.h
   trunk/src/generated_src/mir.tea
   trunk/src/parsing/XML_parser.h
   trunk/src/process_ir/fresh.cpp
   trunk/src/process_mir/MIR_to_AST.h
   trunk/src/process_mir/MIR_unparser.cpp

Log:
Make HT_ITERATOR an MIR::Identifier. This allows the XML_parser to work 
properly. I changed the HT_ITERATOR to use a String*, rather thann an 
int. There was no real reason to use an int, and similar things used 
Strings (like labels). This fixes reading XML with HT_ITERATORs. 
However, a lot of XML tests fail since we dont support Foreign very well.


Modified: trunk/src/generated/MIR-contexts
==============================================================================
--- trunk/src/generated/MIR-contexts	(original)
+++ trunk/src/generated/MIR-contexts	Wed Jul  2 04:27:46 2008
@@ -62,7 +62,7 @@
 (CAST,CAST,)
 (CLASS_NAME,CLASS_NAME,)
 (CONSTANT_NAME,CONSTANT_NAME,)
-(HT_ITERATOR<long>,HT_ITERATOR<long>,)
+(HT_ITERATOR,HT_ITERATOR,)
 (INT<long>,Literal,)
 (INTERFACE_NAME,INTERFACE_NAME,)
 (LABEL_NAME,LABEL_NAME,)

Modified: trunk/src/generated/MIR.cpp
==============================================================================
--- trunk/src/generated/MIR.cpp	(original)
+++ trunk/src/generated/MIR.cpp	Wed Jul  2 04:27:46 2008
@@ -1919,120 +1919,6 @@
 	}
 }

-HT_ITERATOR::HT_ITERATOR()
-{
-    this->value = 0;
-}
-
-void HT_ITERATOR::visit(Visitor* visitor)
-{
-    visitor->visit_ht_iterator(this);
-}
-
-void HT_ITERATOR::transform_children(Transform* transform)
-{
-    transform->children_ht_iterator(this);
-}
-
-int HT_ITERATOR::classid()
-{
-    return ID;
-}
-
-bool HT_ITERATOR::match(Node* in)
-{
-    __WILDCARD__* joker;
-    joker = dynamic_cast<__WILDCARD__*>(in);
-    if(joker != NULL && joker->match(this))
-    	return true;
-
-    HT_ITERATOR* that = dynamic_cast<HT_ITERATOR*>(in);
-    if(that == NULL) return false;
-
-    if(!match_value(that))
-    	return false;
-    else
-    	return true;
-}
-
-bool HT_ITERATOR::match_value(HT_ITERATOR* that)
-{
-    return true;
-}
-
-bool HT_ITERATOR::equals(Node* in)
-{
-    HT_ITERATOR* that = dynamic_cast<HT_ITERATOR*>(in);
-    if(that == NULL) return false;
-
-    if(!equals_value(that))
-    	return false;
-
-    if(!Node::is_mixin_equal(that)) return false;
-    return true;
-}
-
-bool HT_ITERATOR::equals_value(HT_ITERATOR* that)
-{
-    return (this->value == that->value);
-}
-
-HT_ITERATOR* HT_ITERATOR::clone()
-{
-    value = clone_value();
-    HT_ITERATOR* clone = new HT_ITERATOR(value);
-    clone->Node::clone_mixin_from(this);
-    return clone;
-}
-
-long HT_ITERATOR::clone_value()
-{
-    return value;
-}
-
-Node* HT_ITERATOR::find(Node* in)
-{
-    if (this->match (in))
-    	return this;
-
-    return NULL;
-}
-
-void HT_ITERATOR::find_all(Node* in, List<Node*>* out)
-{
-    if (this->match (in))
-    	out->push_back (this);
-}
-
-void HT_ITERATOR::assert_valid()
-{
-    assert_value_valid();
-    Node::assert_mixin_valid();
-}
-
-void HT_ITERATOR::assert_value_valid()
-{
-    // Assume value is valid
-}
-
-HT_ITERATOR::HT_ITERATOR(long identifier)
-{
-    {
-		value = identifier;
-		std::ostringstream os;
-		os << "ht_iterator_" << value;
-	}
-}
-
-String* HT_ITERATOR::get_value_as_string()
-{
-    {
-		std::ostringstream os;
-		os << "ht_iterator_" << value;
-		return new String(os.str());
-	}
-}
-
  Class_def::Class_def(Class_mod* class_mod, CLASS_NAME* class_name, 
CLASS_NAME* extends, List<INTERFACE_NAME*>* implements, List<Member*>* members)
 {
     this->class_mod = class_mod;
@@ -8686,6 +8572,97 @@
 }

 void LABEL_NAME::assert_valid()
+{
+    assert(value != NULL);
+    Node::assert_mixin_valid();
+}
+
+HT_ITERATOR::HT_ITERATOR(String* value)
+{
+    this->value = value;
+}
+
+HT_ITERATOR::HT_ITERATOR()
+{
+    this->value = 0;
+}
+
+void HT_ITERATOR::visit(Visitor* visitor)
+{
+    visitor->visit_ht_iterator(this);
+}
+
+void HT_ITERATOR::transform_children(Transform* transform)
+{
+    transform->children_ht_iterator(this);
+}
+
+String* HT_ITERATOR::get_value_as_string()
+{
+    return value;
+}
+
+int HT_ITERATOR::classid()
+{
+    return ID;
+}
+
+bool HT_ITERATOR::match(Node* in)
+{
+    __WILDCARD__* joker;
+    joker = dynamic_cast<__WILDCARD__*>(in);
+    if(joker != NULL && joker->match(this))
+    	return true;
+
+    HT_ITERATOR* that = dynamic_cast<HT_ITERATOR*>(in);
+    if(that == NULL) return false;
+
+    if(this->value != NULL && that->value != NULL)
+    	return (*this->value == *that->value);
+    else
+    	return true;
+}
+
+bool HT_ITERATOR::equals(Node* in)
+{
+    HT_ITERATOR* that = dynamic_cast<HT_ITERATOR*>(in);
+    if(that == NULL) return false;
+
+    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;
+}
+
+HT_ITERATOR* HT_ITERATOR::clone()
+{
+    String* value = new String(*this->value);
+    HT_ITERATOR* clone = new HT_ITERATOR(value);
+    clone->Node::clone_mixin_from(this);
+    return clone;
+}
+
+Node* HT_ITERATOR::find(Node* in)
+{
+    if (this->match (in))
+    	return this;
+
+    return NULL;
+}
+
+void HT_ITERATOR::find_all(Node* in, List<Node*>* out)
+{
+    if (this->match (in))
+    	out->push_back (this);
+}
+
+void HT_ITERATOR::assert_valid()
 {
     assert(value != NULL);
     Node::assert_mixin_valid();

Modified: trunk/src/generated/MIR.h
==============================================================================
--- trunk/src/generated/MIR.h	(original)
+++ trunk/src/generated/MIR.h	Wed Jul  2 04:27:46 2008
@@ -42,7 +42,6 @@
 class Static_array_key;
 class Identifier;
 class Foreign;
-class HT_ITERATOR;
 class Class_def;
 class Interface_def;
 class Method;
@@ -92,6 +91,7 @@
 class CAST;
 class CONSTANT_NAME;
 class LABEL_NAME;
+class HT_ITERATOR;
 class INT;
 class REAL;
 class STRING;
@@ -101,7 +101,7 @@
 class Transform;
 class Visitor;

-// Node ::= PHP_script | Statement | Class_mod | Member | Signature | 
Method_mod | Formal_parameter | Type | Attr_mod | Name_with_default | 
Catch | Expr | Variable_name | Target | Method_name | Actual_parameter |
  Class_name | Static_value | Static_array_elem | Static_array_key | 
Identifier | Foreign | HT_ITERATOR<long>;
+// Node ::= PHP_script | Statement | Class_mod | Member | Signature | 
Method_mod | Formal_parameter | Type | Attr_mod | Name_with_default | 
Catch | Expr | Variable_name | Target | Method_name | Actual_parameter |
  Class_name | Static_value | Static_array_elem | Static_array_key | 
Identifier | Foreign;
 class Node : virtual public IR::Node
 {
 public:
@@ -705,7 +705,7 @@
     virtual void assert_valid() = 0;
 };

-// Identifier ::= INTERFACE_NAME | CLASS_NAME | METHOD_NAME | 
VARIABLE_NAME | CAST | OP | CONSTANT_NAME | LABEL_NAME;
+// Identifier ::= INTERFACE_NAME | CLASS_NAME | METHOD_NAME | 
VARIABLE_NAME | CAST | OP | CONSTANT_NAME | LABEL_NAME | HT_ITERATOR;
 class Identifier : virtual public Node
 {
 public:
@@ -758,39 +758,6 @@
     IR ::Node* foreign;
 };

-class HT_ITERATOR : virtual public Node
-{
-protected:
-    HT_ITERATOR();
-public:
-    virtual void visit(Visitor* visitor);
-    virtual void transform_children(Transform* transform);
-public:
-    long value;
-public:
-    static const int ID = 52;
-    virtual int classid();
-public:
-    virtual bool match(Node* in);
-    virtual bool match_value(HT_ITERATOR* that);
-public:
-    virtual bool equals(Node* in);
-    virtual bool equals_value(HT_ITERATOR* that);
-public:
-    virtual HT_ITERATOR* clone();
-    virtual long clone_value();
-public:
-    virtual Node* find(Node* in);
-public:
-    virtual void find_all(Node* in, List<Node*>* out);
-public:
-    virtual void assert_valid();
-    virtual void assert_value_valid();
-public:
-    HT_ITERATOR(long identifier);
-    String* get_value_as_string();
-};
-
  // Class_def ::= Class_mod CLASS_NAME extends:CLASS_NAME? 
implements:INTERFACE_NAME* Member* ;
 class Class_def : virtual public Statement
 {
@@ -1798,7 +1765,7 @@
     virtual void assert_valid();
 };

-// Foreach_reset ::= array:VARIABLE_NAME iter:HT_ITERATOR<long> ;
+// Foreach_reset ::= array:VARIABLE_NAME iter:HT_ITERATOR ;
 class Foreach_reset : virtual public Statement
 {
 public:
@@ -1828,7 +1795,7 @@
     virtual void assert_valid();
 };

-// Foreach_next ::= array:VARIABLE_NAME iter:HT_ITERATOR<long> ;
+// Foreach_next ::= array:VARIABLE_NAME iter:HT_ITERATOR ;
 class Foreach_next : virtual public Statement
 {
 public:
@@ -1858,7 +1825,7 @@
     virtual void assert_valid();
 };

-// Foreach_end ::= array:VARIABLE_NAME iter:HT_ITERATOR<long> ;
+// Foreach_end ::= array:VARIABLE_NAME iter:HT_ITERATOR ;
 class Foreach_end : virtual public Statement
 {
 public:
@@ -1888,7 +1855,7 @@
     virtual void assert_valid();
 };

-// Foreach_has_key ::= array:VARIABLE_NAME iter:HT_ITERATOR<long> ;
+// Foreach_has_key ::= array:VARIABLE_NAME iter:HT_ITERATOR ;
 class Foreach_has_key : virtual public Expr
 {
 public:
@@ -1918,7 +1885,7 @@
     virtual void assert_valid();
 };

-// Foreach_get_key ::= array:VARIABLE_NAME iter:HT_ITERATOR<long> ;
+// Foreach_get_key ::= array:VARIABLE_NAME iter:HT_ITERATOR ;
 class Foreach_get_key : virtual public Expr
 {
 public:
@@ -1948,7 +1915,7 @@
     virtual void assert_valid();
 };

-// Foreach_get_val ::= array:VARIABLE_NAME key:VARIABLE_NAME iter:HT_ITERATOR<long> ;
+// Foreach_get_val ::= array:VARIABLE_NAME key:VARIABLE_NAME iter:HT_ITERATOR ;
 class Foreach_get_val : virtual public Expr
 {
 public:
@@ -2047,7 +2014,7 @@
     String* value;
     virtual String* get_value_as_string();
 public:
-    static const int ID = 53;
+    static const int ID = 52;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2076,7 +2043,7 @@
     String* value;
     virtual String* get_value_as_string();
 public:
-    static const int ID = 54;
+    static const int ID = 53;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2105,7 +2072,7 @@
     String* value;
     virtual String* get_value_as_string();
 public:
-    static const int ID = 55;
+    static const int ID = 54;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2134,7 +2101,7 @@
     String* value;
     virtual String* get_value_as_string();
 public:
-    static const int ID = 56;
+    static const int ID = 55;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2163,7 +2130,7 @@
     String* value;
     virtual String* get_value_as_string();
 public:
-    static const int ID = 57;
+    static const int ID = 56;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2192,7 +2159,7 @@
     String* value;
     virtual String* get_value_as_string();
 public:
-    static const int ID = 63;
+    static const int ID = 62;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2221,7 +2188,7 @@
     String* value;
     virtual String* get_value_as_string();
 public:
-    static const int ID = 64;
+    static const int ID = 63;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2250,7 +2217,7 @@
     String* value;
     virtual String* get_value_as_string();
 public:
-    static const int ID = 65;
+    static const int ID = 64;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2266,6 +2233,35 @@
     virtual void assert_valid();
 };

+class HT_ITERATOR : virtual public Identifier
+{
+public:
+    HT_ITERATOR(String* value);
+protected:
+    HT_ITERATOR();
+public:
+    virtual void visit(Visitor* visitor);
+    virtual void transform_children(Transform* transform);
+public:
+    String* value;
+    virtual String* get_value_as_string();
+public:
+    static const int ID = 65;
+    virtual int classid();
+public:
+    virtual bool match(Node* in);
+public:
+    virtual bool equals(Node* in);
+public:
+    virtual HT_ITERATOR* clone();
+public:
+    virtual Node* find(Node* in);
+public:
+    virtual void find_all(Node* in, List<Node*>* out);
+public:
+    virtual void assert_valid();
+};
+
 class INT : virtual public Literal
 {
 public:
@@ -2278,7 +2274,7 @@
 public:
     long value;
 public:
-    static const int ID = 58;
+    static const int ID = 57;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2317,7 +2313,7 @@
 public:
     double value;
 public:
-    static const int ID = 59;
+    static const int ID = 58;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2355,7 +2351,7 @@
 public:
     String* value;
 public:
-    static const int ID = 60;
+    static const int ID = 59;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2390,7 +2386,7 @@
 public:
     bool value;
 public:
-    static const int ID = 61;
+    static const int ID = 60;
     virtual int classid();
 public:
     virtual bool match(Node* in);
@@ -2423,7 +2419,7 @@
     virtual void visit(Visitor* visitor);
     virtual void transform_children(Transform* transform);
 public:
-    static const int ID = 62;
+    static const int ID = 61;
     virtual int classid();
 public:
     virtual bool match(Node* in);

Modified: trunk/src/generated/MIR_factory.cpp
==============================================================================
--- trunk/src/generated/MIR_factory.cpp	(original)
+++ trunk/src/generated/MIR_factory.cpp	Wed Jul  2 04:27:46 2008
@@ -433,6 +433,12 @@
     	assert(i == args->end());
     	return new LABEL_NAME(value);
     }
+    if(!strcmp(type_id, "HT_ITERATOR"))
+    {
+    	String* value = dynamic_cast<String*>(*i++);
+    	assert(i == args->end());
+    	return new HT_ITERATOR(value);
+    }
     if(!strcmp(type_id, "Statement_list"))
     {
     	List<Statement*>* list = new List<Statement*>;

Modified: trunk/src/generated/MIR_fold.h
==============================================================================
--- trunk/src/generated/MIR_fold.h	(original)
+++ trunk/src/generated/MIR_fold.h	Wed Jul  2 04:27:46 2008
@@ -721,7 +721,6 @@
  	virtual _Foreign_statement 
fold_impl_foreign_statement(Foreign_statement* orig) { assert(0); };
  	virtual _Foreign_expr fold_impl_foreign_expr(Foreign_expr* orig) { 
assert(0); };

-	virtual _HT_ITERATOR fold_ht_iterator(HT_ITERATOR* orig) { assert(0); };
 	virtual _CLASS_NAME fold_class_name(CLASS_NAME* orig) { assert(0); };
  	virtual _INTERFACE_NAME fold_interface_name(INTERFACE_NAME* orig) { 
assert(0); };
 	virtual _METHOD_NAME fold_method_name(METHOD_NAME* orig) { assert(0); };
@@ -735,6 +734,7 @@
 	virtual _CAST fold_cast(CAST* orig) { assert(0); };
  	virtual _CONSTANT_NAME fold_constant_name(CONSTANT_NAME* orig) { 
assert(0); };
 	virtual _LABEL_NAME fold_label_name(LABEL_NAME* orig) { assert(0); };
+	virtual _HT_ITERATOR fold_ht_iterator(HT_ITERATOR* orig) { assert(0); };


 // Manual dispatching for abstract classes
@@ -1117,6 +1117,8 @@
 				return fold_constant_name(dynamic_cast<CONSTANT_NAME*>(in));
 			case LABEL_NAME::ID:
 				return fold_label_name(dynamic_cast<LABEL_NAME*>(in));
+			case HT_ITERATOR::ID:
+				return fold_ht_iterator(dynamic_cast<HT_ITERATOR*>(in));
 		}
 		assert(0);
 	}

Modified: trunk/src/generated/MIR_transform.cpp
==============================================================================
--- trunk/src/generated/MIR_transform.cpp	(original)
+++ trunk/src/generated/MIR_transform.cpp	Wed Jul  2 04:27:46 2008
@@ -261,11 +261,6 @@
     return in;
 }

-HT_ITERATOR* Transform::pre_ht_iterator(HT_ITERATOR* in)
-{
-    return in;
-}
-
 CLASS_NAME* Transform::pre_class_name(CLASS_NAME* in)
 {
     return in;
@@ -331,6 +326,11 @@
     return in;
 }

+HT_ITERATOR* Transform::pre_ht_iterator(HT_ITERATOR* in)
+{
+    return in;
+}
+
 // Invoked after the children have been transformed
 PHP_script* Transform::post_php_script(PHP_script* in)
 {
@@ -587,11 +587,6 @@
     return in;
 }

-HT_ITERATOR* Transform::post_ht_iterator(HT_ITERATOR* in)
-{
-    return in;
-}
-
 CLASS_NAME* Transform::post_class_name(CLASS_NAME* in)
 {
     return in;
@@ -657,6 +652,11 @@
     return in;
 }

+HT_ITERATOR* Transform::post_ht_iterator(HT_ITERATOR* in)
+{
+    return in;
+}
+
 // Transform the children of the node
 void Transform::children_php_script(PHP_script* in)
 {
@@ -955,10 +955,6 @@
 }

 // Tokens don't have children, so these methods do nothing by default
-void Transform::children_ht_iterator(HT_ITERATOR* in)
-{
-}
-
 void Transform::children_class_name(CLASS_NAME* in)
 {
 }
@@ -1008,6 +1004,10 @@
 }

 void Transform::children_label_name(LABEL_NAME* in)
+{
+}
+
+void Transform::children_ht_iterator(HT_ITERATOR* in)
 {
 }


Modified: trunk/src/generated/MIR_transform.h
==============================================================================
--- trunk/src/generated/MIR_transform.h	(original)
+++ trunk/src/generated/MIR_transform.h	Wed Jul  2 04:27:46 2008
@@ -78,7 +78,6 @@
     virtual Expr* pre_foreach_get_val(Foreach_get_val* in);
      virtual void pre_foreign_statement(Foreign_statement* in, 
List<Statement*>* out);
     virtual Expr* pre_foreign_expr(Foreign_expr* in);
-    virtual HT_ITERATOR* pre_ht_iterator(HT_ITERATOR* in);
     virtual CLASS_NAME* pre_class_name(CLASS_NAME* in);
     virtual INTERFACE_NAME* pre_interface_name(INTERFACE_NAME* in);
     virtual METHOD_NAME* pre_method_name(METHOD_NAME* in);
@@ -92,6 +91,7 @@
     virtual CAST* pre_cast(CAST* in);
     virtual CONSTANT_NAME* pre_constant_name(CONSTANT_NAME* in);
     virtual LABEL_NAME* pre_label_name(LABEL_NAME* in);
+    virtual HT_ITERATOR* pre_ht_iterator(HT_ITERATOR* in);
 // Invoked after the children have been transformed
 public:
     virtual PHP_script* post_php_script(PHP_script* in);
@@ -145,7 +145,6 @@
     virtual Expr* post_foreach_get_val(Foreach_get_val* in);
      virtual void post_foreign_statement(Foreign_statement* in, 
List<Statement*>* out);
     virtual Expr* post_foreign_expr(Foreign_expr* in);
-    virtual HT_ITERATOR* post_ht_iterator(HT_ITERATOR* in);
     virtual CLASS_NAME* post_class_name(CLASS_NAME* in);
     virtual INTERFACE_NAME* post_interface_name(INTERFACE_NAME* in);
     virtual METHOD_NAME* post_method_name(METHOD_NAME* in);
@@ -159,6 +158,7 @@
     virtual CAST* post_cast(CAST* in);
     virtual CONSTANT_NAME* post_constant_name(CONSTANT_NAME* in);
     virtual LABEL_NAME* post_label_name(LABEL_NAME* in);
+    virtual HT_ITERATOR* post_ht_iterator(HT_ITERATOR* in);
 // Transform the children of the node
 public:
     virtual void children_php_script(PHP_script* in);
@@ -214,7 +214,6 @@
     virtual void children_foreign_expr(Foreign_expr* in);
 // Tokens don't have children, so these methods do nothing by default
 public:
-    virtual void children_ht_iterator(HT_ITERATOR* in);
     virtual void children_class_name(CLASS_NAME* in);
     virtual void children_interface_name(INTERFACE_NAME* in);
     virtual void children_method_name(METHOD_NAME* in);
@@ -228,6 +227,7 @@
     virtual void children_cast(CAST* in);
     virtual void children_constant_name(CONSTANT_NAME* in);
     virtual void children_label_name(LABEL_NAME* in);
+    virtual void children_ht_iterator(HT_ITERATOR* in);
  // Call the pre-transform, transform-children post-transform methods 
in order
 // Do not override unless you know what you are doing
 public:

Modified: trunk/src/generated/MIR_visitor.cpp
==============================================================================
--- trunk/src/generated/MIR_visitor.cpp	(original)
+++ trunk/src/generated/MIR_visitor.cpp	Wed Jul  2 04:27:46 2008
@@ -262,10 +262,6 @@
 {
 }

-void Visitor::pre_ht_iterator(HT_ITERATOR* in)
-{
-}
-
 void Visitor::pre_class_name(CLASS_NAME* in)
 {
 }
@@ -318,6 +314,10 @@
 {
 }

+void Visitor::pre_ht_iterator(HT_ITERATOR* in)
+{
+}
+
 // Invoked after the children have been visited
 void Visitor::post_node(Node* in)
 {
@@ -575,10 +575,6 @@
 {
 }

-void Visitor::post_ht_iterator(HT_ITERATOR* in)
-{
-}
-
 void Visitor::post_class_name(CLASS_NAME* in)
 {
 }
@@ -631,6 +627,10 @@
 {
 }

+void Visitor::post_ht_iterator(HT_ITERATOR* in)
+{
+}
+
 // Visit the children of a node
 void Visitor::children_php_script(PHP_script* in)
 {
@@ -951,10 +951,6 @@
 }

 // Tokens don't have children, so these methods do nothing by default
-void Visitor::children_ht_iterator(HT_ITERATOR* in)
-{
-}
-
 void Visitor::children_class_name(CLASS_NAME* in)
 {
 }
@@ -1007,6 +1003,10 @@
 {
 }

+void Visitor::children_ht_iterator(HT_ITERATOR* in)
+{
+}
+
 // Unparser support
 void Visitor::visit_marker(char const* name, bool value)
 {
@@ -1383,12 +1383,6 @@
     pre_foreign_expr((Foreign_expr*) in);
 }

-void Visitor::pre_ht_iterator_chain(HT_ITERATOR* in)
-{
-    pre_node((Node*) in);
-    pre_ht_iterator((HT_ITERATOR*) in);
-}
-
 void Visitor::pre_class_name_chain(CLASS_NAME* in)
 {
     pre_node((Node*) in);
@@ -1500,6 +1494,13 @@
     pre_label_name((LABEL_NAME*) in);
 }

+void Visitor::pre_ht_iterator_chain(HT_ITERATOR* in)
+{
+    pre_node((Node*) in);
+    pre_identifier((Identifier*) in);
+    pre_ht_iterator((HT_ITERATOR*) in);
+}
+
 // Invoke the chain of post-visit methods along the inheritance hierarchy
 // (invoked in opposite order to the pre-chain)
 // Do not override unless you know what you are doing
@@ -1856,12 +1857,6 @@
     post_node((Node*) in);
 }

-void Visitor::post_ht_iterator_chain(HT_ITERATOR* in)
-{
-    post_ht_iterator((HT_ITERATOR*) in);
-    post_node((Node*) in);
-}
-
 void Visitor::post_class_name_chain(CLASS_NAME* in)
 {
     post_class_name((CLASS_NAME*) in);
@@ -1969,6 +1964,13 @@
 void Visitor::post_label_name_chain(LABEL_NAME* in)
 {
     post_label_name((LABEL_NAME*) in);
+    post_identifier((Identifier*) in);
+    post_node((Node*) in);
+}
+
+void Visitor::post_ht_iterator_chain(HT_ITERATOR* in)
+{
+    post_ht_iterator((HT_ITERATOR*) in);
     post_identifier((Identifier*) in);
     post_node((Node*) in);
 }

Modified: trunk/src/generated/MIR_visitor.h
==============================================================================
--- trunk/src/generated/MIR_visitor.h	(original)
+++ trunk/src/generated/MIR_visitor.h	Wed Jul  2 04:27:46 2008
@@ -91,7 +91,6 @@
     virtual void pre_foreign(Foreign* in);
     virtual void pre_foreign_statement(Foreign_statement* in);
     virtual void pre_foreign_expr(Foreign_expr* in);
-    virtual void pre_ht_iterator(HT_ITERATOR* in);
     virtual void pre_class_name(CLASS_NAME* in);
     virtual void pre_interface_name(INTERFACE_NAME* in);
     virtual void pre_method_name(METHOD_NAME* in);
@@ -105,6 +104,7 @@
     virtual void pre_cast(CAST* in);
     virtual void pre_constant_name(CONSTANT_NAME* in);
     virtual void pre_label_name(LABEL_NAME* in);
+    virtual void pre_ht_iterator(HT_ITERATOR* in);
 // Invoked after the children have been visited
 public:
     virtual void post_node(Node* in);
@@ -171,7 +171,6 @@
     virtual void post_foreign(Foreign* in);
     virtual void post_foreign_statement(Foreign_statement* in);
     virtual void post_foreign_expr(Foreign_expr* in);
-    virtual void post_ht_iterator(HT_ITERATOR* in);
     virtual void post_class_name(CLASS_NAME* in);
     virtual void post_interface_name(INTERFACE_NAME* in);
     virtual void post_method_name(METHOD_NAME* in);
@@ -185,6 +184,7 @@
     virtual void post_cast(CAST* in);
     virtual void post_constant_name(CONSTANT_NAME* in);
     virtual void post_label_name(LABEL_NAME* in);
+    virtual void post_ht_iterator(HT_ITERATOR* in);
 // Visit the children of a node
 public:
     virtual void children_php_script(PHP_script* in);
@@ -240,7 +240,6 @@
     virtual void children_foreign_expr(Foreign_expr* in);
 // Tokens don't have children, so these methods do nothing by default
 public:
-    virtual void children_ht_iterator(HT_ITERATOR* in);
     virtual void children_class_name(CLASS_NAME* in);
     virtual void children_interface_name(INTERFACE_NAME* in);
     virtual void children_method_name(METHOD_NAME* in);
@@ -254,6 +253,7 @@
     virtual void children_cast(CAST* in);
     virtual void children_constant_name(CONSTANT_NAME* in);
     virtual void children_label_name(LABEL_NAME* in);
+    virtual void children_ht_iterator(HT_ITERATOR* in);
 // Unparser support
 public:
     virtual void visit_marker(char const* name, bool value);
@@ -315,7 +315,6 @@
     virtual void pre_foreach_get_val_chain(Foreach_get_val* in);
     virtual void pre_foreign_statement_chain(Foreign_statement* in);
     virtual void pre_foreign_expr_chain(Foreign_expr* in);
-    virtual void pre_ht_iterator_chain(HT_ITERATOR* in);
     virtual void pre_class_name_chain(CLASS_NAME* in);
     virtual void pre_interface_name_chain(INTERFACE_NAME* in);
     virtual void pre_method_name_chain(METHOD_NAME* in);
@@ -329,6 +328,7 @@
     virtual void pre_cast_chain(CAST* in);
     virtual void pre_constant_name_chain(CONSTANT_NAME* in);
     virtual void pre_label_name_chain(LABEL_NAME* in);
+    virtual void pre_ht_iterator_chain(HT_ITERATOR* in);
 // Invoke the chain of post-visit methods along the inheritance hierarchy
 // (invoked in opposite order to the pre-chain)
 // Do not override unless you know what you are doing
@@ -384,7 +384,6 @@
     virtual void post_foreach_get_val_chain(Foreach_get_val* in);
     virtual void post_foreign_statement_chain(Foreign_statement* in);
     virtual void post_foreign_expr_chain(Foreign_expr* in);
-    virtual void post_ht_iterator_chain(HT_ITERATOR* in);
     virtual void post_class_name_chain(CLASS_NAME* in);
     virtual void post_interface_name_chain(INTERFACE_NAME* in);
     virtual void post_method_name_chain(METHOD_NAME* in);
@@ -398,6 +397,7 @@
     virtual void post_cast_chain(CAST* in);
     virtual void post_constant_name_chain(CONSTANT_NAME* in);
     virtual void post_label_name_chain(LABEL_NAME* in);
+    virtual void post_ht_iterator_chain(HT_ITERATOR* in);
 // Call the pre-chain, visit children and post-chain in order
 // Do not override unless you know what you are doing
 public:

Modified: trunk/src/generated_src/mir.tea
==============================================================================
--- trunk/src/generated_src/mir.tea	(original)
+++ trunk/src/generated_src/mir.tea	Wed Jul  2 04:27:46 2008
@@ -153,12 +153,12 @@
 Goto ::= LABEL_NAME ;
 Label ::= LABEL_NAME ;

-Foreach_reset ::= array:VARIABLE_NAME iter:HT_ITERATOR<long> ;
-Foreach_next ::= array:VARIABLE_NAME iter:HT_ITERATOR<long> ;
-Foreach_end ::= array:VARIABLE_NAME iter:HT_ITERATOR<long> ;
-Foreach_has_key ::= array:VARIABLE_NAME iter:HT_ITERATOR<long> ;
-Foreach_get_key ::= array:VARIABLE_NAME iter:HT_ITERATOR<long> ;
-Foreach_get_val ::= array:VARIABLE_NAME key:VARIABLE_NAME iter:HT_ITERATOR<long> ;
+Foreach_reset ::= array:VARIABLE_NAME iter:HT_ITERATOR ;
+Foreach_next ::= array:VARIABLE_NAME iter:HT_ITERATOR ;
+Foreach_end ::= array:VARIABLE_NAME iter:HT_ITERATOR ;
+Foreach_has_key ::= array:VARIABLE_NAME iter:HT_ITERATOR ;
+Foreach_get_key ::= array:VARIABLE_NAME iter:HT_ITERATOR ;
+Foreach_get_val ::= array:VARIABLE_NAME key:VARIABLE_NAME iter:HT_ITERATOR ;

 {-
  - Additional structure
@@ -166,7 +166,7 @@

 Identifier ::=
 	  INTERFACE_NAME | CLASS_NAME | METHOD_NAME | VARIABLE_NAME
-	  | CAST | OP | CONSTANT_NAME | LABEL_NAME
+	  | CAST | OP | CONSTANT_NAME | LABEL_NAME | HT_ITERATOR
 	;

 Foreign ::= Foreign_statement | Foreign_expr ;
@@ -491,25 +491,6 @@
 		this->variable_name = variable_name;
 	}
 };
-
-class HT_ITERATOR
-{
-public:
-	HT_ITERATOR (long identifier)
-	{
-		value = identifier;
-		std::ostringstream os;
-		os << "ht_iterator_" << value;
-	}
-
-	String* get_value_as_string ()
-	{
-		std::ostringstream os;
-		os << "ht_iterator_" << value;
-		return new String(os.str());
-	}
-};
-

 class Identifier
 {

Modified: trunk/src/parsing/XML_parser.h
==============================================================================
--- trunk/src/parsing/XML_parser.h	(original)
+++ trunk/src/parsing/XML_parser.h	Wed Jul  2 04:27:46 2008
@@ -405,26 +405,49 @@

 class AST_XML_parser : public XML_parser
 <
-	AST::PHP_script,
-	AST::Node,
-	AST::Node_factory,
-	AST::STRING,
-	AST::CAST,
-	AST::INT,
-	AST::REAL,
-	AST::BOOL,
+	AST::PHP_script,
+	AST::Node,
+	AST::Node_factory,
+	AST::STRING,
+	AST::CAST,
+	AST::INT,
+	AST::REAL,
+	AST::BOOL,
 	AST::NIL
 >
 {
 };

-class HIR_XML_parser : public XML_parser <HIR::PHP_script, HIR::Node, 
HIR::Node_factory, HIR::STRING, HIR::CAST, HIR::INT, HIR::REAL, 
HIR::BOOL, HIR::NIL>
+class HIR_XML_parser : public XML_parser
+<
+	HIR::PHP_script,
+	HIR::Node,
+	HIR::Node_factory,
+	HIR::STRING,
+	HIR::CAST,
+	HIR::INT,
+	HIR::REAL,
+	HIR::BOOL,
+	HIR::NIL
+>
 {
 };

-class MIR_XML_parser : public XML_parser <MIR::PHP_script, MIR::Node, 
MIR::Node_factory, MIR::STRING, MIR::CAST, MIR::INT, MIR::REAL, 
MIR::BOOL, MIR::NIL>
+class MIR_XML_parser : public XML_parser
+<
+	MIR::PHP_script,
+	MIR::Node,
+	MIR::Node_factory,
+	MIR::STRING,
+	MIR::CAST,
+	MIR::INT,
+	MIR::REAL,
+	MIR::BOOL,
+	MIR::NIL
+>
 {
 };
+
 #endif // HAVE_XERCES

 #endif // PHC_XML_PARSER_H

Modified: trunk/src/process_ir/fresh.cpp
==============================================================================
--- trunk/src/process_ir/fresh.cpp	(original)
+++ trunk/src/process_ir/fresh.cpp	Wed Jul  2 04:27:46 2008
@@ -118,7 +118,7 @@
 	HT_ITERATOR* fresh_iter ()
 	{
 		int suffix = fresh_suffix ();
-		HT_ITERATOR* result = new HT_ITERATOR (suffix);
+		HT_ITERATOR* result = new HT_ITERATOR (fresh ("ht_iterator", suffix));
 		result->attrs->set ("phc.fresh.suffix", new Integer (suffix));
 		return result;
 	}

Modified: trunk/src/process_mir/MIR_to_AST.h
==============================================================================
--- trunk/src/process_mir/MIR_to_AST.h	(original)
+++ trunk/src/process_mir/MIR_to_AST.h	Wed Jul  2 04:27:46 2008
@@ -56,7 +56,7 @@
  AST::Formal_parameter*,	// Formal_parameter*
  AST::Global*,					// Global*
  AST::Foreign_statement*,	// Goto*
- AST::Foreign_expr*,			// HT_ITERATOR*
+ AST::Identifier*,			// HT_ITERATOR* - is really a Foreign_expr
  AST::INT*,						// INT*
  AST::INTERFACE_NAME*,		// INTERFACE_NAME*
  AST::Identifier*,			// Identifier*
@@ -103,6 +103,11 @@
  AST::Expr*						// Variable_variable*
 >
 {
+public:
+	MIR_to_AST ()
+	{
+		foreign_expr = NULL;
+	}

 	AST::Variable* wrap_var_name (AST::VARIABLE_NAME* var_name)
 	{
@@ -321,43 +326,53 @@
 		return NULL;
 	}

-	AST::Foreign_statement* fold_impl_foreach_reset (MIR::Foreach_reset* 
orig, AST::VARIABLE_NAME* array, AST::Foreign_expr* iter)
+	AST::Foreign_statement* fold_impl_foreach_reset (MIR::Foreach_reset* 
orig, AST::VARIABLE_NAME* array, AST::Identifier* iter)
 	{
 		return new AST::Foreign_statement (orig);
 	}

-	AST::Foreign_statement* fold_impl_foreach_next (MIR::Foreach_next* 
orig, AST::VARIABLE_NAME* array, AST::Foreign_expr* iter)
+	AST::Foreign_statement* fold_impl_foreach_next (MIR::Foreach_next* 
orig, AST::VARIABLE_NAME* array, AST::Identifier* iter)
 	{
 		return new AST::Foreign_statement (orig);
 	}

-	AST::Foreign_statement* fold_impl_foreach_end (MIR::Foreach_end* 
orig, AST::VARIABLE_NAME* array, AST::Foreign_expr* iter)
+	AST::Foreign_statement* fold_impl_foreach_end (MIR::Foreach_end* 
orig, AST::VARIABLE_NAME* array, AST::Identifier* iter)
 	{
 		return new AST::Foreign_statement (orig);
 	}

-	AST::Foreign_expr* fold_impl_foreach_has_key (MIR::Foreach_has_key* 
orig, AST::VARIABLE_NAME* array, AST::Foreign_expr* iter)
+	AST::Foreign_expr* fold_impl_foreach_has_key (MIR::Foreach_has_key* 
orig, AST::VARIABLE_NAME* array, AST::Identifier* iter)
 	{
 		return new AST::Foreign_expr (orig);
 	}

-	AST::Foreign_expr* fold_impl_foreach_get_key (MIR::Foreach_get_key* 
orig, AST::VARIABLE_NAME* array, AST::Foreign_expr* iter)
+	AST::Foreign_expr* fold_impl_foreach_get_key (MIR::Foreach_get_key* 
orig, AST::VARIABLE_NAME* array, AST::Identifier* iter)
 	{
 		return new AST::Foreign_expr (orig);
 	}

-	AST::Foreign_expr* fold_impl_foreach_get_val (MIR::Foreach_get_val* 
orig, AST::VARIABLE_NAME* array, AST::VARIABLE_NAME* key, 
AST::Foreign_expr* iter)
+	AST::Foreign_expr* fold_impl_foreach_get_val (MIR::Foreach_get_val* 
orig, AST::VARIABLE_NAME* array, AST::VARIABLE_NAME* key, 
AST::Identifier* iter)
 	{
 		return new AST::Foreign_expr (orig);
 	}

-	AST::Foreign_expr* fold_ht_iterator (MIR::HT_ITERATOR* orig)
+	AST::Identifier* fold_ht_iterator (MIR::HT_ITERATOR* orig)
 	{
-		return new AST::Foreign_expr (orig);
+		foreign_expr = new AST::Foreign_expr (orig);
+		return NULL;
 	}

+	AST::Foreign_expr* foreign_expr;	
  	AST::Eval_expr* fold_impl_assign_var (MIR::Assign_var* orig, 
AST::VARIABLE_NAME* lhs, bool is_ref, AST::Expr* rhs)
 	{
+		// Trick to bypass type rules
+		if (rhs == NULL && foreign_expr != NULL)
+		{
+			rhs = foreign_expr;
+			foreign_expr = NULL;
+		}
+
+
 		AST::Assignment* result;
 		result = new AST::Assignment(
 			new AST::Variable (
@@ -431,6 +446,13 @@

 	AST::Eval_expr* fold_impl_eval_expr (MIR::Eval_expr* orig, AST::Expr* expr)
 	{
+		// Trick to bypass type rules
+		if (expr == NULL && foreign_expr != NULL)
+		{
+			expr = foreign_expr;
+			foreign_expr = NULL;
+		}
+
 		AST::Eval_expr* result;
 		result = new AST::Eval_expr(expr);
 		result->attrs = orig->attrs;

Modified: trunk/src/process_mir/MIR_unparser.cpp
==============================================================================
--- trunk/src/process_mir/MIR_unparser.cpp	(original)
+++ trunk/src/process_mir/MIR_unparser.cpp	Wed Jul  2 04:27:46 2008
@@ -30,7 +30,12 @@
 {
 	Node* mir = dynamic_cast<Node*> (in);
 	AST::Node* ast = (new MIR_to_AST ())->fold_node (mir);
-	ast_unparser->unparse (ast);
+
+	// We dont return foreign_expr
+	if (ast == NULL)
+		unparse_foreign (in);
+	else
+		ast_unparser->unparse (ast);
 }

 void MIR_unparser::unparse_foreign (IR::Node* in)
@@ -97,7 +102,6 @@

 void MIR_unparser::children_ht_iterator(HT_ITERATOR* in)
 {
-	// we leave out the $ to handle in the same manner as VARIABLE_NAME
 	echo (in->get_value_as_string ());
 }



More information about the phc-internals mailing list