static SLVAL sl_new_oserror(sl_vm_t* vm, int errno) { char* description = strerror(errno); SLVAL Posix_OSError = vm->store[cPosix_OSError]; SLVAL error = sl_make_error2(vm, Posix_OSError, sl_make_cstring(vm, description)); sl_set_ivar(vm, error, sl_intern(vm, "errno"), sl_make_int(vm, errno)); return error; }
static void sl_ruby_protect(sl_vm_t* vm, void(*func)(sl_vm_t*,void*), void* data) { struct sl_ruby_protect_args args = { vm, data, func, 0, { 0 } }; sl_vm_frame_t frame; pthread_mutex_lock(&sl_ruby_lock); SL_ENSURE(frame, { rb_rescue2(sl_ruby_protect_try, (VALUE)&args, sl_ruby_protect_catch, (VALUE)&args, rb_eException, 0); pthread_mutex_unlock(&sl_ruby_lock); if(args.exception) { SLVAL Ruby_Exception = sl_vm_store_get(vm, &cRuby_Exception); SLVAL err = sl_allocate(vm, Ruby_Exception); sl_error_set_message(vm, err, sl_ruby_to_slash(vm, rb_obj_as_string(args.exception))); sl_set_ivar(vm, err, sl_intern(vm, "object"), make_ruby_object(vm, args.exception)); args.sl_exception = err; } }, {