00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef Bytecode_h
00025 #define Bytecode_h
00026
00027 #include "ycp/YCPValue.h"
00028 #include "ycp/YCode.h"
00029 #include "ycp/YStatement.h"
00030 #include "ycp/YBlock.h"
00031 #include "ycp/Type.h"
00032
00033 class Y2Namespace;
00034
00035 #include <iosfwd>
00036 #include <string>
00037 #include <map>
00038
00039 class Bytecode {
00040 static int m_namespace_nesting_level;
00041 static int m_namespace_nesting_array_size;
00042 static int m_namespace_tare_level;
00043 typedef struct { const Y2Namespace *name_space; bool with_xrefs; } namespaceentry_t;
00044 static namespaceentry_t *m_namespace_nesting_array;
00045 static map<string, YBlockPtr> m_bytecodeCache;
00046
00047 public:
00048
00049 static std::ostream & writeBool (std::ostream & streamref, bool value);
00050 static bool readBool (std::istream & streamref);
00051
00052
00053 static std::ostream & writeString (std::ostream & streamref, const std::string & stringref);
00054 static bool readString (std::istream & streamref, std::string & stringref);
00055
00056
00057 static std::ostream & writeUstring (std::ostream & streamref, const Ustring ustringref);
00058 static Ustring readUstring (std::istream & streamref);
00059
00060
00061 static std::ostream & writeCharp (std::ostream & streamref, const char * charp);
00062 static char * readCharp (std::istream & streamref);
00063
00064
00065 static std::ostream & writeBytep (std::ostream & streamref, const unsigned char * bytep, unsigned int len);
00066 static unsigned char * readBytep (std::istream & streamref);
00067
00068
00069 static std::ostream & writeInt32 (std::ostream & str, const u_int32_t value);
00070 static u_int32_t readInt32 (std::istream & str);
00071
00072
00073 static std::ostream & writeType (std::ostream & str, constTypePtr type);
00074 static TypePtr readType (std::istream & str);
00075
00076
00077 static std::ostream & writeValue (std::ostream & str, const YCPValue value);
00078 static YCPValue readValue (std::istream & str);
00079
00080
00081 static std::ostream & writeYCodelist (std::ostream & str, const ycodelist_t *codelist);
00082 static bool readYCodelist (std::istream & str, ycodelist_t **anchor);
00083
00084
00085
00086
00087 static void namespaceInit ();
00088
00089 static int namespaceId (const Y2Namespace *name_space);
00090
00091 static const Y2Namespace *namespacePtr (int namespace_id);
00092
00093
00094 static int pushNamespace (const Y2Namespace *name_space, bool with_xrefs = false);
00095
00096
00097 static int popNamespace (const Y2Namespace *name_space);
00098
00099
00100 static void popUptoNamespace (const Y2Namespace *name_space);
00101
00102
00103
00104 static int tareStack ();
00105 static void untareStack (int tare_id);
00106
00107
00108
00109
00110
00111 static std::ostream &writeEntry (std::ostream & str, const SymbolEntryPtr entry);
00112 static SymbolEntryPtr readEntry (std::istream & str);
00113
00114
00115
00116
00117
00118 static YCodePtr readCode (std::istream & str);
00119
00120
00121
00122
00123
00124
00125 static YBlockPtr readModule (const string & mname);
00126
00127
00128 static YCodePtr readFile (const string & filename);
00129
00130
00131 static bool writeFile (const YCodePtr code, const string & filename);
00132 };
00133
00134 #endif // Bytecode_h