#ifndef _DPAS_SEMANTICS_H
#define _DPAS_SEMANTICS_H
#ifdef __cplusplus
extern "C" {
#endif
typedef struct
{
int kind__;
jit_type_t type__;
jit_value_t value__;
} dpas_semvalue;
#define DPAS_SEM_LVALUE (1 << 0)
#define DPAS_SEM_RVALUE (1 << 1)
#define DPAS_SEM_TYPE (1 << 2)
#define DPAS_SEM_PROCEDURE (1 << 3)
#define DPAS_SEM_ERROR (1 << 4)
#define DPAS_SEM_RETURN (1 << 5)
#define DPAS_SEM_LVALUE_EA (1 << 6)
#define DPAS_SEM_VOID (1 << 7)
#define DPAS_SEM_BUILTIN (1 << 8)
#define dpas_sem_set_lvalue(sem,type,value) \
do { \
(sem).kind__ = DPAS_SEM_LVALUE | DPAS_SEM_RVALUE; \
(sem).type__ = (type); \
if(!(value)) \
{ \
dpas_out_of_memory(); \
} \
(sem).value__ = (value); \
} while (0)
#define dpas_sem_set_lvalue_ea(sem,type,value) \
do { \
(sem).kind__ = DPAS_SEM_LVALUE_EA | DPAS_SEM_RVALUE; \
(sem).type__ = (type); \
if(!(value)) \
{ \
dpas_out_of_memory(); \
} \
(sem).value__ = (value); \
} while (0)
#define dpas_sem_set_rvalue(sem,type,value) \
do { \
(sem).kind__ = DPAS_SEM_RVALUE; \
(sem).type__ = (type); \
if(!(value)) \
{ \
dpas_out_of_memory(); \
} \
(sem).value__ = (value); \
} while (0)
#define dpas_sem_set_type(sem,type) \
do { \
(sem).kind__ = DPAS_SEM_TYPE; \
(sem).type__ = (type); \
(sem).value__ = 0; \
} while (0)
#define dpas_sem_set_procedure(sem,type,item) \
do { \
(sem).kind__ = DPAS_SEM_PROCEDURE; \
(sem).type__ = (type); \
(sem).value__ = (jit_value_t)(item); \
} while (0)
#define dpas_sem_set_error(sem) \
do { \
(sem).kind__ = DPAS_SEM_ERROR; \
(sem).type__ = 0; \
(sem).value__ = 0; \
} while (0)
#define dpas_sem_set_return(sem,type) \
do { \
(sem).kind__ = DPAS_SEM_RETURN; \
(sem).type__ = (type); \
(sem).value__ = 0; \
} while (0)
#define dpas_sem_set_void(sem) \
do { \
(sem).kind__ = DPAS_SEM_VOID; \
(sem).type__ = jit_type_void; \
(sem).value__ = 0; \
} while (0)
#define dpas_sem_set_builtin(sem,value) \
do { \
(sem).kind__ = DPAS_SEM_BUILTIN; \
(sem).type__ = jit_type_void; \
(sem).value__ = (jit_value_t)(jit_nint)(value); \
} while (0)
#define dpas_sem_is_lvalue(sem) (((sem).kind__ & DPAS_SEM_LVALUE) != 0)
#define dpas_sem_is_lvalue_ea(sem) (((sem).kind__ & DPAS_SEM_LVALUE_EA) != 0)
#define dpas_sem_is_rvalue(sem) (((sem).kind__ & DPAS_SEM_RVALUE) != 0)
#define dpas_sem_is_type(sem) (((sem).kind__ & DPAS_SEM_TYPE) != 0)
#define dpas_sem_is_procedure(sem) (((sem).kind__ & DPAS_SEM_PROCEDURE) != 0)
#define dpas_sem_is_error(sem) (((sem).kind__ & DPAS_SEM_ERROR) != 0)
#define dpas_sem_is_return(sem) (((sem).kind__ & DPAS_SEM_RETURN) != 0)
#define dpas_sem_is_void(sem) (((sem).kind__ & DPAS_SEM_VOID) != 0)
#define dpas_sem_is_builtin(sem) (((sem).kind__ & DPAS_SEM_BUILTIN) != 0)
#define dpas_sem_get_type(sem) ((sem).type__)
#define dpas_sem_get_value(sem) ((sem).value__)
#define dpas_sem_get_procedure(sem) ((dpas_scope_item_t)((sem).value__))
#define dpas_sem_get_builtin(sem) ((int)(jit_nint)((sem).value__))
dpas_semvalue dpas_lvalue_to_rvalue(dpas_semvalue value);
#ifdef __cplusplus
};
#endif
#endif