[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