00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <fstream>
00011
00012 #include "class.hpp"
00013 #include "defs.hpp"
00014 #include "method_info.hpp"
00015
00016 namespace ClassEncoder
00017 {
00018 using namespace std;
00019
00021
00024 Class::Class( const std::string &className )
00025 {
00026 ClassName = className;
00027 }
00028
00030
00033 Class::~Class()
00034 {
00035 }
00036
00038
00042 void Class::write( )
00043 {
00044 string file = ClassName + ".class";
00045 ofstream classFile( file.c_str(), ios::out | ios::binary );
00046
00047
00048
00049
00050 unsigned int utfPos = ConstantPoolEntries.count() + 2;
00051 u2 super_class = ConstantPoolEntries.add( new Class_info( utfPos ) );
00052 ConstantPoolEntries.add( new Utf8_info( "java/lang/Object" ) );
00053
00054
00055 utfPos = ConstantPoolEntries.count() + 2;
00056 u2 this_class = ConstantPoolEntries.add( new Class_info( utfPos ) );
00057 ConstantPoolEntries.add( new Utf8_info( ClassName ) );
00058
00059
00060
00061 writeu4( classFile, JVM_MAGIC );
00062
00063
00064 writeu2( classFile, JVM_MINOR_VER );
00065
00066 writeu2( classFile, JVM_MAJOR_VER );
00067
00068
00069 writeu2( classFile, ConstantPoolEntries.count() + 1 );
00070
00071 ConstantPoolEntries.write( classFile );
00072
00073
00074 writeu2( classFile, ACC_SUPER );
00075
00076 writeu2( classFile, this_class );
00077
00078 writeu2( classFile, super_class );
00079
00080
00081
00082 writeu2( classFile, 0 );
00083
00084
00085
00086 writeu2( classFile, 0 );
00087
00088
00089
00090 writeu2( classFile, Methods.size() );
00091 for( vector<method_info*>::iterator it = Methods.begin(); it != Methods.end(); ++it )
00092 {
00093 (*it)->write( classFile );
00094 }
00095
00096
00097
00098 writeu2( classFile, 0 );
00099
00100 classFile.close();
00101 }
00102
00104
00109 method_info *Class::addMethod( const string &name )
00110 {
00111 method_info *method = new method_info( &ConstantPoolEntries, name );
00112 Methods.push_back( method );
00113 return method;
00114 }
00115
00116 }