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