dvander@71: /* dvander@71: * Copyright (C) 2012 David Anderson dvander@71: * dvander@71: * This file is part of JITCraft. dvander@71: * dvander@71: * JITCraft is free software: you can redistribute it and/or modify it under dvander@71: * the terms of the GNU General Public License as published by the Free dvander@71: * Software Foundation, either version 3 of the License, or (at your option) dvander@71: * any later version. dvander@71: * dvander@71: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@71: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@71: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@71: * dvander@71: * You should have received a copy of the GNU General Public License along with dvander@71: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@71: */ dvander@71: #include dvander@161: #include dvander@71: #include "../include/keima.h" dvander@71: dvander@161: using namespace Ke; dvander@71: dvander@161: class MessageReporter : public IMessageReporter dvander@69: { dvander@69: public: dvander@69: void onOutOfMemory() { dvander@69: fprintf(stderr, "Out of memory!\n"); dvander@69: } dvander@69: void onUncaughtException(const char *message) { dvander@69: fprintf(stderr, "Uncaught exception: %s\n", message); dvander@69: dvander@161: IStackFrameIterator *iter = Keima::NewStackFrameIterator(); dvander@69: unsigned index = 0; dvander@69: while (!iter->done()) { dvander@69: fprintf(stderr, "[%d] %s (%s line %d)\n", dvander@69: index, dvander@69: iter->function(), dvander@69: iter->source(), dvander@69: iter->lineNumber()); dvander@69: iter->prev(); dvander@69: index++; dvander@69: } dvander@69: } dvander@71: virtual void beginCompilationErrors(const char *file) { dvander@71: fprintf(stderr, "\nDisplaying compilation errors for \"%s\"\n", file); dvander@71: } dvander@71: virtual void reportCompilationError(const char *message, unsigned line, unsigned col) { dvander@71: fprintf(stderr, " line %d, col %d: %s\n", line, col, message); dvander@71: } dvander@71: virtual void endCompilationErrors() { dvander@71: } dvander@71: } s_Reporter; dvander@71: dvander@71: #if 0 dvander@71: static bool dvander@71: Compile(const char *stream, size_t length) dvander@71: { dvander@71: dvander@71: printf("\n ------------ \n\n"); dvander@71: dvander@71: Disassemble(module->getFunction(1)->code(), stdout); dvander@71: //Disassemble(module->getFunction(1), stdout); dvander@71: dvander@71: printf("\n ------------ \n\n"); dvander@71: dvander@71: Function *main = module->getFunction(1); dvander@71: dvander@71: Top top = ZONE()->stack().begin(); dvander@71: LocalTop localTop(top); dvander@71: dvander@71: Frame *frame = ZONE()->stack().pushFrame(main); dvander@71: if (!frame) dvander@71: return false; dvander@71: dvander@71: LocalSlot result; dvander@71: if (!Interpret(ZONE(), frame, &result)) dvander@71: return false; dvander@71: dvander@71: printf("Result: %d\n", result.i32); dvander@71: dvander@71: return true; dvander@71: } dvander@71: #endif dvander@71: dvander@71: intptr_t PrintToServer(void *blah, intptr_t *params) dvander@71: { dvander@71: assert(params[0] == 3); dvander@71: const char *fmt = reinterpret_cast(params[1]); dvander@71: const char *str = reinterpret_cast(params[2]); dvander@71: int *d = reinterpret_cast(params[3]); dvander@71: printf(fmt, str, *d); dvander@71: return 16; dvander@71: } dvander@71: dvander@71: int main(int argc, char **argv) dvander@71: { dvander@71: if (argc < 2) { dvander@71: fprintf(stderr, "Usage: \n"); dvander@71: return 1; dvander@71: } dvander@71: dvander@161: if (!Keima::Initialize()) dvander@71: return 1; dvander@161: Keima::InstallMessageReporter(&s_Reporter); dvander@71: { dvander@161: HandleScope scope; dvander@161: Local module = Compile(argv[1]); dvander@71: if (!module) dvander@71: return 1; dvander@71: dvander@162: Keima::CollectGarbage(); dvander@161: dvander@161: //Local native = module->getNative(0); dvander@85: //native->bind(reinterpret_cast(PrintToServer)); dvander@85: //module->setNativeIdentity(reinterpret_cast(5)); dvander@71: dvander@71: int result; dvander@161: Local fun = module->getPublic(0); dvander@161: if (Keima::Invoke(fun, NULL, 0, true, &result)) dvander@71: printf("%d\n", result); dvander@71: } dvander@71: dvander@161: Keima::Shutdown(); dvander@71: } danderson@92: danderson@92: /* Overload a few things to prevent libstdc++ linking */ danderson@92: #if defined __linux__ || defined __APPLE__ danderson@92: extern "C" void __cxa_pure_virtual(void) danderson@92: { danderson@92: } danderson@92: danderson@92: void *operator new(size_t size) danderson@92: { danderson@92: return malloc(size); danderson@92: } danderson@92: danderson@92: void *operator new[](size_t size) danderson@92: { danderson@92: return malloc(size); danderson@92: } danderson@92: danderson@92: void operator delete(void *ptr) danderson@92: { danderson@92: free(ptr); danderson@92: } danderson@92: danderson@92: void operator delete[](void * ptr) danderson@92: { danderson@92: free(ptr); danderson@92: } danderson@92: #endif danderson@92: