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

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

Issue 16951005: Add support for byte and octet Web IDL types to the bindings generator (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Take Joshua's feedback into consideration Created 7 years, 6 months 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
« no previous file with comments | « Source/bindings/v8/V8Binding.h ('k') | Source/bindings/v8/custom/V8DataViewCustom.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 for (size_t i = 0; i < length; ++i) 108 for (size_t i = 0; i < length; ++i)
109 result.append(args[i]); 109 result.append(args[i]);
110 return result; 110 return result;
111 } 111 }
112 112
113 PassRefPtr<NodeFilter> toNodeFilter(v8::Handle<v8::Value> callback) 113 PassRefPtr<NodeFilter> toNodeFilter(v8::Handle<v8::Value> callback)
114 { 114 {
115 return NodeFilter::create(V8NodeFilterCondition::create(callback)); 115 return NodeFilter::create(V8NodeFilterCondition::create(callback));
116 } 116 }
117 117
118 static const int8_t kMaxInt8 = 127;
119 static const int8_t kMinInt8 = -128;
120 static const uint8_t kMaxUInt8 = 255;
118 const int32_t kMaxInt32 = 0x7fffffff; 121 const int32_t kMaxInt32 = 0x7fffffff;
119 const int32_t kMinInt32 = -kMaxInt32 - 1; 122 const int32_t kMinInt32 = -kMaxInt32 - 1;
120 const uint32_t kMaxUInt32 = 0xffffffff; 123 const uint32_t kMaxUInt32 = 0xffffffff;
121 const int64_t kJSMaxInteger = 0x20000000000000LL - 1; // 2^53 - 1, maximum integ er exactly representable in ECMAScript. 124 const int64_t kJSMaxInteger = 0x20000000000000LL - 1; // 2^53 - 1, maximum integ er exactly representable in ECMAScript.
122 125
123 static double enforceRange(double x, double minimum, double maximum, bool& ok) 126 static double enforceRange(double x, double minimum, double maximum, bool& ok)
124 { 127 {
125 if (std::isnan(x) || std::isinf(x)) { 128 if (std::isnan(x) || std::isinf(x)) {
126 ok = false; 129 ok = false;
127 return 0; 130 return 0;
128 } 131 }
129 x = trunc(x); 132 x = trunc(x);
130 if (x < minimum || x > maximum) { 133 if (x < minimum || x > maximum) {
131 ok = false; 134 ok = false;
132 return 0; 135 return 0;
133 } 136 }
134 return x; 137 return x;
135 } 138 }
136 139
140 int8_t toInt8(v8::Handle<v8::Value> value, IntegerConversionConfiguration config uration, bool& ok)
141 {
142 ok = true;
143
144 // Fast case. The value is already a 32-bit integer in the right range.
145 if (value->IsInt32()) {
146 int32_t result = value->Int32Value();
147 if (result >= kMinInt8 && result <= kMaxInt8)
148 return static_cast<int8_t>(result);
149 if (configuration == EnforceRange) {
150 ok = false;
151 return 0;
152 }
153 result %= 256; // 2^8.
154 return static_cast<int8_t>(result > kMaxInt8 ? result - 256 : result);
155 }
156
157 // Can the value be converted to a number?
158 v8::Local<v8::Number> numberObject = value->ToNumber();
159 if (numberObject.IsEmpty()) {
160 ok = false;
161 return 0;
162 }
163
164 if (configuration == EnforceRange)
165 return enforceRange(numberObject->Value(), kMinInt8, kMaxInt8, ok);
166
167 double numberValue = numberObject->Value();
168 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue)
169 return 0;
170
171 numberValue = numberValue < 0 ? -floor(abs(numberValue)) : floor(abs(numberV alue));
172 numberValue = fmod(numberValue, 256); // 2^8.
173
174 return static_cast<int8_t>(numberValue > kMaxInt8 ? numberValue - 256 : numb erValue);
175 }
176
177 uint8_t toUInt8(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok)
178 {
179 ok = true;
180
181 // Fast case. The value is a 32-bit signed integer - possibly positive?
182 if (value->IsInt32()) {
183 int32_t result = value->Int32Value();
184 if (result >= 0 && result <= kMaxUInt8)
185 return static_cast<uint8_t>(result);
186 if (configuration == EnforceRange) {
187 ok = false;
188 return 0;
189 }
190 // Converting to uint8_t will cause the resulting value to be the value modulo 2^8.
191 return static_cast<uint8_t>(result);
192 }
193
194 // Can the value be converted to a number?
195 v8::Local<v8::Number> numberObject = value->ToNumber();
196 if (numberObject.IsEmpty()) {
197 ok = false;
198 return 0;
199 }
200
201 if (configuration == EnforceRange)
202 return enforceRange(numberObject->Value(), 0, kMaxUInt8, ok);
203
204 // Does the value convert to nan or to an infinity?
205 double numberValue = numberObject->Value();
206 if (std::isnan(numberValue) || std::isinf(numberValue) || !numberValue)
207 return 0;
208
209 numberValue = numberValue < 0 ? -floor(abs(numberValue)) : floor(abs(numberV alue));
210 return static_cast<uint8_t>(fmod(numberValue, 256)); // 2^8.
211 }
212
137 int32_t toInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok) 213 int32_t toInt32(v8::Handle<v8::Value> value, IntegerConversionConfiguration conf iguration, bool& ok)
138 { 214 {
139 ok = true; 215 ok = true;
140 216
141 // Fast case. The value is already a 32-bit integer. 217 // Fast case. The value is already a 32-bit integer.
142 if (value->IsInt32()) 218 if (value->IsInt32())
143 return value->Int32Value(); 219 return value->Int32Value();
144 220
145 // Can the value be converted to a number? 221 // Can the value be converted to a number?
146 v8::Local<v8::Number> numberObject = value->ToNumber(); 222 v8::Local<v8::Number> numberObject = value->ToNumber();
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
427 if (!DOMWrapperWorld::isolatedWorldsExist()) 503 if (!DOMWrapperWorld::isolatedWorldsExist())
428 return MainWorld; 504 return MainWorld;
429 ASSERT(!v8::Context::GetEntered().IsEmpty()); 505 ASSERT(!v8::Context::GetEntered().IsEmpty());
430 DOMWrapperWorld* isolatedWorld = DOMWrapperWorld::isolatedWorld(v8::Context: :GetEntered()); 506 DOMWrapperWorld* isolatedWorld = DOMWrapperWorld::isolatedWorld(v8::Context: :GetEntered());
431 if (isolatedWorld) 507 if (isolatedWorld)
432 return IsolatedWorld; 508 return IsolatedWorld;
433 return MainWorld; 509 return MainWorld;
434 } 510 }
435 511
436 } // namespace WebCore 512 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/bindings/v8/V8Binding.h ('k') | Source/bindings/v8/custom/V8DataViewCustom.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698