memory.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #include "stdlib.h"
  2. #ifdef IRON_WASM
  3. __attribute__((import_module("imports"), import_name("js_fprintf"))) void js_fprintf(const char *format);
  4. #define HEAP_SIZE 1024 * 1024 * 512
  5. static unsigned char heap[HEAP_SIZE];
  6. static size_t heap_top = 4;
  7. #endif
  8. #ifdef IRON_WASM
  9. __attribute__((export_name("malloc")))
  10. #endif
  11. void *
  12. malloc(size_t size) {
  13. #ifdef IRON_WASM
  14. // Align to 4 bytes to make js typed arrays work
  15. if (size % 4 != 0) {
  16. size += 4 - size % 4;
  17. }
  18. size_t old_top = heap_top;
  19. heap_top += size;
  20. if (heap_top >= HEAP_SIZE) {
  21. js_fprintf("malloc: out of memory");
  22. }
  23. return &heap[old_top];
  24. #endif
  25. return NULL;
  26. }
  27. void *calloc(size_t num, size_t size) {
  28. return NULL;
  29. }
  30. void *alloca(size_t size) {
  31. return NULL;
  32. }
  33. void *realloc(void *mem, size_t size) {
  34. return NULL;
  35. }
  36. void free(void *mem) {}
  37. void *memset(void *ptr, int value, size_t num) {
  38. unsigned char *data = (unsigned char *)ptr;
  39. for (size_t i = 0; i < num; ++i) {
  40. data[i] = (unsigned char)value;
  41. }
  42. return ptr;
  43. }
  44. void *memcpy(void *destination, const void *source, size_t num) {
  45. unsigned char *s = (unsigned char *)source;
  46. unsigned char *d = (unsigned char *)destination;
  47. for (size_t i = 0; i < num; ++i) {
  48. d[i] = s[i];
  49. }
  50. return destination;
  51. }
  52. int memcmp(const void *ptr1, const void *ptr2, size_t num) {
  53. unsigned char *p1 = (unsigned char *)ptr1;
  54. unsigned char *p2 = (unsigned char *)ptr2;
  55. for (size_t i = 0; i < num; ++i) {
  56. if (p1[i] != p2[i]) {
  57. return (int)p1[i] - (int)p2[i];
  58. }
  59. }
  60. return 0;
  61. }