R_object_helper.h 2.99 KB
Newer Older
Guolin Ke's avatar
Guolin Ke committed
1
/*
2
* A simple wrapper for accessing data in R object.
Guolin Ke's avatar
Guolin Ke committed
3
* Due to license issue, we cannot include R's header file, so use this simple wrapper instead.
4
* However, if R changes the way it defines objects, this file will need to be updated as well.
Guolin Ke's avatar
Guolin Ke committed
5
6
7
8
9
10
11
*/
#ifndef R_OBJECT_HELPER_H_
#define R_OBJECT_HELPER_H_

#include <cstdint>

#define TYPE_BITS 5
Guolin Ke's avatar
Guolin Ke committed
12
struct lgbm_sxpinfo {
Guolin Ke's avatar
Guolin Ke committed
13
14
15
16
17
18
19
20
21
22
23
24
  unsigned int type : 5;
  unsigned int obj : 1;
  unsigned int named : 2;
  unsigned int gp : 16;
  unsigned int mark : 1;
  unsigned int debug : 1;
  unsigned int trace : 1;
  unsigned int spare : 1;
  unsigned int gcgen : 1;
  unsigned int gccls : 3;
};

Guolin Ke's avatar
Guolin Ke committed
25
struct lgbm_primsxp {
Guolin Ke's avatar
Guolin Ke committed
26
27
28
  int offset;
};

Guolin Ke's avatar
Guolin Ke committed
29
30
31
32
struct lgbm_symsxp {
  struct LGBM_SER *pname;
  struct LGBM_SER *value;
  struct LGBM_SER *internal;
Guolin Ke's avatar
Guolin Ke committed
33
34
};

Guolin Ke's avatar
Guolin Ke committed
35
36
37
38
struct lgbm_listsxp {
  struct LGBM_SER *carval;
  struct LGBM_SER *cdrval;
  struct LGBM_SER *tagval;
Guolin Ke's avatar
Guolin Ke committed
39
40
};

Guolin Ke's avatar
Guolin Ke committed
41
42
43
44
struct lgbm_envsxp {
  struct LGBM_SER *frame;
  struct LGBM_SER *enclos;
  struct LGBM_SER *hashtab;
Guolin Ke's avatar
Guolin Ke committed
45
46
};

Guolin Ke's avatar
Guolin Ke committed
47
48
49
50
struct lgbm_closxp {
  struct LGBM_SER *formals;
  struct LGBM_SER *body;
  struct LGBM_SER *env;
Guolin Ke's avatar
Guolin Ke committed
51
52
};

Guolin Ke's avatar
Guolin Ke committed
53
54
55
56
struct lgbm_promsxp {
  struct LGBM_SER *value;
  struct LGBM_SER *expr;
  struct LGBM_SER *env;
Guolin Ke's avatar
Guolin Ke committed
57
58
};

Guolin Ke's avatar
Guolin Ke committed
59
60
61
62
typedef struct LGBM_SER {
  struct lgbm_sxpinfo sxpinfo;
  struct LGBM_SER* attrib;
  struct LGBM_SER* gengc_next_node, *gengc_prev_node;
Guolin Ke's avatar
Guolin Ke committed
63
  union {
Guolin Ke's avatar
Guolin Ke committed
64
65
66
67
68
69
    struct lgbm_primsxp primsxp;
    struct lgbm_symsxp symsxp;
    struct lgbm_listsxp listsxp;
    struct lgbm_envsxp envsxp;
    struct lgbm_closxp closxp;
    struct lgbm_promsxp promsxp;
Guolin Ke's avatar
Guolin Ke committed
70
  } u;
Guolin Ke's avatar
Guolin Ke committed
71
} LGBM_SER, *LGBM_SE;
Guolin Ke's avatar
Guolin Ke committed
72

Guolin Ke's avatar
Guolin Ke committed
73
struct lgbm_vecsxp {
Guolin Ke's avatar
Guolin Ke committed
74
75
76
77
  int length;
  int truelength;
};

Guolin Ke's avatar
Guolin Ke committed
78
79
80
81
82
83
typedef struct VECTOR_SER {
  struct lgbm_sxpinfo sxpinfo;
  struct LGBM_SER* attrib;
  struct LGBM_SER* gengc_next_node, *gengc_prev_node;
  struct lgbm_vecsxp vecsxp;
} VECTOR_SER, *VECSE;
Guolin Ke's avatar
Guolin Ke committed
84

Guolin Ke's avatar
Guolin Ke committed
85
typedef union { VECTOR_SER s; double align; } SEXPREC_ALIGN;
Guolin Ke's avatar
Guolin Ke committed
86
87
88
89
90
91
92
93
94
95
96

#define DATAPTR(x)  (((SEXPREC_ALIGN *) (x)) + 1)

#define R_CHAR_PTR(x)     ((char *) DATAPTR(x))

#define R_INT_PTR(x)  ((int *) DATAPTR(x))

#define R_REAL_PTR(x)     ((double *) DATAPTR(x))

#define R_AS_INT(x) (*((int *) DATAPTR(x)))

Guolin Ke's avatar
Guolin Ke committed
97
#define R_IS_NULL(x) ((*(LGBM_SE)(x)).sxpinfo.type == 0)
Guolin Ke's avatar
Guolin Ke committed
98
99
100
101
102
103
104


// 64bit pointer
#if INTPTR_MAX == INT64_MAX

#define R_ADDR(x)  ((int64_t *) DATAPTR(x))

Guolin Ke's avatar
Guolin Ke committed
105
inline void R_SET_PTR(LGBM_SE x, void* ptr) {
Guolin Ke's avatar
Guolin Ke committed
106
107
108
109
110
111
112
  if (ptr == nullptr) {
    R_ADDR(x)[0] = (int64_t)(NULL);
  } else {
    R_ADDR(x)[0] = (int64_t)(ptr);
  }
}

Guolin Ke's avatar
Guolin Ke committed
113
inline void* R_GET_PTR(LGBM_SE x) {
Guolin Ke's avatar
Guolin Ke committed
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  if (R_IS_NULL(x)) {
    return nullptr;
  } else {
    auto ret = (void *)(R_ADDR(x)[0]);
    if (ret == NULL) {
      ret = nullptr;
    }
    return ret;
  }
}

#else

#define R_ADDR(x)  ((int32_t *) DATAPTR(x))

Guolin Ke's avatar
Guolin Ke committed
129
inline void R_SET_PTR(LGBM_SE x, void* ptr) {
Guolin Ke's avatar
Guolin Ke committed
130
131
132
133
134
135
136
  if (ptr == nullptr) {
    R_ADDR(x)[0] = (int32_t)(NULL);
  } else {
    R_ADDR(x)[0] = (int32_t)(ptr);
  }
}

Guolin Ke's avatar
Guolin Ke committed
137
inline void* R_GET_PTR(LGBM_SE x) {
Guolin Ke's avatar
Guolin Ke committed
138
139
140
141
142
143
144
145
146
147
148
149
150
151
  if (R_IS_NULL(x)) {
    return nullptr;
  } else {
    auto ret = (void *)(R_ADDR(x)[0]);
    if (ret == NULL) {
      ret = nullptr;
    }
    return ret;
  }
}

#endif

#endif // R_OBJECT_HELPER_H_