dvander@18: /* dvander@18: * Copyright (C) 2012 David Anderson dvander@18: * dvander@18: * This file is part of JITCraft. dvander@18: * dvander@18: * JITCraft is free software: you can redistribute it and/or modify it under dvander@18: * the terms of the GNU General Public License as published by the Free dvander@18: * Software Foundation, either version 3 of the License, or (at your option) dvander@18: * any later version. dvander@18: * dvander@18: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@18: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@18: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@18: * dvander@18: * You should have received a copy of the GNU General Public License along with dvander@18: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@18: */ dvander@18: #ifndef _include_jitcraft_reference_h_ dvander@18: #define _include_jitcraft_reference_h_ dvander@18: dvander@18: #include "Heap.h" dvander@18: #include "Barriers.h" dvander@18: #include "Stack.h" dvander@18: dvander@59: namespace ke { dvander@18: dvander@18: class Array; dvander@164: class Struct; dvander@18: dvander@18: // A Reference is a typed pointer to another location in memory. dvander@18: class Reference : public Object dvander@18: { dvander@18: void *location_; dvander@164: Barriered base_; dvander@164: dvander@164: // We do not compute references to objects, so this does not need to be dvander@164: // traced. dvander@18: LocalSlot slot_; dvander@18: dvander@18: public: dvander@18: static Reference *NewStack(Zone *zone, void *location, Heap::Tenure tenure = Heap::Tenure_Default); dvander@18: static Reference *NewStack(Zone *zone, const LocalSlot &slot, Heap::Tenure tenure = Heap::Tenure_Default); dvander@18: dvander@18: int getInt() { dvander@18: return *reinterpret_cast(location_); dvander@18: } dvander@18: void setInt(int i) { dvander@18: *reinterpret_cast(location_) = i; dvander@18: } dvander@18: float getFloat() { dvander@18: return *reinterpret_cast(location_); dvander@18: } dvander@18: void setFloat(float f) { dvander@18: *reinterpret_cast(location_) = f; dvander@18: } dvander@18: dvander@68: // WARNING! This should only be for Native calls. dvander@68: void *location() { dvander@68: return location_; dvander@68: } dvander@68: dvander@44: // Begin GC Descriptor. dvander@44: static inline size_t offsetOfBase() { dvander@44: return offsetof(Reference, base_); dvander@44: } dvander@44: // End GC Descriptor. dvander@44: dvander@18: static inline Reference *cast(Object *obj) { dvander@39: assert(!obj || obj->is(MapKind_Reference)); dvander@18: return reinterpret_cast(obj); dvander@18: } dvander@18: }; dvander@18: dvander@18: } dvander@18: dvander@18: #endif // _include_jitcraft_reference_h_