memory.c 1.4 KB

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