src/RootScopes.cpp
author David Anderson <dvander@alliedmods.net>
Wed Dec 26 17:19:49 2012 -0800 (2012-12-26)
changeset 243 3d94c73a824c
parent 86 32ad0523b309
permissions -rw-r--r--
Fix build bustage.
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@64
    19
#include <stdio.h>
dvander@64
    20
#include <stdlib.h>
dvander@29
    21
#include "RootScopes.h"
dvander@29
    22
dvander@59
    23
using namespace ke;
dvander@29
    24
dvander@29
    25
RootScopeManager::RootScopeManager()
dvander@29
    26
  : blocks_(&first_),
dvander@29
    27
    first_(NULL),
dvander@29
    28
    scope_(NULL)
dvander@29
    29
{
dvander@29
    30
}
dvander@29
    31
dvander@29
    32
RootScopeManager::~RootScopeManager()
dvander@29
    33
{
dvander@29
    34
    while (blocks_ != &first_) {
dvander@29
    35
        Block *temp = blocks_;
dvander@29
    36
        delete blocks_;
dvander@29
    37
        blocks_ = temp;
dvander@29
    38
    }
dvander@29
    39
}
dvander@29
    40
dvander@29
    41
bool
dvander@29
    42
RootScopeManager::grow()
dvander@29
    43
{
dvander@29
    44
    assert(blocks_->cur == blocks_->end);
dvander@29
    45
dvander@29
    46
    Block *block = new Block(blocks_);
dvander@64
    47
    if (!block) {
dvander@69
    48
        // We are not prepared for this. We'll start dishing out NULL-valued
dvander@69
    49
        // ScopedRoots, and the engine generally assumes infallbility. Rather
dvander@69
    50
        // then NULL check all sorts of nodes on parse trees, or add boolean
dvander@69
    51
        // setters, for now we just abort.
dvander@69
    52
        fprintf(stderr, "Unrecoverable error: could not allocate a local root scope. Aborting!\n");
dvander@64
    53
        abort();
dvander@29
    54
        return false;
dvander@64
    55
    }
dvander@29
    56
dvander@29
    57
    blocks_ = block;
dvander@29
    58
    return true;
dvander@29
    59
}
dvander@29
    60
dvander@29
    61
void
dvander@29
    62
RootScopeManager::unwindSlow(Object **pos)
dvander@29
    63
{
dvander@29
    64
    for (;;) {
dvander@47
    65
        if (pos >= blocks_->objects && pos <= blocks_->end)
dvander@29
    66
            break;
dvander@29
    67
        assert(blocks_ != &first_);
dvander@29
    68
        Block *temp = blocks_;
dvander@29
    69
        delete blocks_;
dvander@29
    70
        blocks_ = temp;
dvander@29
    71
    }
dvander@29
    72
dvander@29
    73
    blocks_->cur = pos;
dvander@29
    74
}
dvander@29
    75
dvander@45
    76
void
dvander@45
    77
RootScopeManager::accept(VirtualObjectVisitor *visitor)
dvander@45
    78
{
dvander@45
    79
    Block *block = blocks_;
dvander@45
    80
    while (block) {
dvander@45
    81
        for (Object **ptr = block->objects; ptr < block->cur; ptr++)
dvander@45
    82
            visitor->visit(ptr);
dvander@45
    83
        block = block->prev;
dvander@45
    84
    }
dvander@45
    85
}