// Do not edit this file! // // Automatically generated by Emacs: // // node defs: nodetypes.def // builder : tree-nodes.h.el // timestamp: Mon Aug 22 04:09:15 2005 class StatementNode : public TreeNode { public: StatementNode* clone () const = 0; StatementNode* deepClone () const = 0; void codeGen ( CodeContext & ); virtual void emitStatement( CodeContext & ); CfgExtent getCfgExtent(); void pseudoprint(ostream &os, unsigned depth) const; CfgExtent makeCfg(); virtual bool isStatementNode(void) const; TreeNode * deleteStmts(treeSet *s); void unwindTree( CleanupList &, const TreeNode * ) const; void unwindUntil( const TreeNode * ); protected: StatementNode (); CfgNode * _cfgBeg; CfgNode * _cfgEnd; }; class IterationNode : public StatementNode { public: IterationNode* clone () const = 0; IterationNode* deepClone () const = 0; bool isLoop() const; CfgNode *getContinueTarget(); protected: IterationNode () {} CfgNode * _cfgContinueNode; }; class LoopNode : public IterationNode { public: LoopNode* clone () const = 0; LoopNode* deepClone () const = 0; TreeNode* resolveName (const NameContext &ctx); SingleState single(SingleContext *ctx); protected: LoopNode () {} }; class MonitorFetchNode : public StatementNode { public: MonitorFetchNode* clone () const = 0; MonitorFetchNode* deepClone () const = 0; bool checkIF(bool serious) const; CfgExtent makeCfg(); const string &holder() const; void declareHolder( CodeContext & ) const; static void resetGenerator(); virtual bool superfluous() const = 0; protected: MonitorFetchNode () {} static UniqueId generator; mutable string _holder; }; class MonitorUseNode : public StatementNode { public: MonitorUseNode* clone () const = 0; MonitorUseNode* deepClone () const = 0; bool checkIF(bool serious) const; CfgExtent makeCfg(); bool superfluous() const; TreeNode *optimizeMonitors( MonitorStats & ); protected: MonitorUseNode () {} }; class MethodNode : public TreeNode { public: MethodNode* clone () const = 0; MethodNode* deepClone () const = 0; void resolveClass (ClassContext *ctx); MethodDecl* decl () const; void foldFields(); TreeNode *instantiate(Subst *args); bool typecheck(TypeContext *ctx); void unshareType(); void infer( const InferContext & ); void enact( const EnactContext & ); void reportChange( const char * ) const; void checkSglobal() const; void inferLocalTree( const LocalContext & ); void inferSharingLateTree( const SharingContext & ); void inferSharingEarly( SharingSolver & ) const; bool checkIF(bool serious) const; protected: MethodNode () {} }; class DataDeclNode : public TreeNode { public: DataDeclNode* clone () const = 0; DataDeclNode* deepClone () const = 0; bool typecheck(TypeContext *ctx); void unshareType(); void infer( const InferContext & ); void enact( const EnactContext & ); protected: DataDeclNode () {} }; class TypeDeclNode : public TreeNode { public: TypeDeclNode* clone () const = 0; TypeDeclNode* deepClone () const = 0; ClassDecl* decl () const; TreeNode* resolveName (const NameContext &ctx); bool verifyCircularity() const; void reportCircularity() const; TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); void resolveTemplate( const TemplateContext & ); void resolveRequires(ClassDecl *); SingleState single(SingleContext *ctx); bool typecheck(TypeContext *ctx); bool reachability(ReachableContext &); void inferLocalTree( const LocalContext & ); void inferLocalChildren( const LocalContext & ) const; void localEnactChildren( const LocalEnactContext & ) const; void inferSharingLateChildren( const SharingContext & ) const; void inferSharingLateTree( const SharingContext & ); void inferSharingEarlyChildren( SharingSolver & ) const; void sharingEnactChildren( const SharingEnactContext & ) const; protected: TypeDeclNode () {} }; class PrimitiveTypeNode : public TypeNode { public: PrimitiveTypeNode* clone () const = 0; PrimitiveTypeNode* deepClone () const = 0; bool isAtomic () const; void emitNullifyLocal( ostream &, const string & ) const; virtual const char *cPrimitiveTypeName() const = 0; const CtType &cDescriptorTypeCreate() const; const CtType &cTypeCreateUnboxed() const; protected: PrimitiveTypeNode () {} }; class ArrayTypeNode : public TypeNode { public: ArrayTypeNode* clone () const = 0; ArrayTypeNode* deepClone () const = 0; bool isArrayType () const; bool hasReference() const; Modifiers modifiers () const; void checkQualifiers() const; string typeName() const; void buildArrayTypeName( string & ) const; virtual string dimensionTypeName() const = 0; int templateDepth() const; TypeNode *unshareNode( const TreeNode * ); void conservative( QualSolver & ) const; bool enactType( const EnactContext & ); void identicalTo( const TypeNode &, QualSolver & ) const; void protect( QualSolver & ) const; void similarTo( const TypeNode &, QualSolver & ) const; void stronglySubsumedBy( const TypeNode &, QualSolver & ) const; void weaklySubsumedBy( const TypeNode &, QualSolver & ) const; void subcastTo( const TypeNode &, QualSolver & ) const; void localCastTo( const TypeNode &, LocalSolver &solver ) const; void sharingCastTo( const TypeNode &, SharingSolver &solver ) const; void inferSharingEarly( SharingSolver & ) const; protected: ArrayTypeNode () {} }; class TypeListNode : public TreeListNode { public: TypeListNode(llist *&_children, SourcePosn p = NoSourcePosition) : TreeListNode( p ) { initialize((llist *)_children); _children = 0; } const char* oper_name() const { return "TypeListNode"; } TypeListNode *clone() const; TypeListNode* deepClone () const; TypeNode* child(int i) const { return reinterpret_cast(TreeListNode::child(i)); } void child(int i, TypeNode* replacement) { TreeListNode::child(i, replacement); } string signature () const; bool typeIdentNM(const TreeNode*) const; bool singleArgsIdent(const TreeNode* T1) const; string typeName() const; void conservative( QualSolver & ) const; bool enactType( const EnactContext & ); void identicalTo( TypeListNode &, QualSolver & ) const; bool checkIF(bool serious) const; protected: TypeListNode ( SourcePosn posn = NoSourcePosition ) : TreeListNode( posn ) {} }; class FieldAccessNode : public ExprNode { public: FieldAccessNode* clone () const = 0; FieldAccessNode* deepClone () const = 0; TypeNode* __type (); MemberDecl* decl () const; SingleState single(SingleContext *ctx); SingleState singleAssign(const SingleState &from, SingleContext *ctx); void checkAssignable(TreeNode *with, bool ignoreInstanceFinal, bool ignoreStaticFinal, Decl* currentClass); void checkFieldAssignment(TreeNode &); void checkFinalFieldAssignment(bool, bool); bool _typecheck(TypeContext *ctx); bool fieldChainEnd() const; void checkEmbeddedLocals(); void sglobalDataAssign(); void receiveAssign( const TypeNode &, QualSolver & ) const; bool isFieldOfImmutable() const; void findDefs(Defs *); void resolveRequires(ClassDecl *); llist *getDefs(void) const; llist *getUses(void) const; void setDefs(llist *); void setUses(llist *); virtual bool hasLval(void) const; protected: FieldAccessNode () {} }; class IncrDecrNode : public ExprNode { public: IncrDecrNode* clone () const = 0; IncrDecrNode* deepClone () const = 0; TypeNode* __type (); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); ExprNode *lower(llist *&decls, llist *&stmts); const string emitBumpExpr( CodeContext &, bool, bool ); void sglobalData(); protected: IncrDecrNode () {} }; class UnaryArithNode : public ExprNode { public: UnaryArithNode* clone () const = 0; UnaryArithNode* deepClone () const = 0; TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); ExprNode *lower(llist *&decls, llist *&stmts); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); protected: UnaryArithNode () {} }; class BinaryArithNode : public ExprNode { public: BinaryArithNode* clone () const = 0; BinaryArithNode* deepClone () const = 0; TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); ExprNode *lower(llist *&decls, llist *&stmts); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); protected: BinaryArithNode () {} }; class BinaryArithAssignNode : public ExprNode { public: BinaryArithAssignNode* clone () const = 0; BinaryArithAssignNode* deepClone () const = 0; TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); TypeNode *widenSource(); TypeNode *castResult(); ExprNode *lower(llist *&decls, llist *&stmts); void sglobalData(); protected: BinaryArithAssignNode () {} }; class ShiftNode : public ExprNode { public: ShiftNode* clone () const = 0; ShiftNode* deepClone () const = 0; TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); ExprNode *lower(llist *&decls, llist *&stmts); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); protected: ShiftNode () {} }; class ShiftAssignNode : public ExprNode { public: ShiftAssignNode* clone () const = 0; ShiftAssignNode* deepClone () const = 0; TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); TypeNode *widenSource(); TypeNode *castResult(); ExprNode *lower(llist *&decls, llist *&stmts); void sglobalData(); protected: ShiftAssignNode () {} }; class RelationNode : public ExprNode { public: RelationNode* clone () const = 0; RelationNode* deepClone () const = 0; TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); ExprNode *lower(llist *&decls, llist *&stmts); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); protected: RelationNode () {} }; class EqualityNode : public ExprNode { public: EqualityNode* clone () const = 0; EqualityNode* deepClone () const = 0; TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); ExprNode *lower(llist *&decls, llist *&stmts); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); void infer( const InferContext & ); void inferSharingLate( const SharingContext & ); protected: EqualityNode () {} }; class BitwiseNode : public ExprNode { public: BitwiseNode* clone () const = 0; BitwiseNode* deepClone () const = 0; TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); ExprNode *lower(llist *&decls, llist *&stmts); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); protected: BitwiseNode () {} }; class BitwiseAssignNode : public ExprNode { public: BitwiseAssignNode* clone () const = 0; BitwiseAssignNode* deepClone () const = 0; TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); TypeNode *widenSource(); TypeNode *castResult(); ExprNode *lower(llist *&decls, llist *&stmts); void sglobalData(); protected: BitwiseAssignNode () {} }; class LogCondNode : public ExprNode { public: LogCondNode* clone () const = 0; LogCondNode* deepClone () const = 0; TypeNode* __type (); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); protected: LogCondNode () {} }; class DynamicTypeNode : public ExprNode { public: DynamicTypeNode* clone () const = 0; DynamicTypeNode* deepClone () const = 0; bool _typecheck(TypeContext *ctx); const string emitTypeCheck( const string & ); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); void resolveRequires(ClassDecl *); bool canCastStatically() const; void infer( const InferContext & ); void inferLocal( const LocalContext & ); void inferSharingLate( const SharingContext & ); protected: DynamicTypeNode () {} }; class LitNode : public ExprNode { public: LitNode* clone () const = 0; LitNode* deepClone () const = 0; SingleState single(SingleContext *ctx); bool isLitNode () const; void checkTemplateActual( TemplateCheckContext &, const string &, TypeNode & ); int templateDepth() const; string mangle() = 0; protected: LitNode () {} }; class NameNode : public TreeNode { public: NameNode (TreeNode * qualifier, const string* ident, Decl* decl, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; NameNode* clone () const; NameNode* deepClone () const; const string* ident () const { return _ident; } void ident (const string* v) { _ident = v; } Decl* decl () const { return _decl; } void decl (Decl* v) { _decl = v; } TreeNode* qualifier () const { return (TreeNode*)_children[0]; } void qualifier (TreeNode* v) { child(0, v); } string signature () const; TreeNode* simpName () const; TreeNode *buildTypeEnv(TypeContext *ctx); TreeNode *instantiate(Subst *args); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); bool checkIF(bool serious) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: NameNode () {} protected: const string* _ident; Decl* _decl; TreeNode* _children[1]; }; class PrimitiveLitNode : public LitNode { public: PrimitiveLitNode (Literal literal, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PrimitiveLitNode* clone () const; PrimitiveLitNode* deepClone () const; Literal literal () const { return _literal; } void literal (Literal v) { _literal = v; } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); bool isIntConstant(int from, int to) const; Common::Kind constantType() const; void pseudoprint(ostream &os, unsigned depth) const; bool typeIdentNM(const TreeNode*) const; string unqualifiedTypeName() const; bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); MIVE * defaultMIVE(MIVEcontext *) const; TypeNode *asType2(TypeNode *base); bool isArraySpecifier(Decl *package, Environ *fileEnv); Bitset *getValues(AliasInfos *ai); virtual const string simpleVar( CodeContext & ); string mangle(); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PrimitiveLitNode () {} protected: Literal _literal; }; class StringLitNode : public LitNode { public: StringLitNode (string16 text, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; StringLitNode* clone () const; StringLitNode* deepClone () const; string16 text () const { return _text; } void text (string16 v) { _text = v; } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); void resolveRequires(ClassDecl *); void pseudoprint(ostream &os, unsigned depth) const; void infer( const InferContext & ); void findInitDependencies(Decl *, set *, set *); Bitset *getValues(AliasInfos *ai); string mangle(); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: StringLitNode () {} protected: string16 _text; }; class BoolTypeNode : public PrimitiveTypeNode { public: BoolTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; BoolTypeNode* clone () const; BoolTypeNode* deepClone () const; TypeNode::Kind kind () const; TypeNode::Kind kindsAssignableTo () const; TypeNode::Kind kindsCastableTo () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; string unqualifiedTypeName() const; TypeDecl* decl () const; const char *cPrimitiveTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class CharTypeNode : public PrimitiveTypeNode { public: CharTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CharTypeNode* clone () const; CharTypeNode* deepClone () const; TypeNode::Kind kind () const; TypeNode::Kind kindsAssignableTo () const; TypeNode::Kind kindsCastableTo () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; bool isAssignableFromConstant(const TreeNode *with) const; string unqualifiedTypeName() const; TypeDecl* decl () const; const char *cPrimitiveTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class ByteTypeNode : public PrimitiveTypeNode { public: ByteTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ByteTypeNode* clone () const; ByteTypeNode* deepClone () const; TypeNode::Kind kind () const; TypeNode::Kind kindsAssignableTo () const; TypeNode::Kind kindsCastableTo () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; bool isAssignableFromConstant(const TreeNode *with) const; string unqualifiedTypeName() const; TypeDecl* decl () const; const char *cPrimitiveTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class ShortTypeNode : public PrimitiveTypeNode { public: ShortTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ShortTypeNode* clone () const; ShortTypeNode* deepClone () const; TypeNode::Kind kind () const; TypeNode::Kind kindsAssignableTo () const; TypeNode::Kind kindsCastableTo () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; bool isAssignableFromConstant(const TreeNode *with) const; string unqualifiedTypeName() const; TypeDecl* decl () const; const char *cPrimitiveTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class IntTypeNode : public PrimitiveTypeNode { public: IntTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; IntTypeNode* clone () const; IntTypeNode* deepClone () const; TypeNode::Kind kind () const; TypeNode::Kind kindsAssignableTo () const; TypeNode::Kind kindsCastableTo () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; string unqualifiedTypeName() const; TypeDecl* decl () const; const char *cPrimitiveTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class FloatTypeNode : public PrimitiveTypeNode { public: FloatTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; FloatTypeNode* clone () const; FloatTypeNode* deepClone () const; TypeNode::Kind kind () const; TypeNode::Kind kindsAssignableTo () const; TypeNode::Kind kindsCastableTo () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; string unqualifiedTypeName() const; TypeDecl* decl () const; const char *cPrimitiveTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class LongTypeNode : public PrimitiveTypeNode { public: LongTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; LongTypeNode* clone () const; LongTypeNode* deepClone () const; TypeNode::Kind kind () const; TypeNode::Kind kindsAssignableTo () const; TypeNode::Kind kindsCastableTo () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; string unqualifiedTypeName() const; TypeDecl* decl () const; const char *cPrimitiveTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class DoubleTypeNode : public PrimitiveTypeNode { public: DoubleTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; DoubleTypeNode* clone () const; DoubleTypeNode* deepClone () const; TypeNode::Kind kind () const; TypeNode::Kind kindsAssignableTo () const; TypeNode::Kind kindsCastableTo () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; string unqualifiedTypeName() const; TypeDecl* decl () const; const char *cPrimitiveTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class TypeNameNode : public TypeNode { public: TypeNameNode (TreeNode * name, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TypeNameNode* clone () const; TypeNameNode* deepClone () const; TreeNode* name () const { return (TreeNode*)_children[0]; } void name (TreeNode* v) { child(0, v); } TypeNode::Kind kind () const; bool typeIdentNM(const TreeNode*) const; string unqualifiedTypeName() const; TreeNode *buildTypeEnv(TypeContext *ctx); bool isAssignableFromConstant(const TreeNode *with) const; bool hasReference() const; ClassDecl* decl () const; string signature () const; TreeNode *instantiate(Subst *args); bool isSharedField() const; int templateDepth() const; bool isAtomic () const; TreeNode *resolveTypes(TypeContext *ctx); bool isNamedType() const; TreeNode* resolveName (const NameContext &ctx); void emitNullifyLocal( ostream &, const string & ) const; bool needsProtection() const; void subcastTo( const TypeNode &, QualSolver & ) const; void localCastTo( const TypeNode &, LocalSolver &solver ) const; void sharingCastTo( const TypeNode &, SharingSolver &solver ) const; void inferSharingEarly( SharingSolver & ) const; const CtType &cDescriptorTypeCreate() const; const CtType &cTypeCreateUnboxed() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TypeNameNode () {} protected: TreeNode* _children[1]; }; class JavaArrayTypeNode : public ArrayTypeNode { public: JavaArrayTypeNode (TypeNode * elementType, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; JavaArrayTypeNode* clone () const; JavaArrayTypeNode* deepClone () const; TypeNode* elementType () const { return (TypeNode*)_children[0]; } void elementType (TypeNode* v) { child(0, v); } TypeNode::Kind kind () const; string signature () const; TypeDecl* decl () const; string dimensionTypeName() const; bool isJavaArrayType () const; TypeNode *indexType() const; void subsimilarTo( const TypeNode &, QualSolver & ) const; const CtType &cTypeCreateUnboxed() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: JavaArrayTypeNode () {} protected: TreeNode* _children[1]; }; class CompileUnitNode : public TreeNode { public: CompileUnitNode (const string* ident, TreeNode * package, llist * imports, TreeNode * types, Environ * environ, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CompileUnitNode* clone () const; CompileUnitNode* deepClone () const; const string* ident () const { return _ident; } void ident (const string* v) { _ident = v; } Environ * environ () const { return _environ; } void environ (Environ * v) { _environ = v; } TreeNode* package () const { return (TreeNode*)_children[0]; } void package (TreeNode* v) { child(0, v); } TreeListNode* imports () const { return (TreeListNode*)_children[1]; } void imports (TreeListNode* v) { child(1, v); } TreeNode* types () const { return (TreeNode*)_children[2]; } void types (TreeNode* v) { child(2, v); } void loaded(bool typesResolved); void resolvePackage (Decl* package, Environ *fileEnv, Environ *typeEnviron, bool recurse); TreeNode *resolveTypes(TypeContext *ctx); void resolveClass (ClassContext *ctx); TreeNode* resolveName (const NameContext &ctx); TreeNode *foldConstants(); void flattenClasses(FlattenContext *ctx); TreeNode *buildTypeEnv(TypeContext *ctx); void resolveInstantiation( Environ &, TypeDeclNode & ); void lookForMain() const; void checkSglobal() const; bool verifyCircularity() const; void reportCircularity() const; TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); bool typecheck(TypeContext *ctx); bool reachability(ReachableContext &); void widen(); SingleState single(SingleContext *ctx); TreeNode *rewrite( const FieldContext * ); void resolveInheritance(); void packageResolution(); void importOnDemand(Decl *importedPackage); void importOnDemand(const string *s1, const string *s2); bool selectedForCodeGen(bool) const; bool isExported() const; void codeGen (); void pseudoprint(ostream &os, unsigned depth) const; void findInitDependencies(Decl *, set *, set *); void inferLocalTree( const LocalContext & ); void localEnactChildren( const LocalEnactContext & ) const; void inferSharingLateTree( const SharingContext & ); void sharingEnactChildren( const SharingEnactContext & ) const; void emitDebugInfo( ofstream &, StringTable & ); bool checkIF(bool serious) const; CompileUnitNode *lazyStaticSemantics(); TiPragma pragma(); TreeNode *optimizeMonitors( MonitorStats & ); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: CompileUnitNode (); protected: const string* _ident; Environ * _environ; TreeNode* _children[3]; Decl * thePackage; llist * importedPackages; bool ranLazyStaticSemantics; TiPragma _pragma; }; class ImportNode : public TreeNode { public: ImportNode (TreeNode * name, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ImportNode* clone () const; ImportNode* deepClone () const; TreeNode* name () const { return (TreeNode*)_children[0]; } void name (TreeNode* v) { child(0, v); } void resolveImports(CompileUnitNode *file, Environ *fileEnv); bool checkIF(bool serious) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ImportNode () {} protected: TreeNode* _children[1]; }; class ImportOnDemandNode : public TreeNode { public: ImportOnDemandNode (TreeNode * name, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ImportOnDemandNode* clone () const; ImportOnDemandNode* deepClone () const; TreeNode* name () const { return (TreeNode*)_children[0]; } void name (TreeNode* v) { child(0, v); } void resolveImports(CompileUnitNode *file, Environ *fileEnv); bool checkIF(bool serious) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ImportOnDemandNode () {} protected: TreeNode* _children[1]; }; class ClassDeclNode : public TypeDeclNode { public: ClassDeclNode (Common::Modifiers flags, TreeNode * simpName, TreeNode * superClass, llist * interfaces, llist * members, TypeDeclNode * enclosingType, TreeNode * enclosingBlock, NameNode * declaredName, bool hasEnclosingInstance, TreeNode * finalVars, TreeNode::AllocateContext * allocateContext, int classNum, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ClassDeclNode* clone () const; ClassDeclNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TypeDeclNode * enclosingType () const { return _enclosingType; } void enclosingType (TypeDeclNode * v) { _enclosingType = v; } TreeNode * enclosingBlock () const { return _enclosingBlock; } void enclosingBlock (TreeNode * v) { _enclosingBlock = v; } NameNode * declaredName () const { return _declaredName; } void declaredName (NameNode * v) { _declaredName = v; } bool hasEnclosingInstance () const { return _hasEnclosingInstance; } void hasEnclosingInstance (bool v) { _hasEnclosingInstance = v; } TreeNode::AllocateContext * allocateContext () const { return _allocateContext; } void allocateContext (TreeNode::AllocateContext * v) { _allocateContext = v; } int classNum () const { return _classNum; } void classNum (int v) { _classNum = v; } TreeNode* simpName () const { return (TreeNode*)_children[0]; } void simpName (TreeNode* v) { child(0, v); } TreeNode* superClass () const { return (TreeNode*)_children[1]; } void superClass (TreeNode* v) { child(1, v); } TypeListNode* interfaces () const { return (TypeListNode*)_children[2]; } void interfaces (TypeListNode* v) { child(2, v); } TreeListNode* members () const { return (TreeListNode*)_children[3]; } void members (TreeListNode* v) { child(3, v); } TreeNode* finalVars () const { return (TreeNode*)_children[4]; } void finalVars (TreeNode* v) { child(4, v); } void resolvePackage (Decl* package, Environ *fileEnv, Environ *typeEnviron, bool recurse); void resolveClass (ClassContext *ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); void flattenClasses(FlattenContext *ctx); TreeNode *buildTypeEnv(TypeContext *ctx); TreeNode *resolveTypes(TypeContext *ctx); int incLocalCount(); int incAnonCount(); void resolveInheritance(); void codeGen (); TreeNode *rewrite( const FieldContext * ); void lookForMain() const; void checkSglobal() const; void inferSharingEarly( SharingSolver & ) const; void emitDebugInfo( ofstream &, StringTable & ); bool selectedForCodeGen(bool) const; bool isExported() const; void findInitDependencies(Decl *, set *, set *); TreeNode *optimizeMonitors( MonitorStats & ); TreeNode *lower(llist *&decls, llist *&stmts); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ClassDeclNode (); protected: Common::Modifiers _flags; TypeDeclNode * _enclosingType; TreeNode * _enclosingBlock; NameNode * _declaredName; bool _hasEnclosingInstance; TreeNode::AllocateContext * _allocateContext; int _classNum; TreeNode* _children[5]; int _localCount; int _anonCount; }; class FieldDeclNode : public DataDeclNode { public: FieldDeclNode (TypeNode * dtype, TreeNode * simpName, Common::Modifiers flags, TreeNode * initExpr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; FieldDeclNode* clone () const; FieldDeclNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TypeNode* dtype () const { return (TypeNode*)_children[0]; } void dtype (TypeNode* v) { child(0, v); } TreeNode* simpName () const { return (TreeNode*)_children[1]; } void simpName (TreeNode* v) { child(1, v); } TreeNode* initExpr () const { return (TreeNode*)_children[2]; } void initExpr (TreeNode* v) { child(2, v); } void resolveClass (ClassContext *ctx); TreeNode* resolveName (const NameContext &ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); void codeGen ( CodeContext & ); Decl* decl () const; void _widen(); void flattenClasses(FlattenContext *ctx); TreeNode *foldConstants(); bool typecheck(TypeContext *ctx); bool reachability(ReachableContext &); SingleState single(SingleContext *ctx); void foldFields(); TreeNode *instantiate(Subst *args); TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); void infer( const InferContext & ); void enact( const EnactContext & ); void inferLocal( const LocalContext & ); void inferLocalTree( const LocalContext & ); void localEnactChildren( const LocalEnactContext & ) const; void inferSharingLateTree( const SharingContext & ); void inferSharingEarly( SharingSolver & ) const; void emitDebugInfo( ofstream &, StringTable & ); void sglobalData(); void sglobalCall(); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void resolveRequires(ClassDecl *); bool isExported() const; void findInitDependencies(Decl *, set *, set *); bool compilerGeneratedInitExpr() const; void compilerGeneratedInitExpr(bool); void lookForMain() const; void checkSglobal() const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: FieldDeclNode (); protected: Common::Modifiers _flags; TreeNode* _children[3]; bool _compilerGeneratedInitExpr; }; class VarDeclNode : public DataDeclNode { public: VarDeclNode (bool isfinal, TypeNode * dtype, TreeNode * simpName, TreeNode * initExpr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; VarDeclNode* clone () const; VarDeclNode* deepClone () const; bool isfinal () const { return _isfinal; } void isfinal (bool v) { _isfinal = v; } TypeNode* dtype () const { return (TypeNode*)_children[0]; } void dtype (TypeNode* v) { child(0, v); } TreeNode* simpName () const { return (TreeNode*)_children[1]; } void simpName (TreeNode* v) { child(1, v); } TreeNode* initExpr () const { return (TreeNode*)_children[2]; } void initExpr (TreeNode* v) { child(2, v); } ~VarDeclNode(); void free(); TreeNode* resolveName (const NameContext &ctx); void flattenClasses(FlattenContext *ctx); void codeGen ( CodeContext & ); Decl* decl () const; void _widen(); SingleState single(SingleContext *ctx); void resolveRequires(ClassDecl *); TreeNode * lazyOptimize (); void pseudoprint(ostream &os, unsigned depth) const; void findDefs(Defs *); const string *& mangledIdent(); bool reachability(ReachableContext &); bool needsDefaultInitialization() const; void needsDefaultInitialization(bool); virtual const string emitUse( LocalVars &, const ObjectNode & ) const; TreeNode *instantiate(Subst *args); CfgExtent makeCfg(); TreeNode *rewrite( const FieldContext * ); bool checkIF(bool serious) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: VarDeclNode (); protected: bool _isfinal; TreeNode* _children[3]; const string * _mangledIdent; bool _needsDefaultInitialization; }; class MethodDeclNode : public MethodNode { public: MethodDeclNode (Common::Modifiers flags, llist * params, TypeNode * returnType, TypeNode * declaredReturnType, TreeNode * simpName, llist * throws, llist * overlaps, TreeNode * body, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MethodDeclNode* clone () const; MethodDeclNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeListNode* params () const { return (TreeListNode*)_children[0]; } void params (TreeListNode* v) { child(0, v); } TypeNode* returnType () const { return (TypeNode*)_children[1]; } void returnType (TypeNode* v) { child(1, v); } TypeNode* declaredReturnType () const { return (TypeNode*)_children[2]; } void declaredReturnType (TypeNode* v) { child(2, v); } TreeNode* simpName () const { return (TreeNode*)_children[3]; } void simpName (TreeNode* v) { child(3, v); } TypeListNode* throws () const { return (TypeListNode*)_children[4]; } void throws (TypeListNode* v) { child(4, v); } TreeListNode* overlaps () const { return (TreeListNode*)_children[5]; } void overlaps (TreeListNode* v) { child(5, v); } TreeNode* body () const { return (TreeNode*)_children[6]; } void body (TreeNode* v) { child(6, v); } void resolveClass (ClassContext *ctx); TreeNode* resolveName (const NameContext &ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); void codeGen ( CfSource & ); void flattenClasses(FlattenContext *ctx); bool typecheck(TypeContext *ctx); bool reachability(ReachableContext &); TreeNode * lazyOptimize (); TreeNode * collapseTrivialBlocks(); void widen(); SingleState single(SingleContext *ctx); void unwindTree( CleanupList &, const TreeNode * ) const; virtual const string emitUse( LocalVars &, const ObjectNode & ) const; TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); virtual void setBblockRoot(Bblock *bblock); virtual Bblock *getBblockRoot(void); bool isMain() const; void sglobalData(); void sglobalCall(); virtual void setNodeStorage(NodeStorage *ns); virtual NodeStorage *getNodeStorage(void); void infer( const InferContext & ); void inferLocalChildren( const LocalContext & ) const; void localEnactChildren( const LocalEnactContext & ) const; void localEnactTree( const LocalEnactContext & ); void inferSharingLateChildren( const SharingContext & ) const; void sharingEnactTree( const SharingEnactContext & ); void emitDebugInfo( ofstream &, StringTable & ); void pseudoprint(ostream &os, unsigned depth) const; bool isExported() const; void findInitDependencies(Decl *, set *, set *); MethodStatics *methodStatics() const; void setMethodStatics(MethodStatics *ms); bool isSideEffectFree() const; bool isPureFunction() const; void lookForMain() const; void checkSglobal() const; void *inlineInfo() const; void inlineInfo(void *); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MethodDeclNode (); protected: Common::Modifiers _flags; TreeNode* _children[7]; Bblock * bblockRoot; NodeStorage * nodeStorage; MethodStatics* _methodStatics; void* _inlineInfo; }; class MethodSignatureNode : public MethodNode { public: MethodSignatureNode (Common::Modifiers flags, llist * params, TypeNode * returnType, TypeNode * declaredReturnType, TreeNode * simpName, llist * throws, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MethodSignatureNode* clone () const; MethodSignatureNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeListNode* params () const { return (TreeListNode*)_children[0]; } void params (TreeListNode* v) { child(0, v); } TypeNode* returnType () const { return (TypeNode*)_children[1]; } void returnType (TypeNode* v) { child(1, v); } TypeNode* declaredReturnType () const { return (TypeNode*)_children[2]; } void declaredReturnType (TypeNode* v) { child(2, v); } TreeNode* simpName () const { return (TreeNode*)_children[3]; } void simpName (TreeNode* v) { child(3, v); } TypeListNode* throws () const { return (TypeListNode*)_children[4]; } void throws (TypeListNode* v) { child(4, v); } TreeNode* resolveName (const NameContext &ctx); bool reachability(ReachableContext &); void codeGen ( CodeContext & ); void pseudoprint(ostream &os, unsigned depth) const; SingleState single(SingleContext *ctx); void sglobalData(); void sglobalCall(); bool isExported() const; void findInitDependencies(Decl *, set *, set *); MethodStatics *methodStatics() const; void setMethodStatics(MethodStatics *ms); bool isSideEffectFree() const; bool isPureFunction() const; void lookForMain() const; void checkSglobal() const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MethodSignatureNode (); protected: Common::Modifiers _flags; TreeNode* _children[5]; MethodStatics* _methodStatics; }; class OverlapNode : public TreeNode { public: OverlapNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; OverlapNode* clone () const; OverlapNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } TreeNode* resolveName (const NameContext &ctx); bool checkIF(bool serious) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: OverlapNode () {} protected: TreeNode* _children[2]; }; class VoidTypeNode : public PrimitiveTypeNode { public: VoidTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; VoidTypeNode* clone () const; VoidTypeNode* deepClone () const; TypeNode::Kind kind () const; TypeNode::Kind kindsAssignableTo () const; TypeNode::Kind kindsCastableTo () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; TypeDecl* decl () const; string unqualifiedTypeName() const; string typeName() const; Modifiers modifiers () const; const char *cPrimitiveTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class ConstructorDeclNode : public TreeNode { public: ConstructorDeclNode (Common::Modifiers flags, llist * params, TreeNode * simpName, llist * throws, TreeNode * constructorCall, TreeNode * body, TreeNode * initEncloser, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ConstructorDeclNode* clone () const; ConstructorDeclNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeListNode* params () const { return (TreeListNode*)_children[0]; } void params (TreeListNode* v) { child(0, v); } TreeNode* simpName () const { return (TreeNode*)_children[1]; } void simpName (TreeNode* v) { child(1, v); } TypeListNode* throws () const { return (TypeListNode*)_children[2]; } void throws (TypeListNode* v) { child(2, v); } TreeNode* constructorCall () const { return (TreeNode*)_children[3]; } void constructorCall (TreeNode* v) { child(3, v); } TreeNode* body () const { return (TreeNode*)_children[4]; } void body (TreeNode* v) { child(4, v); } TreeNode* initEncloser () const { return (TreeNode*)_children[5]; } void initEncloser (TreeNode* v) { child(5, v); } void resolveClass (ClassContext *ctx); TreeNode* resolveName (const NameContext &ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); void codeGen ( CfSource & ); TypeNode* returnType () const; TreeNode *rewrite( const FieldContext * ); void flattenClasses(FlattenContext *ctx); bool reachability(ReachableContext &); MethodDecl* decl () const; SingleState single(SingleContext *ctx); bool valid() const; bool updateConstructorValidity(); bool typecheck(TypeContext *ctx); virtual const string emitUse( LocalVars &, const ObjectNode & ) const; void unwindTree( CleanupList &, const TreeNode * ) const; void foldFields(); TreeNode * lazyOptimize (); TreeNode *instantiate(Subst *args); TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); void sglobalData(); void sglobalCall(); TreeNode * collapseTrivialBlocks(); void infer( const InferContext & ); void inferLocalChildren( const LocalContext & ) const; void inferLocalTree( const LocalContext & ); void localEnactChildren( const LocalEnactContext & ) const; void inferSharingLateChildren( const SharingContext & ) const; void inferSharingLateTree( const SharingContext & ); void inferSharingLate( const SharingContext & ); void sharingEnact( const SharingEnactContext & ); virtual void setBblockRoot(Bblock *bblock); virtual void setNodeStorage(NodeStorage *ns); virtual NodeStorage *getNodeStorage(void); void unshareType(); void emitDebugInfo( ofstream &, StringTable & ); bool checkIF(bool serious) const; virtual Bblock *getBblockRoot(void); void pseudoprint(ostream &os, unsigned depth) const; void setMethodStatics(MethodStatics *ms); MethodStatics *methodStatics() const; bool isSideEffectFree() const; bool isPureFunction() const; bool isExported() const; void findInitDependencies(Decl *, set *, set *); void lookForMain() const; void checkSglobal() const; void *inlineInfo() const; void inlineInfo(void *); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ConstructorDeclNode (); protected: Common::Modifiers _flags; TreeNode* _children[6]; Bblock * bblockRoot; NodeStorage * nodeStorage; MethodStatics* _methodStatics; void* _inlineInfo; }; class ThisConstructorCallNode : public TreeNode { public: ThisConstructorCallNode (llist * args, Decl* decl, bool valid, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ThisConstructorCallNode* clone () const; ThisConstructorCallNode* deepClone () const; Decl* decl () const { return _decl; } void decl (Decl* v) { _decl = v; } bool valid () const { return _valid; } void valid (bool v) { _valid = v; } TreeListNode* args () const { return (TreeListNode*)_children[0]; } void args (TreeListNode* v) { child(0, v); } TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); void _widen(); SingleState single(SingleContext *ctx); void sglobalCall(); void pseudoprint(ostream &os, unsigned depth) const; bool _typecheck(TypeContext *ctx); void infer( const InferContext & ); void inferSharingLate( const SharingContext & ); TreeNode *lower(llist *&decls, llist *&stmts); bool isSideEffectFree() const; bool isPureFunction() const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ThisConstructorCallNode () {} protected: Decl* _decl; bool _valid; TreeNode* _children[1]; }; class SuperConstructorCallNode : public TreeNode { public: SuperConstructorCallNode (Common::Modifiers flags, TreeNode * qualifier, llist * args, Decl* decl, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; SuperConstructorCallNode* clone () const; SuperConstructorCallNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } Decl* decl () const { return _decl; } void decl (Decl* v) { _decl = v; } TreeNode* qualifier () const { return (TreeNode*)_children[0]; } void qualifier (TreeNode* v) { child(0, v); } TreeListNode* args () const { return (TreeListNode*)_children[1]; } void args (TreeListNode* v) { child(1, v); } TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); void _widen(); SingleState single(SingleContext *ctx); void sglobalCall(); void pseudoprint(ostream &os, unsigned depth) const; bool _typecheck(TypeContext *ctx); void infer( const InferContext & ); void inferSharingLate( const SharingContext & ); TreeNode *lower(llist *&decls, llist *&stmts); bool isSideEffectFree() const; bool isPureFunction() const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: SuperConstructorCallNode () {} protected: Common::Modifiers _flags; Decl* _decl; TreeNode* _children[2]; }; class StaticInitNode : public TreeNode { public: StaticInitNode (TreeNode * block, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; StaticInitNode* clone () const; StaticInitNode* deepClone () const; TreeNode* block () const { return (TreeNode*)_children[0]; } void block (TreeNode* v) { child(0, v); } void resolveClass (ClassContext *ctx); TreeNode* resolveName (const NameContext &ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); void codeGen ( CodeContext & ); bool typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); void foldFields(); void pseudoprint(ostream &os, unsigned depth) const; void flattenClasses(FlattenContext *ctx); bool reachability(ReachableContext &); TreeNode * collapseTrivialBlocks(); void sglobalData(); void sglobalCall(); bool checkIF(bool serious) const; void lookForMain() const; void checkSglobal() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: StaticInitNode () {} protected: TreeNode* _children[1]; }; class InstanceInitNode : public TreeNode { public: InstanceInitNode (TreeNode * block, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; InstanceInitNode* clone () const; InstanceInitNode* deepClone () const; TreeNode* block () const { return (TreeNode*)_children[0]; } void block (TreeNode* v) { child(0, v); } void resolveClass (ClassContext *ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); TreeNode* resolveName (const NameContext &ctx); bool typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); void foldFields(); void pseudoprint(ostream &os, unsigned depth) const; void flattenClasses(FlattenContext *ctx); bool reachability(ReachableContext &); TreeNode * collapseTrivialBlocks(); void sglobalData(); void sglobalCall(); void findInitDependencies(Decl *, set *, set *); void lookForMain() const; void checkSglobal() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: InstanceInitNode () {} protected: TreeNode* _children[1]; }; class InterfaceDeclNode : public TypeDeclNode { public: InterfaceDeclNode (Common::Modifiers flags, TreeNode * simpName, llist * interfaces, llist * members, TypeDeclNode * enclosingType, NameNode * declaredName, bool hasEnclosingInstance, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; InterfaceDeclNode* clone () const; InterfaceDeclNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TypeDeclNode * enclosingType () const { return _enclosingType; } void enclosingType (TypeDeclNode * v) { _enclosingType = v; } NameNode * declaredName () const { return _declaredName; } void declaredName (NameNode * v) { _declaredName = v; } bool hasEnclosingInstance () const { return _hasEnclosingInstance; } void hasEnclosingInstance (bool v) { _hasEnclosingInstance = v; } TreeNode* simpName () const { return (TreeNode*)_children[0]; } void simpName (TreeNode* v) { child(0, v); } TypeListNode* interfaces () const { return (TypeListNode*)_children[1]; } void interfaces (TypeListNode* v) { child(1, v); } TreeListNode* members () const { return (TreeListNode*)_children[2]; } void members (TreeListNode* v) { child(2, v); } void resolvePackage (Decl* package, Environ *fileEnv, Environ *typeEnviron, bool recurse); void resolveClass (ClassContext *ctx); TreeNode *resolveTypes(TypeContext *ctx); void pseudoprint(ostream &os, unsigned depth) const; int incLocalCount(); int incAnonCount(); void flattenClasses(FlattenContext *ctx); TreeNode *buildTypeEnv(TypeContext *ctx); void lookForMain() const; void checkSglobal() const; void codeGen (); void resolveInheritance(); TreeNode *lower(llist *&decls, llist *&stmts); bool isExported() const; void findInitDependencies(Decl *, set *, set *); void emitDebugInfo( ofstream &, StringTable & ); bool checkIF(bool serious) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: InterfaceDeclNode (); protected: Common::Modifiers _flags; TypeDeclNode * _enclosingType; NameNode * _declaredName; bool _hasEnclosingInstance; TreeNode* _children[3]; int _localCount; int _anonCount; }; class ArrayInitNode : public ExprNode { public: ArrayInitNode (llist * initializers, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ArrayInitNode* clone () const; ArrayInitNode* deepClone () const; TreeListNode* initializers () const { return (TreeListNode*)_children[0]; } void initializers (TreeListNode* v) { child(0, v); } TypeNode* __type (); bool typecheck(TypeContext *ctx); void _widen(); virtual const string emitExpression( CodeContext & ); SingleState single(SingleContext *ctx); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void infer( const InferContext & ); Bitset *getValues(AliasInfos *ai); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ArrayInitNode () {} protected: TreeNode* _children[1]; }; class BlockNode : public StatementNode { public: BlockNode (llist * stmts, Environ * environ, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; BlockNode* clone () const; BlockNode* deepClone () const; Environ * environ () const { return _environ; } void environ (Environ * v) { _environ = v; } TreeListNode* stmts () const { return (TreeListNode*)_children[0]; } void stmts (TreeListNode* v) { child(0, v); } TreeNode* resolveName (const NameContext &ctx); SingleState single(SingleContext *ctx); virtual void emitStatement( CodeContext & ); TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void flattenClasses(FlattenContext *ctx); void resolvePackage (Decl* package, Environ *fileEnv, Environ *typeEnviron, bool recurse); TreeNode *resolveTypes(TypeContext *ctx); bool reachability(ReachableContext &); bool & declContainer(); CodeContext *& blockContext(); TreeNode * deleteStmts(treeSet *s); TreeNode * collapseTrivialBlocks(); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: BlockNode (); protected: Environ * _environ; TreeNode* _children[1]; bool _declContainer; CodeContext * _blockContext; }; class EmptyStmtNode : public StatementNode { public: EmptyStmtNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; EmptyStmtNode* clone () const; EmptyStmtNode* deepClone () const; virtual void emitStatement( CodeContext & ); bool reachability(ReachableContext &); SingleState single(SingleContext *ctx); CfgExtent makeCfg(); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; bool compare (const TreeNode *) const; protected: }; class GotoNode : public StatementNode { public: GotoNode (TreeNode * destination, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; GotoNode* clone () const; GotoNode* deepClone () const; TreeNode* destination () const { return _destination; } void destination (TreeNode* v) { _destination = v; } virtual void emitStatement( CodeContext & ); CfgExtent makeCfg(); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: GotoNode () {} protected: TreeNode* _destination; }; class LabeledStmtNode : public StatementNode { public: LabeledStmtNode (TreeNode * label, TreeNode * stmt, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; LabeledStmtNode* clone () const; LabeledStmtNode* deepClone () const; TreeNode* label () const { return (TreeNode*)_children[0]; } void label (TreeNode* v) { child(0, v); } TreeNode* stmt () const { return (TreeNode*)_children[1]; } void stmt (TreeNode* v) { child(1, v); } TreeNode* resolveName (const NameContext &ctx); SingleState single(SingleContext *ctx); virtual void emitStatement( CodeContext & ); TreeNode *instantiate(Subst *args); CfgExtent makeCfg(); bool checkIF(bool serious) const; TreeNode *lower(llist *&decls, llist *&stmts); bool reachability(ReachableContext &); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: LabeledStmtNode () {} protected: TreeNode* _children[2]; }; class IfStmtNode : public StatementNode { public: IfStmtNode (TreeNode * condition, TreeNode * thenPart, TreeNode * elsePart, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; IfStmtNode* clone () const; IfStmtNode* deepClone () const; TreeNode* condition () const { return (TreeNode*)_children[0]; } void condition (TreeNode* v) { child(0, v); } TreeNode* thenPart () const { return (TreeNode*)_children[1]; } void thenPart (TreeNode* v) { child(1, v); } TreeNode* elsePart () const { return (TreeNode*)_children[2]; } void elsePart (TreeNode* v) { child(2, v); } virtual void emitStatement( CodeContext & ); TreeNode *foldConstants(); bool typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); const char *operatorName() const; TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); TreeNode * collapseTrivialBlocks(); bool reachability(ReachableContext &); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: IfStmtNode () {} protected: TreeNode* _children[3]; }; class SwitchNode : public StatementNode { public: SwitchNode (TreeNode * expr, llist * switchBlocks, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; SwitchNode* clone () const; SwitchNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } TreeListNode* switchBlocks () const { return (TreeListNode*)_children[1]; } void switchBlocks (TreeListNode* v) { child(1, v); } TreeNode* resolveName (const NameContext &ctx); virtual void emitStatement( CodeContext & ); bool typecheck(TypeContext *ctx); void _widen(); SingleState single(SingleContext *ctx); const char *operatorName() const; TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); bool reachability(ReachableContext &); bool checkIF(bool serious) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: SwitchNode () {} protected: TreeNode* _children[2]; }; class CaseNode : public TreeNode { public: CaseNode (TreeNode * expr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CaseNode* clone () const; CaseNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } void codeGen ( CodeContext & ); bool checkIF(bool serious) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: CaseNode () {} protected: TreeNode* _children[1]; }; class SwitchBranchNode : public TreeNode { public: SwitchBranchNode (llist * cases, llist * stmts, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; SwitchBranchNode* clone () const; SwitchBranchNode* deepClone () const; TreeListNode* cases () const { return (TreeListNode*)_children[0]; } void cases (TreeListNode* v) { child(0, v); } TreeListNode* stmts () const { return (TreeListNode*)_children[1]; } void stmts (TreeListNode* v) { child(1, v); } const char *operatorName() const; bool reachability(ReachableContext &); bool checkIF(bool serious) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: SwitchBranchNode () {} protected: TreeNode* _children[2]; }; class WhileNode : public LoopNode { public: WhileNode (TreeNode * test, TreeNode * stmt, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; WhileNode* clone () const; WhileNode* deepClone () const; TreeNode* test () const { return (TreeNode*)_children[0]; } void test (TreeNode* v) { child(0, v); } TreeNode* stmt () const { return (TreeNode*)_children[1]; } void stmt (TreeNode* v) { child(1, v); } bool typecheck(TypeContext *ctx); bool reachability(ReachableContext &); const char *operatorName() const; TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: WhileNode () {} protected: TreeNode* _children[2]; }; class DoNode : public LoopNode { public: DoNode (TreeNode * stmt, TreeNode * test, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; DoNode* clone () const; DoNode* deepClone () const; TreeNode* stmt () const { return (TreeNode*)_children[0]; } void stmt (TreeNode* v) { child(0, v); } TreeNode* test () const { return (TreeNode*)_children[1]; } void test (TreeNode* v) { child(1, v); } bool typecheck(TypeContext *ctx); bool reachability(ReachableContext &); const char *operatorName() const; TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: DoNode () {} protected: TreeNode* _children[2]; }; class ForNode : public IterationNode { public: ForNode (llist * init, TreeNode * test, llist * update, TreeNode * stmt, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ForNode* clone () const; ForNode* deepClone () const; TreeListNode* init () const { return (TreeListNode*)_children[0]; } void init (TreeListNode* v) { child(0, v); } TreeNode* test () const { return (TreeNode*)_children[1]; } void test (TreeNode* v) { child(1, v); } TreeListNode* update () const { return (TreeListNode*)_children[2]; } void update (TreeListNode* v) { child(2, v); } TreeNode* stmt () const { return (TreeNode*)_children[3]; } void stmt (TreeNode* v) { child(3, v); } TreeNode* resolveName (const NameContext &ctx); bool typecheck(TypeContext *ctx); bool reachability(ReachableContext &); SingleState single(SingleContext *ctx); const char *operatorName() const; TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ForNode () {} protected: TreeNode* _children[4]; }; class BreakNode : public StatementNode { public: BreakNode (TreeNode * label, TreeNode * destination, llist * cleanups, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; BreakNode* clone () const; BreakNode* deepClone () const; TreeNode* destination () const { return _destination; } void destination (TreeNode* v) { _destination = v; } llist * cleanups () const { return _cleanups; } void cleanups (llist * v) { _cleanups = v; } TreeNode* label () const { return (TreeNode*)_children[0]; } void label (TreeNode* v) { child(0, v); } TreeNode* resolveName (const NameContext &ctx); bool reachability(ReachableContext &); SingleState single(SingleContext *ctx); CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; virtual void collectCleanups(); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: BreakNode () {} protected: TreeNode* _destination; llist * _cleanups; TreeNode* _children[1]; }; class ContinueNode : public StatementNode { public: ContinueNode (TreeNode * label, TreeNode * destination, llist * cleanups, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ContinueNode* clone () const; ContinueNode* deepClone () const; TreeNode* destination () const { return _destination; } void destination (TreeNode* v) { _destination = v; } llist * cleanups () const { return _cleanups; } void cleanups (llist * v) { _cleanups = v; } TreeNode* label () const { return (TreeNode*)_children[0]; } void label (TreeNode* v) { child(0, v); } TreeNode* resolveName (const NameContext &ctx); bool reachability(ReachableContext &); SingleState single(SingleContext *ctx); CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; virtual void collectCleanups(); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ContinueNode () {} protected: TreeNode* _destination; llist * _cleanups; TreeNode* _children[1]; }; class ReturnNode : public StatementNode { public: ReturnNode (TreeNode * expr, llist * cleanups, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ReturnNode* clone () const; ReturnNode* deepClone () const; llist * cleanups () const { return _cleanups; } void cleanups (llist * v) { _cleanups = v; } TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } void codeGen ( CodeContext & ); bool _typecheck(TypeContext *ctx); void _widen(); SingleState single(SingleContext *ctx); const char *operatorName() const; TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); TreeNode *rewrite( const FieldContext * ); virtual void collectCleanups(); bool reachability(ReachableContext &); void infer( const InferContext & ); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ReturnNode () {} protected: llist * _cleanups; TreeNode* _children[1]; }; class ThrowNode : public StatementNode { public: ThrowNode (TreeNode * expr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ThrowNode* clone () const; ThrowNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); void _widen(); const char *operatorName() const; virtual void emitStatement( CodeContext & ); TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); void inferSharingLate( const SharingContext & ); bool reachability(ReachableContext &); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ThrowNode () {} protected: TreeNode* _children[1]; }; class SynchronizedNode : public StatementNode { public: SynchronizedNode (TreeNode * expr, TreeNode * stmt, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; SynchronizedNode* clone () const; SynchronizedNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } TreeNode* stmt () const { return (TreeNode*)_children[1]; } void stmt (TreeNode* v) { child(1, v); } bool _typecheck(TypeContext *ctx); const char *operatorName() const; SingleState single(SingleContext *ctx); TreeNode *rewrite( const FieldContext * ); TreeNode * collapseTrivialBlocks(); void pseudoprint(ostream &os, unsigned depth) const; bool reachability(ReachableContext &); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: SynchronizedNode () {} protected: TreeNode* _children[2]; }; class CatchNode : public TreeNode { public: CatchNode (TreeNode * param, TreeNode * block, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CatchNode* clone () const; CatchNode* deepClone () const; TreeNode* param () const { return (TreeNode*)_children[0]; } void param (TreeNode* v) { child(0, v); } TreeNode* block () const { return (TreeNode*)_children[1]; } void block (TreeNode* v) { child(1, v); } TreeNode* resolveName (const NameContext &ctx); const char *operatorName() const; virtual void emitCatchTable( ostream & ) const; virtual const string emitUse( LocalVars &, const ObjectNode & ) const; void inferLocal( const LocalContext & ); bool reachability(ReachableContext &); void inferSharingLate( const SharingContext & ); bool checkIF(bool serious) const; void resolveRequires(ClassDecl *); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: CatchNode () {} protected: TreeNode* _children[2]; }; class TryNode : public TreeNode { public: TryNode (TreeNode * block, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TryNode* clone () const; TryNode* deepClone () const; TreeNode* block () const { return (TreeNode*)_children[0]; } void block (TreeNode* v) { child(0, v); } SingleState single(SingleContext *ctx); bool reachability(ReachableContext &); void unwindSelf( CleanupList & ) const; bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TryNode () {} protected: TreeNode* _children[1]; }; class CatchListNode : public TreeListNode { public: CatchListNode(llist *&_children, SourcePosn p = NoSourcePosition) : TreeListNode( p ) { initialize((llist *)_children); _children = 0; } const char* oper_name() const { return "CatchListNode"; } CatchListNode *clone() const; CatchListNode* deepClone () const; CatchNode* child(int i) const { return reinterpret_cast(TreeListNode::child(i)); } void child(int i, CatchNode* replacement) { TreeListNode::child(i, replacement); } void codeGen ( CodeContext & ); void unwindSelf( CleanupList & ) const; CfgExtent makeCfg(); bool checkIF(bool serious) const; protected: CatchListNode ( SourcePosn posn = NoSourcePosition ) : TreeListNode( posn ) {} }; class FinallyNode : public TreeNode { public: FinallyNode (TreeNode * block, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; FinallyNode* clone () const; FinallyNode* deepClone () const; TreeNode* block () const { return (TreeNode*)_children[0]; } void block (TreeNode* v) { child(0, v); } const char *operatorName() const; bool reachability(ReachableContext &); SingleState single(SingleContext *ctx); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: FinallyNode () {} protected: TreeNode* _children[1]; }; class TryStmtNode : public StatementNode { public: TryStmtNode (TreeNode * block, llist * catches, TreeNode * finally, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TryStmtNode* clone () const; TryStmtNode* deepClone () const; TreeNode* block () const { return (TreeNode*)_children[0]; } void block (TreeNode* v) { child(0, v); } CatchListNode* catches () const { return (CatchListNode*)_children[1]; } void catches (CatchListNode* v) { child(1, v); } TreeNode* finally () const { return (TreeNode*)_children[2]; } void finally (TreeNode* v) { child(2, v); } bool typecheck(TypeContext *ctx); bool reachability(ReachableContext &); SingleState single(SingleContext *ctx); const char *operatorName() const; virtual void emitStatement( CodeContext & ); bool checkIF(bool serious) const; CfgExtent makeCfg(); CfgExtent getExceptionCfg(); void unwindTry( CleanupList & ) const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TryStmtNode () {} protected: TreeNode* _children[3]; CfgNode * _cfgCatch; CfgNode * _cfgFinally; static CodeLiteralNode popState; }; class ExpressionStmtNode : public StatementNode { public: ExpressionStmtNode (TreeNode * expr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ExpressionStmtNode* clone () const; ExpressionStmtNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } virtual void emitStatement( CodeContext & ); bool reachability(ReachableContext &); SingleState single(SingleContext *ctx); TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; TreeNode * deleteStmts(treeSet *s); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ExpressionStmtNode () {} protected: TreeNode* _children[1]; }; class DummyNode : public StatementNode { public: DummyNode (TreeNode * expr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; DummyNode* clone () const; DummyNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } virtual void emitStatement( CodeContext & ); bool checkIF(bool serious) const; CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; void findMayMustReadWrite(bool r, bool w); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: DummyNode () {} protected: TreeNode* _children[1]; }; class ParameterNode : public TreeNode { public: ParameterNode (bool isfinal, TypeNode * dtype, TreeNode * simpName, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ParameterNode* clone () const; ParameterNode* deepClone () const; bool isfinal () const { return _isfinal; } void isfinal (bool v) { _isfinal = v; } TypeNode* dtype () const { return (TypeNode*)_children[0]; } void dtype (TypeNode* v) { child(0, v); } TreeNode* simpName () const { return (TreeNode*)_children[1]; } void simpName (TreeNode* v) { child(1, v); } TreeNode* resolveName (const NameContext &ctx); void flattenClasses(FlattenContext *ctx); void findDefs(Defs *); bool _typecheck(TypeContext *ctx); Decl* decl () const; TreeNode *instantiate(Subst *args); void unshareType(); void infer( const InferContext & ); void enact( const EnactContext & ); bool checkIF(bool serious) const; llist *getUses(void) const; void setUses(llist *); void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ParameterNode () {} protected: bool _isfinal; TreeNode* _children[2]; }; class NullPntrNode : public LitNode { public: NullPntrNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; NullPntrNode* clone () const; NullPntrNode* deepClone () const; TypeNode* __type (); virtual const string emitExpression( CodeContext & ); bool checkIF(bool serious) const; bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); Bitset *getValues(AliasInfos *ai); void infer( const InferContext & ); void pseudoprint(ostream &os, unsigned depth) const; virtual const string simpleVar( CodeContext & ); string mangle(); bool compare (const TreeNode *) const; protected: }; class ThisNode : public ExprNode { public: ThisNode (TreeNode * qualifier, TreeNode * theClass, Common::Modifiers flags, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ThisNode* clone () const; ThisNode* deepClone () const; TreeNode* theClass () const { return _theClass; } void theClass (TreeNode* v) { _theClass = v; } Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeNode* qualifier () const { return (TreeNode*)_children[0]; } void qualifier (TreeNode* v) { child(0, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); TreeNode* resolveName (const NameContext &ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); SingleState single(SingleContext *ctx); virtual const string simpleVar( CodeContext & ); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); Bitset *getValues(AliasInfos *ai); void findMayMustReadWrite(bool r, bool w); void infer( const InferContext & ); void enact( const EnactContext & ); void inferSharingLate( const SharingContext & ); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void setUses(llist *); llist *getUses(void) const; void setDefs(llist *); llist *getDefs(void) const; virtual bool hasLval(void) const; virtual bool isSimpleLvalue(); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ThisNode () {} protected: TreeNode* _theClass; Common::Modifiers _flags; TreeNode* _children[1]; }; class ArrayAccessNode : public ExprNode { public: ArrayAccessNode (TreeNode * array, TreeNode * index, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ArrayAccessNode* clone () const; ArrayAccessNode* deepClone () const; TreeNode* array () const { return (TreeNode*)_children[0]; } void array (TreeNode* v) { child(0, v); } TreeNode* index () const { return (TreeNode*)_children[1]; } void index (TreeNode* v) { child(1, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); void checkAssignable(TreeNode *with, bool ignoreInstanceFinal, bool ignoreStaticFinal, Decl* currentClass); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); void _widen(); bool typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); SingleState singleAssign(const SingleState &from, SingleContext *ctx); const char *operatorName() const; TreeNode *rewrite( const FieldContext * ); void sglobalDataAssign(); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); virtual bool isStrengthReduced() const; virtual const string cArrayHandler( const char [], bool ); bool isArrayAccessNode () const; virtual bool isLocalLvalue(); bool isSharedAccess() const; virtual const string getLvalue( CodeContext & ); void receiveAssign( ostream &, const string &, const string &, AssignKind, const TypeNode * ); void receiveAssign( const TypeNode &, QualSolver & ) const; void inferLocal( const LocalContext & ); void localReceiveAssign( const TypeNode &, LocalSolver & ) const; void inferSharingLate( const SharingContext & ); ExprNode *lower(llist *&decls, llist *&stmts); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); virtual bool hasLval(void) const; llist *getDefs(void) const; void setDefs(llist *); llist *getUses(void) const; void setUses(llist *); void pseudoprint(ostream &os, unsigned depth) const; void findDefs(Defs *); void findMayMustReadWrite(bool r, bool w); Bitset *getValues(AliasInfos *ai); bool handleAssignment(AliasInfos *ai, Bitset* values); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ArrayAccessNode () {} protected: TreeNode* _children[2]; }; class JavaArrayAccessNode : public ArrayAccessNode { public: JavaArrayAccessNode (TreeNode * array, TreeNode * index, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; JavaArrayAccessNode* clone () const; JavaArrayAccessNode* deepClone () const; TreeNode* array () const { return (TreeNode*)_children[0]; } void array (TreeNode* v) { child(0, v); } TreeNode* index () const { return (TreeNode*)_children[1]; } void index (TreeNode* v) { child(1, v); } virtual const string cArrayHandler( const char [], bool ); virtual const string getLvalue( CodeContext & ); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: JavaArrayAccessNode () {} protected: TreeNode* _children[2]; }; class TitaniumArrayAccessNode : public ArrayAccessNode { public: TitaniumArrayAccessNode (TreeNode * array, TreeNode * index, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TitaniumArrayAccessNode* clone () const; TitaniumArrayAccessNode* deepClone () const; TreeNode* array () const { return (TreeNode*)_children[0]; } void array (TreeNode* v) { child(0, v); } TreeNode* index () const { return (TreeNode*)_children[1]; } void index (TreeNode* v) { child(1, v); } virtual const string cArrayHandler( const char [], bool ); void resolveRequires(ClassDecl *); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TitaniumArrayAccessNode () {} protected: TreeNode* _children[2]; }; class PointArrayAccessNode : public ArrayAccessNode { public: PointArrayAccessNode (TreeNode * array, TreeNode * index, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PointArrayAccessNode* clone () const; PointArrayAccessNode* deepClone () const; TreeNode* array () const { return (TreeNode*)_children[0]; } void array (TreeNode* v) { child(0, v); } TreeNode* index () const { return (TreeNode*)_children[1]; } void index (TreeNode* v) { child(1, v); } virtual bool isSimpleLvalue(); virtual bool isLocalLvalue(); bool isSharedAccess() const; virtual const string emitExpression( CodeContext & ); void receiveAssign( const TypeNode &, QualSolver & ) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PointArrayAccessNode () {} protected: TreeNode* _children[2]; }; class ObjectNode : public ExprNode { public: ObjectNode (TreeNode * name, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ObjectNode* clone () const; ObjectNode* deepClone () const; TreeNode* name () const { return (TreeNode*)_children[0]; } void name (TreeNode* v) { child(0, v); } TypeNode* __type (); TreeNode* resolveName (const NameContext &ctx); Decl* decl () const; TreeNode *foldConstants(); void checkAssignable(TreeNode *with, bool ignoreInstanceFinal, bool ignoreStaticFinal, Decl* currentClass); SingleState single(SingleContext *ctx); SingleState singleAssign(const SingleState &from, SingleContext *ctx); bool isd() const; virtual const string emitExpression( CodeContext & ); virtual const string getLvalue( CodeContext & ); virtual bool isLocalLvalue(); void sglobalDataAssign(); virtual bool isSimpleLvalue(); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); virtual const string simpleVar( CodeContext & ); void findMayMustReadWrite(bool r, bool w); void infer( const InferContext & ); void receiveAssign( const TypeNode &, QualSolver & ) const; bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); Bitset *getValues(AliasInfos *ai); bool handleAssignment(AliasInfos *ai, Bitset* values); void setUses(llist *); llist *getUses(void) const; void setDefs(llist *); llist *getDefs(void) const; virtual bool hasLval(void) const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ObjectNode () {} protected: TreeNode* _children[1]; }; class ObjectFieldAccessNode : public FieldAccessNode { public: ObjectFieldAccessNode (TreeNode * object, TreeNode * simpName, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ObjectFieldAccessNode* clone () const; ObjectFieldAccessNode* deepClone () const; TreeNode* object () const { return (TreeNode*)_children[0]; } void object (TreeNode* v) { child(0, v); } TreeNode* simpName () const { return (TreeNode*)_children[1]; } void simpName (TreeNode* v) { child(1, v); } TreeNode* resolveName (const NameContext &ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); TypeNode* accessedObjectType () const; SingleState single(SingleContext *ctx); void checkAssignable(TreeNode *with, bool ignoreInstanceFinal, bool ignoreStaticFinal, Decl* currentClass); TreeNode *foldConstants(); bool fieldChainParent() const; virtual const string emitExpression( CodeContext & ); virtual const string emitMethodCall( CodeContext &, TreeListNode & ); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); void receiveAssign( ostream &, const string &, const string &, AssignKind, const TypeNode * ); virtual const string getLvalue( CodeContext & ); virtual bool isLocalLvalue(); void findMayMustReadWrite(bool r, bool w); CfgExtent makeCfg(); void inferLocal( const LocalContext & ); void localReceiveAssign( const TypeNode &, LocalSolver & ) const; void inferSharingLate( const SharingContext & ); bool canCallStatically(MethodDecl *&) const; ExprNode *lower(llist *&decls, llist *&stmts); void pseudoprint(ostream &os, unsigned depth) const; void findInitDependencies(Decl *, set *, set *); Bitset *getValues(AliasInfos *ai); bool handleAssignment(AliasInfos *ai, Bitset* values); bool isRewrittenSFAN() const; void isRewrittenSFAN(bool); bool isRewrittenQSFAN() const; void isRewrittenQSFAN(bool); bool isSharedAccess() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ObjectFieldAccessNode (); protected: TreeNode* _children[2]; bool _isRewrittenSFAN; bool _isRewrittenQSFAN; }; class TypeFieldAccessNode : public FieldAccessNode { public: TypeFieldAccessNode (TypeNode * ftype, TreeNode * simpName, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TypeFieldAccessNode* clone () const; TypeFieldAccessNode* deepClone () const; TypeNode* ftype () const { return (TypeNode*)_children[0]; } void ftype (TypeNode* v) { child(0, v); } TreeNode* simpName () const { return (TreeNode*)_children[1]; } void simpName (TreeNode* v) { child(1, v); } TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); TreeNode *foldConstants(); TypeNode* accessedObjectType () const; TreeNode *instantiate(Subst *args); virtual const string emitExpression( CodeContext & ); virtual const string emitMethodCall( CodeContext &, TreeListNode & ); void receiveAssign( ostream &, const string &, const string &, AssignKind, const TypeNode * ); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); virtual const string getLvalue( CodeContext & ); virtual bool isLocalLvalue(); CfgExtent makeCfg(); void findMayMustReadWrite(bool r, bool w); void inferLocal( const LocalContext & ); void inferSharingLate( const SharingContext & ); void inferSharingEarlyChildren( SharingSolver & ) const; TreeNode* resolveName (const NameContext &ctx); void pseudoprint(ostream &os, unsigned depth) const; void findInitDependencies(Decl *, set *, set *); void checkAssignable(TreeNode *with, bool ignoreInstanceFinal, bool ignoreStaticFinal, Decl* currentClass); bool isSharedAccess() const; Bitset *getValues(AliasInfos *ai); bool handleAssignment(AliasInfos *ai, Bitset* values); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TypeFieldAccessNode () {} protected: TreeNode* _children[2]; }; class ThisFieldAccessNode : public FieldAccessNode { public: ThisFieldAccessNode (TreeNode * theClass, Common::Modifiers flags, TreeNode * simpName, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ThisFieldAccessNode* clone () const; ThisFieldAccessNode* deepClone () const; TreeNode* theClass () const { return _theClass; } void theClass (TreeNode* v) { _theClass = v; } Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeNode* simpName () const { return (TreeNode*)_children[0]; } void simpName (TreeNode* v) { child(0, v); } TreeNode* resolveName (const NameContext &ctx); TreeNode *foldConstants(); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); TypeNode* accessedObjectType () const; SingleState singleAssign(const SingleState &from, SingleContext *ctx); void pseudoprint(ostream &os, unsigned depth) const; void checkAssignable(TreeNode *with, bool ignoreInstanceFinal, bool ignoreStaticFinal, Decl* currentClass); TreeNode *rewrite( const FieldContext * ); CfgExtent makeCfg(); void sglobalDataAssign(); bool isSharedAccess() const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ThisFieldAccessNode () {} protected: TreeNode* _theClass; Common::Modifiers _flags; TreeNode* _children[1]; }; class SuperFieldAccessNode : public FieldAccessNode { public: SuperFieldAccessNode (TreeNode * qualifier, TreeNode * theClass, Common::Modifiers flags, TreeNode * simpName, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; SuperFieldAccessNode* clone () const; SuperFieldAccessNode* deepClone () const; TreeNode* theClass () const { return _theClass; } void theClass (TreeNode* v) { _theClass = v; } Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeNode* qualifier () const { return (TreeNode*)_children[0]; } void qualifier (TreeNode* v) { child(0, v); } TreeNode* simpName () const { return (TreeNode*)_children[1]; } void simpName (TreeNode* v) { child(1, v); } TreeNode* resolveName (const NameContext &ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); TypeNode* accessedObjectType () const; TreeNode *rewrite( const FieldContext * ); void pseudoprint(ostream &os, unsigned depth) const; CfgExtent makeCfg(); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: SuperFieldAccessNode () {} protected: TreeNode* _theClass; Common::Modifiers _flags; TreeNode* _children[2]; }; class MethodCallNode : public ExprNode { public: MethodCallNode (TreeNode * method, llist * args, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MethodCallNode* clone () const; MethodCallNode* deepClone () const; TreeNode* method () const { return (TreeNode*)_children[0]; } void method (TreeNode* v) { child(0, v); } TreeListNode* args () const { return (TreeListNode*)_children[1]; } void args (TreeListNode* v) { child(1, v); } ~MethodCallNode(); TypeNode* __type (); TreeNode* resolveName (const NameContext &ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); virtual const string emitExpression( CodeContext & ); void _widen(); bool _typecheck(TypeContext *ctx); TypeNode* declaredType (); bool fieldChainParent() const; MethodDecl* decl () const; SingleState single(SingleContext *ctx); bool isPureFunction() const; bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); bool isSideEffectFree() const; ExprNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); void resolveRequires(ClassDecl *); void findDefs(Defs *); void infer( const InferContext & ); void inferLocal( const LocalContext & ); void inferSharingLate( const SharingContext & ); void rebind() const; void sglobalCall(); void pseudoprint(ostream &os, unsigned depth) const; void findMayMustReadWrite(bool r, bool w); bool isRewrittenRHSOpOverload() const; void isRewrittenRHSOpOverload(bool); Bitset *getValues(AliasInfos *ai); Bitset *modifiesValues(); void setModifiesValues(Bitset *b); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MethodCallNode (); protected: TreeNode* _children[2]; Bitset* _modifiesValues; bool _isRewrittenRHSOpOverload; }; class MethodCallAssignNode : public ExprNode { public: MethodCallAssignNode (TreeNode * method, llist * args, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MethodCallAssignNode* clone () const; MethodCallAssignNode* deepClone () const; TreeNode* method () const { return (TreeNode*)_children[0]; } void method (TreeNode* v) { child(0, v); } TreeListNode* args () const { return (TreeListNode*)_children[1]; } void args (TreeListNode* v) { child(1, v); } TypeNode* __type (); bool _typecheck(TypeContext *ctx); bool fieldChainParent() const; void _widen(); MethodDecl* decl () const; SingleState single(SingleContext *ctx); TypeNode *widenSource(); TypeNode *castResult(); ExprNode *lower(llist *&decls, llist *&stmts); void infer( const InferContext & ); void sglobalData(); void sglobalCall(); bool isRewrittenRHSOpOverload() const; void isRewrittenRHSOpOverload(bool); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MethodCallAssignNode (); protected: TreeNode* _children[2]; bool _isRewrittenRHSOpOverload; }; class AllocateNode : public ExprNode { public: AllocateNode (TreeNode * region, TypeNode * dtype, llist * args, Decl* decl, TreeNode * qualifier, TreeNode * cbody, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; AllocateNode* clone () const; AllocateNode* deepClone () const; Decl* decl () const { return _decl; } void decl (Decl* v) { _decl = v; } TreeNode * cbody () const { return _cbody; } void cbody (TreeNode * v) { _cbody = v; } TreeNode* region () const { return (TreeNode*)_children[0]; } void region (TreeNode* v) { child(0, v); } TypeNode* dtype () const { return (TypeNode*)_children[1]; } void dtype (TypeNode* v) { child(1, v); } TreeListNode* args () const { return (TreeListNode*)_children[2]; } void args (TreeListNode* v) { child(2, v); } TreeNode* qualifier () const { return (TreeNode*)_children[3]; } void qualifier (TreeNode* v) { child(3, v); } TypeNode* __type (); void flattenClasses(FlattenContext *ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); virtual const string emitExpression( CodeContext & ); TreeNode *resolveTypes(TypeContext *ctx); TreeNode* resolveName (const NameContext &ctx); TreeNode *rewrite( const FieldContext * ); void _widen(); SingleState single(SingleContext *ctx); void resolveRequires(ClassDecl *); bool typecheck(TypeContext *ctx); bool _typecheck(TypeContext *ctx); ExprNode *lower(llist *&decls, llist *&stmts); void sglobalCall(); void infer( const InferContext & ); void enact( const EnactContext & ); AllocateNode *findAllocateNode(); void pseudoprint(ostream &os, unsigned depth) const; Bitset *getValues(AliasInfos *ai); bool isSideEffectFree() const; bool isPureFunction() const; Bitset *modifiesValues(); void setModifiesValues(Bitset *b); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: AllocateNode (); protected: Decl* _decl; TreeNode * _cbody; TreeNode* _children[4]; Bitset* _modifiesValues; int _fieldResolutions; }; class AllocateSpaceNode : public ExprNode { public: AllocateSpaceNode (TreeNode * region, TypeNode * dtype, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; AllocateSpaceNode* clone () const; AllocateSpaceNode* deepClone () const; TreeNode* region () const { return (TreeNode*)_children[0]; } void region (TreeNode* v) { child(0, v); } TypeNode* dtype () const { return (TypeNode*)_children[1]; } void dtype (TypeNode* v) { child(1, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); void resolveRequires(ClassDecl *); ExprNode *lower(llist *&decls, llist *&stmts); void findInitDependencies(Decl *, set *, set *); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: AllocateSpaceNode () {} protected: TreeNode* _children[2]; }; class AllocateArrayNode : public ExprNode { public: AllocateArrayNode (TreeNode * region, TypeNode * dtype, llist * dimExprs, TreeNode * initExpr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; AllocateArrayNode* clone () const; AllocateArrayNode* deepClone () const; TreeNode* region () const { return (TreeNode*)_children[0]; } void region (TreeNode* v) { child(0, v); } TypeNode* dtype () const { return (TypeNode*)_children[1]; } void dtype (TypeNode* v) { child(1, v); } TreeListNode* dimExprs () const { return (TreeListNode*)_children[2]; } void dimExprs (TreeListNode* v) { child(2, v); } TreeNode* initExpr () const { return (TreeNode*)_children[3]; } void initExpr (TreeNode* v) { child(3, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); void _widen(); bool typecheck(TypeContext *ctx); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *resolveTypes(TypeContext *ctx); ExprNode *lower(llist *&decls, llist *&stmts); void resolveRequires(ClassDecl *); void infer( const InferContext & ); void enact( const EnactContext & ); void pseudoprint(ostream &os, unsigned depth) const; Bitset *getValues(AliasInfos *ai); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: AllocateArrayNode () {} protected: TreeNode* _children[4]; }; class PostIncrNode : public IncrDecrNode { public: PostIncrNode (TreeNode * opnd0, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PostIncrNode* clone () const; PostIncrNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PostIncrNode () {} protected: TreeNode* _children[1]; }; class PostDecrNode : public IncrDecrNode { public: PostDecrNode (TreeNode * opnd0, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PostDecrNode* clone () const; PostDecrNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PostDecrNode () {} protected: TreeNode* _children[1]; }; class UnaryPlusNode : public UnaryArithNode { public: UnaryPlusNode (TreeNode * opnd0, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; UnaryPlusNode* clone () const; UnaryPlusNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } virtual const string emitExpression( CodeContext & ); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: UnaryPlusNode () {} protected: TreeNode* _children[1]; }; class UnaryMinusNode : public UnaryArithNode { public: UnaryMinusNode (TreeNode * opnd0, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; UnaryMinusNode* clone () const; UnaryMinusNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } virtual const string emitExpression( CodeContext & ); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: UnaryMinusNode () {} protected: TreeNode* _children[1]; }; class PreIncrNode : public IncrDecrNode { public: PreIncrNode (TreeNode * opnd0, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PreIncrNode* clone () const; PreIncrNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PreIncrNode () {} protected: TreeNode* _children[1]; }; class PreDecrNode : public IncrDecrNode { public: PreDecrNode (TreeNode * opnd0, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PreDecrNode* clone () const; PreDecrNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PreDecrNode () {} protected: TreeNode* _children[1]; }; class ComplementNode : public ExprNode { public: ComplementNode (TreeNode * opnd0, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ComplementNode* clone () const; ComplementNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); void _widen(); bool _typecheck(TypeContext *ctx); Common::Kind foldMask(); TreeNode *_fold(); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); const char *operatorName() const; ExprNode *lower(llist *&decls, llist *&stmts); void pseudoprint(ostream &os, unsigned depth) const; bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ComplementNode () {} protected: TreeNode* _children[1]; }; class NotNode : public ExprNode { public: NotNode (TreeNode * opnd0, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; NotNode* clone () const; NotNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); bool _typecheck(TypeContext *ctx); Common::Kind foldMask(); TreeNode *_fold(); SingleState single(SingleContext *ctx); TreeNode *_resolveOperators(); const char *operatorName() const; ExprNode *lower(llist *&decls, llist *&stmts); void pseudoprint(ostream &os, unsigned depth) const; bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: NotNode () {} protected: TreeNode* _children[1]; }; class CastNode : public DynamicTypeNode { public: CastNode (TreeNode * opnd0, TypeNode * dtype, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CastNode* clone () const; CastNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TypeNode* dtype () const { return (TypeNode*)_children[1]; } void dtype (TypeNode* v) { child(1, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); ExprNode *lower(llist *&decls, llist *&stmts); SingleState single(SingleContext *ctx); const char *operatorName() const; TypeNode *asType2(TypeNode *base); bool isArraySpecifier(Decl *package, Environ *fileEnv); void unshareType(); void enact( const EnactContext & ); void pseudoprint(ostream &os, unsigned depth) const; Bitset *getValues(AliasInfos *ai); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: CastNode () {} protected: TreeNode* _children[2]; }; class MultNode : public BinaryArithNode { public: MultNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MultNode* clone () const; MultNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MultNode () {} protected: TreeNode* _children[2]; }; class DivNode : public BinaryArithNode { public: DivNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; DivNode* clone () const; DivNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: DivNode () {} protected: TreeNode* _children[2]; }; class RemNode : public BinaryArithNode { public: RemNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; RemNode* clone () const; RemNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: RemNode () {} protected: TreeNode* _children[2]; }; class PlusNode : public BinaryArithNode { public: PlusNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PlusNode* clone () const; PlusNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); void _widen(); bool _typecheck(TypeContext *ctx); Common::Kind foldMask(); TreeNode *_fold(); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); TreeNode *resolveConcat(); TreeNode *_resolveOperators(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PlusNode () {} protected: TreeNode* _children[2]; }; class StringConcatNode : public ExprNode { public: StringConcatNode (llist * addends, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; StringConcatNode* clone () const; StringConcatNode* deepClone () const; TreeListNode* addends () const { return (TreeListNode*)_children[0]; } void addends (TreeListNode* v) { child(0, v); } TypeNode* __type (); SingleState single(SingleContext *ctx); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; TreeNode *rewrite( const FieldContext * ); ExprNode * buildConcatTree( llist *, const FieldContext & ) const; MethodCallNode * buildMethodCall( ExprNode &, const string *, llist * ) const; MethodCallNode * buildToStringCall( ExprNode & ) const; void infer( const InferContext & ); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: StringConcatNode () {} protected: TreeNode* _children[1]; }; class StringConcatAssignNode : public StringConcatNode { public: StringConcatAssignNode (TreeNode * opnd0, llist * addends, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; StringConcatAssignNode* clone () const; StringConcatAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeListNode* addends () const { return (TreeListNode*)_children[1]; } void addends (TreeListNode* v) { child(1, v); } SingleState single(SingleContext *ctx); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; TreeNode *rewrite( const FieldContext * ); void sglobalData(); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: StringConcatAssignNode () {} protected: TreeNode* _children[2]; }; class MinusNode : public BinaryArithNode { public: MinusNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MinusNode* clone () const; MinusNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MinusNode () {} protected: TreeNode* _children[2]; }; class LeftShiftLogNode : public ShiftNode { public: LeftShiftLogNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; LeftShiftLogNode* clone () const; LeftShiftLogNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: LeftShiftLogNode () {} protected: TreeNode* _children[2]; }; class RightShiftLogNode : public ShiftNode { public: RightShiftLogNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; RightShiftLogNode* clone () const; RightShiftLogNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: RightShiftLogNode () {} protected: TreeNode* _children[2]; }; class RightShiftArithNode : public ShiftNode { public: RightShiftArithNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; RightShiftArithNode* clone () const; RightShiftArithNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: RightShiftArithNode () {} protected: TreeNode* _children[2]; }; class LTNode : public RelationNode { public: LTNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; LTNode* clone () const; LTNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: LTNode () {} protected: TreeNode* _children[2]; }; class GTNode : public RelationNode { public: GTNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; GTNode* clone () const; GTNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: GTNode () {} protected: TreeNode* _children[2]; }; class LENode : public RelationNode { public: LENode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; LENode* clone () const; LENode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: LENode () {} protected: TreeNode* _children[2]; }; class GENode : public RelationNode { public: GENode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; GENode* clone () const; GENode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: GENode () {} protected: TreeNode* _children[2]; }; class InstanceOfNode : public DynamicTypeNode { public: InstanceOfNode (TreeNode * opnd0, TypeNode * dtype, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; InstanceOfNode* clone () const; InstanceOfNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TypeNode* dtype () const { return (TypeNode*)_children[1]; } void dtype (TypeNode* v) { child(1, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); const char *operatorName() const; ExprNode *lower(llist *&decls, llist *&stmts); void unshareType(); void enact( const EnactContext & ); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: InstanceOfNode () {} protected: TreeNode* _children[2]; }; class EQNode : public EqualityNode { public: EQNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; EQNode* clone () const; EQNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: EQNode () {} protected: TreeNode* _children[2]; }; class NENode : public EqualityNode { public: NENode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; NENode* clone () const; NENode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: NENode () {} protected: TreeNode* _children[2]; }; class BitAndNode : public BitwiseNode { public: BitAndNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; BitAndNode* clone () const; BitAndNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: BitAndNode () {} protected: TreeNode* _children[2]; }; class BitOrNode : public BitwiseNode { public: BitOrNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; BitOrNode* clone () const; BitOrNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: BitOrNode () {} protected: TreeNode* _children[2]; }; class BitXorNode : public BitwiseNode { public: BitXorNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; BitXorNode* clone () const; BitXorNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } virtual const string emitExpression( CodeContext & ); Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: BitXorNode () {} protected: TreeNode* _children[2]; }; class CandNode : public LogCondNode { public: CandNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CandNode* clone () const; CandNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; ExprNode *lower(llist *&decls, llist *&stmts); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: CandNode () {} protected: TreeNode* _children[2]; }; class CorNode : public LogCondNode { public: CorNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CorNode* clone () const; CorNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } Common::Kind foldMask(); TreeNode *_fold(); const char *operatorName() const; ExprNode *lower(llist *&decls, llist *&stmts); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: CorNode () {} protected: TreeNode* _children[2]; }; class IfExprNode : public ExprNode { public: IfExprNode (TreeNode * condition, TreeNode * thenOpnd, TreeNode * elseOpnd, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; IfExprNode* clone () const; IfExprNode* deepClone () const; TreeNode* condition () const { return (TreeNode*)_children[0]; } void condition (TreeNode* v) { child(0, v); } TreeNode* thenOpnd () const { return (TreeNode*)_children[1]; } void thenOpnd (TreeNode* v) { child(1, v); } TreeNode* elseOpnd () const { return (TreeNode*)_children[2]; } void elseOpnd (TreeNode* v) { child(2, v); } TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); TreeNode *foldConstants(); SingleState single(SingleContext *ctx); const char *operatorName() const; ExprNode *lower(llist *&decls, llist *&stmts); void infer( const InferContext & ); void inferSharingLate( const SharingContext & ); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: IfExprNode () {} protected: TreeNode* _children[3]; }; class AssignNode : public ExprNode { public: AssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; AssignNode* clone () const; AssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); SingleState single(SingleContext *ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); const char *operatorName() const; void findMayMustReadWrite(bool r, bool w); ExprNode *lower(llist *&decls, llist *&stmts); void sglobalData(); void findDefs(Defs *); virtual const string emitExpression( CodeContext & ); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); void infer( const InferContext & ); void inferLocal( const LocalContext & ); void inferSharingLate( const SharingContext & ); bool checkIF(bool serious) const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: AssignNode () {} protected: TreeNode* _children[2]; }; class MultAssignNode : public BinaryArithAssignNode { public: MultAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MultAssignNode* clone () const; MultAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MultAssignNode () {} protected: TreeNode* _children[2]; }; class DivAssignNode : public BinaryArithAssignNode { public: DivAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; DivAssignNode* clone () const; DivAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: DivAssignNode () {} protected: TreeNode* _children[2]; }; class RemAssignNode : public BinaryArithAssignNode { public: RemAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; RemAssignNode* clone () const; RemAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: RemAssignNode () {} protected: TreeNode* _children[2]; }; class PlusAssignNode : public BinaryArithAssignNode { public: PlusAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PlusAssignNode* clone () const; PlusAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } void _widen(); bool _typecheck(TypeContext *ctx); TreeNode *resolveConcat(); const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; TypeNode *widenSource(); TypeNode *castResult(); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PlusAssignNode () {} protected: TreeNode* _children[2]; }; class MinusAssignNode : public BinaryArithAssignNode { public: MinusAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MinusAssignNode* clone () const; MinusAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MinusAssignNode () {} protected: TreeNode* _children[2]; }; class LeftShiftLogAssignNode : public ShiftAssignNode { public: LeftShiftLogAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; LeftShiftLogAssignNode* clone () const; LeftShiftLogAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: LeftShiftLogAssignNode () {} protected: TreeNode* _children[2]; }; class RightShiftLogAssignNode : public ShiftAssignNode { public: RightShiftLogAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; RightShiftLogAssignNode* clone () const; RightShiftLogAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: RightShiftLogAssignNode () {} protected: TreeNode* _children[2]; }; class RightShiftArithAssignNode : public ShiftAssignNode { public: RightShiftArithAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; RightShiftArithAssignNode* clone () const; RightShiftArithAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: RightShiftArithAssignNode () {} protected: TreeNode* _children[2]; }; class BitAndAssignNode : public BitwiseAssignNode { public: BitAndAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; BitAndAssignNode* clone () const; BitAndAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: BitAndAssignNode () {} protected: TreeNode* _children[2]; }; class BitXorAssignNode : public BitwiseAssignNode { public: BitXorAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; BitXorAssignNode* clone () const; BitXorAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: BitXorAssignNode () {} protected: TreeNode* _children[2]; }; class BitOrAssignNode : public BitwiseAssignNode { public: BitOrAssignNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; BitOrAssignNode* clone () const; BitOrAssignNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } const char *operatorName() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: BitOrAssignNode () {} protected: TreeNode* _children[2]; }; class PointTypeNode : public TypeNode { public: PointTypeNode (TreeNode * expr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PointTypeNode* clone () const; PointTypeNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } TypeNode::Kind kind () const; ClassDecl* decl () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; bool isAtomic () const; bool isPointType () const; bool isArrayType () const; TypeNode *indexType() const; bool isWriteableArrayType () const; TypeNode* elementType () const; int tiArity() const; bool _typecheck(TypeContext *ctx); void emitNullifyLocal( ostream &, const string & ) const; const CtType &cDescriptorTypeCreate() const; const CtType &cTypeCreateUnboxed() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PointTypeNode () {} protected: TreeNode* _children[1]; }; class RectDomainTypeNode : public TypeNode { public: RectDomainTypeNode (TreeNode * expr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; RectDomainTypeNode* clone () const; RectDomainTypeNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } TypeNode::Kind kind () const; ClassDecl* decl () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; bool isAtomic () const; bool isRectDomainType () const; int tiArity() const; bool _typecheck(TypeContext *ctx); void emitNullifyLocal( ostream &, const string & ) const; const CtType &cDescriptorTypeCreate() const; const CtType &cTypeCreateUnboxed() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: RectDomainTypeNode () {} protected: TreeNode* _children[1]; }; class DomainTypeNode : public TypeNode { public: DomainTypeNode (TreeNode * expr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; DomainTypeNode* clone () const; DomainTypeNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } TypeNode::Kind kind () const; ClassDecl* decl () const; string signature () const; string formalSignature () const; bool hasFormalSignature () const; bool isDomainType () const; int tiArity() const; bool _typecheck(TypeContext *ctx); bool needsProtection() const; void localCastTo( const TypeNode &, LocalSolver &solver ) const; void sharingCastTo( const TypeNode &, SharingSolver &solver ) const; const CtType &cDescriptorTypeCreate() const; const CtType &cTypeCreateUnboxed() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: DomainTypeNode () {} protected: TreeNode* _children[1]; }; class TitaniumArrayTypeNode : public ArrayTypeNode { public: TitaniumArrayTypeNode (TypeNode * elementType, TreeNode * expr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TitaniumArrayTypeNode* clone () const; TitaniumArrayTypeNode* deepClone () const; TypeNode* elementType () const { return (TypeNode*)_children[0]; } void elementType (TypeNode* v) { child(0, v); } TreeNode* expr () const { return (TreeNode*)_children[1]; } void expr (TreeNode* v) { child(1, v); } TypeNode::Kind kind () const; ClassDecl* decl () const; string signature () const; bool selectedForCodeGen(bool) const; string dimensionTypeName() const; bool isTitaniumArrayType () const; TypeNode *indexType() const; int tiArity() const; bool _typecheck(TypeContext *ctx); const string emitGlobalize( CodeContext &, const string &, const string & ) const; const string emitLocalize( CodeContext &, const string & ) const; void emitNullifyLocal( ostream &, const string & ) const; void subsimilarTo( const TypeNode &, QualSolver & ) const; const CtType &cTypeCreateBoxed() const; const CtType &cTypeCreateUnboxed() const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TitaniumArrayTypeNode () {} protected: TreeNode* _children[2]; }; class ForEachPairNode : public TreeNode { public: ForEachPairNode (TreeNode * simpName, TreeNode * initExpr, TreeNode * dtypeopt, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ForEachPairNode* clone () const; ForEachPairNode* deepClone () const; TreeNode* simpName () const { return (TreeNode*)_children[0]; } void simpName (TreeNode* v) { child(0, v); } TreeNode* initExpr () const { return (TreeNode*)_children[1]; } void initExpr (TreeNode* v) { child(1, v); } TreeNode* dtypeopt () const { return (TreeNode*)_children[2]; } void dtypeopt (TreeNode* v) { child(2, v); } bool checkIF(bool serious) const; TreeNode *lower(llist *&decls, llist *&stmts); void pseudoprint(ostream &os, unsigned depth) const; void findDefs(Defs *); virtual const string emitUse( LocalVars &, const ObjectNode & ) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ForEachPairNode () {} protected: TreeNode* _children[3]; }; class ForEachSetupNode : public StatementNode { public: ForEachSetupNode (TreeNode * WRTloop, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ForEachSetupNode* clone () const; ForEachSetupNode* deepClone () const; TreeNode * WRTloop () const { return _WRTloop; } void WRTloop (TreeNode * v) { _WRTloop = v; } virtual void emitStatement( CodeContext & ); bool checkIF(bool serious) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ForEachSetupNode () {} protected: TreeNode * _WRTloop; }; class StrippedForEachNode : public StatementNode { public: StrippedForEachNode (TreeNode * stmt, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; StrippedForEachNode* clone () const; StrippedForEachNode* deepClone () const; TreeNode* stmt () const { return (TreeNode*)_children[0]; } void stmt (TreeNode* v) { child(0, v); } virtual void emitStatement( CodeContext & ); bool checkIF(bool serious) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: StrippedForEachNode () {} protected: TreeNode* _children[1]; }; class UpdatePointBeforeStmtNode : public StatementNode { public: UpdatePointBeforeStmtNode (TreeNode * stmt, string ** pointValues, llist< pair > * rfrs, llist< pair > * sirs, llist< pair > * urs, TreeNode * WRTloop, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; UpdatePointBeforeStmtNode* clone () const; UpdatePointBeforeStmtNode* deepClone () const; string ** pointValues () const { return _pointValues; } void pointValues (string ** v) { _pointValues = v; } llist< pair > * rfrs () const { return _rfrs; } void rfrs (llist< pair > * v) { _rfrs = v; } llist< pair > * sirs () const { return _sirs; } void sirs (llist< pair > * v) { _sirs = v; } llist< pair > * urs () const { return _urs; } void urs (llist< pair > * v) { _urs = v; } TreeNode * WRTloop () const { return _WRTloop; } void WRTloop (TreeNode * v) { _WRTloop = v; } TreeNode* stmt () const { return (TreeNode*)_children[0]; } void stmt (TreeNode* v) { child(0, v); } virtual void emitStatement( CodeContext & ); bool & valuesAreDeltas(); bool checkIF(bool serious) const; TreeNode * applyReordering(); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: UpdatePointBeforeStmtNode (); protected: string ** _pointValues; llist< pair > * _rfrs; llist< pair > * _sirs; llist< pair > * _urs; TreeNode * _WRTloop; TreeNode* _children[1]; bool _valuesAreDeltas; }; class ForEachStmtNode : public StatementNode { public: ForEachStmtNode (llist * vars, TreeNode * stmt, bool isinline, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ForEachStmtNode* clone () const; ForEachStmtNode* deepClone () const; bool isinline () const { return _isinline; } void isinline (bool v) { _isinline = v; } TreeListNode* vars () const { return (TreeListNode*)_children[0]; } void vars (TreeListNode* v) { child(0, v); } TreeNode* stmt () const { return (TreeNode*)_children[1]; } void stmt (TreeNode* v) { child(1, v); } ~ForEachStmtNode(); bool setParallel(bool); bool getParallel() const; void resolveRequires(ClassDecl *); TreeNode* resolveName (const NameContext &ctx); TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); bool typecheck(TypeContext *ctx); bool reachability(ReachableContext &); bool checkIF(bool serious) const; TreeNode * strengthReduce(); virtual void emitStatement( CodeContext & ); SingleState single(SingleContext *ctx); const char *operatorName() const; TreeNode * liftInvariantExprs(); treeSet *& invariants(); void loopAnal(TreeNode *enclosingLoop); Defs * defs(); void computeForeachDominators(bool ignoreNSE, int level); treeSet *& lifted_invariants(); TreeNode *lower(llist *&decls, llist *&stmts); CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; bool & needPoint(); bool & saveSRinfo(); bool & shouldDeclare(); void emitSetup( CodeContext & ); TreeNode *& cannotBeEmpty(); TreeNode *cannotBeEmpty() const; TreeNode *useOfArray(TreeNode *vardecl) const; int tiArity() const; bool partialDomain() const; int & numLifted(); ExprNode *& lo(); ExprNode *& hi(); ExprNode *& stride(); bool & ordered(); bool & tentative(); ExprNode *lo() const; ExprNode *hi() const; ExprNode *stride() const; bool ordered() const; bool tentative() const; llist *& junk_pre(); llist *& junk_post(); CodeContext *& blockContext(); bool isLoop() const; void deepCloneSpecial (TreeNode*) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ForEachStmtNode (); protected: bool _isinline; TreeNode* _children[2]; Defs * _defs; bool _needPoint; int _numLifted; ExprNode * _lo; ExprNode * _hi; ExprNode * _stride; bool _ordered; bool _tentative; bool _parallel; llist * _junk_pre; llist * _junk_post; treeSet * _lifted_invariants; treeSet * _invariants; bool _saveSRinfo; bool _shouldDeclare; CodeContext * _blockContext; TreeNode * _cannotBeEmpty; ArrayAccessSet * arrayAccesses; map_tree_to_cMIVElist * SR; bool _partialDomain; }; class ReorderNode : public StatementNode { public: ReorderNode (TreeNode * stmt, set * stmtsToDelete, treeSet * declsToDelete, map * remap, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ReorderNode* clone () const; ReorderNode* deepClone () const; set * stmtsToDelete () const { return _stmtsToDelete; } void stmtsToDelete (set * v) { _stmtsToDelete = v; } treeSet * declsToDelete () const { return _declsToDelete; } void declsToDelete (treeSet * v) { _declsToDelete = v; } map * remap () const { return _remap; } void remap (map * v) { _remap = v; } TreeNode* stmt () const { return (TreeNode*)_children[0]; } void stmt (TreeNode* v) { child(0, v); } bool checkIF(bool serious) const; CfgExtent makeCfg(); TreeNode * applyReordering(); ~ReorderNode(); void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ReorderNode () {} protected: set * _stmtsToDelete; treeSet * _declsToDelete; map * _remap; TreeNode* _children[1]; }; class PartitionStmtNode : public StatementNode { public: PartitionStmtNode (TreeNode * simpName, llist * cases, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PartitionStmtNode* clone () const; PartitionStmtNode* deepClone () const; TreeNode* simpName () const { return (TreeNode*)_children[0]; } void simpName (TreeNode* v) { child(0, v); } TreeListNode* cases () const { return (TreeListNode*)_children[1]; } void cases (TreeListNode* v) { child(1, v); } TreeNode* resolveName (const NameContext &ctx); bool typecheck(TypeContext *ctx); virtual void emitStatement( CodeContext & ); SingleState single(SingleContext *ctx); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PartitionStmtNode () {} protected: TreeNode* _children[2]; }; class PartitionClauseNode : public TreeNode { public: PartitionClauseNode (TreeNode * condition, TreeNode * stmt, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PartitionClauseNode* clone () const; PartitionClauseNode* deepClone () const; TreeNode* condition () const { return (TreeNode*)_children[0]; } void condition (TreeNode* v) { child(0, v); } TreeNode* stmt () const { return (TreeNode*)_children[1]; } void stmt (TreeNode* v) { child(1, v); } TreeNode* resolveName (const NameContext &ctx); const char *operatorName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PartitionClauseNode () {} protected: TreeNode* _children[2]; }; class BroadcastNode : public ExprNode { public: BroadcastNode (TreeNode * expr, TreeNode * proc, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; BroadcastNode* clone () const; BroadcastNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } TreeNode* proc () const { return (TreeNode*)_children[1]; } void proc (TreeNode* v) { child(1, v); } TypeNode* __type (); void _widen(); bool _typecheck(TypeContext *ctx); void checkEmbeddedLocals(); SingleState single(SingleContext *ctx); void sglobalCall(); const char *operatorName() const; ExprNode *lower(llist *&decls, llist *&stmts); void infer( const InferContext & ); void inferLocal( const LocalContext & ); void inferSharingEarly( SharingSolver & ) const; void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: BroadcastNode () {} protected: TreeNode* _children[2]; }; class PointNode : public ExprNode { public: PointNode (llist * args, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PointNode* clone () const; PointNode* deepClone () const; TreeListNode* args () const { return (TreeListNode*)_children[0]; } void args (TreeListNode* v) { child(0, v); } TypeNode* __type (); bool _typecheck(TypeContext *ctx); void _widen(); virtual const string emitExpression( CodeContext & ); SingleState single(SingleContext *ctx); const char *operatorName() const; bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); ExprNode *lower(llist *&decls, llist *&stmts); void computeMIVE(TreeNode *WRTloop, void action(TreeNode *, TreeNode *, MIVE *)); void pseudoprint(ostream &os, unsigned depth) const; TypeNode *asType2(TypeNode *base); bool isArraySpecifier(Decl *package, Environ *fileEnv); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PointNode () {} protected: TreeNode* _children[1]; }; class DomainNode : public ExprNode { public: DomainNode (llist * args, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; DomainNode* clone () const; DomainNode* deepClone () const; TreeListNode* args () const { return (TreeListNode*)_children[0]; } void args (TreeListNode* v) { child(0, v); } TypeNode* __type (); bool _typecheck(TypeContext *ctx); TreeNode *rewrite( const FieldContext * ); void _widen(); virtual const string emitExpression( CodeContext & ); SingleState single(SingleContext *ctx); const char *operatorName() const; void resolveRequires(ClassDecl *); void pseudoprint(ostream &os, unsigned depth) const; ExprNode *lower(llist *&decls, llist *&stmts); bool loopInvariant(TreeNode *WRTloop, treeSet *loopContents, void action(TreeNode *, TreeNode *)); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: DomainNode () {} protected: TreeNode* _children[1]; }; class EmptyArrayNode : public TreeNode { public: EmptyArrayNode (Common::Modifiers flags, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; EmptyArrayNode* clone () const; EmptyArrayNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeNode *asExpr2(TreeNode *array); TypeNode *asType2(TypeNode *base); bool resolveNewArray(Decl *package, Environ *fileEnv, bool exprOnly, llist **dims, TypeNode **base); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: EmptyArrayNode () {} protected: Common::Modifiers _flags; }; class ExpressionArrayNode : public TreeNode { public: ExpressionArrayNode (TreeNode * expr, Common::Modifiers flags, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ExpressionArrayNode* clone () const; ExpressionArrayNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } TreeNode *asExpr2(TreeNode *array); TypeNode *asType2(TypeNode *base); bool resolveNewArray(Decl *package, Environ *fileEnv, bool exprOnly, llist **dims, TypeNode **base); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ExpressionArrayNode () {} protected: Common::Modifiers _flags; TreeNode* _children[1]; }; class TitaniumArrayNode : public TreeNode { public: TitaniumArrayNode (TreeNode * expr, Common::Modifiers flags, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TitaniumArrayNode* clone () const; TitaniumArrayNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } TreeNode *asExpr2(TreeNode *array); TypeNode *asType2(TypeNode *base); bool resolveNewArray(Decl *package, Environ *fileEnv, bool exprOnly, llist **dims, TypeNode **base); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TitaniumArrayNode () {} protected: Common::Modifiers _flags; TreeNode* _children[1]; }; class AllocateArrayDimensionNode : public TreeNode { public: AllocateArrayDimensionNode (TreeNode * expr, Common::Modifiers flags, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; AllocateArrayDimensionNode* clone () const; AllocateArrayDimensionNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } SingleState single(SingleContext *ctx); TreeNode *lower(llist *&decls, llist *&stmts); bool checkIF(bool serious) const; bool resolveNewArray(Decl *package, Environ *fileEnv, bool exprOnly, llist **dims, TypeNode **base); bool isInferable() const; bool enactDimension( const EnactContext & ); void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: AllocateArrayDimensionNode () {} protected: Common::Modifiers _flags; TreeNode* _children[1]; }; class ArrayNameNode : public TreeNode { public: ArrayNameNode (TreeNode * name, Common::Modifiers flags, llist * arrayspecifiers, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ArrayNameNode* clone () const; ArrayNameNode* deepClone () const; Common::Modifiers flags () const { return _flags; } void flags (Common::Modifiers v) { _flags = v; } TreeNode* name () const { return (TreeNode*)_children[0]; } void name (TreeNode* v) { child(0, v); } TreeListNode* arrayspecifiers () const { return (TreeListNode*)_children[1]; } void arrayspecifiers (TreeListNode* v) { child(1, v); } ExprNode *fixTemplateActual( const string &, TypeNode & ); TypeNode *fixTemplateActual( const string & ); TreeNode *asExpr(); TypeNode *asType(); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: ArrayNameNode () {} protected: Common::Modifiers _flags; TreeNode* _children[2]; }; class PragmaNode : public StatementNode { public: PragmaNode (TreeNode * stmt, Pragma::Request requests, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; PragmaNode* clone () const; PragmaNode* deepClone () const; Pragma::Request requests () const { return _requests; } void requests (Pragma::Request v) { _requests = v; } TreeNode* stmt () const { return (TreeNode*)_children[0]; } void stmt (TreeNode* v) { child(0, v); } bool checkIF(bool serious) const; bool isPragma(Pragma::Request r) const; CfgExtent makeCfg(); void findDefs(Defs *); virtual void emitStatement( CodeContext & ); void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: PragmaNode () {} protected: Pragma::Request _requests; TreeNode* _children[1]; }; class HasNoOverlapNode : public ExprNode { public: HasNoOverlapNode (TreeNode * opnd0, TreeNode * opnd1, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; HasNoOverlapNode* clone () const; HasNoOverlapNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TreeNode* opnd1 () const { return (TreeNode*)_children[1]; } void opnd1 (TreeNode* v) { child(1, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: HasNoOverlapNode () {} protected: TreeNode* _children[2]; }; class SRArrayAccessNode : public ArrayAccessNode { public: SRArrayAccessNode (TreeNode * array, TreeNode * index, TreeNode * WRTloop, string codeString, bool appearsOnEveryIter, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; SRArrayAccessNode* clone () const; SRArrayAccessNode* deepClone () const; TreeNode * WRTloop () const { return _WRTloop; } void WRTloop (TreeNode * v) { _WRTloop = v; } string codeString () const { return _codeString; } void codeString (string v) { _codeString = v; } bool appearsOnEveryIter () const { return _appearsOnEveryIter; } void appearsOnEveryIter (bool v) { _appearsOnEveryIter = v; } TreeNode* array () const { return (TreeNode*)_children[0]; } void array (TreeNode* v) { child(0, v); } TreeNode* index () const { return (TreeNode*)_children[1]; } void index (TreeNode* v) { child(1, v); } virtual const string cArrayHandler( const char [], bool ); virtual bool isStrengthReduced() const; CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: SRArrayAccessNode () {} protected: TreeNode * _WRTloop; string _codeString; bool _appearsOnEveryIter; TreeNode* _children[2]; }; class OSRArrayAccessNode : public ArrayAccessNode { public: OSRArrayAccessNode (TreeNode * array, TreeNode * index, TreeNode * WRTloop, string codeString, string offsetString, bool appearsOnEveryIter, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; OSRArrayAccessNode* clone () const; OSRArrayAccessNode* deepClone () const; TreeNode * WRTloop () const { return _WRTloop; } void WRTloop (TreeNode * v) { _WRTloop = v; } string codeString () const { return _codeString; } void codeString (string v) { _codeString = v; } string offsetString () const { return _offsetString; } void offsetString (string v) { _offsetString = v; } bool appearsOnEveryIter () const { return _appearsOnEveryIter; } void appearsOnEveryIter (bool v) { _appearsOnEveryIter = v; } TreeNode* array () const { return (TreeNode*)_children[0]; } void array (TreeNode* v) { child(0, v); } TreeNode* index () const { return (TreeNode*)_children[1]; } void index (TreeNode* v) { child(1, v); } virtual const string cArrayHandler( const char [], bool ); virtual bool isStrengthReduced() const; CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: OSRArrayAccessNode () {} protected: TreeNode * _WRTloop; string _codeString; string _offsetString; bool _appearsOnEveryIter; TreeNode* _children[2]; }; class IBroadcastNode : public ExprNode { public: IBroadcastNode (TreeNode * expr, TreeNode * proc, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; IBroadcastNode* clone () const; IBroadcastNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } TreeNode* proc () const { return (TreeNode*)_children[1]; } void proc (TreeNode* v) { child(1, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); void pseudoprint(ostream &os, unsigned depth) const; Bitset *getValues(AliasInfos *ai); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: IBroadcastNode () {} protected: TreeNode* _children[2]; }; class StringConcatAssignPreLoweringNode : public ExprNode { public: StringConcatAssignPreLoweringNode (TreeNode * opnd0, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; StringConcatAssignPreLoweringNode* clone () const; StringConcatAssignPreLoweringNode* deepClone () const; TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TypeNode* __type (); ExprNode *lower(llist *&decls, llist *&stmts); void infer( const InferContext & ); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: StringConcatAssignPreLoweringNode () {} protected: TreeNode* _children[1]; }; class MethodTypeNode : public TypeNode { public: MethodTypeNode (llist * paramTypes, TypeNode * returnType, TypeNode * declaredReturnType, llist * throws, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MethodTypeNode* clone () const; MethodTypeNode* deepClone () const; TypeListNode* paramTypes () const { return (TypeListNode*)_children[0]; } void paramTypes (TypeListNode* v) { child(0, v); } TypeNode* returnType () const { return (TypeNode*)_children[1]; } void returnType (TypeNode* v) { child(1, v); } TypeNode* declaredReturnType () const { return (TypeNode*)_children[2]; } void declaredReturnType (TypeNode* v) { child(2, v); } TypeListNode* throws () const { return (TypeListNode*)_children[3]; } void throws (TypeListNode* v) { child(3, v); } TypeNode::Kind kind () const; bool hasReference() const; bool isCallableWith (Modifiers, const TreeNode* T1) const; string signature () const; Modifiers modifiers () const; string unqualifiedTypeName() const; string typeName() const; bool isMain() const; void conservative( QualSolver & ) const; void identicalTo( const TypeNode &, QualSolver & ) const; void weaklySubsumedBy( const TypeNode &, QualSolver & ) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MethodTypeNode () {} protected: TreeNode* _children[4]; }; class NullTypeNode : public PrimitiveTypeNode { public: NullTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; NullTypeNode* clone () const; NullTypeNode* deepClone () const; TypeNode::Kind kind () const; string unqualifiedTypeName() const; string typeName() const; bool isNullType () const; Modifiers modifiers () const; TypeDecl* decl () const; const char *cPrimitiveTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class ArrayInitializerTypeNode : public TypeNode { public: ArrayInitializerTypeNode (SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; ArrayInitializerTypeNode* clone () const; ArrayInitializerTypeNode* deepClone () const; TypeNode::Kind kind () const; string unqualifiedTypeName() const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: }; class CodeLiteralNode : public StatementNode { public: CodeLiteralNode (string codeString, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CodeLiteralNode* clone () const; CodeLiteralNode* deepClone () const; string codeString () const { return _codeString; } void codeString (string v) { _codeString = v; } virtual void emitStatement( CodeContext & ); bool checkIF(bool serious) const; CfgExtent makeCfg(); void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: CodeLiteralNode () {} protected: string _codeString; }; class CodeLiteralExprNode : public ExprNode { public: CodeLiteralExprNode (string codeString, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CodeLiteralExprNode* clone () const; CodeLiteralExprNode* deepClone () const; string codeString () const { return _codeString; } void codeString (string v) { _codeString = v; } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); void pseudoprint(ostream &os, unsigned depth) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: CodeLiteralExprNode () {} protected: string _codeString; }; class CodeLiteralFieldAccessNode : public ExprNode { public: CodeLiteralFieldAccessNode (TreeNode * opnd0, string codeString, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CodeLiteralFieldAccessNode* clone () const; CodeLiteralFieldAccessNode* deepClone () const; string codeString () const { return _codeString; } void codeString (string v) { _codeString = v; } TreeNode* opnd0 () const { return (TreeNode*)_children[0]; } void opnd0 (TreeNode* v) { child(0, v); } TypeNode* __type (); virtual const string emitExpression( CodeContext & ); void pseudoprint(ostream &os, unsigned depth) const; bool checkIF(bool serious) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: CodeLiteralFieldAccessNode () {} protected: string _codeString; TreeNode* _children[1]; }; class LazyOptimizeNode : public TreeNode { public: LazyOptimizeNode (TreeNode * body, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; LazyOptimizeNode* clone () const; LazyOptimizeNode* deepClone () const; TreeNode* body () const { return (TreeNode*)_children[0]; } void body (TreeNode* v) { child(0, v); } void codeGen ( CodeContext & ); virtual const string emitExpression( CodeContext & ); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: LazyOptimizeNode () {} protected: TreeNode* _children[1]; }; class MonitorFetchClassNode : public MonitorFetchNode { public: MonitorFetchClassNode (Decl* decl, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MonitorFetchClassNode* clone () const; MonitorFetchClassNode* deepClone () const; Decl* decl () const { return _decl; } void decl (Decl* v) { _decl = v; } bool superfluous() const; TreeNode *optimizeMonitors( MonitorStats & ); virtual void emitStatement( CodeContext & ); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MonitorFetchClassNode () {} protected: Decl* _decl; }; class MonitorFetchInstanceNode : public MonitorFetchNode { public: MonitorFetchInstanceNode (TreeNode * expr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MonitorFetchInstanceNode* clone () const; MonitorFetchInstanceNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } TreeNode *lower(llist *&decls, llist *&stmts); void inferSharingLate( const SharingContext & ); bool superfluous() const; TreeNode *optimizeMonitors( MonitorStats & ); virtual void emitStatement( CodeContext & ); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MonitorFetchInstanceNode () {} protected: TreeNode* _children[1]; }; class MonitorLockNode : public MonitorUseNode { public: MonitorLockNode (MonitorFetchNode * fetcher, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MonitorLockNode* clone () const; MonitorLockNode* deepClone () const; MonitorFetchNode * fetcher () const { return _fetcher; } void fetcher (MonitorFetchNode * v) { _fetcher = v; } virtual void emitStatement( CodeContext & ); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MonitorLockNode () {} protected: MonitorFetchNode * _fetcher; }; class MonitorUnlockNode : public MonitorUseNode { public: MonitorUnlockNode (MonitorFetchNode * fetcher, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; MonitorUnlockNode* clone () const; MonitorUnlockNode* deepClone () const; MonitorFetchNode * fetcher () const { return _fetcher; } void fetcher (MonitorFetchNode * v) { _fetcher = v; } virtual void emitStatement( CodeContext & ); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: MonitorUnlockNode () {} protected: MonitorFetchNode * _fetcher; }; class CheckNullNode : public StatementNode { public: CheckNullNode (TreeNode * expr, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; CheckNullNode* clone () const; CheckNullNode* deepClone () const; TreeNode* expr () const { return (TreeNode*)_children[0]; } void expr (TreeNode* v) { child(0, v); } bool checkIF(bool serious) const; CfgExtent makeCfg(); virtual void emitStatement( CodeContext & ); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: CheckNullNode () {} protected: TreeNode* _children[1]; }; class AssertNode : public StatementNode { public: AssertNode (TreeNode * condition, TreeNode * value, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; AssertNode* clone () const; AssertNode* deepClone () const; TreeNode* condition () const { return (TreeNode*)_children[0]; } void condition (TreeNode* v) { child(0, v); } TreeNode* value () const { return (TreeNode*)_children[1]; } void value (TreeNode* v) { child(1, v); } bool typecheck(TypeContext *ctx); const char *operatorName() const; TreeNode *rewrite( const FieldContext * ); SingleState single(SingleContext *ctx); void pseudoprint(ostream &os, unsigned depth) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: AssertNode () {} protected: TreeNode* _children[2]; }; class TemplateNameNode : public NameNode { public: TemplateNameNode (TreeNode * qualifier, TypeNode * ttype, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TemplateNameNode* clone () const; TemplateNameNode* deepClone () const; TreeNode* qualifier () const { return (TreeNode*)_children[0]; } void qualifier (TreeNode* v) { child(0, v); } TypeNode* ttype () const { return (TypeNode*)_children[1]; } void ttype (TypeNode* v) { child(1, v); } ClassDecl* decl () const; const string* ident () const; TreeNode *buildTypeEnv(TypeContext *ctx); void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TemplateNameNode () {} protected: TreeNode* _children[2]; }; class TemplateInstanceTypeNode : public TypeNode { public: TemplateInstanceTypeNode (TypeNode * dtype, llist * args, ClassDecl* decl, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TemplateInstanceTypeNode* clone () const; TemplateInstanceTypeNode* deepClone () const; ClassDecl* decl () const { return _decl; } void decl (ClassDecl* v) { _decl = v; } TypeNode* dtype () const { return (TypeNode*)_children[0]; } void dtype (TypeNode* v) { child(0, v); } TreeListNode* args () const { return (TreeListNode*)_children[1]; } void args (TreeListNode* v) { child(1, v); } TreeNode *buildTypeEnv(TypeContext *ctx); TreeNode *resolveTypes(TypeContext *ctx); ClassDecl *checkTemplateUse() const; void resolveTemplate( const TemplateContext & ); ClassDecl *resolveTemplate( bool ); int templateDepth() const; TypeNode::Kind kind () const; bool isPrimitive() const; bool isAtomic () const; bool isNamedType() const; bool isSharedField() const; void inferSharingEarly( SharingSolver & ) const; string signature () const; string unqualifiedTypeName() const; bool typeIdentNM(const TreeNode*) const; bool checkIF(bool serious) const; const CtType &cDescriptorTypeCreate() const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TemplateInstanceTypeNode () {} protected: ClassDecl* _decl; TreeNode* _children[2]; }; class TemplateDeclNode : public TreeNode { public: TemplateDeclNode (TypeDeclNode * basis, llist * params, Environ * environ, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TemplateDeclNode* clone () const; TemplateDeclNode* deepClone () const; Environ * environ () const { return _environ; } void environ (Environ * v) { _environ = v; } TypeDeclNode* basis () const { return (TypeDeclNode*)_children[0]; } void basis (TypeDeclNode* v) { child(0, v); } TreeListNode* params () const { return (TreeListNode*)_children[1]; } void params (TreeListNode* v) { child(1, v); } ClassDecl* decl () const; void resolvePackage (Decl* package, Environ *fileEnv, Environ *typeEnviron, bool recurse); TreeNode *resolveTypes(TypeContext *ctx); void resolveClass (ClassContext *ctx); void resolveInheritance(); TreeNode* resolveName (const NameContext &ctx); void flattenClasses(FlattenContext *ctx); TreeNode *buildTypeEnv(TypeContext *ctx); TreeNode *foldConstants(); void resolveTemplate( const TemplateContext & ); void foldFields(); bool verifyCircularity() const; void reportCircularity() const; TreeNode *resolveField(FieldContext *ctx, bool *inAssignment); TreeNode *resolveConcat(); bool typecheck(TypeContext *ctx); bool reachability(ReachableContext &); void sglobalData(); void sglobalCall(); SingleState single(SingleContext *ctx); TreeNode *rewrite( const FieldContext * ); void widen(); TreeNode *lower(llist *&decls, llist *&stmts); TreeNode * collapseTrivialBlocks(); bool checkIF(bool serious) const; void resolveRequires(ClassDecl *); void unshareTypeTree(); void inferLocalTree( const LocalContext & ); void inferSharingLateTree( const SharingContext & ); void inferSharingEarlyTree( SharingSolver & ) const; void localEnactTree( const LocalEnactContext & ); void sharingEnactTree( const SharingEnactContext & ); virtual void collectCleanups(); void lookForMain() const; void checkSglobal() const; bool selectedForCodeGen(bool) const; void findInitDependencies(Decl *, set *, set *); TreeNode *optimizeMonitors( MonitorStats & ); void emitDebugInfo( ofstream &, StringTable & ); void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TemplateDeclNode () {} protected: Environ * _environ; TreeNode* _children[2]; }; class TemplateParamNode : public TreeNode { public: TemplateParamNode* clone () const = 0; TemplateParamNode* deepClone () const = 0; protected: TemplateParamNode () {} }; class TemplateConstParamNode : public TemplateParamNode { public: TemplateConstParamNode (TypeNode * dtype, TreeNode * simpName, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TemplateConstParamNode* clone () const; TemplateConstParamNode* deepClone () const; TypeNode* dtype () const { return (TypeNode*)_children[0]; } void dtype (TypeNode* v) { child(0, v); } TreeNode* simpName () const { return (TreeNode*)_children[1]; } void simpName (TreeNode* v) { child(1, v); } TreeNode *fixTemplateActual( TreeNode & ) const; void checkTemplateFormal( IdentSet &, IdentSet & ) const; void checkTemplateActual( TemplateCheckContext &, TreeNode & ) const; PseudonymDecl *bindPseudonym( TreeNode & ) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TemplateConstParamNode () {} protected: TreeNode* _children[2]; }; class TemplateTypeParamNode : public TemplateParamNode { public: TemplateTypeParamNode (TreeNode * simpName, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TemplateTypeParamNode* clone () const; TemplateTypeParamNode* deepClone () const; TreeNode* simpName () const { return (TreeNode*)_children[0]; } void simpName (TreeNode* v) { child(0, v); } TreeNode *fixTemplateActual( TreeNode & ) const; void checkTemplateFormal( IdentSet &, IdentSet & ) const; void checkTemplateActual( TemplateCheckContext &, TreeNode & ) const; PseudonymDecl *bindPseudonym( TreeNode & ) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TemplateTypeParamNode () {} protected: TreeNode* _children[1]; }; class TemplateInstanceDeclNode : public TreeNode { public: TemplateInstanceDeclNode (TypeDeclNode * instance, Environ * environ, SourcePosn posn0 = NoSourcePosition); int arity () const; const char* oper_name () const; TemplateInstanceDeclNode* clone () const; TemplateInstanceDeclNode* deepClone () const; Environ * environ () const { return _environ; } void environ (Environ * v) { _environ = v; } TypeDeclNode* instance () const { return (TypeDeclNode*)_children[0]; } void instance (TypeDeclNode* v) { child(0, v); } TreeNode *resolveTypes(TypeContext *ctx); bool checkIF(bool serious) const; void print_attrs (ostream&, unsigned = 0) const; void dump (ostream&, unsigned = 0) const; bool compare (const TreeNode *) const; protected: TemplateInstanceDeclNode () {} protected: Environ * _environ; TreeNode* _children[1]; };