home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 20 / AACD20.BIN / AACD / Programming / Jikes / Source / src / definite.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-02-24  |  88.7 KB  |  2,349 lines

  1. // $Id: definite.cpp,v 1.19 2001/01/10 16:49:44 mdejong Exp $
  2. //
  3. // This software is subject to the terms of the IBM Jikes Compiler
  4. // License Agreement available at the following URL:
  5. // http://www.ibm.com/research/jikes.
  6. // Copyright (C) 1996, 1998, International Business Machines Corporation
  7. // and others.  All Rights Reserved.
  8. // You must accept the terms of that agreement to use this software.
  9. //
  10. #include "platform.h"
  11. #include "semantic.h"
  12.  
  13. #ifdef    HAVE_JIKES_NAMESPACE
  14. namespace Jikes {    // Open namespace Jikes block
  15. #endif
  16.  
  17. DefiniteAssignmentSet *Semantic::DefiniteExpression(AstExpression *expr, BitSet &set)
  18. {
  19.     DefiniteAssignmentSet *definite = NULL;
  20.  
  21.     //
  22.     // Is the expression a constant expression of type boolean?
  23.     // Recall that a constant expression may not contain an
  24.     // assignment statement.
  25.     //
  26.     if (expr -> IsConstant() && expr -> Type() == control.boolean_type)
  27.     {
  28.         definite = new DefiniteAssignmentSet(universe -> Size());
  29.         IntLiteralValue *result = (IntLiteralValue *) expr -> value;
  30.         if (result -> value)
  31.         {
  32.             definite -> true_set  = set;
  33.             definite -> false_set = *universe;
  34.         }
  35.         else
  36.         {
  37.             definite -> true_set  = *universe;
  38.             definite -> false_set = set;
  39.         }
  40.     }
  41.     else if (expr -> symbol != control.no_type)
  42.         definite = (this ->* DefiniteExpr[expr -> kind])(expr, set);
  43.  
  44.     return definite;
  45. }
  46.  
  47.  
  48. DefiniteAssignmentSet *Semantic::DefiniteSimpleName(AstExpression *expression, BitSet &set)
  49. {
  50.     AstSimpleName *simple_name = (AstSimpleName *) expression;
  51.  
  52.     if (simple_name -> resolution_opt)
  53.         return DefiniteExpression(simple_name -> resolution_opt, set);
  54.  
  55.     //
  56.     // Some simple names are undefined. e.g., the simple name in a method call.
  57.     //
  58.     VariableSymbol *variable = (simple_name -> symbol ? simple_name -> symbol -> VariableCast() : (VariableSymbol *) NULL);
  59.     if (variable && (variable -> IsLocal(ThisMethod()) || variable -> IsFinal(ThisType())))
  60.     {
  61.         if (! set[variable -> LocalVariableIndex()])
  62.         {
  63.             ReportSemError(SemanticError::VARIABLE_NOT_DEFINITELY_ASSIGNED,
  64.                            simple_name -> identifier_token,
  65.                            simple_name -> identifier_token,
  66.                            variable -> Name());
  67.  
  68.             if (variable -> IsLocal(ThisMethod())) // to avoid cascading errors!
  69.                 set.AddElement(variable -> LocalVariableIndex());
  70.         }
  71.     }
  72.  
  73.     return (DefiniteAssignmentSet *) NULL;
  74. }
  75.  
  76.  
  77. DefiniteAssignmentSet *Semantic::DefiniteArrayAccess(AstExpression *expression, BitSet &set)
  78. {
  79.     AstArrayAccess *array_access = (AstArrayAccess *) expression;
  80.  
  81.     DefiniteAssignmentSet *after_base = DefiniteExpression(array_access -> base, set);
  82.     if (after_base) // if this is true then something is wrong
  83.     {
  84.         set = after_base -> true_set * after_base -> false_set;
  85.         delete after_base;
  86.     }
  87.  
  88.     DefiniteAssignmentSet *after_expr = DefiniteExpression(array_access -> expression, set);
  89.     if (after_expr) // if this is true then something is wrong
  90.     {
  91.         set = after_expr -> true_set * after_expr -> false_set;
  92.         delete after_expr;
  93.     }
  94.  
  95.     return (DefiniteAssignmentSet *) NULL;
  96. }
  97.  
  98.  
  99. DefiniteAssignmentSet *Semantic::DefiniteMethodInvocation(AstExpression *expression, BitSet &set)
  100. {
  101.     AstMethodInvocation *method_call = (AstMethodInvocation *) expression;
  102.  
  103.     DefiniteAssignmentSet *after_method = DefiniteExpression(method_call -> method, set);
  104.     if (after_method)
  105.     {
  106.         set = after_method -> true_set * after_method -> false_set;
  107.         delete after_method;
  108.     }
  109.  
  110.     for (int i = 0; i < method_call -> NumArguments(); i++)
  111.     {
  112.         AstExpression *expr = method_call -> Argument(i);
  113.         DefiniteAssignmentSet *after_expr = DefiniteExpression(expr, set);
  114.         if (after_expr)
  115.         {
  116.             set = after_expr -> true_set * after_expr -> false_set;
  117.             delete after_expr;
  118.         }
  119.     }
  120.  
  121.     return (DefiniteAssignmentSet *) NULL;
  122. }
  123.  
  124.  
  125. DefiniteAssignmentSet *Semantic::DefiniteClassInstanceCreationExpression(AstExpression *expression, BitSet &set)
  126. {
  127.     AstClassInstanceCreationExpression *class_creation = (AstClassInstanceCreationExpression *) expression;
  128.  
  129.     if (class_creation -> base_opt)
  130.     {
  131.         DefiniteAssignmentSet *after_expr = DefiniteExpression(class_creation -> base_opt, set);
  132.         if (after_expr)
  133.         {
  134.             set = after_expr -> true_set * after_expr -> false_set;
  135.             delete after_expr;
  136.         }
  137.     }
  138.  
  139.     for (int i = 0; i < class_creation -> NumLocalArguments(); i++)
  140.     {
  141.         AstExpression *expr = class_creation -> LocalArgument(i);
  142.         DefiniteAssignmentSet *after_expr = DefiniteExpression(expr, set);
  143.         if (after_expr)
  144.         {
  145.             set = after_expr -> true_set * after_expr -> false_set;
  146.             delete after_expr;
  147.         }
  148.     }
  149.  
  150.     for (int k = 0; k < class_creation -> NumArguments(); k++)
  151.     {
  152.         AstExpression *expr = class_creation -> Argument(k);
  153.         DefiniteAssignmentSet *after_expr = DefiniteExpression(expr, set);
  154.         if (after_expr)
  155.         {
  156.             set = after_expr -> true_set * after_expr -> false_set;
  157.             delete after_expr;
  158.         }
  159.     }
  160.  
  161.     return (DefiniteAssignmentSet *) NULL;
  162. }
  163.  
  164.  
  165. DefiniteAssignmentSet *Semantic::DefiniteArrayCreationExpression(AstExpression *expression, BitSet &set)
  166. {
  167.     AstArrayCreationExpression *array_creation = (AstArrayCreationExpression *) expression;
  168.  
  169.     for (int i = 0; i < array_creation -> NumDimExprs(); i++)
  170.     {
  171.         AstDimExpr *dim_expr = array_creation -> DimExpr(i);
  172.         DefiniteAssignmentSet *after_expr = DefiniteExpression(dim_expr -> expression, set);
  173.         if (after_expr)
  174.         {
  175.             set = after_expr -> true_set * after_expr -> false_set;
  176.             delete after_expr;
  177.         }
  178.     }
  179.  
  180.     if (array_creation -> array_initializer_opt)
  181.         DefiniteArrayInitializer(array_creation -> array_initializer_opt);
  182.  
  183.     return (DefiniteAssignmentSet *) NULL;
  184. }
  185.  
  186.  
  187. inline VariableSymbol *Semantic::DefiniteFinal(AstFieldAccess *field_access)
  188. {
  189.     if (field_access -> resolution_opt)
  190.         field_access = field_access -> resolution_opt -> FieldAccessCast();
  191.  
  192.     if (field_access)
  193.     {
  194.         VariableSymbol *variable = (field_access -> symbol ? field_access -> symbol -> VariableCast() : (VariableSymbol *) NULL);
  195.         if (variable && variable -> IsFinal(ThisType()))
  196.         {
  197.             if (variable -> ACC_STATIC()) // there is exactly one copy of a static variable, so, it's always the right one.
  198.                 return variable;
  199.  
  200.             AstFieldAccess *sub_field_access = field_access -> base -> FieldAccessCast();
  201.             if (field_access -> base -> ThisExpressionCast() || (sub_field_access && sub_field_access -> IsThisAccess()))
  202.                 return variable;
  203.         }
  204.     }
  205.  
  206.     return NULL;
  207. }
  208.  
  209.  
  210. DefiniteAssignmentSet *Semantic::DefinitePLUSPLUSOrMINUSMINUS(AstExpression *expr, BitSet &set)
  211. {
  212.     DefiniteAssignmentSet *definite = DefiniteExpression(expr, set);
  213.     if (definite) // if this is true then something is wrong
  214.     {
  215.         set = definite -> true_set * definite -> false_set;
  216.         delete definite;
  217.     }
  218.  
  219.     VariableSymbol *variable = NULL;
  220.     if (! expr -> ArrayAccessCast()) // some kind of name
  221.     {
  222.         MethodSymbol *read_method = NULL;
  223.         AstSimpleName *simple_name = expr -> SimpleNameCast();
  224.         if (simple_name)
  225.         {
  226.             if (simple_name -> resolution_opt)
  227.                read_method = simple_name -> resolution_opt -> symbol -> MethodCast();
  228.         }
  229.         else
  230.         {
  231.             AstFieldAccess *field_access = expr -> FieldAccessCast();
  232.  
  233.             assert(field_access);
  234.  
  235.             if (field_access -> resolution_opt)
  236.                 read_method = field_access -> resolution_opt -> symbol -> MethodCast();
  237.         }
  238.  
  239.         variable = (read_method ? (VariableSymbol *) read_method -> accessed_member : expr -> symbol -> VariableCast());
  240.     }
  241.  
  242.     //
  243.     // If we have a variable and it is final then...
  244.     //
  245.     if (variable && variable -> ACC_FINAL())
  246.     {
  247.         ReportSemError(SemanticError::TARGET_VARIABLE_IS_FINAL,
  248.                        expr -> LeftToken(),
  249.                        expr -> RightToken(),
  250.                        variable -> Name());
  251.  
  252.         if (variable -> IsFinal(ThisType())) // if the final variable in contained in this type, then mark it assigned
  253.             possibly_assigned_finals -> AddElement(variable -> LocalVariableIndex());
  254.     }
  255.  
  256.     return (DefiniteAssignmentSet *) NULL;
  257. }
  258.  
  259.  
  260. DefiniteAssignmentSet *Semantic::DefinitePostUnaryExpression(AstExpression *expression, BitSet &set)
  261. {
  262.     AstPostUnaryExpression *postfix_expression = (AstPostUnaryExpression *) expression;
  263.     return DefinitePLUSPLUSOrMINUSMINUS(postfix_expression -> expression, set);
  264. }
  265.  
  266.  
  267. DefiniteAssignmentSet *Semantic::DefiniteNOT(AstExpression *expr, BitSet &set)
  268. {
  269.     DefiniteAssignmentSet *after_expr = DefiniteExpression(expr, set);
  270.     if (after_expr) // is the expression is a complex boolean expression?
  271.     {
  272.         BitSet temp(after_expr -> true_set);
  273.         after_expr -> true_set = after_expr -> false_set;
  274.         after_expr -> false_set = temp;
  275.     }
  276.  
  277.     return after_expr;
  278. }
  279.  
  280.  
  281. //
  282. // The default pre unary operators are +, -, and ~.
  283. // As these operators are not applicable to boolean expressions,
  284. // we do not need to invoke DefiniteExpression to process them.
  285. //
  286. DefiniteAssignmentSet *Semantic::DefiniteDefaultPreUnaryExpression(AstExpression *expr, BitSet &set)
  287. {
  288.     return (this ->* DefiniteExpr[expr -> kind])(expr, set);
  289. }
  290.  
  291.  
  292. DefiniteAssignmentSet *Semantic::DefinitePreUnaryExpression(AstExpression *expression, BitSet &set)
  293. {
  294.     AstPreUnaryExpression *prefix_expression = (AstPreUnaryExpression *) expression;
  295.     return (this ->* DefinitePreUnaryExpr[prefix_expression -> pre_unary_tag])(prefix_expression -> expression, set);
  296. }
  297.  
  298.  
  299. DefiniteAssignmentSet *Semantic::DefiniteAssignmentAND(TypeSymbol *type,
  300.                                                        BitSet *before_right,
  301.                                                        BitSet &set,
  302.                                                        DefiniteAssignmentSet *after_left,
  303.                                                        DefiniteAssignmentSet *after_right)
  304. {
  305.     if (after_left || after_right) // one of the subexpressions is a complex boolean expression
  306.     {
  307.         if (! after_left)
  308.         {
  309.             after_left = new DefiniteAssignmentSet(universe -> Size());
  310.             after_left -> true_set = *before_right;
  311.             after_left -> false_set = *before_right;
  312.         }
  313.  
  314.         if (! after_right)
  315.         {
  316.             after_right = new DefiniteAssignmentSet(universe -> Size());
  317.             after_right -> true_set = set;
  318.             after_right -> false_set = set;
  319.         }
  320.  
  321.         after_left -> true_set += after_right -> true_set;   // definitely assigned after left when true and after right when true
  322.         after_left -> false_set *= after_right -> false_set; // definitely assigned after left when false and after right when false
  323.         after_right -> true_set *= after_right -> false_set; // definitely assigned after right
  324.         after_left -> false_set += after_right -> true_set;
  325.  
  326.         delete after_right;
  327.     }
  328.  
  329.     delete before_right; // nothing happens if before_right is null
  330.  
  331.     return after_left;
  332. }
  333.  
  334.  
  335. DefiniteAssignmentSet *Semantic::DefiniteAssignmentIOR(TypeSymbol *type,
  336.                                                        BitSet *before_right,
  337.                                                        BitSet &set,
  338.                                                        DefiniteAssignmentSet *after_left,
  339.                                                        DefiniteAssignmentSet *after_right)
  340. {
  341.     if (after_left || after_right) // one of the subexpressions is a complex boolean expression
  342.     {
  343.         if (! after_left)
  344.         {
  345.             after_left = new DefiniteAssignmentSet(universe -> Size());
  346.             after_left -> true_set = *before_right;
  347.             after_left -> false_set = *before_right;
  348.         }
  349.  
  350.         if (! after_right)
  351.         {
  352.             after_right = new DefiniteAssignmentSet(universe -> Size());
  353.             after_right -> true_set = set;
  354.             after_right -> false_set = set;
  355.         }
  356.  
  357.         after_left -> true_set *= after_right -> true_set;   // after a when true and after b when true
  358.         after_right -> true_set *= after_right -> false_set; // definitely assigned after b
  359.         after_left -> true_set += after_right -> true_set;
  360.         after_left -> false_set += after_right -> false_set; // after a when false or after b when false
  361.  
  362.         delete after_right;
  363.     }
  364.  
  365.     delete before_right; // nothing happens if before_right is null
  366.  
  367.     return after_left;
  368. }
  369.  
  370.  
  371. DefiniteAssignmentSet *Semantic::DefiniteAssignmentXOR(TypeSymbol *type,
  372.                                                        BitSet *before_right,
  373.                                                        BitSet &set,
  374.                                                        DefiniteAssignmentSet *after_left,
  375.                                                        DefiniteAssignmentSet *after_right)
  376. {
  377.     DefiniteAssignmentSet *definite = NULL;
  378.  
  379.     if (after_left || after_right) // one of the subexpressions is a complex boolean expression
  380.     {
  381.         definite = new DefiniteAssignmentSet(universe -> Size());
  382.  
  383.         if (! after_left)
  384.         {
  385.             after_left = new DefiniteAssignmentSet(universe -> Size());
  386.             after_left -> true_set = *before_right;
  387.             after_left -> false_set = *before_right;
  388.         }
  389.  
  390.         if (! after_right)
  391.         {
  392.             after_right = new DefiniteAssignmentSet(universe -> Size());
  393.             after_right -> true_set = set;
  394.             after_right -> false_set = set;
  395.         }
  396.  
  397.         //
  398.         // compute definitely assigned after right.
  399.         //
  400.         definite -> true_set = definite -> false_set = (after_right -> true_set * after_right -> false_set);
  401.  
  402.         //
  403.         // compute definitely assigned after left when true and after right when true
  404.         // compute definitely assigned after left when false and after right when false
  405.         // add the union of these two sets to true_set;
  406.         //
  407.         definite -> true_set += (after_left -> true_set * after_right -> true_set)
  408.                               + (after_left -> false_set * after_right -> false_set);
  409.         //
  410.         // compute definitely assigned after left when true and after right when false
  411.         // compute definitely assigned after left when false and after right when true
  412.         // add the union of these two sets to false_set;
  413.         //
  414.         definite -> false_set += (after_left -> true_set * after_right -> false_set)
  415.                                + (after_left -> false_set * after_right -> true_set);
  416.  
  417.         delete after_left;
  418.         delete after_right;
  419.     }
  420.  
  421.     delete before_right;  // nothing happens if before_right is NULL
  422.  
  423.     return definite;
  424. }
  425.  
  426.  
  427. DefiniteAssignmentSet *Semantic::DefiniteAND(AstBinaryExpression *expr, BitSet &set)
  428. {
  429.     DefiniteAssignmentSet *after_left = DefiniteExpression(expr -> left_expression, set);
  430.     BitSet *before_right = NULL;
  431.     if (after_left)
  432.          set = after_left -> true_set * after_left -> false_set;
  433.     else before_right = new BitSet(set);
  434.     DefiniteAssignmentSet *after_right = DefiniteExpression(expr -> right_expression, set);
  435.  
  436.     return DefiniteAssignmentAND(expr -> left_expression -> Type(), before_right, set, after_left, after_right);
  437. }
  438.  
  439.  
  440. DefiniteAssignmentSet *Semantic::DefiniteIOR(AstBinaryExpression *expr, BitSet &set)
  441. {
  442.     DefiniteAssignmentSet *after_left = DefiniteExpression(expr -> left_expression, set);
  443.     BitSet *before_right = NULL;
  444.     if (after_left)
  445.          set = after_left -> true_set * after_left -> false_set;
  446.     else before_right = new BitSet(set);
  447.     DefiniteAssignmentSet *after_right = DefiniteExpression(expr -> right_expression, set);
  448.  
  449.     return DefiniteAssignmentIOR(expr -> left_expression -> Type(), before_right, set, after_left, after_right);
  450. }
  451.  
  452.  
  453. DefiniteAssignmentSet *Semantic::DefiniteXOR(AstBinaryExpression *expr, BitSet &set)
  454. {
  455.     DefiniteAssignmentSet *after_left = DefiniteExpression(expr -> left_expression, set);
  456.     BitSet *before_right = NULL;
  457.     if (after_left)
  458.          set = after_left -> true_set * after_left -> false_set;
  459.     else before_right = new BitSet(set);
  460.     DefiniteAssignmentSet *after_right = DefiniteExpression(expr -> right_expression, set);
  461.  
  462.     return DefiniteAssignmentXOR(expr -> left_expression -> Type(), before_right, set, after_left, after_right);
  463. }
  464.  
  465.  
  466. DefiniteAssignmentSet *Semantic::DefiniteAND_AND(AstBinaryExpression *expr, BitSet &set)
  467. {
  468.     DefiniteAssignmentSet *after_left = DefiniteExpression(expr -> left_expression, set);
  469.     BitSet *before_right = NULL;
  470.     if (after_left)
  471.          set = after_left -> true_set;
  472.     else before_right = new BitSet(set);
  473.     DefiniteAssignmentSet *after_right = DefiniteExpression(expr -> right_expression, set);
  474.  
  475.     if (after_left)
  476.     {
  477.         if (after_right)
  478.         {
  479.             after_left -> true_set += after_right -> true_set;
  480.             after_left -> false_set *= after_right -> false_set;
  481.             delete after_right;
  482.         }
  483.         else
  484.         {
  485.             after_left -> true_set += set;
  486.             after_left -> false_set *= set;
  487.         }
  488.  
  489.         after_right = after_left;
  490.     }
  491.     else
  492.     {
  493.         if (! after_right)
  494.         {
  495.             after_right = new DefiniteAssignmentSet(universe -> Size());
  496.  
  497.             after_right -> true_set = set;
  498.             after_right -> false_set = set;
  499.         }
  500.         after_right -> true_set += *before_right;
  501.         after_right -> false_set *= *before_right;
  502.  
  503.         delete before_right;
  504.     }
  505.  
  506.     return after_right;
  507. }
  508.  
  509.  
  510. DefiniteAssignmentSet *Semantic::DefiniteOR_OR(AstBinaryExpression *expr, BitSet &set)
  511. {
  512.     DefiniteAssignmentSet *after_left = DefiniteExpression(expr -> left_expression, set);
  513.     BitSet *before_right = NULL;
  514.     if (after_left)
  515.          set = after_left -> false_set;
  516.     else before_right = new BitSet(set);
  517.     DefiniteAssignmentSet *after_right = DefiniteExpression(expr -> right_expression, set);
  518.  
  519.     if (after_left)
  520.     {
  521.         if (after_right)
  522.         {
  523.             after_left -> true_set *= after_right -> true_set;
  524.             after_left -> false_set += after_right -> false_set;
  525.             delete after_right;
  526.         }
  527.         else
  528.         {
  529.             after_left -> true_set *= set;
  530.             after_left -> false_set += set;
  531.         }
  532.  
  533.         after_right = after_left;
  534.     }
  535.     else
  536.     {
  537.         if (! after_right)
  538.         {
  539.             after_right = new DefiniteAssignmentSet(universe -> Size());
  540.  
  541.             after_right -> true_set = set;
  542.             after_right -> false_set = set;
  543.         }
  544.         after_right -> true_set *= *before_right;
  545.         after_right -> false_set += *before_right;
  546.  
  547.         delete before_right;
  548.     }
  549.  
  550.     return after_right;
  551. }
  552.  
  553.  
  554. DefiniteAssignmentSet *Semantic::DefiniteEQUAL_EQUAL(AstBinaryExpression *expr, BitSet &set)
  555. {
  556.     DefiniteAssignmentSet *after_left = DefiniteExpression(expr -> left_expression, set);
  557.     BitSet *before_right = NULL;
  558.     if (after_left)
  559.          set = after_left -> true_set * after_left -> false_set;
  560.     else before_right = new BitSet(set);
  561.     DefiniteAssignmentSet *after_right = DefiniteExpression(expr -> right_expression, set);
  562.  
  563.     DefiniteAssignmentSet *definite = NULL;
  564.  
  565.     if (after_left || after_right) // one of the subexpressions is a complex boolean expression
  566.     {
  567.         definite = new DefiniteAssignmentSet(universe -> Size());
  568.  
  569.         if (! after_left)
  570.         {
  571.             after_left = new DefiniteAssignmentSet(universe -> Size());
  572.             after_left -> true_set = *before_right;
  573.             after_left -> false_set = *before_right;
  574.         }
  575.  
  576.         if (! after_right)
  577.         {
  578.             after_right = new DefiniteAssignmentSet(universe -> Size());
  579.             after_right -> true_set = set;
  580.             after_right -> false_set = set;
  581.         }
  582.  
  583.         //
  584.         // compute definitely assigned after right.
  585.         //
  586.         definite -> true_set = definite -> false_set = (after_right -> true_set * after_right -> false_set);
  587.  
  588.         //
  589.         // compute definitely assigned after left when true and after right when false
  590.         // compute definitely assigned after left when false and after right when true
  591.         // and add their union to true_set
  592.         //
  593.         definite -> true_set += (after_left -> true_set * after_right -> false_set)
  594.                               + (after_left -> false_set * after_right -> true_set);
  595.  
  596.         //
  597.         // compute definitely assigned after left when true and after right when true
  598.         // compute definitely assigned after left when false and after right when false
  599.         // and add their union to false_set
  600.         //
  601.         definite -> false_set += (after_left -> true_set * after_right -> true_set)
  602.                                + (after_left -> false_set * after_right -> false_set);
  603.  
  604.         delete after_left;
  605.         delete after_right;
  606.     }
  607.  
  608.     delete before_right; // nothing happens if before_right is NULL
  609.  
  610.     return definite;
  611. }
  612.  
  613.  
  614. DefiniteAssignmentSet *Semantic::DefiniteNOT_EQUAL(AstBinaryExpression *expr, BitSet &set)
  615. {
  616.     DefiniteAssignmentSet *after_left = DefiniteExpression(expr -> left_expression, set);
  617.     BitSet *before_right = NULL;
  618.     if (after_left)
  619.          set = after_left -> true_set * after_left -> false_set;
  620.     else before_right = new BitSet(set);
  621.     DefiniteAssignmentSet *after_right = DefiniteExpression(expr -> right_expression, set);
  622.  
  623.     //
  624.     // NOT_EQUAL has same definite assignment rules as XOR
  625.     //
  626.     return DefiniteAssignmentXOR(expr -> left_expression -> Type(), before_right, set, after_left, after_right);
  627. }
  628.  
  629.  
  630. DefiniteAssignmentSet *Semantic::DefiniteDefaultBinaryExpression(AstBinaryExpression *expr, BitSet &set)
  631. {
  632.     DefiniteAssignmentSet *after_left = DefiniteExpression(expr -> left_expression, set);
  633.     if (after_left) // if this is true there was a mistake !!!
  634.     {
  635.         set = after_left -> true_set * after_left -> false_set;
  636.         delete after_left;
  637.     }
  638.  
  639.     DefiniteAssignmentSet *after_right = DefiniteExpression(expr -> right_expression, set);
  640.     if (after_right) // if this is true there was a mistake !!!
  641.     {
  642.         set = (after_right -> true_set * after_right -> false_set);
  643.         delete after_right;
  644.     }
  645.  
  646.     return (DefiniteAssignmentSet *) NULL;
  647. }
  648.  
  649.  
  650. DefiniteAssignmentSet *Semantic::DefiniteBinaryExpression(AstExpression *expression, BitSet &set)
  651. {
  652.     AstBinaryExpression *binary_expression = (AstBinaryExpression *) expression;
  653.     return (this ->* DefiniteBinaryExpr[binary_expression -> binary_tag])(binary_expression, set);
  654. }
  655.  
  656.  
  657. DefiniteAssignmentSet *Semantic::DefiniteConditionalExpression(AstExpression *expression, BitSet &set)
  658. {
  659.     AstConditionalExpression *conditional_expression = (AstConditionalExpression *) expression;
  660.  
  661.     DefiniteAssignmentSet *after_condition = DefiniteExpression(conditional_expression -> test_expression, set);
  662.     BitSet *before_expressions = NULL;
  663.  
  664.     if (after_condition)
  665.          set = after_condition -> true_set;
  666.     else before_expressions = new BitSet(set);
  667.     DefiniteAssignmentSet *after_true = DefiniteExpression(conditional_expression -> true_expression, set);
  668.     BitSet *after_true_set = (BitSet *) (after_true ? NULL : new BitSet(set));
  669.  
  670.     if (after_condition)
  671.          set = after_condition -> false_set;
  672.     else set = *before_expressions;
  673.     DefiniteAssignmentSet *after_false = DefiniteExpression(conditional_expression -> false_expression, set);
  674.  
  675.     DefiniteAssignmentSet *definite = NULL;
  676.  
  677.     if (conditional_expression -> Type() == control.boolean_type)
  678.     {
  679.         definite = new DefiniteAssignmentSet(universe -> Size());
  680.  
  681.         //
  682.         //
  683.         //
  684.         if (after_true)
  685.         {
  686.             //
  687.             // before "true" expr or after it when true
  688.             //
  689.             definite -> true_set = after_true -> true_set + (after_condition ? after_condition -> true_set : *before_expressions);
  690.         }
  691.         else definite -> true_set = *after_true_set;
  692.  
  693.         if (after_false)
  694.         {
  695.             //
  696.             // before "false" expr or after it when true
  697.             //
  698.             definite -> true_set *= (after_false -> true_set +
  699.                                     (after_condition ? after_condition -> false_set : *before_expressions));
  700.         }
  701.         else definite -> true_set *= set;
  702.  
  703.         //
  704.         //
  705.         //
  706.         if (after_true)
  707.         {
  708.             //
  709.             // before "true" expr or after it when false
  710.             //
  711.             definite -> false_set = after_true -> false_set + (after_condition ? after_condition -> true_set : *before_expressions);
  712.         }
  713.         else definite -> false_set = *after_true_set;
  714.  
  715.         if (after_false)
  716.         {
  717.             //
  718.             // before "false" expr or after it when true
  719.             //
  720.             definite -> true_set *= (after_false -> false_set +
  721.                                      (after_condition ? after_condition -> false_set : *before_expressions));
  722.         }
  723.         else definite -> false_set *= set;
  724.     }
  725.     else
  726.     {
  727.         if (after_false)
  728.             set = after_false -> true_set * after_false -> false_set; // definitely assigned after the false expression ...
  729.  
  730.         // ... and definitely assigned after the true expression
  731.         if (after_true)
  732.              set *= (after_true -> true_set * after_true -> false_set);
  733.         else set *= *after_true_set;
  734.     }
  735.  
  736.     delete after_condition;    // nothing happens if after_condition is NULL
  737.     delete before_expressions; // nothing happens if before_expressions is NULL
  738.     delete after_true;         // nothing happens if after_true is NULL
  739.     delete after_true_set;     // nothing happens if after_true_set is NULL
  740.     delete after_false;        // nothing happens if after_false is NULL
  741.  
  742.     return definite;
  743. }
  744.  
  745.  
  746. DefiniteAssignmentSet *Semantic::DefiniteAssignmentExpression(AstExpression *expression, BitSet &set)
  747. {
  748.     AstAssignmentExpression *assignment_expression = (AstAssignmentExpression *) expression;
  749.  
  750.     AstExpression *left_hand_side = assignment_expression -> left_hand_side;
  751.     AstSimpleName *simple_name = left_hand_side -> SimpleNameCast();
  752.     if (simple_name)
  753.     {
  754.         if (simple_name -> resolution_opt)
  755.         {
  756.             left_hand_side = simple_name -> resolution_opt;
  757.             simple_name = left_hand_side -> SimpleNameCast();
  758.         }
  759.     }
  760.     else
  761.     {
  762.         AstFieldAccess *field_access = left_hand_side -> FieldAccessCast();
  763.         if (field_access && field_access -> resolution_opt)
  764.             left_hand_side = field_access -> resolution_opt;
  765.     }
  766.  
  767.     VariableSymbol *variable = (left_hand_side -> symbol ? left_hand_side -> symbol -> VariableCast() : (VariableSymbol *) NULL);
  768.  
  769.     //
  770.     // An array access is never considered to be final. Since no variable
  771.     // is associated with the array access, the testing for the presence of variable
  772.     // takes care of that possibility.
  773.     //
  774.     if (variable)
  775.     {
  776.         if (variable -> IsLocal(ThisMethod()) || variable -> IsFinal(ThisType()))
  777.         {
  778.             //
  779.             // If the debug option "g" is set and we have a simple assignment
  780.             // statement whose left-hand side is a local variable that has not
  781.             // yet been defined, mark this assignment as a definition assignment.
  782.             //
  783.             if (control.option.g &&
  784.                 assignment_expression -> assignment_tag == AstAssignmentExpression::SIMPLE_EQUAL &&
  785.                 variable -> IsLocal(ThisMethod()) &&
  786.                 (! set[variable -> LocalVariableIndex()]))
  787.             {
  788.                 assignment_expression -> assignment_tag = AstAssignmentExpression::DEFINITE_EQUAL;
  789.                 definite_block_stack -> TopLocallyDefinedVariables() -> AddElement(variable -> LocalVariableIndex());
  790.                 AstBlock *block = definite_block_stack -> TopBlock();
  791.                 block -> AddLocallyDefinedVariable(variable);
  792. #ifdef DUMP
  793. Coutput << "(1) Variable \"" << variable -> Name() << " #" << variable -> LocalVariableIndex()
  794.         << "\" is defined at line " << lex_stream -> Line(assignment_expression -> LeftToken())
  795.         << "\n";
  796. #endif
  797.             }
  798.  
  799.             //
  800.             // If we have a compound assignment then the variable must have
  801.             // been set prior to such an assignment. otherwise, an error occurs.
  802.             //
  803.             if (! (assignment_expression -> SimpleAssignment() || set[variable -> LocalVariableIndex()]))
  804.             {
  805.                 ReportSemError(SemanticError::VARIABLE_NOT_DEFINITELY_ASSIGNED,
  806.                                assignment_expression -> left_hand_side -> LeftToken(),
  807.                                assignment_expression -> left_hand_side -> RightToken(),
  808.                                variable -> Name());
  809.             }
  810.             else if (variable -> ACC_FINAL())
  811.             {
  812.                 //
  813.                 // If the final variable may have already been initialized, issue an error.
  814.                 //
  815.                 if ((! assignment_expression -> SimpleAssignment()) ||
  816.                     ((*possibly_assigned_finals) [variable -> LocalVariableIndex()]))
  817.                 {
  818.                     ReportSemError(SemanticError::TARGET_VARIABLE_IS_FINAL,
  819.                                    assignment_expression -> left_hand_side -> LeftToken(),
  820.                                    assignment_expression -> left_hand_side -> RightToken(),
  821.                                    variable -> Name());
  822.                 }
  823.                 else if (definite_final_assignment_stack -> Size() > 0) // are we processing the body of a loop ?
  824.                      definite_final_assignment_stack -> Top().Next() = left_hand_side;
  825.             }
  826.         }
  827.         else if (variable -> ACC_FINAL()) // attempt to assign a value to a final field member!
  828.         {
  829.             ReportSemError(SemanticError::TARGET_VARIABLE_IS_FINAL,
  830.                            assignment_expression -> left_hand_side -> LeftToken(),
  831.                            assignment_expression -> left_hand_side -> RightToken(),
  832.                            variable -> Name());
  833.         }
  834.     }
  835.  
  836.     DefiniteAssignmentSet *after_left = NULL;
  837.     BitSet *before_right = NULL;
  838.     //
  839.     // The left-hand-side of an assignment expression is either a simple name,
  840.     // a field access or an array access.
  841.     //
  842.     if (! simple_name)
  843.     {
  844.         AstFieldAccess *field_access = left_hand_side -> FieldAccessCast();
  845.         after_left = DefiniteExpression((field_access ? field_access -> base : left_hand_side), set);
  846.     }
  847.  
  848.     if (after_left)
  849.          set = after_left -> true_set * after_left -> false_set;
  850.     else before_right = new BitSet(set);
  851.  
  852.     DefiniteAssignmentSet *after_right = DefiniteExpression(assignment_expression -> expression, set);
  853.  
  854.     if (left_hand_side -> Type() == control.boolean_type)
  855.     {
  856.         DefiniteAssignmentSet *definite = NULL;
  857.  
  858.         if (assignment_expression -> assignment_tag == AstAssignmentExpression::AND_EQUAL)
  859.              definite = DefiniteAssignmentAND(control.boolean_type, before_right, set, after_left, after_right);
  860.         else if (assignment_expression -> assignment_tag == AstAssignmentExpression::XOR_EQUAL)
  861.              definite = DefiniteAssignmentXOR(control.boolean_type, before_right, set, after_left, after_right);
  862.         else if (assignment_expression -> assignment_tag == AstAssignmentExpression::IOR_EQUAL)
  863.              definite = DefiniteAssignmentIOR(control.boolean_type, before_right, set, after_left, after_right);
  864.         else
  865.         {
  866.             delete after_left;
  867.             delete before_right;
  868.             definite = after_right;
  869.         }
  870.  
  871.         if (variable && (variable -> IsLocal(ThisMethod()) || variable -> IsFinal(ThisType())))
  872.         {
  873.             if (definite)
  874.             {
  875.                 definite -> true_set.AddElement(variable -> LocalVariableIndex());
  876.                 definite -> false_set.AddElement(variable -> LocalVariableIndex());
  877.             }
  878.             else set.AddElement(variable -> LocalVariableIndex());
  879.  
  880.             if (variable -> ACC_FINAL())
  881.                 possibly_assigned_finals -> AddElement(variable -> LocalVariableIndex());
  882.         }
  883.  
  884.         return definite;
  885.     }
  886.  
  887.     if (after_right)
  888.         set = after_right -> true_set * after_right -> false_set;
  889.  
  890.     if (variable && (variable -> IsLocal(ThisMethod()) || variable -> IsFinal(ThisType())))
  891.     {
  892.         set.AddElement(variable -> LocalVariableIndex());
  893.         if (variable -> ACC_FINAL())
  894.             possibly_assigned_finals -> AddElement(variable -> LocalVariableIndex());
  895.     }
  896.  
  897.     delete after_left;   // nothing happens if after_left is NULL
  898.     delete before_right; // nothing happens if before_right is NULL
  899.     delete after_right;  // nothing happens if after_right is NULL
  900.  
  901.     return (DefiniteAssignmentSet *) NULL;
  902. }
  903.  
  904. DefiniteAssignmentSet *Semantic::DefiniteDefaultExpression(AstExpression *expr, BitSet &set)
  905. {
  906.     return (DefiniteAssignmentSet *) NULL;
  907. }
  908.  
  909. DefiniteAssignmentSet *Semantic::DefiniteParenthesizedExpression(AstExpression *expression, BitSet &set)
  910. {
  911.     AstParenthesizedExpression *expr = (AstParenthesizedExpression *) expression;
  912.  
  913.     return DefiniteExpression(expr -> expression, set);
  914. }
  915.  
  916. DefiniteAssignmentSet *Semantic::DefiniteFieldAccess(AstExpression *expression, BitSet &set)
  917. {
  918.     AstFieldAccess *expr = (AstFieldAccess *) expression;
  919.  
  920.     VariableSymbol *variable = DefiniteFinal(expr);
  921.     if (variable)
  922.     {
  923.         if (! set[variable -> LocalVariableIndex()])
  924.         {
  925.             ReportSemError(SemanticError::VARIABLE_NOT_DEFINITELY_ASSIGNED,
  926.                            expr -> LeftToken(),
  927.                            expr -> RightToken(),
  928.                            variable -> Name());
  929.             set.AddElement(variable -> LocalVariableIndex());
  930.         }
  931.     }
  932.  
  933.     return DefiniteExpression((expr -> resolution_opt ? expr -> resolution_opt : expr -> base), set);
  934. }
  935.  
  936. DefiniteAssignmentSet *Semantic::DefiniteCastExpression(AstExpression *expression, BitSet &set)
  937. {
  938.     AstCastExpression *expr = (AstCastExpression *) expression;
  939.  
  940.     return DefiniteExpression(expr -> expression, set);
  941. }
  942.  
  943. void Semantic::DefiniteArrayInitializer(AstArrayInitializer *array_initializer)
  944. {
  945.     for (int i = 0; i < array_initializer -> NumVariableInitializers(); i++)
  946.     {
  947.         AstArrayInitializer *sub_array_initializer = array_initializer -> VariableInitializer(i) -> ArrayInitializerCast();
  948.  
  949.         if (sub_array_initializer)
  950.             DefiniteArrayInitializer(sub_array_initializer);
  951.         else
  952.         {
  953.             AstExpression *init = (AstExpression *) array_initializer -> VariableInitializer(i);
  954.             DefiniteAssignmentSet *after_init = DefiniteExpression(init, *definitely_assigned_variables);
  955.             if (after_init)
  956.             {
  957.                 *definitely_assigned_variables = after_init -> true_set * after_init -> false_set;
  958.                 delete after_init;
  959.             }
  960.         }
  961.     }
  962.  
  963.     return;
  964. }
  965.  
  966.  
  967. inline void Semantic::DefiniteVariableInitializer(AstVariableDeclarator *variable_declarator)
  968. {
  969.     AstArrayInitializer *array_initializer = variable_declarator -> variable_initializer_opt -> ArrayInitializerCast();
  970.     if (array_initializer)
  971.         DefiniteArrayInitializer(array_initializer);
  972.     else
  973.     {
  974.         AstExpression *init = (AstExpression *) variable_declarator -> variable_initializer_opt;
  975.         DefiniteAssignmentSet *after_init = DefiniteExpression(init, *definitely_assigned_variables);
  976.         if (after_init)
  977.         {
  978.             *definitely_assigned_variables = after_init -> true_set * after_init -> false_set;
  979.             delete after_init;
  980.         }
  981.     }
  982.  
  983.     return;
  984. }
  985.  
  986.  
  987. inline void Semantic::DefiniteStatement(Ast *ast)
  988. {
  989.     (this ->* DefiniteStmt[ast -> kind])(ast);
  990.  
  991.     return;
  992. }
  993.  
  994. inline void Semantic::DefiniteBlockStatements(AstBlock *block_body)
  995. {
  996.     if (control.option.g && block_body -> NumStatements() > 0)
  997.     {
  998.         AstStatement *statement = (AstStatement *) block_body -> Statement(0);
  999.         DefiniteStatement(statement);
  1000.         for (int i = 1; i < block_body -> NumStatements(); i++)
  1001.         {
  1002.             statement = (AstStatement *) block_body -> Statement(i);
  1003.             if (statement -> is_reachable)
  1004.             {
  1005.                 //
  1006.                 // All variables that were assigned a value in the previous
  1007.                 // statement must be defined
  1008.                 BitSet &locally_defined_variables = *definite_block_stack -> TopLocallyDefinedVariables();
  1009.                 for (int k = 0; k < definitely_assigned_variables -> Size(); k++)
  1010.                 {
  1011.                     VariableSymbol *variable = definite_block_stack -> TopLocalVariables()[k];
  1012.                     if (variable) // a variable that is visible in this block? (i.e. not one declare in a non-enclosing block)
  1013.                     {
  1014.                         if ((*definitely_assigned_variables)[k] && (! locally_defined_variables[k]))
  1015.                         {
  1016. #ifdef DUMP
  1017. Coutput << "(2) Variable \"" << variable -> Name() << " #" << variable -> LocalVariableIndex()
  1018.         << "\" is defined at line " << lex_stream -> Line(statement -> LeftToken())
  1019.         << "\n";
  1020. #endif
  1021.                             statement -> AddDefinedVariable(variable);
  1022.                             locally_defined_variables.AddElement(k);
  1023.                             block_body -> AddLocallyDefinedVariable(variable);
  1024.                         }
  1025.                     }
  1026.                 }
  1027.  
  1028.                 DefiniteStatement(statement);
  1029.             }
  1030.             else break;
  1031.         }
  1032.     }
  1033.     else
  1034.     {
  1035.         for (int i = 0; i < block_body -> NumStatements(); i++)
  1036.         {
  1037.             AstStatement *statement = (AstStatement *) block_body -> Statement(i);
  1038.             if (statement -> is_reachable)
  1039.                  DefiniteStatement(statement);
  1040.             else break;
  1041.         }
  1042.     }
  1043.  
  1044.     return;
  1045. }
  1046.  
  1047.  
  1048. void Semantic::DefiniteBlock(Ast *stmt)
  1049. {
  1050.     AstBlock *block_body = (AstBlock *) stmt;
  1051.  
  1052.     definite_block_stack -> Push(block_body);
  1053.  
  1054.     for (int i = 0; i < block_body -> block_symbol -> NumVariableSymbols(); i++)
  1055.     {
  1056.         VariableSymbol *variable = block_body -> block_symbol -> VariableSym(i);
  1057.  
  1058.         possibly_assigned_finals -> RemoveElement(variable -> LocalVariableIndex());
  1059.         definitely_assigned_variables -> RemoveElement(variable -> LocalVariableIndex());
  1060.  
  1061.         definite_visible_variables -> AddElement(variable);
  1062.     }
  1063.  
  1064.     DefiniteBlockStatements(block_body);
  1065.  
  1066. #ifdef DUMP
  1067. if (control.option.g && block_body -> NumLocallyDefinedVariables() > 0)
  1068. {
  1069. Coutput << "(3) At Line " << lex_stream -> Line(block_body -> RightToken())
  1070.         << " the range for the following variables end:\n\n";
  1071. for (int j = 0; j < block_body -> NumLocallyDefinedVariables(); j++)
  1072. Coutput << "    \"" << block_body -> LocallyDefinedVariable(j) -> Name() << "\"\n";
  1073. }
  1074. #endif
  1075.     for (int k = 0; k < block_body -> block_symbol -> NumVariableSymbols(); k++)
  1076.         definite_visible_variables -> RemoveElement(block_body -> block_symbol -> VariableSym(k));
  1077.  
  1078.     //
  1079.     // Note that in constructing the Ast, the parser encloses each
  1080.     // labeled statement in its own block... Therefore, only blocks
  1081.     // are labeled.
  1082.     //
  1083.     if (block_body -> NumLabels() > 0)
  1084.         *definitely_assigned_variables *= definite_block_stack -> TopBreakSet();
  1085.  
  1086.     definite_block_stack -> Pop();
  1087.  
  1088.     return;
  1089. }
  1090.  
  1091.  
  1092. void Semantic::DefiniteLocalVariableDeclarationStatement(Ast *stmt)
  1093. {
  1094.     AstLocalVariableDeclarationStatement *local_decl = (AstLocalVariableDeclarationStatement *) stmt;
  1095.  
  1096.     for (int i = 0; i < local_decl -> NumVariableDeclarators(); i++)
  1097.     {
  1098.         AstVariableDeclarator *variable_declarator = local_decl -> VariableDeclarator(i);
  1099.         VariableSymbol *variable_symbol = variable_declarator -> symbol;
  1100.         if (variable_symbol)
  1101.         {
  1102.             if (control.option.g)
  1103.             {
  1104.                 assert(definite_block_stack -> TopLocalVariables()[variable_symbol -> LocalVariableIndex()] == NULL);
  1105. #ifdef DUMP
  1106. Coutput << "(3.5) Local Variable \"" << variable_symbol -> Name() << " #" << variable_symbol -> LocalVariableIndex()
  1107.         << "\" is declared at line " << lex_stream -> Line(variable_declarator -> LeftToken())
  1108.         << "\n";
  1109. #endif
  1110.                 definite_block_stack -> TopLocalVariables()[variable_symbol -> LocalVariableIndex()] = variable_symbol;
  1111.             }
  1112.  
  1113.             if (variable_declarator -> variable_initializer_opt)
  1114.             {
  1115.                 DefiniteVariableInitializer(variable_declarator);
  1116.                 definitely_assigned_variables -> AddElement(variable_symbol -> LocalVariableIndex());
  1117.                 if (variable_symbol -> ACC_FINAL())
  1118.                     possibly_assigned_finals -> AddElement(variable_symbol -> LocalVariableIndex());
  1119.  
  1120.                 if (control.option.g)
  1121.                 {
  1122.                     definite_block_stack -> TopLocallyDefinedVariables() -> AddElement(variable_symbol -> LocalVariableIndex());
  1123.                     AstBlock *block = definite_block_stack -> TopBlock();
  1124.                     block -> AddLocallyDefinedVariable(variable_symbol);
  1125. #ifdef DUMP
  1126. Coutput << "(4) Variable \"" << variable_symbol -> Name() << " #" << variable_symbol -> LocalVariableIndex()
  1127.         << "\" is defined at line " << lex_stream -> Line(variable_declarator -> LeftToken())
  1128.         << "\n";
  1129. #endif
  1130.                 }
  1131.             }
  1132.             else definitely_assigned_variables -> RemoveElement(variable_symbol -> LocalVariableIndex());
  1133.         }
  1134.     }
  1135.  
  1136.     return;
  1137. }
  1138.  
  1139.  
  1140. void Semantic::DefiniteExpressionStatement(Ast *stmt)
  1141. {
  1142.     AstExpressionStatement *expression_statement = (AstExpressionStatement *) stmt;
  1143.  
  1144.     DefiniteAssignmentSet *after_expr = DefiniteExpression(expression_statement -> expression, *definitely_assigned_variables);
  1145.     if (after_expr)
  1146.     {
  1147.         *definitely_assigned_variables = after_expr -> true_set * after_expr -> false_set;
  1148.         delete after_expr;
  1149.     }
  1150.  
  1151.    return;
  1152. }
  1153.  
  1154.  
  1155. void Semantic::DefiniteSynchronizedStatement(Ast *stmt)
  1156. {
  1157.     AstSynchronizedStatement *synchronized_statement = (AstSynchronizedStatement *) stmt;
  1158.  
  1159.     DefiniteAssignmentSet *after_expr = DefiniteExpression(synchronized_statement -> expression, *definitely_assigned_variables);
  1160.     if (after_expr)
  1161.     {
  1162.         *definitely_assigned_variables = after_expr -> true_set * after_expr -> false_set;
  1163.         delete after_expr;
  1164.     }
  1165.  
  1166.     DefiniteBlock(synchronized_statement -> block);
  1167.  
  1168.     return;
  1169. }
  1170.  
  1171.  
  1172. void Semantic::DefiniteIfStatement(Ast *stmt)
  1173. {
  1174.     AstIfStatement *if_statement = (AstIfStatement *) stmt;
  1175.  
  1176.     DefiniteAssignmentSet *after_expr = DefiniteExpression(if_statement -> expression, *definitely_assigned_variables);
  1177.     BitSet after_expr_finals(*possibly_assigned_finals);
  1178.     BitSet *starting_set = (after_expr ? (BitSet *) NULL : new BitSet(*definitely_assigned_variables));
  1179.     if (after_expr)
  1180.          *definitely_assigned_variables = after_expr -> true_set;
  1181.  
  1182.     //
  1183.     // If the expression in the if-statement is a boolean constant expression then get its value.
  1184.     //
  1185.     IntLiteralValue *if_constant_expr = (if_statement -> expression -> Type() == control.boolean_type &&
  1186.                                          if_statement -> expression -> IsConstant()
  1187.                                                                      ? (IntLiteralValue *) if_statement -> expression -> value
  1188.                                                                      : (IntLiteralValue *) NULL);
  1189.     //
  1190.     // If either the expression is not constant or its value is true, then
  1191.     // check the statement that make up the true part of the if statement
  1192.     //
  1193.     if ((! if_constant_expr) || if_constant_expr -> value)
  1194.         DefiniteBlock(if_statement -> true_statement);
  1195.  
  1196.     //
  1197.     // Recall that the parser ensures that the statements that appear in an if-statement
  1198.     // (both the true and false statement) are enclosed in a block.
  1199.     //
  1200.     if (! if_statement -> false_statement_opt) // no else part ?
  1201.     {
  1202.         *definitely_assigned_variables *= (after_expr ? after_expr -> false_set : *starting_set);
  1203.         *possibly_assigned_finals += after_expr_finals;
  1204.     }
  1205.     else
  1206.     {
  1207.         BitSet after_true_finals(*possibly_assigned_finals);
  1208.         *possibly_assigned_finals = after_expr_finals;
  1209.  
  1210.         BitSet true_set(*definitely_assigned_variables);
  1211.         *definitely_assigned_variables = (after_expr ? after_expr -> false_set : *starting_set);
  1212.  
  1213.         if ((! if_constant_expr) || (! if_constant_expr -> value)) // either the expression is not constant or its value is false?
  1214.             DefiniteBlock(if_statement -> false_statement_opt);
  1215.  
  1216.         *definitely_assigned_variables *= true_set;
  1217.         *possibly_assigned_finals += after_true_finals;
  1218.     }
  1219.  
  1220.     delete after_expr;   // nothing happens if after_expr is NULL
  1221.     delete starting_set; // nothing happens if starting_set is NULL
  1222.  
  1223.     return;
  1224. }
  1225.  
  1226.  
  1227. void Semantic::DefiniteLoopBody(AstStatement *statement)
  1228. {
  1229.     definite_final_assignment_stack -> Push();
  1230.  
  1231.     BitSet starting_set(*possibly_assigned_finals);
  1232.  
  1233.     DefiniteStatement(statement);
  1234.  
  1235.     BitSet exit_set(*possibly_assigned_finals);
  1236.     exit_set += definite_block_stack -> TopFinalContinueSet();
  1237.  
  1238.     //
  1239.     // The set of variables that may have been possibly assigned within the body of a loop
  1240.     // consists of the set of variables that was possibly assigned at the end of the block
  1241.     // UNION the set of variables that was possibly assigned prior to a continue statement
  1242.     // within the body of the loop MINUS the set of variables that were possibly assigned
  1243.     // prior to entering the loop.
  1244.     //
  1245.     BitSet new_set(exit_set);
  1246.     new_set -= starting_set;
  1247.  
  1248.     for (int k = 0; k < definite_final_assignment_stack -> Top().Length(); k++)
  1249.     {
  1250.         AstExpression *name = definite_final_assignment_stack -> Top()[k];
  1251.         VariableSymbol *variable = (VariableSymbol *) name -> symbol;
  1252.  
  1253.         if (definite_visible_variables -> IsElement(variable) && new_set[variable -> LocalVariableIndex()])
  1254.         {
  1255.             ReportSemError(SemanticError::FINAL_VARIABLE_TARGET_IN_LOOP,
  1256.                            name -> LeftToken(),
  1257.                            name -> RightToken(),
  1258.                            variable -> Name());
  1259.         }
  1260.     }
  1261.  
  1262.     exit_set += definite_block_stack -> TopFinalBreakSet();
  1263.     *possibly_assigned_finals = exit_set;
  1264.     definite_final_assignment_stack -> Pop();
  1265.  
  1266.     return;
  1267. }
  1268.  
  1269.  
  1270. void Semantic::DefiniteWhileStatement(Ast *stmt)
  1271. {
  1272.     AstWhileStatement *while_statement = (AstWhileStatement *) stmt;
  1273.  
  1274.     BreakableStatementStack().Push(definite_block_stack -> TopBlock());
  1275.     ContinuableStatementStack().Push(stmt);
  1276.  
  1277.     DefiniteAssignmentSet *after_expr = DefiniteExpression(while_statement -> expression, *definitely_assigned_variables);
  1278.  
  1279.     bool while_expr = true;
  1280.     if (while_statement -> expression -> Type() == control.boolean_type && while_statement -> expression -> IsConstant())
  1281.     {
  1282.         IntLiteralValue *literal = (IntLiteralValue *) while_statement -> expression -> value;
  1283.         if (! literal -> value)
  1284.             while_expr = false;
  1285.     }
  1286.  
  1287.     if (after_expr)
  1288.     {
  1289.         *definitely_assigned_variables = after_expr -> true_set;
  1290.         //
  1291.         // If the expression is always false, the body of the loop is not reachable and therefore will never execute.
  1292.         //
  1293.         if (while_expr)
  1294.             DefiniteLoopBody(while_statement -> statement);
  1295.         *definitely_assigned_variables = (after_expr -> false_set * definite_block_stack -> TopBreakSet());
  1296.         delete after_expr;
  1297.     }
  1298.     else
  1299.     {
  1300.         BitSet starting_set(*definitely_assigned_variables);
  1301.         //
  1302.         // If the expression is always false, the body of the loop is not reachable and therefore will never execute.
  1303.         //
  1304.         if (while_expr)
  1305.             DefiniteLoopBody(while_statement -> statement);
  1306.         *definitely_assigned_variables = (starting_set * definite_block_stack -> TopBreakSet());
  1307.     }
  1308.  
  1309.     ContinuableStatementStack().Pop();
  1310.     BreakableStatementStack().Pop();
  1311.  
  1312.     return;
  1313. }
  1314.  
  1315.  
  1316. void Semantic::DefiniteForStatement(Ast *stmt)
  1317. {
  1318.     AstForStatement *for_statement = (AstForStatement *) stmt;
  1319.  
  1320.     //
  1321.     // Note that in constructing the Ast, the parser encloses each
  1322.     // for-statement whose for-init-statements starts with a local
  1323.     // variable declaration in its own block. Therefore a redeclaration
  1324.     // of another local variable with the same name in a different loop
  1325.     // at the same nesting level will not cause any conflict.
  1326.     //
  1327.     // For example, the following sequence of statements is legal:
  1328.     //
  1329.     //     for (int i = 0; i < 10; i++);
  1330.     //     for (int i = 10; i < 20; i++);
  1331.     //
  1332.     if (control.option.g && for_statement -> NumForInitStatements() > 0)
  1333.     {
  1334.         AstStatement *statement = (AstStatement *) for_statement -> ForInitStatement(0);
  1335.         DefiniteStatement(statement);
  1336.         for (int i = 1; i < for_statement -> NumForInitStatements(); i++)
  1337.         {
  1338.             statement = (AstStatement *) for_statement -> ForInitStatement(i);
  1339.  
  1340.             //
  1341.             // All variables that were assigned a value in the previous
  1342.             // statement must be defined
  1343.             //
  1344.             BitSet &locally_defined_variables = *definite_block_stack -> TopLocallyDefinedVariables();
  1345.             for (int k = 0; k < definitely_assigned_variables -> Size(); k++)
  1346.             {
  1347.                 VariableSymbol *variable = definite_block_stack -> TopLocalVariables()[k];
  1348.                 if (variable) // a variable that is visible in this block? (i.e. not one declare in a non-enclosing block)
  1349.                 {
  1350.                     if ((*definitely_assigned_variables)[k] && (! locally_defined_variables[k]))
  1351.                     {
  1352. #ifdef DUMP
  1353. Coutput << "(5) Variable \"" << variable -> Name() << " #" << variable -> LocalVariableIndex()
  1354.         << "\" is defined at line " << lex_stream -> Line(statement -> LeftToken())
  1355.         << "\n";
  1356. #endif
  1357.                         statement -> AddDefinedVariable(variable);
  1358.                         locally_defined_variables.AddElement(k);
  1359.                         AstBlock *block = definite_block_stack -> TopBlock();
  1360.                         block -> AddLocallyDefinedVariable(variable);
  1361.                     }
  1362.                 }
  1363.             }
  1364.  
  1365.             DefiniteStatement(statement);
  1366.         }
  1367.     }
  1368.     else
  1369.     {
  1370.         for (int i = 0; i < for_statement -> NumForInitStatements(); i++)
  1371.         {
  1372.             DefiniteStatement(for_statement -> ForInitStatement(i));
  1373.         }
  1374.     }
  1375.  
  1376.     BreakableStatementStack().Push(definite_block_stack -> TopBlock());
  1377.     ContinuableStatementStack().Push(stmt);
  1378.  
  1379.     DefiniteAssignmentSet *after_end_expression = NULL;
  1380.     BitSet before_statement(universe -> Size());
  1381.  
  1382.     bool for_expr = true;
  1383.     if (for_statement -> end_expression_opt)
  1384.     {
  1385.         after_end_expression = DefiniteExpression(for_statement -> end_expression_opt, *definitely_assigned_variables);
  1386.  
  1387.         if (for_statement -> end_expression_opt -> Type() == control.boolean_type &&
  1388.             for_statement -> end_expression_opt -> IsConstant())
  1389.         {
  1390.             IntLiteralValue *literal = (IntLiteralValue *) for_statement -> end_expression_opt -> value;
  1391.             if (! literal -> value)
  1392.                 for_expr = false;
  1393.         }
  1394.     }
  1395.  
  1396.     if (after_end_expression)
  1397.          *definitely_assigned_variables = after_end_expression -> true_set;
  1398.     else before_statement = *definitely_assigned_variables;
  1399.  
  1400.     //
  1401.     // If the expression is always false, the body of the loop is not reachable and therefore will never execute.
  1402.     //
  1403.     if (for_expr)
  1404.         DefiniteLoopBody(for_statement -> statement);
  1405.  
  1406.     //
  1407.     // Compute the set of variables that are definitely assigned after the
  1408.     // contained statement and after every continue statement that may exit
  1409.     // the body of the for statement.
  1410.     //
  1411.     *definitely_assigned_variables *= definite_block_stack -> TopContinueSet();
  1412.     for (int j = 0; j < for_statement -> NumForUpdateStatements(); j++)
  1413.         DefiniteExpressionStatement(for_statement -> ForUpdateStatement(j));
  1414.  
  1415.     //
  1416.     // Compute the set of variables that belongs to both sets below:
  1417.     //
  1418.     //    . the universe if no condition expression is present;
  1419.     //      otherwise, the set of variables that is definitely assigned when
  1420.     //      the condition expression is false.
  1421.     //
  1422.     //    . the set of variables that is definitely assigned before every
  1423.     //      break statement that may exit the for statement.
  1424.     //
  1425.     *definitely_assigned_variables = (for_statement -> end_expression_opt
  1426.                                                      ? (after_end_expression ? after_end_expression -> false_set : before_statement)
  1427.                                                      : *universe); // set of variables that depend on the condition
  1428.  
  1429.     //
  1430.     // The replacement
  1431.     //
  1432.     *definitely_assigned_variables *= definite_block_stack -> TopBreakSet();
  1433.  
  1434.     delete after_end_expression; // nothing happens if after_end_expression is NULL
  1435.  
  1436.     ContinuableStatementStack().Pop();
  1437.     BreakableStatementStack().Pop();
  1438.  
  1439.     return;
  1440. }
  1441.  
  1442.  
  1443. void Semantic::DefiniteDoStatement(Ast *stmt)
  1444. {
  1445.     AstDoStatement *do_statement = (AstDoStatement *) stmt;
  1446.  
  1447.     BreakableStatementStack().Push(definite_block_stack -> TopBlock());
  1448.     ContinuableStatementStack().Push(stmt);
  1449.  
  1450.     bool do_expr = true;
  1451.     if (do_statement -> expression -> Type() == control.boolean_type && do_statement -> expression -> IsConstant())
  1452.     {
  1453.         IntLiteralValue *literal = (IntLiteralValue *) do_statement -> expression -> value;
  1454.         if (! literal -> value)
  1455.             do_expr = false;
  1456.     }
  1457.  
  1458.     if (do_expr)
  1459.          DefiniteLoopBody(do_statement -> statement);
  1460.     else DefiniteStatement(do_statement -> statement); // The expression is always false therefore, loop will execute exactly once.
  1461.  
  1462.     BitSet after_stmt(*definitely_assigned_variables);
  1463.     *definitely_assigned_variables *= definite_block_stack -> TopContinueSet();
  1464.     DefiniteAssignmentSet *after_expr = DefiniteExpression(do_statement -> expression, *definitely_assigned_variables);
  1465.     if (after_expr)
  1466.     {
  1467.         *definitely_assigned_variables = (after_expr -> false_set * definite_block_stack -> TopBreakSet());
  1468.         delete after_expr;
  1469.     }
  1470.     else *definitely_assigned_variables *= definite_block_stack -> TopBreakSet();
  1471.  
  1472.     ContinuableStatementStack().Pop();
  1473.     BreakableStatementStack().Pop();
  1474.  
  1475.     return;
  1476. }
  1477.  
  1478.  
  1479. void Semantic::DefiniteSwitchStatement(Ast *stmt)
  1480. {
  1481.     AstSwitchStatement *switch_statement = (AstSwitchStatement *) stmt;
  1482.  
  1483.     AstBlock *block_body = switch_statement -> switch_block;
  1484.     definite_block_stack -> Push(block_body);
  1485.     BreakableStatementStack().Push(block_body);
  1486.  
  1487.     DefiniteAssignmentSet *after_expr = DefiniteExpression(switch_statement -> expression, *definitely_assigned_variables);
  1488.     if (after_expr)
  1489.     {
  1490.         *definitely_assigned_variables = after_expr -> true_set * after_expr -> false_set;
  1491.         delete after_expr;
  1492.     }
  1493.  
  1494.     BitSet starting_set(*definitely_assigned_variables),
  1495.            after_expr_finals(*possibly_assigned_finals),
  1496.            switch_finals_union(*possibly_assigned_finals);
  1497.  
  1498.     for (int i = 0; i < block_body -> NumStatements(); i++)
  1499.     {
  1500.         AstSwitchBlockStatement *switch_block_statement = (AstSwitchBlockStatement *) block_body -> Statement(i);
  1501.  
  1502.         *definitely_assigned_variables = starting_set;
  1503.         *possibly_assigned_finals = after_expr_finals;
  1504.  
  1505.         if (control.option.g && switch_block_statement -> NumStatements() > 0)
  1506.         {
  1507.             BitSet &locally_defined_variables = *definite_block_stack -> TopLocallyDefinedVariables();
  1508.             AstStatement *statement = (AstStatement *) switch_block_statement -> Statement(0);
  1509.             DefiniteStatement(statement);
  1510.             for (int i = 1; i < switch_block_statement -> NumStatements(); i++)
  1511.             {
  1512.                 statement = (AstStatement *) switch_block_statement -> Statement(i);
  1513.                 if (statement -> is_reachable)
  1514.                 {
  1515.                     //
  1516.                     // All variables that were assigned a value in the previous
  1517.                     // statement must be defined
  1518.                     //
  1519.                     for (int k = 0; k < definitely_assigned_variables -> Size(); k++)
  1520.                     {
  1521.                         VariableSymbol *variable = definite_block_stack -> TopLocalVariables()[k];
  1522.                         if (variable) // a variable that is visible in this block? (i.e. not one declare in a non-enclosing block)
  1523.                         {
  1524.                             if ((*definitely_assigned_variables)[k] && (! locally_defined_variables[k]))
  1525.                             {
  1526. #ifdef DUMP
  1527. Coutput << "Variable \"" << variable -> Name() << " #" << variable -> LocalVariableIndex()
  1528.         << "\" is defined at line " << lex_stream -> Line(statement -> LeftToken())
  1529.         << "\n";
  1530. #endif
  1531.                                 statement -> AddDefinedVariable(variable);
  1532.                                 locally_defined_variables.AddElement(k);
  1533.                                 block_body -> AddLocallyDefinedVariable(variable);
  1534.                             }
  1535.                         }
  1536.                     }
  1537.  
  1538.                     DefiniteStatement(statement);
  1539.                 }
  1540.                 else break;
  1541.             }
  1542.  
  1543. #ifdef DUMP
  1544. if (control.option.g && block_body -> NumLocallyDefinedVariables() > 0)
  1545. {
  1546. Coutput << "(5.5) At Line " << lex_stream -> Line(statement -> RightToken())
  1547.         << " the range for the following variables end:\n\n";
  1548. for (int j = 0; j < block_body -> NumLocallyDefinedVariables(); j++)
  1549. Coutput << "    \"" << block_body -> LocallyDefinedVariable(j) -> Name() << "\"\n";
  1550. }
  1551. #endif
  1552.             //
  1553.             // At the end of a switch block statement, we always close the range of all local
  1554.             // variables that have been defined. That's because even if this switch block statement
  1555.             // entends into the next block, it is not the only entry point into that block. Therefore,
  1556.             // in order for a variable to be definitely defined at the starting point of a switch
  1557.             // block statement, it must have been defined prior to the switch statement.
  1558.             //
  1559.             for (int k = 0; k < block_body -> NumLocallyDefinedVariables(); k++)
  1560.                 locally_defined_variables.RemoveElement(block_body -> LocallyDefinedVariable(k) -> LocalVariableIndex());
  1561.             block_body -> TransferLocallyDefinedVariablesTo(switch_block_statement);
  1562.         }
  1563.         else
  1564.         {
  1565.             for (int i = 0; i < switch_block_statement -> NumStatements(); i++)
  1566.             {
  1567.                 AstStatement *statement = (AstStatement *) switch_block_statement -> Statement(i);
  1568.                 if (statement -> is_reachable)
  1569.                      DefiniteStatement(statement);
  1570.                 else break;
  1571.             }
  1572.         }
  1573.  
  1574.         //
  1575.         // Update possibly_assigned_finals here. If a continue, break (of an enclosing statement), return or throw
  1576.         // statement was encountered...
  1577.         //
  1578.         switch_finals_union += definite_block_stack -> TopFinalExitSet(*possibly_assigned_finals);
  1579.     }
  1580.  
  1581.     if (switch_statement -> default_case.switch_block_statement) // Is there a default case?
  1582.          *definitely_assigned_variables *= definite_block_stack -> TopBreakSet();
  1583.     else *definitely_assigned_variables = starting_set;
  1584.  
  1585.     *possibly_assigned_finals = switch_finals_union;
  1586.  
  1587.     BreakableStatementStack().Pop();
  1588.     definite_block_stack -> Pop();
  1589.  
  1590.     return;
  1591. }
  1592.  
  1593.  
  1594. void Semantic::DefiniteBreakStatement(Ast *stmt)
  1595. {
  1596.     AstBreakStatement *break_statement = (AstBreakStatement *) stmt;
  1597.  
  1598.     //
  1599.     // Compute the set of variables that are definitely assigned prior to executing the break.
  1600.     //
  1601.     definite_block_stack -> BreakSet(break_statement -> nesting_level) *= (*definitely_assigned_variables);
  1602.     definite_block_stack -> FinalBreakSet(break_statement -> nesting_level) += (*possibly_assigned_finals);
  1603.  
  1604.     //
  1605.     // After execution of a break statement, it is vacuously true
  1606.     // that every variable has definitely been assigned and no final
  1607.     // variable has been possibly assigned (as nothing is reachable
  1608.     // any way).
  1609.     //
  1610.     *definitely_assigned_variables = *universe;
  1611.     possibly_assigned_finals -> SetEmpty();
  1612.  
  1613.     return;
  1614. }
  1615.  
  1616.  
  1617. void Semantic::DefiniteContinueStatement(Ast *stmt)
  1618. {
  1619.     AstContinueStatement *continue_statement = (AstContinueStatement *) stmt;
  1620.  
  1621.     //
  1622.     // Compute the set of variables that are definitely assigned prior to executing the continue.
  1623.     //
  1624.     definite_block_stack -> ContinueSet(continue_statement -> nesting_level) *= (*definitely_assigned_variables);
  1625.     definite_block_stack -> FinalContinueSet(continue_statement -> nesting_level) += (*possibly_assigned_finals);
  1626.  
  1627.     //
  1628.     // After execution of a continue statement, it is vacuously true
  1629.     // that every variable has definitely been assigned and no final
  1630.     // variable has been possibly assigned (as nothing is reachable
  1631.     // any way).
  1632.     //
  1633.     *definitely_assigned_variables = *universe;
  1634.     possibly_assigned_finals -> SetEmpty();
  1635.  
  1636.     return;
  1637. }
  1638.  
  1639.  
  1640. void Semantic::DefiniteReturnStatement(Ast *stmt)
  1641. {
  1642.     AstReturnStatement *return_statement = (AstReturnStatement *) stmt;
  1643.  
  1644.     if (return_statement -> expression_opt)
  1645.     {
  1646.         DefiniteAssignmentSet *after_expr = DefiniteExpression(return_statement -> expression_opt, *definitely_assigned_variables);
  1647.         if (after_expr)
  1648.             delete after_expr;
  1649.     }
  1650.  
  1651.     //
  1652.     // Compute the set of variables that are definitely assigned prior to executing
  1653.     // this return statement. Note that this set is only relevant to the method or
  1654.     // constructor block containing this statement.
  1655.     //
  1656.     // TODO: Do we really need this?
  1657.     //
  1658.     //    definite_block_stack -> TopReturnSet() *= (*definitely_assigned_variables);
  1659.     //
  1660.  
  1661.     //
  1662.     // Compute the set of variables that are possibly assigned prior to executing this return statement.
  1663.     // We have a few cases to consider:
  1664.     //
  1665.     //    1. The return statement is not contained in a try statement - the possibly-assigned set is only relevant
  1666.     //       to the enclosing method (or constructor) block. The definitely assigned set is updated as if the return
  1667.     //       statement was a break statement out of the method (or constructor) block.
  1668.     //
  1669.     //    2. If the return statement is contained in a try main block or a try
  1670.     //       catch block that contains a finally clause - the possibly-assigned
  1671.     //       block is relevant to that main try block or catch block.
  1672.     //
  1673.     //    3. otherwise, treat the return statement as if it immediately followed its containing try statement
  1674.     //
  1675.     if (definite_try_stack -> Size() == 0)
  1676.         definite_block_stack -> ReturnSet(0) *= (*definitely_assigned_variables);
  1677.     else
  1678.     {
  1679.         for (int i = definite_try_stack -> Size() - 1; i >= 0; i--)
  1680.         {
  1681.             AstTryStatement *try_statement = definite_try_stack -> TryStatement(i);
  1682.             //
  1683.             // Is the return statement enclosed in a try main block or catch block
  1684.             // that  contains a finally clause. Note that a try statement is removed from
  1685.             // the definite_try_stack before its finally clause is processed. thus, a return
  1686.             // statement that is enclosed in a finally clause will appear in an enclosing
  1687.             // try statement, if any...
  1688.             //
  1689.             if (try_statement -> finally_clause_opt)
  1690.             {
  1691.                 int k;
  1692.                 for (k = definite_block_stack -> Size() - 1;
  1693.                      definite_block_stack -> Block(k) != definite_try_stack -> Block(i);
  1694.                      k--)
  1695.                     ;
  1696.  
  1697.                 assert(k >= 0);
  1698.  
  1699.                 definite_block_stack -> FinalReturnSet(k) += (*possibly_assigned_finals);
  1700.                 break;
  1701.             }
  1702.         }
  1703.     }
  1704.  
  1705.     //
  1706.     // After execution of a return statement, it is vacuously true
  1707.     // that every variable has definitely been assigned and no final
  1708.     // variable has been possibly assigned (as nothing is reachable
  1709.     // any way).
  1710.     //
  1711.     *definitely_assigned_variables = *universe;
  1712.     possibly_assigned_finals -> SetEmpty();
  1713.  
  1714.     return;
  1715. }
  1716.  
  1717.  
  1718. void Semantic::DefiniteThrowStatement(Ast *stmt)
  1719. {
  1720.     AstThrowStatement *throw_statement = (AstThrowStatement *) stmt;
  1721.  
  1722.     DefiniteAssignmentSet *after_expr = DefiniteExpression(throw_statement -> expression, *definitely_assigned_variables);
  1723.     if (after_expr)
  1724.         delete after_expr;
  1725.  
  1726.     //
  1727.     // Compute the set of variables that are definitely assigned prior to executing
  1728.     // this throw statement. Note that this set is only relevant to the method or
  1729.     // constructor block containing this statement.
  1730.     //
  1731.     // TODO: Do we really need this?
  1732.     //
  1733.     //    definite_block_stack -> TopThrowSet() *= (*definitely_assigned_variables);
  1734.     //
  1735.  
  1736.     //
  1737.     // Compute the set of variables that are possibly assigned prior to executing this throw statement
  1738.     // and update the proper enclosing block appropriately.
  1739.     //
  1740.     // We have a few cases to consider:
  1741.     //
  1742.     //    1. The throw statement is not contained in a try statement - the possibly-assigned
  1743.     //       set is only relevant to the enclosing method (or constructor) block. If the
  1744.     //       containing function in question is a method (i.e., not a constructor) then the
  1745.     //       definitely assigned set is updated as if the throw statement was a break statement
  1746.     //       out of the method block.
  1747.     //
  1748.     //    2. The throw statement is enclosed in a try statement main block or catch clause.
  1749.     //
  1750.     //        2a. if the nearest try-block that encloses the throw statement is a main try-block -
  1751.     //            the possibly-assigned block is relevant to that main block.
  1752.     //
  1753.     //        2b. if the nearest try-block that encloses the throw statement is a catch-block and
  1754.     //            the try block contains a finally clause - the possibly-assigned block is relevant
  1755.     //            to the catch-block
  1756.     //
  1757.     //        2c. otherwise, treat the throw statement as if it immediately followed its containing
  1758.     //            try statement
  1759.     //
  1760.     if (definite_try_stack -> Size() == 0)
  1761.     {
  1762.         if (ThisMethod() -> Identity() != control.init_name_symbol) // Not a constructor
  1763.             definite_block_stack -> ThrowSet(0) *= (*definitely_assigned_variables);
  1764.     }
  1765.     else
  1766.     {
  1767.         for (int i = definite_try_stack -> Size() - 1; i >= 0; i--)
  1768.         {
  1769.             AstTryStatement *try_statement = definite_try_stack -> TryStatement(i);
  1770.             //
  1771.             // Is the return statement enclosed in a try main block or catch block
  1772.             // that  contains a finally clause. Note that a try statement is removed from
  1773.             // the definite_try_stack before its finally clause is processed. thus, a return
  1774.             // statement that is enclosed in a finally clause will appear in an enclosing
  1775.             // try statement, if any...
  1776.             //
  1777.             if (try_statement -> block == definite_try_stack -> Block(i)) // Is the throw statement enclosed in main try block?
  1778.             {
  1779.                 int k;
  1780.                 for (k = definite_block_stack -> Size() - 1; definite_block_stack -> Block(k) != try_statement -> block; k--)
  1781.                     ;
  1782.  
  1783.                 assert(k >= 0);
  1784.  
  1785.                 definite_block_stack -> FinalThrowSet(k) += (*possibly_assigned_finals);
  1786.                 break;
  1787.             }
  1788.             else if (try_statement -> finally_clause_opt)
  1789.             {
  1790.                 int k;
  1791.                 for (k = definite_block_stack -> Size() - 1;
  1792.                      definite_block_stack -> Block(k) != definite_try_stack -> Block(i);
  1793.                      k--)
  1794.                     ;
  1795.  
  1796.                 assert(k >= 0);
  1797.  
  1798.                 definite_block_stack -> FinalThrowSet(k) += (*possibly_assigned_finals);
  1799.                 break;
  1800.             }
  1801.         }
  1802.     }
  1803.  
  1804.     //
  1805.     // After execution of a throw statement, it is vacuously true
  1806.     // that every variable has definitely been assigned and no final
  1807.     // variable has been possibly assigned (as nothing is reachable
  1808.     // any way).
  1809.     //
  1810.     *definitely_assigned_variables = *universe;
  1811.     possibly_assigned_finals -> SetEmpty();
  1812.  
  1813.     return;
  1814. }
  1815.  
  1816.  
  1817. void Semantic::DefiniteTryStatement(Ast *stmt)
  1818. {
  1819.     AstTryStatement *try_statement = (AstTryStatement *) stmt;
  1820.     definite_try_stack -> Push(try_statement);
  1821.  
  1822.     BitSet starting_set(*definitely_assigned_variables);
  1823.  
  1824.     AstBlock *try_block_body = try_statement -> block;
  1825.     definite_block_stack -> Push(try_block_body);
  1826.     definite_try_stack -> SetTopBlock(try_block_body);
  1827.  
  1828.     for (int j = 0; j < try_block_body -> block_symbol -> NumVariableSymbols(); j++)
  1829.     {
  1830.         VariableSymbol *variable = try_block_body -> block_symbol -> VariableSym(j);
  1831.  
  1832.         possibly_assigned_finals -> RemoveElement(variable -> LocalVariableIndex());
  1833.         definitely_assigned_variables -> RemoveElement(variable -> LocalVariableIndex());
  1834.         definite_visible_variables -> AddElement(variable);
  1835.     }
  1836.  
  1837.     BitSet before_try_finals(*possibly_assigned_finals);
  1838.  
  1839.     DefiniteBlockStatements(try_block_body);
  1840.  
  1841. #ifdef DUMP
  1842. if (control.option.g && try_block_body -> NumLocallyDefinedVariables() > 0)
  1843. {
  1844. Coutput << "(6) At Line " << lex_stream -> Line(try_block_body -> RightToken())
  1845.         << " the range for the following variables end:\n\n";
  1846. for (int k = 0; k < try_block_body -> NumLocallyDefinedVariables(); k++)
  1847. Coutput << "    \"" << try_block_body -> LocallyDefinedVariable(k) -> Name() << "\"\n";
  1848. }
  1849. #endif
  1850.     BitSet &exit_set = definite_block_stack -> TopFinalExitSet(*possibly_assigned_finals),
  1851.            before_catch_finals(exit_set),
  1852.            possibly_finals_union(exit_set);
  1853.  
  1854.     //
  1855.     // Once we are done with a block, its enclosed local variables are no longer visible.
  1856.     //
  1857.     for (int l = 0; l < try_block_body -> block_symbol -> NumVariableSymbols(); l++)
  1858.         definite_visible_variables -> RemoveElement(try_block_body -> block_symbol -> VariableSym(l));
  1859.  
  1860.     definite_block_stack -> Pop();
  1861.  
  1862.     //
  1863.     // We initilize the variable after_blocks here. It is used to calculate intersection
  1864.     // of the set of variables that are definitely assigned by all the blocks: the try block,
  1865.     // all the catch blocks, if any, and the finally block, if there is one.
  1866.     //
  1867.     BitSet after_blocks(*definitely_assigned_variables);
  1868.  
  1869.     //
  1870.     // Recall that the body of the catch blocks must not be
  1871.     // processed within the environment of the associated try whose
  1872.     // exceptions they are supposed to catch but within the immediate
  1873.     // enclosing block (which may itself be a try block).
  1874.     //
  1875.     for (int i = 0; i < try_statement -> NumCatchClauses(); i++)
  1876.     {
  1877.         *definitely_assigned_variables = starting_set;
  1878.  
  1879.         //
  1880.         // We process the catch block here instead of invoking DefiniteBlock,
  1881.         // in order to make sure that the formal parameter (which is declared)
  1882.         // inside the block is identified as having been definitely assigned.
  1883.         //
  1884.         AstCatchClause *clause = try_statement -> CatchClause(i);
  1885.  
  1886.         AstBlock *clause_block_body = clause -> block;
  1887.         definite_block_stack -> Push(clause_block_body);
  1888.         definite_try_stack -> SetTopBlock(clause_block_body);
  1889.  
  1890.         for (int j = 0; j < clause_block_body -> block_symbol -> NumVariableSymbols(); j++)
  1891.         {
  1892.             VariableSymbol *variable = clause_block_body -> block_symbol -> VariableSym(j);
  1893.  
  1894.             possibly_assigned_finals -> RemoveElement(variable -> LocalVariableIndex());
  1895.             definitely_assigned_variables -> RemoveElement(variable -> LocalVariableIndex());
  1896.             definite_visible_variables -> AddElement(variable);
  1897.         }
  1898.  
  1899.         //
  1900.         // The parameter must be (re) added after removing all variables in the block
  1901.         // from the set !!!
  1902.         //
  1903.         definitely_assigned_variables -> AddElement(clause -> parameter_symbol -> LocalVariableIndex());
  1904.         if (control.option.g)
  1905.         {
  1906.             VariableSymbol *variable = clause -> parameter_symbol;
  1907.             definite_block_stack -> TopLocallyDefinedVariables() -> AddElement(variable -> LocalVariableIndex());
  1908. #ifdef DUMP
  1909. Coutput << "(7) Variable \"" << variable -> Name() << " #" << variable -> LocalVariableIndex()
  1910.         << "\" is defined at line " << lex_stream -> Line(clause -> formal_parameter -> LeftToken())
  1911.         << "\n";
  1912. #endif
  1913.         }
  1914.         *possibly_assigned_finals = before_catch_finals;
  1915.         if (clause -> parameter_symbol -> ACC_FINAL())
  1916.             possibly_assigned_finals -> AddElement(clause -> parameter_symbol -> LocalVariableIndex());
  1917.  
  1918.         DefiniteBlockStatements(clause_block_body);
  1919.  
  1920. #ifdef DUMP
  1921. if (control.option.g && clause_block_body -> NumLocallyDefinedVariables() > 0)
  1922. {
  1923. Coutput << "(8) At Line " << lex_stream -> Line(clause_block_body -> RightToken())
  1924.         << " the range for the following variables end:\n\n";
  1925. for (int l = 0; l < clause_block_body -> NumLocallyDefinedVariables(); l++)
  1926. Coutput << "    \"" << clause_block_body -> LocallyDefinedVariable(l) -> Name() << "\"\n";
  1927. }
  1928. #endif
  1929.         //
  1930.         // Once we are done with a block, its enclosed local variables are no longer visible.
  1931.         //
  1932.         for (int k = 0; k < clause_block_body -> block_symbol -> NumVariableSymbols(); k++)
  1933.             definite_visible_variables -> RemoveElement(clause_block_body -> block_symbol -> VariableSym(k));
  1934.  
  1935.         possibly_finals_union += definite_block_stack -> TopFinalExitSet(*possibly_assigned_finals);
  1936.  
  1937.         definite_block_stack -> Pop();
  1938.  
  1939.         //
  1940.         // Process the set of variables that were definitely assigned
  1941.         // after this catch block
  1942.         //
  1943.         after_blocks *= *definitely_assigned_variables;
  1944.     }
  1945.  
  1946.     *possibly_assigned_finals = possibly_finals_union;
  1947.     definite_try_stack -> Pop();
  1948.  
  1949.     //
  1950.     // Like the catch clauses, a finally block must not be processed
  1951.     // in the environment of its associated try block but in the
  1952.     // environment of its immediate enclosing block.
  1953.     //
  1954.     if (try_statement -> finally_clause_opt)
  1955.     {
  1956.         *definitely_assigned_variables = starting_set;
  1957.  
  1958.         DefiniteBlock(try_statement -> finally_clause_opt -> block);
  1959.  
  1960.         *definitely_assigned_variables += after_blocks;
  1961.     }
  1962.     else *definitely_assigned_variables = after_blocks;
  1963.  
  1964.     return;
  1965. }
  1966.  
  1967.  
  1968. void Semantic::DefiniteEmptyStatement(Ast *stmt)
  1969. {
  1970.     return;
  1971. }
  1972.  
  1973.  
  1974. void Semantic::DefiniteClassDeclaration(Ast *decl)
  1975. {
  1976.     //
  1977.     // All the methods within the body of a local class are processed when
  1978.     // the class is compiled.
  1979.     //
  1980.  
  1981.     return;
  1982. }
  1983.  
  1984.  
  1985. void Semantic::DefiniteMethodBody(AstMethodDeclaration *method_declaration, Tuple<VariableSymbol *> &finals)
  1986. {
  1987.     if (! method_declaration -> method_body -> EmptyStatementCast())
  1988.     {
  1989. #ifdef DUMP
  1990. if (control.option.g)
  1991. Coutput << "(9) Processing method \"" << method_declaration -> method_symbol -> Name()
  1992.         << "\" in " << ThisType() -> ContainingPackage() -> PackageName() << "/"
  1993.         << ThisType() -> ExternalName() << "\n";
  1994. #endif
  1995.         AstConstructorBlock *constructor_block = method_declaration -> method_body -> ConstructorBlockCast();
  1996.         AstBlock *block_body = (constructor_block ? constructor_block -> block : (AstBlock *) method_declaration -> method_body);
  1997.  
  1998.         universe = new BitSet(block_body -> block_symbol -> max_variable_index + finals.Length(), BitSet::UNIVERSE);
  1999.         definite_block_stack = new DefiniteBlockStack(control,
  2000.                                                       method_declaration -> method_symbol -> max_block_depth,
  2001.                                                       universe -> Size());
  2002.         definite_try_stack = new DefiniteTryStack(method_declaration -> method_symbol -> max_block_depth);
  2003.         definite_final_assignment_stack =  new DefiniteFinalAssignmentStack();
  2004.         definite_visible_variables = new SymbolSet(universe -> Size());
  2005.         definitely_assigned_variables = new BitSet(universe -> Size(), BitSet::EMPTY);
  2006.         possibly_assigned_finals = new BitSet(universe -> Size(), BitSet::EMPTY);
  2007.         for (int i = 0; i < finals.Length(); i++) // Assume that all final instance variables have been assigned a value.
  2008.         {
  2009.             int index = block_body -> block_symbol -> max_variable_index + i;
  2010.             finals[i] -> SetLocalVariableIndex(index);
  2011.             definitely_assigned_variables -> AddElement(index);
  2012.             possibly_assigned_finals -> AddElement(index);
  2013.             definite_visible_variables -> AddElement(finals[i]);
  2014.         }
  2015.  
  2016.         definite_block_stack -> Push(block_body);
  2017.  
  2018.         AstMethodDeclarator *method_declarator = method_declaration -> method_declarator;
  2019.         for (int k = 0; k < method_declarator -> NumFormalParameters(); k++)
  2020.         {
  2021.             AstVariableDeclarator *formal_declarator = method_declarator -> FormalParameter(k) -> formal_declarator;
  2022.             definitely_assigned_variables -> AddElement(formal_declarator -> symbol -> LocalVariableIndex());
  2023.             if (control.option.g)
  2024.             {
  2025.                 VariableSymbol *variable = formal_declarator -> symbol;
  2026.                 definite_block_stack -> TopLocallyDefinedVariables() -> AddElement(variable -> LocalVariableIndex());
  2027. #ifdef DUMP
  2028. Coutput << "(10) Variable \"" << variable -> Name() << " #" << variable -> LocalVariableIndex()
  2029.         << "\" is defined at line " << lex_stream -> Line(formal_declarator -> LeftToken())
  2030.         << "\n";
  2031. #endif
  2032.             }
  2033.  
  2034.             if (formal_declarator -> symbol -> ACC_FINAL())
  2035.                 possibly_assigned_finals -> AddElement(formal_declarator -> symbol -> LocalVariableIndex());
  2036.             definite_visible_variables -> AddElement(formal_declarator -> symbol);
  2037.         }
  2038.  
  2039.         for (int l = 0; l < block_body -> block_symbol -> NumVariableSymbols(); l++)
  2040.         {
  2041.             VariableSymbol *variable = block_body -> block_symbol -> VariableSym(l);
  2042.             definite_visible_variables -> AddElement(variable);
  2043.         }
  2044.  
  2045.         DefiniteBlockStatements(block_body);
  2046.  
  2047. #ifdef DUMP
  2048. if (control.option.g && block_body -> NumLocallyDefinedVariables() > 0)
  2049. {
  2050. Coutput << "(11) At Line " << lex_stream -> Line(block_body -> RightToken())
  2051.         << " the range for the following variables end:\n\n";
  2052. for (int j = 0; j < block_body -> NumLocallyDefinedVariables(); j++)
  2053. Coutput << "    \"" << block_body -> LocallyDefinedVariable(j) -> Name() << "\"\n";
  2054. }
  2055. #endif
  2056.         definite_block_stack -> Pop();
  2057.  
  2058.         delete universe;
  2059.         delete definitely_assigned_variables;
  2060.         delete definite_block_stack;
  2061.         delete definite_try_stack;
  2062.         delete definite_final_assignment_stack;
  2063.         delete definite_visible_variables;
  2064.         delete possibly_assigned_finals;
  2065.     }
  2066.  
  2067.     return;
  2068. }
  2069.  
  2070.  
  2071. void Semantic::DefiniteConstructorBody(AstConstructorDeclaration *constructor_declaration, Tuple<VariableSymbol *> &finals)
  2072. {
  2073. #ifdef DUMP
  2074. if (control.option.g)
  2075. Coutput << "(12) Processing constructor \"" << constructor_declaration -> constructor_symbol -> Name()
  2076.         << "\" in " << ThisType() -> ContainingPackage() -> PackageName() << "/"
  2077.         << ThisType() -> ExternalName() << "\n";
  2078. #endif
  2079.     AstConstructorBlock *constructor_block = constructor_declaration -> constructor_body;
  2080.     AstBlock *block_body = constructor_block -> block;
  2081.  
  2082.     universe = new BitSet(block_body -> block_symbol -> max_variable_index + finals.Length(), BitSet::UNIVERSE);
  2083.     definite_block_stack = new DefiniteBlockStack(control,
  2084.                                                   constructor_declaration -> constructor_symbol -> max_block_depth,
  2085.                                                   universe -> Size());
  2086.     definite_try_stack = new DefiniteTryStack(constructor_declaration -> constructor_symbol -> max_block_depth);
  2087.     definite_final_assignment_stack =  new DefiniteFinalAssignmentStack();
  2088.     definite_visible_variables = new SymbolSet(universe -> Size());
  2089.     definitely_assigned_variables = new BitSet(universe -> Size(), BitSet::EMPTY);
  2090.     possibly_assigned_finals = new BitSet(universe -> Size(), BitSet::EMPTY);
  2091.     for (int i = 0; i < finals.Length(); i++)
  2092.     {
  2093.         int index = block_body -> block_symbol -> max_variable_index + i;
  2094.  
  2095.         finals[i] -> SetLocalVariableIndex(index);
  2096.         if (finals[i] -> IsDefinitelyAssigned())
  2097.         {
  2098.             definitely_assigned_variables -> AddElement(index);
  2099.             possibly_assigned_finals -> AddElement(index);
  2100.         }
  2101.         else if (finals[i] -> IsPossiblyAssigned())
  2102.             possibly_assigned_finals -> AddElement(index);
  2103.         definite_visible_variables -> AddElement(finals[i]);
  2104.     }
  2105.  
  2106.     //
  2107.     // As an explicit constructor call cannot refer to any locally declared variables
  2108.     // other than formal parameters, no local variable can be assigned within it (other
  2109.     // than a formal parameter which is considered to have been assigned anyway). Therefore,
  2110.     // the following code is not necessary:
  2111.     //
  2112.     //    if (this_call)
  2113.     //         DefiniteThisCall(this_call);
  2114.     //    else if (super_call)
  2115.     //         DefiniteSuperCall(super_call);
  2116.     //
  2117.  
  2118.     definite_block_stack -> Push(block_body);
  2119.     if (control.option.g)
  2120.     {
  2121.         //
  2122.         // We need this initialization to prevent debug info from being generated for 
  2123.         // final fields (since they are not truly local variables).
  2124.         //
  2125.         BitSet &locally_defined_variables = *definite_block_stack -> TopLocallyDefinedVariables();
  2126.         for (int i = 0; i < finals.Length(); i++) // Assume that all final instance variables have been assigned a value.
  2127.         {
  2128.             int index = block_body -> block_symbol -> max_variable_index + i;
  2129.             locally_defined_variables.AddElement(index);
  2130.         }
  2131.     }
  2132.  
  2133.     AstMethodDeclarator *constructor_declarator = constructor_declaration -> constructor_declarator;
  2134.     for (int j = 0; j < constructor_declarator -> NumFormalParameters(); j++)
  2135.     {
  2136.         AstVariableDeclarator *formal_declarator = constructor_declarator -> FormalParameter(j) -> formal_declarator;
  2137.         definitely_assigned_variables -> AddElement(formal_declarator -> symbol -> LocalVariableIndex());
  2138.         if (control.option.g)
  2139.         {
  2140.             VariableSymbol *variable = formal_declarator -> symbol;
  2141.             definite_block_stack -> TopLocallyDefinedVariables() -> AddElement(variable -> LocalVariableIndex());
  2142. #ifdef DUMP
  2143. Coutput << "(13) Variable \"" << variable -> Name() << " #" << variable -> LocalVariableIndex()
  2144.         << "\" is defined at line " << lex_stream -> Line(formal_declarator -> LeftToken())
  2145.         << "\n";
  2146. #endif
  2147.         }
  2148.  
  2149.         if (formal_declarator -> symbol -> ACC_FINAL())
  2150.             possibly_assigned_finals -> AddElement(formal_declarator -> symbol -> LocalVariableIndex());
  2151.         definite_visible_variables -> AddElement(formal_declarator -> symbol);
  2152.     }
  2153.  
  2154.     for (int l = 0; l < block_body -> block_symbol -> NumVariableSymbols(); l++)
  2155.     {
  2156.         VariableSymbol *variable = block_body -> block_symbol -> VariableSym(l);
  2157.         definite_visible_variables -> AddElement(variable);
  2158.     }
  2159.  
  2160.     DefiniteBlockStatements(block_body);
  2161.  
  2162. #ifdef DUMP
  2163. if (control.option.g && block_body -> NumLocallyDefinedVariables() > 0)
  2164. {
  2165. Coutput << "(14) At Line " << lex_stream -> Line(block_body -> RightToken())
  2166.         << " the range for the following variables end:\n\n";
  2167. for (int j = 0; j < block_body -> NumLocallyDefinedVariables(); j++)
  2168. Coutput << "    \"" << block_body -> LocallyDefinedVariable(j) -> Name() << "\"\n";
  2169. }
  2170. #endif
  2171.     //
  2172.     // Compute the set of finals that has definitely been assigned in this constructor
  2173.     //
  2174.     BitSet &exit_set = definite_block_stack -> TopExitSet(*definitely_assigned_variables);
  2175.     for (int k = 0; k < finals.Length(); k++)
  2176.     {
  2177.         int index = block_body -> block_symbol -> max_variable_index + k;
  2178.         if (exit_set[index])
  2179.             finals[k] -> MarkDefinitelyAssigned();
  2180.     }
  2181.  
  2182.     definite_block_stack -> Pop();
  2183.  
  2184.     delete universe;
  2185.     delete definitely_assigned_variables;
  2186.     delete definite_block_stack;
  2187.     delete definite_try_stack;
  2188.     delete definite_final_assignment_stack;
  2189.     delete definite_visible_variables;
  2190.     delete possibly_assigned_finals;
  2191.  
  2192.     return;
  2193. }
  2194.  
  2195.  
  2196. void Semantic::DefiniteBlockInitializer(AstBlock *block_body, int stack_size, Tuple<VariableSymbol *> &finals)
  2197. {
  2198. #ifdef DUMP
  2199. if (control.option.g)
  2200. Coutput << "(15) Processing Initializer block "
  2201.         << " in " << ThisType() -> ContainingPackage() -> PackageName() << "/"
  2202.         << ThisType() -> ExternalName() << "\n";
  2203. #endif
  2204.     universe = new BitSet(block_body -> block_symbol -> max_variable_index + finals.Length(), BitSet::UNIVERSE);
  2205.     definite_block_stack = new DefiniteBlockStack(control, stack_size + 1, universe -> Size()); // +1 for absent method block
  2206.     definite_try_stack = new DefiniteTryStack(stack_size + 1);
  2207.     definite_final_assignment_stack =  new DefiniteFinalAssignmentStack();
  2208.     definite_visible_variables = new SymbolSet(universe -> Size());
  2209.     definitely_assigned_variables = new BitSet(universe -> Size(), BitSet::EMPTY);
  2210.     possibly_assigned_finals = new BitSet(universe -> Size(), BitSet::EMPTY);
  2211.     for (int i = 0; i < finals.Length(); i++)
  2212.     {
  2213.         int index = block_body -> block_symbol -> max_variable_index + i;
  2214.  
  2215.         finals[i] -> SetLocalVariableIndex(index);
  2216.         if (finals[i] -> IsDefinitelyAssigned())
  2217.         {
  2218.             definitely_assigned_variables -> AddElement(index);
  2219.             possibly_assigned_finals -> AddElement(index);
  2220.         }
  2221.         else if (finals[i] -> IsPossiblyAssigned())
  2222.             possibly_assigned_finals -> AddElement(index);
  2223.         definite_visible_variables -> AddElement(finals[i]);
  2224.     }
  2225.  
  2226.     definite_block_stack -> Push(NULL); // No method available
  2227.     definite_block_stack -> Push(block_body);
  2228.     if (control.option.g)
  2229.     {
  2230.         //
  2231.         // We need this initialization to prevent debug info from being generated for 
  2232.         // final fields (since they are not truly local variables).
  2233.         //
  2234.         BitSet &locally_defined_variables = *definite_block_stack -> TopLocallyDefinedVariables();
  2235.         for (int i = 0; i < finals.Length(); i++) // Assume that all final instance variables have been assigned a value.
  2236.         {
  2237.             int index = block_body -> block_symbol -> max_variable_index + i;
  2238.             locally_defined_variables.AddElement(index);
  2239.         }
  2240.     }
  2241.  
  2242.     for (int j = 0; j < block_body -> block_symbol -> NumVariableSymbols(); j++)
  2243.     {
  2244.         VariableSymbol *variable = block_body -> block_symbol -> VariableSym(j);
  2245.         definite_visible_variables -> AddElement(variable);
  2246.     }
  2247.  
  2248.     DefiniteBlockStatements(block_body);
  2249.  
  2250. #ifdef DUMP
  2251. if (control.option.g && block_body -> NumLocallyDefinedVariables() > 0)
  2252. {
  2253. Coutput << "(16) At Line " << lex_stream -> Line(block_body -> RightToken())
  2254.         << " the range for the following variables end:\n\n";
  2255. for (int j = 0; j < block_body -> NumLocallyDefinedVariables(); j++)
  2256. Coutput << "    \"" << block_body -> LocallyDefinedVariable(j) -> Name() << "\"\n";
  2257. }
  2258. #endif
  2259.     //
  2260.     // For each final that has definitely been assigned a value in this block,
  2261.     // mark it appropriately.
  2262.     //
  2263.     BitSet &exit_set = definite_block_stack -> TopExitSet(*definitely_assigned_variables);
  2264.     for (int k = 0; k < finals.Length(); k++)
  2265.     {
  2266.         int index = block_body -> block_symbol -> max_variable_index + k;
  2267.         if (exit_set[index])
  2268.             finals[k] -> MarkDefinitelyAssigned();
  2269.     }
  2270.  
  2271.     //
  2272.     // For each final that may have possibly been assigned a value in this block,
  2273.     // mark it appropriately.
  2274.     //
  2275.     exit_set = definite_block_stack -> TopFinalExitSet(*possibly_assigned_finals);
  2276.     for (int l = 0; l < finals.Length(); l++)
  2277.     {
  2278.         int index = block_body -> block_symbol -> max_variable_index + l;
  2279.         if (exit_set[index])
  2280.             finals[l] -> MarkPossiblyAssigned();
  2281.     }
  2282.  
  2283.     definite_block_stack -> Pop();
  2284.     definite_block_stack -> Pop(); // remove NULL that was pushed to indicate that no method is available
  2285.  
  2286.     delete universe;
  2287.     delete definitely_assigned_variables;
  2288.     delete definite_block_stack;
  2289.     delete definite_try_stack;
  2290.     delete definite_final_assignment_stack;
  2291.     delete definite_visible_variables;
  2292.     delete possibly_assigned_finals;
  2293.  
  2294.     return;
  2295. }
  2296.  
  2297.  
  2298. void Semantic::DefiniteVariableInitializer(AstVariableDeclarator *variable_declarator, Tuple<VariableSymbol *> &finals)
  2299. {
  2300.     universe = new BitSet(finals.Length(), BitSet::UNIVERSE);
  2301.     definite_block_stack = NULL;
  2302.     definite_try_stack = NULL;
  2303.     definite_final_assignment_stack =  new DefiniteFinalAssignmentStack();
  2304.     definite_visible_variables = new SymbolSet(universe -> Size());
  2305.     definitely_assigned_variables = new BitSet(universe -> Size(), BitSet::EMPTY);
  2306.     possibly_assigned_finals = new BitSet(universe -> Size(), BitSet::EMPTY);
  2307.     for (int i = 0; i < finals.Length(); i++)
  2308.     {
  2309.         finals[i] -> SetLocalVariableIndex(i);
  2310.         if (finals[i] -> IsDefinitelyAssigned())
  2311.         {
  2312.             definitely_assigned_variables -> AddElement(i);
  2313.             possibly_assigned_finals -> AddElement(i);
  2314.         }
  2315.         else if (finals[i] -> IsPossiblyAssigned())
  2316.             possibly_assigned_finals -> AddElement(i);
  2317.         definite_visible_variables -> AddElement(finals[i]);
  2318.     }
  2319.  
  2320.     DefiniteVariableInitializer(variable_declarator);
  2321.     VariableSymbol *symbol = variable_declarator -> symbol;
  2322.     if (symbol -> ACC_FINAL())
  2323.         symbol -> MarkDefinitelyAssigned();
  2324.     //
  2325.     // Also, update any other finals that may have been initialized as
  2326.     // a side-effect in an assignment embedded within the initializer
  2327.     // expression.
  2328.     //
  2329.     BitSet &exit_set = *definitely_assigned_variables;
  2330.     for (int k = 0; k < finals.Length(); k++)
  2331.     {
  2332.         if (exit_set[k])
  2333.             finals[k] -> MarkDefinitelyAssigned();
  2334.     }
  2335.  
  2336.     delete universe;
  2337.     delete definitely_assigned_variables;
  2338.     delete definite_final_assignment_stack;
  2339.     delete definite_visible_variables;
  2340.     delete possibly_assigned_finals;
  2341.  
  2342.     return;
  2343. }
  2344.  
  2345. #ifdef    HAVE_JIKES_NAMESPACE
  2346. }            // Close namespace Jikes block
  2347. #endif
  2348.  
  2349.