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

这种说法以偏概全
根底数据类型按值拜访,援用数据类型按援用拜访
反例:string个别是援用拜访

js变量

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

//存取形式
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); 
            ...

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理