src/main.cpp
author David Anderson <dvander@alliedmods.net>
Sat Jul 28 16:42:38 2012 -0700 (2012-07-28)
changeset 108 9dcf58a17d32
parent 92 e3974e7360e9
child 129 86b368a4d80d
permissions -rw-r--r--
Stop using ccache on OS X.
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"
danderson@92
    30
#include "Spaces-inl.h"
danderson@92
    31
#include "Heap-inl.h"
dvander@71
    32
dvander@71
    33
using namespace ke;
dvander@71
    34
dvander@69
    35
class MessageReporter : public Ke::IMessageReporter
dvander@69
    36
{
dvander@69
    37
  public:
dvander@69
    38
    void onOutOfMemory() {
dvander@69
    39
        fprintf(stderr, "Out of memory!\n");
dvander@69
    40
    }
dvander@69
    41
    void onUncaughtException(const char *message) {
dvander@69
    42
        fprintf(stderr, "Uncaught exception: %s\n", message);
dvander@69
    43
dvander@69
    44
        Ke::IStackFrameIterator *iter = Ke::Keima::NewStackFrameIterator();
dvander@69
    45
        unsigned index = 0;
dvander@69
    46
        while (!iter->done()) {
dvander@69
    47
            fprintf(stderr, "[%d] %s (%s line %d)\n",
dvander@69
    48
                    index,
dvander@69
    49
                    iter->function(),
dvander@69
    50
                    iter->source(),
dvander@69
    51
                    iter->lineNumber());
dvander@69
    52
            iter->prev();
dvander@69
    53
            index++;
dvander@69
    54
        }
dvander@69
    55
    }
dvander@71
    56
    virtual void beginCompilationErrors(const char *file) {
dvander@71
    57
        fprintf(stderr, "\nDisplaying compilation errors for \"%s\"\n", file);
dvander@71
    58
    }
dvander@71
    59
    virtual void reportCompilationError(const char *message, unsigned line, unsigned col) {
dvander@71
    60
        fprintf(stderr, "  line %d, col %d: %s\n", line, col, message);
dvander@71
    61
    }
dvander@71
    62
    virtual void endCompilationErrors() {
dvander@71
    63
    }
dvander@71
    64
} s_Reporter;
dvander@71
    65
dvander@71
    66
#if 0
dvander@71
    67
static bool
dvander@71
    68
Compile(const char *stream, size_t length)
dvander@71
    69
{
dvander@71
    70
dvander@71
    71
    printf("\n ------------ \n\n");
dvander@71
    72
dvander@71
    73
    Disassemble(module->getFunction(1)->code(), stdout);
dvander@71
    74
    //Disassemble(module->getFunction(1), stdout);
dvander@71
    75
dvander@71
    76
    printf("\n ------------ \n\n");
dvander@71
    77
dvander@71
    78
    Function *main = module->getFunction(1);
dvander@71
    79
dvander@71
    80
    Top top = ZONE()->stack().begin();
dvander@71
    81
    LocalTop localTop(top);
dvander@71
    82
dvander@71
    83
    Frame *frame = ZONE()->stack().pushFrame(main);
dvander@71
    84
    if (!frame)
dvander@71
    85
        return false;
dvander@71
    86
dvander@71
    87
    LocalSlot result;
dvander@71
    88
    if (!Interpret(ZONE(), frame, &result))
dvander@71
    89
        return false;
dvander@71
    90
dvander@71
    91
    printf("Result: %d\n", result.i32);
dvander@71
    92
dvander@71
    93
    return true;
dvander@71
    94
}
dvander@71
    95
#endif
dvander@71
    96
dvander@71
    97
intptr_t PrintToServer(void *blah, intptr_t *params)
dvander@71
    98
{
dvander@71
    99
    assert(params[0] == 3);
dvander@71
   100
    const char *fmt = reinterpret_cast<const char *>(params[1]);
dvander@71
   101
    const char *str = reinterpret_cast<const char *>(params[2]);
dvander@71
   102
    int *d = reinterpret_cast<int *>(params[3]);
dvander@71
   103
    printf(fmt, str, *d);
dvander@71
   104
    return 16;
dvander@71
   105
}
dvander@71
   106
dvander@71
   107
int main(int argc, char **argv)
dvander@71
   108
{
dvander@71
   109
    if (argc < 2) {
dvander@71
   110
        fprintf(stderr, "Usage: <file>\n");
dvander@71
   111
        return 1;
dvander@71
   112
    }
dvander@71
   113
dvander@71
   114
    if (!Ke::Keima::Initialize())
dvander@71
   115
        return 1;
dvander@71
   116
    Ke::Keima::InstallMessageReporter(&s_Reporter);
dvander@71
   117
    {
dvander@71
   118
        Ke::HandleScope scope;
dvander@71
   119
        Ke::Local<Ke::Module> module = Ke::Compile(argv[1]);
dvander@71
   120
        if (!module)
dvander@71
   121
            return 1;
dvander@71
   122
dvander@85
   123
        //Ke::Local<Ke::Native> native = module->getNative(0);
dvander@85
   124
        //native->bind(reinterpret_cast<void *>(PrintToServer));
dvander@85
   125
        //module->setNativeIdentity(reinterpret_cast<void *>(5));
dvander@71
   126
dvander@71
   127
        int result;
dvander@71
   128
        Ke::Local<Ke::Function> fun = module->getPublic(0);
dvander@71
   129
        if (Ke::Keima::Invoke(fun, NULL, 0, &result))
dvander@71
   130
            printf("%d\n", result);
dvander@71
   131
    }
dvander@71
   132
dvander@71
   133
    Ke::Keima::Shutdown();
dvander@71
   134
}
danderson@92
   135
danderson@92
   136
/* Overload a few things to prevent libstdc++ linking */
danderson@92
   137
#if defined __linux__ || defined __APPLE__
danderson@92
   138
extern "C" void __cxa_pure_virtual(void)
danderson@92
   139
{
danderson@92
   140
}
danderson@92
   141
danderson@92
   142
void *operator new(size_t size)
danderson@92
   143
{
danderson@92
   144
	return malloc(size);
danderson@92
   145
}
danderson@92
   146
danderson@92
   147
void *operator new[](size_t size) 
danderson@92
   148
{
danderson@92
   149
	return malloc(size);
danderson@92
   150
}
danderson@92
   151
danderson@92
   152
void operator delete(void *ptr) 
danderson@92
   153
{
danderson@92
   154
	free(ptr);
danderson@92
   155
}
danderson@92
   156
danderson@92
   157
void operator delete[](void * ptr)
danderson@92
   158
{
danderson@92
   159
	free(ptr);
danderson@92
   160
}
danderson@92
   161
#endif
danderson@92
   162