jitcraft/RootScopes.cpp
author David Anderson <dvander@alliedmods.net>
Sun Jul 08 17:57:44 2012 -0700 (2012-07-08)
changeset 64 11c81eb30246
parent 59 b7d61ddb3c8d
child 69 dfce0539a77d
permissions -rw-r--r--
Added API for looking at module public functions.
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@64
    48
        // :TODO: We are not prepared for this...
dvander@64
    49
        fprintf(stderr, "Could not allocate a local root scope.\n");
dvander@64
    50
        abort();
dvander@29
    51
        return false;
dvander@64
    52
    }
dvander@29
    53
dvander@29
    54
    blocks_ = block;
dvander@29
    55
    return true;
dvander@29
    56
}
dvander@29
    57
dvander@29
    58
void
dvander@29
    59
RootScopeManager::unwindSlow(Object **pos)
dvander@29
    60
{
dvander@29
    61
    for (;;) {
dvander@47
    62
        if (pos >= blocks_->objects && pos <= blocks_->end)
dvander@29
    63
            break;
dvander@29
    64
        assert(blocks_ != &first_);
dvander@29
    65
        Block *temp = blocks_;
dvander@29
    66
        delete blocks_;
dvander@29
    67
        blocks_ = temp;
dvander@29
    68
    }
dvander@29
    69
dvander@29
    70
    blocks_->cur = pos;
dvander@29
    71
}
dvander@29
    72
dvander@45
    73
void
dvander@45
    74
RootScopeManager::accept(VirtualObjectVisitor *visitor)
dvander@45
    75
{
dvander@45
    76
    Block *block = blocks_;
dvander@45
    77
    while (block) {
dvander@45
    78
        for (Object **ptr = block->objects; ptr < block->cur; ptr++)
dvander@45
    79
            visitor->visit(ptr);
dvander@45
    80
        block = block->prev;
dvander@45
    81
    }
dvander@45
    82
}