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