Skip to content

Design primitive layout

Yonggang Luo edited this page Nov 28, 2024 · 19 revisions

#include <assert.h> #include <stdint.h>

#ifndef JERRY_CPOINTER_32_BIT #define JERRY_CPOINTER_32_BIT 0 #endif

#if JERRY_CPOINTER_32_BIT typedef uint32_t lit_string_hash_t; typedef uint32_t ecma_ref_t; #else typedef uint16_t lit_string_hash_t; typedef uint16_t ecma_ref_t; #endif

typedef struct { #if JERRY_CPOINTER_32_BIT ecma_ref_t type : 2; ecma_ref_t ascii : 1; ecma_ref_t refs : 29; #else ecma_ref_t type : 2; ecma_ref_t ascii : 1; ecma_ref_t refs : 13; #endif } ecma_string_t;

#if JERRY_CPOINTER_32_BIT static_assert (sizeof (ecma_string_t) == 4, ""); #else static_assert (sizeof (ecma_string_t) == 2, ""); #endif

#if JERRY_CPOINTER_32_BIT #define ECMA_STRING_CONTAINER_SIZE8_LIMIT 3 #else #define ECMA_STRING_CONTAINER_SIZE8_LIMIT 5 #endif

typedef enum { ECMA_STRING_CONTAINER_SIZE8, /* 0 <= size < ECMA_STRING_CONTAINER_SIZE8_LIMIT, ASCII/UTF16 string, actual data is on the heap / ECMA_STRING_CONTAINER_SIZE16, / ECMA_STRING_CONTAINER_SIZE8_LIMIT <= size < 2^16, ASCII/UTF16 string, actual data is on the heap / ECMA_STRING_CONTAINER_SIZE32, / < 2^16 <= size < 2^32, ASCII/UTF16 string, actual data is on the heap */ ECMA_STRING_CONTAINER_EXTERNAL, /**< any size, ASCII/UTF16 string, actual data is allocated by external */ } ecma_string_container_t;

typedef struct { /** type : 2 bit : ecma_string_container_t ascii : 1 bit : 1 means narrow string refs : 13 / 29 bit (max 8190 / 536870910) / ecma_string_t base; union { lit_string_hash_t hash; struct { #if JERRY_CPOINTER_32_BIT / The size,str[0..2] is hash / uint8_t size; uint8_t str[ECMA_STRING_CONTAINER_SIZE8_LIMIT]; #else / The size,hash,str[0..0] plus hash is hash / uint8_t size : 3; uint8_t hash : 5; uint8_t str[ECMA_STRING_CONTAINER_SIZE8_LIMIT]; #endif } ascii; struct { / The content of str[0..1] or str[0..0] is hash / / size always be 1 */ uint16_t str[2]; } utf16; } u; } ecma_string_size8_t; static_assert (sizeof (ecma_string_size8_t) == 8, "");

typedef struct { ecma_string_t header; lit_string_hash_t hash;

uint16_t size; /**

  • Actual data of it's place in container (depending on 'ecma_string_container_t' field) */ union { #if JERRY_CPOINTER_32_BIT uint8_t ascii[6]; uint16_t utf16[3]; #else uint8_t ascii[10]; uint16_t utf16[5]; #endif } u; } ecma_string_size16_t; static_assert (sizeof (ecma_string_size16_t) == 16, "");

typedef struct { ecma_string_t header; lit_string_hash_t hash;

uint32_t size; /**

  • Actual data of it's place in container (depending on 'container' field) */ union { #if JERRY_CPOINTER_32_BIT uint8_t ascii[4]; uint16_t utf16[2]; #else uint8_t ascii[8]; uint16_t utf16[4]; #endif } u; } ecma_string_size32_t; static_assert (sizeof (ecma_string_size32_t) == 16, "");

typedef struct { union { uint8_t *ascii; uint16_t *wide; } u; void *user_p; /**< user pointer passed to the callback when the string is freed */ } ecma_external_string_body_t;

typedef struct { ecma_string_t header; lit_string_hash_t hash; #if (UINTPTR_MAX > UINT32_MAX) || JERRY_CPOINTER_32_BIT uint64_t size; #else uint32_t size; #endif ecma_external_string_body_t body; } ecma_external_string_t;

#if UINTPTR_MAX > UINT32_MAX static_assert (sizeof (ecma_external_string_t) == 32, ""); #elif JERRY_CPOINTER_32_BIT static_assert (sizeof (ecma_external_string_t) == 24, ""); #else static_assert (sizeof (ecma_external_string_t) == 16, ""); #endif

typedef struct { void *origin; uint8_t *str; uint32_t len; } ecma_string_tracked_utf8_t;

typedef struct { void *origin; uint8_t *str; uint32_t len; } ecma_string_tracked_cesu8_t;

typedef struct { void *origin; uint16_t *str; uint32_t len; } ecma_string_tracked_utf16_t;

typedef enum { ECMA_ATOM_TYPE_SYMBOL, ECMA_ATOM_TYPE_GLOBAL_SYMBOL, ECMA_ATOM_TYPE_STRING, ECMA_ATOM_TYPE_PRIVATE } ecma_atom_type_t;

typedef uint32_t ecma_atom_value_t;

typedef union { struct { uint32_t padding : 31; uint32_t is_string : 1; } header; struct { uint32_t value : 31; uint32_t is_string : 1; } i; struct { uint32_t index : 29; uint32_t type : 2; /* ecma_atom_type_t */ uint32_t is_string : 1; } s; ecma_atom_value_t value; } ecma_atom_t;

static_assert (sizeof (ecma_atom_t) == 4, ""); static_assert (sizeof (ecma_atom_t) == sizeof (ecma_atom_value_t), "");

Clone this wiki locally