00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include <lestes/lang/cplus/sem/or_ics.g.hh>
00035 #include <lestes/lang/cplus/sem/or_or.g.hh>
00036 #include <lestes/lang/cplus/sem/as_decl.g.hh>
00037 #include <lestes/lang/cplus/sem/or.g.hh>
00038 #include <lestes/lang/cplus/sem/ss_declaration.g.hh>
00039 #include <lestes/lang/cplus/sem/ss_statement.g.hh>
00040 #include <lestes/lang/cplus/sem/ss_decl_name.g.hh>
00041 #include <lestes/lang/cplus/sem/sa_decl_seq_compound_pair_creator.g.hh>
00042 #include <lestes/lang/cplus/sem/ss_misc.g.hh>
00043 #include <lestes/lang/cplus/sem/ss_type.g.hh>
00044 #include <lestes/lang/cplus/sem/ss_type_builtin.g.hh>
00045 #include <lestes/lang/cplus/sem/as_id_to_declaration_set.g.hh>
00046 #include <lestes/lang/cplus/sem/li_func_by_name.g.hh>
00047 #include <lestes/lang/cplus/sem/li_func_by_name_in_single_scope.g.hh>
00048 #include <lestes/lang/cplus/sem/sa_context.g.hh>
00049 #include <lestes/lang/cplus/sem/or.hh>
00050 #include <lestes/lang/cplus/sem/or_logger.hh>
00051 #include <lestes/msg/logger.hh>
00052 #include <lestes/std/dumper.hh>
00053
00054 package(lestes);
00055 package(lang);
00056 package(cplus);
00057 package(sem);
00058
00059 declare_logger( or_log );
00060 initialize_logger( or_log, "overload", or_logger );
00061
00062 typedef ::lestes::std::set< srp< ss_function_declaration > > func_decl_set;
00063 typedef ::lestes::std::list< srp< ss_declaration > > decl_list;
00064
00065 ptr< or_ics_functional > or_find_ics(ptr< or_or_functional > source, ptr< ss_type > target);
00066 bool is_not_worse_conv_seq(ptr< or_ics_functional > r1, ptr< or_or_functional > e1,ptr< or_ics_functional > r2, ptr< or_or_functional > e2);
00067 bool is_better_conv_seq (ptr< or_ics_functional > r1, ptr< or_or_functional > e1, ptr< or_ics_functional > r2, ptr< or_or_functional > e2);
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079 bool exists_ics_conversion (ptr< ss_function_declaration > candidate, ptr< exprlist > exprs)
00080 {
00081 ptr< decl_list > params = candidate->parameters_get()->contents_get();
00082 decl_list::iterator it = params->begin();
00083 ::lestes::std::list< srp< or_or_functional > >::iterator it_expr = exprs->begin();
00084
00085 for(; it_expr != exprs->end() && it != params->end(); ++it, ++it_expr) {
00086 if(!or_find_ics(*it_expr, (*it)->type_get()))
00087 return false;
00088 }
00089
00090
00091
00092
00093
00094
00095
00096 return true;
00097 }
00098
00099
00100
00101
00102
00103
00104
00105
00106 ptr< func_decl_set > filter_ics_existence(ptr< func_decl_set > candidates, ptr< exprlist > exprs)
00107 {
00108 ptr< func_decl_set > new_cands = func_decl_set::create();
00109
00110 func_decl_set::iterator it = candidates->begin(), it_end = candidates->end();
00111
00112 for (it = candidates->begin(); it != it_end; ++it) {
00113 if (exists_ics_conversion(*it, exprs))
00114 new_cands->insert(*it);
00115
00116 }
00117 return new_cands;
00118 }
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 ptr< func_decl_set > filter_num_args(ptr< func_decl_set > candidates, decl_list::size_type num_args)
00130 {
00131 ptr< func_decl_set > filtered = func_decl_set::create();
00132
00133 func_decl_set::iterator it = candidates->begin();
00134
00135 for(; it != candidates->end(); ++it) {
00136 if((*it)->parameters_get()->contents_get()->size() == num_args) {
00137 filtered->insert(*it);
00138 } else if ((*it)->parameters_get()->contents_get()->size() > num_args) {
00139
00140
00141
00142
00143 }
00144
00145
00146
00147
00148
00149 }
00150 return filtered;
00151 }
00152
00153
00154
00155
00156
00157
00158
00159
00160 ptr< func_decl_set > select_viable(ptr< func_decl_set > candidates, ptr< exprlist > exprs)
00161 {
00162 llog(or_log) << "Filtering according to num of arguments\n";
00163
00164 ptr< func_decl_set > enough_arg_funcs = filter_num_args(candidates, exprs->size());
00165
00166 llog(or_log) << "Selected " << enough_arg_funcs->size() << " enough-arg funcs\n";
00167
00168 return filter_ics_existence(enough_arg_funcs, exprs);
00169 }
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180 bool is_better_function(ptr< ss_function_declaration > f, ptr< ss_function_declaration > g, ptr< exprlist > exprs)
00181 {
00182
00183
00184 ptr< decl_list > params_f = f->parameters_get()->contents_get();
00185 decl_list::iterator it_f_param = params_f->begin();
00186
00187 ptr< decl_list > params_g = g->parameters_get()->contents_get();
00188 decl_list::iterator it_g_param = params_g->begin();
00189
00190 exprlist::iterator it_exprs = exprs->begin();
00191
00192
00193 for(; it_f_param != params_f->end() && it_g_param != params_g->end() && it_exprs != exprs->end();
00194 ++it_f_param, ++it_g_param, ++it_exprs) {
00195 ptr< or_ics_functional > f_func, g_func;
00196
00197 f_func = or_find_ics((*it_exprs), (*it_f_param)->type_get());
00198 g_func = or_find_ics((*it_exprs), (*it_g_param)->type_get());
00199
00200 if(!is_not_worse_conv_seq(f_func, (*it_exprs), g_func, (*it_exprs))) {
00201 return false;
00202 }
00203 }
00204 for(it_f_param = params_f->begin(), it_g_param = params_g->begin(), it_exprs = exprs->begin();
00205 it_f_param != params_f->end() && it_g_param != params_g->end() && it_exprs != exprs->end();
00206 ++it_f_param, ++it_g_param, ++it_exprs) {
00207 ptr< or_ics_functional > f_func, g_func;
00208
00209 f_func = or_find_ics((*it_exprs), (*it_f_param)->type_get());
00210 g_func = or_find_ics((*it_exprs), (*it_g_param)->type_get());
00211
00212 if(is_better_conv_seq(f_func, (*it_exprs), g_func, (*it_exprs))){
00213 return true;
00214 }
00215 }
00216
00217
00218
00219
00220
00221
00222
00223 return false;
00224 }
00225
00226
00227
00228
00229
00230
00231
00232 ptr< or_or_functional > best_selection(ptr< func_decl_set > viables, ptr< exprlist > exprs)
00233 {
00234 func_decl_set::iterator it = viables->begin();
00235 ptr< ss_function_declaration > best = *it;
00236 bool was_better = true;
00237
00238 if (viables->size() == 0) {
00239
00240 return or_or_functional_noviable::create(ss_void::instance());
00241 }
00242 for(++it; it != viables->end(); ++it) {
00243 if(is_better_function(best, *it, exprs)) {
00244 llog(or_logger) << "1: true\n";
00245 was_better = true;
00246 } else if (is_better_function(*it, best, exprs)) {
00247 llog(or_logger) << "2: true\n";
00248 was_better = true;
00249 best = *it;
00250 } else {
00251 llog(or_logger) << "3: false\n";
00252 was_better = false;
00253 }
00254 }
00255
00256 it = viables->begin();
00257 for(++it; it != viables->end(); ++it) {
00258 if(!((*it)->equals(best)) && !is_better_function(*it, best, exprs) && !is_better_function(best, *it, exprs))
00259 return or_or_functional_ambiguous::create(best->type_get().dncast<ss_function>()->returns_get(), viables);
00260 }
00261
00262 return or_or_functional_concrete::create(best->type_get().dncast<ss_function>()->returns_get(), exprs, best);
00263 }
00264
00265
00266
00267
00268
00269
00270 ptr< func_decl_set > collect_candidates(ptr< ss_operator > func_name, ptr< ss_decl_seq > ctxt)
00271 {
00272 ptr< li_func_by_name > lookup = li_func_by_name::create();
00273 ptr< li_func_by_name_in_single_scope > lookup_builtin = li_func_by_name_in_single_scope::create();
00274 ptr< func_decl_set > res_lu, res_builtin;
00275 func_decl_set::iterator it;
00276
00277
00278 llog(or_log) << "Looking it up in the current scope\n";
00279
00280 res_lu = lookup->process(func_name, ctxt);
00281
00282 if (res_lu->empty()) {
00283 llog(or_log) << "Found nothing\n";
00284 }
00285
00286 llog(or_log) << "Looking it up in the builtin op scope\n";
00287 res_builtin = lookup_builtin->process(func_name, or_builtin_operator_declaration_creator::instance()->builtin_op_decl_seq_get());
00288
00289
00290 if (!res_builtin->empty()) {
00291 llog(or_log) << "Found something, pushing into return list\n";
00292
00293 it = res_builtin->begin();
00294 for(; it != res_builtin->end(); it++){
00295 res_lu->insert(*it);
00296 }
00297 }
00298
00299 return res_lu;
00300 }
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313 ptr< or_or_functional > overload_resolution (ptr< exprlist > exprs, ptr< ss_operator > func_name)
00314 {
00315
00316
00317
00318
00319
00320 ptr< ss_decl_seq > ctxt = sa_context_manager::instance()->current()->ss_get()->scope_get();
00321
00322 llog(or_log) << "Before collect candidates\n";
00323
00324 ptr< func_decl_set > candidates = collect_candidates(func_name, ctxt);
00325
00326 llog(or_log) << "Done, selected " << candidates->size() << " candidates\n";
00327
00328 ptr< func_decl_set > viable_candidates = select_viable(candidates, exprs);
00329
00330 llog(or_log) << "After viable candidates selection, selected " << viable_candidates->size() << " viable\n";
00331
00332
00333
00334
00335
00336
00337
00338
00339 if (viable_candidates->size() == 0) {
00340 return NULL;
00341 }
00342 return best_selection(viable_candidates, exprs);
00343 }
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 ptr< or_or_functional > overload_resolution (ptr< exprlist > exprs, ptr< func_decl_set > candidates)
00361 {
00362 ptr< func_decl_set > viable_candidates = select_viable(candidates, exprs);
00363
00364 return best_selection(viable_candidates, exprs);
00365 }
00366
00367
00368
00369
00370
00371
00372
00373
00374
00375
00376
00377 ptr< or_builtin_operator_declaration_creator > or_builtin_operator_declaration_creator::instance()
00378 {
00379 if (!the_instance) {
00380
00381
00382
00383
00384
00385
00386
00387 ptr< ss_decl_seq > builtin_op_decl_seq = sa_decl_seq_compound_pair_creator::instance()->process(
00388 source_location::zero(),
00389 ss_decl_seq::root_instance(),
00390 ss_compound_stmt::root_instance()
00391 )->first;
00392 builtin_op_decl_seq->dump_barrier_set(true);
00393
00394
00395
00396 ptr<ss_declaration> gl_decl = ss_namespace_definition::create(source_location::zero(), ss_declaration_time::infinity(), ss_declaration_time::create(0),
00397 ss_dummy_name::create(source_location::zero()), ss_decl_seq::root_instance(), ss_void::instance(),
00398 ss_linkage::create("C++", ss_linkage::LINKAGE_NO), builtin_op_decl_seq );
00399 builtin_op_decl_seq->declared_by_set( gl_decl );
00400 ss_decl_seq::root_instance()->contents_get()->push_back( gl_decl );
00401
00402 the_instance = new or_builtin_operator_declaration_creator(builtin_op_decl_seq);
00403
00404
00405
00406
00407
00408
00409 BUILTIN_DECL_SEQ_INIT();
00410
00411
00412
00413 }
00414
00415 return the_instance;
00416 }
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426 void or_builtin_operator_declaration_creator::construct_builtin_op(ptr< ss_decl_name > op, ptr< ::lestes::std::list< srp< ss_type > > > types, ptr< ss_type > return_type)
00427 {
00428 typedef ::lestes::std::list< srp< ss_type > > typelist;
00429 typedef ::lestes::std::set< srp< ss_struct_base > > structlist;
00430 ::lestes::std::list< srp< ss_type > >::iterator it_d = types->begin();
00431 ptr< typelist > paramlist = types;
00432 ptr< structlist > friend_of = structlist::create();
00433 ptr< ss_decl_seq > parameter_decls;
00434
00435
00436 ptr< ss_type > func_type = ss_function::instance(return_type, paramlist, false);
00437
00438
00439
00440 ptr< ss_decl_seq > builtin_op_params_decl_seq = sa_decl_seq_compound_pair_creator::instance()->process(
00441 source_location::zero(),
00442 ss_decl_seq::root_instance(),
00443 ss_compound_stmt::root_instance()
00444 )->first;
00445
00446
00447
00448 ptr< ss_dummy_name > param_name = ss_dummy_name::create(source_location::zero());
00449
00450 lint pos = 1;
00451 for(; it_d != types->end(); it_d++, pos++) {
00452
00453 ptr< ss_parameter_declaration > p_decl = ss_parameter_declaration::create (
00454 source_location::zero(),
00455 ss_declaration_time::create(source_location::zero()->order_get()),
00456 ss_declaration_time::create(source_location::zero()->order_get()),
00457 param_name,
00458 builtin_op_params_decl_seq,
00459 *it_d,
00460 ss_linkage::create("C++", ss_linkage::LINKAGE_EXTERNAL),
00461 ss_declaration_time::infinity(),
00462 NULL,
00463 pos
00464 );
00465 builtin_op_params_decl_seq->contents_get()->push_back(p_decl);
00466 }
00467
00468 ptr< ss_builtin_operator_declaration > op_decl = ss_builtin_operator_declaration::create (
00469 source_location::zero(),
00470 ss_declaration_time::create(source_location::zero()->order_get()),
00471 ss_declaration_time::create(source_location::zero()->order_get()),
00472 op,
00473 builtin_op_decl_seq,
00474 func_type,
00475 ss_linkage::create("C++", ss_linkage::LINKAGE_EXTERNAL),
00476 builtin_op_params_decl_seq,
00477 NULL
00478 );
00479
00480 builtin_op_params_decl_seq->declared_by_set(op_decl);
00481
00482 builtin_op_decl_seq->contents_get()->push_back(op_decl);
00483 }
00484
00485
00486
00487
00488 void or_builtin_operator_declaration_creator::visit_ss_operator_assign( ptr< ss_operator_assign >)
00489 {
00490 }
00491
00492 void or_builtin_operator_declaration_creator::visit_ss_operator_comma( ptr< ss_operator_comma > )
00493 {
00494 }
00495
00496 void or_builtin_operator_declaration_creator::visit_ss_dummy_name( ptr< ss_dummy_name> )
00497 {
00498 }
00499
00500 void or_builtin_operator_declaration_creator::visit_ss_operator_function_call( ptr< ss_operator_function_call >)
00501 {
00502 }
00503
00504 void or_builtin_operator_declaration_creator::visit_ss_operator_array( ptr< ss_operator_array >)
00505 {
00506 }
00507
00508 void or_builtin_operator_declaration_creator::visit_ss_operator_access( ptr< ss_operator_access >)
00509 {
00510 }
00511 void or_builtin_operator_declaration_creator::visit_ss_operator_access_member( ptr< ss_operator_access_member >)
00512 {
00513 }
00514
00515 void or_builtin_operator_declaration_creator::visit_ss_operator_land( ptr< ss_operator_land >)
00516 {
00517 }
00518
00519 void or_builtin_operator_declaration_creator::visit_ss_operator_lor( ptr< ss_operator_lor >)
00520 {
00521 }
00522
00523 void or_builtin_operator_declaration_creator::visit_ss_operator_ternary( ptr< ss_operator_ternary >)
00524 {
00525 }
00526
00527 void or_builtin_operator_declaration_creator::visit_ss_ordinary_name( ptr< ss_ordinary_name >)
00528 {
00529 }
00530
00531 void or_builtin_operator_declaration_creator::visit_ss_conversion_name( ptr< ss_conversion_name >)
00532 {
00533 }
00534 void or_builtin_operator_declaration_creator::visit_ss_operator_new( ptr< ss_operator_new >)
00535 {
00536 }
00537
00538 void or_builtin_operator_declaration_creator::visit_ss_operator_delete( ptr< ss_operator_delete >)
00539 {
00540 }
00541
00542 void or_builtin_operator_declaration_creator::visit_ss_operator_new_array( ptr< ss_operator_new_array >)
00543 {
00544 }
00545
00546 void or_builtin_operator_declaration_creator::visit_ss_operator_delete_array( ptr< ss_operator_delete_array >)
00547 {
00548 }
00549 void or_builtin_operator_declaration_creator::visit_ss_operator_add( ptr< ss_operator_add >)
00550 {
00551 }
00552
00553 void or_builtin_operator_declaration_creator::visit_ss_operator_sub( ptr< ss_operator_sub >)
00554 {
00555 }
00556
00557 void or_builtin_operator_declaration_creator::visit_ss_operator_mul( ptr< ss_operator_mul >)
00558 {
00559 }
00560
00561 void or_builtin_operator_declaration_creator::visit_ss_operator_div( ptr< ss_operator_div >)
00562 {
00563 }
00564
00565 void or_builtin_operator_declaration_creator::visit_ss_operator_mod( ptr< ss_operator_mod >)
00566 {
00567 }
00568
00569 void or_builtin_operator_declaration_creator::visit_ss_operator_bxor( ptr< ss_operator_bxor >)
00570 {
00571 }
00572
00573 void or_builtin_operator_declaration_creator::visit_ss_operator_band( ptr< ss_operator_band >)
00574 {
00575 }
00576
00577 void or_builtin_operator_declaration_creator::visit_ss_operator_bor( ptr< ss_operator_bor >)
00578 {
00579 }
00580 void or_builtin_operator_declaration_creator::visit_ss_operator_shr( ptr< ss_operator_shr >)
00581 {
00582 }
00583
00584 void or_builtin_operator_declaration_creator::visit_ss_operator_shl( ptr< ss_operator_shl >)
00585 {
00586 }
00587
00588 void or_builtin_operator_declaration_creator::visit_ss_operator_sbl( ptr< ss_operator_sbl >)
00589 {
00590 }
00591
00592 void or_builtin_operator_declaration_creator::visit_ss_operator_sbg( ptr< ss_operator_sbg >)
00593 {
00594 }
00595
00596 void or_builtin_operator_declaration_creator::visit_ss_operator_sbng( ptr< ss_operator_sbng >)
00597 {
00598 }
00599
00600 void or_builtin_operator_declaration_creator::visit_ss_operator_sbnl( ptr< ss_operator_sbnl >)
00601 {
00602 }
00603
00604 void or_builtin_operator_declaration_creator::visit_ss_operator_sbe( ptr< ss_operator_sbe >)
00605 {
00606 }
00607
00608 void or_builtin_operator_declaration_creator::visit_ss_operator_sbne( ptr< ss_operator_sbne >)
00609 {
00610 }
00611 void or_builtin_operator_declaration_creator::visit_ss_operator_bnot( ptr< ss_operator_bnot >)
00612 {
00613 }
00614
00615 void or_builtin_operator_declaration_creator::visit_ss_operator_lnot( ptr< ss_operator_lnot >)
00616 {
00617 }
00618 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_add( ptr< ss_operator_assign_add >)
00619 {
00620 }
00621
00622 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_sub( ptr< ss_operator_assign_sub >)
00623 {
00624 }
00625
00626 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_mul( ptr< ss_operator_assign_mul >)
00627 {
00628 }
00629
00630 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_div( ptr< ss_operator_assign_div >)
00631 {
00632 }
00633
00634 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_mod( ptr< ss_operator_assign_mod >)
00635 {
00636 }
00637
00638 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_bxor( ptr< ss_operator_assign_bxor >)
00639 {
00640 }
00641
00642 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_band( ptr< ss_operator_assign_band >)
00643 {
00644 }
00645
00646 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_bor( ptr< ss_operator_assign_bor >)
00647 {
00648 }
00649
00650 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_shl( ptr< ss_operator_assign_shl >)
00651 {
00652 }
00653
00654 void or_builtin_operator_declaration_creator::visit_ss_operator_assign_shr( ptr< ss_operator_assign_shr >)
00655 {
00656 }
00657 void or_builtin_operator_declaration_creator::visit_ss_operator_inc( ptr< ss_operator_inc >)
00658 {
00659 }
00660
00661 void or_builtin_operator_declaration_creator::visit_ss_operator_dec( ptr< ss_operator_dec >)
00662 {
00663 }
00664
00665 end_package(sem);
00666 end_package(cplus);
00667 end_package(lang);
00668 end_package(lestes);
00669