Subversion Repositories planix.SVN

Rev

Rev 87 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 87 Rev 101
Line 10... Line 10...
10
		n->type = t;
10
		n->type = t;
11
	}
11
	}
12
	return n;
12
	return n;
13
}
13
}
14
 
14
 
-
 
15
 
-
 
16
static noter;
-
 
17
static note_handler(void *n,char *note)
-
 
18
{  
-
 
19
	fprint(1,"Note received: %s\n",note);
-
 
20
	noter = 1;
-
 
21
	return 1;
-
 
22
}
15
 
23
 
16
void
24
void
17
evconst(Node *n)
25
evconst(Node *n)
18
{
26
{
19
	Node *l, *r;
27
	Node *l, *r;
20
	int et, isf;
28
	int et, isf;
21
	vlong v;
29
	vlong v;
22
	double d;
30
	double d;
23
 
31
 
24
	if(n == Z || n->type == T)
32
	if(n == Z || n->type == T)
25
		return;
33
		return;
26
 
34
 
27
	et = n->type->etype;
35
	et = n->type->etype;
28
	isf = typefd[et];
36
	isf = typefd[et];
29
 
37
 
30
	l = n->left;
38
	l = n->left;
31
	r = n->right;
39
	r = n->right;
32
 
40
 
33
	d = 0;
41
	d = 0;
34
	v = 0;
42
	v = 0;
Line 38... Line 46...
38
		return;
46
		return;
39
 
47
 
40
	case ONEG:
48
	case ONEG:
41
		if(isf)
49
		if(isf)
42
			d = -l->fconst;
50
			d = -l->fconst;
43
		else
51
		else
44
			v = -l->vconst;
52
			v = -l->vconst;
45
		break;
53
		break;
46
 
54
 
47
	case OCOM:
55
	case OCOM:
48
		v = ~l->vconst;
56
		v = ~l->vconst;
Line 67... Line 75...
67
 
75
 
68
	case OCONST:
76
	case OCONST:
69
		break;
77
		break;
70
 
78
 
71
	case OADD:
79
	case OADD:
72
		if(isf)
80
		if(isf) {
73
			d = l->fconst + r->fconst;
81
			d = l->fconst + r->fconst;
-
 
82
		}
74
		else {
83
		else {
75
			v = l->vconst + r->vconst;
84
			v = l->vconst + r->vconst;
76
		}
85
		}
77
		break;
86
		break;
78
 
87
 
79
	case OSUB:
88
	case OSUB:
80
		if(isf)
89
		if(isf){
81
			d = l->fconst - r->fconst;
90
			d = l->fconst - r->fconst;
-
 
91
		}
82
		else
92
		else
83
			v = l->vconst - r->vconst;
93
			v = l->vconst - r->vconst;
84
		break;
94
		break;
85
 
95
 
86
	case OMUL:
96
	case OMUL:
Line 177... Line 187...
177
			v = l->vconst > r->vconst;
187
			v = l->vconst > r->vconst;
178
		break;
188
		break;
179
 
189
 
180
	case OLS:
190
	case OLS:
181
		v = (uvlong)l->vconst <= (uvlong)r->vconst;
191
		v = (uvlong)l->vconst <= (uvlong)r->vconst;
182
		break;
192
		break;
183
 
193
 
184
	case OLE:
194
	case OLE:
185
		if(typefd[l->type->etype])
195
		if(typefd[l->type->etype])
186
			v = l->fconst <= r->fconst;
196
			v = l->fconst <= r->fconst;
187
		else
197
		else
188
			v = l->vconst <= r->vconst;
198
			v = l->vconst <= r->vconst;
Line 233... Line 243...
233
		else
243
		else
234
			v = l->vconst || r->vconst;
244
			v = l->vconst || r->vconst;
235
		break;
245
		break;
236
	}
246
	}
237
	if(isf) {
247
	if(isf) {
-
 
248
		noter=0;
-
 
249
		atnotify(note_handler,1);
238
		n->fconst = d;
250
		n->fconst = d;
-
 
251
		atnotify(note_handler,0);
-
 
252
		if (noter){
-
 
253
			print("not ok\n");
-
 
254
			warn(n, "numeric overflow");
-
 
255
			return;
-
 
256
		}
-
 
257
		
-
 
258
 
239
	} else {
259
	} else {
240
		n->vconst = convvtox(v, n->type->etype);
260
		n->vconst = convvtox(v, n->type->etype);
241
	}
261
	}
242
	n->oldop = n->op;
262
	n->oldop = n->op;
243
	n->op = OCONST;
263
	n->op = OCONST;