comparison lwasm/pass5.c @ 142:697bc543368c

Implement distinction between . and * for OS9 modules
author lost@l-w.ca
date Fri, 19 Aug 2011 23:55:40 -0600
parents 7317fbe024af
children 8764142b3192
comparison
equal deleted inserted replaced
141:11ebce0183a5 142:697bc543368c
75 { 75 {
76 as -> cl = cl; 76 as -> cl = cl;
77 lwasm_reduce_expr(as, cl -> addr); 77 lwasm_reduce_expr(as, cl -> addr);
78 if (!exprok(as, cl -> addr)) 78 if (!exprok(as, cl -> addr))
79 cnt++; 79 cnt++;
80 lwasm_reduce_expr(as, cl -> daddr);
81 if (!exprok(as, cl -> daddr))
82 cnt++;
80 } 83 }
81 84
82 sl = as -> line_head; 85 sl = as -> line_head;
83 while (cnt > 0) 86 while (cnt > 0)
84 { 87 {
85 ocnt = cnt; 88 ocnt = cnt;
86 89
87 // find an unresolved address 90 // find an unresolved address
88 for ( ; sl && exprok(as, sl -> addr); sl = sl -> next) 91 for ( ; sl && exprok(as, sl -> addr) && exprok(as, sl -> daddr); sl = sl -> next)
89 /* do nothing */ ; 92 /* do nothing */ ;
90 93
91 // simplify address 94 // simplify address
92 for (cl = sl; cl; cl = cl -> next) 95 for (cl = sl; cl; cl = cl -> next)
93 { 96 {
94 as -> cl = sl; 97 as -> cl = sl;
95 lwasm_reduce_expr(as, sl -> addr); 98 lwasm_reduce_expr(as, sl -> addr);
96 99
97 if (exprok(as, cl -> addr)) 100 if (exprok(as, cl -> addr))
98 { 101 {
99 if (0 == --cnt); 102 if (0 == --cnt)
103 return;
104 }
105 lwasm_reduce_expr(as, sl -> daddr);
106 if (exprok(as, cl -> addr))
107 {
108 if (0 == --cnt)
100 return; 109 return;
101 } 110 }
102 } 111 }
103 112
104 if (cnt == ocnt) 113 if (cnt == ocnt)
112 { 121 {
113 if (!exprok(as, cl -> addr)) 122 if (!exprok(as, cl -> addr))
114 { 123 {
115 lwasm_register_error(as, cl, "Cannot resolve line address"); 124 lwasm_register_error(as, cl, "Cannot resolve line address");
116 } 125 }
126 if (!exprok(as, cl -> daddr))
127 {
128 lwasm_register_error(as, cl, "Cannot resolve line data address");
129 }
117 } 130 }
118 } 131 }
119 } 132 }