forked from M-Labs/nac3
core: irrt test remove unrecognized test
This commit is contained in:
parent
23ed5642fb
commit
867f6ccf8e
|
@ -13,7 +13,6 @@
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
run_test_core();
|
run_test_core();
|
||||||
run_test_print();
|
|
||||||
run_test_utils();
|
run_test_utils();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -578,10 +578,10 @@ impl<'ctx, 'a> CodeGenContext<'ctx, 'a> {
|
||||||
) {
|
) {
|
||||||
let error_id = self.resolver.get_string_id(name);
|
let error_id = self.resolver.get_string_id(name);
|
||||||
let error_id = self.ctx.i32_type().const_int(error_id as u64, false);
|
let error_id = self.ctx.i32_type().const_int(error_id as u64, false);
|
||||||
self.raise_exn_impl(generator, error_id, msg, params, loc);
|
self.raise_exn_by_id(generator, error_id, msg, params, loc);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn raise_exn_impl<G: CodeGenerator + ?Sized>(
|
pub fn raise_exn_by_id<G: CodeGenerator + ?Sized>(
|
||||||
&mut self,
|
&mut self,
|
||||||
generator: &mut G,
|
generator: &mut G,
|
||||||
error_id: IntValue<'ctx>,
|
error_id: IntValue<'ctx>,
|
||||||
|
@ -666,6 +666,32 @@ impl<'ctx, 'a> CodeGenContext<'ctx, 'a> {
|
||||||
self.raise_exn(generator, err_name, err_msg, params, loc);
|
self.raise_exn(generator, err_name, err_msg, params, loc);
|
||||||
self.builder.position_at_end(then_block);
|
self.builder.position_at_end(then_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn make_assert_impl_by_id<G: CodeGenerator + ?Sized>(
|
||||||
|
&mut self,
|
||||||
|
generator: &mut G,
|
||||||
|
cond: IntValue<'ctx>,
|
||||||
|
err_id: IntValue<'ctx>,
|
||||||
|
err_msg: BasicValueEnum<'ctx>,
|
||||||
|
params: [Option<IntValue<'ctx>>; 3],
|
||||||
|
loc: Location,
|
||||||
|
) {
|
||||||
|
let i1 = self.ctx.bool_type();
|
||||||
|
let i1_true = i1.const_all_ones();
|
||||||
|
// we assume that the condition is most probably true, so the normal path is the most
|
||||||
|
// probable path
|
||||||
|
// even if this assumption is violated, it does not matter as exception unwinding is
|
||||||
|
// slow anyway...
|
||||||
|
let cond = call_expect(self, cond, i1_true, Some("expect"));
|
||||||
|
let current_bb = self.builder.get_insert_block().unwrap();
|
||||||
|
let current_fun = current_bb.get_parent().unwrap();
|
||||||
|
let then_block = self.ctx.insert_basic_block_after(current_bb, "succ");
|
||||||
|
let exn_block = self.ctx.append_basic_block(current_fun, "fail");
|
||||||
|
self.builder.build_conditional_branch(cond, then_block, exn_block).unwrap();
|
||||||
|
self.builder.position_at_end(exn_block);
|
||||||
|
self.raise_exn_by_id(generator, err_id, err_msg, params, loc);
|
||||||
|
self.builder.position_at_end(then_block);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// See [`CodeGenerator::gen_constructor`].
|
/// See [`CodeGenerator::gen_constructor`].
|
||||||
|
|
|
@ -123,6 +123,7 @@ impl<'ctx> StructureOptic<'ctx> for ErrorIdsLens {
|
||||||
|
|
||||||
pub struct ErrorContextFields<'ctx> {
|
pub struct ErrorContextFields<'ctx> {
|
||||||
pub error_ids: GepGetter<AddressLens<ErrorIdsLens>>,
|
pub error_ids: GepGetter<AddressLens<ErrorIdsLens>>,
|
||||||
|
pub error_id: GepGetter<IntLens<'ctx>>,
|
||||||
pub message_template: GepGetter<AddressLens<IntLens<'ctx>>>,
|
pub message_template: GepGetter<AddressLens<IntLens<'ctx>>>,
|
||||||
pub param1: GepGetter<IntLens<'ctx>>,
|
pub param1: GepGetter<IntLens<'ctx>>,
|
||||||
pub param2: GepGetter<IntLens<'ctx>>,
|
pub param2: GepGetter<IntLens<'ctx>>,
|
||||||
|
@ -145,6 +146,7 @@ impl<'ctx> StructureOptic<'ctx> for ErrorContextLens {
|
||||||
) -> Self::Fields {
|
) -> Self::Fields {
|
||||||
ErrorContextFields {
|
ErrorContextFields {
|
||||||
error_ids: builder.add_field("error_ids", AddressLens(ErrorIdsLens)),
|
error_ids: builder.add_field("error_ids", AddressLens(ErrorIdsLens)),
|
||||||
|
error_id: builder.add_field("error_id", IntLens(builder.ctx.i32_type())),
|
||||||
message_template: builder
|
message_template: builder
|
||||||
.add_field("message_template", AddressLens(IntLens(builder.ctx.i8_type()))),
|
.add_field("message_template", AddressLens(IntLens(builder.ctx.i8_type()))),
|
||||||
param1: builder.add_field("param1", IntLens(builder.ctx.i64_type())),
|
param1: builder.add_field("param1", IntLens(builder.ctx.i64_type())),
|
||||||
|
|
|
@ -135,41 +135,48 @@ pub fn call_nac3_error_context_get_error_str<'ctx>(
|
||||||
.returning("has_error", &IntLens(ctx.ctx.bool_type()))
|
.returning("has_error", &IntLens(ctx.ctx.bool_type()))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn call_nac3_dummy_raise<'ctx>(
|
pub fn prepare_error_context<'ctx>(
|
||||||
ctx: &CodeGenContext<'ctx, '_>,
|
ctx: &CodeGenContext<'ctx, '_>,
|
||||||
errctx: &Address<'ctx, ErrorContextLens>,
|
) -> Address<'ctx, ErrorContextLens> {
|
||||||
) {
|
let error_ids = build_error_ids(ctx);
|
||||||
FunctionBuilder::begin(ctx, "__nac3_error_dummy_raise")
|
let errctx_ptr = ErrorContextLens.alloca(ctx, "errctx");
|
||||||
.arg("errctx", &AddressLens(ErrorContextLens), errctx)
|
call_nac3_error_context_initialize(ctx, &errctx_ptr, &error_ids);
|
||||||
.returning_void();
|
errctx_ptr
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn test_dummy_raise<G: CodeGenerator + ?Sized>(
|
pub fn check_error_context<'ctx, G: CodeGenerator + ?Sized>(
|
||||||
generator: &mut G,
|
generator: &mut G,
|
||||||
ctx: &mut CodeGenContext<'_, '_>,
|
ctx: &mut CodeGenContext<'ctx, '_>,
|
||||||
|
errctx_ptr: &Address<'ctx, ErrorContextLens>,
|
||||||
) {
|
) {
|
||||||
let size_type = generator.get_size_type(ctx.ctx);
|
let size_type = generator.get_size_type(ctx.ctx);
|
||||||
|
|
||||||
let error_ids = build_error_ids(ctx);
|
let has_error = call_nac3_error_context_has_no_error(ctx, errctx_ptr);
|
||||||
let errctx_ptr = ErrorContextLens.alloca(ctx, "errctx");
|
|
||||||
|
|
||||||
call_nac3_error_context_initialize(ctx, &errctx_ptr, &error_ids);
|
|
||||||
call_nac3_dummy_raise(ctx, &errctx_ptr);
|
|
||||||
|
|
||||||
let has_error = call_nac3_error_context_has_no_error(ctx, &errctx_ptr);
|
|
||||||
let error_str_ptr = StrLens { size_type }.alloca(ctx, "error_str");
|
let error_str_ptr = StrLens { size_type }.alloca(ctx, "error_str");
|
||||||
call_nac3_error_context_get_error_str(size_type, ctx, &errctx_ptr, &error_str_ptr);
|
call_nac3_error_context_get_error_str(size_type, ctx, errctx_ptr, &error_str_ptr);
|
||||||
|
|
||||||
|
let error_id = errctx_ptr.view(ctx, |fields| &fields.error_id).load(ctx, "error_id");
|
||||||
let error_str = error_str_ptr.load(ctx, "error_str");
|
let error_str = error_str_ptr.load(ctx, "error_str");
|
||||||
let param1 = errctx_ptr.view(ctx, |fields| &fields.param1).load(ctx, "param1");
|
let param1 = errctx_ptr.view(ctx, |fields| &fields.param1).load(ctx, "param1");
|
||||||
let param2 = errctx_ptr.view(ctx, |fields| &fields.param2).load(ctx, "param2");
|
let param2 = errctx_ptr.view(ctx, |fields| &fields.param2).load(ctx, "param2");
|
||||||
let param3 = errctx_ptr.view(ctx, |fields| &fields.param3).load(ctx, "param3");
|
let param3 = errctx_ptr.view(ctx, |fields| &fields.param3).load(ctx, "param3");
|
||||||
ctx.make_assert_impl(
|
ctx.make_assert_impl_by_id(
|
||||||
generator,
|
generator,
|
||||||
has_error,
|
has_error,
|
||||||
"0:RuntimeError", // TODO: Make this dynamic (within IRRT), but this is probably not trivial
|
error_id,
|
||||||
error_str.get_llvm_value(),
|
error_str.get_llvm_value(),
|
||||||
[Some(param1), Some(param2), Some(param3)],
|
[Some(param1), Some(param2), Some(param3)],
|
||||||
ctx.current_loc,
|
ctx.current_loc,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn call_nac3_dummy_raise<G: CodeGenerator + ?Sized>(
|
||||||
|
generator: &mut G,
|
||||||
|
ctx: &mut CodeGenContext,
|
||||||
|
) {
|
||||||
|
let errctx = prepare_error_context(ctx);
|
||||||
|
FunctionBuilder::begin(ctx, "__nac3_error_dummy_raise")
|
||||||
|
.arg("errctx", &AddressLens(ErrorContextLens), &errctx)
|
||||||
|
.returning_void();
|
||||||
|
check_error_context(generator, ctx, &errctx);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue