Harden how the compiler references GC objects
[WebKit.git] / Source / JavaScriptCore / dfg / DFGOpInfo.h
index 57f3329..ddccfb1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2017 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -25,6 +25,8 @@
 
 #pragma once
 
+#include "DFGRegisteredStructure.h"
+#include "HeapCell.h"
 #include <wtf/StdLibExtras.h>
 
 #if ENABLE(DFG_JIT)
@@ -42,8 +44,17 @@ struct OpInfo {
 #if OS(DARWIN)
     explicit OpInfo(uintptr_t value) : m_value(static_cast<uint64_t>(value)) { }
 #endif
-    explicit OpInfo(void* value) : m_value(static_cast<uint64_t>(reinterpret_cast<uintptr_t>(value))) { }
-    explicit OpInfo(const void* value) : m_value(static_cast<uint64_t>(reinterpret_cast<uintptr_t>(value))) { }
+    explicit OpInfo(RegisteredStructure structure) : m_value(static_cast<uint64_t>(bitwise_cast<uintptr_t>(structure))) { }
+
+
+    template <typename T>
+    explicit OpInfo(T* ptr)
+    {
+        static_assert(!std::is_base_of<HeapCell, T>::value, "To make an OpInfo with a cell in it, the cell must be registered or frozen.");
+        static_assert(!std::is_base_of<StructureSet, T>::value, "To make an OpInfo with a structure set in, make sure to use RegisteredStructureSet.");
+        m_value = static_cast<uint64_t>(reinterpret_cast<uintptr_t>(ptr));
+    }
+
     uint64_t m_value;
 };