jitcraft/main.cpp
author David Anderson <dvander@alliedmods.net>
Wed Jul 11 01:12:54 2012 -0700 (2012-07-11)
changeset 69 dfce0539a77d
parent 68 b40b0e18a918
child 71 f7e573226c2b
permissions -rw-r--r--
Added error reporting API and fixed all known error paths.
dvander@0
     1
/*
dvander@0
     2
 * Copyright (C) 2012 David Anderson
dvander@0
     3
 *
dvander@0
     4
 * This file is part of JITCraft.
dvander@0
     5
 *
dvander@0
     6
 * JITCraft is free software: you can redistribute it and/or modify it under
dvander@0
     7
 * the terms of the GNU General Public License as published by the Free
dvander@0
     8
 * Software Foundation, either version 3 of the License, or (at your option)
dvander@0
     9
 * any later version.
dvander@0
    10
 * 
dvander@0
    11
 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
dvander@0
    12
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@0
    13
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
dvander@0
    14
 *
dvander@0
    15
 * You should have received a copy of the GNU General Public License along with
dvander@0
    16
 * JITCraft. If not, see http://www.gnu.org/licenses/.
dvander@0
    17
 */
dvander@0
    18
#include <stdio.h>
dvander@0
    19
#include "Utility.h"
dvander@0
    20
#include "Scanner.h"
dvander@0
    21
#include "Parser.h"
dvander@0
    22
#include "SemanticAnalysis.h"
dvander@0
    23
#include "Zone.h"
dvander@0
    24
#include "BytecodeCompiler.h"
dvander@0
    25
#include "Code.h"
dvander@0
    26
#include "Interpreter.h"
dvander@0
    27
#include "Modules.h"
dvander@29
    28
#include "RootScopes.h"
dvander@61
    29
#include "../include/keima.h"
dvander@0
    30
dvander@59
    31
using namespace ke;
dvander@0
    32
dvander@69
    33
class MessageReporter : public Ke::IMessageReporter
dvander@69
    34
{
dvander@69
    35
  public:
dvander@69
    36
    void onOutOfMemory() {
dvander@69
    37
        fprintf(stderr, "Out of memory!\n");
dvander@69
    38
    }
dvander@69
    39
    void onUncaughtException(const char *message) {
dvander@69
    40
        fprintf(stderr, "Uncaught exception: %s\n", message);
dvander@69
    41
dvander@69
    42
        Ke::IStackFrameIterator *iter = Ke::Keima::NewStackFrameIterator();
dvander@69
    43
        unsigned index = 0;
dvander@69
    44
        while (!iter->done()) {
dvander@69
    45
            fprintf(stderr, "[%d] %s (%s line %d)\n",
dvander@69
    46
                    index,
dvander@69
    47
                    iter->function(),
dvander@69
    48
                    iter->source(),
dvander@69
    49
                    iter->lineNumber());
dvander@69
    50
            iter->prev();
dvander@69
    51
            index++;
dvander@69
    52
        }
dvander@69
    53
    }
dvander@69
    54
} s_Reporter;
dvander@69
    55
dvander@61
    56
#if 0
dvander@0
    57
static bool
dvander@0
    58
Compile(const char *stream, size_t length)
dvander@0
    59
{
dvander@0
    60
dvander@0
    61
    printf("\n ------------ \n\n");
dvander@0
    62
dvander@47
    63
    Disassemble(module->getFunction(1)->code(), stdout);
dvander@0
    64
    //Disassemble(module->getFunction(1), stdout);
dvander@0
    65
dvander@0
    66
    printf("\n ------------ \n\n");
dvander@0
    67
dvander@47
    68
    Function *main = module->getFunction(1);
dvander@0
    69
dvander@0
    70
    Top top = ZONE()->stack().begin();
dvander@0
    71
    LocalTop localTop(top);
dvander@0
    72
dvander@47
    73
    Frame *frame = ZONE()->stack().pushFrame(main);
dvander@0
    74
    if (!frame)
dvander@0
    75
        return false;
dvander@0
    76
dvander@4
    77
    LocalSlot result;
dvander@42
    78
    if (!Interpret(ZONE(), frame, &result))
dvander@0
    79
        return false;
dvander@0
    80
dvander@8
    81
    printf("Result: %d\n", result.i32);
dvander@0
    82
dvander@0
    83
    return true;
dvander@0
    84
}
dvander@61
    85
#endif
dvander@0
    86
dvander@68
    87
intptr_t PrintToServer(void *blah, intptr_t *params)
dvander@68
    88
{
dvander@68
    89
    assert(params[0] == 3);
dvander@68
    90
    const char *fmt = reinterpret_cast<const char *>(params[1]);
dvander@68
    91
    const char *str = reinterpret_cast<const char *>(params[2]);
dvander@68
    92
    int *d = reinterpret_cast<int *>(params[3]);
dvander@68
    93
    printf(fmt, str, *d);
dvander@68
    94
    return 16;
dvander@68
    95
}
dvander@68
    96
dvander@0
    97
int main(int argc, char **argv)
dvander@0
    98
{
dvander@0
    99
    if (argc < 2) {
dvander@0
   100
        fprintf(stderr, "Usage: <file>\n");
dvander@0
   101
        return 1;
dvander@0
   102
    }
dvander@0
   103
dvander@62
   104
    if (!Ke::Keima::Initialize())
dvander@61
   105
        return 1;
dvander@69
   106
    Ke::Keima::InstallMessageReporter(&s_Reporter);
dvander@0
   107
    {
dvander@61
   108
        Ke::HandleScope scope;
dvander@61
   109
        Ke::Local<Ke::Module> module = Ke::Compile(argv[1]);
dvander@61
   110
        if (!module)
dvander@0
   111
            return 1;
dvander@61
   112
dvander@68
   113
        Ke::Local<Ke::Native> native = module->getNative(0);
dvander@68
   114
        native->bind(reinterpret_cast<void *>(PrintToServer));
dvander@68
   115
        module->setNativeIdentity(reinterpret_cast<void *>(5));
dvander@68
   116
dvander@68
   117
        int result;
dvander@68
   118
        Ke::Local<Ke::Function> fun = module->getPublic(0);
dvander@68
   119
        if (Ke::Keima::Invoke(fun, NULL, 0, &result))
dvander@68
   120
            printf("%d\n", result);
dvander@0
   121
    }
dvander@0
   122
dvander@62
   123
    Ke::Keima::Shutdown();
dvander@0
   124
}