summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2010-08-29 15:09:34 +0000
committerarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2010-08-29 15:09:34 +0000
commit9b6dc1a5856229a0dfe1fb5838c1a1e2ea02cb6d (patch)
tree4a112ed17bc16dfc6509ff26b4f0783d386647a4
parent608d5bbd79b120602a3a5272fa73ca3d5916aeb1 (diff)
Added workarounds for all instances of DMC overfetch bug
git-svn-id: http://pugixml.googlecode.com/svn/trunk@640 99668b35-9821-0410-8761-19e4c4f06640
-rw-r--r--src/pugixml.cpp7
-rw-r--r--src/pugixpath.cpp15
2 files changed, 19 insertions, 3 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index 857d656..16ff6ab 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -1077,7 +1077,12 @@ namespace
// try to guess encoding (based on XML specification, Appendix F.1)
const uint8_t* data = static_cast<const uint8_t*>(contents);
- return guess_buffer_encoding(data[0], data[1], data[2], data[3]);
+ #ifdef __DMC__
+ volatile // explicitly store to local to work around DMC bug (it loads 4 bytes from data[3] otherwise)
+ #endif
+ uint8_t d0 = data[0], d1 = data[1], d2 = data[2], d3 = data[3];
+
+ return guess_buffer_encoding(d0, d1, d2, d3);
}
bool get_mutable_buffer(char_t*& out_buffer, size_t& out_length, const void* contents, size_t size, bool is_mutable)
diff --git a/src/pugixpath.cpp b/src/pugixpath.cpp
index c4134ed..e0ab730 100644
--- a/src/pugixpath.cpp
+++ b/src/pugixpath.cpp
@@ -2357,7 +2357,15 @@ namespace pugi
if (!r.empty() && r[r.size() - 1] != ' ')
r += ' ';
}
- else r += *it;
+ else
+ {
+ #ifdef __DMC__
+ volatile // explicitly store to local to work around DMC bug (it loads 4 bytes from &*it otherwise)
+ #endif
+ char_t ch = *it;
+
+ r += ch;
+ }
}
string_t::size_type pos = r.find_last_not_of(' ');
@@ -2375,7 +2383,10 @@ namespace pugi
for (string_t::iterator it = s.begin(); it != s.end(); )
{
- char_t ch = *it; // explicitly store to local to work around DMC bug (it loads 4 bytes from &*it otherwise)
+ #ifdef __DMC__
+ volatile // explicitly store to local to work around DMC bug (it loads 4 bytes from &*it otherwise)
+ #endif
+ char_t ch = *it;
string_t::size_type pos = from.find(ch);