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

  1. /*
  2.  * object.c
  3.  * Handle create and subsequent garbage collection of objects.
  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. #include <stdio.h>
  15. #include <assert.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include "gtypes.h"
  19. #include "itypes.h"
  20. #include "access.h"
  21. #include "object.h"
  22. #include "constants.h"
  23. #include "classMethod.h"
  24. #include "baseClasses.h"
  25. #include "errors.h"
  26. #include "exception.h"
  27. #include "gc.h"
  28.  
  29. extern struct itypes types[];
  30.  
  31. /*
  32.  * Create a new array of data items (not objects).
  33.  */
  34. object*
  35. alloc_array(int sz, int type)
  36. {
  37.     object* obj;
  38.     classes* class;
  39.  
  40.     assert(type < MAXTYPES);
  41.     assert(TYPE_SIZE(type) != 0);
  42.  
  43.     class = lookupArray(TYPE_ARRAYSIG(type));
  44.  
  45.     /* Allocate new object - we add an extra jint of space to avoid
  46.      * any possible page faults when accessing the last elements
  47.      */
  48.     obj = newObject(sz*TYPE_SIZE(type)+sizeof(jint), class, sz, false);
  49.     return (obj);
  50. }
  51.  
  52. /*
  53.  * Create a new array of objects.
  54.  */
  55. object*
  56. alloc_objectarray(int sz, char* csig)
  57. {
  58.     char sig[CLASSMAXSIG];
  59.     object* obj;
  60.     classes* class;
  61.  
  62.     /* Build signature for array type */
  63.     strcpy(sig, "[");
  64.     strcat(sig, csig);
  65.  
  66.     class = lookupArray(addString(sig));
  67.  
  68.     /* Allocate new array of objects - we add an extra jint of space to
  69.      * avoid any possible page faults when accessing the last elements
  70.      */
  71.     obj = (object*)newObject(sz * TYPE_SIZE_C(csig[0]) + sizeof(jint), class, sz, false);
  72.     return (obj);
  73. }
  74.  
  75. /*
  76.  * Build a multi-dimensional array.
  77.  */
  78. object*
  79. alloc_multiarray(int* dims, char* cname)
  80. {
  81.     object* obj;
  82.     object** array;
  83.     int i;
  84.  
  85.     obj = alloc_objectarray(dims[0], cname+1);
  86.     if (dims[1] > 0) {
  87.         array = (object**)(obj+1);
  88.         for (i = 0; i < dims[0]; i++) {
  89.             array[i] = alloc_multiarray(dims+1, cname+1);
  90.         }
  91.     }
  92.  
  93.     return (obj);
  94. }
  95.