summaryrefslogtreecommitdiff
path: root/ir.c
blob: e5a5aa8283c3db3d70c0b018ab75b1737381ba76 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "common.h"
#include "ir.h"

wasm_value_t parse_wasm_value(char* str) {
  int len = strlen(str);
  if (len > 0) {
    if (str[len - 1] == 'd' || str[len - 1] == 'D') {
      // treat the input as a double
      char* end = NULL;
      double result = strtod(str, &end);
      if (end == (str + len - 1))
        return wasm_f64_value(result);
    } else {
      // treat the input as an integer
      char* end = NULL;
      int base = 10;
      if (len >= 2 && (str[1] == 'x' || str[1] == 'X'))
        base = 16;
      long result = strtol(str, &end, base);
      if (end == (str + len))
        return wasm_i32_value(result);
    }
  }
  wasm_value_t orig_string = {
      .val.ref = str,
  };
  return orig_string;
}

void print_wasm_value(wasm_typed_value_t val) {
  switch (val.tag) {
    case I32:
      printf("%d", val.val.val.i32);
      break;
    case F64:
      printf("%lf", val.val.val.f64);
      break;
    case EXTERNREF:
      if (val.val.val.ref == NULL)
        printf("null");
      else
        printf("%p", val.val.val.ref);
      break;
  }
}

void trace_wasm_value(wasm_typed_value_t val) {
  switch (val.tag) {
    case I32:
      TRACE("%d", val.val.val.i32);
      break;
    case F64:
      TRACE("%lf", val.val.val.f64);
      break;
    case EXTERNREF:
      if (val.val.val.ref == NULL)
        printf("null");
      else
        TRACE("%p", val.val.val.ref);
      break;
  }
}

wasm_value_t wasm_i32_value(int32_t val) {
  wasm_value_t r = {
      .val.i32 = val,
  };
  return r;
}

wasm_value_t wasm_f64_value(double val) {
  wasm_value_t r = {
      .val.f64 = val,
  };
  return r;
}

wasm_value_t wasm_ref_value(void* val) {
  wasm_value_t r = {
      .val.ref = val,
  };
  return r;
}