src/GlobalRoots.cpp
author David Anderson <dvander@alliedmods.net>
Sat Aug 11 12:11:39 2012 -0700 (2012-08-11)
changeset 170 5e4570966ece
parent 127 74ad30a6214a
child 195 c1ba166f3fc4
permissions -rw-r--r--
Parser support for public variables.
ds@127
     1
/* vim: set ts=4 sw=4 tw=99 et:
ds@127
     2
 *
dvander@61
     3
 * Copyright (C) 2004-2012 David Anderson
dvander@61
     4
 *
dvander@61
     5
 * This file is part of SourcePawn.
dvander@61
     6
 *
dvander@61
     7
 * SourcePawn is free software: you can redistribute it and/or modify it under
dvander@61
     8
 * the terms of the GNU General Public License as published by the Free
dvander@61
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@61
    10
 * any later version.
dvander@61
    11
 * 
dvander@61
    12
 * SourcePawn is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@61
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@61
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@61
    15
 *
dvander@61
    16
 * You should have received a copy of the GNU General Public License along with
dvander@61
    17
 * SourcePawn. If not, see http://www.gnu.org/licenses/.
dvander@61
    18
 */
dvander@61
    19
#include "GlobalRoots.h"
dvander@61
    20
#include "Zone.h"
danderson@92
    21
#include "Spaces-inl.h"
danderson@92
    22
#include "Heap-inl.h"
dvander@61
    23
dvander@61
    24
using namespace ke;
dvander@61
    25
dvander@61
    26
GlobalRoots::GlobalRoots(Zone *zone)
dvander@61
    27
  : zone_(zone)
dvander@61
    28
{
dvander@61
    29
}
dvander@61
    30
dvander@61
    31
GlobalRoots::~GlobalRoots()
dvander@61
    32
{
dvander@61
    33
    InlineList<HeapRoot>::iterator iter = roots_.begin();
dvander@61
    34
    while (iter != roots_.end()) {
dvander@65
    35
		HeapRoot *root = *iter;
dvander@61
    36
        iter = roots_.erase(iter);
dvander@65
    37
		delete root;
dvander@61
    38
    }
dvander@61
    39
}
dvander@61
    40
dvander@61
    41
bool
dvander@61
    42
GlobalRoots::initialize()
dvander@61
    43
{
dvander@61
    44
    return true;
dvander@61
    45
}
dvander@61
    46
dvander@61
    47
void
dvander@61
    48
GlobalRoots::accept(VirtualObjectVisitor *visitor)
dvander@61
    49
{
dvander@61
    50
    for (InlineList<HeapRoot>::iterator iter = roots_.begin(); iter != roots_.end(); iter++)
dvander@61
    51
        visitor->visit(&iter->obj);
dvander@61
    52
}
dvander@61
    53
dvander@61
    54
HeapRoot *
dvander@61
    55
GlobalRoots::create(Handle<Object> obj)
dvander@61
    56
{
dvander@61
    57
    HeapRoot *root = new HeapRoot();
dvander@69
    58
    if (!root) {
dvander@69
    59
        ZONE()->reportOutOfMemory();
dvander@61
    60
        return NULL;
dvander@69
    61
    }
dvander@61
    62
dvander@61
    63
    root->obj = obj;
dvander@65
    64
    root->refcount = 1;
dvander@61
    65
dvander@61
    66
    roots_.append(root);
dvander@61
    67
    return root;
dvander@61
    68
}
dvander@61
    69
dvander@61
    70
void
dvander@61
    71
GlobalRoots::incref(HeapRoot *root)
dvander@61
    72
{
dvander@61
    73
    root->refcount++;
dvander@61
    74
}
dvander@61
    75
dvander@61
    76
void
dvander@61
    77
GlobalRoots::decref(HeapRoot *root)
dvander@61
    78
{
dvander@61
    79
    assert(root->refcount > 0);
dvander@61
    80
    if (--root->refcount == 0) {
dvander@61
    81
        roots_.remove(root);
dvander@61
    82
        delete root;
dvander@61
    83
    }
dvander@61
    84
}