00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "code_attribute.hpp"
00011 #include "class.hpp"
00012
00013 namespace ClassEncoder
00014 {
00015 using namespace std;
00016
00018
00023 code_attribute::code_attribute( ConstantPool *pool )
00024 {
00025 Code = new ByteCode( pool );
00026 max_locals = 0;
00027 ConstantPoolEntries = pool;
00028
00029 setNameIndex( pool->add( new Utf8_info( "Code" ) ) );
00030 }
00031
00033
00036 code_attribute::~code_attribute()
00037 {
00038 if( Code ) delete Code;
00039 }
00040
00042
00046 void code_attribute::write( ofstream &stream )
00047 {
00048 attribute_info::write( stream );
00049
00050 writeu2( stream, Code->maxStackSize() );
00051
00052 writeu2( stream, max_locals );
00053
00054 writeu4( stream, Code->nextInstrAddr() );
00055
00056 Code->write( stream );
00057
00058
00059
00060 writeu2( stream, 0 );
00061
00062
00063 writeu2( stream, 0 );
00064 }
00065
00067
00071 unsigned int code_attribute::size()
00072 {
00073 return 2 + 2 + 4 + Code->nextInstrAddr() + 2 + 2;
00074 }
00075
00076 }