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