static obj_t add_who_irritants(obj_t cont, obj_t values, obj_t ex) { //oprintf("add_who_irritants: cont_proc = %p\n", cont_proc(cont)); //oprintf("add_who_irritants: cont4_arg = %O\n", cont4_arg(cont)); //oprintf("add_who_irritants: values = %O\n", values); assert(is_cont(cont)); cont_proc_t proc = cont_proc(cont); if (proc == c_apply_proc) { assert(is_cont5(cont)); obj_t op = cont5_arg1(cont); obj_t who_sym = procedure_is_C(op) ? procedure_name(op) : FALSE_OBJ; obj_t who_ex = MAKE_RECORD(who, who_sym); obj_t irr_ex = MAKE_RECORD(irritants, reverse_list(values)); return MAKE_COMPOUND_CONDITION(who_ex, irr_ex, ex); } if (proc == c_eval_operator) { assert(is_cont4(cont)); obj_t arg = cont4_arg(cont); obj_t who_ex = MAKE_RECORD(who, CAR(arg)); obj_t irr_ex = MAKE_RECORD(irritants, CDR(arg)); return MAKE_COMPOUND_CONDITION(who_ex, irr_ex, ex); } if (proc == c_eval) { assert(is_cont4(cont)); obj_t expr = cont4_arg(cont); obj_t who_ex = MAKE_RECORD(who, expr); return MAKE_COMPOUND_CONDITION(who_ex, ex); } return ex; }
extern obj_t core_eval_cont(volatile obj_t cont, volatile obj_t values, obj_t handler) { eval_dyn_env = MAKE_RECORD(dyn_env, EMPTY_LIST, handler); if (sigsetjmp(eval_sigrestart, 1)) { /* On Linux, siglongjmp is 30X slower than longjmp. */ /* push exception... */ } else { switch (setjmp(eval_restart)) { case LT_THROWN: { cv_t ret = push_exception(cont, values); cont = ret.cv_cont; values = ret.cv_values; } break; case LT_HEAP_FULL: cont_root = cont; values_root = values; collect_garbage(); cont = cont_root; values = values_root; cont_root = make_uninitialized(); values_root = make_uninitialized(); break; case LT_NO_EXCEPTION: register_lowex_handler(handle_lowex); break; default: assert(false); } } while (!is_null(cont)) { cv_t ret = cont_proc(cont)(cont, values); cont = ret.cv_cont; values = ret.cv_values; COMMIT(); #if DEBUG_EVAL int n = 0; obj_t p; for (p = cont; !is_null(p); p = cont_cont(p)) n++; EVAL_LOG("values=%O cont depth=%d", values, n); #endif } deregister_lowex_handler(handle_lowex); eval_dyn_env = make_uninitialized(); EVAL_LOG("END values=%O", values); assert(is_null(CDR(values))); return CAR(values); }
// Khush started working on this // dealing with records and attribute values RC createRecord(Record **record, Schema *schema) { int recordSize; Record *newRecord; // Assign default record values newRecord = MAKE_RECORD(); recordSize = getRecordSize(schema); newRecord->data = MAKE_RECDATA(recordSize); memset(newRecord->data, 0, recordSize); newRecord->id.page = NO_PAGE; newRecord->id.slot = NO_SLOT; // Save record to pointer *record = newRecord; return RC_OK; }