~eda-qa/leaflang/sdl

« back to all changes in this revision

Viewing changes to src/lang/expression_typer/builtin.cpp

  • Committer: edA-qa mort-ora-y
  • Date: 2018-03-09 08:24:51 UTC
  • Revision ID: eda-qa@disemia.com-20180309082451-t4npeesvwv0g1llu
add as_abi_ptr

Show diffs side-by-side

added added

removed removed

Lines of Context:
76
76
        auto er = make_shared<expr_transform>();
77
77
        er->transform = expr_transform::t_code_val;
78
78
        er->arg = bc.convert_expression( char_type, bc.args->sub[0].expr );
79
 
        er->construct_result_type();
 
79
        er->construct_result_type(bc.types());
80
80
        er->mark_resolved();
81
81
        return er;
82
82
}
93
93
        auto er = make_shared<expr_transform>();
94
94
        er->transform = expr_transform::t_char_val;
95
95
        er->arg = bc.convert_expression( charint, bc.args->sub[0].expr );
96
 
        er->construct_result_type();
 
96
        er->construct_result_type(bc.types());
97
97
        er->mark_resolved();
98
98
        return er;
99
99
}
331
331
        return block;
332
332
}
333
333
 
 
334
result builtin_as_abi_ptr( builtin_context & bc ) {
 
335
        DEBUG("as_abi_ptr");
 
336
        CHECK_THROW( bc, bc.expr, bc.args->sub.size() == 1, "mismatch-argcount",
 
337
                util::logger::item_actual(bc.args->sub.size()), util::logger::item_expect(1),
 
338
                util::logger::item_symbol(bc.expr->symbol));
 
339
 
 
340
        DEBUG("A");
 
341
        COND_PROC_EXPRESSION( bc.args->sub[0].expr, bc, bc.expr );
 
342
        auto value = bc.args->sub[0].expr;
 
343
        CHECK_THROW( bc, value, value->type.extr().is_value_ptr(), "require-value-ptr" );
 
344
        DEBUG("B");
 
345
 
 
346
        auto ts = make_shared<expr_transform>();
 
347
        ts->transform = expr_transform::t_abi_ptr;
 
348
        ts->arg = value;
 
349
        ts->construct_result_type(bc.types());
 
350
        ts->mark_resolved();
 
351
        bc.rewrite( bc.expr, ts );
 
352
        DEBUG("C", dump::get(ts), dump::get(bc.expr));
 
353
        return ts;
 
354
}
 
355
 
334
356
typedef bool (*check_op_type)( extr_type const & );
335
357
bool check_op_ibf( extr_type const & t ) {
336
358
        return t.is<intr_type_integer>() || t.is<intr_type_binary>() || t.is<intr_type_float>();
467
489
                func_map["create_range"] = func_entry( builtin_create_range );
468
490
                func_map["getopt"] = func_entry( builtin_getopt );
469
491
                func_map["trap"] = func_entry( builtin_trap );
 
492
                func_map["as_abi_ptr"] = func_entry( builtin_as_abi_ptr );
470
493
                
471
494
                func_map["map"] = func_entry( builtin_map );
472
495
                func_map["map"].require_args = false;
473
496
                func_map["foreach"] = func_entry( builtin_foreach );
474
497
                func_map["foreach"].require_args = false;
 
498
                
475
499
        }
476
500
} _fm_init;
477
501