00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016 #ifndef FALCON_GENHSAM_H
00017 #define FALCON_GENHSAM_H
00018
00019 #include <falcon/generator.h>
00020 #include <falcon/compiler.h>
00021 #include <falcon/genericlist.h>
00022
00023 namespace Falcon
00024 {
00025
00026
00027 class FALCON_DYN_CLASS GenHAsm: public Generator
00028 {
00029 void gen_depTable( const Module *mod );
00030 void gen_stringTable( const Module *mod );
00031 void gen_symbolTable( const Module *mod );
00032 void gen_function( const StmtFunction *func );
00033 void gen_class( const StmtClass *cls );
00034 void gen_propdef( const VarDef &def );
00035 void gen_block( const StatementList *slist );
00036 void gen_statement( const Statement *stmt );
00037 void gen_condition( const Value *stmt, int mode=0 );
00038 void gen_value( const Value *stmt, const char *prefix = 0, const char *cpl_post = 0 );
00039 void gen_operand( const Value *stmt );
00040
00041 typedef enum {
00042 l_value,
00043 p_value,
00044 v_value
00045 } t_valType;
00046
00101 void gen_complex_value( const Value *value, t_valType &x_value );
00102
00108 void gen_complex_value( const Value *value ) { t_valType dummy; gen_complex_value( value, dummy ); }
00109
00116 void gen_expression( const Expression *expr, t_valType &x_value );
00117
00121 void gen_expression( const Expression *expr ) { t_valType dummy; gen_expression( expr, dummy ); }
00122
00123 void gen_dict_decl( const DictDecl *stmt );
00124 void gen_array_decl( const ArrayDecl *stmt );
00125 void gen_range_decl( const RangeDecl *stmt );
00126
00133 void gen_push( const Value *val );
00134
00141 void gen_load( const Value *target, const Value *source );
00142
00143 void gen_store_to_deep( const char *type, const Value *source, const Value *first, const Value *second );
00144
00145 void gen_inc_prefix( const Value *target );
00146 void gen_dec_prefix( const Value *target );
00147 void gen_inc_postfix( const Value *target );
00148 void gen_dec_postfix( const Value *target );
00149 void gen_autoassign( const char *op, const Value *target, const Value *source );
00150 void gen_store_to_deep_A( const char *type, const Value *first, const Value *second );
00151 void gen_store_to_deep_reg( const char *type, const Value *first, const Value *second, const char *reg );
00152 void gen_load_from_deep( const char *type, const Value *first, const Value *second );
00153 void gen_load_from_A( const Value *target );
00154 void gen_load_from_reg( const Value *target, const char *reg );
00155 int gen_refArray( const ArrayDecl *tarr, bool bGenArray );
00156
00158 void dump_cases( int branch, const MapIterator &begin );
00159
00161 void gen_funcall( const Expression *call, bool fork=false );
00162
00163 int m_branch_id;
00164 int m_loop_id;
00165 int m_try_id;
00166
00167 List m_branches;
00168 List m_loops;
00169 List m_trys;
00170
00171 class LoopInfo
00172 {
00173 public:
00174 LoopInfo( int id, const Statement* l ):
00175 m_loop( l ),
00176 m_id( id ),
00177 m_isForLast( false )
00178 {}
00179
00180 const Statement* m_loop;
00181 int m_id;
00182 bool m_isForLast;
00183 };
00184
00186 List m_functions;
00187
00188 public:
00189 GenHAsm( Stream *out );
00190 virtual void generate( const SourceTree *st );
00191 void generatePrologue( const Module *module );
00192 };
00193
00194 }
00195 #endif
00196