Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(357)

Side by Side Diff: Source/bindings/v8/V8Binding.cpp

Issue 54903014: [EnforceRange] doesn't enforce range of a short (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Extend layout test Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
137 137
138 // FIXME: Should pass in appropriate creationContext 138 // FIXME: Should pass in appropriate creationContext
139 v8::Handle<v8::Object> filterWrapper = toV8(filter, v8::Handle<v8::Object>() , isolate).As<v8::Object>(); 139 v8::Handle<v8::Object> filterWrapper = toV8(filter, v8::Handle<v8::Object>() , isolate).As<v8::Object>();
140 140
141 RefPtr<NodeFilterCondition> condition = V8NodeFilterCondition::create(callba ck, filterWrapper, isolate); 141 RefPtr<NodeFilterCondition> condition = V8NodeFilterCondition::create(callba ck, filterWrapper, isolate);
142 filter->setCondition(condition.release()); 142 filter->setCondition(condition.release());
143 143
144 return filter.release(); 144 return filter.release();
145 } 145 }
146 146
147 static const int8_t kMaxInt8 = 127;
148 static const int8_t kMinInt8 = -128;
149 static const uint8_t kMaxUInt8 = 255;
150 const int32_t kMaxInt32 = 0x7fffffff; 147 const int32_t kMaxInt32 = 0x7fffffff;
151 const int32_t kMinInt32 = -kMaxInt32 - 1; 148 const int32_t kMinInt32 = -kMaxInt32 - 1;
152 const uint32_t kMaxUInt32 = 0xffffffff; 149 const uint32_t kMaxUInt32 = 0xffffffff;
153 const int64_t kJSMaxInteger = 0x20000000000000LL - 1; // 2^53 - 1, maximum integ er exactly representable in ECMAScript. 150 const int64_t kJSMaxInteger = 0x20000000000000LL - 1; // 2^53 - 1, maximum integ er exactly representable in ECMAScript.
154 151
155 static double enforceRange(double x, double minimum, double maximum, bool& ok) 152 static double enforceRange(double x, double minimum, double maximum, bool& ok)
156 { 153 {
157 if (std::isnan(x) || std::isinf(x)) { 154 if (std::isnan(x) || std::isinf(x)) {
158 ok = false; 155 ok = false;
159 return 0; 156 return 0;
160 } 157 }
161 x = trunc(x); 158 x = trunc(x);
162 if (x < minimum || x > maximum) { 159 if (x < minimum || x > maximum) {
163 ok = false; 160 ok = false;
164 return 0; 161 return 0;
165 } 162 }
166 return x; 163 return x;
167 } 164 }
168 165
169 int8_t toInt8(v8::Handle<v8::Value> value, IntegerConversionConfiguration config uration, bool& ok) 166 template <typename T>
167 struct IntTypeLimits {
168 };
169
170 template <>
171 struct IntTypeLimits<int8_t> {
172 static const int8_t minValue = -128;
173 static const int8_t maxValue = 127;
174 static const unsigned numberOfValues = 256; // 2^8
175 };
176
177 template <>
178 struct IntTypeLimits<uint8_t> {
179 static const uint8_t maxValue = 255;
180 static const unsigned numberOfValues = 256; // 2^8
181 };
182
183 template <>
184 struct IntTypeLimits<int16_t> {
185 static const short minValue = -32768;
186 static const short maxValue = 32767;
187 static const unsigned numberOfValues = 65536; // 2^16
188 };
189
190 template <>
191 struct IntTypeLimits<uint16_t> {
192 static const unsigned short maxValue = 65535;
193 static const unsigned numberOfValues = 65536; // 2^16
194 };
195
196 template <typename T>
197 static inline T toSmallerInt(v8::Handle<v8::Value> value, IntegerConversionConfi guration configuration, bool& ok)
170 { 198 {
199 typedef IntTypeLimits<T> LimitsTrait;
171 ok = true; 200 ok = true;
172 201
173 // Fast case. The value is already a 32-bit integer in the right range. 202 // Fast case. The value is already a 32-bit integer in the right range.
174 if (value->IsInt32()) { 203 if (value->IsInt32()) {
175 int32_t result = value->Int32Value(); 204 int32_t result = value->Int32Value();
176 if (result >= kMinInt8 && result <= kMaxInt8) 205 if (result >= LimitsTrait::minValue && result <= LimitsTrait::maxValue)
177 return static_cast<int8_t>(result); 206 return static_cast<T>(result);
178 if (configuration == EnforceRange) { 207 if (configuration == EnforceRange) {
179 ok = false; 208 ok = false;
180 return 0; 209 return 0;
181 } 210 }
182 result %= 256; // 2^8. 211 result %= LimitsTrait::numberOfValues;
183 return static_cast<int8_t>(result > kMaxInt8 ? result - 256 : result); 212 return static_cast<T>(result > LimitsTrait::maxValue ? result - LimitsTr ait::numberOfValues : result);
184 } 213 }
185 214
186 // Can the value be converted to a number? 215 // Can the value be converted to a number?
187 v8::Local<v8::Number> numberObject = value->ToNumber(); 216 v8::Local<v8::Number> numberObject = value->ToNumber();
188 if (numberObject.IsEmpty()) { 217 if (numberObject.IsEmpty()) {
189 ok = false; 218 ok = false;
190 return 0; 219 return 0;
191 } 220 }
192 221
193 if (configuration == EnforceRange) 222 if (configuration == EnforceRange)
194 return enforceRange(numberObject->Value(), kMinInt8, kMaxInt8, ok); 223 return enforceRange(numberObject->Value(), LimitsTrait::minValue, Limits Trait::maxValue, ok);
195 224
196 double numberValue = numberObject->Value(); 225 double numberValue = numberObject->Value();
197 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue) 226 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue)
198 return 0; 227 return 0;
199 228
200 numberValue = numberValue < 0 ? -floor(abs(numberValue)) : floor(abs(numberV alue)); 229 numberValue = numberValue < 0 ? -floor(fabs(numberValue)) : floor(fabs(numbe rValue));
201 numberValue = fmod(numberValue, 256); // 2^8. 230 numberValue = fmod(numberValue, LimitsTrait::numberOfValues);
202 231
203 return static_cast<int8_t>(numberValue > kMaxInt8 ? numberValue - 256 : numb erValue); 232 return static_cast<T>(numberValue > LimitsTrait::maxValue ? numberValue - Li mitsTrait::numberOfValues : numberValue);
204 } 233 }
205 234
206 uint8_t toUInt8(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok) 235 template <typename T>
236 static inline T toSmallerUInt(v8::Handle<v8::Value> value, IntegerConversionConf iguration configuration, bool& ok)
207 { 237 {
238 typedef IntTypeLimits<T> LimitsTrait;
208 ok = true; 239 ok = true;
209 240
210 // Fast case. The value is a 32-bit signed integer - possibly positive? 241 // Fast case. The value is a 32-bit signed integer - possibly positive?
211 if (value->IsInt32()) { 242 if (value->IsInt32()) {
212 int32_t result = value->Int32Value(); 243 int32_t result = value->Int32Value();
213 if (result >= 0 && result <= kMaxUInt8) 244 if (result >= 0 && result <= LimitsTrait::maxValue)
214 return static_cast<uint8_t>(result); 245 return static_cast<T>(result);
215 if (configuration == EnforceRange) { 246 if (configuration == EnforceRange) {
216 ok = false; 247 ok = false;
217 return 0; 248 return 0;
218 } 249 }
219 // Converting to uint8_t will cause the resulting value to be the value modulo 2^8. 250 return static_cast<T>(result);
220 return static_cast<uint8_t>(result);
221 } 251 }
222 252
223 // Can the value be converted to a number? 253 // Can the value be converted to a number?
224 v8::Local<v8::Number> numberObject = value->ToNumber(); 254 v8::Local<v8::Number> numberObject = value->ToNumber();
225 if (numberObject.IsEmpty()) { 255 if (numberObject.IsEmpty()) {
226 ok = false; 256 ok = false;
227 return 0; 257 return 0;
228 } 258 }
229 259
230 if (configuration == EnforceRange) 260 if (configuration == EnforceRange)
231 return enforceRange(numberObject->Value(), 0, kMaxUInt8, ok); 261 return enforceRange(numberObject->Value(), 0, LimitsTrait::maxValue, ok) ;
232 262
233 // Does the value convert to nan or to an infinity? 263 // Does the value convert to nan or to an infinity?
234 double numberValue = numberObject->Value(); 264 double numberValue = numberObject->Value();
235 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue) 265 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue)
236 return 0; 266 return 0;
237 267
238 numberValue = numberValue < 0 ? -floor(abs(numberValue)) : floor(abs(numberV alue)); 268 numberValue = numberValue < 0 ? -floor(fabs(numberValue)) : floor(fabs(numbe rValue));
239 return static_cast<uint8_t>(fmod(numberValue, 256)); // 2^8. 269 return static_cast<T>(fmod(numberValue, LimitsTrait::numberOfValues));
270 }
271
272 int8_t toInt8(v8::Handle<v8::Value> value, IntegerConversionConfiguration config uration, bool& ok)
273 {
274 return toSmallerInt<int8_t>(value, configuration, ok);
275 }
276
277 uint8_t toUInt8(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok)
278 {
279 return toSmallerUInt<uint8_t>(value, configuration, ok);
280 }
281
282 int16_t toInt16(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok)
283 {
284 return toSmallerInt<int16_t>(value, configuration, ok);
285 }
286
287 uint16_t toUInt16(v8::Handle<v8::Value> value, IntegerConversionConfiguration co nfiguration, bool& ok)
288 {
289 return toSmallerUInt<uint16_t>(value, configuration, ok);
240 } 290 }
241 291
242 int32_t toInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok) 292 int32_t toInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok)
243 { 293 {
244 ok = true; 294 ok = true;
245 295
246 // Fast case. The value is already a 32-bit integer. 296 // Fast case. The value is already a 32-bit integer.
247 if (value->IsInt32()) 297 if (value->IsInt32())
248 return value->Int32Value(); 298 return value->Int32Value();
249 299
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 return mainThreadIsolate(); 618 return mainThreadIsolate();
569 return v8::Isolate::GetCurrent(); 619 return v8::Isolate::GetCurrent();
570 } 620 }
571 621
572 v8::Isolate* toIsolate(Frame* frame) 622 v8::Isolate* toIsolate(Frame* frame)
573 { 623 {
574 return frame->script().isolate(); 624 return frame->script().isolate();
575 } 625 }
576 626
577 } // namespace WebCore 627 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698