jitcraft/main.cpp
author David Anderson <dvander@alliedmods.net>
Mon Jul 02 01:24:57 2012 -0700 (2012-07-02)
changeset 25 23e8b3d8e4e6
parent 21 af5d8e985502
child 26 a48382113da6
permissions -rw-r--r--
Scanning, parsing, and static analysis now report errors properly.
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@25
    61
    CompileContext cc(ZONE());
dvander@25
    62
dvander@25
    63
    Parser parser(cc, stream, length);
dvander@0
    64
    ParseTree *tree = parser.parse();
dvander@0
    65
    if (!tree)
dvander@0
    66
        return false;
dvander@0
    67
    tree->dump(stdout);
dvander@0
    68
dvander@12
    69
    if (!Scope::Bind(tree))
dvander@0
    70
        return false;
dvander@0
    71
dvander@25
    72
    SemanticAnalysis semantics(cc, tree);
dvander@0
    73
    if (!semantics.analyze())
dvander@0
    74
        return false;
dvander@0
    75
dvander@12
    76
    Scope::Allocate(tree);
dvander@12
    77
dvander@14
    78
    BytecodeCompiler compiler(tree, NULL);
dvander@0
    79
    Module *module = compiler.compile();
dvander@0
    80
    if (!module)
dvander@0
    81
        return false;
dvander@0
    82
dvander@0
    83
    printf("\n ------------ \n\n");
dvander@0
    84
dvander@21
    85
    Disassemble(module->getFunction(0), stdout);
dvander@0
    86
    //Disassemble(module->getFunction(1), stdout);
dvander@0
    87
dvander@0
    88
    printf("\n ------------ \n\n");
dvander@0
    89
dvander@21
    90
    Code *main = module->getFunction(0);
dvander@0
    91
dvander@0
    92
    Top top = ZONE()->stack().begin();
dvander@0
    93
    LocalTop localTop(top);
dvander@0
    94
dvander@0
    95
    Frame *frame = ZONE()->stack().pushFrame(NULL, main);
dvander@0
    96
    if (!frame)
dvander@0
    97
        return false;
dvander@0
    98
dvander@4
    99
    LocalSlot result;
dvander@0
   100
    if (!Interpret(frame, &result))
dvander@0
   101
        return false;
dvander@0
   102
dvander@8
   103
    printf("Result: %d\n", result.i32);
dvander@0
   104
dvander@0
   105
    return true;
dvander@0
   106
}
dvander@0
   107
dvander@0
   108
int main(int argc, char **argv)
dvander@0
   109
{
dvander@0
   110
    if (argc < 2) {
dvander@0
   111
        fprintf(stderr, "Usage: <file>\n");
dvander@0
   112
        return 1;
dvander@0
   113
    }
dvander@0
   114
dvander@0
   115
    AutoVec<char> bytes(NULL);
dvander@0
   116
    size_t length;
dvander@0
   117
    {
dvander@0
   118
        File fp = fopen(argv[1], "rb");
dvander@0
   119
        if (!fp) {
dvander@0
   120
            fprintf(stderr, "Can't open file: \"%s\"\n", argv[1]);
dvander@0
   121
            return 1;
dvander@0
   122
        }
dvander@0
   123
dvander@0
   124
        if (fseek(fp, 0, SEEK_END)) {
dvander@0
   125
            fprintf(stderr, "Error seeking file!\n");
dvander@0
   126
            return 1;
dvander@0
   127
        }
dvander@0
   128
        long size = ftell(fp);
dvander@0
   129
        if (size < 0) {
dvander@0
   130
            fprintf(stderr, "Error getting file length!\n");
dvander@0
   131
            return 1;
dvander@0
   132
        }
dvander@0
   133
        rewind(fp);
dvander@0
   134
        length = size_t(size);
dvander@0
   135
        bytes = new char[length + 1];
dvander@0
   136
        if (fread(bytes, 1, length, fp) != length) {
dvander@0
   137
            fprintf(stderr, "Error reading file!\n");
dvander@0
   138
            return 1;
dvander@0
   139
        }
dvander@0
   140
    }
dvander@0
   141
dvander@0
   142
    Compile(bytes, length);
dvander@0
   143
dvander@0
   144
}