jitcraft/main.cpp
author David Anderson <dvander@alliedmods.net>
Sat Jun 30 22:31:14 2012 -0700 (2012-06-30)
changeset 14 0784ac5cc347
parent 12 75e385f68b7e
child 15 d8ed9b8f19ca
permissions -rw-r--r--
Added support for non-array references.
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@0
    28
dvander@0
    29
using namespace jc;
dvander@0
    30
dvander@0
    31
class File
dvander@0
    32
{
dvander@0
    33
    FILE *fp_;
dvander@0
    34
dvander@0
    35
  public:
dvander@0
    36
    File(FILE *fp)
dvander@0
    37
      : fp_(fp)
dvander@0
    38
    {
dvander@0
    39
    }
dvander@0
    40
dvander@0
    41
    ~File() {
dvander@0
    42
        if (fp_)
dvander@0
    43
            fclose(fp_);
dvander@0
    44
    }
dvander@0
    45
dvander@0
    46
    operator FILE *() {
dvander@0
    47
        return fp_;
dvander@0
    48
    }
dvander@0
    49
dvander@0
    50
    operator bool () {
dvander@0
    51
        return !!fp_;
dvander@0
    52
    }
dvander@0
    53
};
dvander@0
    54
dvander@0
    55
static bool
dvander@0
    56
Compile(const char *stream, size_t length)
dvander@0
    57
{
dvander@0
    58
    if (!ZONE()->initialize())
dvander@0
    59
        return false;
dvander@0
    60
dvander@0
    61
    Parser parser(stream, length);
dvander@0
    62
    ParseTree *tree = parser.parse();
dvander@0
    63
    if (!tree)
dvander@0
    64
        return false;
dvander@0
    65
    tree->dump(stdout);
dvander@0
    66
dvander@12
    67
    if (!Scope::Bind(tree))
dvander@0
    68
        return false;
dvander@0
    69
dvander@0
    70
    SemanticAnalysis semantics(tree);
dvander@0
    71
    if (!semantics.analyze())
dvander@0
    72
        return false;
dvander@0
    73
dvander@12
    74
    Scope::Allocate(tree);
dvander@12
    75
dvander@14
    76
    BytecodeCompiler compiler(tree, NULL);
dvander@0
    77
    Module *module = compiler.compile();
dvander@0
    78
    if (!module)
dvander@0
    79
        return false;
dvander@0
    80
dvander@0
    81
    printf("\n ------------ \n\n");
dvander@0
    82
dvander@14
    83
    Disassemble(module->getFunction(1), stdout);
dvander@0
    84
    //Disassemble(module->getFunction(1), stdout);
dvander@0
    85
dvander@0
    86
    printf("\n ------------ \n\n");
dvander@0
    87
dvander@14
    88
    Code *main = module->getFunction(1);
dvander@0
    89
dvander@0
    90
    Top top = ZONE()->stack().begin();
dvander@0
    91
    LocalTop localTop(top);
dvander@0
    92
dvander@0
    93
    Frame *frame = ZONE()->stack().pushFrame(NULL, main);
dvander@0
    94
    if (!frame)
dvander@0
    95
        return false;
dvander@0
    96
dvander@4
    97
    LocalSlot result;
dvander@0
    98
    if (!Interpret(frame, &result))
dvander@0
    99
        return false;
dvander@0
   100
dvander@8
   101
    printf("Result: %d\n", result.i32);
dvander@0
   102
dvander@0
   103
    return true;
dvander@0
   104
}
dvander@0
   105
dvander@0
   106
int main(int argc, char **argv)
dvander@0
   107
{
dvander@0
   108
    if (argc < 2) {
dvander@0
   109
        fprintf(stderr, "Usage: <file>\n");
dvander@0
   110
        return 1;
dvander@0
   111
    }
dvander@0
   112
dvander@0
   113
    AutoVec<char> bytes(NULL);
dvander@0
   114
    size_t length;
dvander@0
   115
    {
dvander@0
   116
        File fp = fopen(argv[1], "rb");
dvander@0
   117
        if (!fp) {
dvander@0
   118
            fprintf(stderr, "Can't open file: \"%s\"\n", argv[1]);
dvander@0
   119
            return 1;
dvander@0
   120
        }
dvander@0
   121
dvander@0
   122
        if (fseek(fp, 0, SEEK_END)) {
dvander@0
   123
            fprintf(stderr, "Error seeking file!\n");
dvander@0
   124
            return 1;
dvander@0
   125
        }
dvander@0
   126
        long size = ftell(fp);
dvander@0
   127
        if (size < 0) {
dvander@0
   128
            fprintf(stderr, "Error getting file length!\n");
dvander@0
   129
            return 1;
dvander@0
   130
        }
dvander@0
   131
        rewind(fp);
dvander@0
   132
        length = size_t(size);
dvander@0
   133
        bytes = new char[length + 1];
dvander@0
   134
        if (fread(bytes, 1, length, fp) != length) {
dvander@0
   135
            fprintf(stderr, "Error reading file!\n");
dvander@0
   136
            return 1;
dvander@0
   137
        }
dvander@0
   138
    }
dvander@0
   139
dvander@0
   140
    Compile(bytes, length);
dvander@0
   141
dvander@0
   142
}