LLVMValueRef gendesc_isnominal(compile_t* c, LLVMValueRef desc, ast_t* type) { ast_t* def = (ast_t*)ast_data(type); switch(ast_id(def)) { case TK_STRUCT: // The type system has ensured that at this stage the operand must be // the pattern type. return LLVMConstInt(c->i1, 1, false); case TK_INTERFACE: case TK_TRAIT: return gendesc_istrait(c, desc, type); case TK_PRIMITIVE: case TK_CLASS: case TK_ACTOR: return gendesc_isentity(c, desc, type); default: {} } assert(0); return GEN_NOVALUE; }
static LLVMValueRef raw_is_box(compile_t* c, ast_t* left_type, LLVMValueRef l_value, LLVMValueRef r_value) { pony_assert(LLVMGetTypeKind(LLVMTypeOf(r_value)) == LLVMPointerTypeKind); LLVMValueRef r_desc = gendesc_fetch(c, r_value); LLVMValueRef same_type = gendesc_isentity(c, r_desc, left_type); pony_assert(same_type != GEN_NOVALUE); LLVMBasicBlockRef this_block = LLVMGetInsertBlock(c->builder); LLVMBasicBlockRef value_block = codegen_block(c, "is_value"); LLVMBasicBlockRef post_block = codegen_block(c, "is_post"); LLVMBuildCondBr(c->builder, same_type, value_block, post_block); LLVMPositionBuilderAtEnd(c->builder, value_block); r_value = gen_unbox(c, left_type, r_value); LLVMValueRef is_value = gen_is_value(c, left_type, left_type, l_value, r_value); LLVMBuildBr(c->builder, post_block); value_block = LLVMGetInsertBlock(c->builder); LLVMPositionBuilderAtEnd(c->builder, post_block); LLVMValueRef phi = LLVMBuildPhi(c->builder, c->i1, ""); LLVMValueRef zero = LLVMConstInt(c->i1, 0, false); LLVMAddIncoming(phi, &is_value, &value_block, 1); LLVMAddIncoming(phi, &zero, &this_block, 1); return phi; }
LLVMValueRef gendesc_isnominal(compile_t* c, LLVMValueRef desc, ast_t* type) { ast_t* def = (ast_t*)ast_data(type); switch(ast_id(def)) { case TK_INTERFACE: case TK_TRAIT: return gendesc_istrait(c, desc, type); case TK_PRIMITIVE: case TK_CLASS: case TK_ACTOR: return gendesc_isentity(c, desc, type); default: {} } assert(0); return GEN_NOVALUE; }