[coco] Manage Def in Object (#1532)
author박종현/동작제어Lab(SR)/Staff Engineer/삼성전자 <jh1302.park@samsung.com>
Tue, 18 Sep 2018 10:28:45 +0000 (19:28 +0900)
committerGitHub Enterprise <noreply-CODE@samsung.com>
Tue, 18 Sep 2018 10:28:45 +0000 (19:28 +0900)
* [coco] Manage Def in Object

This commit moves Def field and related methods from ObjectInfo into
Object.

Signed-off-by: Jonghyun Park <jh1302.park@samsung.com>
* Update comment

contrib/coco/core/include/coco/IR/Object.h
contrib/coco/core/include/coco/IR/ObjectInfo.h
contrib/coco/core/src/IR/Def.cpp
contrib/coco/core/src/IR/Object.cpp
contrib/coco/core/src/IR/ObjectInfo.cpp
contrib/coco/core/src/IR/ObjectInfo.test.cpp

index 14375d0..9f7a7f9 100644 (file)
@@ -71,7 +71,14 @@ public:
   const ConsumerSet *user(void) const;
 
 private:
+  // @brief Update the link to a producer
+  //
+  // WARN Only Def class is allowed to access this method
+  void def(Def *d);
+
+private:
   Dep _dep;
+  Def *_def = nullptr;
 };
 
 // @brief Return the producer of a given object if it exists
index fc56f7a..92f475c 100644 (file)
@@ -17,10 +17,6 @@ public:
   virtual ~ObjectInfo() = default;
 
 public:
-  Def *def(void) const { return _def; }
-  void def(Def *d);
-
-public:
   Object::ConsumerSet *user(void) { return &_user; }
   const Object::ConsumerSet *user(void) const { return &_user; }
 
index b93ffca..769f4cd 100644 (file)
@@ -1,5 +1,4 @@
 #include "coco/IR/Def.h"
-#include "coco/IR/ObjectInfo.h"
 
 #include <cassert>
 
@@ -10,10 +9,7 @@ void Def::value(Object *value)
 {
   if (_value)
   {
-    auto info = _value->info();
-    assert(info != nullptr);
-    info->def(nullptr);
-
+    _value->def(nullptr);
     _value = nullptr;
   }
 
@@ -22,10 +18,7 @@ void Def::value(Object *value)
   if (value)
   {
     _value = value;
-
-    auto info = _value->info();
-    assert(info != nullptr);
-    info->def(this);
+    _value->def(this);
   }
 
   assert(_value == value);
index 90ca4a5..7caae41 100644 (file)
@@ -21,7 +21,25 @@ ObjectInfo *Object::info(void) const
   return res;
 }
 
-Def *Object::def(void) const { return info()->def(); }
+Def *Object::def(void) const { return _def; }
+
+void Object::def(Def *d)
+{
+  // This assert enforces users to explicitly reset def before update.
+  //
+  // Let's consider an object o with def d0.
+  //
+  // The following code is allowed:
+  // o->def(nullptr);
+  // o->def(d1);
+  //
+  // However, the following code is not allowed:
+  // o->def(d1);
+  //
+  assert((_def == nullptr) || (d == nullptr));
+  _def = d;
+}
+
 const UseSet *Object::uses(void) const { return info()->uses(); }
 
 const Object::ConsumerSet *Object::user(void) const { return info()->user(); }
index faace4b..adee9ab 100644 (file)
@@ -5,11 +5,4 @@
 namespace coco
 {
 
-void ObjectInfo::def(Def *d)
-{
-  // This assert ensures that object cannot have multiple def.
-  assert((_def == nullptr) || (d == nullptr));
-  _def = d;
-}
-
 } // namespace coco
index e6ff373..97b46b2 100644 (file)
@@ -13,6 +13,5 @@ TEST_F(ObjectInfoTest, constructor)
 {
   coco::ObjectInfo info;
 
-  ASSERT_EQ(info.def(), nullptr);
   ASSERT_EQ(info.user()->size(), 0);
 }