comparison gen/toir.cpp @ 440:d8dc221d3db7

Insert array bound checks for slices.
author Christian Kamm <kamm incasoftware de>
date Wed, 30 Jul 2008 19:02:13 +0200
parents 47b64d06eb9f
children 44f08170f4ef
comparison
equal deleted inserted replaced
439:47b64d06eb9f 440:d8dc221d3db7
1007 if (e1type->ty == Tpointer) { 1007 if (e1type->ty == Tpointer) {
1008 arrptr = DtoGEP1(l->getRVal(),r->getRVal()); 1008 arrptr = DtoGEP1(l->getRVal(),r->getRVal());
1009 } 1009 }
1010 else if (e1type->ty == Tsarray) { 1010 else if (e1type->ty == Tsarray) {
1011 if(global.params.useArrayBounds) 1011 if(global.params.useArrayBounds)
1012 DtoArrayBoundsCheck(loc, l, r); 1012 DtoArrayBoundsCheck(loc, l, r, false);
1013 arrptr = DtoGEP(l->getRVal(), zero, r->getRVal()); 1013 arrptr = DtoGEP(l->getRVal(), zero, r->getRVal());
1014 } 1014 }
1015 else if (e1type->ty == Tarray) { 1015 else if (e1type->ty == Tarray) {
1016 if(global.params.useArrayBounds) 1016 if(global.params.useArrayBounds)
1017 DtoArrayBoundsCheck(loc, l, r); 1017 DtoArrayBoundsCheck(loc, l, r, false);
1018 arrptr = DtoArrayPtr(l); 1018 arrptr = DtoArrayPtr(l);
1019 arrptr = DtoGEP1(arrptr,r->getRVal()); 1019 arrptr = DtoGEP1(arrptr,r->getRVal());
1020 } 1020 }
1021 else if (e1type->ty == Taarray) { 1021 else if (e1type->ty == Taarray) {
1022 return DtoAAIndex(loc, type, l, r); 1022 return DtoAAIndex(loc, type, l, r);
1068 DValue* lo = lwr->toElem(p); 1068 DValue* lo = lwr->toElem(p);
1069 DValue* up = upr->toElem(p); 1069 DValue* up = upr->toElem(p);
1070 p->arrays.pop_back(); 1070 p->arrays.pop_back();
1071 LLValue* vlo = lo->getRVal(); 1071 LLValue* vlo = lo->getRVal();
1072 LLValue* vup = up->getRVal(); 1072 LLValue* vup = up->getRVal();
1073
1074 if(global.params.useArrayBounds && (etype->ty == Tsarray || etype->ty == Tarray))
1075 DtoArrayBoundsCheck(loc, e, up, true);
1073 1076
1074 // offset by lower 1077 // offset by lower
1075 eptr = DtoGEP1(eptr, vlo); 1078 eptr = DtoGEP1(eptr, vlo);
1076 1079
1077 // adjust length 1080 // adjust length