• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /**
2   * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3   * Licensed under the Apache License, Version 2.0 (the "License");
4   * you may not use this file except in compliance with the License.
5   * You may obtain a copy of the License at
6   *
7   * http://www.apache.org/licenses/LICENSE-2.0
8   *
9   * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  
16  #ifndef PANDA_RUNTIME_HANDLEBASE_H
17  #define PANDA_RUNTIME_HANDLEBASE_H
18  
19  #include "runtime/include/coretypes/tagged_value.h"
20  
21  namespace panda {
22  template <typename T>
23  class EscapeHandleScope;
24  class ManagedThread;
25  
26  /*
27   * HandleBase: A HandleBase provides a reference to an object that survives relocation by the garbage collector.
28   *
29   * HandleScope: Handles are only valid within a HandleScope. When a Basehandle is created for an object a cell is
30   * allocated in the current HandleScope.
31   *
32   * HandleStorage: HandleStorage is the storage structure of the object pointer. GC will use the stored pointer as root
33   * and update the stored value after the object is moved
34   *
35   *  HandleBase ---- HandleStorage -----  heap
36   *    |               |               |
37   * address-----> store: T*  ------> object
38   *
39   *    {
40   *      HandleScope scope2(thread);
41   *      JHandle<T> jhandle(thread, obj4);
42   *      JHandle<T> jhandle(thread, obj5);
43   *      JHandle<T> jhandle(thread, obj6);
44   *      JHandle<T> jhandle(thread, obj7);
45   *    }
46   *
47   *  // out of scope, The obj pointer in node will be free (obj7, obj6, obj5, obj4) and PopTopNode(top_node = prev_node)
48   *
49   *      |        |          |  obj5   |
50   *      |        | scope2-> |  obj4   |
51   *      |        |          |  obj3   |
52   *      |  obj7  |          |  obj2   |
53   *      |__obj6__| scope1-> |__obj1___|
54   *       top_node --------->  prev_node------>nullptr
55   *
56   *  example:
57   *      JSHandle<T> handle;
58   *      {
59   *          HandleScope(thread);
60   *          JSHandle<T> jshandle(thread, T*); // JSHandle extend Handle;
61   *          JHandle<T> jhandle(thread, T*);
62   *          jshandle->method();  // to invoke method of T
63   *          handle = jshandle;
64   *      }
65   *      handle->method(); // error! do not used handle out of scope
66   */
67  class HandleBase {
68  public:
HandleBase()69      HandleBase() : address_(reinterpret_cast<uintptr_t>(nullptr)) {}
70      ~HandleBase() = default;
71      DEFAULT_NOEXCEPT_MOVE_SEMANTIC(HandleBase);
72      DEFAULT_COPY_SEMANTIC(HandleBase);
73  
GetAddress()74      inline uintptr_t GetAddress() const
75      {
76          return address_;
77      }
78  
79      template <typename T>
80      explicit HandleBase(ManagedThread *thread, T value);
81  
82  protected:
HandleBase(uintptr_t addr)83      explicit HandleBase(uintptr_t addr) : address_(addr) {}
84  
85      uintptr_t address_;  // NOLINT(misc-non-private-member-variables-in-classes)
86  
87      template <typename T>
88      friend class EscapeHandleScope;
89  };
90  }  // namespace panda
91  #endif  // PANDA_RUNTIME_HANDLEBASE_H
92