jitcraft/main.cpp
author David Anderson <dvander@alliedmods.net>
Wed Jun 27 02:21:56 2012 -0700 (2012-06-27)
changeset 4 633176823669
parent 0 c455ebb9a5dc
child 8 069d207a8f2a
permissions -rw-r--r--
Add support for float variables and basic math.
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@0
    67
    if (!Scope::BindAndAllocate(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@0
    74
    BytecodeCompiler compiler(tree);
dvander@0
    75
    Module *module = compiler.compile();
dvander@0
    76
    if (!module)
dvander@0
    77
        return false;
dvander@0
    78
dvander@0
    79
    printf("\n ------------ \n\n");
dvander@0
    80
dvander@0
    81
    Disassemble(module->getFunction(0), stdout);
dvander@0
    82
    //Disassemble(module->getFunction(1), stdout);
dvander@0
    83
dvander@0
    84
    printf("\n ------------ \n\n");
dvander@0
    85
dvander@0
    86
    Code *main = module->getFunction(0);
dvander@0
    87
dvander@0
    88
    Top top = ZONE()->stack().begin();
dvander@0
    89
    LocalTop localTop(top);
dvander@0
    90
dvander@0
    91
    Frame *frame = ZONE()->stack().pushFrame(NULL, main);
dvander@0
    92
    if (!frame)
dvander@0
    93
        return false;
dvander@0
    94
dvander@4
    95
    LocalSlot result;
dvander@0
    96
    if (!Interpret(frame, &result))
dvander@0
    97
        return false;
dvander@0
    98
dvander@4
    99
    printf("Result: %f\n", result.f);
dvander@0
   100
dvander@0
   101
    return true;
dvander@0
   102
}
dvander@0
   103
dvander@0
   104
int main(int argc, char **argv)
dvander@0
   105
{
dvander@0
   106
    if (argc < 2) {
dvander@0
   107
        fprintf(stderr, "Usage: <file>\n");
dvander@0
   108
        return 1;
dvander@0
   109
    }
dvander@0
   110
dvander@0
   111
    AutoVec<char> bytes(NULL);
dvander@0
   112
    size_t length;
dvander@0
   113
    {
dvander@0
   114
        File fp = fopen(argv[1], "rb");
dvander@0
   115
        if (!fp) {
dvander@0
   116
            fprintf(stderr, "Can't open file: \"%s\"\n", argv[1]);
dvander@0
   117
            return 1;
dvander@0
   118
        }
dvander@0
   119
dvander@0
   120
        if (fseek(fp, 0, SEEK_END)) {
dvander@0
   121
            fprintf(stderr, "Error seeking file!\n");
dvander@0
   122
            return 1;
dvander@0
   123
        }
dvander@0
   124
        long size = ftell(fp);
dvander@0
   125
        if (size < 0) {
dvander@0
   126
            fprintf(stderr, "Error getting file length!\n");
dvander@0
   127
            return 1;
dvander@0
   128
        }
dvander@0
   129
        rewind(fp);
dvander@0
   130
        length = size_t(size);
dvander@0
   131
        bytes = new char[length + 1];
dvander@0
   132
        if (fread(bytes, 1, length, fp) != length) {
dvander@0
   133
            fprintf(stderr, "Error reading file!\n");
dvander@0
   134
            return 1;
dvander@0
   135
        }
dvander@0
   136
    }
dvander@0
   137
dvander@0
   138
    Compile(bytes, length);
dvander@0
   139
dvander@0
   140
}