Fix various error reporting bugs related to Invoke.
2 * Copyright (C) 2012 David Anderson
4 * This file is part of JITCraft.
6 * JITCraft is free software: you can redistribute it and/or modify it under
7 * the terms of the GNU General Public License as published by the Free
8 * Software Foundation, either version 3 of the License, or (at your option)
11 * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along with
16 * JITCraft. If not, see http://www.gnu.org/licenses/.
22 #include "SemanticAnalysis.h"
24 #include "BytecodeCompiler.h"
26 #include "Interpreter.h"
28 #include "RootScopes.h"
29 #include "../include/keima.h"
30 #include "Spaces-inl.h"
35 class MessageReporter : public Ke::IMessageReporter
38 void onOutOfMemory() {
39 fprintf(stderr, "Out of memory!\n");
41 void onUncaughtException(const char *message) {
42 fprintf(stderr, "Uncaught exception: %s\n", message);
44 Ke::IStackFrameIterator *iter = Ke::Keima::NewStackFrameIterator();
46 while (!iter->done()) {
47 fprintf(stderr, "[%d] %s (%s line %d)\n",
56 virtual void beginCompilationErrors(const char *file) {
57 fprintf(stderr, "\nDisplaying compilation errors for \"%s\"\n", file);
59 virtual void reportCompilationError(const char *message, unsigned line, unsigned col) {
60 fprintf(stderr, " line %d, col %d: %s\n", line, col, message);
62 virtual void endCompilationErrors() {
68 Compile(const char *stream, size_t length)
71 printf("\n ------------ \n\n");
73 Disassemble(module->getFunction(1)->code(), stdout);
74 //Disassemble(module->getFunction(1), stdout);
76 printf("\n ------------ \n\n");
78 Function *main = module->getFunction(1);
80 Top top = ZONE()->stack().begin();
81 LocalTop localTop(top);
83 Frame *frame = ZONE()->stack().pushFrame(main);
88 if (!Interpret(ZONE(), frame, &result))
91 printf("Result: %d\n", result.i32);
97 intptr_t PrintToServer(void *blah, intptr_t *params)
99 assert(params[0] == 3);
100 const char *fmt = reinterpret_cast<const char *>(params[1]);
101 const char *str = reinterpret_cast<const char *>(params[2]);
102 int *d = reinterpret_cast<int *>(params[3]);
103 printf(fmt, str, *d);
107 int main(int argc, char **argv)
110 fprintf(stderr, "Usage: <file>\n");
114 if (!Ke::Keima::Initialize())
116 Ke::Keima::InstallMessageReporter(&s_Reporter);
118 Ke::HandleScope scope;
119 Ke::Local<Ke::Module> module = Ke::Compile(argv[1]);
123 //Ke::Local<Ke::Native> native = module->getNative(0);
124 //native->bind(reinterpret_cast<void *>(PrintToServer));
125 //module->setNativeIdentity(reinterpret_cast<void *>(5));
128 Ke::Local<Ke::Function> fun = module->getPublic(0);
129 if (Ke::Keima::Invoke(fun, NULL, 0, true, &result))
130 printf("%d\n", result);
133 Ke::Keima::Shutdown();
136 /* Overload a few things to prevent libstdc++ linking */
137 #if defined __linux__ || defined __APPLE__
138 extern "C" void __cxa_pure_virtual(void)
142 void *operator new(size_t size)
147 void *operator new[](size_t size)
152 void operator delete(void *ptr)
157 void operator delete[](void * ptr)