home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / kaffe-0.5p4-src.tgz / tar.out / contrib / kaffe / kaffevm / readClass.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  4KB  |  192 lines

  1. /*
  2.  * readClass.c
  3.  * Read in a new class.
  4.  *
  5.  * Copyright (c) 1996 Systems Architecture Research Centre,
  6.  *           City University, London, UK.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, February 1996.
  12.  */
  13.  
  14. #define    DBG(s)
  15.  
  16. #include "config.h"
  17. #include <stdio.h>
  18. #include <assert.h>
  19. #include <stdlib.h>
  20. #if defined(HAVE_UNISTD_H)
  21. #include <unistd.h>
  22. #endif
  23. #include <string.h>
  24. #include <gtypes.h>            /* Ugh! */
  25. #include <file.h>            /* Ugh! */
  26. #include <access.h>            /* Ugh! */
  27. #include "object.h"
  28. #include <constants.h>            /* Ugh! */
  29. #include <readClassConfig.h>        /* Ugh! */
  30. #include "readClass.h"
  31.  
  32. #ifndef SEEK_SET
  33. #define SEEK_SET  0
  34. #define SEEK_CUR  1
  35. #define SEEK_END  2
  36. #endif
  37.  
  38. constants* constant_pool;
  39.  
  40. void
  41. readClass(classFile* fp)
  42. {
  43.     u2 minor_version;
  44.     u2 major_version;
  45.     u4 magic;
  46.     u2 access_flags;
  47.     u2 this_class;
  48.     u2 super_class;
  49.     classes* classThis;
  50.     constants* savepool = constant_pool;
  51.  
  52.     /* Read in class info */
  53.     readu4(&magic, fp);
  54.     if (magic != JAVAMAGIC) {
  55.         fprintf(stderr, "Bad magic %x in class\n", magic);
  56.         exit(1);
  57.     }
  58.     readu2(&minor_version, fp);
  59.     readu2(&major_version, fp);
  60.  
  61. DBG(    printf("major=%d, minor=%d\n", major_version, minor_version);    )
  62.  
  63.     if (major_version != MAJOR_VERSION) {
  64.         fprintf(stderr, "Warning: Major version number mismatch.\n");
  65.     }
  66.     if (minor_version != MINOR_VERSION) {
  67.         fprintf(stderr, "Warning: Minor version number mismatch.\n");
  68.     }
  69.  
  70.     constant_pool = readConstantPool(fp);
  71.     assert(constant_pool != 0);
  72.  
  73.     readu2(&access_flags, fp);
  74.     readu2(&this_class, fp);
  75.     readu2(&super_class, fp);
  76.  
  77. #ifdef ADDCLASS
  78.     ADDCLASS(this_class, super_class, access_flags, constant_pool);
  79. #else
  80.     classThis = 0;
  81. #endif
  82.  
  83.     readInterfaces(fp, classThis);
  84.     readFields(fp, classThis);
  85.     readMethods(fp, classThis);
  86.     readAttributes(fp, classThis, 0);
  87.  
  88.     constant_pool = savepool;
  89. }
  90.  
  91. /*
  92.  * Read in interfaces.
  93.  */
  94. void
  95. readInterfaces(classFile* fp, classes* this)
  96. {
  97.     u2 interfaces_count;
  98.  
  99.     readu2(&interfaces_count, fp);
  100. DBG(    printf("interfaces_count=%d\n", interfaces_count);    )
  101.  
  102. #ifdef READINTERFACES
  103.     READINTERFACES(fp, this, interfaces_count);
  104. #else
  105.     fseek(fp, interfaces_count * 2, SEEK_CUR);
  106. #endif
  107. }
  108.  
  109. /*
  110.  * Read in fields.
  111.  */
  112. void
  113. readFields(classFile* fp, classes* this)
  114. {
  115.     int i;
  116.     u2 fields_count;
  117.  
  118.     readu2(&fields_count, fp);
  119. DBG(    printf("fields_count=%d\n", fields_count);        )
  120.  
  121. #if defined(READFIELD_START)
  122.     READFIELD_START();
  123. #endif
  124.     for (i = 0; i < fields_count; i++) {
  125. #if defined(READFIELD)
  126.         READFIELD(fp, this);
  127. #else
  128.         fseek(fp, 6, SEEK_CUR);
  129. #endif
  130.         readAttributes(fp, this, 0);
  131.     }
  132. #if defined(READFIELD_END)
  133.     READFIELD_END();
  134. #endif
  135. }
  136.  
  137. /*
  138.  * Read in attributes.
  139.  */
  140. void
  141. readAttributes(classFile* fp, classes* this, methods* methodThis)
  142. {
  143.     int i;
  144.     u2 cnt;
  145.  
  146.     readu2(&cnt, fp);
  147. DBG(    printf("attributes_count=%d\n", cnt);                )
  148.  
  149.     /* Skip attributes for the moment */
  150.     for (i = 0; i < cnt; i++) {
  151. #ifdef READATTRIBUTE
  152.         READATTRIBUTE(fp, this, methodThis);
  153. #else
  154.         u2 idx;
  155.         u4 len;
  156.         readu2(&idx, fp);
  157.         readu4(&len, fp);
  158.         fseek(fp, len, SEEK_CUR);
  159. #endif
  160.     }
  161. }
  162.  
  163. /*
  164.  * Read in methods.
  165.  */
  166. void
  167. readMethods(classFile* fp, classes* this)
  168. {
  169.     int i;
  170.     u2 methods_count;
  171.     methods* methodThis;
  172.  
  173.     readu2(&methods_count, fp);
  174. DBG(    printf("methods_count=%d\n", methods_count);        )
  175.     methodThis = 0;
  176.  
  177. #ifdef READMETHOD_START
  178.     READMETHOD_START();
  179. #endif
  180.     for (i = 0; i < methods_count; i++) {
  181. #ifdef READMETHOD
  182.         READMETHOD(fp, this);
  183. #else
  184.         fseek(fp, 6, SEEK_CUR);
  185. #endif
  186.         readAttributes(fp, this, methodThis);
  187.     }
  188. #ifdef READMETHOD_END
  189.     READMETHOD_END();
  190. #endif
  191. }
  192.