| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 |
- /*
- _____ __ ___ __ ____ _ __
- / ___/__ ___ _ ___ / |/ /__ ___ / /_____ __ __/ __/_______(_)__ / /_
- / (_ / _ `/ ' \/ -_) /|_/ / _ \/ _ \/ '_/ -_) // /\ \/ __/ __/ / _ \/ __/
- \___/\_,_/_/_/_/\__/_/ /_/\___/_//_/_/\_\\__/\_, /___/\__/_/ /_/ .__/\__/
- /___/ /_/
-
- See Copyright Notice in gmMachine.h
- */
- #ifndef _GMCODEGENHOOKS_H_
- #define _GMCODEGENHOOKS_H_
- #include "gmConfig.h"
- /// \struct gmLineInfo
- /// \brief gmLineInfo describes the debug info required for line number debugging
- struct gmLineInfo
- {
- int m_address; //!< byte code address
- int m_lineNumber; //!< code line number
- };
- /// \struct gmFunctionInfo
- /// \brief gmFunctionInfo
- struct gmFunctionInfo
- {
- gmptr m_id; //!< unique id of the function (as used in BC_PUSHFN)
- bool m_root; //!< is this function the root function '__main'
- const void * m_byteCode; //!< byte code
- int m_byteCodeLength; //!< byte code length in bytes
- int m_numParams; //!< parameter count
- int m_numLocals; //!< local variable count (includes registers)
- int m_maxStackSize; //!< required temporary storage
- const char * m_debugName; //!< name of variable function was assigned to... may be NULL
- const char ** m_symbols; //!< param and local variable names, sizeof m_numParams + m_numLocals; (indexed by stack offset)
- int m_lineInfoCount; //!< number of entries in the line info array
- const gmLineInfo * m_lineInfo; //!< line - instruction address mapping for debugging purposes.
- };
- /// \class gmCodeGenHooks
- /// \brief gmCodeGenHooks is an interface that is fed to the compiler. basically the code gen hooks class allows you
- /// to compile script directly into the runtime vm, or into a libary.
- class gmCodeGenHooks
- {
- public:
- gmCodeGenHooks() {}
- virtual ~gmCodeGenHooks() {}
- /// \brief Begin() will be called by gmCodeGen at the start of compilation.
- /// \param a_debug is true if this is a debug build.
- virtual bool Begin(bool a_debug) = 0;
- /// \brief AddFunction() is called each time the byte code for a function has been created. The memory passed in
- /// the info structure is not valid after AddFunction returns.
- /// \return true on success
- virtual bool AddFunction(gmFunctionInfo &a_functionInfo) = 0;
- /// \brief End() is called by gmCodeGen at the end of a compilation.
- /// \param a_errors is the number of compilation errors.
- virtual bool End(int a_errors) = 0;
- /// \brief GetFunctionId() is called for the creation of unique function ids.
- /// \return a unique id.
- virtual gmptr GetFunctionId() = 0;
- /// \brief GetSymbolId() is called by the compiler to get a unique symbol id. this sybol id is a machine size int
- /// id written into the byte code.
- /// \return a unique id for each unique a_symbol.
- virtual gmptr GetSymbolId(const char * a_symbol) = 0;
- /// \brief GetStringId() is called by the compiler to get a constant string id. the returned value is written into
- /// the byte code for string lookups.
- /// \return a unique id for each unique string.
- virtual gmptr GetStringId(const char * a_string) = 0;
- /// \brief SwapEndian() returns true if the byte code is being compiled for a machine of differing endian
- virtual bool SwapEndian() const { return false; }
- };
- /// \class gmCodeGenHooksNull
- /// \brief used for syntax checking etc.
- class gmCodeGenHooksNull : public gmCodeGenHooks
- {
- public:
- gmCodeGenHooksNull() {}
- virtual ~gmCodeGenHooksNull() {}
- virtual bool Begin(bool a_debug) { return true; }
- virtual bool AddFunction(gmFunctionInfo &a_functionInfo) { return true; }
- virtual bool End(int a_errors) { return true; }
- virtual gmptr GetFunctionId() { return 0; }
- virtual gmptr GetSymbolId(const char * a_symbol) { return 0; }
- virtual gmptr GetStringId(const char * a_string) { return 0; }
- };
- #endif // _GMCODEGENHOOKS_H_
|