dvander@28: /* dvander@28: * Copyright (C) 2012 David Anderson dvander@28: * dvander@28: * This file is part of JITCraft. dvander@28: * dvander@28: * JITCraft is free software: you can redistribute it and/or modify it under dvander@28: * the terms of the GNU General Public License as published by the Free dvander@28: * Software Foundation, either version 3 of the License, or (at your option) dvander@28: * any later version. dvander@28: * dvander@28: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@28: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@28: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@28: * dvander@28: * You should have received a copy of the GNU General Public License along with dvander@28: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@28: */ dvander@28: #ifndef _include_jitcraft_barriers_h_ dvander@28: #define _include_jitcraft_barriers_h_ dvander@28: dvander@59: namespace ke { dvander@28: dvander@45: class Object; dvander@28: dvander@11: // Used to store unbarriered heap locations. dvander@11: template dvander@11: class Unbarriered dvander@11: { dvander@28: T *obj_; dvander@11: dvander@11: public: dvander@11: Unbarriered() dvander@11: : obj_(NULL) dvander@11: { dvander@11: } dvander@11: dvander@11: T *operator ->() const { dvander@11: return operator *(); dvander@11: } dvander@11: T *operator *() const { dvander@11: return static_cast(obj_); dvander@11: } dvander@11: Unbarriered &operator =(T *obj) { dvander@11: obj_ = obj; dvander@11: return *this; dvander@11: } dvander@45: Object **address() { dvander@45: return reinterpret_cast(&obj_); dvander@11: } dvander@11: operator bool () const { dvander@11: return !!obj_; dvander@11: } dvander@11: operator T*() const { dvander@11: return static_cast(obj_); dvander@11: } dvander@28: }; dvander@28: dvander@13: // Used to store unbarriered heap locations. dvander@13: template dvander@13: class Barriered dvander@13: { dvander@28: T *obj_; dvander@13: dvander@13: public: dvander@13: Barriered() dvander@13: : obj_(NULL) dvander@13: { dvander@13: } dvander@13: dvander@13: T *operator ->() const { dvander@13: return operator *(); dvander@13: } dvander@13: T *operator *() const { dvander@13: return static_cast(obj_); dvander@13: } dvander@13: Barriered &operator =(T *obj) { dvander@13: obj_ = obj; dvander@13: return *this; dvander@13: } dvander@13: Object **addr() { dvander@13: return &obj_; dvander@13: } dvander@13: operator bool () const { dvander@13: return !!obj_; dvander@13: } dvander@13: operator T*() const { dvander@13: return static_cast(obj_); dvander@13: } dvander@28: }; dvander@28: dvander@28: } dvander@28: dvander@28: #endif // _include_jitcraft_barriers_h_