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

Side by Side Diff: src/objects.cc

Issue 1333843002: [runtime] Move binary operator fallbacks into the runtime. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: No need for frame states in bytecode handlers. Add test case. Created 5 years, 3 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
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <iomanip> 7 #include <iomanip>
8 #include <sstream> 8 #include <sstream>
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 JSFunction::cast(native_context->get(constructor_function_index)), 86 JSFunction::cast(native_context->get(constructor_function_index)),
87 isolate); 87 isolate);
88 } 88 }
89 Handle<JSObject> result = isolate->factory()->NewJSObject(constructor); 89 Handle<JSObject> result = isolate->factory()->NewJSObject(constructor);
90 Handle<JSValue>::cast(result)->set_value(*object); 90 Handle<JSValue>::cast(result)->set_value(*object);
91 return result; 91 return result;
92 } 92 }
93 93
94 94
95 // static 95 // static
96 MaybeHandle<Object> Object::ToNumber(Isolate* isolate, Handle<Object> input) { 96 MaybeHandle<Object> Object::ToNumber(Handle<Object> input) {
97 while (true) { 97 while (true) {
98 if (input->IsNumber()) { 98 if (input->IsNumber()) {
99 return input; 99 return input;
100 } 100 }
101 Isolate* const isolate = Handle<HeapObject>::cast(input)->GetIsolate();
101 if (input->IsOddball()) { 102 if (input->IsOddball()) {
102 return handle(Handle<Oddball>::cast(input)->to_number(), isolate); 103 return handle(Handle<Oddball>::cast(input)->to_number(), isolate);
103 } 104 }
104 if (input->IsString()) { 105 if (input->IsString()) {
105 return String::ToNumber(Handle<String>::cast(input)); 106 return String::ToNumber(Handle<String>::cast(input));
106 } 107 }
107 if (input->IsSymbol()) { 108 if (input->IsSymbol()) {
108 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSymbolToNumber), 109 THROW_NEW_ERROR(isolate, NewTypeError(MessageTemplate::kSymbolToNumber),
109 Object); 110 Object);
110 } 111 }
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 if (object->IsSymbol()) return isolate->factory()->symbol_string(); 187 if (object->IsSymbol()) return isolate->factory()->symbol_string();
187 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \ 188 #define SIMD128_TYPE(TYPE, Type, type, lane_count, lane_type) \
188 if (object->Is##Type()) return isolate->factory()->type##_string(); 189 if (object->Is##Type()) return isolate->factory()->type##_string();
189 SIMD128_TYPES(SIMD128_TYPE) 190 SIMD128_TYPES(SIMD128_TYPE)
190 #undef SIMD128_TYPE 191 #undef SIMD128_TYPE
191 if (object->IsCallable()) return isolate->factory()->function_string(); 192 if (object->IsCallable()) return isolate->factory()->function_string();
192 return isolate->factory()->object_string(); 193 return isolate->factory()->object_string();
193 } 194 }
194 195
195 196
197 // static
198 MaybeHandle<Object> Object::Multiply(Isolate* isolate, Handle<Object> lhs,
199 Handle<Object> rhs, Strength strength) {
200 if (!lhs->IsNumber() || !rhs->IsNumber()) {
201 if (is_strong(strength)) {
202 THROW_NEW_ERROR(isolate,
203 NewTypeError(MessageTemplate::kStrongImplicitConversion),
204 Object);
205 }
206 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
207 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
208 }
209 return isolate->factory()->NewNumber(lhs->Number() * rhs->Number());
210 }
211
212
213 // static
214 MaybeHandle<Object> Object::Divide(Isolate* isolate, Handle<Object> lhs,
215 Handle<Object> rhs, Strength strength) {
216 if (!lhs->IsNumber() || !rhs->IsNumber()) {
217 if (is_strong(strength)) {
218 THROW_NEW_ERROR(isolate,
219 NewTypeError(MessageTemplate::kStrongImplicitConversion),
220 Object);
221 }
222 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
223 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
224 }
225 return isolate->factory()->NewNumber(lhs->Number() / rhs->Number());
226 }
227
228
229 // static
230 MaybeHandle<Object> Object::Modulus(Isolate* isolate, Handle<Object> lhs,
231 Handle<Object> rhs, Strength strength) {
232 if (!lhs->IsNumber() || !rhs->IsNumber()) {
233 if (is_strong(strength)) {
234 THROW_NEW_ERROR(isolate,
235 NewTypeError(MessageTemplate::kStrongImplicitConversion),
236 Object);
237 }
238 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
239 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
240 }
241 return isolate->factory()->NewNumber(modulo(lhs->Number(), rhs->Number()));
242 }
243
244
245 // static
246 MaybeHandle<Object> Object::Add(Isolate* isolate, Handle<Object> lhs,
247 Handle<Object> rhs, Strength strength) {
248 if (lhs->IsNumber() && rhs->IsNumber()) {
249 return isolate->factory()->NewNumber(lhs->Number() + rhs->Number());
250 } else if (lhs->IsString() && rhs->IsString()) {
251 return isolate->factory()->NewConsString(Handle<String>::cast(lhs),
252 Handle<String>::cast(rhs));
253 } else if (is_strong(strength)) {
254 THROW_NEW_ERROR(isolate,
255 NewTypeError(MessageTemplate::kStrongImplicitConversion),
256 Object);
257 }
258 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToPrimitive(lhs), Object);
259 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToPrimitive(rhs), Object);
260 if (lhs->IsString() || rhs->IsString()) {
261 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToString(isolate, rhs),
262 Object);
263 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToString(isolate, lhs),
264 Object);
265 return isolate->factory()->NewConsString(Handle<String>::cast(lhs),
266 Handle<String>::cast(rhs));
267 }
268 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
269 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
270 return isolate->factory()->NewNumber(lhs->Number() + rhs->Number());
271 }
272
273
274 // static
275 MaybeHandle<Object> Object::Subtract(Isolate* isolate, Handle<Object> lhs,
276 Handle<Object> rhs, Strength strength) {
277 if (!lhs->IsNumber() || !rhs->IsNumber()) {
278 if (is_strong(strength)) {
279 THROW_NEW_ERROR(isolate,
280 NewTypeError(MessageTemplate::kStrongImplicitConversion),
281 Object);
282 }
283 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
284 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
285 }
286 return isolate->factory()->NewNumber(lhs->Number() - rhs->Number());
287 }
288
289
290 // static
291 MaybeHandle<Object> Object::ShiftLeft(Isolate* isolate, Handle<Object> lhs,
292 Handle<Object> rhs, Strength strength) {
293 if (!lhs->IsNumber() || !rhs->IsNumber()) {
294 if (is_strong(strength)) {
295 THROW_NEW_ERROR(isolate,
296 NewTypeError(MessageTemplate::kStrongImplicitConversion),
297 Object);
298 }
299 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
300 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
301 }
302 return isolate->factory()->NewNumberFromInt(NumberToInt32(*lhs)
303 << (NumberToUint32(*rhs) & 0x1F));
304 }
305
306
307 // static
308 MaybeHandle<Object> Object::ShiftRight(Isolate* isolate, Handle<Object> lhs,
309 Handle<Object> rhs, Strength strength) {
310 if (!lhs->IsNumber() || !rhs->IsNumber()) {
311 if (is_strong(strength)) {
312 THROW_NEW_ERROR(isolate,
313 NewTypeError(MessageTemplate::kStrongImplicitConversion),
314 Object);
315 }
316 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
317 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
318 }
319 return isolate->factory()->NewNumberFromInt(NumberToInt32(*lhs) >>
320 (NumberToUint32(*rhs) & 0x1F));
321 }
322
323
324 // static
325 MaybeHandle<Object> Object::ShiftRightLogical(Isolate* isolate,
326 Handle<Object> lhs,
327 Handle<Object> rhs,
328 Strength strength) {
329 if (!lhs->IsNumber() || !rhs->IsNumber()) {
330 if (is_strong(strength)) {
331 THROW_NEW_ERROR(isolate,
332 NewTypeError(MessageTemplate::kStrongImplicitConversion),
333 Object);
334 }
335 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
336 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
337 }
338 return isolate->factory()->NewNumberFromUint(NumberToUint32(*lhs) >>
339 (NumberToUint32(*rhs) & 0x1F));
340 }
341
342
343 // static
344 MaybeHandle<Object> Object::BitwiseAnd(Isolate* isolate, Handle<Object> lhs,
345 Handle<Object> rhs, Strength strength) {
346 if (!lhs->IsNumber() || !rhs->IsNumber()) {
347 if (is_strong(strength)) {
348 THROW_NEW_ERROR(isolate,
349 NewTypeError(MessageTemplate::kStrongImplicitConversion),
350 Object);
351 }
352 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
353 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
354 }
355 return isolate->factory()->NewNumberFromInt(NumberToInt32(*lhs) &
356 NumberToInt32(*rhs));
357 }
358
359
360 // static
361 MaybeHandle<Object> Object::BitwiseOr(Isolate* isolate, Handle<Object> lhs,
362 Handle<Object> rhs, Strength strength) {
363 if (!lhs->IsNumber() || !rhs->IsNumber()) {
364 if (is_strong(strength)) {
365 THROW_NEW_ERROR(isolate,
366 NewTypeError(MessageTemplate::kStrongImplicitConversion),
367 Object);
368 }
369 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
370 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
371 }
372 return isolate->factory()->NewNumberFromInt(NumberToInt32(*lhs) |
373 NumberToInt32(*rhs));
374 }
375
376
377 // static
378 MaybeHandle<Object> Object::BitwiseXor(Isolate* isolate, Handle<Object> lhs,
379 Handle<Object> rhs, Strength strength) {
380 if (!lhs->IsNumber() || !rhs->IsNumber()) {
381 if (is_strong(strength)) {
382 THROW_NEW_ERROR(isolate,
383 NewTypeError(MessageTemplate::kStrongImplicitConversion),
384 Object);
385 }
386 ASSIGN_RETURN_ON_EXCEPTION(isolate, lhs, Object::ToNumber(lhs), Object);
387 ASSIGN_RETURN_ON_EXCEPTION(isolate, rhs, Object::ToNumber(rhs), Object);
388 }
389 return isolate->factory()->NewNumberFromInt(NumberToInt32(*lhs) ^
390 NumberToInt32(*rhs));
391 }
392
393
196 bool Object::IsPromise(Handle<Object> object) { 394 bool Object::IsPromise(Handle<Object> object) {
197 if (!object->IsJSObject()) return false; 395 if (!object->IsJSObject()) return false;
198 auto js_object = Handle<JSObject>::cast(object); 396 auto js_object = Handle<JSObject>::cast(object);
199 // Promises can't have access checks. 397 // Promises can't have access checks.
200 if (js_object->map()->is_access_check_needed()) return false; 398 if (js_object->map()->is_access_check_needed()) return false;
201 auto isolate = js_object->GetIsolate(); 399 auto isolate = js_object->GetIsolate();
202 // TODO(dcarney): this should just be read from the symbol registry so as not 400 // TODO(dcarney): this should just be read from the symbol registry so as not
203 // to be context dependent. 401 // to be context dependent.
204 auto key = isolate->factory()->promise_status_symbol(); 402 auto key = isolate->factory()->promise_status_symbol();
205 // Shouldn't be possible to throw here. 403 // Shouldn't be possible to throw here.
(...skipping 3203 matching lines...) Expand 10 before | Expand all | Expand 10 after
3409 (it->IsElement() || 3607 (it->IsElement() ||
3410 !it->isolate()->IsInternallyUsedPropertyName(it->name())); 3608 !it->isolate()->IsInternallyUsedPropertyName(it->name()));
3411 MaybeHandle<Object> maybe_old; 3609 MaybeHandle<Object> maybe_old;
3412 if (is_observed) maybe_old = it->GetDataValue(); 3610 if (is_observed) maybe_old = it->GetDataValue();
3413 3611
3414 Handle<Object> to_assign = value; 3612 Handle<Object> to_assign = value;
3415 // Convert the incoming value to a number for storing into typed arrays. 3613 // Convert the incoming value to a number for storing into typed arrays.
3416 if (it->IsElement() && receiver->HasFixedTypedArrayElements()) { 3614 if (it->IsElement() && receiver->HasFixedTypedArrayElements()) {
3417 if (!value->IsNumber() && !value->IsUndefined()) { 3615 if (!value->IsNumber() && !value->IsUndefined()) {
3418 ASSIGN_RETURN_ON_EXCEPTION(it->isolate(), to_assign, 3616 ASSIGN_RETURN_ON_EXCEPTION(it->isolate(), to_assign,
3419 Object::ToNumber(it->isolate(), value), 3617 Object::ToNumber(value), Object);
3420 Object);
3421 // ToNumber above might modify the receiver, causing the cached 3618 // ToNumber above might modify the receiver, causing the cached
3422 // holder_map to mismatch the actual holder->map() after this point. 3619 // holder_map to mismatch the actual holder->map() after this point.
3423 // Reload the map to be in consistent state. Other cached state cannot 3620 // Reload the map to be in consistent state. Other cached state cannot
3424 // have been invalidated since typed array elements cannot be reconfigured 3621 // have been invalidated since typed array elements cannot be reconfigured
3425 // in any way. 3622 // in any way.
3426 it->ReloadHolderMap(); 3623 it->ReloadHolderMap();
3427 3624
3428 // We have to recheck the length. However, it can only change if the 3625 // We have to recheck the length. However, it can only change if the
3429 // underlying buffer was neutered, so just check that. 3626 // underlying buffer was neutered, so just check that.
3430 if (Handle<JSArrayBufferView>::cast(receiver)->WasNeutered()) { 3627 if (Handle<JSArrayBufferView>::cast(receiver)->WasNeutered()) {
(...skipping 12733 matching lines...) Expand 10 before | Expand all | Expand 10 after
16164 if (cell->value() != *new_value) { 16361 if (cell->value() != *new_value) {
16165 cell->set_value(*new_value); 16362 cell->set_value(*new_value);
16166 Isolate* isolate = cell->GetIsolate(); 16363 Isolate* isolate = cell->GetIsolate();
16167 cell->dependent_code()->DeoptimizeDependentCodeGroup( 16364 cell->dependent_code()->DeoptimizeDependentCodeGroup(
16168 isolate, DependentCode::kPropertyCellChangedGroup); 16365 isolate, DependentCode::kPropertyCellChangedGroup);
16169 } 16366 }
16170 } 16367 }
16171 16368
16172 } // namespace internal 16369 } // namespace internal
16173 } // namespace v8 16370 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698