jitcraft/RootScopes.cpp
author David Anderson <dvander@alliedmods.net>
Sat Jul 07 21:30:23 2012 -0700 (2012-07-07)
changeset 59 b7d61ddb3c8d
parent 47 050939c6181e
child 64 11c81eb30246
permissions -rw-r--r--
Rename jc:: to ke::
dvander@29
     1
/* vim: set ts=4 sw=4 tw=99 et:
dvander@29
     2
 *
dvander@29
     3
 * Copyright (C) 2012 David Anderson
dvander@29
     4
 *
dvander@29
     5
 * This file is part of JITCraft.
dvander@29
     6
 *
dvander@29
     7
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@29
     8
 * the terms of the GNU General Public License as published by the Free
dvander@29
     9
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@29
    10
 * any later version.
dvander@29
    11
 * 
dvander@29
    12
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@29
    13
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@29
    14
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@29
    15
 *
dvander@29
    16
 * You should have received a copy of the GNU General Public License along with
dvander@29
    17
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@29
    18
 */
dvander@29
    19
#include "RootScopes.h"
dvander@29
    20
dvander@59
    21
using namespace ke;
dvander@29
    22
dvander@29
    23
RootScopeManager::RootScopeManager()
dvander@29
    24
  : blocks_(&first_),
dvander@29
    25
    first_(NULL),
dvander@29
    26
    scope_(NULL)
dvander@29
    27
{
dvander@29
    28
}
dvander@29
    29
dvander@29
    30
RootScopeManager::~RootScopeManager()
dvander@29
    31
{
dvander@29
    32
    while (blocks_ != &first_) {
dvander@29
    33
        Block *temp = blocks_;
dvander@29
    34
        delete blocks_;
dvander@29
    35
        blocks_ = temp;
dvander@29
    36
    }
dvander@29
    37
}
dvander@29
    38
dvander@29
    39
bool
dvander@29
    40
RootScopeManager::grow()
dvander@29
    41
{
dvander@29
    42
    assert(blocks_->cur == blocks_->end);
dvander@29
    43
dvander@29
    44
    Block *block = new Block(blocks_);
dvander@29
    45
    if (!block)
dvander@29
    46
        return false;
dvander@29
    47
dvander@29
    48
    blocks_ = block;
dvander@29
    49
    return true;
dvander@29
    50
}
dvander@29
    51
dvander@29
    52
void
dvander@29
    53
RootScopeManager::unwindSlow(Object **pos)
dvander@29
    54
{
dvander@29
    55
    for (;;) {
dvander@47
    56
        if (pos >= blocks_->objects && pos <= blocks_->end)
dvander@29
    57
            break;
dvander@29
    58
        assert(blocks_ != &first_);
dvander@29
    59
        Block *temp = blocks_;
dvander@29
    60
        delete blocks_;
dvander@29
    61
        blocks_ = temp;
dvander@29
    62
    }
dvander@29
    63
dvander@29
    64
    blocks_->cur = pos;
dvander@29
    65
}
dvander@29
    66
dvander@45
    67
void
dvander@45
    68
RootScopeManager::accept(VirtualObjectVisitor *visitor)
dvander@45
    69
{
dvander@45
    70
    Block *block = blocks_;
dvander@45
    71
    while (block) {
dvander@45
    72
        for (Object **ptr = block->objects; ptr < block->cur; ptr++)
dvander@45
    73
            visitor->visit(ptr);
dvander@45
    74
        block = block->prev;
dvander@45
    75
    }
dvander@45
    76
}