/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- * * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is SpiderMonkey code. * * The Initial Developer of the Original Code is * Mozilla Corporation. * Portions created by the Initial Developer are Copyright (C) 2010 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Gregor Wagner * * Alternatively, the contents of this file may be used under the terms of * either of the GNU General Public License Version 2 or later (the "GPL"), * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ #ifndef jscell_h___ #define jscell_h___ #include "jspubtd.h" struct JSCompartment; namespace js { namespace gc { struct ArenaHeader; struct Chunk; /* The GC allocation kinds. */ enum AllocKind { FINALIZE_OBJECT0, FINALIZE_OBJECT0_BACKGROUND, FINALIZE_OBJECT2, FINALIZE_OBJECT2_BACKGROUND, FINALIZE_OBJECT4, FINALIZE_OBJECT4_BACKGROUND, FINALIZE_OBJECT8, FINALIZE_OBJECT8_BACKGROUND, FINALIZE_OBJECT12, FINALIZE_OBJECT12_BACKGROUND, FINALIZE_OBJECT16, FINALIZE_OBJECT16_BACKGROUND, FINALIZE_OBJECT_LAST = FINALIZE_OBJECT16_BACKGROUND, FINALIZE_SCRIPT, FINALIZE_SHAPE, FINALIZE_BASE_SHAPE, FINALIZE_TYPE_OBJECT, #if JS_HAS_XML_SUPPORT FINALIZE_XML, #endif FINALIZE_SHORT_STRING, FINALIZE_STRING, FINALIZE_EXTERNAL_STRING, FINALIZE_LAST = FINALIZE_EXTERNAL_STRING }; static const unsigned FINALIZE_LIMIT = FINALIZE_LAST + 1; static const unsigned FINALIZE_OBJECT_LIMIT = FINALIZE_OBJECT_LAST + 1; /* * Live objects are marked black. How many other additional colors are available * depends on the size of the GCThing. Objects marked gray are eligible for * cycle collection. */ static const uint32_t BLACK = 0; static const uint32_t GRAY = 1; /* * A GC cell is the base class for all GC things. */ struct Cell { static const size_t CellShift = 3; static const size_t CellSize = size_t(1) << CellShift; static const size_t CellMask = CellSize - 1; inline uintptr_t address() const; inline ArenaHeader *arenaHeader() const; inline Chunk *chunk() const; inline AllocKind getAllocKind() const; JS_ALWAYS_INLINE bool isMarked(uint32_t color = BLACK) const; JS_ALWAYS_INLINE bool markIfUnmarked(uint32_t color = BLACK) const; JS_ALWAYS_INLINE void unmark(uint32_t color) const; inline JSCompartment *compartment() const; #ifdef DEBUG inline bool isAligned() const; #endif }; } /* namespace gc */ } /* namespace js */ #endif /* jscell_h___ */