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 / code.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  87 lines

  1. /*
  2.  * code.c
  3.  * Process a new code attribute.
  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 <stdio.h>
  17. #include <stdlib.h>
  18. #include <assert.h>
  19. #include <string.h>
  20. #include "gtypes.h"
  21. #include "file.h"
  22. #include "errors.h"
  23. #include "bytecode.h"
  24. #include "code.h"
  25. #include "access.h"
  26. #include "object.h"
  27. #include "constants.h"
  28. #include "classMethod.h"
  29. #include "readClass.h"
  30. #include "slots.h"
  31. #include "exception.h"
  32.  
  33. void
  34. addCode(methods* m, uint32 len, classFile* fp)
  35. {
  36.     Code c;
  37.     int i;
  38.     u2 i2;
  39.  
  40.     readu2(&c.max_stack, fp);
  41.     readu2(&c.max_locals, fp);
  42.     readu4(&c.code_length, fp);
  43. DBG(    printf("Max stack = %d\n", c.max_stack);    )
  44. DBG(    printf("Max locals = %d\n", c.max_locals);    )
  45. DBG(    printf("Code length = %d\n", c.code_length);    )
  46.     if (c.code_length > 0) {
  47.         c.code = malloc(c.code_length);
  48.         if (c.code == 0) {
  49.                         throwException(OutOfMemoryError);
  50.         }
  51.         readm(c.code, c.code_length, sizeof(bytecode), fp);
  52.     }
  53.     else {
  54.         c.code = 0;
  55.     }
  56.     readu2(&c.exception_table_length, fp);
  57. DBG(    printf("Exception table length = %d\n", c.exception_table_length);    )
  58.     if (c.exception_table_length > 0) {
  59.         c.exception_table = malloc(c.exception_table_length * sizeof(jexception));
  60.         if (c.exception_table == 0) {
  61.                         throwException(OutOfMemoryError);
  62.         }
  63.         for (i = 0; i < c.exception_table_length; i++) {
  64.             readu2(&i2, fp);
  65.             c.exception_table[i].start_pc = i2;
  66.             readu2(&i2, fp);
  67.             c.exception_table[i].end_pc = i2;
  68.             readu2(&i2, fp);
  69.             c.exception_table[i].handler_pc = i2;
  70.             readu2(&i2, fp);
  71.             if (i2 == 0) {
  72.                 c.exception_table[i].catch_type = 0;
  73.             }
  74.             else {
  75.                 assert(m->constants->tags[i2] == CONSTANT_Class);
  76.                 c.exception_table[i].catch_type = m->constants->data[CLASS_NAME(i2, m->constants)].v.tstr;
  77.             }
  78.         }
  79.     }
  80.     else {
  81.         c.exception_table = 0;
  82.     }
  83.     addMethodCode(m, &c);
  84.  
  85.     readAttributes(fp, m->class, m);
  86. }
  87.