1/*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2020-2020. All rights reserved.
3 * Description: add ref tracker.
4 * Create: 2020/11/20
5 */
6
7#ifndef EXT_TRACKER_H
8#define EXT_TRACKER_H
9
10#if defined(JERRY_REF_TRACKER)
11
12#include "jcontext.h"
13
14typedef struct {
15  size_t size;
16  size_t* data;
17} Storage;
18
19typedef enum {
20  kObjectRefInfo = 0,
21  kStringRefInfo = 1
22} StorageType;
23
24typedef enum {
25  kRefNative = 1 << 0,
26  kRefInit = 1 << 1,
27  kRefRef = 1 << 2,
28  kRefDeref = 1 << 3,
29  kRefMark = 1 << 4,
30  kRefUnmark = 1 << 5
31} RefInfoItemFlags;
32
33typedef struct IStorageItem_s {
34  struct IStorageItem_s* next;
35} IStorageItem;
36
37typedef struct RefInfoItem_s {
38  struct RefInfoItem_s* next;
39  char* stacktrace;
40  RefInfoItemFlags flags;
41} RefInfoItem; // Implements IStorageItem.
42
43// Deleter.
44void RefInfoResetFn(IStorageItem* item);
45
46#define ECMA_OBJECT_TO_STORAGE_KEY(x) (size_t)((uintptr_t)x - (uintptr_t)&JERRY_HEAP_CONTEXT(first))
47#define ECMA_OBJECT_FROM_STORAGE_KEY(x) (ecma_object_t*)((uintptr_t)x + (uintptr_t)&JERRY_HEAP_CONTEXT(first))
48
49bool GetRefTrackerEnabled(void);
50void SetRefTrackerEnabled(bool flag);
51
52void LogTrackerInit(const char* filepath);
53void LogTrackerClose(void);
54
55void InitTracker(void);
56void StorageInit(Storage* storage, size_t size);
57void StoragePut(Storage* storage, size_t key, size_t value);
58size_t StorageGet(Storage* storage, size_t key);
59void StorageReset(Storage* storage, size_t key, void(*reset_fn)(IStorageItem*));
60char* GetStacktraceString(ecma_string_t* stack);
61RefInfoItem* CreateRefInfoItem(RefInfoItemFlags flags, char* stack_str);
62void ReportObjRefManip(ecma_object_t* obj, RefInfoItemFlags flags);
63void ReportObjDelete(ecma_object_t* obj);
64void DumpTracker(void);
65
66#endif
67#endif
68