从QuickJS的JSValue了解变量存取方式

这种说法以偏概全
基础数据类型按值访问,引用数据类型按引用访问
反例:string通常是引用访问指针

js变量

不一样数据类型用不一样的存取方式,具体实现看js解释器是怎么设定的code

//存取方式
typedef union JSValueUnion {
    int32_t int32;
    double float64;
    void *ptr;
} JSValueUnion;

//数据类型
enum {
    /* all tags with a reference count are negative */
    JS_TAG_FIRST       = -11, /* first negative tag */
    JS_TAG_BIG_DECIMAL = -11,
    JS_TAG_BIG_INT     = -10,
    JS_TAG_BIG_FLOAT   = -9,
    JS_TAG_SYMBOL      = -8,
    JS_TAG_STRING      = -7,
    JS_TAG_MODULE      = -3, /* used internally */
    JS_TAG_FUNCTION_BYTECODE = -2, /* used internally */
    JS_TAG_OBJECT      = -1,

    JS_TAG_INT         = 0,
    JS_TAG_BOOL        = 1,
    JS_TAG_NULL        = 2,
    JS_TAG_UNDEFINED   = 3,
    JS_TAG_UNINITIALIZED = 4,
    JS_TAG_CATCH_OFFSET = 5,
    JS_TAG_EXCEPTION   = 6,
    JS_TAG_FLOAT64     = 7,
    /* any larger tag is FLOAT64 if JS_NAN_BOXING */
};

//js变量
typedef struct JSValue {
    JSValueUnion u;
    int64_t tag;
} JSValue;

以boolean为例

#define JS_VALUE_GET_INT(v) ((v).u.int32)

//若是tag是boolean就用int32读取
switch(tag) {
    case JS_TAG_BOOL:res = JS_VALUE_GET_INT(val);    
    ...

以string为例

#define JS_VALUE_GET_PTR(v) ((v).u.ptr)

#define JS_VALUE_GET_STRING(v) ((JSString *)JS_VALUE_GET_PTR(v))

//若是tag是string就用指针读取
switch(tag) {
    case JS_TAG_STRING:
        {
            JSString *p = JS_VALUE_GET_STRING(v); 
            ...
相关文章
相关标签/搜索