void YogVM_boot(YogEnv* env, YogVM* vm) { YogHandleScope scope; YogHandleScope_OPEN(env, &scope); setup_encodings1(env, vm); setup_symbol_tables(env, vm); setup_basic_classes(env, vm); YogHandle* builtins = YogHandle_REGISTER(env, alloc_skelton_pkg(env, vm)); setup_classes(env, vm, HDL2VAL(builtins)); YogPackage_init(env, HDL2VAL(builtins), TYPE_PACKAGE); set_main_thread_class(env, vm); YogException_define_classes(env, HDL2VAL(builtins)); YogObject_boot(env, vm->cObject, HDL2VAL(builtins)); YogClass_boot(env, vm->cClass, HDL2VAL(builtins)); vm->pkgs = YogTable_create_symbol_table(env); vm->encodings = YogDict_new(env); setup_encodings2(env, vm); setup_default_encoding(env, vm); vm->finish_code = YogCompiler_compile_finish_code(env); vm->id_star = YogVM_intern(env, vm, "*"); vm->id_star2 = YogVM_intern(env, vm, "**"); vm->id_amp = YogVM_intern(env, vm, "&"); setup_builtins(env, vm, builtins); YogArray_eval_builtin_script(env, vm->cArray); YogBinary_eval_builtin_script(env, vm->cBinary); YogDatetime_eval_builtin_script(env, vm->cDatetime); YogDict_eval_builtin_script(env, vm->cDict); YogFixnum_eval_builtin_script(env, vm->cFixnum); YogObject_eval_builtin_script(env, vm->cObject); YogSet_eval_builtin_script(env, vm->cSet); YogString_eval_builtin_script(env, vm->cString); YogPath_eval_builtin_script(env, vm->cPath); YogSymbol_eval_builtin_script(env, vm->cSymbol); YogCallable_eval_builtin_script(env, vm->mCallable); YogEnumerable_eval_builtin_script(env, vm->mEnumerable); YogHandleScope_close(env); }
JNIEXPORT void JNICALL Java_jni_LuaEngine_setup(JNIEnv* env, jobject object) { if (!setup) { static jmp_buf reg_handle; if (setjmp(reg_handle)) { return; } function_index = 0; setup_closures(); setup_classes(env, reg_handle); setup_value(env, reg_handle); thread_datum_init(env, reg_handle); ASSERTEX(env); setup = 1; } }
int main() { setup_classes(); // c = C() pyobj c = create_object(C); // d = D() pyobj d = create_object(D); // TODO: call the __init__ method if it exists #ifdef TAGGING pyobj one = inject_int(1); pyobj three = inject_int(3); #else pyobj one = create_int(1); pyobj three = create_int(3); #endif // c.f = 1 set_attr(c, "f", one); // d.f = 1 set_attr(d, "f", one); pyobj i, j, k, h; // i = c.m() { pyobj meth = get_attr(c, "m"); pyobj fun = get_function(meth); void *fp = get_fun_ptr(fun); pyobj (*f)(pyobj) = (pyobj (*)(pyobj)) fp; // cast to a function pointer type i = f(get_receiver(meth)); } // j = d.m() { pyobj meth = get_attr(d, "m"); pyobj fun = get_function(meth); void *fp = get_fun_ptr(fun); pyobj (*f)(pyobj) = (pyobj (*)(pyobj)) fp; // cast to a function pointer type j = f(get_receiver(meth)); } // d.n(3) { pyobj (*f)(pyobj, pyobj) = (pyobj (*)(pyobj, pyobj)) get_fun_ptr_from_attr(d, "n"); f(d, three); } // k = d.m() { pyobj meth = get_attr(d, "m"); pyobj fun = get_function(meth); void *fp = get_fun_ptr(fun); pyobj (*f)(pyobj) = (pyobj (*)(pyobj)) fp; // cast to a function pointer type k = f(get_receiver(meth)); } // h = i + j + k { #ifdef TAGGING // optimized, but assumes i and j are integers // h = i + j + k // unoptimized, but checks that i and j are integers h = inject_int(project_int(i) + project_int(j) + project_int(k)); #else h = create_int(project_int(i) + project_int(j) + project_int(k)); #endif } // print i, j, k print_any(i); print_any(j); print_any(k); print_any(h); return 0; }