O_TYPE execsym(O_ARGS, int th, int m) { mpdm_t s, v, p, o = NULL, r = NULL; /* gets the symbol name */ s = RF(M1); /* gets the arguments */ p = RF(M2); /* if it's to be called as a method, the object should be inserted into the local symtable before searching the symbol */ if (m && (o = mpdm_aget(p, 0)) && MPDM_IS_HASH(o)) { mpdm_push(l, o); } else m = 0; /* gets the symbol value */ v = GET(s); if (!MPDM_IS_EXEC(v)) { /* not found or NULL value? error */ mpdm_t t, w; char tmp[128]; w = RF(mpdm_join_s(s, L".")); t = RF(MPDM_2MBS((wchar_t *) w->data)); snprintf(tmp, sizeof(tmp), "Undefined function %s()", (char *) t->data); mpsl_error(MPDM_MBS(tmp)); UF(w); UF(t); } else { /* execute */ r = RF(th ? mpdm_exec_thread(v, p, l) : mpdm_exec(v, p, l)); } UF(s); UF(p); /* drop the object from the local symtable */ if (m) mpdm_adel(l, -1); return UFND(r); }
void test_abort_and_eval(void) { mpdm_t v; mpdm_t e; mpsl_abort = 0; v = mpdm_ref(mpsl_compile(MPDM_S(L"1000;"), NULL)); do_test("Abort 1", mpdm_ival(mpdm_exec(v, NULL, NULL)) == 1000); /* set global abort function */ mpsl_abort = 1; do_test("Abort 2", mpdm_exec(v, NULL, NULL) == NULL); mpsl_abort = 0; do_test("Abort 3", mpdm_ival(mpdm_exec(v, NULL, NULL)) == 1000); mpdm_unref(v); mpsl_error(NULL); v = mpsl_eval(MPDM_S(L"invalid_code()"), NULL, NULL); e = mpdm_get_wcs(mpdm_root(), L"ERROR"); printf("The following error is OK:\n"); mpdm_dump(e); do_test("eval 1", v == NULL && e != NULL); v = mpsl_eval(MPDM_S(L"undef_func();"), NULL, NULL); e = mpdm_get_wcs(mpdm_root(), L"ERROR"); printf("The following error is also OK:\n"); mpdm_dump(e); do_test("eval 2", v == NULL && e != NULL); v = mpsl_eval(MPDM_S(L"load('unexistent_file.mpsl');"), NULL, NULL); e = mpdm_get_wcs(mpdm_root(), L"ERROR"); printf("The following error is also OK:\n"); mpdm_dump(e); do_test("eval 3", v == NULL && e != NULL); v = mpsl_eval(MPDM_S(L"2000;"), NULL, NULL); e = mpdm_get_wcs(mpdm_root(), L"ERROR"); do_test("eval 4", mpdm_ival(v) == 2000 && e == NULL); }
/** error(err); */ static mpdm_t F_error(F_ARGS) { return mpsl_error(A0); }