jitcraft/main.cpp
author David Anderson <dvander@alliedmods.net>
Tue Jul 10 02:11:13 2012 -0700 (2012-07-10)
changeset 68 b40b0e18a918
parent 66 cbba1997dc71
child 69 dfce0539a77d
permissions -rw-r--r--
Added support for ISourcePawnEngine natives.
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@61
    33
#if 0
dvander@0
    34
static bool
dvander@0
    35
Compile(const char *stream, size_t length)
dvander@0
    36
{
dvander@0
    37
dvander@0
    38
    printf("\n ------------ \n\n");
dvander@0
    39
dvander@47
    40
    Disassemble(module->getFunction(1)->code(), stdout);
dvander@0
    41
    //Disassemble(module->getFunction(1), stdout);
dvander@0
    42
dvander@0
    43
    printf("\n ------------ \n\n");
dvander@0
    44
dvander@47
    45
    Function *main = module->getFunction(1);
dvander@0
    46
dvander@0
    47
    Top top = ZONE()->stack().begin();
dvander@0
    48
    LocalTop localTop(top);
dvander@0
    49
dvander@47
    50
    Frame *frame = ZONE()->stack().pushFrame(main);
dvander@0
    51
    if (!frame)
dvander@0
    52
        return false;
dvander@0
    53
dvander@4
    54
    LocalSlot result;
dvander@42
    55
    if (!Interpret(ZONE(), frame, &result))
dvander@0
    56
        return false;
dvander@0
    57
dvander@8
    58
    printf("Result: %d\n", result.i32);
dvander@0
    59
dvander@0
    60
    return true;
dvander@0
    61
}
dvander@61
    62
#endif
dvander@0
    63
dvander@68
    64
intptr_t PrintToServer(void *blah, intptr_t *params)
dvander@68
    65
{
dvander@68
    66
    assert(params[0] == 3);
dvander@68
    67
    const char *fmt = reinterpret_cast<const char *>(params[1]);
dvander@68
    68
    const char *str = reinterpret_cast<const char *>(params[2]);
dvander@68
    69
    int *d = reinterpret_cast<int *>(params[3]);
dvander@68
    70
    printf(fmt, str, *d);
dvander@68
    71
    return 16;
dvander@68
    72
}
dvander@68
    73
dvander@0
    74
int main(int argc, char **argv)
dvander@0
    75
{
dvander@0
    76
    if (argc < 2) {
dvander@0
    77
        fprintf(stderr, "Usage: <file>\n");
dvander@0
    78
        return 1;
dvander@0
    79
    }
dvander@0
    80
dvander@62
    81
    if (!Ke::Keima::Initialize())
dvander@61
    82
        return 1;
dvander@0
    83
    {
dvander@61
    84
        Ke::HandleScope scope;
dvander@61
    85
        Ke::Local<Ke::Module> module = Ke::Compile(argv[1]);
dvander@61
    86
        if (!module)
dvander@0
    87
            return 1;
dvander@61
    88
dvander@68
    89
        Ke::Local<Ke::Native> native = module->getNative(0);
dvander@68
    90
        native->bind(reinterpret_cast<void *>(PrintToServer));
dvander@68
    91
        module->setNativeIdentity(reinterpret_cast<void *>(5));
dvander@68
    92
dvander@68
    93
        int result;
dvander@68
    94
        Ke::Local<Ke::Function> fun = module->getPublic(0);
dvander@68
    95
        if (Ke::Keima::Invoke(fun, NULL, 0, &result))
dvander@68
    96
            printf("%d\n", result);
dvander@0
    97
    }
dvander@0
    98
dvander@62
    99
    Ke::Keima::Shutdown();
dvander@0
   100
}