00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "proj.h"
00023 #include "symbol.h"
00024 #include "bad.h"
00025 #include "bld.h"
00026 #include "com.h"
00027 #include "equiv.h"
00028 #include "global.h"
00029 #include "info.h"
00030 #include "intrin.h"
00031 #include "lex.h"
00032 #include "malloc.h"
00033 #include "src.h"
00034 #include "st.h"
00035 #include "storag.h"
00036 #include "target.h"
00037 #include "where.h"
00038
00039
00040
00041
00042
00043
00044
00045 #define FFESYMBOL_globalPROGUNIT_ 1
00046 #define FFESYMBOL_globalFILE_ 2
00047
00048
00049
00050
00051
00052 #define FFESYMBOL_globalCURRENT_ FFESYMBOL_globalPROGUNIT_
00053
00054
00055
00056 #if FFESYMBOL_globalCURRENT_ == FFESYMBOL_globalPROGUNIT_
00057 #define FFESYMBOL_SPACE_POOL_ ffe_pool_program_unit()
00058 #elif FFESYMBOL_globalCURRENT_ == FFESYMBOL_globalFILE_
00059 #define FFESYMBOL_SPACE_POOL_ ffe_pool_file()
00060 #else
00061 #error
00062 #endif
00063
00064
00065
00066 enum _ffesymbol_retractcommand_
00067 {
00068 FFESYMBOL_retractcommandDELETE_,
00069 FFESYMBOL_retractcommandRETRACT_,
00070 FFESYMBOL_retractcommand_
00071 };
00072 typedef enum _ffesymbol_retractcommand_ ffesymbolRetractCommand_;
00073
00074
00075
00076
00077 typedef struct _ffesymbol_retract_ *ffesymbolRetract_;
00078 struct _ffesymbol_retract_
00079 {
00080 ffesymbolRetract_ next;
00081 ffesymbolRetractCommand_ command;
00082 ffesymbol live;
00083 ffesymbol symbol;
00084 };
00085
00086 static ffebad ffesymbol_check_token_ (ffelexToken t, char *c);
00087 static void ffesymbol_kill_manifest_ (void);
00088 static ffesymbol ffesymbol_new_ (ffename n);
00089 static ffesymbol ffesymbol_unhook_ (ffesymbol s);
00090 static void ffesymbol_whine_state_ (ffebad bad, ffelexToken t, char c);
00091
00092
00093
00094
00095 static ffelexToken ffesymbol_token_blank_common_ = NULL;
00096 static ffelexToken ffesymbol_token_unnamed_main_ = NULL;
00097 static ffelexToken ffesymbol_token_unnamed_blockdata_ = NULL;
00098
00099
00100
00101 static ffenameSpace ffesymbol_global_ = NULL;
00102 static ffenameSpace ffesymbol_local_ = NULL;
00103 static ffenameSpace ffesymbol_sfunc_ = NULL;
00104
00105
00106
00107 static bool ffesymbol_retractable_ = FALSE;
00108 static mallocPool ffesymbol_retract_pool_;
00109 static ffesymbolRetract_ ffesymbol_retract_first_;
00110 static ffesymbolRetract_ *ffesymbol_retract_list_;
00111
00112
00113
00114 static const char *const ffesymbol_state_name_[] =
00115 {
00116 "?",
00117 "@",
00118 "&",
00119 "$",
00120 };
00121
00122
00123
00124 static const char *const ffesymbol_attr_name_[] =
00125 {
00126 #define DEFATTR(ATTR,ATTRS,NAME) NAME,
00127 #include "symbol.def"
00128 #undef DEFATTR
00129 };
00130
00131
00132
00133
00134
00135
00136
00137 static ffebad
00138 ffesymbol_check_token_ (ffelexToken t, char *c)
00139 {
00140 char *p = ffelex_token_text (t);
00141 ffeTokenLength len = ffelex_token_length (t);
00142 ffebad bad;
00143 ffeTokenLength i = 0;
00144 ffebad skip_me = ((ffe_case_symbol () == FFE_caseINITCAP)
00145 ? FFEBAD_SYMBOL_NOLOWER_INITCAP : FFEBAD + 1);
00146 ffebad stop_me = ((ffe_case_symbol () == FFE_caseINITCAP)
00147 ? FFEBAD : FFEBAD + 1);
00148 if (len == 0)
00149 return FFEBAD;
00150
00151 bad = ffesrc_bad_char_symbol_init (*p);
00152 if (bad == FFEBAD)
00153 {
00154 for (++i, ++p; i < len; ++i, ++p)
00155 {
00156 bad = ffesrc_bad_char_symbol_noninit (*p);
00157 if (bad == skip_me)
00158 continue;
00159 if (bad == stop_me)
00160 break;
00161 if (bad != FFEBAD)
00162 break;
00163 }
00164 }
00165
00166 if (bad != FFEBAD)
00167 {
00168 if (i >= len)
00169 *c = *(ffelex_token_text (t));
00170 else
00171 *c = *p;
00172 }
00173
00174 return bad;
00175 }
00176
00177
00178
00179 static void
00180 ffesymbol_kill_manifest_ ()
00181 {
00182 if (ffesymbol_token_blank_common_ != NULL)
00183 ffelex_token_kill (ffesymbol_token_blank_common_);
00184 if (ffesymbol_token_unnamed_main_ != NULL)
00185 ffelex_token_kill (ffesymbol_token_unnamed_main_);
00186 if (ffesymbol_token_unnamed_blockdata_ != NULL)
00187 ffelex_token_kill (ffesymbol_token_unnamed_blockdata_);
00188
00189 ffesymbol_token_blank_common_ = NULL;
00190 ffesymbol_token_unnamed_main_ = NULL;
00191 ffesymbol_token_unnamed_blockdata_ = NULL;
00192 }
00193
00194
00195
00196
00197
00198
00199
00200 static ffesymbol
00201 ffesymbol_new_ (ffename n)
00202 {
00203 ffesymbol s;
00204 ffesymbolRetract_ r;
00205
00206 assert (n != NULL);
00207
00208 s = (ffesymbol) malloc_new_ks (FFESYMBOL_SPACE_POOL_, "FFESYMBOL",
00209 sizeof (*s));
00210 s->name = n;
00211 s->other_space_name = NULL;
00212 #if FFEGLOBAL_ENABLED
00213 s->global = NULL;
00214 #endif
00215 s->attrs = FFESYMBOL_attrsetNONE;
00216 s->state = FFESYMBOL_stateNONE;
00217 s->info = ffeinfo_new_null ();
00218 s->dims = NULL;
00219 s->extents = NULL;
00220 s->dim_syms = NULL;
00221 s->array_size = NULL;
00222 s->init = NULL;
00223 s->accretion = NULL;
00224 s->accretes = 0;
00225 s->dummy_args = NULL;
00226 s->namelist = NULL;
00227 s->common_list = NULL;
00228 s->sfunc_expr = NULL;
00229 s->list_bottom = NULL;
00230 s->common = NULL;
00231 s->equiv = NULL;
00232 s->storage = NULL;
00233 #ifdef FFECOM_symbolHOOK
00234 s->hook = FFECOM_symbolNULL;
00235 #endif
00236 s->sfa_dummy_parent = NULL;
00237 s->func_result = NULL;
00238 s->value = 0;
00239 s->check_state = FFESYMBOL_checkstateNONE_;
00240 s->check_token = NULL;
00241 s->max_entry_num = 0;
00242 s->num_entries = 0;
00243 s->generic = FFEINTRIN_genNONE;
00244 s->specific = FFEINTRIN_specNONE;
00245 s->implementation = FFEINTRIN_impNONE;
00246 s->is_save = FALSE;
00247 s->is_init = FALSE;
00248 s->do_iter = FALSE;
00249 s->reported = FALSE;
00250 s->explicit_where = FALSE;
00251 s->namelisted = FALSE;
00252 s->assigned = FALSE;
00253
00254 ffename_set_symbol (n, s);
00255
00256 if (!ffesymbol_retractable_)
00257 {
00258 s->have_old = FALSE;
00259 return s;
00260 }
00261
00262 r = (ffesymbolRetract_) malloc_new_kp (ffesymbol_retract_pool_,
00263 "FFESYMBOL retract", sizeof (*r));
00264 r->next = NULL;
00265 r->command = FFESYMBOL_retractcommandDELETE_;
00266 r->live = s;
00267 r->symbol = NULL;
00268
00269 *ffesymbol_retract_list_ = r;
00270 ffesymbol_retract_list_ = &r->next;
00271
00272 s->have_old = TRUE;
00273 return s;
00274 }
00275
00276
00277
00278
00279
00280
00281 static ffesymbol
00282 ffesymbol_unhook_ (ffesymbol s)
00283 {
00284 s->other_space_name = s->name = NULL;
00285 if ((ffesymbol_attrs (s) & FFESYMBOL_attrsCBLOCK)
00286 || (ffesymbol_kind (s) == FFEINFO_kindNAMELIST))
00287 ffebld_end_list (ffesymbol_ptr_to_listbottom (s));
00288 if (s->check_state == FFESYMBOL_checkstatePENDING_)
00289 ffelex_token_kill (s->check_token);
00290
00291 return s;
00292 }
00293
00294
00295
00296
00297 static void
00298 ffesymbol_whine_state_ (ffebad bad, ffelexToken t, char c)
00299 {
00300 char badstr[2];
00301
00302 badstr[0] = c;
00303 badstr[1] = '\0';
00304
00305 ffebad_start (bad);
00306 ffebad_here (0, ffelex_token_where_line (t),
00307 ffelex_token_where_column (t));
00308 ffebad_string (badstr);
00309 ffebad_finish ();
00310 }
00311
00312
00313
00314 const char *
00315 ffesymbol_attrs_string (ffesymbolAttrs attrs)
00316 {
00317 static char string[FFESYMBOL_attr * 12 + 20];
00318 char *p;
00319 ffesymbolAttr attr;
00320
00321 p = &string[0];
00322
00323 if (attrs == FFESYMBOL_attrsetNONE)
00324 {
00325 strcpy (p, "NONE");
00326 return &string[0];
00327 }
00328
00329 for (attr = 0; attr < FFESYMBOL_attr; ++attr)
00330 {
00331 if (attrs & ((ffesymbolAttrs) 1 << attr))
00332 {
00333 attrs &= ~((ffesymbolAttrs) 1 << attr);
00334 strcpy (p, ffesymbol_attr_name_[attr]);
00335 while (*p)
00336 ++p;
00337 *(p++) = '|';
00338 }
00339 }
00340 if (attrs == FFESYMBOL_attrsetNONE)
00341 *--p = '\0';
00342 else
00343 sprintf (p, "?0x%" ffesymbolAttrs_f "x?", attrs);
00344 assert (((size_t) (p - &string[0])) < ARRAY_SIZE (string));
00345 return &string[0];
00346 }
00347
00348
00349
00350
00351 void
00352 ffesymbol_check (ffesymbol s, ffelexToken t, bool maybe_intrin)
00353 {
00354 char c;
00355 ffebad bad;
00356 ffeintrinGen gen;
00357 ffeintrinSpec spec;
00358 ffeintrinImp imp;
00359
00360 if (!ffesrc_check_symbol ()
00361 || ((s->check_state != FFESYMBOL_checkstateNONE_)
00362 && ((s->check_state != FFESYMBOL_checkstateINHIBITED_)
00363 || ffebad_inhibit ())))
00364 return;
00365
00366 bad = ffesymbol_check_token_ (t, &c);
00367
00368 if (bad == FFEBAD)
00369 {
00370 s->check_state = FFESYMBOL_checkstateCHECKED_;
00371 return;
00372 }
00373
00374 if (maybe_intrin
00375 && ffeintrin_is_intrinsic (ffelex_token_text (t), NULL, FALSE,
00376 &gen, &spec, &imp))
00377 {
00378 s->check_state = FFESYMBOL_checkstatePENDING_;
00379 s->check_token = ffelex_token_use (t);
00380 return;
00381 }
00382
00383 if (ffebad_inhibit ())
00384 {
00385 s->check_state = FFESYMBOL_checkstateINHIBITED_;
00386 return;
00387 }
00388
00389 s->check_state = FFESYMBOL_checkstateCHECKED_;
00390
00391 ffesymbol_whine_state_ (bad, t, c);
00392 }
00393
00394
00395
00396
00397
00398
00399
00400 ffesymbol
00401 ffesymbol_declare_blockdataunit (ffelexToken t, ffewhereLine wl,
00402 ffewhereColumn wc)
00403 {
00404 ffename n;
00405 ffesymbol s;
00406 bool user = (t != NULL);
00407
00408 assert (!ffesymbol_retractable_);
00409
00410 if (t == NULL)
00411 {
00412 if (ffesymbol_token_unnamed_blockdata_ == NULL)
00413 ffesymbol_token_unnamed_blockdata_
00414 = ffelex_token_new_name (FFETARGET_nameUNNAMED_BLOCK_DATA, wl, wc);
00415 t = ffesymbol_token_unnamed_blockdata_;
00416 }
00417
00418 n = ffename_lookup (ffesymbol_local_, t);
00419 if (n != NULL)
00420 return ffename_symbol (n);
00421
00422 n = ffename_find (ffesymbol_global_, t);
00423 s = ffename_symbol (n);
00424 if (s != NULL)
00425 {
00426 if (user)
00427 ffesymbol_check (s, t, FALSE);
00428 return s;
00429 }
00430
00431 s = ffesymbol_new_ (n);
00432 if (user)
00433 ffesymbol_check (s, t, FALSE);
00434
00435
00436
00437 n = ffename_find (ffesymbol_local_, t);
00438 ffename_set_symbol (n, s);
00439 s->other_space_name = n;
00440
00441 ffeglobal_new_blockdata (s, t);
00442
00443
00444 return s;
00445 }
00446
00447
00448
00449
00450
00451
00452
00453 ffesymbol
00454 ffesymbol_declare_cblock (ffelexToken t, ffewhereLine wl, ffewhereColumn wc)
00455 {
00456 ffename n;
00457 ffesymbol s;
00458 bool blank;
00459
00460 assert (!ffesymbol_retractable_);
00461
00462 if (t == NULL)
00463 {
00464 blank = TRUE;
00465 if (ffesymbol_token_blank_common_ == NULL)
00466 ffesymbol_token_blank_common_
00467 = ffelex_token_new_name (FFETARGET_nameBLANK_COMMON, wl, wc);
00468 t = ffesymbol_token_blank_common_;
00469 }
00470 else
00471 blank = FALSE;
00472
00473 n = ffename_find (ffesymbol_global_, t);
00474 s = ffename_symbol (n);
00475 if (s != NULL)
00476 {
00477 if (!blank)
00478 ffesymbol_check (s, t, FALSE);
00479 return s;
00480 }
00481
00482 s = ffesymbol_new_ (n);
00483 if (!blank)
00484 ffesymbol_check (s, t, FALSE);
00485
00486 ffeglobal_new_common (s, t, blank);
00487
00488 return s;
00489 }
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501 ffesymbol
00502 ffesymbol_declare_funcnotresunit (ffelexToken t)
00503 {
00504 ffename n;
00505 ffesymbol s;
00506
00507 assert (t != NULL);
00508 assert (!ffesymbol_retractable_);
00509
00510 n = ffename_lookup (ffesymbol_local_, t);
00511 if (n != NULL)
00512 return ffename_symbol (n);
00513
00514 n = ffename_find (ffesymbol_global_, t);
00515 s = ffename_symbol (n);
00516 if (s != NULL)
00517 {
00518 ffesymbol_check (s, t, FALSE);
00519 return s;
00520 }
00521
00522 s = ffesymbol_new_ (n);
00523 ffesymbol_check (s, t, FALSE);
00524
00525
00526
00527
00528 n = ffename_find (ffesymbol_local_, t);
00529 ffename_set_symbol (n, s);
00530 s->other_space_name = n;
00531
00532 ffeglobal_new_function (s, t);
00533
00534 return s;
00535 }
00536
00537
00538
00539
00540
00541
00542
00543 ffesymbol
00544 ffesymbol_declare_funcresult (ffelexToken t)
00545 {
00546 ffename n;
00547 ffesymbol s;
00548
00549 assert (t != NULL);
00550 assert (!ffesymbol_retractable_);
00551
00552 n = ffename_find (ffesymbol_local_, t);
00553 s = ffename_symbol (n);
00554 if (s != NULL)
00555 return s;
00556
00557 return ffesymbol_new_ (n);
00558 }
00559
00560
00561
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572 ffesymbol
00573 ffesymbol_declare_funcunit (ffelexToken t)
00574 {
00575 ffename n;
00576 ffesymbol s;
00577
00578 assert (t != NULL);
00579 assert (!ffesymbol_retractable_);
00580
00581 n = ffename_find (ffesymbol_global_, t);
00582 s = ffename_symbol (n);
00583 if (s != NULL)
00584 {
00585 ffesymbol_check (s, t, FALSE);
00586 return s;
00587 }
00588
00589 s = ffesymbol_new_ (n);
00590 ffesymbol_check (s, t, FALSE);
00591
00592 ffeglobal_new_function (s, t);
00593
00594 return s;
00595 }
00596
00597
00598
00599
00600
00601
00602
00603
00604
00605
00606 ffesymbol
00607 ffesymbol_declare_local (ffelexToken t, bool maybe_intrin)
00608 {
00609 ffename n;
00610 ffesymbol s;
00611
00612 assert (t != NULL);
00613
00614
00615
00616
00617
00618
00619
00620 if ((ffesymbol_sfunc_ != NULL)
00621 && ((n = ffename_lookup (ffesymbol_sfunc_, t)) != NULL))
00622 return ffename_symbol (n);
00623
00624 n = ffename_find (ffesymbol_local_, t);
00625 s = ffename_symbol (n);
00626 if (s != NULL)
00627 {
00628 ffesymbol_check (s, t, maybe_intrin);
00629 return s;
00630 }
00631
00632 s = ffesymbol_new_ (n);
00633 ffesymbol_check (s, t, maybe_intrin);
00634 return s;
00635 }
00636
00637
00638
00639
00640
00641
00642
00643 ffesymbol
00644 ffesymbol_declare_programunit (ffelexToken t, ffewhereLine wl,
00645 ffewhereColumn wc)
00646 {
00647 ffename n;
00648 ffesymbol s;
00649 bool user = (t != NULL);
00650
00651 assert (!ffesymbol_retractable_);
00652
00653 if (t == NULL)
00654 {
00655 if (ffesymbol_token_unnamed_main_ == NULL)
00656 ffesymbol_token_unnamed_main_
00657 = ffelex_token_new_name (FFETARGET_nameUNNAMED_MAIN, wl, wc);
00658 t = ffesymbol_token_unnamed_main_;
00659 }
00660
00661 n = ffename_lookup (ffesymbol_local_, t);
00662 if (n != NULL)
00663 return ffename_symbol (n);
00664
00665 n = ffename_find (ffesymbol_global_, t);
00666 s = ffename_symbol (n);
00667 if (s != NULL)
00668 {
00669 if (user)
00670 ffesymbol_check (s, t, FALSE);
00671 return s;
00672 }
00673
00674 s = ffesymbol_new_ (n);
00675 if (user)
00676 ffesymbol_check (s, t, FALSE);
00677
00678
00679
00680 n = ffename_find (ffesymbol_local_, t);
00681 ffename_set_symbol (n, s);
00682 s->other_space_name = n;
00683
00684 ffeglobal_new_program (s, t);
00685
00686 return s;
00687 }
00688
00689
00690
00691
00692
00693
00694
00695 ffesymbol
00696 ffesymbol_declare_sfdummy (ffelexToken t)
00697 {
00698 ffename n;
00699 ffesymbol s;
00700 ffesymbol sp;
00701
00702 assert (t != NULL);
00703
00704 n = ffename_find (ffesymbol_local_, t);
00705 sp = ffename_symbol (n);
00706 if (sp == NULL)
00707 sp = ffesymbol_new_ (n);
00708 ffesymbol_check (sp, t, FALSE);
00709
00710 n = ffename_find (ffesymbol_sfunc_, t);
00711 s = ffename_symbol (n);
00712 if (s == NULL)
00713 {
00714 s = ffesymbol_new_ (n);
00715 s->sfa_dummy_parent = sp;
00716 }
00717 else
00718 assert (s->sfa_dummy_parent == sp);
00719
00720 return s;
00721 }
00722
00723
00724
00725
00726
00727
00728
00729 ffesymbol
00730 ffesymbol_declare_subrunit (ffelexToken t)
00731 {
00732 ffename n;
00733 ffesymbol s;
00734
00735 assert (!ffesymbol_retractable_);
00736 assert (t != NULL);
00737
00738 n = ffename_lookup (ffesymbol_local_, t);
00739 if (n != NULL)
00740 return ffename_symbol (n);
00741
00742 n = ffename_find (ffesymbol_global_, t);
00743 s = ffename_symbol (n);
00744 if (s != NULL)
00745 {
00746 ffesymbol_check (s, t, FALSE);
00747 return s;
00748 }
00749
00750 s = ffesymbol_new_ (n);
00751 ffesymbol_check (s, t, FALSE);
00752
00753
00754
00755 n = ffename_find (ffesymbol_local_, t);
00756 ffename_set_symbol (n, s);
00757 s->other_space_name = n;
00758
00759 ffeglobal_new_subroutine (s, t);
00760
00761
00762 return s;
00763 }
00764
00765
00766
00767
00768
00769
00770 void
00771 ffesymbol_drive (ffesymbol (*fn) (ffesymbol))
00772 {
00773 assert (ffesymbol_sfunc_ == NULL);
00774
00775 ffename_space_drive_symbol (ffesymbol_local_, fn);
00776 ffename_space_drive_symbol (ffesymbol_global_, fn);
00777 }
00778
00779
00780
00781
00782
00783
00784 void
00785 ffesymbol_drive_sfnames (ffesymbol (*fn) (ffesymbol))
00786 {
00787 ffename_space_drive_symbol (ffesymbol_sfunc_, fn);
00788 }
00789
00790
00791
00792
00793
00794
00795 void
00796 ffesymbol_error (ffesymbol s, ffelexToken t)
00797 {
00798 if ((t != NULL)
00799 && ffest_ffebad_start (FFEBAD_SYMERR))
00800 {
00801 ffebad_string (ffesymbol_text (s));
00802 ffebad_here (0, ffelex_token_where_line (t),
00803 ffelex_token_where_column (t));
00804 ffebad_here (1, ffesymbol_where_line (s), ffesymbol_where_column (s));
00805 ffebad_finish ();
00806 }
00807
00808 if (ffesymbol_attr (s, FFESYMBOL_attrANY))
00809 return;
00810
00811 ffesymbol_signal_change (s);
00812 if ((ffesymbol_attrs (s) & FFESYMBOL_attrsCBLOCK)
00813 || (ffesymbol_kind (s) == FFEINFO_kindNAMELIST))
00814 ffebld_end_list (ffesymbol_ptr_to_listbottom (s));
00815 ffesymbol_set_attr (s, FFESYMBOL_attrANY);
00816 ffesymbol_set_info (s, ffeinfo_new_any ());
00817 ffesymbol_set_state (s, FFESYMBOL_stateUNDERSTOOD);
00818 if (s->check_state == FFESYMBOL_checkstatePENDING_)
00819 ffelex_token_kill (s->check_token);
00820 s->check_state = FFESYMBOL_checkstateCHECKED_;
00821 s = ffecom_sym_learned (s);
00822 ffesymbol_signal_unreported (s);
00823 }
00824
00825 void
00826 ffesymbol_init_0 ()
00827 {
00828 ffesymbolAttrs attrs = FFESYMBOL_attrsetNONE;
00829
00830 assert (FFESYMBOL_state == ARRAY_SIZE (ffesymbol_state_name_));
00831 assert (FFESYMBOL_attr == ARRAY_SIZE (ffesymbol_attr_name_));
00832 assert (attrs == FFESYMBOL_attrsetNONE);
00833 attrs = ((ffesymbolAttrs) 1 << FFESYMBOL_attr);
00834 assert (attrs != 0);
00835 }
00836
00837 void
00838 ffesymbol_init_1 ()
00839 {
00840 #if FFESYMBOL_globalCURRENT_ == FFESYMBOL_globalFILE_
00841 ffesymbol_global_ = ffename_space_new (ffe_pool_file ());
00842 #endif
00843 }
00844
00845 void
00846 ffesymbol_init_2 ()
00847 {
00848 }
00849
00850 void
00851 ffesymbol_init_3 ()
00852 {
00853 #if FFESYMBOL_globalCURRENT_ == FFESYMBOL_globalPROGUNIT_
00854 ffesymbol_global_ = ffename_space_new (ffe_pool_program_unit ());
00855 #endif
00856 ffesymbol_local_ = ffename_space_new (ffe_pool_program_unit ());
00857 }
00858
00859 void
00860 ffesymbol_init_4 ()
00861 {
00862 ffesymbol_sfunc_ = ffename_space_new (ffe_pool_program_unit ());
00863 }
00864
00865
00866
00867
00868
00869
00870 ffesymbol
00871 ffesymbol_lookup_local (ffelexToken t)
00872 {
00873 ffename n;
00874 ffesymbol s;
00875
00876 assert (t != NULL);
00877
00878 n = ffename_lookup (ffesymbol_local_, t);
00879 if (n == NULL)
00880 return NULL;
00881
00882 s = ffename_symbol (n);
00883 return s;
00884 }
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895 void
00896 ffesymbol_reference (ffesymbol s, ffelexToken t, bool explicit)
00897 {
00898 ffename gn;
00899 ffesymbol gs = NULL;
00900 ffeinfoKind kind;
00901 ffeinfoWhere where;
00902 bool okay;
00903
00904 if (ffesymbol_retractable_)
00905 return;
00906
00907 if (t == NULL)
00908 t = ffename_token (s->name);
00909
00910 kind = ffesymbol_kind (s);
00911 where = ffesymbol_where (s);
00912
00913 if (where == FFEINFO_whereINTRINSIC)
00914 {
00915 ffeglobal_ref_intrinsic (s, t,
00916 explicit
00917 || s->explicit_where
00918 || ffeintrin_is_standard (s->generic, s->specific));
00919 return;
00920 }
00921
00922 if ((where != FFEINFO_whereGLOBAL)
00923 && ((where != FFEINFO_whereLOCAL)
00924 || ((kind != FFEINFO_kindFUNCTION)
00925 && (kind != FFEINFO_kindSUBROUTINE))))
00926 return;
00927
00928 gn = ffename_lookup (ffesymbol_global_, t);
00929 if (gn != NULL)
00930 gs = ffename_symbol (gn);
00931 if ((gs != NULL) && (gs != s))
00932 {
00933
00934
00935
00936
00937
00938 ffesymbol_error (gs, t);
00939 ffesymbol_error (s, NULL);
00940 return;
00941 }
00942
00943 switch (kind)
00944 {
00945 case FFEINFO_kindBLOCKDATA:
00946 okay = ffeglobal_ref_blockdata (s, t);
00947 break;
00948
00949 case FFEINFO_kindSUBROUTINE:
00950 okay = ffeglobal_ref_subroutine (s, t);
00951 break;
00952
00953 case FFEINFO_kindFUNCTION:
00954 okay = ffeglobal_ref_function (s, t);
00955 break;
00956
00957 case FFEINFO_kindNONE:
00958 okay = ffeglobal_ref_external (s, t);
00959 break;
00960
00961 default:
00962 assert ("bad kind in global ref" == NULL);
00963 return;
00964 }
00965
00966 if (! okay)
00967 ffesymbol_error (s, NULL);
00968 }
00969
00970
00971
00972 void
00973 ffesymbol_resolve_intrin (ffesymbol s)
00974 {
00975 char c;
00976 ffebad bad;
00977
00978 if (!ffesrc_check_symbol ())
00979 return;
00980 if (s->check_state != FFESYMBOL_checkstatePENDING_)
00981 return;
00982 if (ffebad_inhibit ())
00983 return;
00984
00985 if (ffesymbol_where (s) != FFEINFO_whereINTRINSIC)
00986 {
00987 bad = ffesymbol_check_token_ (s->check_token, &c);
00988 assert (bad != FFEBAD);
00989 ffesymbol_whine_state_ (bad, s->check_token, c);
00990 }
00991
00992 s->check_state = FFESYMBOL_checkstateCHECKED_;
00993 ffelex_token_kill (s->check_token);
00994 }
00995
00996
00997
00998 void
00999 ffesymbol_retract (bool retract)
01000 {
01001 ffesymbolRetract_ r;
01002 ffename name;
01003 ffename other_space_name;
01004 ffesymbol ls;
01005 ffesymbol os;
01006
01007 assert (ffesymbol_retractable_);
01008
01009 ffesymbol_retractable_ = FALSE;
01010
01011 for (r = ffesymbol_retract_first_; r != NULL; r = r->next)
01012 {
01013 ls = r->live;
01014 os = r->symbol;
01015 switch (r->command)
01016 {
01017 case FFESYMBOL_retractcommandDELETE_:
01018 if (retract)
01019 {
01020 ffecom_sym_retract (ls);
01021 name = ls->name;
01022 other_space_name = ls->other_space_name;
01023 ffesymbol_unhook_ (ls);
01024 malloc_kill_ks (FFESYMBOL_SPACE_POOL_, ls, sizeof (*ls));
01025 if (name != NULL)
01026 ffename_set_symbol (name, NULL);
01027 if (other_space_name != NULL)
01028 ffename_set_symbol (other_space_name, NULL);
01029 }
01030 else
01031 {
01032 ffecom_sym_commit (ls);
01033 ls->have_old = FALSE;
01034 }
01035 break;
01036
01037 case FFESYMBOL_retractcommandRETRACT_:
01038 if (retract)
01039 {
01040 ffecom_sym_retract (ls);
01041 ffesymbol_unhook_ (ls);
01042 *ls = *os;
01043 malloc_kill_ks (FFESYMBOL_SPACE_POOL_, os, sizeof (*os));
01044 }
01045 else
01046 {
01047 ffecom_sym_commit (ls);
01048 ffesymbol_unhook_ (os);
01049 malloc_kill_ks (FFESYMBOL_SPACE_POOL_, os, sizeof (*os));
01050 ls->have_old = FALSE;
01051 }
01052 break;
01053
01054 default:
01055 assert ("bad command" == NULL);
01056 break;
01057 }
01058 }
01059 }
01060
01061
01062
01063 bool
01064 ffesymbol_retractable ()
01065 {
01066 return ffesymbol_retractable_;
01067 }
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077 void
01078 ffesymbol_set_retractable (mallocPool pool)
01079 {
01080 assert (!ffesymbol_retractable_);
01081
01082 ffesymbol_retractable_ = TRUE;
01083 ffesymbol_retract_pool_ = pool;
01084 ffesymbol_retract_list_ = &ffesymbol_retract_first_;
01085 ffesymbol_retract_first_ = NULL;
01086 }
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099 void
01100 ffesymbol_signal_change (ffesymbol s)
01101 {
01102 ffesymbolRetract_ r;
01103 ffesymbol sym;
01104
01105 if (!ffesymbol_retractable_ || s->have_old)
01106 return;
01107
01108 r = (ffesymbolRetract_) malloc_new_kp (ffesymbol_retract_pool_,
01109 "FFESYMBOL retract", sizeof (*r));
01110 r->next = NULL;
01111 r->command = FFESYMBOL_retractcommandRETRACT_;
01112 r->live = s;
01113 r->symbol = sym = (ffesymbol) malloc_new_ks (FFESYMBOL_SPACE_POOL_,
01114 "FFESYMBOL", sizeof (*sym));
01115 *sym = *s;
01116
01117 sym->info = ffeinfo_use (s->info);
01118 if (s->check_state == FFESYMBOL_checkstatePENDING_)
01119 sym->check_token = ffelex_token_use (s->check_token);
01120
01121 *ffesymbol_retract_list_ = r;
01122 ffesymbol_retract_list_ = &r->next;
01123
01124 s->have_old = TRUE;
01125 }
01126
01127
01128
01129 const char *
01130 ffesymbol_state_string (ffesymbolState state)
01131 {
01132 if (state >= ARRAY_SIZE (ffesymbol_state_name_))
01133 return "?\?\?";
01134 return ffesymbol_state_name_[state];
01135 }
01136
01137 void
01138 ffesymbol_terminate_0 ()
01139 {
01140 }
01141
01142 void
01143 ffesymbol_terminate_1 ()
01144 {
01145 #if FFESYMBOL_globalCURRENT_ == FFESYMBOL_globalFILE_
01146 ffename_space_drive_symbol (ffesymbol_global_, ffesymbol_unhook_);
01147 ffename_space_kill (ffesymbol_global_);
01148 ffesymbol_global_ = NULL;
01149
01150 ffesymbol_kill_manifest_ ();
01151 #endif
01152 }
01153
01154 void
01155 ffesymbol_terminate_2 ()
01156 {
01157 #if FFESYMBOL_globalCURRENT_ == FFESYMBOL_globalPROGUNIT_
01158 ffesymbol_kill_manifest_ ();
01159 #endif
01160 }
01161
01162 void
01163 ffesymbol_terminate_3 ()
01164 {
01165 #if FFESYMBOL_globalCURRENT_ == FFESYMBOL_globalPROGUNIT_
01166 ffename_space_drive_symbol (ffesymbol_global_, ffesymbol_unhook_);
01167 ffename_space_kill (ffesymbol_global_);
01168 #endif
01169 ffename_space_drive_symbol (ffesymbol_local_, ffesymbol_unhook_);
01170 ffename_space_kill (ffesymbol_local_);
01171 #if FFESYMBOL_globalCURRENT_ == FFESYMBOL_globalPROGUNIT_
01172 ffesymbol_global_ = NULL;
01173 #endif
01174 ffesymbol_local_ = NULL;
01175 }
01176
01177 void
01178 ffesymbol_terminate_4 ()
01179 {
01180 ffename_space_drive_symbol (ffesymbol_sfunc_, ffesymbol_unhook_);
01181 ffename_space_kill (ffesymbol_sfunc_);
01182 ffesymbol_sfunc_ = NULL;
01183 }
01184
01185
01186
01187
01188
01189
01190
01191
01192 void
01193 ffesymbol_update_init (ffesymbol s)
01194 {
01195 ffebld item;
01196
01197 if (s->is_init)
01198 return;
01199
01200 s->is_init = TRUE;
01201
01202 if ((s->equiv != NULL)
01203 && !ffeequiv_is_init (s->equiv))
01204 ffeequiv_update_init (s->equiv);
01205
01206 if ((s->storage != NULL)
01207 && !ffestorag_is_init (s->storage))
01208 ffestorag_update_init (s->storage);
01209
01210 if ((s->common != NULL)
01211 && (!ffesymbol_is_init (s->common)))
01212 ffesymbol_update_init (s->common);
01213
01214 for (item = s->common_list; item != NULL; item = ffebld_trail (item))
01215 {
01216 if (!ffesymbol_is_init (ffebld_symter (ffebld_head (item))))
01217 ffesymbol_update_init (ffebld_symter (ffebld_head (item)));
01218 }
01219 }
01220
01221
01222
01223
01224
01225
01226
01227
01228 void
01229 ffesymbol_update_save (ffesymbol s)
01230 {
01231 ffebld item;
01232
01233 if (s->is_save)
01234 return;
01235
01236 s->is_save = TRUE;
01237
01238 if ((s->equiv != NULL)
01239 && !ffeequiv_is_save (s->equiv))
01240 ffeequiv_update_save (s->equiv);
01241
01242 if ((s->storage != NULL)
01243 && !ffestorag_is_save (s->storage))
01244 ffestorag_update_save (s->storage);
01245
01246 if ((s->common != NULL)
01247 && (!ffesymbol_is_save (s->common)))
01248 ffesymbol_update_save (s->common);
01249
01250 for (item = s->common_list; item != NULL; item = ffebld_trail (item))
01251 {
01252 if (!ffesymbol_is_save (ffebld_symter (ffebld_head (item))))
01253 ffesymbol_update_save (ffebld_symter (ffebld_head (item)));
01254 }
01255 }