Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

class_analy.cc

Go to the documentation of this file.
00001 /*
00002  *      HT Editor
00003  *      class_analy.cc
00004  *
00005  *      Copyright (C) 1999-2002 Sebastian Biallas (sb@web-productions.de)
00006  *
00007  *      This program is free software; you can redistribute it and/or modify
00008  *      it under the terms of the GNU General Public License version 2 as
00009  *      published by the Free Software Foundation.
00010  *
00011  *      This program is distributed in the hope that it will be useful,
00012  *      but WITHOUT ANY WARRANTY; without even the implied warranty of
00013  *      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014  *      GNU General Public License for more details.
00015  *
00016  *      You should have received a copy of the GNU General Public License
00017  *      along with this program; if not, write to the Free Software
00018  *      Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00019  */
00020 
00021 #include "analy.h"
00022 #include "analy_alpha.h"
00023 #include "analy_names.h"
00024 #include "analy_register.h"
00025 #include "analy_java.h"
00026 #include "global.h"
00027 #include "class.h"
00028 #include "class_analy.h"
00029 
00030 #include "htctrl.h"
00031 #include "htdebug.h"
00032 #include "htiobox.h"
00033 #include "htstring.h"
00034 #include "snprintf.h"
00035 #include "pestruct.h"
00036 
00037 #include <stdio.h>
00038 #include <stdlib.h>
00039 #include <string.h>
00040 
00041 /*
00042  *
00043  */
00044 void    ClassAnalyser::init(ht_class_shared_data *Class_shared, ht_streamfile *File)
00045 {
00046         class_shared = Class_shared;
00047         file = File;
00048 
00049         Analyser::init();
00050 
00051         initialized->done();
00052         delete initialized;
00053         initialized = class_shared->initialized;
00055 
00056         setLocationTreeOptimizeThreshold(100);
00057         setSymbolTreeOptimizeThreshold(100);
00058 }
00059 
00060 
00061 /*
00062  *
00063  */
00064 int     ClassAnalyser::load(ht_object_stream *f)
00065 {
00066         return Analyser::load(f);
00067 }
00068 
00069 /*
00070  *
00071  */
00072 void    ClassAnalyser::done()
00073 {
00074         Analyser::done();
00075 }
00076 
00077 /*
00078  *
00079  */
00080 void ClassAnalyser::beginAnalysis()
00081 {
00082         char buffer[1024];
00083         char *b = buffer;
00084         
00085         *(b++) = ';';  *(b++) = ' ';
00086         b = java_demangle_flags(b, class_shared->flags);
00087         b += ht_snprintf(b, 1024, "%s %s", (class_shared->flags & jACC_INTERFACE)?"interface":"class", class_shared->classinfo.thisclass);
00088         if (class_shared->classinfo.superclass) {
00089                 b += ht_snprintf(b, 1024, " extends %s", class_shared->classinfo.superclass);
00090         }
00091         if (class_shared->classinfo.interfaces) {
00092                 b += ht_snprintf(b, 1024, " implements");
00093                 int count = class_shared->classinfo.interfaces->count();
00094                 for (int i=0; i<count; i++) {
00095                         b += ht_snprintf(b, 1024, " %y%c", class_shared->classinfo.interfaces->get(i), (i+1<count)?',':' ');
00096                 }
00097         }
00098         b += ht_snprintf(b, 1024, " {");
00099 
00100         Address *a = createAddress32(0);
00101         addComment(a, 0, "");
00102         addComment(a, 0, ";********************************************************");
00103         addComment(a, 0, buffer);
00104         addComment(a, 0, ";********************************************************");
00105         delete a;
00106         if (class_shared->methods) {
00107                 ClassMethod *cm = NULL;
00108                 Object *value;
00109                 while ((cm = (ClassMethod*)class_shared->methods->enum_next(&value, cm))) {
00110                         Address *a = createAddress32(cm->start);
00111                         char buffer2[1024];
00112                         java_demangle(buffer2, class_shared->classinfo.thisclass, cm->name, cm->type, cm->flags);
00113                         ht_snprintf(buffer, 1024, "; %s", buffer2);
00114                         addComment(a, 0, "");
00115                         addComment(a, 0, ";----------------------------------------------");
00116                         addComment(a, 0, buffer);
00117                         addComment(a, 0, ";----------------------------------------------");
00118                         addAddressSymbol(a, cm->name, label_func);
00119                         pushAddress(a, a);
00120                         delete a;
00121                 }
00122         }
00123         setLocationTreeOptimizeThreshold(1000);
00124         setSymbolTreeOptimizeThreshold(1000);
00125 
00126         Analyser::beginAnalysis();
00127 }
00128 
00129 /*
00130  *
00131  */
00132 OBJECT_ID       ClassAnalyser::object_id() const
00133 {
00134         return ATOM_CLASS_ANALYSER;
00135 }
00136 
00137 /*
00138  *
00139  */
00140 UINT ClassAnalyser::bufPtr(Address *Addr, byte *buf, int size)
00141 {
00142         FILEOFS ofs = addressToFileofs(Addr);
00143         assert(ofs != INVALID_FILE_OFS);
00144         file->seek(ofs);
00145         return file->read(buf, size);
00146 }
00147 
00148 /*
00149  *
00150  */
00151 Address *ClassAnalyser::createAddress()
00152 {
00153         return new AddressFlat32(0);
00154 }
00155 
00156 /*
00157  *
00158  */
00159 Address *ClassAnalyser::createAddress32(ClassAddress addr)
00160 {
00161         return new AddressFlat32((dword)addr);
00162 }
00163 
00164 /*
00165  *
00166  */
00167 Assembler *ClassAnalyser::createAssembler()
00168 {
00169         return NULL;
00170 }
00171 
00172 /*
00173  *
00174  */
00175 FILEOFS ClassAnalyser::addressToFileofs(Address *Addr)
00176 {
00177         if (validAddress(Addr, scinitialized)) {
00178                 return ((AddressFlat32*)Addr)->addr;
00179         } else {
00180                 return INVALID_FILE_OFS;
00181         }
00182 }
00183 
00184 /*
00185  *
00186  */
00187 char *ClassAnalyser::getSegmentNameByAddress(Address *Addr)
00188 {
00189         static char sectionname[9];
00190         strcpy(sectionname, "test");
00191         return sectionname;
00192 }
00193 
00194 /*
00195  *
00196  */
00197 const char *ClassAnalyser::getName()
00198 {
00199         return file->get_desc();
00200 }
00201 
00202 /*
00203  *
00204  */
00205 const char *ClassAnalyser::getType()
00206 {
00207         return "Java-Class/Analyser";
00208 }
00209 
00210 /*
00211  *
00212  */
00213 void ClassAnalyser::initCodeAnalyser()
00214 {
00215         Analyser::initCodeAnalyser();
00216 }
00217 
00218 
00219 int class_token_func(char *result, int maxlen, dword token, void *context)
00220 {
00221         return token_translate(result, maxlen, token, (ht_class_shared_data *)context);
00222 }
00223 
00224 /*
00225  *
00226  */
00227 void ClassAnalyser::initUnasm()
00228 {
00229         DPRINTF("class_analy: ");
00230         analy_disasm = new AnalyJavaDisassembler();
00231         ((AnalyJavaDisassembler*)analy_disasm)->init(this, class_token_func, class_shared);
00232 }
00233 
00234 /*
00235  *
00236  */
00237 void ClassAnalyser::log(const char *msg)
00238 {
00239         /*
00240          *      log() creates to much traffic so dont log
00241          *   perhaps we reactivate this later
00242          *
00243          */
00244 /*      LOG(msg);*/
00245 }
00246 
00247 /*
00248  *
00249  */
00250 Address *ClassAnalyser::nextValid(Address *Addr)
00251 {
00252         return (Address *)class_shared->valid->findNext(Addr);
00253 }
00254 
00255 /*
00256  *
00257  */
00258 void ClassAnalyser::store(ht_object_stream *st)
00259 {
00260         Analyser::store(st);
00261 }
00262 
00263 /*
00264  *
00265  */
00266 int     ClassAnalyser::queryConfig(int mode)
00267 {
00268         switch (mode) {
00269                 case Q_DO_ANALYSIS:
00270                 case Q_ENGAGE_CODE_ANALYSER:
00271                 case Q_ENGAGE_DATA_ANALYSER:
00272                         return true;
00273                 default:
00274                         return 0;
00275         }
00276 }
00277 
00278 /*
00279  *
00280  */
00281 Address *ClassAnalyser::fileofsToAddress(FILEOFS fileaddr)
00282 {
00283         Address *a = createAddress32(fileaddr);
00284         if (validAddress(a, scvalid)) {
00285                 return a;
00286         } else {
00287                 delete a;
00288                 return NULL;
00289         }
00290 }
00291 
00292 /*
00293  *
00294  */
00295 bool ClassAnalyser::validAddress(Address *Addr, tsectype action)
00296 {
00297         if (!Addr->isValid() || !class_shared->valid->contains(Addr)) return false;
00298         switch (action) {
00299                 case scinitialized:
00300                 case sccode:
00301                         return class_shared->initialized->contains(Addr);
00302                 default:
00303 
00304                         return true;
00305         }
00306 }
00307 
00308 

Generated on Fri May 7 21:15:29 2004 by doxygen 1.3.5