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;
}
|