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

Side by Side Diff: src/runtime.cc

Issue 430503007: Rename ASSERT* to DCHECK*. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: REBASE and fixes Created 6 years, 4 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 | « src/rewriter.cc ('k') | src/runtime-profiler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 <stdlib.h> 5 #include <stdlib.h>
6 #include <limits> 6 #include <limits>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
164 Object* key = constant_properties->get(p); 164 Object* key = constant_properties->get(p);
165 uint32_t element_index = 0; 165 uint32_t element_index = 0;
166 if (key->IsInternalizedString()) { 166 if (key->IsInternalizedString()) {
167 number_of_string_keys++; 167 number_of_string_keys++;
168 } else if (key->ToArrayIndex(&element_index)) { 168 } else if (key->ToArrayIndex(&element_index)) {
169 // An index key does not require space in the property backing store. 169 // An index key does not require space in the property backing store.
170 number_of_properties--; 170 number_of_properties--;
171 } else { 171 } else {
172 // Bail out as a non-internalized-string non-index key makes caching 172 // Bail out as a non-internalized-string non-index key makes caching
173 // impossible. 173 // impossible.
174 // ASSERT to make sure that the if condition after the loop is false. 174 // DCHECK to make sure that the if condition after the loop is false.
175 ASSERT(number_of_string_keys != number_of_properties); 175 DCHECK(number_of_string_keys != number_of_properties);
176 break; 176 break;
177 } 177 }
178 } 178 }
179 // If we only have internalized strings and array indices among keys then we 179 // If we only have internalized strings and array indices among keys then we
180 // can use the map cache in the native context. 180 // can use the map cache in the native context.
181 const int kMaxKeys = 10; 181 const int kMaxKeys = 10;
182 if ((number_of_string_keys == number_of_properties) && 182 if ((number_of_string_keys == number_of_properties) &&
183 (number_of_string_keys < kMaxKeys)) { 183 (number_of_string_keys < kMaxKeys)) {
184 // Create the fixed array with the key. 184 // Create the fixed array with the key.
185 Handle<FixedArray> keys = 185 Handle<FixedArray> keys =
186 isolate->factory()->NewFixedArray(number_of_string_keys); 186 isolate->factory()->NewFixedArray(number_of_string_keys);
187 if (number_of_string_keys > 0) { 187 if (number_of_string_keys > 0) {
188 int index = 0; 188 int index = 0;
189 for (int p = 0; p < properties_length; p += 2) { 189 for (int p = 0; p < properties_length; p += 2) {
190 Object* key = constant_properties->get(p); 190 Object* key = constant_properties->get(p);
191 if (key->IsInternalizedString()) { 191 if (key->IsInternalizedString()) {
192 keys->set(index++, key); 192 keys->set(index++, key);
193 } 193 }
194 } 194 }
195 ASSERT(index == number_of_string_keys); 195 DCHECK(index == number_of_string_keys);
196 } 196 }
197 *is_result_from_cache = true; 197 *is_result_from_cache = true;
198 return isolate->factory()->ObjectLiteralMapFromCache(context, keys); 198 return isolate->factory()->ObjectLiteralMapFromCache(context, keys);
199 } 199 }
200 *is_result_from_cache = false; 200 *is_result_from_cache = false;
201 return Map::Create(handle(context->object_function()), number_of_properties); 201 return Map::Create(handle(context->object_function()), number_of_properties);
202 } 202 }
203 203
204 204
205 MUST_USE_RESULT static MaybeHandle<Object> CreateLiteralBoilerplate( 205 MUST_USE_RESULT static MaybeHandle<Object> CreateLiteralBoilerplate(
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 MaybeHandle<Object> maybe_result; 269 MaybeHandle<Object> maybe_result;
270 uint32_t element_index = 0; 270 uint32_t element_index = 0;
271 if (key->IsInternalizedString()) { 271 if (key->IsInternalizedString()) {
272 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { 272 if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) {
273 // Array index as string (uint32). 273 // Array index as string (uint32).
274 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); 274 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate);
275 maybe_result = 275 maybe_result =
276 JSObject::SetOwnElement(boilerplate, element_index, value, SLOPPY); 276 JSObject::SetOwnElement(boilerplate, element_index, value, SLOPPY);
277 } else { 277 } else {
278 Handle<String> name(String::cast(*key)); 278 Handle<String> name(String::cast(*key));
279 ASSERT(!name->AsArrayIndex(&element_index)); 279 DCHECK(!name->AsArrayIndex(&element_index));
280 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes( 280 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes(
281 boilerplate, name, value, NONE); 281 boilerplate, name, value, NONE);
282 } 282 }
283 } else if (key->ToArrayIndex(&element_index)) { 283 } else if (key->ToArrayIndex(&element_index)) {
284 // Array index (uint32). 284 // Array index (uint32).
285 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate); 285 if (value->IsUninitialized()) value = handle(Smi::FromInt(0), isolate);
286 maybe_result = 286 maybe_result =
287 JSObject::SetOwnElement(boilerplate, element_index, value, SLOPPY); 287 JSObject::SetOwnElement(boilerplate, element_index, value, SLOPPY);
288 } else { 288 } else {
289 // Non-uint32 number. 289 // Non-uint32 number.
290 ASSERT(key->IsNumber()); 290 DCHECK(key->IsNumber());
291 double num = key->Number(); 291 double num = key->Number();
292 char arr[100]; 292 char arr[100];
293 Vector<char> buffer(arr, ARRAY_SIZE(arr)); 293 Vector<char> buffer(arr, ARRAY_SIZE(arr));
294 const char* str = DoubleToCString(num, buffer); 294 const char* str = DoubleToCString(num, buffer);
295 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str); 295 Handle<String> name = isolate->factory()->NewStringFromAsciiChecked(str);
296 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes(boilerplate, name, 296 maybe_result = JSObject::SetOwnPropertyIgnoreAttributes(boilerplate, name,
297 value, NONE); 297 value, NONE);
298 } 298 }
299 // If setting the property on the boilerplate throws an 299 // If setting the property on the boilerplate throws an
300 // exception, the exception is converted to an empty handle in 300 // exception, the exception is converted to an empty handle in
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
349 349
350 Handle<JSArray> object = Handle<JSArray>::cast( 350 Handle<JSArray> object = Handle<JSArray>::cast(
351 isolate->factory()->NewJSObject(constructor, pretenure_flag)); 351 isolate->factory()->NewJSObject(constructor, pretenure_flag));
352 352
353 ElementsKind constant_elements_kind = 353 ElementsKind constant_elements_kind =
354 static_cast<ElementsKind>(Smi::cast(elements->get(0))->value()); 354 static_cast<ElementsKind>(Smi::cast(elements->get(0))->value());
355 Handle<FixedArrayBase> constant_elements_values( 355 Handle<FixedArrayBase> constant_elements_values(
356 FixedArrayBase::cast(elements->get(1))); 356 FixedArrayBase::cast(elements->get(1)));
357 357
358 { DisallowHeapAllocation no_gc; 358 { DisallowHeapAllocation no_gc;
359 ASSERT(IsFastElementsKind(constant_elements_kind)); 359 DCHECK(IsFastElementsKind(constant_elements_kind));
360 Context* native_context = isolate->context()->native_context(); 360 Context* native_context = isolate->context()->native_context();
361 Object* maps_array = native_context->js_array_maps(); 361 Object* maps_array = native_context->js_array_maps();
362 ASSERT(!maps_array->IsUndefined()); 362 DCHECK(!maps_array->IsUndefined());
363 Object* map = FixedArray::cast(maps_array)->get(constant_elements_kind); 363 Object* map = FixedArray::cast(maps_array)->get(constant_elements_kind);
364 object->set_map(Map::cast(map)); 364 object->set_map(Map::cast(map));
365 } 365 }
366 366
367 Handle<FixedArrayBase> copied_elements_values; 367 Handle<FixedArrayBase> copied_elements_values;
368 if (IsFastDoubleElementsKind(constant_elements_kind)) { 368 if (IsFastDoubleElementsKind(constant_elements_kind)) {
369 copied_elements_values = isolate->factory()->CopyFixedDoubleArray( 369 copied_elements_values = isolate->factory()->CopyFixedDoubleArray(
370 Handle<FixedDoubleArray>::cast(constant_elements_values)); 370 Handle<FixedDoubleArray>::cast(constant_elements_values));
371 } else { 371 } else {
372 ASSERT(IsFastSmiOrObjectElementsKind(constant_elements_kind)); 372 DCHECK(IsFastSmiOrObjectElementsKind(constant_elements_kind));
373 const bool is_cow = 373 const bool is_cow =
374 (constant_elements_values->map() == 374 (constant_elements_values->map() ==
375 isolate->heap()->fixed_cow_array_map()); 375 isolate->heap()->fixed_cow_array_map());
376 if (is_cow) { 376 if (is_cow) {
377 copied_elements_values = constant_elements_values; 377 copied_elements_values = constant_elements_values;
378 #if DEBUG 378 #if DEBUG
379 Handle<FixedArray> fixed_array_values = 379 Handle<FixedArray> fixed_array_values =
380 Handle<FixedArray>::cast(copied_elements_values); 380 Handle<FixedArray>::cast(copied_elements_values);
381 for (int i = 0; i < fixed_array_values->length(); i++) { 381 for (int i = 0; i < fixed_array_values->length(); i++) {
382 ASSERT(!fixed_array_values->get(i)->IsFixedArray()); 382 DCHECK(!fixed_array_values->get(i)->IsFixedArray());
383 } 383 }
384 #endif 384 #endif
385 } else { 385 } else {
386 Handle<FixedArray> fixed_array_values = 386 Handle<FixedArray> fixed_array_values =
387 Handle<FixedArray>::cast(constant_elements_values); 387 Handle<FixedArray>::cast(constant_elements_values);
388 Handle<FixedArray> fixed_array_values_copy = 388 Handle<FixedArray> fixed_array_values_copy =
389 isolate->factory()->CopyFixedArray(fixed_array_values); 389 isolate->factory()->CopyFixedArray(fixed_array_values);
390 copied_elements_values = fixed_array_values_copy; 390 copied_elements_values = fixed_array_values_copy;
391 for (int i = 0; i < fixed_array_values->length(); i++) { 391 for (int i = 0; i < fixed_array_values->length(); i++) {
392 if (fixed_array_values->get(i)->IsFixedArray()) { 392 if (fixed_array_values->get(i)->IsFixedArray()) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 isolate, literals, elements); 435 isolate, literals, elements);
436 default: 436 default:
437 UNREACHABLE(); 437 UNREACHABLE();
438 return MaybeHandle<Object>(); 438 return MaybeHandle<Object>();
439 } 439 }
440 } 440 }
441 441
442 442
443 RUNTIME_FUNCTION(Runtime_CreateObjectLiteral) { 443 RUNTIME_FUNCTION(Runtime_CreateObjectLiteral) {
444 HandleScope scope(isolate); 444 HandleScope scope(isolate);
445 ASSERT(args.length() == 4); 445 DCHECK(args.length() == 4);
446 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); 446 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0);
447 CONVERT_SMI_ARG_CHECKED(literals_index, 1); 447 CONVERT_SMI_ARG_CHECKED(literals_index, 1);
448 CONVERT_ARG_HANDLE_CHECKED(FixedArray, constant_properties, 2); 448 CONVERT_ARG_HANDLE_CHECKED(FixedArray, constant_properties, 2);
449 CONVERT_SMI_ARG_CHECKED(flags, 3); 449 CONVERT_SMI_ARG_CHECKED(flags, 3);
450 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0; 450 bool should_have_fast_elements = (flags & ObjectLiteral::kFastElements) != 0;
451 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0; 451 bool has_function_literal = (flags & ObjectLiteral::kHasFunction) != 0;
452 452
453 RUNTIME_ASSERT(literals_index >= 0 && literals_index < literals->length()); 453 RUNTIME_ASSERT(literals_index >= 0 && literals_index < literals->length());
454 454
455 // Check if boilerplate exists. If not, create it first. 455 // Check if boilerplate exists. If not, create it first.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 496
497 MUST_USE_RESULT static MaybeHandle<AllocationSite> GetLiteralAllocationSite( 497 MUST_USE_RESULT static MaybeHandle<AllocationSite> GetLiteralAllocationSite(
498 Isolate* isolate, 498 Isolate* isolate,
499 Handle<FixedArray> literals, 499 Handle<FixedArray> literals,
500 int literals_index, 500 int literals_index,
501 Handle<FixedArray> elements) { 501 Handle<FixedArray> elements) {
502 // Check if boilerplate exists. If not, create it first. 502 // Check if boilerplate exists. If not, create it first.
503 Handle<Object> literal_site(literals->get(literals_index), isolate); 503 Handle<Object> literal_site(literals->get(literals_index), isolate);
504 Handle<AllocationSite> site; 504 Handle<AllocationSite> site;
505 if (*literal_site == isolate->heap()->undefined_value()) { 505 if (*literal_site == isolate->heap()->undefined_value()) {
506 ASSERT(*elements != isolate->heap()->empty_fixed_array()); 506 DCHECK(*elements != isolate->heap()->empty_fixed_array());
507 Handle<Object> boilerplate; 507 Handle<Object> boilerplate;
508 ASSIGN_RETURN_ON_EXCEPTION( 508 ASSIGN_RETURN_ON_EXCEPTION(
509 isolate, boilerplate, 509 isolate, boilerplate,
510 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements), 510 Runtime::CreateArrayLiteralBoilerplate(isolate, literals, elements),
511 AllocationSite); 511 AllocationSite);
512 512
513 AllocationSiteCreationContext creation_context(isolate); 513 AllocationSiteCreationContext creation_context(isolate);
514 site = creation_context.EnterNewScope(); 514 site = creation_context.EnterNewScope();
515 if (JSObject::DeepWalk(Handle<JSObject>::cast(boilerplate), 515 if (JSObject::DeepWalk(Handle<JSObject>::cast(boilerplate),
516 &creation_context).is_null()) { 516 &creation_context).is_null()) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 : JSObject::kObjectIsShallow; 549 : JSObject::kObjectIsShallow;
550 MaybeHandle<JSObject> copy = JSObject::DeepCopy(boilerplate, &usage_context, 550 MaybeHandle<JSObject> copy = JSObject::DeepCopy(boilerplate, &usage_context,
551 hints); 551 hints);
552 usage_context.ExitScope(site, boilerplate); 552 usage_context.ExitScope(site, boilerplate);
553 return copy; 553 return copy;
554 } 554 }
555 555
556 556
557 RUNTIME_FUNCTION(Runtime_CreateArrayLiteral) { 557 RUNTIME_FUNCTION(Runtime_CreateArrayLiteral) {
558 HandleScope scope(isolate); 558 HandleScope scope(isolate);
559 ASSERT(args.length() == 4); 559 DCHECK(args.length() == 4);
560 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); 560 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0);
561 CONVERT_SMI_ARG_CHECKED(literals_index, 1); 561 CONVERT_SMI_ARG_CHECKED(literals_index, 1);
562 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2); 562 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2);
563 CONVERT_SMI_ARG_CHECKED(flags, 3); 563 CONVERT_SMI_ARG_CHECKED(flags, 3);
564 564
565 Handle<JSObject> result; 565 Handle<JSObject> result;
566 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 566 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
567 CreateArrayLiteralImpl(isolate, literals, literals_index, elements, 567 CreateArrayLiteralImpl(isolate, literals, literals_index, elements,
568 flags)); 568 flags));
569 return *result; 569 return *result;
570 } 570 }
571 571
572 572
573 RUNTIME_FUNCTION(Runtime_CreateArrayLiteralStubBailout) { 573 RUNTIME_FUNCTION(Runtime_CreateArrayLiteralStubBailout) {
574 HandleScope scope(isolate); 574 HandleScope scope(isolate);
575 ASSERT(args.length() == 3); 575 DCHECK(args.length() == 3);
576 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); 576 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0);
577 CONVERT_SMI_ARG_CHECKED(literals_index, 1); 577 CONVERT_SMI_ARG_CHECKED(literals_index, 1);
578 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2); 578 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2);
579 579
580 Handle<JSObject> result; 580 Handle<JSObject> result;
581 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 581 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
582 CreateArrayLiteralImpl(isolate, literals, literals_index, elements, 582 CreateArrayLiteralImpl(isolate, literals, literals_index, elements,
583 ArrayLiteral::kShallowElements)); 583 ArrayLiteral::kShallowElements));
584 return *result; 584 return *result;
585 } 585 }
586 586
587 587
588 RUNTIME_FUNCTION(Runtime_CreateSymbol) { 588 RUNTIME_FUNCTION(Runtime_CreateSymbol) {
589 HandleScope scope(isolate); 589 HandleScope scope(isolate);
590 ASSERT(args.length() == 1); 590 DCHECK(args.length() == 1);
591 CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); 591 CONVERT_ARG_HANDLE_CHECKED(Object, name, 0);
592 RUNTIME_ASSERT(name->IsString() || name->IsUndefined()); 592 RUNTIME_ASSERT(name->IsString() || name->IsUndefined());
593 Handle<Symbol> symbol = isolate->factory()->NewSymbol(); 593 Handle<Symbol> symbol = isolate->factory()->NewSymbol();
594 if (name->IsString()) symbol->set_name(*name); 594 if (name->IsString()) symbol->set_name(*name);
595 return *symbol; 595 return *symbol;
596 } 596 }
597 597
598 598
599 RUNTIME_FUNCTION(Runtime_CreatePrivateSymbol) { 599 RUNTIME_FUNCTION(Runtime_CreatePrivateSymbol) {
600 HandleScope scope(isolate); 600 HandleScope scope(isolate);
601 ASSERT(args.length() == 1); 601 DCHECK(args.length() == 1);
602 CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); 602 CONVERT_ARG_HANDLE_CHECKED(Object, name, 0);
603 RUNTIME_ASSERT(name->IsString() || name->IsUndefined()); 603 RUNTIME_ASSERT(name->IsString() || name->IsUndefined());
604 Handle<Symbol> symbol = isolate->factory()->NewPrivateSymbol(); 604 Handle<Symbol> symbol = isolate->factory()->NewPrivateSymbol();
605 if (name->IsString()) symbol->set_name(*name); 605 if (name->IsString()) symbol->set_name(*name);
606 return *symbol; 606 return *symbol;
607 } 607 }
608 608
609 609
610 RUNTIME_FUNCTION(Runtime_CreateGlobalPrivateSymbol) { 610 RUNTIME_FUNCTION(Runtime_CreateGlobalPrivateSymbol) {
611 HandleScope scope(isolate); 611 HandleScope scope(isolate);
612 ASSERT(args.length() == 1); 612 DCHECK(args.length() == 1);
613 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); 613 CONVERT_ARG_HANDLE_CHECKED(String, name, 0);
614 Handle<JSObject> registry = isolate->GetSymbolRegistry(); 614 Handle<JSObject> registry = isolate->GetSymbolRegistry();
615 Handle<String> part = isolate->factory()->private_intern_string(); 615 Handle<String> part = isolate->factory()->private_intern_string();
616 Handle<Object> privates; 616 Handle<Object> privates;
617 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 617 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
618 isolate, privates, Object::GetPropertyOrElement(registry, part)); 618 isolate, privates, Object::GetPropertyOrElement(registry, part));
619 Handle<Object> symbol; 619 Handle<Object> symbol;
620 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 620 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
621 isolate, symbol, Object::GetPropertyOrElement(privates, name)); 621 isolate, symbol, Object::GetPropertyOrElement(privates, name));
622 if (!symbol->IsSymbol()) { 622 if (!symbol->IsSymbol()) {
623 ASSERT(symbol->IsUndefined()); 623 DCHECK(symbol->IsUndefined());
624 symbol = isolate->factory()->NewPrivateSymbol(); 624 symbol = isolate->factory()->NewPrivateSymbol();
625 Handle<Symbol>::cast(symbol)->set_name(*name); 625 Handle<Symbol>::cast(symbol)->set_name(*name);
626 JSObject::SetProperty(Handle<JSObject>::cast(privates), name, symbol, 626 JSObject::SetProperty(Handle<JSObject>::cast(privates), name, symbol,
627 STRICT).Assert(); 627 STRICT).Assert();
628 } 628 }
629 return *symbol; 629 return *symbol;
630 } 630 }
631 631
632 632
633 RUNTIME_FUNCTION(Runtime_NewSymbolWrapper) { 633 RUNTIME_FUNCTION(Runtime_NewSymbolWrapper) {
634 HandleScope scope(isolate); 634 HandleScope scope(isolate);
635 ASSERT(args.length() == 1); 635 DCHECK(args.length() == 1);
636 CONVERT_ARG_HANDLE_CHECKED(Symbol, symbol, 0); 636 CONVERT_ARG_HANDLE_CHECKED(Symbol, symbol, 0);
637 return *Object::ToObject(isolate, symbol).ToHandleChecked(); 637 return *Object::ToObject(isolate, symbol).ToHandleChecked();
638 } 638 }
639 639
640 640
641 RUNTIME_FUNCTION(Runtime_SymbolDescription) { 641 RUNTIME_FUNCTION(Runtime_SymbolDescription) {
642 SealHandleScope shs(isolate); 642 SealHandleScope shs(isolate);
643 ASSERT(args.length() == 1); 643 DCHECK(args.length() == 1);
644 CONVERT_ARG_CHECKED(Symbol, symbol, 0); 644 CONVERT_ARG_CHECKED(Symbol, symbol, 0);
645 return symbol->name(); 645 return symbol->name();
646 } 646 }
647 647
648 648
649 RUNTIME_FUNCTION(Runtime_SymbolRegistry) { 649 RUNTIME_FUNCTION(Runtime_SymbolRegistry) {
650 HandleScope scope(isolate); 650 HandleScope scope(isolate);
651 ASSERT(args.length() == 0); 651 DCHECK(args.length() == 0);
652 return *isolate->GetSymbolRegistry(); 652 return *isolate->GetSymbolRegistry();
653 } 653 }
654 654
655 655
656 RUNTIME_FUNCTION(Runtime_SymbolIsPrivate) { 656 RUNTIME_FUNCTION(Runtime_SymbolIsPrivate) {
657 SealHandleScope shs(isolate); 657 SealHandleScope shs(isolate);
658 ASSERT(args.length() == 1); 658 DCHECK(args.length() == 1);
659 CONVERT_ARG_CHECKED(Symbol, symbol, 0); 659 CONVERT_ARG_CHECKED(Symbol, symbol, 0);
660 return isolate->heap()->ToBoolean(symbol->is_private()); 660 return isolate->heap()->ToBoolean(symbol->is_private());
661 } 661 }
662 662
663 663
664 RUNTIME_FUNCTION(Runtime_CreateJSProxy) { 664 RUNTIME_FUNCTION(Runtime_CreateJSProxy) {
665 HandleScope scope(isolate); 665 HandleScope scope(isolate);
666 ASSERT(args.length() == 2); 666 DCHECK(args.length() == 2);
667 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, handler, 0); 667 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, handler, 0);
668 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1); 668 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1);
669 if (!prototype->IsJSReceiver()) prototype = isolate->factory()->null_value(); 669 if (!prototype->IsJSReceiver()) prototype = isolate->factory()->null_value();
670 return *isolate->factory()->NewJSProxy(handler, prototype); 670 return *isolate->factory()->NewJSProxy(handler, prototype);
671 } 671 }
672 672
673 673
674 RUNTIME_FUNCTION(Runtime_CreateJSFunctionProxy) { 674 RUNTIME_FUNCTION(Runtime_CreateJSFunctionProxy) {
675 HandleScope scope(isolate); 675 HandleScope scope(isolate);
676 ASSERT(args.length() == 4); 676 DCHECK(args.length() == 4);
677 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, handler, 0); 677 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, handler, 0);
678 CONVERT_ARG_HANDLE_CHECKED(Object, call_trap, 1); 678 CONVERT_ARG_HANDLE_CHECKED(Object, call_trap, 1);
679 RUNTIME_ASSERT(call_trap->IsJSFunction() || call_trap->IsJSFunctionProxy()); 679 RUNTIME_ASSERT(call_trap->IsJSFunction() || call_trap->IsJSFunctionProxy());
680 CONVERT_ARG_HANDLE_CHECKED(JSFunction, construct_trap, 2); 680 CONVERT_ARG_HANDLE_CHECKED(JSFunction, construct_trap, 2);
681 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 3); 681 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 3);
682 if (!prototype->IsJSReceiver()) prototype = isolate->factory()->null_value(); 682 if (!prototype->IsJSReceiver()) prototype = isolate->factory()->null_value();
683 return *isolate->factory()->NewJSFunctionProxy( 683 return *isolate->factory()->NewJSFunctionProxy(
684 handler, call_trap, construct_trap, prototype); 684 handler, call_trap, construct_trap, prototype);
685 } 685 }
686 686
687 687
688 RUNTIME_FUNCTION(Runtime_IsJSProxy) { 688 RUNTIME_FUNCTION(Runtime_IsJSProxy) {
689 SealHandleScope shs(isolate); 689 SealHandleScope shs(isolate);
690 ASSERT(args.length() == 1); 690 DCHECK(args.length() == 1);
691 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0); 691 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0);
692 return isolate->heap()->ToBoolean(obj->IsJSProxy()); 692 return isolate->heap()->ToBoolean(obj->IsJSProxy());
693 } 693 }
694 694
695 695
696 RUNTIME_FUNCTION(Runtime_IsJSFunctionProxy) { 696 RUNTIME_FUNCTION(Runtime_IsJSFunctionProxy) {
697 SealHandleScope shs(isolate); 697 SealHandleScope shs(isolate);
698 ASSERT(args.length() == 1); 698 DCHECK(args.length() == 1);
699 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0); 699 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0);
700 return isolate->heap()->ToBoolean(obj->IsJSFunctionProxy()); 700 return isolate->heap()->ToBoolean(obj->IsJSFunctionProxy());
701 } 701 }
702 702
703 703
704 RUNTIME_FUNCTION(Runtime_GetHandler) { 704 RUNTIME_FUNCTION(Runtime_GetHandler) {
705 SealHandleScope shs(isolate); 705 SealHandleScope shs(isolate);
706 ASSERT(args.length() == 1); 706 DCHECK(args.length() == 1);
707 CONVERT_ARG_CHECKED(JSProxy, proxy, 0); 707 CONVERT_ARG_CHECKED(JSProxy, proxy, 0);
708 return proxy->handler(); 708 return proxy->handler();
709 } 709 }
710 710
711 711
712 RUNTIME_FUNCTION(Runtime_GetCallTrap) { 712 RUNTIME_FUNCTION(Runtime_GetCallTrap) {
713 SealHandleScope shs(isolate); 713 SealHandleScope shs(isolate);
714 ASSERT(args.length() == 1); 714 DCHECK(args.length() == 1);
715 CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0); 715 CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0);
716 return proxy->call_trap(); 716 return proxy->call_trap();
717 } 717 }
718 718
719 719
720 RUNTIME_FUNCTION(Runtime_GetConstructTrap) { 720 RUNTIME_FUNCTION(Runtime_GetConstructTrap) {
721 SealHandleScope shs(isolate); 721 SealHandleScope shs(isolate);
722 ASSERT(args.length() == 1); 722 DCHECK(args.length() == 1);
723 CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0); 723 CONVERT_ARG_CHECKED(JSFunctionProxy, proxy, 0);
724 return proxy->construct_trap(); 724 return proxy->construct_trap();
725 } 725 }
726 726
727 727
728 RUNTIME_FUNCTION(Runtime_Fix) { 728 RUNTIME_FUNCTION(Runtime_Fix) {
729 HandleScope scope(isolate); 729 HandleScope scope(isolate);
730 ASSERT(args.length() == 1); 730 DCHECK(args.length() == 1);
731 CONVERT_ARG_HANDLE_CHECKED(JSProxy, proxy, 0); 731 CONVERT_ARG_HANDLE_CHECKED(JSProxy, proxy, 0);
732 JSProxy::Fix(proxy); 732 JSProxy::Fix(proxy);
733 return isolate->heap()->undefined_value(); 733 return isolate->heap()->undefined_value();
734 } 734 }
735 735
736 736
737 void Runtime::FreeArrayBuffer(Isolate* isolate, 737 void Runtime::FreeArrayBuffer(Isolate* isolate,
738 JSArrayBuffer* phantom_array_buffer) { 738 JSArrayBuffer* phantom_array_buffer) {
739 if (phantom_array_buffer->should_be_freed()) { 739 if (phantom_array_buffer->should_be_freed()) {
740 ASSERT(phantom_array_buffer->is_external()); 740 DCHECK(phantom_array_buffer->is_external());
741 free(phantom_array_buffer->backing_store()); 741 free(phantom_array_buffer->backing_store());
742 } 742 }
743 if (phantom_array_buffer->is_external()) return; 743 if (phantom_array_buffer->is_external()) return;
744 744
745 size_t allocated_length = NumberToSize( 745 size_t allocated_length = NumberToSize(
746 isolate, phantom_array_buffer->byte_length()); 746 isolate, phantom_array_buffer->byte_length());
747 747
748 reinterpret_cast<v8::Isolate*>(isolate) 748 reinterpret_cast<v8::Isolate*>(isolate)
749 ->AdjustAmountOfExternalAllocatedMemory( 749 ->AdjustAmountOfExternalAllocatedMemory(
750 -static_cast<int64_t>(allocated_length)); 750 -static_cast<int64_t>(allocated_length));
751 CHECK(V8::ArrayBufferAllocator() != NULL); 751 CHECK(V8::ArrayBufferAllocator() != NULL);
752 V8::ArrayBufferAllocator()->Free( 752 V8::ArrayBufferAllocator()->Free(
753 phantom_array_buffer->backing_store(), 753 phantom_array_buffer->backing_store(),
754 allocated_length); 754 allocated_length);
755 } 755 }
756 756
757 757
758 void Runtime::SetupArrayBuffer(Isolate* isolate, 758 void Runtime::SetupArrayBuffer(Isolate* isolate,
759 Handle<JSArrayBuffer> array_buffer, 759 Handle<JSArrayBuffer> array_buffer,
760 bool is_external, 760 bool is_external,
761 void* data, 761 void* data,
762 size_t allocated_length) { 762 size_t allocated_length) {
763 ASSERT(array_buffer->GetInternalFieldCount() == 763 DCHECK(array_buffer->GetInternalFieldCount() ==
764 v8::ArrayBuffer::kInternalFieldCount); 764 v8::ArrayBuffer::kInternalFieldCount);
765 for (int i = 0; i < v8::ArrayBuffer::kInternalFieldCount; i++) { 765 for (int i = 0; i < v8::ArrayBuffer::kInternalFieldCount; i++) {
766 array_buffer->SetInternalField(i, Smi::FromInt(0)); 766 array_buffer->SetInternalField(i, Smi::FromInt(0));
767 } 767 }
768 array_buffer->set_backing_store(data); 768 array_buffer->set_backing_store(data);
769 array_buffer->set_flag(Smi::FromInt(0)); 769 array_buffer->set_flag(Smi::FromInt(0));
770 array_buffer->set_is_external(is_external); 770 array_buffer->set_is_external(is_external);
771 771
772 Handle<Object> byte_length = 772 Handle<Object> byte_length =
773 isolate->factory()->NewNumberFromSize(allocated_length); 773 isolate->factory()->NewNumberFromSize(allocated_length);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
821 UNREACHABLE(); 821 UNREACHABLE();
822 } 822 }
823 view_obj = handle(view->weak_next(), isolate); 823 view_obj = handle(view->weak_next(), isolate);
824 } 824 }
825 array_buffer->Neuter(); 825 array_buffer->Neuter();
826 } 826 }
827 827
828 828
829 RUNTIME_FUNCTION(Runtime_ArrayBufferInitialize) { 829 RUNTIME_FUNCTION(Runtime_ArrayBufferInitialize) {
830 HandleScope scope(isolate); 830 HandleScope scope(isolate);
831 ASSERT(args.length() == 2); 831 DCHECK(args.length() == 2);
832 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, holder, 0); 832 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, holder, 0);
833 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byteLength, 1); 833 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byteLength, 1);
834 if (!holder->byte_length()->IsUndefined()) { 834 if (!holder->byte_length()->IsUndefined()) {
835 // ArrayBuffer is already initialized; probably a fuzz test. 835 // ArrayBuffer is already initialized; probably a fuzz test.
836 return *holder; 836 return *holder;
837 } 837 }
838 size_t allocated_length = 0; 838 size_t allocated_length = 0;
839 if (!TryNumberToSize(isolate, *byteLength, &allocated_length)) { 839 if (!TryNumberToSize(isolate, *byteLength, &allocated_length)) {
840 return isolate->Throw( 840 return isolate->Throw(
841 *isolate->factory()->NewRangeError("invalid_array_buffer_length", 841 *isolate->factory()->NewRangeError("invalid_array_buffer_length",
842 HandleVector<Object>(NULL, 0))); 842 HandleVector<Object>(NULL, 0)));
843 } 843 }
844 if (!Runtime::SetupArrayBufferAllocatingData(isolate, 844 if (!Runtime::SetupArrayBufferAllocatingData(isolate,
845 holder, allocated_length)) { 845 holder, allocated_length)) {
846 return isolate->Throw( 846 return isolate->Throw(
847 *isolate->factory()->NewRangeError("invalid_array_buffer_length", 847 *isolate->factory()->NewRangeError("invalid_array_buffer_length",
848 HandleVector<Object>(NULL, 0))); 848 HandleVector<Object>(NULL, 0)));
849 } 849 }
850 return *holder; 850 return *holder;
851 } 851 }
852 852
853 853
854 RUNTIME_FUNCTION(Runtime_ArrayBufferGetByteLength) { 854 RUNTIME_FUNCTION(Runtime_ArrayBufferGetByteLength) {
855 SealHandleScope shs(isolate); 855 SealHandleScope shs(isolate);
856 ASSERT(args.length() == 1); 856 DCHECK(args.length() == 1);
857 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0); 857 CONVERT_ARG_CHECKED(JSArrayBuffer, holder, 0);
858 return holder->byte_length(); 858 return holder->byte_length();
859 } 859 }
860 860
861 861
862 RUNTIME_FUNCTION(Runtime_ArrayBufferSliceImpl) { 862 RUNTIME_FUNCTION(Runtime_ArrayBufferSliceImpl) {
863 HandleScope scope(isolate); 863 HandleScope scope(isolate);
864 ASSERT(args.length() == 3); 864 DCHECK(args.length() == 3);
865 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, source, 0); 865 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, source, 0);
866 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, target, 1); 866 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, target, 1);
867 CONVERT_NUMBER_ARG_HANDLE_CHECKED(first, 2); 867 CONVERT_NUMBER_ARG_HANDLE_CHECKED(first, 2);
868 RUNTIME_ASSERT(!source.is_identical_to(target)); 868 RUNTIME_ASSERT(!source.is_identical_to(target));
869 size_t start = 0; 869 size_t start = 0;
870 RUNTIME_ASSERT(TryNumberToSize(isolate, *first, &start)); 870 RUNTIME_ASSERT(TryNumberToSize(isolate, *first, &start));
871 size_t target_length = NumberToSize(isolate, target->byte_length()); 871 size_t target_length = NumberToSize(isolate, target->byte_length());
872 872
873 if (target_length == 0) return isolate->heap()->undefined_value(); 873 if (target_length == 0) return isolate->heap()->undefined_value();
874 874
875 size_t source_byte_length = NumberToSize(isolate, source->byte_length()); 875 size_t source_byte_length = NumberToSize(isolate, source->byte_length());
876 RUNTIME_ASSERT(start <= source_byte_length); 876 RUNTIME_ASSERT(start <= source_byte_length);
877 RUNTIME_ASSERT(source_byte_length - start >= target_length); 877 RUNTIME_ASSERT(source_byte_length - start >= target_length);
878 uint8_t* source_data = reinterpret_cast<uint8_t*>(source->backing_store()); 878 uint8_t* source_data = reinterpret_cast<uint8_t*>(source->backing_store());
879 uint8_t* target_data = reinterpret_cast<uint8_t*>(target->backing_store()); 879 uint8_t* target_data = reinterpret_cast<uint8_t*>(target->backing_store());
880 CopyBytes(target_data, source_data + start, target_length); 880 CopyBytes(target_data, source_data + start, target_length);
881 return isolate->heap()->undefined_value(); 881 return isolate->heap()->undefined_value();
882 } 882 }
883 883
884 884
885 RUNTIME_FUNCTION(Runtime_ArrayBufferIsView) { 885 RUNTIME_FUNCTION(Runtime_ArrayBufferIsView) {
886 HandleScope scope(isolate); 886 HandleScope scope(isolate);
887 ASSERT(args.length() == 1); 887 DCHECK(args.length() == 1);
888 CONVERT_ARG_CHECKED(Object, object, 0); 888 CONVERT_ARG_CHECKED(Object, object, 0);
889 return isolate->heap()->ToBoolean(object->IsJSArrayBufferView()); 889 return isolate->heap()->ToBoolean(object->IsJSArrayBufferView());
890 } 890 }
891 891
892 892
893 RUNTIME_FUNCTION(Runtime_ArrayBufferNeuter) { 893 RUNTIME_FUNCTION(Runtime_ArrayBufferNeuter) {
894 HandleScope scope(isolate); 894 HandleScope scope(isolate);
895 ASSERT(args.length() == 1); 895 DCHECK(args.length() == 1);
896 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, array_buffer, 0); 896 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, array_buffer, 0);
897 if (array_buffer->backing_store() == NULL) { 897 if (array_buffer->backing_store() == NULL) {
898 CHECK(Smi::FromInt(0) == array_buffer->byte_length()); 898 CHECK(Smi::FromInt(0) == array_buffer->byte_length());
899 return isolate->heap()->undefined_value(); 899 return isolate->heap()->undefined_value();
900 } 900 }
901 ASSERT(!array_buffer->is_external()); 901 DCHECK(!array_buffer->is_external());
902 void* backing_store = array_buffer->backing_store(); 902 void* backing_store = array_buffer->backing_store();
903 size_t byte_length = NumberToSize(isolate, array_buffer->byte_length()); 903 size_t byte_length = NumberToSize(isolate, array_buffer->byte_length());
904 array_buffer->set_is_external(true); 904 array_buffer->set_is_external(true);
905 Runtime::NeuterArrayBuffer(array_buffer); 905 Runtime::NeuterArrayBuffer(array_buffer);
906 V8::ArrayBufferAllocator()->Free(backing_store, byte_length); 906 V8::ArrayBufferAllocator()->Free(backing_store, byte_length);
907 return isolate->heap()->undefined_value(); 907 return isolate->heap()->undefined_value();
908 } 908 }
909 909
910 910
911 void Runtime::ArrayIdToTypeAndSize( 911 void Runtime::ArrayIdToTypeAndSize(
(...skipping 15 matching lines...) Expand all
927 #undef ARRAY_ID_CASE 927 #undef ARRAY_ID_CASE
928 928
929 default: 929 default:
930 UNREACHABLE(); 930 UNREACHABLE();
931 } 931 }
932 } 932 }
933 933
934 934
935 RUNTIME_FUNCTION(Runtime_TypedArrayInitialize) { 935 RUNTIME_FUNCTION(Runtime_TypedArrayInitialize) {
936 HandleScope scope(isolate); 936 HandleScope scope(isolate);
937 ASSERT(args.length() == 5); 937 DCHECK(args.length() == 5);
938 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); 938 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0);
939 CONVERT_SMI_ARG_CHECKED(arrayId, 1); 939 CONVERT_SMI_ARG_CHECKED(arrayId, 1);
940 CONVERT_ARG_HANDLE_CHECKED(Object, maybe_buffer, 2); 940 CONVERT_ARG_HANDLE_CHECKED(Object, maybe_buffer, 2);
941 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_offset_object, 3); 941 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_offset_object, 3);
942 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_length_object, 4); 942 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_length_object, 4);
943 943
944 RUNTIME_ASSERT(arrayId >= Runtime::ARRAY_ID_FIRST && 944 RUNTIME_ASSERT(arrayId >= Runtime::ARRAY_ID_FIRST &&
945 arrayId <= Runtime::ARRAY_ID_LAST); 945 arrayId <= Runtime::ARRAY_ID_LAST);
946 946
947 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. 947 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization.
(...skipping 27 matching lines...) Expand all
975 size_t length = byte_length / element_size; 975 size_t length = byte_length / element_size;
976 976
977 if (length > static_cast<unsigned>(Smi::kMaxValue)) { 977 if (length > static_cast<unsigned>(Smi::kMaxValue)) {
978 return isolate->Throw( 978 return isolate->Throw(
979 *isolate->factory()->NewRangeError("invalid_typed_array_length", 979 *isolate->factory()->NewRangeError("invalid_typed_array_length",
980 HandleVector<Object>(NULL, 0))); 980 HandleVector<Object>(NULL, 0)));
981 } 981 }
982 982
983 // All checks are done, now we can modify objects. 983 // All checks are done, now we can modify objects.
984 984
985 ASSERT(holder->GetInternalFieldCount() == 985 DCHECK(holder->GetInternalFieldCount() ==
986 v8::ArrayBufferView::kInternalFieldCount); 986 v8::ArrayBufferView::kInternalFieldCount);
987 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { 987 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) {
988 holder->SetInternalField(i, Smi::FromInt(0)); 988 holder->SetInternalField(i, Smi::FromInt(0));
989 } 989 }
990 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length); 990 Handle<Object> length_obj = isolate->factory()->NewNumberFromSize(length);
991 holder->set_length(*length_obj); 991 holder->set_length(*length_obj);
992 holder->set_byte_offset(*byte_offset_object); 992 holder->set_byte_offset(*byte_offset_object);
993 holder->set_byte_length(*byte_length_object); 993 holder->set_byte_length(*byte_length_object);
994 994
995 if (!maybe_buffer->IsNull()) { 995 if (!maybe_buffer->IsNull()) {
996 Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer); 996 Handle<JSArrayBuffer> buffer = Handle<JSArrayBuffer>::cast(maybe_buffer);
997 holder->set_buffer(*buffer); 997 holder->set_buffer(*buffer);
998 holder->set_weak_next(buffer->weak_first_view()); 998 holder->set_weak_next(buffer->weak_first_view());
999 buffer->set_weak_first_view(*holder); 999 buffer->set_weak_first_view(*holder);
1000 1000
1001 Handle<ExternalArray> elements = 1001 Handle<ExternalArray> elements =
1002 isolate->factory()->NewExternalArray( 1002 isolate->factory()->NewExternalArray(
1003 static_cast<int>(length), array_type, 1003 static_cast<int>(length), array_type,
1004 static_cast<uint8_t*>(buffer->backing_store()) + byte_offset); 1004 static_cast<uint8_t*>(buffer->backing_store()) + byte_offset);
1005 Handle<Map> map = 1005 Handle<Map> map =
1006 JSObject::GetElementsTransitionMap(holder, external_elements_kind); 1006 JSObject::GetElementsTransitionMap(holder, external_elements_kind);
1007 JSObject::SetMapAndElements(holder, map, elements); 1007 JSObject::SetMapAndElements(holder, map, elements);
1008 ASSERT(IsExternalArrayElementsKind(holder->map()->elements_kind())); 1008 DCHECK(IsExternalArrayElementsKind(holder->map()->elements_kind()));
1009 } else { 1009 } else {
1010 holder->set_buffer(Smi::FromInt(0)); 1010 holder->set_buffer(Smi::FromInt(0));
1011 holder->set_weak_next(isolate->heap()->undefined_value()); 1011 holder->set_weak_next(isolate->heap()->undefined_value());
1012 Handle<FixedTypedArrayBase> elements = 1012 Handle<FixedTypedArrayBase> elements =
1013 isolate->factory()->NewFixedTypedArray( 1013 isolate->factory()->NewFixedTypedArray(
1014 static_cast<int>(length), array_type); 1014 static_cast<int>(length), array_type);
1015 holder->set_elements(*elements); 1015 holder->set_elements(*elements);
1016 } 1016 }
1017 return isolate->heap()->undefined_value(); 1017 return isolate->heap()->undefined_value();
1018 } 1018 }
1019 1019
1020 1020
1021 // Initializes a typed array from an array-like object. 1021 // Initializes a typed array from an array-like object.
1022 // If an array-like object happens to be a typed array of the same type, 1022 // If an array-like object happens to be a typed array of the same type,
1023 // initializes backing store using memove. 1023 // initializes backing store using memove.
1024 // 1024 //
1025 // Returns true if backing store was initialized or false otherwise. 1025 // Returns true if backing store was initialized or false otherwise.
1026 RUNTIME_FUNCTION(Runtime_TypedArrayInitializeFromArrayLike) { 1026 RUNTIME_FUNCTION(Runtime_TypedArrayInitializeFromArrayLike) {
1027 HandleScope scope(isolate); 1027 HandleScope scope(isolate);
1028 ASSERT(args.length() == 4); 1028 DCHECK(args.length() == 4);
1029 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); 1029 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0);
1030 CONVERT_SMI_ARG_CHECKED(arrayId, 1); 1030 CONVERT_SMI_ARG_CHECKED(arrayId, 1);
1031 CONVERT_ARG_HANDLE_CHECKED(Object, source, 2); 1031 CONVERT_ARG_HANDLE_CHECKED(Object, source, 2);
1032 CONVERT_NUMBER_ARG_HANDLE_CHECKED(length_obj, 3); 1032 CONVERT_NUMBER_ARG_HANDLE_CHECKED(length_obj, 3);
1033 1033
1034 RUNTIME_ASSERT(arrayId >= Runtime::ARRAY_ID_FIRST && 1034 RUNTIME_ASSERT(arrayId >= Runtime::ARRAY_ID_FIRST &&
1035 arrayId <= Runtime::ARRAY_ID_LAST); 1035 arrayId <= Runtime::ARRAY_ID_LAST);
1036 1036
1037 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. 1037 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization.
1038 size_t element_size = 1; // Bogus initialization. 1038 size_t element_size = 1; // Bogus initialization.
(...skipping 17 matching lines...) Expand all
1056 RUNTIME_ASSERT(TryNumberToSize(isolate, *length_obj, &length)); 1056 RUNTIME_ASSERT(TryNumberToSize(isolate, *length_obj, &length));
1057 1057
1058 if ((length > static_cast<unsigned>(Smi::kMaxValue)) || 1058 if ((length > static_cast<unsigned>(Smi::kMaxValue)) ||
1059 (length > (kMaxInt / element_size))) { 1059 (length > (kMaxInt / element_size))) {
1060 return isolate->Throw(*isolate->factory()-> 1060 return isolate->Throw(*isolate->factory()->
1061 NewRangeError("invalid_typed_array_length", 1061 NewRangeError("invalid_typed_array_length",
1062 HandleVector<Object>(NULL, 0))); 1062 HandleVector<Object>(NULL, 0)));
1063 } 1063 }
1064 size_t byte_length = length * element_size; 1064 size_t byte_length = length * element_size;
1065 1065
1066 ASSERT(holder->GetInternalFieldCount() == 1066 DCHECK(holder->GetInternalFieldCount() ==
1067 v8::ArrayBufferView::kInternalFieldCount); 1067 v8::ArrayBufferView::kInternalFieldCount);
1068 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { 1068 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) {
1069 holder->SetInternalField(i, Smi::FromInt(0)); 1069 holder->SetInternalField(i, Smi::FromInt(0));
1070 } 1070 }
1071 1071
1072 // NOTE: not initializing backing store. 1072 // NOTE: not initializing backing store.
1073 // We assume that the caller of this function will initialize holder 1073 // We assume that the caller of this function will initialize holder
1074 // with the loop 1074 // with the loop
1075 // for(i = 0; i < length; i++) { holder[i] = source[i]; } 1075 // for(i = 0; i < length; i++) { holder[i] = source[i]; }
1076 // We assume that the caller of this function is always a typed array 1076 // We assume that the caller of this function is always a typed array
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1126 } 1126 }
1127 } 1127 }
1128 1128
1129 return isolate->heap()->false_value(); 1129 return isolate->heap()->false_value();
1130 } 1130 }
1131 1131
1132 1132
1133 #define BUFFER_VIEW_GETTER(Type, getter, accessor) \ 1133 #define BUFFER_VIEW_GETTER(Type, getter, accessor) \
1134 RUNTIME_FUNCTION(Runtime_##Type##Get##getter) { \ 1134 RUNTIME_FUNCTION(Runtime_##Type##Get##getter) { \
1135 HandleScope scope(isolate); \ 1135 HandleScope scope(isolate); \
1136 ASSERT(args.length() == 1); \ 1136 DCHECK(args.length() == 1); \
1137 CONVERT_ARG_HANDLE_CHECKED(JS##Type, holder, 0); \ 1137 CONVERT_ARG_HANDLE_CHECKED(JS##Type, holder, 0); \
1138 return holder->accessor(); \ 1138 return holder->accessor(); \
1139 } 1139 }
1140 1140
1141 BUFFER_VIEW_GETTER(ArrayBufferView, ByteLength, byte_length) 1141 BUFFER_VIEW_GETTER(ArrayBufferView, ByteLength, byte_length)
1142 BUFFER_VIEW_GETTER(ArrayBufferView, ByteOffset, byte_offset) 1142 BUFFER_VIEW_GETTER(ArrayBufferView, ByteOffset, byte_offset)
1143 BUFFER_VIEW_GETTER(TypedArray, Length, length) 1143 BUFFER_VIEW_GETTER(TypedArray, Length, length)
1144 BUFFER_VIEW_GETTER(DataView, Buffer, buffer) 1144 BUFFER_VIEW_GETTER(DataView, Buffer, buffer)
1145 1145
1146 #undef BUFFER_VIEW_GETTER 1146 #undef BUFFER_VIEW_GETTER
1147 1147
1148 RUNTIME_FUNCTION(Runtime_TypedArrayGetBuffer) { 1148 RUNTIME_FUNCTION(Runtime_TypedArrayGetBuffer) {
1149 HandleScope scope(isolate); 1149 HandleScope scope(isolate);
1150 ASSERT(args.length() == 1); 1150 DCHECK(args.length() == 1);
1151 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0); 1151 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, holder, 0);
1152 return *holder->GetBuffer(); 1152 return *holder->GetBuffer();
1153 } 1153 }
1154 1154
1155 1155
1156 // Return codes for Runtime_TypedArraySetFastCases. 1156 // Return codes for Runtime_TypedArraySetFastCases.
1157 // Should be synchronized with typedarray.js natives. 1157 // Should be synchronized with typedarray.js natives.
1158 enum TypedArraySetResultCodes { 1158 enum TypedArraySetResultCodes {
1159 // Set from typed array of the same type. 1159 // Set from typed array of the same type.
1160 // This is processed by TypedArraySetFastCases 1160 // This is processed by TypedArraySetFastCases
1161 TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE = 0, 1161 TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE = 0,
1162 // Set from typed array of the different type, overlapping in memory. 1162 // Set from typed array of the different type, overlapping in memory.
1163 TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING = 1, 1163 TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING = 1,
1164 // Set from typed array of the different type, non-overlapping. 1164 // Set from typed array of the different type, non-overlapping.
1165 TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING = 2, 1165 TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING = 2,
1166 // Set from non-typed array. 1166 // Set from non-typed array.
1167 TYPED_ARRAY_SET_NON_TYPED_ARRAY = 3 1167 TYPED_ARRAY_SET_NON_TYPED_ARRAY = 3
1168 }; 1168 };
1169 1169
1170 1170
1171 RUNTIME_FUNCTION(Runtime_TypedArraySetFastCases) { 1171 RUNTIME_FUNCTION(Runtime_TypedArraySetFastCases) {
1172 HandleScope scope(isolate); 1172 HandleScope scope(isolate);
1173 ASSERT(args.length() == 3); 1173 DCHECK(args.length() == 3);
1174 if (!args[0]->IsJSTypedArray()) 1174 if (!args[0]->IsJSTypedArray())
1175 return isolate->Throw(*isolate->factory()->NewTypeError( 1175 return isolate->Throw(*isolate->factory()->NewTypeError(
1176 "not_typed_array", HandleVector<Object>(NULL, 0))); 1176 "not_typed_array", HandleVector<Object>(NULL, 0)));
1177 1177
1178 if (!args[1]->IsJSTypedArray()) 1178 if (!args[1]->IsJSTypedArray())
1179 return Smi::FromInt(TYPED_ARRAY_SET_NON_TYPED_ARRAY); 1179 return Smi::FromInt(TYPED_ARRAY_SET_NON_TYPED_ARRAY);
1180 1180
1181 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, target_obj, 0); 1181 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, target_obj, 0);
1182 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, source_obj, 1); 1182 CONVERT_ARG_HANDLE_CHECKED(JSTypedArray, source_obj, 1);
1183 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset_obj, 2); 1183 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset_obj, 2);
(...skipping 27 matching lines...) Expand all
1211 source_base, source_byte_length); 1211 source_base, source_byte_length);
1212 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE); 1212 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_SAME_TYPE);
1213 } 1213 }
1214 1214
1215 // Typed arrays of different types over the same backing store 1215 // Typed arrays of different types over the same backing store
1216 if ((source_base <= target_base && 1216 if ((source_base <= target_base &&
1217 source_base + source_byte_length > target_base) || 1217 source_base + source_byte_length > target_base) ||
1218 (target_base <= source_base && 1218 (target_base <= source_base &&
1219 target_base + target_byte_length > source_base)) { 1219 target_base + target_byte_length > source_base)) {
1220 // We do not support overlapping ArrayBuffers 1220 // We do not support overlapping ArrayBuffers
1221 ASSERT( 1221 DCHECK(
1222 target->GetBuffer()->backing_store() == 1222 target->GetBuffer()->backing_store() ==
1223 source->GetBuffer()->backing_store()); 1223 source->GetBuffer()->backing_store());
1224 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING); 1224 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_OVERLAPPING);
1225 } else { // Non-overlapping typed arrays 1225 } else { // Non-overlapping typed arrays
1226 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING); 1226 return Smi::FromInt(TYPED_ARRAY_SET_TYPED_ARRAY_NONOVERLAPPING);
1227 } 1227 }
1228 } 1228 }
1229 1229
1230 1230
1231 RUNTIME_FUNCTION(Runtime_TypedArrayMaxSizeInHeap) { 1231 RUNTIME_FUNCTION(Runtime_TypedArrayMaxSizeInHeap) {
1232 ASSERT(args.length() == 0); 1232 DCHECK(args.length() == 0);
1233 ASSERT_OBJECT_SIZE( 1233 DCHECK_OBJECT_SIZE(
1234 FLAG_typed_array_max_size_in_heap + FixedTypedArrayBase::kDataOffset); 1234 FLAG_typed_array_max_size_in_heap + FixedTypedArrayBase::kDataOffset);
1235 return Smi::FromInt(FLAG_typed_array_max_size_in_heap); 1235 return Smi::FromInt(FLAG_typed_array_max_size_in_heap);
1236 } 1236 }
1237 1237
1238 1238
1239 RUNTIME_FUNCTION(Runtime_DataViewInitialize) { 1239 RUNTIME_FUNCTION(Runtime_DataViewInitialize) {
1240 HandleScope scope(isolate); 1240 HandleScope scope(isolate);
1241 ASSERT(args.length() == 4); 1241 DCHECK(args.length() == 4);
1242 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); 1242 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0);
1243 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 1); 1243 CONVERT_ARG_HANDLE_CHECKED(JSArrayBuffer, buffer, 1);
1244 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_offset, 2); 1244 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_offset, 2);
1245 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_length, 3); 1245 CONVERT_NUMBER_ARG_HANDLE_CHECKED(byte_length, 3);
1246 1246
1247 ASSERT(holder->GetInternalFieldCount() == 1247 DCHECK(holder->GetInternalFieldCount() ==
1248 v8::ArrayBufferView::kInternalFieldCount); 1248 v8::ArrayBufferView::kInternalFieldCount);
1249 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { 1249 for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) {
1250 holder->SetInternalField(i, Smi::FromInt(0)); 1250 holder->SetInternalField(i, Smi::FromInt(0));
1251 } 1251 }
1252 size_t buffer_length = 0; 1252 size_t buffer_length = 0;
1253 size_t offset = 0; 1253 size_t offset = 0;
1254 size_t length = 0; 1254 size_t length = 0;
1255 RUNTIME_ASSERT( 1255 RUNTIME_ASSERT(
1256 TryNumberToSize(isolate, buffer->byte_length(), &buffer_length)); 1256 TryNumberToSize(isolate, buffer->byte_length(), &buffer_length));
1257 RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_offset, &offset)); 1257 RUNTIME_ASSERT(TryNumberToSize(isolate, *byte_offset, &offset));
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 return false; 1323 return false;
1324 } 1324 }
1325 1325
1326 union Value { 1326 union Value {
1327 T data; 1327 T data;
1328 uint8_t bytes[sizeof(T)]; 1328 uint8_t bytes[sizeof(T)];
1329 }; 1329 };
1330 1330
1331 Value value; 1331 Value value;
1332 size_t buffer_offset = data_view_byte_offset + byte_offset; 1332 size_t buffer_offset = data_view_byte_offset + byte_offset;
1333 ASSERT( 1333 DCHECK(
1334 NumberToSize(isolate, buffer->byte_length()) 1334 NumberToSize(isolate, buffer->byte_length())
1335 >= buffer_offset + sizeof(T)); 1335 >= buffer_offset + sizeof(T));
1336 uint8_t* source = 1336 uint8_t* source =
1337 static_cast<uint8_t*>(buffer->backing_store()) + buffer_offset; 1337 static_cast<uint8_t*>(buffer->backing_store()) + buffer_offset;
1338 if (NeedToFlipBytes(is_little_endian)) { 1338 if (NeedToFlipBytes(is_little_endian)) {
1339 FlipBytes<sizeof(T)>(value.bytes, source); 1339 FlipBytes<sizeof(T)>(value.bytes, source);
1340 } else { 1340 } else {
1341 CopyBytes<sizeof(T)>(value.bytes, source); 1341 CopyBytes<sizeof(T)>(value.bytes, source);
1342 } 1342 }
1343 *result = value.data; 1343 *result = value.data;
(...skipping 24 matching lines...) Expand all
1368 } 1368 }
1369 1369
1370 union Value { 1370 union Value {
1371 T data; 1371 T data;
1372 uint8_t bytes[sizeof(T)]; 1372 uint8_t bytes[sizeof(T)];
1373 }; 1373 };
1374 1374
1375 Value value; 1375 Value value;
1376 value.data = data; 1376 value.data = data;
1377 size_t buffer_offset = data_view_byte_offset + byte_offset; 1377 size_t buffer_offset = data_view_byte_offset + byte_offset;
1378 ASSERT( 1378 DCHECK(
1379 NumberToSize(isolate, buffer->byte_length()) 1379 NumberToSize(isolate, buffer->byte_length())
1380 >= buffer_offset + sizeof(T)); 1380 >= buffer_offset + sizeof(T));
1381 uint8_t* target = 1381 uint8_t* target =
1382 static_cast<uint8_t*>(buffer->backing_store()) + buffer_offset; 1382 static_cast<uint8_t*>(buffer->backing_store()) + buffer_offset;
1383 if (NeedToFlipBytes(is_little_endian)) { 1383 if (NeedToFlipBytes(is_little_endian)) {
1384 FlipBytes<sizeof(T)>(target, value.bytes); 1384 FlipBytes<sizeof(T)>(target, value.bytes);
1385 } else { 1385 } else {
1386 CopyBytes<sizeof(T)>(target, value.bytes); 1386 CopyBytes<sizeof(T)>(target, value.bytes);
1387 } 1387 }
1388 return true; 1388 return true;
1389 } 1389 }
1390 1390
1391 1391
1392 #define DATA_VIEW_GETTER(TypeName, Type, Converter) \ 1392 #define DATA_VIEW_GETTER(TypeName, Type, Converter) \
1393 RUNTIME_FUNCTION(Runtime_DataViewGet##TypeName) { \ 1393 RUNTIME_FUNCTION(Runtime_DataViewGet##TypeName) { \
1394 HandleScope scope(isolate); \ 1394 HandleScope scope(isolate); \
1395 ASSERT(args.length() == 3); \ 1395 DCHECK(args.length() == 3); \
1396 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); \ 1396 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); \
1397 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset, 1); \ 1397 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset, 1); \
1398 CONVERT_BOOLEAN_ARG_CHECKED(is_little_endian, 2); \ 1398 CONVERT_BOOLEAN_ARG_CHECKED(is_little_endian, 2); \
1399 Type result; \ 1399 Type result; \
1400 if (DataViewGetValue( \ 1400 if (DataViewGetValue( \
1401 isolate, holder, offset, is_little_endian, &result)) { \ 1401 isolate, holder, offset, is_little_endian, &result)) { \
1402 return *isolate->factory()->Converter(result); \ 1402 return *isolate->factory()->Converter(result); \
1403 } else { \ 1403 } else { \
1404 return isolate->Throw(*isolate->factory()->NewRangeError( \ 1404 return isolate->Throw(*isolate->factory()->NewRangeError( \
1405 "invalid_data_view_accessor_offset", \ 1405 "invalid_data_view_accessor_offset", \
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1467 1467
1468 template <> 1468 template <>
1469 double DataViewConvertValue<double>(double value) { 1469 double DataViewConvertValue<double>(double value) {
1470 return value; 1470 return value;
1471 } 1471 }
1472 1472
1473 1473
1474 #define DATA_VIEW_SETTER(TypeName, Type) \ 1474 #define DATA_VIEW_SETTER(TypeName, Type) \
1475 RUNTIME_FUNCTION(Runtime_DataViewSet##TypeName) { \ 1475 RUNTIME_FUNCTION(Runtime_DataViewSet##TypeName) { \
1476 HandleScope scope(isolate); \ 1476 HandleScope scope(isolate); \
1477 ASSERT(args.length() == 4); \ 1477 DCHECK(args.length() == 4); \
1478 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); \ 1478 CONVERT_ARG_HANDLE_CHECKED(JSDataView, holder, 0); \
1479 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset, 1); \ 1479 CONVERT_NUMBER_ARG_HANDLE_CHECKED(offset, 1); \
1480 CONVERT_NUMBER_ARG_HANDLE_CHECKED(value, 2); \ 1480 CONVERT_NUMBER_ARG_HANDLE_CHECKED(value, 2); \
1481 CONVERT_BOOLEAN_ARG_CHECKED(is_little_endian, 3); \ 1481 CONVERT_BOOLEAN_ARG_CHECKED(is_little_endian, 3); \
1482 Type v = DataViewConvertValue<Type>(value->Number()); \ 1482 Type v = DataViewConvertValue<Type>(value->Number()); \
1483 if (DataViewSetValue( \ 1483 if (DataViewSetValue( \
1484 isolate, holder, offset, is_little_endian, v)) { \ 1484 isolate, holder, offset, is_little_endian, v)) { \
1485 return isolate->heap()->undefined_value(); \ 1485 return isolate->heap()->undefined_value(); \
1486 } else { \ 1486 } else { \
1487 return isolate->Throw(*isolate->factory()->NewRangeError( \ 1487 return isolate->Throw(*isolate->factory()->NewRangeError( \
1488 "invalid_data_view_accessor_offset", \ 1488 "invalid_data_view_accessor_offset", \
1489 HandleVector<Object>(NULL, 0))); \ 1489 HandleVector<Object>(NULL, 0))); \
1490 } \ 1490 } \
1491 } 1491 }
1492 1492
1493 DATA_VIEW_SETTER(Uint8, uint8_t) 1493 DATA_VIEW_SETTER(Uint8, uint8_t)
1494 DATA_VIEW_SETTER(Int8, int8_t) 1494 DATA_VIEW_SETTER(Int8, int8_t)
1495 DATA_VIEW_SETTER(Uint16, uint16_t) 1495 DATA_VIEW_SETTER(Uint16, uint16_t)
1496 DATA_VIEW_SETTER(Int16, int16_t) 1496 DATA_VIEW_SETTER(Int16, int16_t)
1497 DATA_VIEW_SETTER(Uint32, uint32_t) 1497 DATA_VIEW_SETTER(Uint32, uint32_t)
1498 DATA_VIEW_SETTER(Int32, int32_t) 1498 DATA_VIEW_SETTER(Int32, int32_t)
1499 DATA_VIEW_SETTER(Float32, float) 1499 DATA_VIEW_SETTER(Float32, float)
1500 DATA_VIEW_SETTER(Float64, double) 1500 DATA_VIEW_SETTER(Float64, double)
1501 1501
1502 #undef DATA_VIEW_SETTER 1502 #undef DATA_VIEW_SETTER
1503 1503
1504 1504
1505 RUNTIME_FUNCTION(Runtime_SetInitialize) { 1505 RUNTIME_FUNCTION(Runtime_SetInitialize) {
1506 HandleScope scope(isolate); 1506 HandleScope scope(isolate);
1507 ASSERT(args.length() == 1); 1507 DCHECK(args.length() == 1);
1508 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); 1508 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
1509 Handle<OrderedHashSet> table = isolate->factory()->NewOrderedHashSet(); 1509 Handle<OrderedHashSet> table = isolate->factory()->NewOrderedHashSet();
1510 holder->set_table(*table); 1510 holder->set_table(*table);
1511 return *holder; 1511 return *holder;
1512 } 1512 }
1513 1513
1514 1514
1515 RUNTIME_FUNCTION(Runtime_SetAdd) { 1515 RUNTIME_FUNCTION(Runtime_SetAdd) {
1516 HandleScope scope(isolate); 1516 HandleScope scope(isolate);
1517 ASSERT(args.length() == 2); 1517 DCHECK(args.length() == 2);
1518 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); 1518 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
1519 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1519 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1520 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); 1520 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table()));
1521 table = OrderedHashSet::Add(table, key); 1521 table = OrderedHashSet::Add(table, key);
1522 holder->set_table(*table); 1522 holder->set_table(*table);
1523 return *holder; 1523 return *holder;
1524 } 1524 }
1525 1525
1526 1526
1527 RUNTIME_FUNCTION(Runtime_SetHas) { 1527 RUNTIME_FUNCTION(Runtime_SetHas) {
1528 HandleScope scope(isolate); 1528 HandleScope scope(isolate);
1529 ASSERT(args.length() == 2); 1529 DCHECK(args.length() == 2);
1530 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); 1530 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
1531 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1531 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1532 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); 1532 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table()));
1533 return isolate->heap()->ToBoolean(table->Contains(key)); 1533 return isolate->heap()->ToBoolean(table->Contains(key));
1534 } 1534 }
1535 1535
1536 1536
1537 RUNTIME_FUNCTION(Runtime_SetDelete) { 1537 RUNTIME_FUNCTION(Runtime_SetDelete) {
1538 HandleScope scope(isolate); 1538 HandleScope scope(isolate);
1539 ASSERT(args.length() == 2); 1539 DCHECK(args.length() == 2);
1540 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); 1540 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
1541 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1541 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1542 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); 1542 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table()));
1543 bool was_present = false; 1543 bool was_present = false;
1544 table = OrderedHashSet::Remove(table, key, &was_present); 1544 table = OrderedHashSet::Remove(table, key, &was_present);
1545 holder->set_table(*table); 1545 holder->set_table(*table);
1546 return isolate->heap()->ToBoolean(was_present); 1546 return isolate->heap()->ToBoolean(was_present);
1547 } 1547 }
1548 1548
1549 1549
1550 RUNTIME_FUNCTION(Runtime_SetClear) { 1550 RUNTIME_FUNCTION(Runtime_SetClear) {
1551 HandleScope scope(isolate); 1551 HandleScope scope(isolate);
1552 ASSERT(args.length() == 1); 1552 DCHECK(args.length() == 1);
1553 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); 1553 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
1554 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); 1554 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table()));
1555 table = OrderedHashSet::Clear(table); 1555 table = OrderedHashSet::Clear(table);
1556 holder->set_table(*table); 1556 holder->set_table(*table);
1557 return isolate->heap()->undefined_value(); 1557 return isolate->heap()->undefined_value();
1558 } 1558 }
1559 1559
1560 1560
1561 RUNTIME_FUNCTION(Runtime_SetGetSize) { 1561 RUNTIME_FUNCTION(Runtime_SetGetSize) {
1562 HandleScope scope(isolate); 1562 HandleScope scope(isolate);
1563 ASSERT(args.length() == 1); 1563 DCHECK(args.length() == 1);
1564 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0); 1564 CONVERT_ARG_HANDLE_CHECKED(JSSet, holder, 0);
1565 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table())); 1565 Handle<OrderedHashSet> table(OrderedHashSet::cast(holder->table()));
1566 return Smi::FromInt(table->NumberOfElements()); 1566 return Smi::FromInt(table->NumberOfElements());
1567 } 1567 }
1568 1568
1569 1569
1570 RUNTIME_FUNCTION(Runtime_SetIteratorInitialize) { 1570 RUNTIME_FUNCTION(Runtime_SetIteratorInitialize) {
1571 HandleScope scope(isolate); 1571 HandleScope scope(isolate);
1572 ASSERT(args.length() == 3); 1572 DCHECK(args.length() == 3);
1573 CONVERT_ARG_HANDLE_CHECKED(JSSetIterator, holder, 0); 1573 CONVERT_ARG_HANDLE_CHECKED(JSSetIterator, holder, 0);
1574 CONVERT_ARG_HANDLE_CHECKED(JSSet, set, 1); 1574 CONVERT_ARG_HANDLE_CHECKED(JSSet, set, 1);
1575 CONVERT_SMI_ARG_CHECKED(kind, 2) 1575 CONVERT_SMI_ARG_CHECKED(kind, 2)
1576 RUNTIME_ASSERT(kind == JSSetIterator::kKindValues || 1576 RUNTIME_ASSERT(kind == JSSetIterator::kKindValues ||
1577 kind == JSSetIterator::kKindEntries); 1577 kind == JSSetIterator::kKindEntries);
1578 Handle<OrderedHashSet> table(OrderedHashSet::cast(set->table())); 1578 Handle<OrderedHashSet> table(OrderedHashSet::cast(set->table()));
1579 holder->set_table(*table); 1579 holder->set_table(*table);
1580 holder->set_index(Smi::FromInt(0)); 1580 holder->set_index(Smi::FromInt(0));
1581 holder->set_kind(Smi::FromInt(kind)); 1581 holder->set_kind(Smi::FromInt(kind));
1582 return isolate->heap()->undefined_value(); 1582 return isolate->heap()->undefined_value();
1583 } 1583 }
1584 1584
1585 1585
1586 RUNTIME_FUNCTION(Runtime_SetIteratorNext) { 1586 RUNTIME_FUNCTION(Runtime_SetIteratorNext) {
1587 SealHandleScope shs(isolate); 1587 SealHandleScope shs(isolate);
1588 ASSERT(args.length() == 2); 1588 DCHECK(args.length() == 2);
1589 CONVERT_ARG_CHECKED(JSSetIterator, holder, 0); 1589 CONVERT_ARG_CHECKED(JSSetIterator, holder, 0);
1590 CONVERT_ARG_CHECKED(JSArray, value_array, 1); 1590 CONVERT_ARG_CHECKED(JSArray, value_array, 1);
1591 return holder->Next(value_array); 1591 return holder->Next(value_array);
1592 } 1592 }
1593 1593
1594 1594
1595 RUNTIME_FUNCTION(Runtime_MapInitialize) { 1595 RUNTIME_FUNCTION(Runtime_MapInitialize) {
1596 HandleScope scope(isolate); 1596 HandleScope scope(isolate);
1597 ASSERT(args.length() == 1); 1597 DCHECK(args.length() == 1);
1598 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); 1598 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
1599 Handle<OrderedHashMap> table = isolate->factory()->NewOrderedHashMap(); 1599 Handle<OrderedHashMap> table = isolate->factory()->NewOrderedHashMap();
1600 holder->set_table(*table); 1600 holder->set_table(*table);
1601 return *holder; 1601 return *holder;
1602 } 1602 }
1603 1603
1604 1604
1605 RUNTIME_FUNCTION(Runtime_MapGet) { 1605 RUNTIME_FUNCTION(Runtime_MapGet) {
1606 HandleScope scope(isolate); 1606 HandleScope scope(isolate);
1607 ASSERT(args.length() == 2); 1607 DCHECK(args.length() == 2);
1608 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); 1608 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
1609 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1609 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1610 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); 1610 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table()));
1611 Handle<Object> lookup(table->Lookup(key), isolate); 1611 Handle<Object> lookup(table->Lookup(key), isolate);
1612 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; 1612 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup;
1613 } 1613 }
1614 1614
1615 1615
1616 RUNTIME_FUNCTION(Runtime_MapHas) { 1616 RUNTIME_FUNCTION(Runtime_MapHas) {
1617 HandleScope scope(isolate); 1617 HandleScope scope(isolate);
1618 ASSERT(args.length() == 2); 1618 DCHECK(args.length() == 2);
1619 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); 1619 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
1620 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1620 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1621 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); 1621 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table()));
1622 Handle<Object> lookup(table->Lookup(key), isolate); 1622 Handle<Object> lookup(table->Lookup(key), isolate);
1623 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); 1623 return isolate->heap()->ToBoolean(!lookup->IsTheHole());
1624 } 1624 }
1625 1625
1626 1626
1627 RUNTIME_FUNCTION(Runtime_MapDelete) { 1627 RUNTIME_FUNCTION(Runtime_MapDelete) {
1628 HandleScope scope(isolate); 1628 HandleScope scope(isolate);
1629 ASSERT(args.length() == 2); 1629 DCHECK(args.length() == 2);
1630 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); 1630 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
1631 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1631 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1632 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); 1632 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table()));
1633 bool was_present = false; 1633 bool was_present = false;
1634 Handle<OrderedHashMap> new_table = 1634 Handle<OrderedHashMap> new_table =
1635 OrderedHashMap::Remove(table, key, &was_present); 1635 OrderedHashMap::Remove(table, key, &was_present);
1636 holder->set_table(*new_table); 1636 holder->set_table(*new_table);
1637 return isolate->heap()->ToBoolean(was_present); 1637 return isolate->heap()->ToBoolean(was_present);
1638 } 1638 }
1639 1639
1640 1640
1641 RUNTIME_FUNCTION(Runtime_MapClear) { 1641 RUNTIME_FUNCTION(Runtime_MapClear) {
1642 HandleScope scope(isolate); 1642 HandleScope scope(isolate);
1643 ASSERT(args.length() == 1); 1643 DCHECK(args.length() == 1);
1644 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); 1644 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
1645 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); 1645 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table()));
1646 table = OrderedHashMap::Clear(table); 1646 table = OrderedHashMap::Clear(table);
1647 holder->set_table(*table); 1647 holder->set_table(*table);
1648 return isolate->heap()->undefined_value(); 1648 return isolate->heap()->undefined_value();
1649 } 1649 }
1650 1650
1651 1651
1652 RUNTIME_FUNCTION(Runtime_MapSet) { 1652 RUNTIME_FUNCTION(Runtime_MapSet) {
1653 HandleScope scope(isolate); 1653 HandleScope scope(isolate);
1654 ASSERT(args.length() == 3); 1654 DCHECK(args.length() == 3);
1655 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); 1655 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
1656 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1656 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1657 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); 1657 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
1658 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); 1658 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table()));
1659 Handle<OrderedHashMap> new_table = OrderedHashMap::Put(table, key, value); 1659 Handle<OrderedHashMap> new_table = OrderedHashMap::Put(table, key, value);
1660 holder->set_table(*new_table); 1660 holder->set_table(*new_table);
1661 return *holder; 1661 return *holder;
1662 } 1662 }
1663 1663
1664 1664
1665 RUNTIME_FUNCTION(Runtime_MapGetSize) { 1665 RUNTIME_FUNCTION(Runtime_MapGetSize) {
1666 HandleScope scope(isolate); 1666 HandleScope scope(isolate);
1667 ASSERT(args.length() == 1); 1667 DCHECK(args.length() == 1);
1668 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0); 1668 CONVERT_ARG_HANDLE_CHECKED(JSMap, holder, 0);
1669 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table())); 1669 Handle<OrderedHashMap> table(OrderedHashMap::cast(holder->table()));
1670 return Smi::FromInt(table->NumberOfElements()); 1670 return Smi::FromInt(table->NumberOfElements());
1671 } 1671 }
1672 1672
1673 1673
1674 RUNTIME_FUNCTION(Runtime_MapIteratorInitialize) { 1674 RUNTIME_FUNCTION(Runtime_MapIteratorInitialize) {
1675 HandleScope scope(isolate); 1675 HandleScope scope(isolate);
1676 ASSERT(args.length() == 3); 1676 DCHECK(args.length() == 3);
1677 CONVERT_ARG_HANDLE_CHECKED(JSMapIterator, holder, 0); 1677 CONVERT_ARG_HANDLE_CHECKED(JSMapIterator, holder, 0);
1678 CONVERT_ARG_HANDLE_CHECKED(JSMap, map, 1); 1678 CONVERT_ARG_HANDLE_CHECKED(JSMap, map, 1);
1679 CONVERT_SMI_ARG_CHECKED(kind, 2) 1679 CONVERT_SMI_ARG_CHECKED(kind, 2)
1680 RUNTIME_ASSERT(kind == JSMapIterator::kKindKeys 1680 RUNTIME_ASSERT(kind == JSMapIterator::kKindKeys
1681 || kind == JSMapIterator::kKindValues 1681 || kind == JSMapIterator::kKindValues
1682 || kind == JSMapIterator::kKindEntries); 1682 || kind == JSMapIterator::kKindEntries);
1683 Handle<OrderedHashMap> table(OrderedHashMap::cast(map->table())); 1683 Handle<OrderedHashMap> table(OrderedHashMap::cast(map->table()));
1684 holder->set_table(*table); 1684 holder->set_table(*table);
1685 holder->set_index(Smi::FromInt(0)); 1685 holder->set_index(Smi::FromInt(0));
1686 holder->set_kind(Smi::FromInt(kind)); 1686 holder->set_kind(Smi::FromInt(kind));
1687 return isolate->heap()->undefined_value(); 1687 return isolate->heap()->undefined_value();
1688 } 1688 }
1689 1689
1690 1690
1691 RUNTIME_FUNCTION(Runtime_GetWeakMapEntries) { 1691 RUNTIME_FUNCTION(Runtime_GetWeakMapEntries) {
1692 HandleScope scope(isolate); 1692 HandleScope scope(isolate);
1693 ASSERT(args.length() == 1); 1693 DCHECK(args.length() == 1);
1694 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0); 1694 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0);
1695 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); 1695 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table()));
1696 Handle<FixedArray> entries = 1696 Handle<FixedArray> entries =
1697 isolate->factory()->NewFixedArray(table->NumberOfElements() * 2); 1697 isolate->factory()->NewFixedArray(table->NumberOfElements() * 2);
1698 { 1698 {
1699 DisallowHeapAllocation no_gc; 1699 DisallowHeapAllocation no_gc;
1700 int number_of_non_hole_elements = 0; 1700 int number_of_non_hole_elements = 0;
1701 for (int i = 0; i < table->Capacity(); i++) { 1701 for (int i = 0; i < table->Capacity(); i++) {
1702 Handle<Object> key(table->KeyAt(i), isolate); 1702 Handle<Object> key(table->KeyAt(i), isolate);
1703 if (table->IsKey(*key)) { 1703 if (table->IsKey(*key)) {
1704 entries->set(number_of_non_hole_elements++, *key); 1704 entries->set(number_of_non_hole_elements++, *key);
1705 entries->set(number_of_non_hole_elements++, table->Lookup(key)); 1705 entries->set(number_of_non_hole_elements++, table->Lookup(key));
1706 } 1706 }
1707 } 1707 }
1708 ASSERT_EQ(table->NumberOfElements() * 2, number_of_non_hole_elements); 1708 DCHECK_EQ(table->NumberOfElements() * 2, number_of_non_hole_elements);
1709 } 1709 }
1710 return *isolate->factory()->NewJSArrayWithElements(entries); 1710 return *isolate->factory()->NewJSArrayWithElements(entries);
1711 } 1711 }
1712 1712
1713 1713
1714 RUNTIME_FUNCTION(Runtime_MapIteratorNext) { 1714 RUNTIME_FUNCTION(Runtime_MapIteratorNext) {
1715 SealHandleScope shs(isolate); 1715 SealHandleScope shs(isolate);
1716 ASSERT(args.length() == 2); 1716 DCHECK(args.length() == 2);
1717 CONVERT_ARG_CHECKED(JSMapIterator, holder, 0); 1717 CONVERT_ARG_CHECKED(JSMapIterator, holder, 0);
1718 CONVERT_ARG_CHECKED(JSArray, value_array, 1); 1718 CONVERT_ARG_CHECKED(JSArray, value_array, 1);
1719 return holder->Next(value_array); 1719 return holder->Next(value_array);
1720 } 1720 }
1721 1721
1722 1722
1723 static Handle<JSWeakCollection> WeakCollectionInitialize( 1723 static Handle<JSWeakCollection> WeakCollectionInitialize(
1724 Isolate* isolate, 1724 Isolate* isolate,
1725 Handle<JSWeakCollection> weak_collection) { 1725 Handle<JSWeakCollection> weak_collection) {
1726 ASSERT(weak_collection->map()->inobject_properties() == 0); 1726 DCHECK(weak_collection->map()->inobject_properties() == 0);
1727 Handle<ObjectHashTable> table = ObjectHashTable::New(isolate, 0); 1727 Handle<ObjectHashTable> table = ObjectHashTable::New(isolate, 0);
1728 weak_collection->set_table(*table); 1728 weak_collection->set_table(*table);
1729 return weak_collection; 1729 return weak_collection;
1730 } 1730 }
1731 1731
1732 1732
1733 RUNTIME_FUNCTION(Runtime_WeakCollectionInitialize) { 1733 RUNTIME_FUNCTION(Runtime_WeakCollectionInitialize) {
1734 HandleScope scope(isolate); 1734 HandleScope scope(isolate);
1735 ASSERT(args.length() == 1); 1735 DCHECK(args.length() == 1);
1736 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); 1736 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0);
1737 return *WeakCollectionInitialize(isolate, weak_collection); 1737 return *WeakCollectionInitialize(isolate, weak_collection);
1738 } 1738 }
1739 1739
1740 1740
1741 RUNTIME_FUNCTION(Runtime_WeakCollectionGet) { 1741 RUNTIME_FUNCTION(Runtime_WeakCollectionGet) {
1742 HandleScope scope(isolate); 1742 HandleScope scope(isolate);
1743 ASSERT(args.length() == 2); 1743 DCHECK(args.length() == 2);
1744 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); 1744 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0);
1745 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1745 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1746 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); 1746 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol());
1747 Handle<ObjectHashTable> table( 1747 Handle<ObjectHashTable> table(
1748 ObjectHashTable::cast(weak_collection->table())); 1748 ObjectHashTable::cast(weak_collection->table()));
1749 RUNTIME_ASSERT(table->IsKey(*key)); 1749 RUNTIME_ASSERT(table->IsKey(*key));
1750 Handle<Object> lookup(table->Lookup(key), isolate); 1750 Handle<Object> lookup(table->Lookup(key), isolate);
1751 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup; 1751 return lookup->IsTheHole() ? isolate->heap()->undefined_value() : *lookup;
1752 } 1752 }
1753 1753
1754 1754
1755 RUNTIME_FUNCTION(Runtime_WeakCollectionHas) { 1755 RUNTIME_FUNCTION(Runtime_WeakCollectionHas) {
1756 HandleScope scope(isolate); 1756 HandleScope scope(isolate);
1757 ASSERT(args.length() == 2); 1757 DCHECK(args.length() == 2);
1758 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); 1758 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0);
1759 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1759 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1760 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); 1760 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol());
1761 Handle<ObjectHashTable> table( 1761 Handle<ObjectHashTable> table(
1762 ObjectHashTable::cast(weak_collection->table())); 1762 ObjectHashTable::cast(weak_collection->table()));
1763 RUNTIME_ASSERT(table->IsKey(*key)); 1763 RUNTIME_ASSERT(table->IsKey(*key));
1764 Handle<Object> lookup(table->Lookup(key), isolate); 1764 Handle<Object> lookup(table->Lookup(key), isolate);
1765 return isolate->heap()->ToBoolean(!lookup->IsTheHole()); 1765 return isolate->heap()->ToBoolean(!lookup->IsTheHole());
1766 } 1766 }
1767 1767
1768 1768
1769 RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) { 1769 RUNTIME_FUNCTION(Runtime_WeakCollectionDelete) {
1770 HandleScope scope(isolate); 1770 HandleScope scope(isolate);
1771 ASSERT(args.length() == 2); 1771 DCHECK(args.length() == 2);
1772 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); 1772 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0);
1773 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1773 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1774 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); 1774 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol());
1775 Handle<ObjectHashTable> table(ObjectHashTable::cast( 1775 Handle<ObjectHashTable> table(ObjectHashTable::cast(
1776 weak_collection->table())); 1776 weak_collection->table()));
1777 RUNTIME_ASSERT(table->IsKey(*key)); 1777 RUNTIME_ASSERT(table->IsKey(*key));
1778 bool was_present = false; 1778 bool was_present = false;
1779 Handle<ObjectHashTable> new_table = 1779 Handle<ObjectHashTable> new_table =
1780 ObjectHashTable::Remove(table, key, &was_present); 1780 ObjectHashTable::Remove(table, key, &was_present);
1781 weak_collection->set_table(*new_table); 1781 weak_collection->set_table(*new_table);
1782 return isolate->heap()->ToBoolean(was_present); 1782 return isolate->heap()->ToBoolean(was_present);
1783 } 1783 }
1784 1784
1785 1785
1786 RUNTIME_FUNCTION(Runtime_WeakCollectionSet) { 1786 RUNTIME_FUNCTION(Runtime_WeakCollectionSet) {
1787 HandleScope scope(isolate); 1787 HandleScope scope(isolate);
1788 ASSERT(args.length() == 3); 1788 DCHECK(args.length() == 3);
1789 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0); 1789 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, weak_collection, 0);
1790 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 1790 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
1791 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol()); 1791 RUNTIME_ASSERT(key->IsJSReceiver() || key->IsSymbol());
1792 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); 1792 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
1793 Handle<ObjectHashTable> table( 1793 Handle<ObjectHashTable> table(
1794 ObjectHashTable::cast(weak_collection->table())); 1794 ObjectHashTable::cast(weak_collection->table()));
1795 RUNTIME_ASSERT(table->IsKey(*key)); 1795 RUNTIME_ASSERT(table->IsKey(*key));
1796 Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value); 1796 Handle<ObjectHashTable> new_table = ObjectHashTable::Put(table, key, value);
1797 weak_collection->set_table(*new_table); 1797 weak_collection->set_table(*new_table);
1798 return *weak_collection; 1798 return *weak_collection;
1799 } 1799 }
1800 1800
1801 1801
1802 RUNTIME_FUNCTION(Runtime_GetWeakSetValues) { 1802 RUNTIME_FUNCTION(Runtime_GetWeakSetValues) {
1803 HandleScope scope(isolate); 1803 HandleScope scope(isolate);
1804 ASSERT(args.length() == 1); 1804 DCHECK(args.length() == 1);
1805 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0); 1805 CONVERT_ARG_HANDLE_CHECKED(JSWeakCollection, holder, 0);
1806 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table())); 1806 Handle<ObjectHashTable> table(ObjectHashTable::cast(holder->table()));
1807 Handle<FixedArray> values = 1807 Handle<FixedArray> values =
1808 isolate->factory()->NewFixedArray(table->NumberOfElements()); 1808 isolate->factory()->NewFixedArray(table->NumberOfElements());
1809 { 1809 {
1810 DisallowHeapAllocation no_gc; 1810 DisallowHeapAllocation no_gc;
1811 int number_of_non_hole_elements = 0; 1811 int number_of_non_hole_elements = 0;
1812 for (int i = 0; i < table->Capacity(); i++) { 1812 for (int i = 0; i < table->Capacity(); i++) {
1813 Handle<Object> key(table->KeyAt(i), isolate); 1813 Handle<Object> key(table->KeyAt(i), isolate);
1814 if (table->IsKey(*key)) { 1814 if (table->IsKey(*key)) {
1815 values->set(number_of_non_hole_elements++, *key); 1815 values->set(number_of_non_hole_elements++, *key);
1816 } 1816 }
1817 } 1817 }
1818 ASSERT_EQ(table->NumberOfElements(), number_of_non_hole_elements); 1818 DCHECK_EQ(table->NumberOfElements(), number_of_non_hole_elements);
1819 } 1819 }
1820 return *isolate->factory()->NewJSArrayWithElements(values); 1820 return *isolate->factory()->NewJSArrayWithElements(values);
1821 } 1821 }
1822 1822
1823 1823
1824 RUNTIME_FUNCTION(Runtime_GetPrototype) { 1824 RUNTIME_FUNCTION(Runtime_GetPrototype) {
1825 HandleScope scope(isolate); 1825 HandleScope scope(isolate);
1826 ASSERT(args.length() == 1); 1826 DCHECK(args.length() == 1);
1827 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0); 1827 CONVERT_ARG_HANDLE_CHECKED(Object, obj, 0);
1828 // We don't expect access checks to be needed on JSProxy objects. 1828 // We don't expect access checks to be needed on JSProxy objects.
1829 ASSERT(!obj->IsAccessCheckNeeded() || obj->IsJSObject()); 1829 DCHECK(!obj->IsAccessCheckNeeded() || obj->IsJSObject());
1830 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER); 1830 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER);
1831 do { 1831 do {
1832 if (PrototypeIterator::GetCurrent(iter)->IsAccessCheckNeeded() && 1832 if (PrototypeIterator::GetCurrent(iter)->IsAccessCheckNeeded() &&
1833 !isolate->MayNamedAccess( 1833 !isolate->MayNamedAccess(
1834 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), 1834 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)),
1835 isolate->factory()->proto_string(), v8::ACCESS_GET)) { 1835 isolate->factory()->proto_string(), v8::ACCESS_GET)) {
1836 isolate->ReportFailedAccessCheck( 1836 isolate->ReportFailedAccessCheck(
1837 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), 1837 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)),
1838 v8::ACCESS_GET); 1838 v8::ACCESS_GET);
1839 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 1839 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
(...skipping 16 matching lines...) Expand all
1856 return PrototypeIterator::GetCurrent(iter); 1856 return PrototypeIterator::GetCurrent(iter);
1857 } 1857 }
1858 iter.Advance(); 1858 iter.Advance();
1859 } 1859 }
1860 return PrototypeIterator::GetCurrent(iter); 1860 return PrototypeIterator::GetCurrent(iter);
1861 } 1861 }
1862 1862
1863 1863
1864 RUNTIME_FUNCTION(Runtime_SetPrototype) { 1864 RUNTIME_FUNCTION(Runtime_SetPrototype) {
1865 HandleScope scope(isolate); 1865 HandleScope scope(isolate);
1866 ASSERT(args.length() == 2); 1866 DCHECK(args.length() == 2);
1867 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 1867 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
1868 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1); 1868 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1);
1869 if (obj->IsAccessCheckNeeded() && 1869 if (obj->IsAccessCheckNeeded() &&
1870 !isolate->MayNamedAccess( 1870 !isolate->MayNamedAccess(
1871 obj, isolate->factory()->proto_string(), v8::ACCESS_SET)) { 1871 obj, isolate->factory()->proto_string(), v8::ACCESS_SET)) {
1872 isolate->ReportFailedAccessCheck(obj, v8::ACCESS_SET); 1872 isolate->ReportFailedAccessCheck(obj, v8::ACCESS_SET);
1873 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 1873 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
1874 return isolate->heap()->undefined_value(); 1874 return isolate->heap()->undefined_value();
1875 } 1875 }
1876 if (obj->map()->is_observed()) { 1876 if (obj->map()->is_observed()) {
(...skipping 14 matching lines...) Expand all
1891 Handle<Object> result; 1891 Handle<Object> result;
1892 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 1892 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
1893 isolate, result, 1893 isolate, result,
1894 JSObject::SetPrototype(obj, prototype, true)); 1894 JSObject::SetPrototype(obj, prototype, true));
1895 return *result; 1895 return *result;
1896 } 1896 }
1897 1897
1898 1898
1899 RUNTIME_FUNCTION(Runtime_IsInPrototypeChain) { 1899 RUNTIME_FUNCTION(Runtime_IsInPrototypeChain) {
1900 HandleScope shs(isolate); 1900 HandleScope shs(isolate);
1901 ASSERT(args.length() == 2); 1901 DCHECK(args.length() == 2);
1902 // See ECMA-262, section 15.3.5.3, page 88 (steps 5 - 8). 1902 // See ECMA-262, section 15.3.5.3, page 88 (steps 5 - 8).
1903 CONVERT_ARG_HANDLE_CHECKED(Object, O, 0); 1903 CONVERT_ARG_HANDLE_CHECKED(Object, O, 0);
1904 CONVERT_ARG_HANDLE_CHECKED(Object, V, 1); 1904 CONVERT_ARG_HANDLE_CHECKED(Object, V, 1);
1905 PrototypeIterator iter(isolate, V, PrototypeIterator::START_AT_RECEIVER); 1905 PrototypeIterator iter(isolate, V, PrototypeIterator::START_AT_RECEIVER);
1906 while (true) { 1906 while (true) {
1907 iter.AdvanceIgnoringProxies(); 1907 iter.AdvanceIgnoringProxies();
1908 if (iter.IsAtEnd()) return isolate->heap()->false_value(); 1908 if (iter.IsAtEnd()) return isolate->heap()->false_value();
1909 if (iter.IsAtEnd(O)) return isolate->heap()->true_value(); 1909 if (iter.IsAtEnd(O)) return isolate->heap()->true_value();
1910 } 1910 }
1911 } 1911 }
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
1966 it.GetAccessors()->IsAccessorPair()) { 1966 it.GetAccessors()->IsAccessorPair()) {
1967 maybe_accessors = Handle<AccessorPair>::cast(it.GetAccessors()); 1967 maybe_accessors = Handle<AccessorPair>::cast(it.GetAccessors());
1968 } 1968 }
1969 1969
1970 // Get value if not an AccessorPair. 1970 // Get value if not an AccessorPair.
1971 if (maybe_accessors.is_null()) { 1971 if (maybe_accessors.is_null()) {
1972 ASSIGN_RETURN_ON_EXCEPTION( 1972 ASSIGN_RETURN_ON_EXCEPTION(
1973 isolate, value, Object::GetProperty(&it), Object); 1973 isolate, value, Object::GetProperty(&it), Object);
1974 } 1974 }
1975 } 1975 }
1976 ASSERT(!isolate->has_pending_exception()); 1976 DCHECK(!isolate->has_pending_exception());
1977 Handle<FixedArray> elms = factory->NewFixedArray(DESCRIPTOR_SIZE); 1977 Handle<FixedArray> elms = factory->NewFixedArray(DESCRIPTOR_SIZE);
1978 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0)); 1978 elms->set(ENUMERABLE_INDEX, heap->ToBoolean((attrs & DONT_ENUM) == 0));
1979 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0)); 1979 elms->set(CONFIGURABLE_INDEX, heap->ToBoolean((attrs & DONT_DELETE) == 0));
1980 elms->set(IS_ACCESSOR_INDEX, heap->ToBoolean(!maybe_accessors.is_null())); 1980 elms->set(IS_ACCESSOR_INDEX, heap->ToBoolean(!maybe_accessors.is_null()));
1981 1981
1982 Handle<AccessorPair> accessors; 1982 Handle<AccessorPair> accessors;
1983 if (maybe_accessors.ToHandle(&accessors)) { 1983 if (maybe_accessors.ToHandle(&accessors)) {
1984 Handle<Object> getter(accessors->GetComponent(ACCESSOR_GETTER), isolate); 1984 Handle<Object> getter(accessors->GetComponent(ACCESSOR_GETTER), isolate);
1985 Handle<Object> setter(accessors->GetComponent(ACCESSOR_SETTER), isolate); 1985 Handle<Object> setter(accessors->GetComponent(ACCESSOR_SETTER), isolate);
1986 elms->set(GETTER_INDEX, *getter); 1986 elms->set(GETTER_INDEX, *getter);
1987 elms->set(SETTER_INDEX, *setter); 1987 elms->set(SETTER_INDEX, *setter);
1988 } else { 1988 } else {
1989 elms->set(WRITABLE_INDEX, heap->ToBoolean((attrs & READ_ONLY) == 0)); 1989 elms->set(WRITABLE_INDEX, heap->ToBoolean((attrs & READ_ONLY) == 0));
1990 elms->set(VALUE_INDEX, *value); 1990 elms->set(VALUE_INDEX, *value);
1991 } 1991 }
1992 1992
1993 return factory->NewJSArrayWithElements(elms); 1993 return factory->NewJSArrayWithElements(elms);
1994 } 1994 }
1995 1995
1996 1996
1997 // Returns an array with the property description: 1997 // Returns an array with the property description:
1998 // if args[1] is not a property on args[0] 1998 // if args[1] is not a property on args[0]
1999 // returns undefined 1999 // returns undefined
2000 // if args[1] is a data property on args[0] 2000 // if args[1] is a data property on args[0]
2001 // [false, value, Writeable, Enumerable, Configurable] 2001 // [false, value, Writeable, Enumerable, Configurable]
2002 // if args[1] is an accessor on args[0] 2002 // if args[1] is an accessor on args[0]
2003 // [true, GetFunction, SetFunction, Enumerable, Configurable] 2003 // [true, GetFunction, SetFunction, Enumerable, Configurable]
2004 RUNTIME_FUNCTION(Runtime_GetOwnProperty) { 2004 RUNTIME_FUNCTION(Runtime_GetOwnProperty) {
2005 HandleScope scope(isolate); 2005 HandleScope scope(isolate);
2006 ASSERT(args.length() == 2); 2006 DCHECK(args.length() == 2);
2007 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 2007 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
2008 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 2008 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
2009 Handle<Object> result; 2009 Handle<Object> result;
2010 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 2010 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2011 isolate, result, GetOwnProperty(isolate, obj, name)); 2011 isolate, result, GetOwnProperty(isolate, obj, name));
2012 return *result; 2012 return *result;
2013 } 2013 }
2014 2014
2015 2015
2016 RUNTIME_FUNCTION(Runtime_PreventExtensions) { 2016 RUNTIME_FUNCTION(Runtime_PreventExtensions) {
2017 HandleScope scope(isolate); 2017 HandleScope scope(isolate);
2018 ASSERT(args.length() == 1); 2018 DCHECK(args.length() == 1);
2019 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 2019 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
2020 Handle<Object> result; 2020 Handle<Object> result;
2021 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 2021 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2022 isolate, result, JSObject::PreventExtensions(obj)); 2022 isolate, result, JSObject::PreventExtensions(obj));
2023 return *result; 2023 return *result;
2024 } 2024 }
2025 2025
2026 2026
2027 RUNTIME_FUNCTION(Runtime_IsExtensible) { 2027 RUNTIME_FUNCTION(Runtime_IsExtensible) {
2028 SealHandleScope shs(isolate); 2028 SealHandleScope shs(isolate);
2029 ASSERT(args.length() == 1); 2029 DCHECK(args.length() == 1);
2030 CONVERT_ARG_CHECKED(JSObject, obj, 0); 2030 CONVERT_ARG_CHECKED(JSObject, obj, 0);
2031 if (obj->IsJSGlobalProxy()) { 2031 if (obj->IsJSGlobalProxy()) {
2032 PrototypeIterator iter(isolate, obj); 2032 PrototypeIterator iter(isolate, obj);
2033 if (iter.IsAtEnd()) return isolate->heap()->false_value(); 2033 if (iter.IsAtEnd()) return isolate->heap()->false_value();
2034 ASSERT(iter.GetCurrent()->IsJSGlobalObject()); 2034 DCHECK(iter.GetCurrent()->IsJSGlobalObject());
2035 obj = JSObject::cast(iter.GetCurrent()); 2035 obj = JSObject::cast(iter.GetCurrent());
2036 } 2036 }
2037 return isolate->heap()->ToBoolean(obj->map()->is_extensible()); 2037 return isolate->heap()->ToBoolean(obj->map()->is_extensible());
2038 } 2038 }
2039 2039
2040 2040
2041 RUNTIME_FUNCTION(Runtime_RegExpCompile) { 2041 RUNTIME_FUNCTION(Runtime_RegExpCompile) {
2042 HandleScope scope(isolate); 2042 HandleScope scope(isolate);
2043 ASSERT(args.length() == 3); 2043 DCHECK(args.length() == 3);
2044 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, re, 0); 2044 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, re, 0);
2045 CONVERT_ARG_HANDLE_CHECKED(String, pattern, 1); 2045 CONVERT_ARG_HANDLE_CHECKED(String, pattern, 1);
2046 CONVERT_ARG_HANDLE_CHECKED(String, flags, 2); 2046 CONVERT_ARG_HANDLE_CHECKED(String, flags, 2);
2047 Handle<Object> result; 2047 Handle<Object> result;
2048 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 2048 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2049 isolate, result, RegExpImpl::Compile(re, pattern, flags)); 2049 isolate, result, RegExpImpl::Compile(re, pattern, flags));
2050 return *result; 2050 return *result;
2051 } 2051 }
2052 2052
2053 2053
2054 RUNTIME_FUNCTION(Runtime_CreateApiFunction) { 2054 RUNTIME_FUNCTION(Runtime_CreateApiFunction) {
2055 HandleScope scope(isolate); 2055 HandleScope scope(isolate);
2056 ASSERT(args.length() == 2); 2056 DCHECK(args.length() == 2);
2057 CONVERT_ARG_HANDLE_CHECKED(FunctionTemplateInfo, data, 0); 2057 CONVERT_ARG_HANDLE_CHECKED(FunctionTemplateInfo, data, 0);
2058 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1); 2058 CONVERT_ARG_HANDLE_CHECKED(Object, prototype, 1);
2059 return *isolate->factory()->CreateApiFunction(data, prototype); 2059 return *isolate->factory()->CreateApiFunction(data, prototype);
2060 } 2060 }
2061 2061
2062 2062
2063 RUNTIME_FUNCTION(Runtime_IsTemplate) { 2063 RUNTIME_FUNCTION(Runtime_IsTemplate) {
2064 SealHandleScope shs(isolate); 2064 SealHandleScope shs(isolate);
2065 ASSERT(args.length() == 1); 2065 DCHECK(args.length() == 1);
2066 CONVERT_ARG_HANDLE_CHECKED(Object, arg, 0); 2066 CONVERT_ARG_HANDLE_CHECKED(Object, arg, 0);
2067 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo(); 2067 bool result = arg->IsObjectTemplateInfo() || arg->IsFunctionTemplateInfo();
2068 return isolate->heap()->ToBoolean(result); 2068 return isolate->heap()->ToBoolean(result);
2069 } 2069 }
2070 2070
2071 2071
2072 RUNTIME_FUNCTION(Runtime_GetTemplateField) { 2072 RUNTIME_FUNCTION(Runtime_GetTemplateField) {
2073 SealHandleScope shs(isolate); 2073 SealHandleScope shs(isolate);
2074 ASSERT(args.length() == 2); 2074 DCHECK(args.length() == 2);
2075 CONVERT_ARG_CHECKED(HeapObject, templ, 0); 2075 CONVERT_ARG_CHECKED(HeapObject, templ, 0);
2076 CONVERT_SMI_ARG_CHECKED(index, 1); 2076 CONVERT_SMI_ARG_CHECKED(index, 1);
2077 int offset = index * kPointerSize + HeapObject::kHeaderSize; 2077 int offset = index * kPointerSize + HeapObject::kHeaderSize;
2078 InstanceType type = templ->map()->instance_type(); 2078 InstanceType type = templ->map()->instance_type();
2079 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE || 2079 RUNTIME_ASSERT(type == FUNCTION_TEMPLATE_INFO_TYPE ||
2080 type == OBJECT_TEMPLATE_INFO_TYPE); 2080 type == OBJECT_TEMPLATE_INFO_TYPE);
2081 RUNTIME_ASSERT(offset > 0); 2081 RUNTIME_ASSERT(offset > 0);
2082 if (type == FUNCTION_TEMPLATE_INFO_TYPE) { 2082 if (type == FUNCTION_TEMPLATE_INFO_TYPE) {
2083 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize); 2083 RUNTIME_ASSERT(offset < FunctionTemplateInfo::kSize);
2084 } else { 2084 } else {
2085 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize); 2085 RUNTIME_ASSERT(offset < ObjectTemplateInfo::kSize);
2086 } 2086 }
2087 return *HeapObject::RawField(templ, offset); 2087 return *HeapObject::RawField(templ, offset);
2088 } 2088 }
2089 2089
2090 2090
2091 RUNTIME_FUNCTION(Runtime_DisableAccessChecks) { 2091 RUNTIME_FUNCTION(Runtime_DisableAccessChecks) {
2092 HandleScope scope(isolate); 2092 HandleScope scope(isolate);
2093 ASSERT(args.length() == 1); 2093 DCHECK(args.length() == 1);
2094 CONVERT_ARG_HANDLE_CHECKED(HeapObject, object, 0); 2094 CONVERT_ARG_HANDLE_CHECKED(HeapObject, object, 0);
2095 Handle<Map> old_map(object->map()); 2095 Handle<Map> old_map(object->map());
2096 bool needs_access_checks = old_map->is_access_check_needed(); 2096 bool needs_access_checks = old_map->is_access_check_needed();
2097 if (needs_access_checks) { 2097 if (needs_access_checks) {
2098 // Copy map so it won't interfere constructor's initial map. 2098 // Copy map so it won't interfere constructor's initial map.
2099 Handle<Map> new_map = Map::Copy(old_map); 2099 Handle<Map> new_map = Map::Copy(old_map);
2100 new_map->set_is_access_check_needed(false); 2100 new_map->set_is_access_check_needed(false);
2101 JSObject::MigrateToMap(Handle<JSObject>::cast(object), new_map); 2101 JSObject::MigrateToMap(Handle<JSObject>::cast(object), new_map);
2102 } 2102 }
2103 return isolate->heap()->ToBoolean(needs_access_checks); 2103 return isolate->heap()->ToBoolean(needs_access_checks);
2104 } 2104 }
2105 2105
2106 2106
2107 RUNTIME_FUNCTION(Runtime_EnableAccessChecks) { 2107 RUNTIME_FUNCTION(Runtime_EnableAccessChecks) {
2108 HandleScope scope(isolate); 2108 HandleScope scope(isolate);
2109 ASSERT(args.length() == 1); 2109 DCHECK(args.length() == 1);
2110 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 2110 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
2111 Handle<Map> old_map(object->map()); 2111 Handle<Map> old_map(object->map());
2112 RUNTIME_ASSERT(!old_map->is_access_check_needed()); 2112 RUNTIME_ASSERT(!old_map->is_access_check_needed());
2113 // Copy map so it won't interfere constructor's initial map. 2113 // Copy map so it won't interfere constructor's initial map.
2114 Handle<Map> new_map = Map::Copy(old_map); 2114 Handle<Map> new_map = Map::Copy(old_map);
2115 new_map->set_is_access_check_needed(true); 2115 new_map->set_is_access_check_needed(true);
2116 JSObject::MigrateToMap(object, new_map); 2116 JSObject::MigrateToMap(object, new_map);
2117 return isolate->heap()->undefined_value(); 2117 return isolate->heap()->undefined_value();
2118 } 2118 }
2119 2119
2120 2120
2121 static Object* ThrowRedeclarationError(Isolate* isolate, Handle<String> name) { 2121 static Object* ThrowRedeclarationError(Isolate* isolate, Handle<String> name) {
2122 HandleScope scope(isolate); 2122 HandleScope scope(isolate);
2123 Handle<Object> args[1] = { name }; 2123 Handle<Object> args[1] = { name };
2124 Handle<Object> error = isolate->factory()->NewTypeError( 2124 Handle<Object> error = isolate->factory()->NewTypeError(
2125 "var_redeclaration", HandleVector(args, 1)); 2125 "var_redeclaration", HandleVector(args, 1));
2126 return isolate->Throw(*error); 2126 return isolate->Throw(*error);
2127 } 2127 }
2128 2128
2129 2129
2130 // May throw a RedeclarationError. 2130 // May throw a RedeclarationError.
2131 static Object* DeclareGlobals(Isolate* isolate, Handle<GlobalObject> global, 2131 static Object* DeclareGlobals(Isolate* isolate, Handle<GlobalObject> global,
2132 Handle<String> name, Handle<Object> value, 2132 Handle<String> name, Handle<Object> value,
2133 PropertyAttributes attr, bool is_var, 2133 PropertyAttributes attr, bool is_var,
2134 bool is_const, bool is_function) { 2134 bool is_const, bool is_function) {
2135 // Do the lookup own properties only, see ES5 erratum. 2135 // Do the lookup own properties only, see ES5 erratum.
2136 LookupIterator it(global, name, LookupIterator::CHECK_HIDDEN); 2136 LookupIterator it(global, name, LookupIterator::CHECK_HIDDEN);
2137 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); 2137 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it);
2138 ASSERT(maybe.has_value); 2138 DCHECK(maybe.has_value);
2139 PropertyAttributes old_attributes = maybe.value; 2139 PropertyAttributes old_attributes = maybe.value;
2140 2140
2141 if (old_attributes != ABSENT) { 2141 if (old_attributes != ABSENT) {
2142 // The name was declared before; check for conflicting re-declarations. 2142 // The name was declared before; check for conflicting re-declarations.
2143 if (is_const) return ThrowRedeclarationError(isolate, name); 2143 if (is_const) return ThrowRedeclarationError(isolate, name);
2144 2144
2145 // Skip var re-declarations. 2145 // Skip var re-declarations.
2146 if (is_var) return isolate->heap()->undefined_value(); 2146 if (is_var) return isolate->heap()->undefined_value();
2147 2147
2148 ASSERT(is_function); 2148 DCHECK(is_function);
2149 if ((old_attributes & DONT_DELETE) != 0) { 2149 if ((old_attributes & DONT_DELETE) != 0) {
2150 // Only allow reconfiguring globals to functions in user code (no 2150 // Only allow reconfiguring globals to functions in user code (no
2151 // natives, which are marked as read-only). 2151 // natives, which are marked as read-only).
2152 ASSERT((attr & READ_ONLY) == 0); 2152 DCHECK((attr & READ_ONLY) == 0);
2153 2153
2154 // Check whether we can reconfigure the existing property into a 2154 // Check whether we can reconfigure the existing property into a
2155 // function. 2155 // function.
2156 PropertyDetails old_details = it.property_details(); 2156 PropertyDetails old_details = it.property_details();
2157 // TODO(verwaest): CALLBACKS invalidly includes ExecutableAccessInfo, 2157 // TODO(verwaest): CALLBACKS invalidly includes ExecutableAccessInfo,
2158 // which are actually data properties, not accessor properties. 2158 // which are actually data properties, not accessor properties.
2159 if (old_details.IsReadOnly() || old_details.IsDontEnum() || 2159 if (old_details.IsReadOnly() || old_details.IsDontEnum() ||
2160 old_details.type() == CALLBACKS) { 2160 old_details.type() == CALLBACKS) {
2161 return ThrowRedeclarationError(isolate, name); 2161 return ThrowRedeclarationError(isolate, name);
2162 } 2162 }
2163 // If the existing property is not configurable, keep its attributes. Do 2163 // If the existing property is not configurable, keep its attributes. Do
2164 attr = old_attributes; 2164 attr = old_attributes;
2165 } 2165 }
2166 } 2166 }
2167 2167
2168 // Define or redefine own property. 2168 // Define or redefine own property.
2169 RETURN_FAILURE_ON_EXCEPTION(isolate, JSObject::SetOwnPropertyIgnoreAttributes( 2169 RETURN_FAILURE_ON_EXCEPTION(isolate, JSObject::SetOwnPropertyIgnoreAttributes(
2170 global, name, value, attr)); 2170 global, name, value, attr));
2171 2171
2172 return isolate->heap()->undefined_value(); 2172 return isolate->heap()->undefined_value();
2173 } 2173 }
2174 2174
2175 2175
2176 RUNTIME_FUNCTION(Runtime_DeclareGlobals) { 2176 RUNTIME_FUNCTION(Runtime_DeclareGlobals) {
2177 HandleScope scope(isolate); 2177 HandleScope scope(isolate);
2178 ASSERT(args.length() == 3); 2178 DCHECK(args.length() == 3);
2179 Handle<GlobalObject> global(isolate->global_object()); 2179 Handle<GlobalObject> global(isolate->global_object());
2180 2180
2181 CONVERT_ARG_HANDLE_CHECKED(Context, context, 0); 2181 CONVERT_ARG_HANDLE_CHECKED(Context, context, 0);
2182 CONVERT_ARG_HANDLE_CHECKED(FixedArray, pairs, 1); 2182 CONVERT_ARG_HANDLE_CHECKED(FixedArray, pairs, 1);
2183 CONVERT_SMI_ARG_CHECKED(flags, 2); 2183 CONVERT_SMI_ARG_CHECKED(flags, 2);
2184 2184
2185 // Traverse the name/value pairs and set the properties. 2185 // Traverse the name/value pairs and set the properties.
2186 int length = pairs->length(); 2186 int length = pairs->length();
2187 for (int i = 0; i < length; i += 2) { 2187 for (int i = 0; i < length; i += 2) {
2188 HandleScope scope(isolate); 2188 HandleScope scope(isolate);
2189 Handle<String> name(String::cast(pairs->get(i))); 2189 Handle<String> name(String::cast(pairs->get(i)));
2190 Handle<Object> initial_value(pairs->get(i + 1), isolate); 2190 Handle<Object> initial_value(pairs->get(i + 1), isolate);
2191 2191
2192 // We have to declare a global const property. To capture we only 2192 // We have to declare a global const property. To capture we only
2193 // assign to it when evaluating the assignment for "const x = 2193 // assign to it when evaluating the assignment for "const x =
2194 // <expr>" the initial value is the hole. 2194 // <expr>" the initial value is the hole.
2195 bool is_var = initial_value->IsUndefined(); 2195 bool is_var = initial_value->IsUndefined();
2196 bool is_const = initial_value->IsTheHole(); 2196 bool is_const = initial_value->IsTheHole();
2197 bool is_function = initial_value->IsSharedFunctionInfo(); 2197 bool is_function = initial_value->IsSharedFunctionInfo();
2198 ASSERT(is_var + is_const + is_function == 1); 2198 DCHECK(is_var + is_const + is_function == 1);
2199 2199
2200 Handle<Object> value; 2200 Handle<Object> value;
2201 if (is_function) { 2201 if (is_function) {
2202 // Copy the function and update its context. Use it as value. 2202 // Copy the function and update its context. Use it as value.
2203 Handle<SharedFunctionInfo> shared = 2203 Handle<SharedFunctionInfo> shared =
2204 Handle<SharedFunctionInfo>::cast(initial_value); 2204 Handle<SharedFunctionInfo>::cast(initial_value);
2205 Handle<JSFunction> function = 2205 Handle<JSFunction> function =
2206 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, 2206 isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context,
2207 TENURED); 2207 TENURED);
2208 value = function; 2208 value = function;
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2258 // is the second. 2258 // is the second.
2259 RUNTIME_ASSERT(args.length() == 2); 2259 RUNTIME_ASSERT(args.length() == 2);
2260 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); 2260 CONVERT_ARG_HANDLE_CHECKED(String, name, 0);
2261 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); 2261 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
2262 2262
2263 Handle<GlobalObject> global = isolate->global_object(); 2263 Handle<GlobalObject> global = isolate->global_object();
2264 2264
2265 // Lookup the property as own on the global object. 2265 // Lookup the property as own on the global object.
2266 LookupIterator it(global, name, LookupIterator::CHECK_HIDDEN); 2266 LookupIterator it(global, name, LookupIterator::CHECK_HIDDEN);
2267 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); 2267 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it);
2268 ASSERT(maybe.has_value); 2268 DCHECK(maybe.has_value);
2269 PropertyAttributes old_attributes = maybe.value; 2269 PropertyAttributes old_attributes = maybe.value;
2270 2270
2271 PropertyAttributes attr = 2271 PropertyAttributes attr =
2272 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY); 2272 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY);
2273 // Set the value if the property is either missing, or the property attributes 2273 // Set the value if the property is either missing, or the property attributes
2274 // allow setting the value without invoking an accessor. 2274 // allow setting the value without invoking an accessor.
2275 if (it.IsFound()) { 2275 if (it.IsFound()) {
2276 // Ignore if we can't reconfigure the value. 2276 // Ignore if we can't reconfigure the value.
2277 if ((old_attributes & DONT_DELETE) != 0) { 2277 if ((old_attributes & DONT_DELETE) != 0) {
2278 if ((old_attributes & READ_ONLY) != 0 || 2278 if ((old_attributes & READ_ONLY) != 0 ||
2279 it.property_kind() == LookupIterator::ACCESSOR) { 2279 it.property_kind() == LookupIterator::ACCESSOR) {
2280 return *value; 2280 return *value;
2281 } 2281 }
2282 attr = static_cast<PropertyAttributes>(old_attributes | READ_ONLY); 2282 attr = static_cast<PropertyAttributes>(old_attributes | READ_ONLY);
2283 } 2283 }
2284 } 2284 }
2285 2285
2286 RETURN_FAILURE_ON_EXCEPTION(isolate, JSObject::SetOwnPropertyIgnoreAttributes( 2286 RETURN_FAILURE_ON_EXCEPTION(isolate, JSObject::SetOwnPropertyIgnoreAttributes(
2287 global, name, value, attr)); 2287 global, name, value, attr));
2288 2288
2289 return *value; 2289 return *value;
2290 } 2290 }
2291 2291
2292 2292
2293 RUNTIME_FUNCTION(Runtime_DeclareLookupSlot) { 2293 RUNTIME_FUNCTION(Runtime_DeclareLookupSlot) {
2294 HandleScope scope(isolate); 2294 HandleScope scope(isolate);
2295 ASSERT(args.length() == 4); 2295 DCHECK(args.length() == 4);
2296 2296
2297 // Declarations are always made in a function, native, or global context. In 2297 // Declarations are always made in a function, native, or global context. In
2298 // the case of eval code, the context passed is the context of the caller, 2298 // the case of eval code, the context passed is the context of the caller,
2299 // which may be some nested context and not the declaration context. 2299 // which may be some nested context and not the declaration context.
2300 CONVERT_ARG_HANDLE_CHECKED(Context, context_arg, 0); 2300 CONVERT_ARG_HANDLE_CHECKED(Context, context_arg, 0);
2301 Handle<Context> context(context_arg->declaration_context()); 2301 Handle<Context> context(context_arg->declaration_context());
2302 CONVERT_ARG_HANDLE_CHECKED(String, name, 1); 2302 CONVERT_ARG_HANDLE_CHECKED(String, name, 1);
2303 CONVERT_SMI_ARG_CHECKED(attr_arg, 2); 2303 CONVERT_SMI_ARG_CHECKED(attr_arg, 2);
2304 PropertyAttributes attr = static_cast<PropertyAttributes>(attr_arg); 2304 PropertyAttributes attr = static_cast<PropertyAttributes>(attr_arg);
2305 RUNTIME_ASSERT(attr == READ_ONLY || attr == NONE); 2305 RUNTIME_ASSERT(attr == READ_ONLY || attr == NONE);
2306 CONVERT_ARG_HANDLE_CHECKED(Object, initial_value, 3); 2306 CONVERT_ARG_HANDLE_CHECKED(Object, initial_value, 3);
2307 2307
2308 // TODO(verwaest): Unify the encoding indicating "var" with DeclareGlobals. 2308 // TODO(verwaest): Unify the encoding indicating "var" with DeclareGlobals.
2309 bool is_var = *initial_value == NULL; 2309 bool is_var = *initial_value == NULL;
2310 bool is_const = initial_value->IsTheHole(); 2310 bool is_const = initial_value->IsTheHole();
2311 bool is_function = initial_value->IsJSFunction(); 2311 bool is_function = initial_value->IsJSFunction();
2312 ASSERT(is_var + is_const + is_function == 1); 2312 DCHECK(is_var + is_const + is_function == 1);
2313 2313
2314 int index; 2314 int index;
2315 PropertyAttributes attributes; 2315 PropertyAttributes attributes;
2316 ContextLookupFlags flags = DONT_FOLLOW_CHAINS; 2316 ContextLookupFlags flags = DONT_FOLLOW_CHAINS;
2317 BindingFlags binding_flags; 2317 BindingFlags binding_flags;
2318 Handle<Object> holder = 2318 Handle<Object> holder =
2319 context->Lookup(name, flags, &index, &attributes, &binding_flags); 2319 context->Lookup(name, flags, &index, &attributes, &binding_flags);
2320 2320
2321 Handle<JSObject> object; 2321 Handle<JSObject> object;
2322 Handle<Object> value = 2322 Handle<Object> value =
(...skipping 11 matching lines...) Expand all
2334 2334
2335 if (attributes != ABSENT) { 2335 if (attributes != ABSENT) {
2336 // The name was declared before; check for conflicting re-declarations. 2336 // The name was declared before; check for conflicting re-declarations.
2337 if (is_const || (attributes & READ_ONLY) != 0) { 2337 if (is_const || (attributes & READ_ONLY) != 0) {
2338 return ThrowRedeclarationError(isolate, name); 2338 return ThrowRedeclarationError(isolate, name);
2339 } 2339 }
2340 2340
2341 // Skip var re-declarations. 2341 // Skip var re-declarations.
2342 if (is_var) return isolate->heap()->undefined_value(); 2342 if (is_var) return isolate->heap()->undefined_value();
2343 2343
2344 ASSERT(is_function); 2344 DCHECK(is_function);
2345 if (index >= 0) { 2345 if (index >= 0) {
2346 ASSERT(holder.is_identical_to(context)); 2346 DCHECK(holder.is_identical_to(context));
2347 context->set(index, *initial_value); 2347 context->set(index, *initial_value);
2348 return isolate->heap()->undefined_value(); 2348 return isolate->heap()->undefined_value();
2349 } 2349 }
2350 2350
2351 object = Handle<JSObject>::cast(holder); 2351 object = Handle<JSObject>::cast(holder);
2352 2352
2353 } else if (context->has_extension()) { 2353 } else if (context->has_extension()) {
2354 object = handle(JSObject::cast(context->extension())); 2354 object = handle(JSObject::cast(context->extension()));
2355 ASSERT(object->IsJSContextExtensionObject() || object->IsJSGlobalObject()); 2355 DCHECK(object->IsJSContextExtensionObject() || object->IsJSGlobalObject());
2356 } else { 2356 } else {
2357 ASSERT(context->IsFunctionContext()); 2357 DCHECK(context->IsFunctionContext());
2358 object = 2358 object =
2359 isolate->factory()->NewJSObject(isolate->context_extension_function()); 2359 isolate->factory()->NewJSObject(isolate->context_extension_function());
2360 context->set_extension(*object); 2360 context->set_extension(*object);
2361 } 2361 }
2362 2362
2363 RETURN_FAILURE_ON_EXCEPTION(isolate, JSObject::SetOwnPropertyIgnoreAttributes( 2363 RETURN_FAILURE_ON_EXCEPTION(isolate, JSObject::SetOwnPropertyIgnoreAttributes(
2364 object, name, value, attr)); 2364 object, name, value, attr));
2365 2365
2366 return isolate->heap()->undefined_value(); 2366 return isolate->heap()->undefined_value();
2367 } 2367 }
2368 2368
2369 2369
2370 RUNTIME_FUNCTION(Runtime_InitializeLegacyConstLookupSlot) { 2370 RUNTIME_FUNCTION(Runtime_InitializeLegacyConstLookupSlot) {
2371 HandleScope scope(isolate); 2371 HandleScope scope(isolate);
2372 ASSERT(args.length() == 3); 2372 DCHECK(args.length() == 3);
2373 2373
2374 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); 2374 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0);
2375 ASSERT(!value->IsTheHole()); 2375 DCHECK(!value->IsTheHole());
2376 // Initializations are always done in a function or native context. 2376 // Initializations are always done in a function or native context.
2377 CONVERT_ARG_HANDLE_CHECKED(Context, context_arg, 1); 2377 CONVERT_ARG_HANDLE_CHECKED(Context, context_arg, 1);
2378 Handle<Context> context(context_arg->declaration_context()); 2378 Handle<Context> context(context_arg->declaration_context());
2379 CONVERT_ARG_HANDLE_CHECKED(String, name, 2); 2379 CONVERT_ARG_HANDLE_CHECKED(String, name, 2);
2380 2380
2381 int index; 2381 int index;
2382 PropertyAttributes attributes; 2382 PropertyAttributes attributes;
2383 ContextLookupFlags flags = DONT_FOLLOW_CHAINS; 2383 ContextLookupFlags flags = DONT_FOLLOW_CHAINS;
2384 BindingFlags binding_flags; 2384 BindingFlags binding_flags;
2385 Handle<Object> holder = 2385 Handle<Object> holder =
2386 context->Lookup(name, flags, &index, &attributes, &binding_flags); 2386 context->Lookup(name, flags, &index, &attributes, &binding_flags);
2387 2387
2388 if (index >= 0) { 2388 if (index >= 0) {
2389 ASSERT(holder->IsContext()); 2389 DCHECK(holder->IsContext());
2390 // Property was found in a context. Perform the assignment if the constant 2390 // Property was found in a context. Perform the assignment if the constant
2391 // was uninitialized. 2391 // was uninitialized.
2392 Handle<Context> context = Handle<Context>::cast(holder); 2392 Handle<Context> context = Handle<Context>::cast(holder);
2393 ASSERT((attributes & READ_ONLY) != 0); 2393 DCHECK((attributes & READ_ONLY) != 0);
2394 if (context->get(index)->IsTheHole()) context->set(index, *value); 2394 if (context->get(index)->IsTheHole()) context->set(index, *value);
2395 return *value; 2395 return *value;
2396 } 2396 }
2397 2397
2398 PropertyAttributes attr = 2398 PropertyAttributes attr =
2399 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY); 2399 static_cast<PropertyAttributes>(DONT_DELETE | READ_ONLY);
2400 2400
2401 // Strict mode handling not needed (legacy const is disallowed in strict 2401 // Strict mode handling not needed (legacy const is disallowed in strict
2402 // mode). 2402 // mode).
2403 2403
2404 // The declared const was configurable, and may have been deleted in the 2404 // The declared const was configurable, and may have been deleted in the
2405 // meanwhile. If so, re-introduce the variable in the context extension. 2405 // meanwhile. If so, re-introduce the variable in the context extension.
2406 ASSERT(context_arg->has_extension()); 2406 DCHECK(context_arg->has_extension());
2407 if (attributes == ABSENT) { 2407 if (attributes == ABSENT) {
2408 holder = handle(context_arg->extension(), isolate); 2408 holder = handle(context_arg->extension(), isolate);
2409 } else { 2409 } else {
2410 // For JSContextExtensionObjects, the initializer can be run multiple times 2410 // For JSContextExtensionObjects, the initializer can be run multiple times
2411 // if in a for loop: for (var i = 0; i < 2; i++) { const x = i; }. Only the 2411 // if in a for loop: for (var i = 0; i < 2; i++) { const x = i; }. Only the
2412 // first assignment should go through. For JSGlobalObjects, additionally any 2412 // first assignment should go through. For JSGlobalObjects, additionally any
2413 // code can run in between that modifies the declared property. 2413 // code can run in between that modifies the declared property.
2414 ASSERT(holder->IsJSGlobalObject() || holder->IsJSContextExtensionObject()); 2414 DCHECK(holder->IsJSGlobalObject() || holder->IsJSContextExtensionObject());
2415 2415
2416 LookupIterator it(holder, name, LookupIterator::CHECK_HIDDEN); 2416 LookupIterator it(holder, name, LookupIterator::CHECK_HIDDEN);
2417 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); 2417 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it);
2418 if (!maybe.has_value) return isolate->heap()->exception(); 2418 if (!maybe.has_value) return isolate->heap()->exception();
2419 PropertyAttributes old_attributes = maybe.value; 2419 PropertyAttributes old_attributes = maybe.value;
2420 2420
2421 // Ignore if we can't reconfigure the value. 2421 // Ignore if we can't reconfigure the value.
2422 if ((old_attributes & DONT_DELETE) != 0) { 2422 if ((old_attributes & DONT_DELETE) != 0) {
2423 if ((old_attributes & READ_ONLY) != 0 || 2423 if ((old_attributes & READ_ONLY) != 0 ||
2424 it.property_kind() == LookupIterator::ACCESSOR) { 2424 it.property_kind() == LookupIterator::ACCESSOR) {
2425 return *value; 2425 return *value;
2426 } 2426 }
2427 attr = static_cast<PropertyAttributes>(old_attributes | READ_ONLY); 2427 attr = static_cast<PropertyAttributes>(old_attributes | READ_ONLY);
2428 } 2428 }
2429 } 2429 }
2430 2430
2431 RETURN_FAILURE_ON_EXCEPTION( 2431 RETURN_FAILURE_ON_EXCEPTION(
2432 isolate, JSObject::SetOwnPropertyIgnoreAttributes( 2432 isolate, JSObject::SetOwnPropertyIgnoreAttributes(
2433 Handle<JSObject>::cast(holder), name, value, attr)); 2433 Handle<JSObject>::cast(holder), name, value, attr));
2434 2434
2435 return *value; 2435 return *value;
2436 } 2436 }
2437 2437
2438 2438
2439 RUNTIME_FUNCTION(Runtime_OptimizeObjectForAddingMultipleProperties) { 2439 RUNTIME_FUNCTION(Runtime_OptimizeObjectForAddingMultipleProperties) {
2440 HandleScope scope(isolate); 2440 HandleScope scope(isolate);
2441 ASSERT(args.length() == 2); 2441 DCHECK(args.length() == 2);
2442 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 2442 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
2443 CONVERT_SMI_ARG_CHECKED(properties, 1); 2443 CONVERT_SMI_ARG_CHECKED(properties, 1);
2444 // Conservative upper limit to prevent fuzz tests from going OOM. 2444 // Conservative upper limit to prevent fuzz tests from going OOM.
2445 RUNTIME_ASSERT(properties <= 100000); 2445 RUNTIME_ASSERT(properties <= 100000);
2446 if (object->HasFastProperties() && !object->IsJSGlobalProxy()) { 2446 if (object->HasFastProperties() && !object->IsJSGlobalProxy()) {
2447 JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties); 2447 JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, properties);
2448 } 2448 }
2449 return *object; 2449 return *object;
2450 } 2450 }
2451 2451
2452 2452
2453 RUNTIME_FUNCTION(Runtime_RegExpExecRT) { 2453 RUNTIME_FUNCTION(Runtime_RegExpExecRT) {
2454 HandleScope scope(isolate); 2454 HandleScope scope(isolate);
2455 ASSERT(args.length() == 4); 2455 DCHECK(args.length() == 4);
2456 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); 2456 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0);
2457 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); 2457 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1);
2458 // Due to the way the JS calls are constructed this must be less than the 2458 // Due to the way the JS calls are constructed this must be less than the
2459 // length of a string, i.e. it is always a Smi. We check anyway for security. 2459 // length of a string, i.e. it is always a Smi. We check anyway for security.
2460 CONVERT_SMI_ARG_CHECKED(index, 2); 2460 CONVERT_SMI_ARG_CHECKED(index, 2);
2461 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3); 2461 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3);
2462 RUNTIME_ASSERT(index >= 0); 2462 RUNTIME_ASSERT(index >= 0);
2463 RUNTIME_ASSERT(index <= subject->length()); 2463 RUNTIME_ASSERT(index <= subject->length());
2464 isolate->counters()->regexp_entry_runtime()->Increment(); 2464 isolate->counters()->regexp_entry_runtime()->Increment();
2465 Handle<Object> result; 2465 Handle<Object> result;
2466 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 2466 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2467 isolate, result, 2467 isolate, result,
2468 RegExpImpl::Exec(regexp, subject, index, last_match_info)); 2468 RegExpImpl::Exec(regexp, subject, index, last_match_info));
2469 return *result; 2469 return *result;
2470 } 2470 }
2471 2471
2472 2472
2473 RUNTIME_FUNCTION(Runtime_RegExpConstructResult) { 2473 RUNTIME_FUNCTION(Runtime_RegExpConstructResult) {
2474 HandleScope handle_scope(isolate); 2474 HandleScope handle_scope(isolate);
2475 ASSERT(args.length() == 3); 2475 DCHECK(args.length() == 3);
2476 CONVERT_SMI_ARG_CHECKED(size, 0); 2476 CONVERT_SMI_ARG_CHECKED(size, 0);
2477 RUNTIME_ASSERT(size >= 0 && size <= FixedArray::kMaxLength); 2477 RUNTIME_ASSERT(size >= 0 && size <= FixedArray::kMaxLength);
2478 CONVERT_ARG_HANDLE_CHECKED(Object, index, 1); 2478 CONVERT_ARG_HANDLE_CHECKED(Object, index, 1);
2479 CONVERT_ARG_HANDLE_CHECKED(Object, input, 2); 2479 CONVERT_ARG_HANDLE_CHECKED(Object, input, 2);
2480 Handle<FixedArray> elements = isolate->factory()->NewFixedArray(size); 2480 Handle<FixedArray> elements = isolate->factory()->NewFixedArray(size);
2481 Handle<Map> regexp_map(isolate->native_context()->regexp_result_map()); 2481 Handle<Map> regexp_map(isolate->native_context()->regexp_result_map());
2482 Handle<JSObject> object = 2482 Handle<JSObject> object =
2483 isolate->factory()->NewJSObjectFromMap(regexp_map, NOT_TENURED, false); 2483 isolate->factory()->NewJSObjectFromMap(regexp_map, NOT_TENURED, false);
2484 Handle<JSArray> array = Handle<JSArray>::cast(object); 2484 Handle<JSArray> array = Handle<JSArray>::cast(object);
2485 array->set_elements(*elements); 2485 array->set_elements(*elements);
2486 array->set_length(Smi::FromInt(size)); 2486 array->set_length(Smi::FromInt(size));
2487 // Write in-object properties after the length of the array. 2487 // Write in-object properties after the length of the array.
2488 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, *index); 2488 array->InObjectPropertyAtPut(JSRegExpResult::kIndexIndex, *index);
2489 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, *input); 2489 array->InObjectPropertyAtPut(JSRegExpResult::kInputIndex, *input);
2490 return *array; 2490 return *array;
2491 } 2491 }
2492 2492
2493 2493
2494 RUNTIME_FUNCTION(Runtime_RegExpInitializeObject) { 2494 RUNTIME_FUNCTION(Runtime_RegExpInitializeObject) {
2495 HandleScope scope(isolate); 2495 HandleScope scope(isolate);
2496 ASSERT(args.length() == 5); 2496 DCHECK(args.length() == 5);
2497 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); 2497 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0);
2498 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); 2498 CONVERT_ARG_HANDLE_CHECKED(String, source, 1);
2499 // If source is the empty string we set it to "(?:)" instead as 2499 // If source is the empty string we set it to "(?:)" instead as
2500 // suggested by ECMA-262, 5th, section 15.10.4.1. 2500 // suggested by ECMA-262, 5th, section 15.10.4.1.
2501 if (source->length() == 0) source = isolate->factory()->query_colon_string(); 2501 if (source->length() == 0) source = isolate->factory()->query_colon_string();
2502 2502
2503 CONVERT_ARG_HANDLE_CHECKED(Object, global, 2); 2503 CONVERT_ARG_HANDLE_CHECKED(Object, global, 2);
2504 if (!global->IsTrue()) global = isolate->factory()->false_value(); 2504 if (!global->IsTrue()) global = isolate->factory()->false_value();
2505 2505
2506 CONVERT_ARG_HANDLE_CHECKED(Object, ignoreCase, 3); 2506 CONVERT_ARG_HANDLE_CHECKED(Object, ignoreCase, 3);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
2544 JSObject::SetOwnPropertyIgnoreAttributes( 2544 JSObject::SetOwnPropertyIgnoreAttributes(
2545 regexp, factory->multiline_string(), multiline, final).Check(); 2545 regexp, factory->multiline_string(), multiline, final).Check();
2546 JSObject::SetOwnPropertyIgnoreAttributes( 2546 JSObject::SetOwnPropertyIgnoreAttributes(
2547 regexp, factory->last_index_string(), zero, writable).Check(); 2547 regexp, factory->last_index_string(), zero, writable).Check();
2548 return *regexp; 2548 return *regexp;
2549 } 2549 }
2550 2550
2551 2551
2552 RUNTIME_FUNCTION(Runtime_FinishArrayPrototypeSetup) { 2552 RUNTIME_FUNCTION(Runtime_FinishArrayPrototypeSetup) {
2553 HandleScope scope(isolate); 2553 HandleScope scope(isolate);
2554 ASSERT(args.length() == 1); 2554 DCHECK(args.length() == 1);
2555 CONVERT_ARG_HANDLE_CHECKED(JSArray, prototype, 0); 2555 CONVERT_ARG_HANDLE_CHECKED(JSArray, prototype, 0);
2556 Object* length = prototype->length(); 2556 Object* length = prototype->length();
2557 RUNTIME_ASSERT(length->IsSmi() && Smi::cast(length)->value() == 0); 2557 RUNTIME_ASSERT(length->IsSmi() && Smi::cast(length)->value() == 0);
2558 RUNTIME_ASSERT(prototype->HasFastSmiOrObjectElements()); 2558 RUNTIME_ASSERT(prototype->HasFastSmiOrObjectElements());
2559 // This is necessary to enable fast checks for absence of elements 2559 // This is necessary to enable fast checks for absence of elements
2560 // on Array.prototype and below. 2560 // on Array.prototype and below.
2561 prototype->set_elements(isolate->heap()->empty_fixed_array()); 2561 prototype->set_elements(isolate->heap()->empty_fixed_array());
2562 return Smi::FromInt(0); 2562 return Smi::FromInt(0);
2563 } 2563 }
2564 2564
2565 2565
2566 static void InstallBuiltin(Isolate* isolate, 2566 static void InstallBuiltin(Isolate* isolate,
2567 Handle<JSObject> holder, 2567 Handle<JSObject> holder,
2568 const char* name, 2568 const char* name,
2569 Builtins::Name builtin_name) { 2569 Builtins::Name builtin_name) {
2570 Handle<String> key = isolate->factory()->InternalizeUtf8String(name); 2570 Handle<String> key = isolate->factory()->InternalizeUtf8String(name);
2571 Handle<Code> code(isolate->builtins()->builtin(builtin_name)); 2571 Handle<Code> code(isolate->builtins()->builtin(builtin_name));
2572 Handle<JSFunction> optimized = 2572 Handle<JSFunction> optimized =
2573 isolate->factory()->NewFunctionWithoutPrototype(key, code); 2573 isolate->factory()->NewFunctionWithoutPrototype(key, code);
2574 optimized->shared()->DontAdaptArguments(); 2574 optimized->shared()->DontAdaptArguments();
2575 JSObject::AddProperty(holder, key, optimized, NONE); 2575 JSObject::AddProperty(holder, key, optimized, NONE);
2576 } 2576 }
2577 2577
2578 2578
2579 RUNTIME_FUNCTION(Runtime_SpecialArrayFunctions) { 2579 RUNTIME_FUNCTION(Runtime_SpecialArrayFunctions) {
2580 HandleScope scope(isolate); 2580 HandleScope scope(isolate);
2581 ASSERT(args.length() == 0); 2581 DCHECK(args.length() == 0);
2582 Handle<JSObject> holder = 2582 Handle<JSObject> holder =
2583 isolate->factory()->NewJSObject(isolate->object_function()); 2583 isolate->factory()->NewJSObject(isolate->object_function());
2584 2584
2585 InstallBuiltin(isolate, holder, "pop", Builtins::kArrayPop); 2585 InstallBuiltin(isolate, holder, "pop", Builtins::kArrayPop);
2586 InstallBuiltin(isolate, holder, "push", Builtins::kArrayPush); 2586 InstallBuiltin(isolate, holder, "push", Builtins::kArrayPush);
2587 InstallBuiltin(isolate, holder, "shift", Builtins::kArrayShift); 2587 InstallBuiltin(isolate, holder, "shift", Builtins::kArrayShift);
2588 InstallBuiltin(isolate, holder, "unshift", Builtins::kArrayUnshift); 2588 InstallBuiltin(isolate, holder, "unshift", Builtins::kArrayUnshift);
2589 InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice); 2589 InstallBuiltin(isolate, holder, "slice", Builtins::kArraySlice);
2590 InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice); 2590 InstallBuiltin(isolate, holder, "splice", Builtins::kArraySplice);
2591 InstallBuiltin(isolate, holder, "concat", Builtins::kArrayConcat); 2591 InstallBuiltin(isolate, holder, "concat", Builtins::kArrayConcat);
2592 2592
2593 return *holder; 2593 return *holder;
2594 } 2594 }
2595 2595
2596 2596
2597 RUNTIME_FUNCTION(Runtime_IsSloppyModeFunction) { 2597 RUNTIME_FUNCTION(Runtime_IsSloppyModeFunction) {
2598 SealHandleScope shs(isolate); 2598 SealHandleScope shs(isolate);
2599 ASSERT(args.length() == 1); 2599 DCHECK(args.length() == 1);
2600 CONVERT_ARG_CHECKED(JSReceiver, callable, 0); 2600 CONVERT_ARG_CHECKED(JSReceiver, callable, 0);
2601 if (!callable->IsJSFunction()) { 2601 if (!callable->IsJSFunction()) {
2602 HandleScope scope(isolate); 2602 HandleScope scope(isolate);
2603 Handle<Object> delegate; 2603 Handle<Object> delegate;
2604 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 2604 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2605 isolate, delegate, 2605 isolate, delegate,
2606 Execution::TryGetFunctionDelegate( 2606 Execution::TryGetFunctionDelegate(
2607 isolate, Handle<JSReceiver>(callable))); 2607 isolate, Handle<JSReceiver>(callable)));
2608 callable = JSFunction::cast(*delegate); 2608 callable = JSFunction::cast(*delegate);
2609 } 2609 }
2610 JSFunction* function = JSFunction::cast(callable); 2610 JSFunction* function = JSFunction::cast(callable);
2611 SharedFunctionInfo* shared = function->shared(); 2611 SharedFunctionInfo* shared = function->shared();
2612 return isolate->heap()->ToBoolean(shared->strict_mode() == SLOPPY); 2612 return isolate->heap()->ToBoolean(shared->strict_mode() == SLOPPY);
2613 } 2613 }
2614 2614
2615 2615
2616 RUNTIME_FUNCTION(Runtime_GetDefaultReceiver) { 2616 RUNTIME_FUNCTION(Runtime_GetDefaultReceiver) {
2617 SealHandleScope shs(isolate); 2617 SealHandleScope shs(isolate);
2618 ASSERT(args.length() == 1); 2618 DCHECK(args.length() == 1);
2619 CONVERT_ARG_CHECKED(JSReceiver, callable, 0); 2619 CONVERT_ARG_CHECKED(JSReceiver, callable, 0);
2620 2620
2621 if (!callable->IsJSFunction()) { 2621 if (!callable->IsJSFunction()) {
2622 HandleScope scope(isolate); 2622 HandleScope scope(isolate);
2623 Handle<Object> delegate; 2623 Handle<Object> delegate;
2624 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 2624 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2625 isolate, delegate, 2625 isolate, delegate,
2626 Execution::TryGetFunctionDelegate( 2626 Execution::TryGetFunctionDelegate(
2627 isolate, Handle<JSReceiver>(callable))); 2627 isolate, Handle<JSReceiver>(callable)));
2628 callable = JSFunction::cast(*delegate); 2628 callable = JSFunction::cast(*delegate);
2629 } 2629 }
2630 JSFunction* function = JSFunction::cast(callable); 2630 JSFunction* function = JSFunction::cast(callable);
2631 2631
2632 SharedFunctionInfo* shared = function->shared(); 2632 SharedFunctionInfo* shared = function->shared();
2633 if (shared->native() || shared->strict_mode() == STRICT) { 2633 if (shared->native() || shared->strict_mode() == STRICT) {
2634 return isolate->heap()->undefined_value(); 2634 return isolate->heap()->undefined_value();
2635 } 2635 }
2636 // Returns undefined for strict or native functions, or 2636 // Returns undefined for strict or native functions, or
2637 // the associated global receiver for "normal" functions. 2637 // the associated global receiver for "normal" functions.
2638 2638
2639 return function->global_proxy(); 2639 return function->global_proxy();
2640 } 2640 }
2641 2641
2642 2642
2643 RUNTIME_FUNCTION(Runtime_MaterializeRegExpLiteral) { 2643 RUNTIME_FUNCTION(Runtime_MaterializeRegExpLiteral) {
2644 HandleScope scope(isolate); 2644 HandleScope scope(isolate);
2645 ASSERT(args.length() == 4); 2645 DCHECK(args.length() == 4);
2646 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0); 2646 CONVERT_ARG_HANDLE_CHECKED(FixedArray, literals, 0);
2647 CONVERT_SMI_ARG_CHECKED(index, 1); 2647 CONVERT_SMI_ARG_CHECKED(index, 1);
2648 CONVERT_ARG_HANDLE_CHECKED(String, pattern, 2); 2648 CONVERT_ARG_HANDLE_CHECKED(String, pattern, 2);
2649 CONVERT_ARG_HANDLE_CHECKED(String, flags, 3); 2649 CONVERT_ARG_HANDLE_CHECKED(String, flags, 3);
2650 2650
2651 // Get the RegExp function from the context in the literals array. 2651 // Get the RegExp function from the context in the literals array.
2652 // This is the RegExp function from the context in which the 2652 // This is the RegExp function from the context in which the
2653 // function was created. We do not use the RegExp function from the 2653 // function was created. We do not use the RegExp function from the
2654 // current native context because this might be the RegExp function 2654 // current native context because this might be the RegExp function
2655 // from another context which we should not have access to. 2655 // from another context which we should not have access to.
2656 Handle<JSFunction> constructor = 2656 Handle<JSFunction> constructor =
2657 Handle<JSFunction>( 2657 Handle<JSFunction>(
2658 JSFunction::NativeContextFromLiterals(*literals)->regexp_function()); 2658 JSFunction::NativeContextFromLiterals(*literals)->regexp_function());
2659 // Compute the regular expression literal. 2659 // Compute the regular expression literal.
2660 Handle<Object> regexp; 2660 Handle<Object> regexp;
2661 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 2661 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
2662 isolate, regexp, 2662 isolate, regexp,
2663 RegExpImpl::CreateRegExpLiteral(constructor, pattern, flags)); 2663 RegExpImpl::CreateRegExpLiteral(constructor, pattern, flags));
2664 literals->set(index, *regexp); 2664 literals->set(index, *regexp);
2665 return *regexp; 2665 return *regexp;
2666 } 2666 }
2667 2667
2668 2668
2669 RUNTIME_FUNCTION(Runtime_FunctionGetName) { 2669 RUNTIME_FUNCTION(Runtime_FunctionGetName) {
2670 SealHandleScope shs(isolate); 2670 SealHandleScope shs(isolate);
2671 ASSERT(args.length() == 1); 2671 DCHECK(args.length() == 1);
2672 2672
2673 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2673 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2674 return f->shared()->name(); 2674 return f->shared()->name();
2675 } 2675 }
2676 2676
2677 2677
2678 RUNTIME_FUNCTION(Runtime_FunctionSetName) { 2678 RUNTIME_FUNCTION(Runtime_FunctionSetName) {
2679 SealHandleScope shs(isolate); 2679 SealHandleScope shs(isolate);
2680 ASSERT(args.length() == 2); 2680 DCHECK(args.length() == 2);
2681 2681
2682 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2682 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2683 CONVERT_ARG_CHECKED(String, name, 1); 2683 CONVERT_ARG_CHECKED(String, name, 1);
2684 f->shared()->set_name(name); 2684 f->shared()->set_name(name);
2685 return isolate->heap()->undefined_value(); 2685 return isolate->heap()->undefined_value();
2686 } 2686 }
2687 2687
2688 2688
2689 RUNTIME_FUNCTION(Runtime_FunctionNameShouldPrintAsAnonymous) { 2689 RUNTIME_FUNCTION(Runtime_FunctionNameShouldPrintAsAnonymous) {
2690 SealHandleScope shs(isolate); 2690 SealHandleScope shs(isolate);
2691 ASSERT(args.length() == 1); 2691 DCHECK(args.length() == 1);
2692 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2692 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2693 return isolate->heap()->ToBoolean( 2693 return isolate->heap()->ToBoolean(
2694 f->shared()->name_should_print_as_anonymous()); 2694 f->shared()->name_should_print_as_anonymous());
2695 } 2695 }
2696 2696
2697 2697
2698 RUNTIME_FUNCTION(Runtime_FunctionMarkNameShouldPrintAsAnonymous) { 2698 RUNTIME_FUNCTION(Runtime_FunctionMarkNameShouldPrintAsAnonymous) {
2699 SealHandleScope shs(isolate); 2699 SealHandleScope shs(isolate);
2700 ASSERT(args.length() == 1); 2700 DCHECK(args.length() == 1);
2701 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2701 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2702 f->shared()->set_name_should_print_as_anonymous(true); 2702 f->shared()->set_name_should_print_as_anonymous(true);
2703 return isolate->heap()->undefined_value(); 2703 return isolate->heap()->undefined_value();
2704 } 2704 }
2705 2705
2706 2706
2707 RUNTIME_FUNCTION(Runtime_FunctionIsGenerator) { 2707 RUNTIME_FUNCTION(Runtime_FunctionIsGenerator) {
2708 SealHandleScope shs(isolate); 2708 SealHandleScope shs(isolate);
2709 ASSERT(args.length() == 1); 2709 DCHECK(args.length() == 1);
2710 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2710 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2711 return isolate->heap()->ToBoolean(f->shared()->is_generator()); 2711 return isolate->heap()->ToBoolean(f->shared()->is_generator());
2712 } 2712 }
2713 2713
2714 2714
2715 RUNTIME_FUNCTION(Runtime_FunctionIsArrow) { 2715 RUNTIME_FUNCTION(Runtime_FunctionIsArrow) {
2716 SealHandleScope shs(isolate); 2716 SealHandleScope shs(isolate);
2717 ASSERT(args.length() == 1); 2717 DCHECK(args.length() == 1);
2718 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2718 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2719 return isolate->heap()->ToBoolean(f->shared()->is_arrow()); 2719 return isolate->heap()->ToBoolean(f->shared()->is_arrow());
2720 } 2720 }
2721 2721
2722 2722
2723 RUNTIME_FUNCTION(Runtime_FunctionRemovePrototype) { 2723 RUNTIME_FUNCTION(Runtime_FunctionRemovePrototype) {
2724 SealHandleScope shs(isolate); 2724 SealHandleScope shs(isolate);
2725 ASSERT(args.length() == 1); 2725 DCHECK(args.length() == 1);
2726 2726
2727 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2727 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2728 RUNTIME_ASSERT(f->RemovePrototype()); 2728 RUNTIME_ASSERT(f->RemovePrototype());
2729 2729
2730 return isolate->heap()->undefined_value(); 2730 return isolate->heap()->undefined_value();
2731 } 2731 }
2732 2732
2733 2733
2734 RUNTIME_FUNCTION(Runtime_FunctionGetScript) { 2734 RUNTIME_FUNCTION(Runtime_FunctionGetScript) {
2735 HandleScope scope(isolate); 2735 HandleScope scope(isolate);
2736 ASSERT(args.length() == 1); 2736 DCHECK(args.length() == 1);
2737 2737
2738 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 2738 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
2739 Handle<Object> script = Handle<Object>(fun->shared()->script(), isolate); 2739 Handle<Object> script = Handle<Object>(fun->shared()->script(), isolate);
2740 if (!script->IsScript()) return isolate->heap()->undefined_value(); 2740 if (!script->IsScript()) return isolate->heap()->undefined_value();
2741 2741
2742 return *Script::GetWrapper(Handle<Script>::cast(script)); 2742 return *Script::GetWrapper(Handle<Script>::cast(script));
2743 } 2743 }
2744 2744
2745 2745
2746 RUNTIME_FUNCTION(Runtime_FunctionGetSourceCode) { 2746 RUNTIME_FUNCTION(Runtime_FunctionGetSourceCode) {
2747 HandleScope scope(isolate); 2747 HandleScope scope(isolate);
2748 ASSERT(args.length() == 1); 2748 DCHECK(args.length() == 1);
2749 2749
2750 CONVERT_ARG_HANDLE_CHECKED(JSFunction, f, 0); 2750 CONVERT_ARG_HANDLE_CHECKED(JSFunction, f, 0);
2751 Handle<SharedFunctionInfo> shared(f->shared()); 2751 Handle<SharedFunctionInfo> shared(f->shared());
2752 return *shared->GetSourceCode(); 2752 return *shared->GetSourceCode();
2753 } 2753 }
2754 2754
2755 2755
2756 RUNTIME_FUNCTION(Runtime_FunctionGetScriptSourcePosition) { 2756 RUNTIME_FUNCTION(Runtime_FunctionGetScriptSourcePosition) {
2757 SealHandleScope shs(isolate); 2757 SealHandleScope shs(isolate);
2758 ASSERT(args.length() == 1); 2758 DCHECK(args.length() == 1);
2759 2759
2760 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 2760 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
2761 int pos = fun->shared()->start_position(); 2761 int pos = fun->shared()->start_position();
2762 return Smi::FromInt(pos); 2762 return Smi::FromInt(pos);
2763 } 2763 }
2764 2764
2765 2765
2766 RUNTIME_FUNCTION(Runtime_FunctionGetPositionForOffset) { 2766 RUNTIME_FUNCTION(Runtime_FunctionGetPositionForOffset) {
2767 SealHandleScope shs(isolate); 2767 SealHandleScope shs(isolate);
2768 ASSERT(args.length() == 2); 2768 DCHECK(args.length() == 2);
2769 2769
2770 CONVERT_ARG_CHECKED(Code, code, 0); 2770 CONVERT_ARG_CHECKED(Code, code, 0);
2771 CONVERT_NUMBER_CHECKED(int, offset, Int32, args[1]); 2771 CONVERT_NUMBER_CHECKED(int, offset, Int32, args[1]);
2772 2772
2773 RUNTIME_ASSERT(0 <= offset && offset < code->Size()); 2773 RUNTIME_ASSERT(0 <= offset && offset < code->Size());
2774 2774
2775 Address pc = code->address() + offset; 2775 Address pc = code->address() + offset;
2776 return Smi::FromInt(code->SourcePosition(pc)); 2776 return Smi::FromInt(code->SourcePosition(pc));
2777 } 2777 }
2778 2778
2779 2779
2780 RUNTIME_FUNCTION(Runtime_FunctionSetInstanceClassName) { 2780 RUNTIME_FUNCTION(Runtime_FunctionSetInstanceClassName) {
2781 SealHandleScope shs(isolate); 2781 SealHandleScope shs(isolate);
2782 ASSERT(args.length() == 2); 2782 DCHECK(args.length() == 2);
2783 2783
2784 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 2784 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
2785 CONVERT_ARG_CHECKED(String, name, 1); 2785 CONVERT_ARG_CHECKED(String, name, 1);
2786 fun->SetInstanceClassName(name); 2786 fun->SetInstanceClassName(name);
2787 return isolate->heap()->undefined_value(); 2787 return isolate->heap()->undefined_value();
2788 } 2788 }
2789 2789
2790 2790
2791 RUNTIME_FUNCTION(Runtime_FunctionSetLength) { 2791 RUNTIME_FUNCTION(Runtime_FunctionSetLength) {
2792 SealHandleScope shs(isolate); 2792 SealHandleScope shs(isolate);
2793 ASSERT(args.length() == 2); 2793 DCHECK(args.length() == 2);
2794 2794
2795 CONVERT_ARG_CHECKED(JSFunction, fun, 0); 2795 CONVERT_ARG_CHECKED(JSFunction, fun, 0);
2796 CONVERT_SMI_ARG_CHECKED(length, 1); 2796 CONVERT_SMI_ARG_CHECKED(length, 1);
2797 RUNTIME_ASSERT((length & 0xC0000000) == 0xC0000000 || 2797 RUNTIME_ASSERT((length & 0xC0000000) == 0xC0000000 ||
2798 (length & 0xC0000000) == 0x0); 2798 (length & 0xC0000000) == 0x0);
2799 fun->shared()->set_length(length); 2799 fun->shared()->set_length(length);
2800 return isolate->heap()->undefined_value(); 2800 return isolate->heap()->undefined_value();
2801 } 2801 }
2802 2802
2803 2803
2804 RUNTIME_FUNCTION(Runtime_FunctionSetPrototype) { 2804 RUNTIME_FUNCTION(Runtime_FunctionSetPrototype) {
2805 HandleScope scope(isolate); 2805 HandleScope scope(isolate);
2806 ASSERT(args.length() == 2); 2806 DCHECK(args.length() == 2);
2807 2807
2808 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); 2808 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0);
2809 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); 2809 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1);
2810 RUNTIME_ASSERT(fun->should_have_prototype()); 2810 RUNTIME_ASSERT(fun->should_have_prototype());
2811 Accessors::FunctionSetPrototype(fun, value); 2811 Accessors::FunctionSetPrototype(fun, value);
2812 return args[0]; // return TOS 2812 return args[0]; // return TOS
2813 } 2813 }
2814 2814
2815 2815
2816 RUNTIME_FUNCTION(Runtime_FunctionIsAPIFunction) { 2816 RUNTIME_FUNCTION(Runtime_FunctionIsAPIFunction) {
2817 SealHandleScope shs(isolate); 2817 SealHandleScope shs(isolate);
2818 ASSERT(args.length() == 1); 2818 DCHECK(args.length() == 1);
2819 2819
2820 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2820 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2821 return isolate->heap()->ToBoolean(f->shared()->IsApiFunction()); 2821 return isolate->heap()->ToBoolean(f->shared()->IsApiFunction());
2822 } 2822 }
2823 2823
2824 2824
2825 RUNTIME_FUNCTION(Runtime_FunctionIsBuiltin) { 2825 RUNTIME_FUNCTION(Runtime_FunctionIsBuiltin) {
2826 SealHandleScope shs(isolate); 2826 SealHandleScope shs(isolate);
2827 ASSERT(args.length() == 1); 2827 DCHECK(args.length() == 1);
2828 2828
2829 CONVERT_ARG_CHECKED(JSFunction, f, 0); 2829 CONVERT_ARG_CHECKED(JSFunction, f, 0);
2830 return isolate->heap()->ToBoolean(f->IsBuiltin()); 2830 return isolate->heap()->ToBoolean(f->IsBuiltin());
2831 } 2831 }
2832 2832
2833 2833
2834 RUNTIME_FUNCTION(Runtime_SetCode) { 2834 RUNTIME_FUNCTION(Runtime_SetCode) {
2835 HandleScope scope(isolate); 2835 HandleScope scope(isolate);
2836 ASSERT(args.length() == 2); 2836 DCHECK(args.length() == 2);
2837 2837
2838 CONVERT_ARG_HANDLE_CHECKED(JSFunction, target, 0); 2838 CONVERT_ARG_HANDLE_CHECKED(JSFunction, target, 0);
2839 CONVERT_ARG_HANDLE_CHECKED(JSFunction, source, 1); 2839 CONVERT_ARG_HANDLE_CHECKED(JSFunction, source, 1);
2840 2840
2841 Handle<SharedFunctionInfo> target_shared(target->shared()); 2841 Handle<SharedFunctionInfo> target_shared(target->shared());
2842 Handle<SharedFunctionInfo> source_shared(source->shared()); 2842 Handle<SharedFunctionInfo> source_shared(source->shared());
2843 RUNTIME_ASSERT(!source_shared->bound()); 2843 RUNTIME_ASSERT(!source_shared->bound());
2844 2844
2845 if (!Compiler::EnsureCompiled(source, KEEP_EXCEPTION)) { 2845 if (!Compiler::EnsureCompiled(source, KEEP_EXCEPTION)) {
2846 return isolate->heap()->exception(); 2846 return isolate->heap()->exception();
2847 } 2847 }
2848 2848
2849 // Mark both, the source and the target, as un-flushable because the 2849 // Mark both, the source and the target, as un-flushable because the
2850 // shared unoptimized code makes them impossible to enqueue in a list. 2850 // shared unoptimized code makes them impossible to enqueue in a list.
2851 ASSERT(target_shared->code()->gc_metadata() == NULL); 2851 DCHECK(target_shared->code()->gc_metadata() == NULL);
2852 ASSERT(source_shared->code()->gc_metadata() == NULL); 2852 DCHECK(source_shared->code()->gc_metadata() == NULL);
2853 target_shared->set_dont_flush(true); 2853 target_shared->set_dont_flush(true);
2854 source_shared->set_dont_flush(true); 2854 source_shared->set_dont_flush(true);
2855 2855
2856 // Set the code, scope info, formal parameter count, and the length 2856 // Set the code, scope info, formal parameter count, and the length
2857 // of the target shared function info. 2857 // of the target shared function info.
2858 target_shared->ReplaceCode(source_shared->code()); 2858 target_shared->ReplaceCode(source_shared->code());
2859 target_shared->set_scope_info(source_shared->scope_info()); 2859 target_shared->set_scope_info(source_shared->scope_info());
2860 target_shared->set_length(source_shared->length()); 2860 target_shared->set_length(source_shared->length());
2861 target_shared->set_feedback_vector(source_shared->feedback_vector()); 2861 target_shared->set_feedback_vector(source_shared->feedback_vector());
2862 target_shared->set_formal_parameter_count( 2862 target_shared->set_formal_parameter_count(
2863 source_shared->formal_parameter_count()); 2863 source_shared->formal_parameter_count());
2864 target_shared->set_script(source_shared->script()); 2864 target_shared->set_script(source_shared->script());
2865 target_shared->set_start_position_and_type( 2865 target_shared->set_start_position_and_type(
2866 source_shared->start_position_and_type()); 2866 source_shared->start_position_and_type());
2867 target_shared->set_end_position(source_shared->end_position()); 2867 target_shared->set_end_position(source_shared->end_position());
2868 bool was_native = target_shared->native(); 2868 bool was_native = target_shared->native();
2869 target_shared->set_compiler_hints(source_shared->compiler_hints()); 2869 target_shared->set_compiler_hints(source_shared->compiler_hints());
2870 target_shared->set_native(was_native); 2870 target_shared->set_native(was_native);
2871 target_shared->set_profiler_ticks(source_shared->profiler_ticks()); 2871 target_shared->set_profiler_ticks(source_shared->profiler_ticks());
2872 2872
2873 // Set the code of the target function. 2873 // Set the code of the target function.
2874 target->ReplaceCode(source_shared->code()); 2874 target->ReplaceCode(source_shared->code());
2875 ASSERT(target->next_function_link()->IsUndefined()); 2875 DCHECK(target->next_function_link()->IsUndefined());
2876 2876
2877 // Make sure we get a fresh copy of the literal vector to avoid cross 2877 // Make sure we get a fresh copy of the literal vector to avoid cross
2878 // context contamination. 2878 // context contamination.
2879 Handle<Context> context(source->context()); 2879 Handle<Context> context(source->context());
2880 int number_of_literals = source->NumberOfLiterals(); 2880 int number_of_literals = source->NumberOfLiterals();
2881 Handle<FixedArray> literals = 2881 Handle<FixedArray> literals =
2882 isolate->factory()->NewFixedArray(number_of_literals, TENURED); 2882 isolate->factory()->NewFixedArray(number_of_literals, TENURED);
2883 if (number_of_literals > 0) { 2883 if (number_of_literals > 0) {
2884 literals->set(JSFunction::kLiteralNativeContextIndex, 2884 literals->set(JSFunction::kLiteralNativeContextIndex,
2885 context->native_context()); 2885 context->native_context());
2886 } 2886 }
2887 target->set_context(*context); 2887 target->set_context(*context);
2888 target->set_literals(*literals); 2888 target->set_literals(*literals);
2889 2889
2890 if (isolate->logger()->is_logging_code_events() || 2890 if (isolate->logger()->is_logging_code_events() ||
2891 isolate->cpu_profiler()->is_profiling()) { 2891 isolate->cpu_profiler()->is_profiling()) {
2892 isolate->logger()->LogExistingFunction( 2892 isolate->logger()->LogExistingFunction(
2893 source_shared, Handle<Code>(source_shared->code())); 2893 source_shared, Handle<Code>(source_shared->code()));
2894 } 2894 }
2895 2895
2896 return *target; 2896 return *target;
2897 } 2897 }
2898 2898
2899 2899
2900 RUNTIME_FUNCTION(Runtime_CreateJSGeneratorObject) { 2900 RUNTIME_FUNCTION(Runtime_CreateJSGeneratorObject) {
2901 HandleScope scope(isolate); 2901 HandleScope scope(isolate);
2902 ASSERT(args.length() == 0); 2902 DCHECK(args.length() == 0);
2903 2903
2904 JavaScriptFrameIterator it(isolate); 2904 JavaScriptFrameIterator it(isolate);
2905 JavaScriptFrame* frame = it.frame(); 2905 JavaScriptFrame* frame = it.frame();
2906 Handle<JSFunction> function(frame->function()); 2906 Handle<JSFunction> function(frame->function());
2907 RUNTIME_ASSERT(function->shared()->is_generator()); 2907 RUNTIME_ASSERT(function->shared()->is_generator());
2908 2908
2909 Handle<JSGeneratorObject> generator; 2909 Handle<JSGeneratorObject> generator;
2910 if (frame->IsConstructor()) { 2910 if (frame->IsConstructor()) {
2911 generator = handle(JSGeneratorObject::cast(frame->receiver())); 2911 generator = handle(JSGeneratorObject::cast(frame->receiver()));
2912 } else { 2912 } else {
2913 generator = isolate->factory()->NewJSGeneratorObject(function); 2913 generator = isolate->factory()->NewJSGeneratorObject(function);
2914 } 2914 }
2915 generator->set_function(*function); 2915 generator->set_function(*function);
2916 generator->set_context(Context::cast(frame->context())); 2916 generator->set_context(Context::cast(frame->context()));
2917 generator->set_receiver(frame->receiver()); 2917 generator->set_receiver(frame->receiver());
2918 generator->set_continuation(0); 2918 generator->set_continuation(0);
2919 generator->set_operand_stack(isolate->heap()->empty_fixed_array()); 2919 generator->set_operand_stack(isolate->heap()->empty_fixed_array());
2920 generator->set_stack_handler_index(-1); 2920 generator->set_stack_handler_index(-1);
2921 2921
2922 return *generator; 2922 return *generator;
2923 } 2923 }
2924 2924
2925 2925
2926 RUNTIME_FUNCTION(Runtime_SuspendJSGeneratorObject) { 2926 RUNTIME_FUNCTION(Runtime_SuspendJSGeneratorObject) {
2927 HandleScope handle_scope(isolate); 2927 HandleScope handle_scope(isolate);
2928 ASSERT(args.length() == 1); 2928 DCHECK(args.length() == 1);
2929 CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator_object, 0); 2929 CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator_object, 0);
2930 2930
2931 JavaScriptFrameIterator stack_iterator(isolate); 2931 JavaScriptFrameIterator stack_iterator(isolate);
2932 JavaScriptFrame* frame = stack_iterator.frame(); 2932 JavaScriptFrame* frame = stack_iterator.frame();
2933 RUNTIME_ASSERT(frame->function()->shared()->is_generator()); 2933 RUNTIME_ASSERT(frame->function()->shared()->is_generator());
2934 ASSERT_EQ(frame->function(), generator_object->function()); 2934 DCHECK_EQ(frame->function(), generator_object->function());
2935 2935
2936 // The caller should have saved the context and continuation already. 2936 // The caller should have saved the context and continuation already.
2937 ASSERT_EQ(generator_object->context(), Context::cast(frame->context())); 2937 DCHECK_EQ(generator_object->context(), Context::cast(frame->context()));
2938 ASSERT_LT(0, generator_object->continuation()); 2938 DCHECK_LT(0, generator_object->continuation());
2939 2939
2940 // We expect there to be at least two values on the operand stack: the return 2940 // We expect there to be at least two values on the operand stack: the return
2941 // value of the yield expression, and the argument to this runtime call. 2941 // value of the yield expression, and the argument to this runtime call.
2942 // Neither of those should be saved. 2942 // Neither of those should be saved.
2943 int operands_count = frame->ComputeOperandsCount(); 2943 int operands_count = frame->ComputeOperandsCount();
2944 ASSERT_GE(operands_count, 2); 2944 DCHECK_GE(operands_count, 2);
2945 operands_count -= 2; 2945 operands_count -= 2;
2946 2946
2947 if (operands_count == 0) { 2947 if (operands_count == 0) {
2948 // Although it's semantically harmless to call this function with an 2948 // Although it's semantically harmless to call this function with an
2949 // operands_count of zero, it is also unnecessary. 2949 // operands_count of zero, it is also unnecessary.
2950 ASSERT_EQ(generator_object->operand_stack(), 2950 DCHECK_EQ(generator_object->operand_stack(),
2951 isolate->heap()->empty_fixed_array()); 2951 isolate->heap()->empty_fixed_array());
2952 ASSERT_EQ(generator_object->stack_handler_index(), -1); 2952 DCHECK_EQ(generator_object->stack_handler_index(), -1);
2953 // If there are no operands on the stack, there shouldn't be a handler 2953 // If there are no operands on the stack, there shouldn't be a handler
2954 // active either. 2954 // active either.
2955 ASSERT(!frame->HasHandler()); 2955 DCHECK(!frame->HasHandler());
2956 } else { 2956 } else {
2957 int stack_handler_index = -1; 2957 int stack_handler_index = -1;
2958 Handle<FixedArray> operand_stack = 2958 Handle<FixedArray> operand_stack =
2959 isolate->factory()->NewFixedArray(operands_count); 2959 isolate->factory()->NewFixedArray(operands_count);
2960 frame->SaveOperandStack(*operand_stack, &stack_handler_index); 2960 frame->SaveOperandStack(*operand_stack, &stack_handler_index);
2961 generator_object->set_operand_stack(*operand_stack); 2961 generator_object->set_operand_stack(*operand_stack);
2962 generator_object->set_stack_handler_index(stack_handler_index); 2962 generator_object->set_stack_handler_index(stack_handler_index);
2963 } 2963 }
2964 2964
2965 return isolate->heap()->undefined_value(); 2965 return isolate->heap()->undefined_value();
2966 } 2966 }
2967 2967
2968 2968
2969 // Note that this function is the slow path for resuming generators. It is only 2969 // Note that this function is the slow path for resuming generators. It is only
2970 // called if the suspended activation had operands on the stack, stack handlers 2970 // called if the suspended activation had operands on the stack, stack handlers
2971 // needing rewinding, or if the resume should throw an exception. The fast path 2971 // needing rewinding, or if the resume should throw an exception. The fast path
2972 // is handled directly in FullCodeGenerator::EmitGeneratorResume(), which is 2972 // is handled directly in FullCodeGenerator::EmitGeneratorResume(), which is
2973 // inlined into GeneratorNext and GeneratorThrow. EmitGeneratorResumeResume is 2973 // inlined into GeneratorNext and GeneratorThrow. EmitGeneratorResumeResume is
2974 // called in any case, as it needs to reconstruct the stack frame and make space 2974 // called in any case, as it needs to reconstruct the stack frame and make space
2975 // for arguments and operands. 2975 // for arguments and operands.
2976 RUNTIME_FUNCTION(Runtime_ResumeJSGeneratorObject) { 2976 RUNTIME_FUNCTION(Runtime_ResumeJSGeneratorObject) {
2977 SealHandleScope shs(isolate); 2977 SealHandleScope shs(isolate);
2978 ASSERT(args.length() == 3); 2978 DCHECK(args.length() == 3);
2979 CONVERT_ARG_CHECKED(JSGeneratorObject, generator_object, 0); 2979 CONVERT_ARG_CHECKED(JSGeneratorObject, generator_object, 0);
2980 CONVERT_ARG_CHECKED(Object, value, 1); 2980 CONVERT_ARG_CHECKED(Object, value, 1);
2981 CONVERT_SMI_ARG_CHECKED(resume_mode_int, 2); 2981 CONVERT_SMI_ARG_CHECKED(resume_mode_int, 2);
2982 JavaScriptFrameIterator stack_iterator(isolate); 2982 JavaScriptFrameIterator stack_iterator(isolate);
2983 JavaScriptFrame* frame = stack_iterator.frame(); 2983 JavaScriptFrame* frame = stack_iterator.frame();
2984 2984
2985 ASSERT_EQ(frame->function(), generator_object->function()); 2985 DCHECK_EQ(frame->function(), generator_object->function());
2986 ASSERT(frame->function()->is_compiled()); 2986 DCHECK(frame->function()->is_compiled());
2987 2987
2988 STATIC_ASSERT(JSGeneratorObject::kGeneratorExecuting < 0); 2988 STATIC_ASSERT(JSGeneratorObject::kGeneratorExecuting < 0);
2989 STATIC_ASSERT(JSGeneratorObject::kGeneratorClosed == 0); 2989 STATIC_ASSERT(JSGeneratorObject::kGeneratorClosed == 0);
2990 2990
2991 Address pc = generator_object->function()->code()->instruction_start(); 2991 Address pc = generator_object->function()->code()->instruction_start();
2992 int offset = generator_object->continuation(); 2992 int offset = generator_object->continuation();
2993 ASSERT(offset > 0); 2993 DCHECK(offset > 0);
2994 frame->set_pc(pc + offset); 2994 frame->set_pc(pc + offset);
2995 if (FLAG_enable_ool_constant_pool) { 2995 if (FLAG_enable_ool_constant_pool) {
2996 frame->set_constant_pool( 2996 frame->set_constant_pool(
2997 generator_object->function()->code()->constant_pool()); 2997 generator_object->function()->code()->constant_pool());
2998 } 2998 }
2999 generator_object->set_continuation(JSGeneratorObject::kGeneratorExecuting); 2999 generator_object->set_continuation(JSGeneratorObject::kGeneratorExecuting);
3000 3000
3001 FixedArray* operand_stack = generator_object->operand_stack(); 3001 FixedArray* operand_stack = generator_object->operand_stack();
3002 int operands_count = operand_stack->length(); 3002 int operands_count = operand_stack->length();
3003 if (operands_count != 0) { 3003 if (operands_count != 0) {
(...skipping 12 matching lines...) Expand all
3016 return isolate->Throw(value); 3016 return isolate->Throw(value);
3017 } 3017 }
3018 3018
3019 UNREACHABLE(); 3019 UNREACHABLE();
3020 return isolate->ThrowIllegalOperation(); 3020 return isolate->ThrowIllegalOperation();
3021 } 3021 }
3022 3022
3023 3023
3024 RUNTIME_FUNCTION(Runtime_ThrowGeneratorStateError) { 3024 RUNTIME_FUNCTION(Runtime_ThrowGeneratorStateError) {
3025 HandleScope scope(isolate); 3025 HandleScope scope(isolate);
3026 ASSERT(args.length() == 1); 3026 DCHECK(args.length() == 1);
3027 CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0); 3027 CONVERT_ARG_HANDLE_CHECKED(JSGeneratorObject, generator, 0);
3028 int continuation = generator->continuation(); 3028 int continuation = generator->continuation();
3029 const char* message = continuation == JSGeneratorObject::kGeneratorClosed ? 3029 const char* message = continuation == JSGeneratorObject::kGeneratorClosed ?
3030 "generator_finished" : "generator_running"; 3030 "generator_finished" : "generator_running";
3031 Vector< Handle<Object> > argv = HandleVector<Object>(NULL, 0); 3031 Vector< Handle<Object> > argv = HandleVector<Object>(NULL, 0);
3032 Handle<Object> error = isolate->factory()->NewError(message, argv); 3032 Handle<Object> error = isolate->factory()->NewError(message, argv);
3033 return isolate->Throw(*error); 3033 return isolate->Throw(*error);
3034 } 3034 }
3035 3035
3036 3036
3037 RUNTIME_FUNCTION(Runtime_ObjectFreeze) { 3037 RUNTIME_FUNCTION(Runtime_ObjectFreeze) {
3038 HandleScope scope(isolate); 3038 HandleScope scope(isolate);
3039 ASSERT(args.length() == 1); 3039 DCHECK(args.length() == 1);
3040 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 3040 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
3041 3041
3042 // %ObjectFreeze is a fast path and these cases are handled elsewhere. 3042 // %ObjectFreeze is a fast path and these cases are handled elsewhere.
3043 RUNTIME_ASSERT(!object->HasSloppyArgumentsElements() && 3043 RUNTIME_ASSERT(!object->HasSloppyArgumentsElements() &&
3044 !object->map()->is_observed() && 3044 !object->map()->is_observed() &&
3045 !object->IsJSProxy()); 3045 !object->IsJSProxy());
3046 3046
3047 Handle<Object> result; 3047 Handle<Object> result;
3048 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, JSObject::Freeze(object)); 3048 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, JSObject::Freeze(object));
3049 return *result; 3049 return *result;
3050 } 3050 }
3051 3051
3052 3052
3053 RUNTIME_FUNCTION(Runtime_StringCharCodeAtRT) { 3053 RUNTIME_FUNCTION(Runtime_StringCharCodeAtRT) {
3054 HandleScope handle_scope(isolate); 3054 HandleScope handle_scope(isolate);
3055 ASSERT(args.length() == 2); 3055 DCHECK(args.length() == 2);
3056 3056
3057 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 3057 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
3058 CONVERT_NUMBER_CHECKED(uint32_t, i, Uint32, args[1]); 3058 CONVERT_NUMBER_CHECKED(uint32_t, i, Uint32, args[1]);
3059 3059
3060 // Flatten the string. If someone wants to get a char at an index 3060 // Flatten the string. If someone wants to get a char at an index
3061 // in a cons string, it is likely that more indices will be 3061 // in a cons string, it is likely that more indices will be
3062 // accessed. 3062 // accessed.
3063 subject = String::Flatten(subject); 3063 subject = String::Flatten(subject);
3064 3064
3065 if (i >= static_cast<uint32_t>(subject->length())) { 3065 if (i >= static_cast<uint32_t>(subject->length())) {
3066 return isolate->heap()->nan_value(); 3066 return isolate->heap()->nan_value();
3067 } 3067 }
3068 3068
3069 return Smi::FromInt(subject->Get(i)); 3069 return Smi::FromInt(subject->Get(i));
3070 } 3070 }
3071 3071
3072 3072
3073 RUNTIME_FUNCTION(Runtime_CharFromCode) { 3073 RUNTIME_FUNCTION(Runtime_CharFromCode) {
3074 HandleScope handlescope(isolate); 3074 HandleScope handlescope(isolate);
3075 ASSERT(args.length() == 1); 3075 DCHECK(args.length() == 1);
3076 if (args[0]->IsNumber()) { 3076 if (args[0]->IsNumber()) {
3077 CONVERT_NUMBER_CHECKED(uint32_t, code, Uint32, args[0]); 3077 CONVERT_NUMBER_CHECKED(uint32_t, code, Uint32, args[0]);
3078 code &= 0xffff; 3078 code &= 0xffff;
3079 return *isolate->factory()->LookupSingleCharacterStringFromCode(code); 3079 return *isolate->factory()->LookupSingleCharacterStringFromCode(code);
3080 } 3080 }
3081 return isolate->heap()->empty_string(); 3081 return isolate->heap()->empty_string();
3082 } 3082 }
3083 3083
3084 3084
3085 class FixedArrayBuilder { 3085 class FixedArrayBuilder {
3086 public: 3086 public:
3087 explicit FixedArrayBuilder(Isolate* isolate, int initial_capacity) 3087 explicit FixedArrayBuilder(Isolate* isolate, int initial_capacity)
3088 : array_(isolate->factory()->NewFixedArrayWithHoles(initial_capacity)), 3088 : array_(isolate->factory()->NewFixedArrayWithHoles(initial_capacity)),
3089 length_(0), 3089 length_(0),
3090 has_non_smi_elements_(false) { 3090 has_non_smi_elements_(false) {
3091 // Require a non-zero initial size. Ensures that doubling the size to 3091 // Require a non-zero initial size. Ensures that doubling the size to
3092 // extend the array will work. 3092 // extend the array will work.
3093 ASSERT(initial_capacity > 0); 3093 DCHECK(initial_capacity > 0);
3094 } 3094 }
3095 3095
3096 explicit FixedArrayBuilder(Handle<FixedArray> backing_store) 3096 explicit FixedArrayBuilder(Handle<FixedArray> backing_store)
3097 : array_(backing_store), 3097 : array_(backing_store),
3098 length_(0), 3098 length_(0),
3099 has_non_smi_elements_(false) { 3099 has_non_smi_elements_(false) {
3100 // Require a non-zero initial size. Ensures that doubling the size to 3100 // Require a non-zero initial size. Ensures that doubling the size to
3101 // extend the array will work. 3101 // extend the array will work.
3102 ASSERT(backing_store->length() > 0); 3102 DCHECK(backing_store->length() > 0);
3103 } 3103 }
3104 3104
3105 bool HasCapacity(int elements) { 3105 bool HasCapacity(int elements) {
3106 int length = array_->length(); 3106 int length = array_->length();
3107 int required_length = length_ + elements; 3107 int required_length = length_ + elements;
3108 return (length >= required_length); 3108 return (length >= required_length);
3109 } 3109 }
3110 3110
3111 void EnsureCapacity(int elements) { 3111 void EnsureCapacity(int elements) {
3112 int length = array_->length(); 3112 int length = array_->length();
3113 int required_length = length_ + elements; 3113 int required_length = length_ + elements;
3114 if (length < required_length) { 3114 if (length < required_length) {
3115 int new_length = length; 3115 int new_length = length;
3116 do { 3116 do {
3117 new_length *= 2; 3117 new_length *= 2;
3118 } while (new_length < required_length); 3118 } while (new_length < required_length);
3119 Handle<FixedArray> extended_array = 3119 Handle<FixedArray> extended_array =
3120 array_->GetIsolate()->factory()->NewFixedArrayWithHoles(new_length); 3120 array_->GetIsolate()->factory()->NewFixedArrayWithHoles(new_length);
3121 array_->CopyTo(0, *extended_array, 0, length_); 3121 array_->CopyTo(0, *extended_array, 0, length_);
3122 array_ = extended_array; 3122 array_ = extended_array;
3123 } 3123 }
3124 } 3124 }
3125 3125
3126 void Add(Object* value) { 3126 void Add(Object* value) {
3127 ASSERT(!value->IsSmi()); 3127 DCHECK(!value->IsSmi());
3128 ASSERT(length_ < capacity()); 3128 DCHECK(length_ < capacity());
3129 array_->set(length_, value); 3129 array_->set(length_, value);
3130 length_++; 3130 length_++;
3131 has_non_smi_elements_ = true; 3131 has_non_smi_elements_ = true;
3132 } 3132 }
3133 3133
3134 void Add(Smi* value) { 3134 void Add(Smi* value) {
3135 ASSERT(value->IsSmi()); 3135 DCHECK(value->IsSmi());
3136 ASSERT(length_ < capacity()); 3136 DCHECK(length_ < capacity());
3137 array_->set(length_, value); 3137 array_->set(length_, value);
3138 length_++; 3138 length_++;
3139 } 3139 }
3140 3140
3141 Handle<FixedArray> array() { 3141 Handle<FixedArray> array() {
3142 return array_; 3142 return array_;
3143 } 3143 }
3144 3144
3145 int length() { 3145 int length() {
3146 return length_; 3146 return length_;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3187 ReplacementStringBuilder(Heap* heap, 3187 ReplacementStringBuilder(Heap* heap,
3188 Handle<String> subject, 3188 Handle<String> subject,
3189 int estimated_part_count) 3189 int estimated_part_count)
3190 : heap_(heap), 3190 : heap_(heap),
3191 array_builder_(heap->isolate(), estimated_part_count), 3191 array_builder_(heap->isolate(), estimated_part_count),
3192 subject_(subject), 3192 subject_(subject),
3193 character_count_(0), 3193 character_count_(0),
3194 is_ascii_(subject->IsOneByteRepresentation()) { 3194 is_ascii_(subject->IsOneByteRepresentation()) {
3195 // Require a non-zero initial size. Ensures that doubling the size to 3195 // Require a non-zero initial size. Ensures that doubling the size to
3196 // extend the array will work. 3196 // extend the array will work.
3197 ASSERT(estimated_part_count > 0); 3197 DCHECK(estimated_part_count > 0);
3198 } 3198 }
3199 3199
3200 static inline void AddSubjectSlice(FixedArrayBuilder* builder, 3200 static inline void AddSubjectSlice(FixedArrayBuilder* builder,
3201 int from, 3201 int from,
3202 int to) { 3202 int to) {
3203 ASSERT(from >= 0); 3203 DCHECK(from >= 0);
3204 int length = to - from; 3204 int length = to - from;
3205 ASSERT(length > 0); 3205 DCHECK(length > 0);
3206 if (StringBuilderSubstringLength::is_valid(length) && 3206 if (StringBuilderSubstringLength::is_valid(length) &&
3207 StringBuilderSubstringPosition::is_valid(from)) { 3207 StringBuilderSubstringPosition::is_valid(from)) {
3208 int encoded_slice = StringBuilderSubstringLength::encode(length) | 3208 int encoded_slice = StringBuilderSubstringLength::encode(length) |
3209 StringBuilderSubstringPosition::encode(from); 3209 StringBuilderSubstringPosition::encode(from);
3210 builder->Add(Smi::FromInt(encoded_slice)); 3210 builder->Add(Smi::FromInt(encoded_slice));
3211 } else { 3211 } else {
3212 // Otherwise encode as two smis. 3212 // Otherwise encode as two smis.
3213 builder->Add(Smi::FromInt(-length)); 3213 builder->Add(Smi::FromInt(-length));
3214 builder->Add(Smi::FromInt(from)); 3214 builder->Add(Smi::FromInt(from));
3215 } 3215 }
3216 } 3216 }
3217 3217
3218 3218
3219 void EnsureCapacity(int elements) { 3219 void EnsureCapacity(int elements) {
3220 array_builder_.EnsureCapacity(elements); 3220 array_builder_.EnsureCapacity(elements);
3221 } 3221 }
3222 3222
3223 3223
3224 void AddSubjectSlice(int from, int to) { 3224 void AddSubjectSlice(int from, int to) {
3225 AddSubjectSlice(&array_builder_, from, to); 3225 AddSubjectSlice(&array_builder_, from, to);
3226 IncrementCharacterCount(to - from); 3226 IncrementCharacterCount(to - from);
3227 } 3227 }
3228 3228
3229 3229
3230 void AddString(Handle<String> string) { 3230 void AddString(Handle<String> string) {
3231 int length = string->length(); 3231 int length = string->length();
3232 ASSERT(length > 0); 3232 DCHECK(length > 0);
3233 AddElement(*string); 3233 AddElement(*string);
3234 if (!string->IsOneByteRepresentation()) { 3234 if (!string->IsOneByteRepresentation()) {
3235 is_ascii_ = false; 3235 is_ascii_ = false;
3236 } 3236 }
3237 IncrementCharacterCount(length); 3237 IncrementCharacterCount(length);
3238 } 3238 }
3239 3239
3240 3240
3241 MaybeHandle<String> ToString() { 3241 MaybeHandle<String> ToString() {
3242 Isolate* isolate = heap_->isolate(); 3242 Isolate* isolate = heap_->isolate();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
3283 if (character_count_ > String::kMaxLength - by) { 3283 if (character_count_ > String::kMaxLength - by) {
3284 STATIC_ASSERT(String::kMaxLength < kMaxInt); 3284 STATIC_ASSERT(String::kMaxLength < kMaxInt);
3285 character_count_ = kMaxInt; 3285 character_count_ = kMaxInt;
3286 } else { 3286 } else {
3287 character_count_ += by; 3287 character_count_ += by;
3288 } 3288 }
3289 } 3289 }
3290 3290
3291 private: 3291 private:
3292 void AddElement(Object* element) { 3292 void AddElement(Object* element) {
3293 ASSERT(element->IsSmi() || element->IsString()); 3293 DCHECK(element->IsSmi() || element->IsString());
3294 ASSERT(array_builder_.capacity() > array_builder_.length()); 3294 DCHECK(array_builder_.capacity() > array_builder_.length());
3295 array_builder_.Add(element); 3295 array_builder_.Add(element);
3296 } 3296 }
3297 3297
3298 Heap* heap_; 3298 Heap* heap_;
3299 FixedArrayBuilder array_builder_; 3299 FixedArrayBuilder array_builder_;
3300 Handle<String> subject_; 3300 Handle<String> subject_;
3301 int character_count_; 3301 int character_count_;
3302 bool is_ascii_; 3302 bool is_ascii_;
3303 }; 3303 };
3304 3304
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
3347 static inline ReplacementPart SubjectPrefix() { 3347 static inline ReplacementPart SubjectPrefix() {
3348 return ReplacementPart(SUBJECT_PREFIX, 0); 3348 return ReplacementPart(SUBJECT_PREFIX, 0);
3349 } 3349 }
3350 static inline ReplacementPart SubjectSuffix(int subject_length) { 3350 static inline ReplacementPart SubjectSuffix(int subject_length) {
3351 return ReplacementPart(SUBJECT_SUFFIX, subject_length); 3351 return ReplacementPart(SUBJECT_SUFFIX, subject_length);
3352 } 3352 }
3353 static inline ReplacementPart ReplacementString() { 3353 static inline ReplacementPart ReplacementString() {
3354 return ReplacementPart(REPLACEMENT_STRING, 0); 3354 return ReplacementPart(REPLACEMENT_STRING, 0);
3355 } 3355 }
3356 static inline ReplacementPart ReplacementSubString(int from, int to) { 3356 static inline ReplacementPart ReplacementSubString(int from, int to) {
3357 ASSERT(from >= 0); 3357 DCHECK(from >= 0);
3358 ASSERT(to > from); 3358 DCHECK(to > from);
3359 return ReplacementPart(-from, to); 3359 return ReplacementPart(-from, to);
3360 } 3360 }
3361 3361
3362 // If tag <= 0 then it is the negation of a start index of a substring of 3362 // If tag <= 0 then it is the negation of a start index of a substring of
3363 // the replacement pattern, otherwise it's a value from PartType. 3363 // the replacement pattern, otherwise it's a value from PartType.
3364 ReplacementPart(int tag, int data) 3364 ReplacementPart(int tag, int data)
3365 : tag(tag), data(data) { 3365 : tag(tag), data(data) {
3366 // Must be non-positive or a PartType value. 3366 // Must be non-positive or a PartType value.
3367 ASSERT(tag < NUMBER_OF_PART_TYPES); 3367 DCHECK(tag < NUMBER_OF_PART_TYPES);
3368 } 3368 }
3369 // Either a value of PartType or a non-positive number that is 3369 // Either a value of PartType or a non-positive number that is
3370 // the negation of an index into the replacement string. 3370 // the negation of an index into the replacement string.
3371 int tag; 3371 int tag;
3372 // The data value's interpretation depends on the value of tag: 3372 // The data value's interpretation depends on the value of tag:
3373 // tag == SUBJECT_PREFIX || 3373 // tag == SUBJECT_PREFIX ||
3374 // tag == SUBJECT_SUFFIX: data is unused. 3374 // tag == SUBJECT_SUFFIX: data is unused.
3375 // tag == SUBJECT_CAPTURE: data is the number of the capture. 3375 // tag == SUBJECT_CAPTURE: data is the number of the capture.
3376 // tag == REPLACEMENT_SUBSTRING || 3376 // tag == REPLACEMENT_SUBSTRING ||
3377 // tag == REPLACEMENT_STRING: data is index into array of substrings 3377 // tag == REPLACEMENT_STRING: data is index into array of substrings
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
3460 if (double_digit_ref <= capture_count) { 3460 if (double_digit_ref <= capture_count) {
3461 next_index = second_digit_index; 3461 next_index = second_digit_index;
3462 capture_ref = double_digit_ref; 3462 capture_ref = double_digit_ref;
3463 } 3463 }
3464 } 3464 }
3465 } 3465 }
3466 if (capture_ref > 0) { 3466 if (capture_ref > 0) {
3467 if (i > last) { 3467 if (i > last) {
3468 parts->Add(ReplacementPart::ReplacementSubString(last, i), zone); 3468 parts->Add(ReplacementPart::ReplacementSubString(last, i), zone);
3469 } 3469 }
3470 ASSERT(capture_ref <= capture_count); 3470 DCHECK(capture_ref <= capture_count);
3471 parts->Add(ReplacementPart::SubjectCapture(capture_ref), zone); 3471 parts->Add(ReplacementPart::SubjectCapture(capture_ref), zone);
3472 last = next_index + 1; 3472 last = next_index + 1;
3473 } 3473 }
3474 i = next_index; 3474 i = next_index;
3475 break; 3475 break;
3476 } 3476 }
3477 default: 3477 default:
3478 i = next_index; 3478 i = next_index;
3479 break; 3479 break;
3480 } 3480 }
(...skipping 15 matching lines...) Expand all
3496 Zone* zone_; 3496 Zone* zone_;
3497 }; 3497 };
3498 3498
3499 3499
3500 bool CompiledReplacement::Compile(Handle<String> replacement, 3500 bool CompiledReplacement::Compile(Handle<String> replacement,
3501 int capture_count, 3501 int capture_count,
3502 int subject_length) { 3502 int subject_length) {
3503 { 3503 {
3504 DisallowHeapAllocation no_gc; 3504 DisallowHeapAllocation no_gc;
3505 String::FlatContent content = replacement->GetFlatContent(); 3505 String::FlatContent content = replacement->GetFlatContent();
3506 ASSERT(content.IsFlat()); 3506 DCHECK(content.IsFlat());
3507 bool simple = false; 3507 bool simple = false;
3508 if (content.IsAscii()) { 3508 if (content.IsAscii()) {
3509 simple = ParseReplacementPattern(&parts_, 3509 simple = ParseReplacementPattern(&parts_,
3510 content.ToOneByteVector(), 3510 content.ToOneByteVector(),
3511 capture_count, 3511 capture_count,
3512 subject_length, 3512 subject_length,
3513 zone()); 3513 zone());
3514 } else { 3514 } else {
3515 ASSERT(content.IsTwoByte()); 3515 DCHECK(content.IsTwoByte());
3516 simple = ParseReplacementPattern(&parts_, 3516 simple = ParseReplacementPattern(&parts_,
3517 content.ToUC16Vector(), 3517 content.ToUC16Vector(),
3518 capture_count, 3518 capture_count,
3519 subject_length, 3519 subject_length,
3520 zone()); 3520 zone());
3521 } 3521 }
3522 if (simple) return true; 3522 if (simple) return true;
3523 } 3523 }
3524 3524
3525 Isolate* isolate = replacement->GetIsolate(); 3525 Isolate* isolate = replacement->GetIsolate();
(...skipping 16 matching lines...) Expand all
3542 } 3542 }
3543 } 3543 }
3544 return false; 3544 return false;
3545 } 3545 }
3546 3546
3547 3547
3548 void CompiledReplacement::Apply(ReplacementStringBuilder* builder, 3548 void CompiledReplacement::Apply(ReplacementStringBuilder* builder,
3549 int match_from, 3549 int match_from,
3550 int match_to, 3550 int match_to,
3551 int32_t* match) { 3551 int32_t* match) {
3552 ASSERT_LT(0, parts_.length()); 3552 DCHECK_LT(0, parts_.length());
3553 for (int i = 0, n = parts_.length(); i < n; i++) { 3553 for (int i = 0, n = parts_.length(); i < n; i++) {
3554 ReplacementPart part = parts_[i]; 3554 ReplacementPart part = parts_[i];
3555 switch (part.tag) { 3555 switch (part.tag) {
3556 case SUBJECT_PREFIX: 3556 case SUBJECT_PREFIX:
3557 if (match_from > 0) builder->AddSubjectSlice(0, match_from); 3557 if (match_from > 0) builder->AddSubjectSlice(0, match_from);
3558 break; 3558 break;
3559 case SUBJECT_SUFFIX: { 3559 case SUBJECT_SUFFIX: {
3560 int subject_length = part.data; 3560 int subject_length = part.data;
3561 if (match_to < subject_length) { 3561 if (match_to < subject_length) {
3562 builder->AddSubjectSlice(match_to, subject_length); 3562 builder->AddSubjectSlice(match_to, subject_length);
(...skipping 18 matching lines...) Expand all
3581 } 3581 }
3582 } 3582 }
3583 } 3583 }
3584 3584
3585 3585
3586 void FindAsciiStringIndices(Vector<const uint8_t> subject, 3586 void FindAsciiStringIndices(Vector<const uint8_t> subject,
3587 char pattern, 3587 char pattern,
3588 ZoneList<int>* indices, 3588 ZoneList<int>* indices,
3589 unsigned int limit, 3589 unsigned int limit,
3590 Zone* zone) { 3590 Zone* zone) {
3591 ASSERT(limit > 0); 3591 DCHECK(limit > 0);
3592 // Collect indices of pattern in subject using memchr. 3592 // Collect indices of pattern in subject using memchr.
3593 // Stop after finding at most limit values. 3593 // Stop after finding at most limit values.
3594 const uint8_t* subject_start = subject.start(); 3594 const uint8_t* subject_start = subject.start();
3595 const uint8_t* subject_end = subject_start + subject.length(); 3595 const uint8_t* subject_end = subject_start + subject.length();
3596 const uint8_t* pos = subject_start; 3596 const uint8_t* pos = subject_start;
3597 while (limit > 0) { 3597 while (limit > 0) {
3598 pos = reinterpret_cast<const uint8_t*>( 3598 pos = reinterpret_cast<const uint8_t*>(
3599 memchr(pos, pattern, subject_end - pos)); 3599 memchr(pos, pattern, subject_end - pos));
3600 if (pos == NULL) return; 3600 if (pos == NULL) return;
3601 indices->Add(static_cast<int>(pos - subject_start), zone); 3601 indices->Add(static_cast<int>(pos - subject_start), zone);
3602 pos++; 3602 pos++;
3603 limit--; 3603 limit--;
3604 } 3604 }
3605 } 3605 }
3606 3606
3607 3607
3608 void FindTwoByteStringIndices(const Vector<const uc16> subject, 3608 void FindTwoByteStringIndices(const Vector<const uc16> subject,
3609 uc16 pattern, 3609 uc16 pattern,
3610 ZoneList<int>* indices, 3610 ZoneList<int>* indices,
3611 unsigned int limit, 3611 unsigned int limit,
3612 Zone* zone) { 3612 Zone* zone) {
3613 ASSERT(limit > 0); 3613 DCHECK(limit > 0);
3614 const uc16* subject_start = subject.start(); 3614 const uc16* subject_start = subject.start();
3615 const uc16* subject_end = subject_start + subject.length(); 3615 const uc16* subject_end = subject_start + subject.length();
3616 for (const uc16* pos = subject_start; pos < subject_end && limit > 0; pos++) { 3616 for (const uc16* pos = subject_start; pos < subject_end && limit > 0; pos++) {
3617 if (*pos == pattern) { 3617 if (*pos == pattern) {
3618 indices->Add(static_cast<int>(pos - subject_start), zone); 3618 indices->Add(static_cast<int>(pos - subject_start), zone);
3619 limit--; 3619 limit--;
3620 } 3620 }
3621 } 3621 }
3622 } 3622 }
3623 3623
3624 3624
3625 template <typename SubjectChar, typename PatternChar> 3625 template <typename SubjectChar, typename PatternChar>
3626 void FindStringIndices(Isolate* isolate, 3626 void FindStringIndices(Isolate* isolate,
3627 Vector<const SubjectChar> subject, 3627 Vector<const SubjectChar> subject,
3628 Vector<const PatternChar> pattern, 3628 Vector<const PatternChar> pattern,
3629 ZoneList<int>* indices, 3629 ZoneList<int>* indices,
3630 unsigned int limit, 3630 unsigned int limit,
3631 Zone* zone) { 3631 Zone* zone) {
3632 ASSERT(limit > 0); 3632 DCHECK(limit > 0);
3633 // Collect indices of pattern in subject. 3633 // Collect indices of pattern in subject.
3634 // Stop after finding at most limit values. 3634 // Stop after finding at most limit values.
3635 int pattern_length = pattern.length(); 3635 int pattern_length = pattern.length();
3636 int index = 0; 3636 int index = 0;
3637 StringSearch<PatternChar, SubjectChar> search(isolate, pattern); 3637 StringSearch<PatternChar, SubjectChar> search(isolate, pattern);
3638 while (limit > 0) { 3638 while (limit > 0) {
3639 index = search.Search(subject, index); 3639 index = search.Search(subject, index);
3640 if (index < 0) return; 3640 if (index < 0) return;
3641 indices->Add(index, zone); 3641 indices->Add(index, zone);
3642 index += pattern_length; 3642 index += pattern_length;
3643 limit--; 3643 limit--;
3644 } 3644 }
3645 } 3645 }
3646 3646
3647 3647
3648 void FindStringIndicesDispatch(Isolate* isolate, 3648 void FindStringIndicesDispatch(Isolate* isolate,
3649 String* subject, 3649 String* subject,
3650 String* pattern, 3650 String* pattern,
3651 ZoneList<int>* indices, 3651 ZoneList<int>* indices,
3652 unsigned int limit, 3652 unsigned int limit,
3653 Zone* zone) { 3653 Zone* zone) {
3654 { 3654 {
3655 DisallowHeapAllocation no_gc; 3655 DisallowHeapAllocation no_gc;
3656 String::FlatContent subject_content = subject->GetFlatContent(); 3656 String::FlatContent subject_content = subject->GetFlatContent();
3657 String::FlatContent pattern_content = pattern->GetFlatContent(); 3657 String::FlatContent pattern_content = pattern->GetFlatContent();
3658 ASSERT(subject_content.IsFlat()); 3658 DCHECK(subject_content.IsFlat());
3659 ASSERT(pattern_content.IsFlat()); 3659 DCHECK(pattern_content.IsFlat());
3660 if (subject_content.IsAscii()) { 3660 if (subject_content.IsAscii()) {
3661 Vector<const uint8_t> subject_vector = subject_content.ToOneByteVector(); 3661 Vector<const uint8_t> subject_vector = subject_content.ToOneByteVector();
3662 if (pattern_content.IsAscii()) { 3662 if (pattern_content.IsAscii()) {
3663 Vector<const uint8_t> pattern_vector = 3663 Vector<const uint8_t> pattern_vector =
3664 pattern_content.ToOneByteVector(); 3664 pattern_content.ToOneByteVector();
3665 if (pattern_vector.length() == 1) { 3665 if (pattern_vector.length() == 1) {
3666 FindAsciiStringIndices(subject_vector, 3666 FindAsciiStringIndices(subject_vector,
3667 pattern_vector[0], 3667 pattern_vector[0],
3668 indices, 3668 indices,
3669 limit, 3669 limit,
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
3725 } 3725 }
3726 3726
3727 3727
3728 template<typename ResultSeqString> 3728 template<typename ResultSeqString>
3729 MUST_USE_RESULT static Object* StringReplaceGlobalAtomRegExpWithString( 3729 MUST_USE_RESULT static Object* StringReplaceGlobalAtomRegExpWithString(
3730 Isolate* isolate, 3730 Isolate* isolate,
3731 Handle<String> subject, 3731 Handle<String> subject,
3732 Handle<JSRegExp> pattern_regexp, 3732 Handle<JSRegExp> pattern_regexp,
3733 Handle<String> replacement, 3733 Handle<String> replacement,
3734 Handle<JSArray> last_match_info) { 3734 Handle<JSArray> last_match_info) {
3735 ASSERT(subject->IsFlat()); 3735 DCHECK(subject->IsFlat());
3736 ASSERT(replacement->IsFlat()); 3736 DCHECK(replacement->IsFlat());
3737 3737
3738 ZoneScope zone_scope(isolate->runtime_zone()); 3738 ZoneScope zone_scope(isolate->runtime_zone());
3739 ZoneList<int> indices(8, zone_scope.zone()); 3739 ZoneList<int> indices(8, zone_scope.zone());
3740 ASSERT_EQ(JSRegExp::ATOM, pattern_regexp->TypeTag()); 3740 DCHECK_EQ(JSRegExp::ATOM, pattern_regexp->TypeTag());
3741 String* pattern = 3741 String* pattern =
3742 String::cast(pattern_regexp->DataAt(JSRegExp::kAtomPatternIndex)); 3742 String::cast(pattern_regexp->DataAt(JSRegExp::kAtomPatternIndex));
3743 int subject_len = subject->length(); 3743 int subject_len = subject->length();
3744 int pattern_len = pattern->length(); 3744 int pattern_len = pattern->length();
3745 int replacement_len = replacement->length(); 3745 int replacement_len = replacement->length();
3746 3746
3747 FindStringIndicesDispatch( 3747 FindStringIndicesDispatch(
3748 isolate, *subject, pattern, &indices, 0xffffffff, zone_scope.zone()); 3748 isolate, *subject, pattern, &indices, 0xffffffff, zone_scope.zone());
3749 3749
3750 int matches = indices.length(); 3750 int matches = indices.length();
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
3813 return *result; 3813 return *result;
3814 } 3814 }
3815 3815
3816 3816
3817 MUST_USE_RESULT static Object* StringReplaceGlobalRegExpWithString( 3817 MUST_USE_RESULT static Object* StringReplaceGlobalRegExpWithString(
3818 Isolate* isolate, 3818 Isolate* isolate,
3819 Handle<String> subject, 3819 Handle<String> subject,
3820 Handle<JSRegExp> regexp, 3820 Handle<JSRegExp> regexp,
3821 Handle<String> replacement, 3821 Handle<String> replacement,
3822 Handle<JSArray> last_match_info) { 3822 Handle<JSArray> last_match_info) {
3823 ASSERT(subject->IsFlat()); 3823 DCHECK(subject->IsFlat());
3824 ASSERT(replacement->IsFlat()); 3824 DCHECK(replacement->IsFlat());
3825 3825
3826 int capture_count = regexp->CaptureCount(); 3826 int capture_count = regexp->CaptureCount();
3827 int subject_length = subject->length(); 3827 int subject_length = subject->length();
3828 3828
3829 // CompiledReplacement uses zone allocation. 3829 // CompiledReplacement uses zone allocation.
3830 ZoneScope zone_scope(isolate->runtime_zone()); 3830 ZoneScope zone_scope(isolate->runtime_zone());
3831 CompiledReplacement compiled_replacement(zone_scope.zone()); 3831 CompiledReplacement compiled_replacement(zone_scope.zone());
3832 bool simple_replace = compiled_replacement.Compile(replacement, 3832 bool simple_replace = compiled_replacement.Compile(replacement,
3833 capture_count, 3833 capture_count,
3834 subject_length); 3834 subject_length);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
3909 return *result; 3909 return *result;
3910 } 3910 }
3911 3911
3912 3912
3913 template <typename ResultSeqString> 3913 template <typename ResultSeqString>
3914 MUST_USE_RESULT static Object* StringReplaceGlobalRegExpWithEmptyString( 3914 MUST_USE_RESULT static Object* StringReplaceGlobalRegExpWithEmptyString(
3915 Isolate* isolate, 3915 Isolate* isolate,
3916 Handle<String> subject, 3916 Handle<String> subject,
3917 Handle<JSRegExp> regexp, 3917 Handle<JSRegExp> regexp,
3918 Handle<JSArray> last_match_info) { 3918 Handle<JSArray> last_match_info) {
3919 ASSERT(subject->IsFlat()); 3919 DCHECK(subject->IsFlat());
3920 3920
3921 // Shortcut for simple non-regexp global replacements 3921 // Shortcut for simple non-regexp global replacements
3922 if (regexp->TypeTag() == JSRegExp::ATOM) { 3922 if (regexp->TypeTag() == JSRegExp::ATOM) {
3923 Handle<String> empty_string = isolate->factory()->empty_string(); 3923 Handle<String> empty_string = isolate->factory()->empty_string();
3924 if (subject->IsOneByteRepresentation()) { 3924 if (subject->IsOneByteRepresentation()) {
3925 return StringReplaceGlobalAtomRegExpWithString<SeqOneByteString>( 3925 return StringReplaceGlobalAtomRegExpWithString<SeqOneByteString>(
3926 isolate, subject, regexp, empty_string, last_match_info); 3926 isolate, subject, regexp, empty_string, last_match_info);
3927 } else { 3927 } else {
3928 return StringReplaceGlobalAtomRegExpWithString<SeqTwoByteString>( 3928 return StringReplaceGlobalAtomRegExpWithString<SeqTwoByteString>(
3929 isolate, subject, regexp, empty_string, last_match_info); 3929 isolate, subject, regexp, empty_string, last_match_info);
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
4004 // thread can not get confused with the filler creation. No synchronization 4004 // thread can not get confused with the filler creation. No synchronization
4005 // needed. 4005 // needed.
4006 heap->CreateFillerObjectAt(end_of_string, delta); 4006 heap->CreateFillerObjectAt(end_of_string, delta);
4007 heap->AdjustLiveBytes(answer->address(), -delta, Heap::FROM_MUTATOR); 4007 heap->AdjustLiveBytes(answer->address(), -delta, Heap::FROM_MUTATOR);
4008 return *answer; 4008 return *answer;
4009 } 4009 }
4010 4010
4011 4011
4012 RUNTIME_FUNCTION(Runtime_StringReplaceGlobalRegExpWithString) { 4012 RUNTIME_FUNCTION(Runtime_StringReplaceGlobalRegExpWithString) {
4013 HandleScope scope(isolate); 4013 HandleScope scope(isolate);
4014 ASSERT(args.length() == 4); 4014 DCHECK(args.length() == 4);
4015 4015
4016 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 4016 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
4017 CONVERT_ARG_HANDLE_CHECKED(String, replacement, 2); 4017 CONVERT_ARG_HANDLE_CHECKED(String, replacement, 2);
4018 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1); 4018 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1);
4019 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3); 4019 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 3);
4020 4020
4021 RUNTIME_ASSERT(regexp->GetFlags().is_global()); 4021 RUNTIME_ASSERT(regexp->GetFlags().is_global());
4022 RUNTIME_ASSERT(last_match_info->HasFastObjectElements()); 4022 RUNTIME_ASSERT(last_match_info->HasFastObjectElements());
4023 4023
4024 subject = String::Flatten(subject); 4024 subject = String::Flatten(subject);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
4086 String); 4086 String);
4087 Handle<String> second = 4087 Handle<String> second =
4088 isolate->factory()->NewSubString(subject, index + 1, subject->length()); 4088 isolate->factory()->NewSubString(subject, index + 1, subject->length());
4089 return isolate->factory()->NewConsString(cons1, second); 4089 return isolate->factory()->NewConsString(cons1, second);
4090 } 4090 }
4091 } 4091 }
4092 4092
4093 4093
4094 RUNTIME_FUNCTION(Runtime_StringReplaceOneCharWithString) { 4094 RUNTIME_FUNCTION(Runtime_StringReplaceOneCharWithString) {
4095 HandleScope scope(isolate); 4095 HandleScope scope(isolate);
4096 ASSERT(args.length() == 3); 4096 DCHECK(args.length() == 3);
4097 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 4097 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
4098 CONVERT_ARG_HANDLE_CHECKED(String, search, 1); 4098 CONVERT_ARG_HANDLE_CHECKED(String, search, 1);
4099 CONVERT_ARG_HANDLE_CHECKED(String, replace, 2); 4099 CONVERT_ARG_HANDLE_CHECKED(String, replace, 2);
4100 4100
4101 // If the cons string tree is too deep, we simply abort the recursion and 4101 // If the cons string tree is too deep, we simply abort the recursion and
4102 // retry with a flattened subject string. 4102 // retry with a flattened subject string.
4103 const int kRecursionLimit = 0x1000; 4103 const int kRecursionLimit = 0x1000;
4104 bool found = false; 4104 bool found = false;
4105 Handle<String> result; 4105 Handle<String> result;
4106 if (StringReplaceOneCharWithString( 4106 if (StringReplaceOneCharWithString(
(...skipping 12 matching lines...) Expand all
4119 } 4119 }
4120 4120
4121 4121
4122 // Perform string match of pattern on subject, starting at start index. 4122 // Perform string match of pattern on subject, starting at start index.
4123 // Caller must ensure that 0 <= start_index <= sub->length(), 4123 // Caller must ensure that 0 <= start_index <= sub->length(),
4124 // and should check that pat->length() + start_index <= sub->length(). 4124 // and should check that pat->length() + start_index <= sub->length().
4125 int Runtime::StringMatch(Isolate* isolate, 4125 int Runtime::StringMatch(Isolate* isolate,
4126 Handle<String> sub, 4126 Handle<String> sub,
4127 Handle<String> pat, 4127 Handle<String> pat,
4128 int start_index) { 4128 int start_index) {
4129 ASSERT(0 <= start_index); 4129 DCHECK(0 <= start_index);
4130 ASSERT(start_index <= sub->length()); 4130 DCHECK(start_index <= sub->length());
4131 4131
4132 int pattern_length = pat->length(); 4132 int pattern_length = pat->length();
4133 if (pattern_length == 0) return start_index; 4133 if (pattern_length == 0) return start_index;
4134 4134
4135 int subject_length = sub->length(); 4135 int subject_length = sub->length();
4136 if (start_index + pattern_length > subject_length) return -1; 4136 if (start_index + pattern_length > subject_length) return -1;
4137 4137
4138 sub = String::Flatten(sub); 4138 sub = String::Flatten(sub);
4139 pat = String::Flatten(pat); 4139 pat = String::Flatten(pat);
4140 4140
(...skipping 25 matching lines...) Expand all
4166 } 4166 }
4167 return SearchString(isolate, 4167 return SearchString(isolate,
4168 seq_sub.ToUC16Vector(), 4168 seq_sub.ToUC16Vector(),
4169 pat_vector, 4169 pat_vector,
4170 start_index); 4170 start_index);
4171 } 4171 }
4172 4172
4173 4173
4174 RUNTIME_FUNCTION(Runtime_StringIndexOf) { 4174 RUNTIME_FUNCTION(Runtime_StringIndexOf) {
4175 HandleScope scope(isolate); 4175 HandleScope scope(isolate);
4176 ASSERT(args.length() == 3); 4176 DCHECK(args.length() == 3);
4177 4177
4178 CONVERT_ARG_HANDLE_CHECKED(String, sub, 0); 4178 CONVERT_ARG_HANDLE_CHECKED(String, sub, 0);
4179 CONVERT_ARG_HANDLE_CHECKED(String, pat, 1); 4179 CONVERT_ARG_HANDLE_CHECKED(String, pat, 1);
4180 CONVERT_ARG_HANDLE_CHECKED(Object, index, 2); 4180 CONVERT_ARG_HANDLE_CHECKED(Object, index, 2);
4181 4181
4182 uint32_t start_index; 4182 uint32_t start_index;
4183 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1); 4183 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1);
4184 4184
4185 RUNTIME_ASSERT(start_index <= static_cast<uint32_t>(sub->length())); 4185 RUNTIME_ASSERT(start_index <= static_cast<uint32_t>(sub->length()));
4186 int position = Runtime::StringMatch(isolate, sub, pat, start_index); 4186 int position = Runtime::StringMatch(isolate, sub, pat, start_index);
4187 return Smi::FromInt(position); 4187 return Smi::FromInt(position);
4188 } 4188 }
4189 4189
4190 4190
4191 template <typename schar, typename pchar> 4191 template <typename schar, typename pchar>
4192 static int StringMatchBackwards(Vector<const schar> subject, 4192 static int StringMatchBackwards(Vector<const schar> subject,
4193 Vector<const pchar> pattern, 4193 Vector<const pchar> pattern,
4194 int idx) { 4194 int idx) {
4195 int pattern_length = pattern.length(); 4195 int pattern_length = pattern.length();
4196 ASSERT(pattern_length >= 1); 4196 DCHECK(pattern_length >= 1);
4197 ASSERT(idx + pattern_length <= subject.length()); 4197 DCHECK(idx + pattern_length <= subject.length());
4198 4198
4199 if (sizeof(schar) == 1 && sizeof(pchar) > 1) { 4199 if (sizeof(schar) == 1 && sizeof(pchar) > 1) {
4200 for (int i = 0; i < pattern_length; i++) { 4200 for (int i = 0; i < pattern_length; i++) {
4201 uc16 c = pattern[i]; 4201 uc16 c = pattern[i];
4202 if (c > String::kMaxOneByteCharCode) { 4202 if (c > String::kMaxOneByteCharCode) {
4203 return -1; 4203 return -1;
4204 } 4204 }
4205 } 4205 }
4206 } 4206 }
4207 4207
(...skipping 10 matching lines...) Expand all
4218 if (j == pattern_length) { 4218 if (j == pattern_length) {
4219 return i; 4219 return i;
4220 } 4220 }
4221 } 4221 }
4222 return -1; 4222 return -1;
4223 } 4223 }
4224 4224
4225 4225
4226 RUNTIME_FUNCTION(Runtime_StringLastIndexOf) { 4226 RUNTIME_FUNCTION(Runtime_StringLastIndexOf) {
4227 HandleScope scope(isolate); 4227 HandleScope scope(isolate);
4228 ASSERT(args.length() == 3); 4228 DCHECK(args.length() == 3);
4229 4229
4230 CONVERT_ARG_HANDLE_CHECKED(String, sub, 0); 4230 CONVERT_ARG_HANDLE_CHECKED(String, sub, 0);
4231 CONVERT_ARG_HANDLE_CHECKED(String, pat, 1); 4231 CONVERT_ARG_HANDLE_CHECKED(String, pat, 1);
4232 CONVERT_ARG_HANDLE_CHECKED(Object, index, 2); 4232 CONVERT_ARG_HANDLE_CHECKED(Object, index, 2);
4233 4233
4234 uint32_t start_index; 4234 uint32_t start_index;
4235 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1); 4235 if (!index->ToArrayIndex(&start_index)) return Smi::FromInt(-1);
4236 4236
4237 uint32_t pat_length = pat->length(); 4237 uint32_t pat_length = pat->length();
4238 uint32_t sub_length = sub->length(); 4238 uint32_t sub_length = sub->length();
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4277 start_index); 4277 start_index);
4278 } 4278 }
4279 } 4279 }
4280 4280
4281 return Smi::FromInt(position); 4281 return Smi::FromInt(position);
4282 } 4282 }
4283 4283
4284 4284
4285 RUNTIME_FUNCTION(Runtime_StringLocaleCompare) { 4285 RUNTIME_FUNCTION(Runtime_StringLocaleCompare) {
4286 HandleScope handle_scope(isolate); 4286 HandleScope handle_scope(isolate);
4287 ASSERT(args.length() == 2); 4287 DCHECK(args.length() == 2);
4288 4288
4289 CONVERT_ARG_HANDLE_CHECKED(String, str1, 0); 4289 CONVERT_ARG_HANDLE_CHECKED(String, str1, 0);
4290 CONVERT_ARG_HANDLE_CHECKED(String, str2, 1); 4290 CONVERT_ARG_HANDLE_CHECKED(String, str2, 1);
4291 4291
4292 if (str1.is_identical_to(str2)) return Smi::FromInt(0); // Equal. 4292 if (str1.is_identical_to(str2)) return Smi::FromInt(0); // Equal.
4293 int str1_length = str1->length(); 4293 int str1_length = str1->length();
4294 int str2_length = str2->length(); 4294 int str2_length = str2->length();
4295 4295
4296 // Decide trivial cases without flattening. 4296 // Decide trivial cases without flattening.
4297 if (str1_length == 0) { 4297 if (str1_length == 0) {
(...skipping 23 matching lines...) Expand all
4321 return Smi::FromInt(flat1.Get(i) - flat2.Get(i)); 4321 return Smi::FromInt(flat1.Get(i) - flat2.Get(i));
4322 } 4322 }
4323 } 4323 }
4324 4324
4325 return Smi::FromInt(str1_length - str2_length); 4325 return Smi::FromInt(str1_length - str2_length);
4326 } 4326 }
4327 4327
4328 4328
4329 RUNTIME_FUNCTION(Runtime_SubString) { 4329 RUNTIME_FUNCTION(Runtime_SubString) {
4330 HandleScope scope(isolate); 4330 HandleScope scope(isolate);
4331 ASSERT(args.length() == 3); 4331 DCHECK(args.length() == 3);
4332 4332
4333 CONVERT_ARG_HANDLE_CHECKED(String, string, 0); 4333 CONVERT_ARG_HANDLE_CHECKED(String, string, 0);
4334 int start, end; 4334 int start, end;
4335 // We have a fast integer-only case here to avoid a conversion to double in 4335 // We have a fast integer-only case here to avoid a conversion to double in
4336 // the common case where from and to are Smis. 4336 // the common case where from and to are Smis.
4337 if (args[1]->IsSmi() && args[2]->IsSmi()) { 4337 if (args[1]->IsSmi() && args[2]->IsSmi()) {
4338 CONVERT_SMI_ARG_CHECKED(from_number, 1); 4338 CONVERT_SMI_ARG_CHECKED(from_number, 1);
4339 CONVERT_SMI_ARG_CHECKED(to_number, 2); 4339 CONVERT_SMI_ARG_CHECKED(to_number, 2);
4340 start = from_number; 4340 start = from_number;
4341 end = to_number; 4341 end = to_number;
(...skipping 15 matching lines...) Expand all
4357 RUNTIME_FUNCTION(Runtime_InternalizeString) { 4357 RUNTIME_FUNCTION(Runtime_InternalizeString) {
4358 HandleScope handles(isolate); 4358 HandleScope handles(isolate);
4359 RUNTIME_ASSERT(args.length() == 1); 4359 RUNTIME_ASSERT(args.length() == 1);
4360 CONVERT_ARG_HANDLE_CHECKED(String, string, 0); 4360 CONVERT_ARG_HANDLE_CHECKED(String, string, 0);
4361 return *isolate->factory()->InternalizeString(string); 4361 return *isolate->factory()->InternalizeString(string);
4362 } 4362 }
4363 4363
4364 4364
4365 RUNTIME_FUNCTION(Runtime_StringMatch) { 4365 RUNTIME_FUNCTION(Runtime_StringMatch) {
4366 HandleScope handles(isolate); 4366 HandleScope handles(isolate);
4367 ASSERT(args.length() == 3); 4367 DCHECK(args.length() == 3);
4368 4368
4369 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 4369 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
4370 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1); 4370 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 1);
4371 CONVERT_ARG_HANDLE_CHECKED(JSArray, regexp_info, 2); 4371 CONVERT_ARG_HANDLE_CHECKED(JSArray, regexp_info, 2);
4372 4372
4373 RUNTIME_ASSERT(regexp_info->HasFastObjectElements()); 4373 RUNTIME_ASSERT(regexp_info->HasFastObjectElements());
4374 4374
4375 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate); 4375 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate);
4376 if (global_cache.HasException()) return isolate->heap()->exception(); 4376 if (global_cache.HasException()) return isolate->heap()->exception();
4377 4377
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
4420 4420
4421 // Only called from Runtime_RegExpExecMultiple so it doesn't need to maintain 4421 // Only called from Runtime_RegExpExecMultiple so it doesn't need to maintain
4422 // separate last match info. See comment on that function. 4422 // separate last match info. See comment on that function.
4423 template<bool has_capture> 4423 template<bool has_capture>
4424 static Object* SearchRegExpMultiple( 4424 static Object* SearchRegExpMultiple(
4425 Isolate* isolate, 4425 Isolate* isolate,
4426 Handle<String> subject, 4426 Handle<String> subject,
4427 Handle<JSRegExp> regexp, 4427 Handle<JSRegExp> regexp,
4428 Handle<JSArray> last_match_array, 4428 Handle<JSArray> last_match_array,
4429 Handle<JSArray> result_array) { 4429 Handle<JSArray> result_array) {
4430 ASSERT(subject->IsFlat()); 4430 DCHECK(subject->IsFlat());
4431 ASSERT_NE(has_capture, regexp->CaptureCount() == 0); 4431 DCHECK_NE(has_capture, regexp->CaptureCount() == 0);
4432 4432
4433 int capture_count = regexp->CaptureCount(); 4433 int capture_count = regexp->CaptureCount();
4434 int subject_length = subject->length(); 4434 int subject_length = subject->length();
4435 4435
4436 static const int kMinLengthToCache = 0x1000; 4436 static const int kMinLengthToCache = 0x1000;
4437 4437
4438 if (subject_length > kMinLengthToCache) { 4438 if (subject_length > kMinLengthToCache) {
4439 Handle<Object> cached_answer(RegExpResultsCache::Lookup( 4439 Handle<Object> cached_answer(RegExpResultsCache::Lookup(
4440 isolate->heap(), 4440 isolate->heap(),
4441 *subject, 4441 *subject,
(...skipping 13 matching lines...) Expand all
4455 RegExpImpl::SetLastMatchInfo( 4455 RegExpImpl::SetLastMatchInfo(
4456 last_match_array, subject, capture_count, NULL); 4456 last_match_array, subject, capture_count, NULL);
4457 return *result_array; 4457 return *result_array;
4458 } 4458 }
4459 } 4459 }
4460 4460
4461 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate); 4461 RegExpImpl::GlobalCache global_cache(regexp, subject, true, isolate);
4462 if (global_cache.HasException()) return isolate->heap()->exception(); 4462 if (global_cache.HasException()) return isolate->heap()->exception();
4463 4463
4464 // Ensured in Runtime_RegExpExecMultiple. 4464 // Ensured in Runtime_RegExpExecMultiple.
4465 ASSERT(result_array->HasFastObjectElements()); 4465 DCHECK(result_array->HasFastObjectElements());
4466 Handle<FixedArray> result_elements( 4466 Handle<FixedArray> result_elements(
4467 FixedArray::cast(result_array->elements())); 4467 FixedArray::cast(result_array->elements()));
4468 if (result_elements->length() < 16) { 4468 if (result_elements->length() < 16) {
4469 result_elements = isolate->factory()->NewFixedArrayWithHoles(16); 4469 result_elements = isolate->factory()->NewFixedArrayWithHoles(16);
4470 } 4470 }
4471 4471
4472 FixedArrayBuilder builder(result_elements); 4472 FixedArrayBuilder builder(result_elements);
4473 4473
4474 // Position to search from. 4474 // Position to search from.
4475 int match_start = -1; 4475 int match_start = -1;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
4509 // Arguments array to replace function is match, captures, index and 4509 // Arguments array to replace function is match, captures, index and
4510 // subject, i.e., 3 + capture count in total. 4510 // subject, i.e., 3 + capture count in total.
4511 Handle<FixedArray> elements = 4511 Handle<FixedArray> elements =
4512 isolate->factory()->NewFixedArray(3 + capture_count); 4512 isolate->factory()->NewFixedArray(3 + capture_count);
4513 4513
4514 elements->set(0, *match); 4514 elements->set(0, *match);
4515 for (int i = 1; i <= capture_count; i++) { 4515 for (int i = 1; i <= capture_count; i++) {
4516 int start = current_match[i * 2]; 4516 int start = current_match[i * 2];
4517 if (start >= 0) { 4517 if (start >= 0) {
4518 int end = current_match[i * 2 + 1]; 4518 int end = current_match[i * 2 + 1];
4519 ASSERT(start <= end); 4519 DCHECK(start <= end);
4520 Handle<String> substring = 4520 Handle<String> substring =
4521 isolate->factory()->NewSubString(subject, start, end); 4521 isolate->factory()->NewSubString(subject, start, end);
4522 elements->set(i, *substring); 4522 elements->set(i, *substring);
4523 } else { 4523 } else {
4524 ASSERT(current_match[i * 2 + 1] < 0); 4524 DCHECK(current_match[i * 2 + 1] < 0);
4525 elements->set(i, isolate->heap()->undefined_value()); 4525 elements->set(i, isolate->heap()->undefined_value());
4526 } 4526 }
4527 } 4527 }
4528 elements->set(capture_count + 1, Smi::FromInt(match_start)); 4528 elements->set(capture_count + 1, Smi::FromInt(match_start));
4529 elements->set(capture_count + 2, *subject); 4529 elements->set(capture_count + 2, *subject);
4530 builder.Add(*isolate->factory()->NewJSArrayWithElements(elements)); 4530 builder.Add(*isolate->factory()->NewJSArrayWithElements(elements));
4531 } else { 4531 } else {
4532 builder.Add(*match); 4532 builder.Add(*match);
4533 } 4533 }
4534 } 4534 }
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
4566 return isolate->heap()->null_value(); // No matches at all. 4566 return isolate->heap()->null_value(); // No matches at all.
4567 } 4567 }
4568 } 4568 }
4569 4569
4570 4570
4571 // This is only called for StringReplaceGlobalRegExpWithFunction. This sets 4571 // This is only called for StringReplaceGlobalRegExpWithFunction. This sets
4572 // lastMatchInfoOverride to maintain the last match info, so we don't need to 4572 // lastMatchInfoOverride to maintain the last match info, so we don't need to
4573 // set any other last match array info. 4573 // set any other last match array info.
4574 RUNTIME_FUNCTION(Runtime_RegExpExecMultiple) { 4574 RUNTIME_FUNCTION(Runtime_RegExpExecMultiple) {
4575 HandleScope handles(isolate); 4575 HandleScope handles(isolate);
4576 ASSERT(args.length() == 4); 4576 DCHECK(args.length() == 4);
4577 4577
4578 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1); 4578 CONVERT_ARG_HANDLE_CHECKED(String, subject, 1);
4579 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0); 4579 CONVERT_ARG_HANDLE_CHECKED(JSRegExp, regexp, 0);
4580 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 2); 4580 CONVERT_ARG_HANDLE_CHECKED(JSArray, last_match_info, 2);
4581 CONVERT_ARG_HANDLE_CHECKED(JSArray, result_array, 3); 4581 CONVERT_ARG_HANDLE_CHECKED(JSArray, result_array, 3);
4582 RUNTIME_ASSERT(last_match_info->HasFastObjectElements()); 4582 RUNTIME_ASSERT(last_match_info->HasFastObjectElements());
4583 RUNTIME_ASSERT(result_array->HasFastObjectElements()); 4583 RUNTIME_ASSERT(result_array->HasFastObjectElements());
4584 4584
4585 subject = String::Flatten(subject); 4585 subject = String::Flatten(subject);
4586 RUNTIME_ASSERT(regexp->GetFlags().is_global()); 4586 RUNTIME_ASSERT(regexp->GetFlags().is_global());
4587 4587
4588 if (regexp->CaptureCount() == 0) { 4588 if (regexp->CaptureCount() == 0) {
4589 return SearchRegExpMultiple<false>( 4589 return SearchRegExpMultiple<false>(
4590 isolate, subject, regexp, last_match_info, result_array); 4590 isolate, subject, regexp, last_match_info, result_array);
4591 } else { 4591 } else {
4592 return SearchRegExpMultiple<true>( 4592 return SearchRegExpMultiple<true>(
4593 isolate, subject, regexp, last_match_info, result_array); 4593 isolate, subject, regexp, last_match_info, result_array);
4594 } 4594 }
4595 } 4595 }
4596 4596
4597 4597
4598 RUNTIME_FUNCTION(Runtime_NumberToRadixString) { 4598 RUNTIME_FUNCTION(Runtime_NumberToRadixString) {
4599 HandleScope scope(isolate); 4599 HandleScope scope(isolate);
4600 ASSERT(args.length() == 2); 4600 DCHECK(args.length() == 2);
4601 CONVERT_SMI_ARG_CHECKED(radix, 1); 4601 CONVERT_SMI_ARG_CHECKED(radix, 1);
4602 RUNTIME_ASSERT(2 <= radix && radix <= 36); 4602 RUNTIME_ASSERT(2 <= radix && radix <= 36);
4603 4603
4604 // Fast case where the result is a one character string. 4604 // Fast case where the result is a one character string.
4605 if (args[0]->IsSmi()) { 4605 if (args[0]->IsSmi()) {
4606 int value = args.smi_at(0); 4606 int value = args.smi_at(0);
4607 if (value >= 0 && value < radix) { 4607 if (value >= 0 && value < radix) {
4608 // Character array used for conversion. 4608 // Character array used for conversion.
4609 static const char kCharTable[] = "0123456789abcdefghijklmnopqrstuvwxyz"; 4609 static const char kCharTable[] = "0123456789abcdefghijklmnopqrstuvwxyz";
4610 return *isolate->factory()-> 4610 return *isolate->factory()->
(...skipping 14 matching lines...) Expand all
4625 } 4625 }
4626 char* str = DoubleToRadixCString(value, radix); 4626 char* str = DoubleToRadixCString(value, radix);
4627 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str); 4627 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
4628 DeleteArray(str); 4628 DeleteArray(str);
4629 return *result; 4629 return *result;
4630 } 4630 }
4631 4631
4632 4632
4633 RUNTIME_FUNCTION(Runtime_NumberToFixed) { 4633 RUNTIME_FUNCTION(Runtime_NumberToFixed) {
4634 HandleScope scope(isolate); 4634 HandleScope scope(isolate);
4635 ASSERT(args.length() == 2); 4635 DCHECK(args.length() == 2);
4636 4636
4637 CONVERT_DOUBLE_ARG_CHECKED(value, 0); 4637 CONVERT_DOUBLE_ARG_CHECKED(value, 0);
4638 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1); 4638 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1);
4639 int f = FastD2IChecked(f_number); 4639 int f = FastD2IChecked(f_number);
4640 // See DoubleToFixedCString for these constants: 4640 // See DoubleToFixedCString for these constants:
4641 RUNTIME_ASSERT(f >= 0 && f <= 20); 4641 RUNTIME_ASSERT(f >= 0 && f <= 20);
4642 RUNTIME_ASSERT(!Double(value).IsSpecial()); 4642 RUNTIME_ASSERT(!Double(value).IsSpecial());
4643 char* str = DoubleToFixedCString(value, f); 4643 char* str = DoubleToFixedCString(value, f);
4644 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str); 4644 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
4645 DeleteArray(str); 4645 DeleteArray(str);
4646 return *result; 4646 return *result;
4647 } 4647 }
4648 4648
4649 4649
4650 RUNTIME_FUNCTION(Runtime_NumberToExponential) { 4650 RUNTIME_FUNCTION(Runtime_NumberToExponential) {
4651 HandleScope scope(isolate); 4651 HandleScope scope(isolate);
4652 ASSERT(args.length() == 2); 4652 DCHECK(args.length() == 2);
4653 4653
4654 CONVERT_DOUBLE_ARG_CHECKED(value, 0); 4654 CONVERT_DOUBLE_ARG_CHECKED(value, 0);
4655 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1); 4655 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1);
4656 int f = FastD2IChecked(f_number); 4656 int f = FastD2IChecked(f_number);
4657 RUNTIME_ASSERT(f >= -1 && f <= 20); 4657 RUNTIME_ASSERT(f >= -1 && f <= 20);
4658 RUNTIME_ASSERT(!Double(value).IsSpecial()); 4658 RUNTIME_ASSERT(!Double(value).IsSpecial());
4659 char* str = DoubleToExponentialCString(value, f); 4659 char* str = DoubleToExponentialCString(value, f);
4660 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str); 4660 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
4661 DeleteArray(str); 4661 DeleteArray(str);
4662 return *result; 4662 return *result;
4663 } 4663 }
4664 4664
4665 4665
4666 RUNTIME_FUNCTION(Runtime_NumberToPrecision) { 4666 RUNTIME_FUNCTION(Runtime_NumberToPrecision) {
4667 HandleScope scope(isolate); 4667 HandleScope scope(isolate);
4668 ASSERT(args.length() == 2); 4668 DCHECK(args.length() == 2);
4669 4669
4670 CONVERT_DOUBLE_ARG_CHECKED(value, 0); 4670 CONVERT_DOUBLE_ARG_CHECKED(value, 0);
4671 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1); 4671 CONVERT_DOUBLE_ARG_CHECKED(f_number, 1);
4672 int f = FastD2IChecked(f_number); 4672 int f = FastD2IChecked(f_number);
4673 RUNTIME_ASSERT(f >= 1 && f <= 21); 4673 RUNTIME_ASSERT(f >= 1 && f <= 21);
4674 RUNTIME_ASSERT(!Double(value).IsSpecial()); 4674 RUNTIME_ASSERT(!Double(value).IsSpecial());
4675 char* str = DoubleToPrecisionCString(value, f); 4675 char* str = DoubleToPrecisionCString(value, f);
4676 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str); 4676 Handle<String> result = isolate->factory()->NewStringFromAsciiChecked(str);
4677 DeleteArray(str); 4677 DeleteArray(str);
4678 return *result; 4678 return *result;
4679 } 4679 }
4680 4680
4681 4681
4682 RUNTIME_FUNCTION(Runtime_IsValidSmi) { 4682 RUNTIME_FUNCTION(Runtime_IsValidSmi) {
4683 SealHandleScope shs(isolate); 4683 SealHandleScope shs(isolate);
4684 ASSERT(args.length() == 1); 4684 DCHECK(args.length() == 1);
4685 4685
4686 CONVERT_NUMBER_CHECKED(int32_t, number, Int32, args[0]); 4686 CONVERT_NUMBER_CHECKED(int32_t, number, Int32, args[0]);
4687 return isolate->heap()->ToBoolean(Smi::IsValid(number)); 4687 return isolate->heap()->ToBoolean(Smi::IsValid(number));
4688 } 4688 }
4689 4689
4690 4690
4691 // Returns a single character string where first character equals 4691 // Returns a single character string where first character equals
4692 // string->Get(index). 4692 // string->Get(index).
4693 static Handle<Object> GetCharAt(Handle<String> string, uint32_t index) { 4693 static Handle<Object> GetCharAt(Handle<String> string, uint32_t index) {
4694 if (index < static_cast<uint32_t>(string->length())) { 4694 if (index < static_cast<uint32_t>(string->length())) {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
4787 if (name->AsArrayIndex(&index)) { 4787 if (name->AsArrayIndex(&index)) {
4788 return GetElementOrCharAt(isolate, object, index); 4788 return GetElementOrCharAt(isolate, object, index);
4789 } else { 4789 } else {
4790 return Object::GetProperty(object, name); 4790 return Object::GetProperty(object, name);
4791 } 4791 }
4792 } 4792 }
4793 4793
4794 4794
4795 RUNTIME_FUNCTION(Runtime_GetProperty) { 4795 RUNTIME_FUNCTION(Runtime_GetProperty) {
4796 HandleScope scope(isolate); 4796 HandleScope scope(isolate);
4797 ASSERT(args.length() == 2); 4797 DCHECK(args.length() == 2);
4798 4798
4799 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); 4799 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
4800 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1); 4800 CONVERT_ARG_HANDLE_CHECKED(Object, key, 1);
4801 Handle<Object> result; 4801 Handle<Object> result;
4802 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 4802 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
4803 isolate, result, 4803 isolate, result,
4804 Runtime::GetObjectProperty(isolate, object, key)); 4804 Runtime::GetObjectProperty(isolate, object, key));
4805 return *result; 4805 return *result;
4806 } 4806 }
4807 4807
4808 4808
4809 // KeyedGetProperty is called from KeyedLoadIC::GenerateGeneric. 4809 // KeyedGetProperty is called from KeyedLoadIC::GenerateGeneric.
4810 RUNTIME_FUNCTION(Runtime_KeyedGetProperty) { 4810 RUNTIME_FUNCTION(Runtime_KeyedGetProperty) {
4811 HandleScope scope(isolate); 4811 HandleScope scope(isolate);
4812 ASSERT(args.length() == 2); 4812 DCHECK(args.length() == 2);
4813 4813
4814 CONVERT_ARG_HANDLE_CHECKED(Object, receiver_obj, 0); 4814 CONVERT_ARG_HANDLE_CHECKED(Object, receiver_obj, 0);
4815 CONVERT_ARG_HANDLE_CHECKED(Object, key_obj, 1); 4815 CONVERT_ARG_HANDLE_CHECKED(Object, key_obj, 1);
4816 4816
4817 // Fast cases for getting named properties of the receiver JSObject 4817 // Fast cases for getting named properties of the receiver JSObject
4818 // itself. 4818 // itself.
4819 // 4819 //
4820 // The global proxy objects has to be excluded since LookupOwn on 4820 // The global proxy objects has to be excluded since LookupOwn on
4821 // the global proxy object can return a valid result even though the 4821 // the global proxy object can return a valid result even though the
4822 // global proxy object never has properties. This is the case 4822 // global proxy object never has properties. This is the case
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
4885 if (key->value() >= js_object->elements()->length()) { 4885 if (key->value() >= js_object->elements()->length()) {
4886 if (IsFastHoleyElementsKind(elements_kind)) { 4886 if (IsFastHoleyElementsKind(elements_kind)) {
4887 elements_kind = FAST_HOLEY_ELEMENTS; 4887 elements_kind = FAST_HOLEY_ELEMENTS;
4888 } else { 4888 } else {
4889 elements_kind = FAST_ELEMENTS; 4889 elements_kind = FAST_ELEMENTS;
4890 } 4890 }
4891 RETURN_FAILURE_ON_EXCEPTION( 4891 RETURN_FAILURE_ON_EXCEPTION(
4892 isolate, TransitionElements(js_object, elements_kind, isolate)); 4892 isolate, TransitionElements(js_object, elements_kind, isolate));
4893 } 4893 }
4894 } else { 4894 } else {
4895 ASSERT(IsFastSmiOrObjectElementsKind(elements_kind) || 4895 DCHECK(IsFastSmiOrObjectElementsKind(elements_kind) ||
4896 !IsFastElementsKind(elements_kind)); 4896 !IsFastElementsKind(elements_kind));
4897 } 4897 }
4898 } 4898 }
4899 } else if (receiver_obj->IsString() && key_obj->IsSmi()) { 4899 } else if (receiver_obj->IsString() && key_obj->IsSmi()) {
4900 // Fast case for string indexing using [] with a smi index. 4900 // Fast case for string indexing using [] with a smi index.
4901 Handle<String> str = Handle<String>::cast(receiver_obj); 4901 Handle<String> str = Handle<String>::cast(receiver_obj);
4902 int index = args.smi_at(1); 4902 int index = args.smi_at(1);
4903 if (index >= 0 && index < str->length()) { 4903 if (index >= 0 && index < str->length()) {
4904 return *GetCharAt(str, index); 4904 return *GetCharAt(str, index);
4905 } 4905 }
(...skipping 18 matching lines...) Expand all
4924 Handle<Object> component) { 4924 Handle<Object> component) {
4925 if (component->IsUndefined()) return isolate->factory()->null_value(); 4925 if (component->IsUndefined()) return isolate->factory()->null_value();
4926 Handle<FunctionTemplateInfo> info = 4926 Handle<FunctionTemplateInfo> info =
4927 Handle<FunctionTemplateInfo>::cast(component); 4927 Handle<FunctionTemplateInfo>::cast(component);
4928 return Utils::OpenHandle(*Utils::ToLocal(info)->GetFunction()); 4928 return Utils::OpenHandle(*Utils::ToLocal(info)->GetFunction());
4929 } 4929 }
4930 4930
4931 4931
4932 RUNTIME_FUNCTION(Runtime_DefineApiAccessorProperty) { 4932 RUNTIME_FUNCTION(Runtime_DefineApiAccessorProperty) {
4933 HandleScope scope(isolate); 4933 HandleScope scope(isolate);
4934 ASSERT(args.length() == 5); 4934 DCHECK(args.length() == 5);
4935 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 4935 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
4936 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 4936 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
4937 CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2); 4937 CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2);
4938 CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3); 4938 CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3);
4939 CONVERT_SMI_ARG_CHECKED(attribute, 4); 4939 CONVERT_SMI_ARG_CHECKED(attribute, 4);
4940 RUNTIME_ASSERT(getter->IsUndefined() || getter->IsFunctionTemplateInfo()); 4940 RUNTIME_ASSERT(getter->IsUndefined() || getter->IsFunctionTemplateInfo());
4941 RUNTIME_ASSERT(setter->IsUndefined() || setter->IsFunctionTemplateInfo()); 4941 RUNTIME_ASSERT(setter->IsUndefined() || setter->IsFunctionTemplateInfo());
4942 RUNTIME_ASSERT(PropertyDetails::AttributesField::is_valid( 4942 RUNTIME_ASSERT(PropertyDetails::AttributesField::is_valid(
4943 static_cast<PropertyAttributes>(attribute))); 4943 static_cast<PropertyAttributes>(attribute)));
4944 RETURN_FAILURE_ON_EXCEPTION( 4944 RETURN_FAILURE_ON_EXCEPTION(
4945 isolate, JSObject::DefineAccessor( 4945 isolate, JSObject::DefineAccessor(
4946 object, name, InstantiateAccessorComponent(isolate, getter), 4946 object, name, InstantiateAccessorComponent(isolate, getter),
4947 InstantiateAccessorComponent(isolate, setter), 4947 InstantiateAccessorComponent(isolate, setter),
4948 static_cast<PropertyAttributes>(attribute))); 4948 static_cast<PropertyAttributes>(attribute)));
4949 return isolate->heap()->undefined_value(); 4949 return isolate->heap()->undefined_value();
4950 } 4950 }
4951 4951
4952 4952
4953 // Implements part of 8.12.9 DefineOwnProperty. 4953 // Implements part of 8.12.9 DefineOwnProperty.
4954 // There are 3 cases that lead here: 4954 // There are 3 cases that lead here:
4955 // Step 4b - define a new accessor property. 4955 // Step 4b - define a new accessor property.
4956 // Steps 9c & 12 - replace an existing data property with an accessor property. 4956 // Steps 9c & 12 - replace an existing data property with an accessor property.
4957 // Step 12 - update an existing accessor property with an accessor or generic 4957 // Step 12 - update an existing accessor property with an accessor or generic
4958 // descriptor. 4958 // descriptor.
4959 RUNTIME_FUNCTION(Runtime_DefineAccessorPropertyUnchecked) { 4959 RUNTIME_FUNCTION(Runtime_DefineAccessorPropertyUnchecked) {
4960 HandleScope scope(isolate); 4960 HandleScope scope(isolate);
4961 ASSERT(args.length() == 5); 4961 DCHECK(args.length() == 5);
4962 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 4962 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
4963 RUNTIME_ASSERT(!obj->IsNull()); 4963 RUNTIME_ASSERT(!obj->IsNull());
4964 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 4964 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
4965 CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2); 4965 CONVERT_ARG_HANDLE_CHECKED(Object, getter, 2);
4966 RUNTIME_ASSERT(IsValidAccessor(getter)); 4966 RUNTIME_ASSERT(IsValidAccessor(getter));
4967 CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3); 4967 CONVERT_ARG_HANDLE_CHECKED(Object, setter, 3);
4968 RUNTIME_ASSERT(IsValidAccessor(setter)); 4968 RUNTIME_ASSERT(IsValidAccessor(setter));
4969 CONVERT_SMI_ARG_CHECKED(unchecked, 4); 4969 CONVERT_SMI_ARG_CHECKED(unchecked, 4);
4970 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 4970 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
4971 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); 4971 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked);
4972 4972
4973 bool fast = obj->HasFastProperties(); 4973 bool fast = obj->HasFastProperties();
4974 RETURN_FAILURE_ON_EXCEPTION( 4974 RETURN_FAILURE_ON_EXCEPTION(
4975 isolate, JSObject::DefineAccessor(obj, name, getter, setter, attr)); 4975 isolate, JSObject::DefineAccessor(obj, name, getter, setter, attr));
4976 if (fast) JSObject::MigrateSlowToFast(obj, 0); 4976 if (fast) JSObject::MigrateSlowToFast(obj, 0);
4977 return isolate->heap()->undefined_value(); 4977 return isolate->heap()->undefined_value();
4978 } 4978 }
4979 4979
4980 4980
4981 // Implements part of 8.12.9 DefineOwnProperty. 4981 // Implements part of 8.12.9 DefineOwnProperty.
4982 // There are 3 cases that lead here: 4982 // There are 3 cases that lead here:
4983 // Step 4a - define a new data property. 4983 // Step 4a - define a new data property.
4984 // Steps 9b & 12 - replace an existing accessor property with a data property. 4984 // Steps 9b & 12 - replace an existing accessor property with a data property.
4985 // Step 12 - update an existing data property with a data or generic 4985 // Step 12 - update an existing data property with a data or generic
4986 // descriptor. 4986 // descriptor.
4987 RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) { 4987 RUNTIME_FUNCTION(Runtime_DefineDataPropertyUnchecked) {
4988 HandleScope scope(isolate); 4988 HandleScope scope(isolate);
4989 ASSERT(args.length() == 4); 4989 DCHECK(args.length() == 4);
4990 CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0); 4990 CONVERT_ARG_HANDLE_CHECKED(JSObject, js_object, 0);
4991 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 4991 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
4992 CONVERT_ARG_HANDLE_CHECKED(Object, obj_value, 2); 4992 CONVERT_ARG_HANDLE_CHECKED(Object, obj_value, 2);
4993 CONVERT_SMI_ARG_CHECKED(unchecked, 3); 4993 CONVERT_SMI_ARG_CHECKED(unchecked, 3);
4994 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 4994 RUNTIME_ASSERT((unchecked & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
4995 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked); 4995 PropertyAttributes attr = static_cast<PropertyAttributes>(unchecked);
4996 4996
4997 // Check access rights if needed. 4997 // Check access rights if needed.
4998 if (js_object->IsAccessCheckNeeded() && 4998 if (js_object->IsAccessCheckNeeded() &&
4999 !isolate->MayNamedAccess(js_object, name, v8::ACCESS_SET)) { 4999 !isolate->MayNamedAccess(js_object, name, v8::ACCESS_SET)) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
5042 Runtime::DefineObjectProperty( 5042 Runtime::DefineObjectProperty(
5043 js_object, name, obj_value, attr, 5043 js_object, name, obj_value, attr,
5044 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED)); 5044 JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED));
5045 return *result; 5045 return *result;
5046 } 5046 }
5047 5047
5048 5048
5049 // Return property without being observable by accessors or interceptors. 5049 // Return property without being observable by accessors or interceptors.
5050 RUNTIME_FUNCTION(Runtime_GetDataProperty) { 5050 RUNTIME_FUNCTION(Runtime_GetDataProperty) {
5051 HandleScope scope(isolate); 5051 HandleScope scope(isolate);
5052 ASSERT(args.length() == 2); 5052 DCHECK(args.length() == 2);
5053 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 5053 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
5054 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5054 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5055 return *JSObject::GetDataProperty(object, key); 5055 return *JSObject::GetDataProperty(object, key);
5056 } 5056 }
5057 5057
5058 5058
5059 MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate, 5059 MaybeHandle<Object> Runtime::SetObjectProperty(Isolate* isolate,
5060 Handle<Object> object, 5060 Handle<Object> object,
5061 Handle<Object> key, 5061 Handle<Object> key,
5062 Handle<Object> value, 5062 Handle<Object> value,
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after
5265 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2); 5265 CONVERT_ARG_HANDLE_CHECKED(Object, value, 2);
5266 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3); 5266 CONVERT_SMI_ARG_CHECKED(unchecked_attributes, 3);
5267 RUNTIME_ASSERT( 5267 RUNTIME_ASSERT(
5268 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0); 5268 (unchecked_attributes & ~(READ_ONLY | DONT_ENUM | DONT_DELETE)) == 0);
5269 // Compute attributes. 5269 // Compute attributes.
5270 PropertyAttributes attributes = 5270 PropertyAttributes attributes =
5271 static_cast<PropertyAttributes>(unchecked_attributes); 5271 static_cast<PropertyAttributes>(unchecked_attributes);
5272 5272
5273 #ifdef DEBUG 5273 #ifdef DEBUG
5274 uint32_t index = 0; 5274 uint32_t index = 0;
5275 ASSERT(!key->ToArrayIndex(&index)); 5275 DCHECK(!key->ToArrayIndex(&index));
5276 LookupIterator it(object, key, LookupIterator::CHECK_OWN_REAL); 5276 LookupIterator it(object, key, LookupIterator::CHECK_OWN_REAL);
5277 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); 5277 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it);
5278 ASSERT(maybe.has_value); 5278 DCHECK(maybe.has_value);
5279 RUNTIME_ASSERT(!it.IsFound()); 5279 RUNTIME_ASSERT(!it.IsFound());
5280 #endif 5280 #endif
5281 5281
5282 Handle<Object> result; 5282 Handle<Object> result;
5283 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5283 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5284 isolate, result, 5284 isolate, result,
5285 JSObject::SetOwnPropertyIgnoreAttributes(object, key, value, attributes)); 5285 JSObject::SetOwnPropertyIgnoreAttributes(object, key, value, attributes));
5286 return *result; 5286 return *result;
5287 } 5287 }
5288 5288
(...skipping 11 matching lines...) Expand all
5300 // Compute attributes. 5300 // Compute attributes.
5301 PropertyAttributes attributes = 5301 PropertyAttributes attributes =
5302 static_cast<PropertyAttributes>(unchecked_attributes); 5302 static_cast<PropertyAttributes>(unchecked_attributes);
5303 5303
5304 #ifdef DEBUG 5304 #ifdef DEBUG
5305 bool duplicate; 5305 bool duplicate;
5306 if (key->IsName()) { 5306 if (key->IsName()) {
5307 LookupIterator it(object, Handle<Name>::cast(key), 5307 LookupIterator it(object, Handle<Name>::cast(key),
5308 LookupIterator::CHECK_OWN_REAL); 5308 LookupIterator::CHECK_OWN_REAL);
5309 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); 5309 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it);
5310 ASSERT(maybe.has_value); 5310 DCHECK(maybe.has_value);
5311 duplicate = it.IsFound(); 5311 duplicate = it.IsFound();
5312 } else { 5312 } else {
5313 uint32_t index = 0; 5313 uint32_t index = 0;
5314 RUNTIME_ASSERT(key->ToArrayIndex(&index)); 5314 RUNTIME_ASSERT(key->ToArrayIndex(&index));
5315 Maybe<bool> maybe = JSReceiver::HasOwnElement(object, index); 5315 Maybe<bool> maybe = JSReceiver::HasOwnElement(object, index);
5316 if (!maybe.has_value) return isolate->heap()->exception(); 5316 if (!maybe.has_value) return isolate->heap()->exception();
5317 duplicate = maybe.value; 5317 duplicate = maybe.value;
5318 } 5318 }
5319 if (duplicate) { 5319 if (duplicate) {
5320 Handle<Object> args[1] = { key }; 5320 Handle<Object> args[1] = { key };
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
5402 Object* raw_literal_cell = literals->get(literal_index); 5402 Object* raw_literal_cell = literals->get(literal_index);
5403 JSArray* boilerplate = NULL; 5403 JSArray* boilerplate = NULL;
5404 if (raw_literal_cell->IsAllocationSite()) { 5404 if (raw_literal_cell->IsAllocationSite()) {
5405 AllocationSite* site = AllocationSite::cast(raw_literal_cell); 5405 AllocationSite* site = AllocationSite::cast(raw_literal_cell);
5406 boilerplate = JSArray::cast(site->transition_info()); 5406 boilerplate = JSArray::cast(site->transition_info());
5407 } else { 5407 } else {
5408 boilerplate = JSArray::cast(raw_literal_cell); 5408 boilerplate = JSArray::cast(raw_literal_cell);
5409 } 5409 }
5410 Handle<JSArray> boilerplate_object(boilerplate); 5410 Handle<JSArray> boilerplate_object(boilerplate);
5411 ElementsKind elements_kind = object->GetElementsKind(); 5411 ElementsKind elements_kind = object->GetElementsKind();
5412 ASSERT(IsFastElementsKind(elements_kind)); 5412 DCHECK(IsFastElementsKind(elements_kind));
5413 // Smis should never trigger transitions. 5413 // Smis should never trigger transitions.
5414 ASSERT(!value->IsSmi()); 5414 DCHECK(!value->IsSmi());
5415 5415
5416 if (value->IsNumber()) { 5416 if (value->IsNumber()) {
5417 ASSERT(IsFastSmiElementsKind(elements_kind)); 5417 DCHECK(IsFastSmiElementsKind(elements_kind));
5418 ElementsKind transitioned_kind = IsFastHoleyElementsKind(elements_kind) 5418 ElementsKind transitioned_kind = IsFastHoleyElementsKind(elements_kind)
5419 ? FAST_HOLEY_DOUBLE_ELEMENTS 5419 ? FAST_HOLEY_DOUBLE_ELEMENTS
5420 : FAST_DOUBLE_ELEMENTS; 5420 : FAST_DOUBLE_ELEMENTS;
5421 if (IsMoreGeneralElementsKindTransition( 5421 if (IsMoreGeneralElementsKindTransition(
5422 boilerplate_object->GetElementsKind(), 5422 boilerplate_object->GetElementsKind(),
5423 transitioned_kind)) { 5423 transitioned_kind)) {
5424 JSObject::TransitionElementsKind(boilerplate_object, transitioned_kind); 5424 JSObject::TransitionElementsKind(boilerplate_object, transitioned_kind);
5425 } 5425 }
5426 JSObject::TransitionElementsKind(object, transitioned_kind); 5426 JSObject::TransitionElementsKind(object, transitioned_kind);
5427 ASSERT(IsFastDoubleElementsKind(object->GetElementsKind())); 5427 DCHECK(IsFastDoubleElementsKind(object->GetElementsKind()));
5428 FixedDoubleArray* double_array = FixedDoubleArray::cast(object->elements()); 5428 FixedDoubleArray* double_array = FixedDoubleArray::cast(object->elements());
5429 HeapNumber* number = HeapNumber::cast(*value); 5429 HeapNumber* number = HeapNumber::cast(*value);
5430 double_array->set(store_index, number->Number()); 5430 double_array->set(store_index, number->Number());
5431 } else { 5431 } else {
5432 if (!IsFastObjectElementsKind(elements_kind)) { 5432 if (!IsFastObjectElementsKind(elements_kind)) {
5433 ElementsKind transitioned_kind = IsFastHoleyElementsKind(elements_kind) 5433 ElementsKind transitioned_kind = IsFastHoleyElementsKind(elements_kind)
5434 ? FAST_HOLEY_ELEMENTS 5434 ? FAST_HOLEY_ELEMENTS
5435 : FAST_ELEMENTS; 5435 : FAST_ELEMENTS;
5436 JSObject::TransitionElementsKind(object, transitioned_kind); 5436 JSObject::TransitionElementsKind(object, transitioned_kind);
5437 ElementsKind boilerplate_elements_kind = 5437 ElementsKind boilerplate_elements_kind =
5438 boilerplate_object->GetElementsKind(); 5438 boilerplate_object->GetElementsKind();
5439 if (IsMoreGeneralElementsKindTransition(boilerplate_elements_kind, 5439 if (IsMoreGeneralElementsKindTransition(boilerplate_elements_kind,
5440 transitioned_kind)) { 5440 transitioned_kind)) {
5441 JSObject::TransitionElementsKind(boilerplate_object, transitioned_kind); 5441 JSObject::TransitionElementsKind(boilerplate_object, transitioned_kind);
5442 } 5442 }
5443 } 5443 }
5444 FixedArray* object_array = FixedArray::cast(object->elements()); 5444 FixedArray* object_array = FixedArray::cast(object->elements());
5445 object_array->set(store_index, *value); 5445 object_array->set(store_index, *value);
5446 } 5446 }
5447 return *object; 5447 return *object;
5448 } 5448 }
5449 5449
5450 5450
5451 // Check whether debugger and is about to step into the callback that is passed 5451 // Check whether debugger and is about to step into the callback that is passed
5452 // to a built-in function such as Array.forEach. 5452 // to a built-in function such as Array.forEach.
5453 RUNTIME_FUNCTION(Runtime_DebugCallbackSupportsStepping) { 5453 RUNTIME_FUNCTION(Runtime_DebugCallbackSupportsStepping) {
5454 ASSERT(args.length() == 1); 5454 DCHECK(args.length() == 1);
5455 if (!isolate->debug()->is_active() || !isolate->debug()->StepInActive()) { 5455 if (!isolate->debug()->is_active() || !isolate->debug()->StepInActive()) {
5456 return isolate->heap()->false_value(); 5456 return isolate->heap()->false_value();
5457 } 5457 }
5458 CONVERT_ARG_CHECKED(Object, callback, 0); 5458 CONVERT_ARG_CHECKED(Object, callback, 0);
5459 // We do not step into the callback if it's a builtin or not even a function. 5459 // We do not step into the callback if it's a builtin or not even a function.
5460 return isolate->heap()->ToBoolean( 5460 return isolate->heap()->ToBoolean(
5461 callback->IsJSFunction() && !JSFunction::cast(callback)->IsBuiltin()); 5461 callback->IsJSFunction() && !JSFunction::cast(callback)->IsBuiltin());
5462 } 5462 }
5463 5463
5464 5464
5465 // Set one shot breakpoints for the callback function that is passed to a 5465 // Set one shot breakpoints for the callback function that is passed to a
5466 // built-in function such as Array.forEach to enable stepping into the callback. 5466 // built-in function such as Array.forEach to enable stepping into the callback.
5467 RUNTIME_FUNCTION(Runtime_DebugPrepareStepInIfStepping) { 5467 RUNTIME_FUNCTION(Runtime_DebugPrepareStepInIfStepping) {
5468 ASSERT(args.length() == 1); 5468 DCHECK(args.length() == 1);
5469 Debug* debug = isolate->debug(); 5469 Debug* debug = isolate->debug();
5470 if (!debug->IsStepping()) return isolate->heap()->undefined_value(); 5470 if (!debug->IsStepping()) return isolate->heap()->undefined_value();
5471 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callback, 0); 5471 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callback, 0);
5472 HandleScope scope(isolate); 5472 HandleScope scope(isolate);
5473 // When leaving the callback, step out has been activated, but not performed 5473 // When leaving the callback, step out has been activated, but not performed
5474 // if we do not leave the builtin. To be able to step into the callback 5474 // if we do not leave the builtin. To be able to step into the callback
5475 // again, we need to clear the step out at this point. 5475 // again, we need to clear the step out at this point.
5476 debug->ClearStepOut(); 5476 debug->ClearStepOut();
5477 debug->FloodWithOneShot(callback); 5477 debug->FloodWithOneShot(callback);
5478 return isolate->heap()->undefined_value(); 5478 return isolate->heap()->undefined_value();
5479 } 5479 }
5480 5480
5481 5481
5482 // The argument is a closure that is kept until the epilogue is called. 5482 // The argument is a closure that is kept until the epilogue is called.
5483 // On exception, the closure is called, which returns the promise if the 5483 // On exception, the closure is called, which returns the promise if the
5484 // exception is considered uncaught, or undefined otherwise. 5484 // exception is considered uncaught, or undefined otherwise.
5485 RUNTIME_FUNCTION(Runtime_DebugPromiseHandlePrologue) { 5485 RUNTIME_FUNCTION(Runtime_DebugPromiseHandlePrologue) {
5486 ASSERT(args.length() == 1); 5486 DCHECK(args.length() == 1);
5487 HandleScope scope(isolate); 5487 HandleScope scope(isolate);
5488 CONVERT_ARG_HANDLE_CHECKED(JSFunction, promise_getter, 0); 5488 CONVERT_ARG_HANDLE_CHECKED(JSFunction, promise_getter, 0);
5489 isolate->debug()->PromiseHandlePrologue(promise_getter); 5489 isolate->debug()->PromiseHandlePrologue(promise_getter);
5490 return isolate->heap()->undefined_value(); 5490 return isolate->heap()->undefined_value();
5491 } 5491 }
5492 5492
5493 5493
5494 RUNTIME_FUNCTION(Runtime_DebugPromiseHandleEpilogue) { 5494 RUNTIME_FUNCTION(Runtime_DebugPromiseHandleEpilogue) {
5495 ASSERT(args.length() == 0); 5495 DCHECK(args.length() == 0);
5496 SealHandleScope shs(isolate); 5496 SealHandleScope shs(isolate);
5497 isolate->debug()->PromiseHandleEpilogue(); 5497 isolate->debug()->PromiseHandleEpilogue();
5498 return isolate->heap()->undefined_value(); 5498 return isolate->heap()->undefined_value();
5499 } 5499 }
5500 5500
5501 5501
5502 RUNTIME_FUNCTION(Runtime_DebugPromiseEvent) { 5502 RUNTIME_FUNCTION(Runtime_DebugPromiseEvent) {
5503 ASSERT(args.length() == 1); 5503 DCHECK(args.length() == 1);
5504 HandleScope scope(isolate); 5504 HandleScope scope(isolate);
5505 CONVERT_ARG_HANDLE_CHECKED(JSObject, data, 0); 5505 CONVERT_ARG_HANDLE_CHECKED(JSObject, data, 0);
5506 isolate->debug()->OnPromiseEvent(data); 5506 isolate->debug()->OnPromiseEvent(data);
5507 return isolate->heap()->undefined_value(); 5507 return isolate->heap()->undefined_value();
5508 } 5508 }
5509 5509
5510 5510
5511 RUNTIME_FUNCTION(Runtime_DebugAsyncTaskEvent) { 5511 RUNTIME_FUNCTION(Runtime_DebugAsyncTaskEvent) {
5512 ASSERT(args.length() == 1); 5512 DCHECK(args.length() == 1);
5513 HandleScope scope(isolate); 5513 HandleScope scope(isolate);
5514 CONVERT_ARG_HANDLE_CHECKED(JSObject, data, 0); 5514 CONVERT_ARG_HANDLE_CHECKED(JSObject, data, 0);
5515 isolate->debug()->OnAsyncTaskEvent(data); 5515 isolate->debug()->OnAsyncTaskEvent(data);
5516 return isolate->heap()->undefined_value(); 5516 return isolate->heap()->undefined_value();
5517 } 5517 }
5518 5518
5519 5519
5520 RUNTIME_FUNCTION(Runtime_DeleteProperty) { 5520 RUNTIME_FUNCTION(Runtime_DeleteProperty) {
5521 HandleScope scope(isolate); 5521 HandleScope scope(isolate);
5522 ASSERT(args.length() == 3); 5522 DCHECK(args.length() == 3);
5523 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); 5523 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0);
5524 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5524 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5525 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2); 5525 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 2);
5526 JSReceiver::DeleteMode delete_mode = strict_mode == STRICT 5526 JSReceiver::DeleteMode delete_mode = strict_mode == STRICT
5527 ? JSReceiver::STRICT_DELETION : JSReceiver::NORMAL_DELETION; 5527 ? JSReceiver::STRICT_DELETION : JSReceiver::NORMAL_DELETION;
5528 Handle<Object> result; 5528 Handle<Object> result;
5529 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5529 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5530 isolate, result, 5530 isolate, result,
5531 JSReceiver::DeleteProperty(object, key, delete_mode)); 5531 JSReceiver::DeleteProperty(object, key, delete_mode));
5532 return *result; 5532 return *result;
(...skipping 20 matching lines...) Expand all
5553 isolate, Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)), 5553 isolate, Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)),
5554 key); 5554 key);
5555 } 5555 }
5556 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 5556 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
5557 return isolate->heap()->false_value(); 5557 return isolate->heap()->false_value();
5558 } 5558 }
5559 5559
5560 5560
5561 RUNTIME_FUNCTION(Runtime_HasOwnProperty) { 5561 RUNTIME_FUNCTION(Runtime_HasOwnProperty) {
5562 HandleScope scope(isolate); 5562 HandleScope scope(isolate);
5563 ASSERT(args.length() == 2); 5563 DCHECK(args.length() == 2);
5564 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0) 5564 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0)
5565 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5565 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5566 5566
5567 uint32_t index; 5567 uint32_t index;
5568 const bool key_is_array_index = key->AsArrayIndex(&index); 5568 const bool key_is_array_index = key->AsArrayIndex(&index);
5569 5569
5570 // Only JS objects can have properties. 5570 // Only JS objects can have properties.
5571 if (object->IsJSObject()) { 5571 if (object->IsJSObject()) {
5572 Handle<JSObject> js_obj = Handle<JSObject>::cast(object); 5572 Handle<JSObject> js_obj = Handle<JSObject>::cast(object);
5573 // Fast case: either the key is a real named property or it is not 5573 // Fast case: either the key is a real named property or it is not
5574 // an array index and there are no interceptors or hidden 5574 // an array index and there are no interceptors or hidden
5575 // prototypes. 5575 // prototypes.
5576 Maybe<bool> maybe = JSObject::HasRealNamedProperty(js_obj, key); 5576 Maybe<bool> maybe = JSObject::HasRealNamedProperty(js_obj, key);
5577 if (!maybe.has_value) return isolate->heap()->exception(); 5577 if (!maybe.has_value) return isolate->heap()->exception();
5578 ASSERT(!isolate->has_pending_exception()); 5578 DCHECK(!isolate->has_pending_exception());
5579 if (maybe.value) { 5579 if (maybe.value) {
5580 return isolate->heap()->true_value(); 5580 return isolate->heap()->true_value();
5581 } 5581 }
5582 Map* map = js_obj->map(); 5582 Map* map = js_obj->map();
5583 if (!key_is_array_index && 5583 if (!key_is_array_index &&
5584 !map->has_named_interceptor() && 5584 !map->has_named_interceptor() &&
5585 !HeapObject::cast(map->prototype())->map()->is_hidden_prototype()) { 5585 !HeapObject::cast(map->prototype())->map()->is_hidden_prototype()) {
5586 return isolate->heap()->false_value(); 5586 return isolate->heap()->false_value();
5587 } 5587 }
5588 // Slow case. 5588 // Slow case.
5589 return HasOwnPropertyImplementation(isolate, 5589 return HasOwnPropertyImplementation(isolate,
5590 Handle<JSObject>(js_obj), 5590 Handle<JSObject>(js_obj),
5591 Handle<Name>(key)); 5591 Handle<Name>(key));
5592 } else if (object->IsString() && key_is_array_index) { 5592 } else if (object->IsString() && key_is_array_index) {
5593 // Well, there is one exception: Handle [] on strings. 5593 // Well, there is one exception: Handle [] on strings.
5594 Handle<String> string = Handle<String>::cast(object); 5594 Handle<String> string = Handle<String>::cast(object);
5595 if (index < static_cast<uint32_t>(string->length())) { 5595 if (index < static_cast<uint32_t>(string->length())) {
5596 return isolate->heap()->true_value(); 5596 return isolate->heap()->true_value();
5597 } 5597 }
5598 } 5598 }
5599 return isolate->heap()->false_value(); 5599 return isolate->heap()->false_value();
5600 } 5600 }
5601 5601
5602 5602
5603 RUNTIME_FUNCTION(Runtime_HasProperty) { 5603 RUNTIME_FUNCTION(Runtime_HasProperty) {
5604 HandleScope scope(isolate); 5604 HandleScope scope(isolate);
5605 ASSERT(args.length() == 2); 5605 DCHECK(args.length() == 2);
5606 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); 5606 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0);
5607 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5607 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5608 5608
5609 Maybe<bool> maybe = JSReceiver::HasProperty(receiver, key); 5609 Maybe<bool> maybe = JSReceiver::HasProperty(receiver, key);
5610 if (!maybe.has_value) return isolate->heap()->exception(); 5610 if (!maybe.has_value) return isolate->heap()->exception();
5611 return isolate->heap()->ToBoolean(maybe.value); 5611 return isolate->heap()->ToBoolean(maybe.value);
5612 } 5612 }
5613 5613
5614 5614
5615 RUNTIME_FUNCTION(Runtime_HasElement) { 5615 RUNTIME_FUNCTION(Runtime_HasElement) {
5616 HandleScope scope(isolate); 5616 HandleScope scope(isolate);
5617 ASSERT(args.length() == 2); 5617 DCHECK(args.length() == 2);
5618 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); 5618 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0);
5619 CONVERT_SMI_ARG_CHECKED(index, 1); 5619 CONVERT_SMI_ARG_CHECKED(index, 1);
5620 5620
5621 Maybe<bool> maybe = JSReceiver::HasElement(receiver, index); 5621 Maybe<bool> maybe = JSReceiver::HasElement(receiver, index);
5622 if (!maybe.has_value) return isolate->heap()->exception(); 5622 if (!maybe.has_value) return isolate->heap()->exception();
5623 return isolate->heap()->ToBoolean(maybe.value); 5623 return isolate->heap()->ToBoolean(maybe.value);
5624 } 5624 }
5625 5625
5626 5626
5627 RUNTIME_FUNCTION(Runtime_IsPropertyEnumerable) { 5627 RUNTIME_FUNCTION(Runtime_IsPropertyEnumerable) {
5628 HandleScope scope(isolate); 5628 HandleScope scope(isolate);
5629 ASSERT(args.length() == 2); 5629 DCHECK(args.length() == 2);
5630 5630
5631 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 5631 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
5632 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1); 5632 CONVERT_ARG_HANDLE_CHECKED(Name, key, 1);
5633 5633
5634 Maybe<PropertyAttributes> maybe = 5634 Maybe<PropertyAttributes> maybe =
5635 JSReceiver::GetOwnPropertyAttributes(object, key); 5635 JSReceiver::GetOwnPropertyAttributes(object, key);
5636 if (!maybe.has_value) return isolate->heap()->exception(); 5636 if (!maybe.has_value) return isolate->heap()->exception();
5637 if (maybe.value == ABSENT) maybe.value = DONT_ENUM; 5637 if (maybe.value == ABSENT) maybe.value = DONT_ENUM;
5638 return isolate->heap()->ToBoolean((maybe.value & DONT_ENUM) == 0); 5638 return isolate->heap()->ToBoolean((maybe.value & DONT_ENUM) == 0);
5639 } 5639 }
5640 5640
5641 5641
5642 RUNTIME_FUNCTION(Runtime_GetPropertyNames) { 5642 RUNTIME_FUNCTION(Runtime_GetPropertyNames) {
5643 HandleScope scope(isolate); 5643 HandleScope scope(isolate);
5644 ASSERT(args.length() == 1); 5644 DCHECK(args.length() == 1);
5645 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0); 5645 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, object, 0);
5646 Handle<JSArray> result; 5646 Handle<JSArray> result;
5647 5647
5648 isolate->counters()->for_in()->Increment(); 5648 isolate->counters()->for_in()->Increment();
5649 Handle<FixedArray> elements; 5649 Handle<FixedArray> elements;
5650 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5650 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5651 isolate, elements, 5651 isolate, elements,
5652 JSReceiver::GetKeys(object, JSReceiver::INCLUDE_PROTOS)); 5652 JSReceiver::GetKeys(object, JSReceiver::INCLUDE_PROTOS));
5653 return *isolate->factory()->NewJSArrayWithElements(elements); 5653 return *isolate->factory()->NewJSArrayWithElements(elements);
5654 } 5654 }
5655 5655
5656 5656
5657 // Returns either a FixedArray as Runtime_GetPropertyNames, 5657 // Returns either a FixedArray as Runtime_GetPropertyNames,
5658 // or, if the given object has an enum cache that contains 5658 // or, if the given object has an enum cache that contains
5659 // all enumerable properties of the object and its prototypes 5659 // all enumerable properties of the object and its prototypes
5660 // have none, the map of the object. This is used to speed up 5660 // have none, the map of the object. This is used to speed up
5661 // the check for deletions during a for-in. 5661 // the check for deletions during a for-in.
5662 RUNTIME_FUNCTION(Runtime_GetPropertyNamesFast) { 5662 RUNTIME_FUNCTION(Runtime_GetPropertyNamesFast) {
5663 SealHandleScope shs(isolate); 5663 SealHandleScope shs(isolate);
5664 ASSERT(args.length() == 1); 5664 DCHECK(args.length() == 1);
5665 5665
5666 CONVERT_ARG_CHECKED(JSReceiver, raw_object, 0); 5666 CONVERT_ARG_CHECKED(JSReceiver, raw_object, 0);
5667 5667
5668 if (raw_object->IsSimpleEnum()) return raw_object->map(); 5668 if (raw_object->IsSimpleEnum()) return raw_object->map();
5669 5669
5670 HandleScope scope(isolate); 5670 HandleScope scope(isolate);
5671 Handle<JSReceiver> object(raw_object); 5671 Handle<JSReceiver> object(raw_object);
5672 Handle<FixedArray> content; 5672 Handle<FixedArray> content;
5673 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 5673 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
5674 isolate, content, 5674 isolate, content,
(...skipping 17 matching lines...) Expand all
5692 } 5692 }
5693 return count; 5693 return count;
5694 } 5694 }
5695 5695
5696 5696
5697 // Return the names of the own named properties. 5697 // Return the names of the own named properties.
5698 // args[0]: object 5698 // args[0]: object
5699 // args[1]: PropertyAttributes as int 5699 // args[1]: PropertyAttributes as int
5700 RUNTIME_FUNCTION(Runtime_GetOwnPropertyNames) { 5700 RUNTIME_FUNCTION(Runtime_GetOwnPropertyNames) {
5701 HandleScope scope(isolate); 5701 HandleScope scope(isolate);
5702 ASSERT(args.length() == 2); 5702 DCHECK(args.length() == 2);
5703 if (!args[0]->IsJSObject()) { 5703 if (!args[0]->IsJSObject()) {
5704 return isolate->heap()->undefined_value(); 5704 return isolate->heap()->undefined_value();
5705 } 5705 }
5706 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 5706 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
5707 CONVERT_SMI_ARG_CHECKED(filter_value, 1); 5707 CONVERT_SMI_ARG_CHECKED(filter_value, 1);
5708 PropertyAttributes filter = static_cast<PropertyAttributes>(filter_value); 5708 PropertyAttributes filter = static_cast<PropertyAttributes>(filter_value);
5709 5709
5710 // Skip the global proxy as it has no properties and always delegates to the 5710 // Skip the global proxy as it has no properties and always delegates to the
5711 // real global object. 5711 // real global object.
5712 if (obj->IsJSGlobalProxy()) { 5712 if (obj->IsJSGlobalProxy()) {
(...skipping 11 matching lines...) Expand all
5724 5724
5725 // Find the number of objects making up this. 5725 // Find the number of objects making up this.
5726 int length = OwnPrototypeChainLength(*obj); 5726 int length = OwnPrototypeChainLength(*obj);
5727 5727
5728 // Find the number of own properties for each of the objects. 5728 // Find the number of own properties for each of the objects.
5729 ScopedVector<int> own_property_count(length); 5729 ScopedVector<int> own_property_count(length);
5730 int total_property_count = 0; 5730 int total_property_count = 0;
5731 { 5731 {
5732 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER); 5732 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER);
5733 for (int i = 0; i < length; i++) { 5733 for (int i = 0; i < length; i++) {
5734 ASSERT(!iter.IsAtEnd()); 5734 DCHECK(!iter.IsAtEnd());
5735 Handle<JSObject> jsproto = 5735 Handle<JSObject> jsproto =
5736 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)); 5736 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter));
5737 // Only collect names if access is permitted. 5737 // Only collect names if access is permitted.
5738 if (jsproto->IsAccessCheckNeeded() && 5738 if (jsproto->IsAccessCheckNeeded() &&
5739 !isolate->MayNamedAccess(jsproto, 5739 !isolate->MayNamedAccess(jsproto,
5740 isolate->factory()->undefined_value(), 5740 isolate->factory()->undefined_value(),
5741 v8::ACCESS_KEYS)) { 5741 v8::ACCESS_KEYS)) {
5742 isolate->ReportFailedAccessCheck(jsproto, v8::ACCESS_KEYS); 5742 isolate->ReportFailedAccessCheck(jsproto, v8::ACCESS_KEYS);
5743 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 5743 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
5744 return *isolate->factory()->NewJSArray(0); 5744 return *isolate->factory()->NewJSArray(0);
5745 } 5745 }
5746 int n; 5746 int n;
5747 n = jsproto->NumberOfOwnProperties(filter); 5747 n = jsproto->NumberOfOwnProperties(filter);
5748 own_property_count[i] = n; 5748 own_property_count[i] = n;
5749 total_property_count += n; 5749 total_property_count += n;
5750 iter.Advance(); 5750 iter.Advance();
5751 } 5751 }
5752 } 5752 }
5753 5753
5754 // Allocate an array with storage for all the property names. 5754 // Allocate an array with storage for all the property names.
5755 Handle<FixedArray> names = 5755 Handle<FixedArray> names =
5756 isolate->factory()->NewFixedArray(total_property_count); 5756 isolate->factory()->NewFixedArray(total_property_count);
5757 5757
5758 // Get the property names. 5758 // Get the property names.
5759 int next_copy_index = 0; 5759 int next_copy_index = 0;
5760 int hidden_strings = 0; 5760 int hidden_strings = 0;
5761 { 5761 {
5762 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER); 5762 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER);
5763 for (int i = 0; i < length; i++) { 5763 for (int i = 0; i < length; i++) {
5764 ASSERT(!iter.IsAtEnd()); 5764 DCHECK(!iter.IsAtEnd());
5765 Handle<JSObject> jsproto = 5765 Handle<JSObject> jsproto =
5766 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)); 5766 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter));
5767 jsproto->GetOwnPropertyNames(*names, next_copy_index, filter); 5767 jsproto->GetOwnPropertyNames(*names, next_copy_index, filter);
5768 if (i > 0) { 5768 if (i > 0) {
5769 // Names from hidden prototypes may already have been added 5769 // Names from hidden prototypes may already have been added
5770 // for inherited function template instances. Count the duplicates 5770 // for inherited function template instances. Count the duplicates
5771 // and stub them out; the final copy pass at the end ignores holes. 5771 // and stub them out; the final copy pass at the end ignores holes.
5772 for (int j = next_copy_index; 5772 for (int j = next_copy_index;
5773 j < next_copy_index + own_property_count[i]; j++) { 5773 j < next_copy_index + own_property_count[i]; j++) {
5774 Object* name_from_hidden_proto = names->get(j); 5774 Object* name_from_hidden_proto = names->get(j);
(...skipping 27 matching lines...) Expand all
5802 names->length() - hidden_strings); 5802 names->length() - hidden_strings);
5803 int dest_pos = 0; 5803 int dest_pos = 0;
5804 for (int i = 0; i < total_property_count; i++) { 5804 for (int i = 0; i < total_property_count; i++) {
5805 Object* name = old_names->get(i); 5805 Object* name = old_names->get(i);
5806 if (name == isolate->heap()->hidden_string()) { 5806 if (name == isolate->heap()->hidden_string()) {
5807 hidden_strings--; 5807 hidden_strings--;
5808 continue; 5808 continue;
5809 } 5809 }
5810 names->set(dest_pos++, name); 5810 names->set(dest_pos++, name);
5811 } 5811 }
5812 ASSERT_EQ(0, hidden_strings); 5812 DCHECK_EQ(0, hidden_strings);
5813 } 5813 }
5814 5814
5815 return *isolate->factory()->NewJSArrayWithElements(names); 5815 return *isolate->factory()->NewJSArrayWithElements(names);
5816 } 5816 }
5817 5817
5818 5818
5819 // Return the names of the own indexed properties. 5819 // Return the names of the own indexed properties.
5820 // args[0]: object 5820 // args[0]: object
5821 RUNTIME_FUNCTION(Runtime_GetOwnElementNames) { 5821 RUNTIME_FUNCTION(Runtime_GetOwnElementNames) {
5822 HandleScope scope(isolate); 5822 HandleScope scope(isolate);
5823 ASSERT(args.length() == 1); 5823 DCHECK(args.length() == 1);
5824 if (!args[0]->IsJSObject()) { 5824 if (!args[0]->IsJSObject()) {
5825 return isolate->heap()->undefined_value(); 5825 return isolate->heap()->undefined_value();
5826 } 5826 }
5827 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 5827 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
5828 5828
5829 int n = obj->NumberOfOwnElements(static_cast<PropertyAttributes>(NONE)); 5829 int n = obj->NumberOfOwnElements(static_cast<PropertyAttributes>(NONE));
5830 Handle<FixedArray> names = isolate->factory()->NewFixedArray(n); 5830 Handle<FixedArray> names = isolate->factory()->NewFixedArray(n);
5831 obj->GetOwnElementKeys(*names, static_cast<PropertyAttributes>(NONE)); 5831 obj->GetOwnElementKeys(*names, static_cast<PropertyAttributes>(NONE));
5832 return *isolate->factory()->NewJSArrayWithElements(names); 5832 return *isolate->factory()->NewJSArrayWithElements(names);
5833 } 5833 }
5834 5834
5835 5835
5836 // Return information on whether an object has a named or indexed interceptor. 5836 // Return information on whether an object has a named or indexed interceptor.
5837 // args[0]: object 5837 // args[0]: object
5838 RUNTIME_FUNCTION(Runtime_GetInterceptorInfo) { 5838 RUNTIME_FUNCTION(Runtime_GetInterceptorInfo) {
5839 HandleScope scope(isolate); 5839 HandleScope scope(isolate);
5840 ASSERT(args.length() == 1); 5840 DCHECK(args.length() == 1);
5841 if (!args[0]->IsJSObject()) { 5841 if (!args[0]->IsJSObject()) {
5842 return Smi::FromInt(0); 5842 return Smi::FromInt(0);
5843 } 5843 }
5844 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 5844 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
5845 5845
5846 int result = 0; 5846 int result = 0;
5847 if (obj->HasNamedInterceptor()) result |= 2; 5847 if (obj->HasNamedInterceptor()) result |= 2;
5848 if (obj->HasIndexedInterceptor()) result |= 1; 5848 if (obj->HasIndexedInterceptor()) result |= 1;
5849 5849
5850 return Smi::FromInt(result); 5850 return Smi::FromInt(result);
5851 } 5851 }
5852 5852
5853 5853
5854 // Return property names from named interceptor. 5854 // Return property names from named interceptor.
5855 // args[0]: object 5855 // args[0]: object
5856 RUNTIME_FUNCTION(Runtime_GetNamedInterceptorPropertyNames) { 5856 RUNTIME_FUNCTION(Runtime_GetNamedInterceptorPropertyNames) {
5857 HandleScope scope(isolate); 5857 HandleScope scope(isolate);
5858 ASSERT(args.length() == 1); 5858 DCHECK(args.length() == 1);
5859 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 5859 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
5860 5860
5861 if (obj->HasNamedInterceptor()) { 5861 if (obj->HasNamedInterceptor()) {
5862 Handle<JSObject> result; 5862 Handle<JSObject> result;
5863 if (JSObject::GetKeysForNamedInterceptor(obj, obj).ToHandle(&result)) { 5863 if (JSObject::GetKeysForNamedInterceptor(obj, obj).ToHandle(&result)) {
5864 return *result; 5864 return *result;
5865 } 5865 }
5866 } 5866 }
5867 return isolate->heap()->undefined_value(); 5867 return isolate->heap()->undefined_value();
5868 } 5868 }
5869 5869
5870 5870
5871 // Return element names from indexed interceptor. 5871 // Return element names from indexed interceptor.
5872 // args[0]: object 5872 // args[0]: object
5873 RUNTIME_FUNCTION(Runtime_GetIndexedInterceptorElementNames) { 5873 RUNTIME_FUNCTION(Runtime_GetIndexedInterceptorElementNames) {
5874 HandleScope scope(isolate); 5874 HandleScope scope(isolate);
5875 ASSERT(args.length() == 1); 5875 DCHECK(args.length() == 1);
5876 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 5876 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
5877 5877
5878 if (obj->HasIndexedInterceptor()) { 5878 if (obj->HasIndexedInterceptor()) {
5879 Handle<JSObject> result; 5879 Handle<JSObject> result;
5880 if (JSObject::GetKeysForIndexedInterceptor(obj, obj).ToHandle(&result)) { 5880 if (JSObject::GetKeysForIndexedInterceptor(obj, obj).ToHandle(&result)) {
5881 return *result; 5881 return *result;
5882 } 5882 }
5883 } 5883 }
5884 return isolate->heap()->undefined_value(); 5884 return isolate->heap()->undefined_value();
5885 } 5885 }
5886 5886
5887 5887
5888 RUNTIME_FUNCTION(Runtime_OwnKeys) { 5888 RUNTIME_FUNCTION(Runtime_OwnKeys) {
5889 HandleScope scope(isolate); 5889 HandleScope scope(isolate);
5890 ASSERT(args.length() == 1); 5890 DCHECK(args.length() == 1);
5891 CONVERT_ARG_CHECKED(JSObject, raw_object, 0); 5891 CONVERT_ARG_CHECKED(JSObject, raw_object, 0);
5892 Handle<JSObject> object(raw_object); 5892 Handle<JSObject> object(raw_object);
5893 5893
5894 if (object->IsJSGlobalProxy()) { 5894 if (object->IsJSGlobalProxy()) {
5895 // Do access checks before going to the global object. 5895 // Do access checks before going to the global object.
5896 if (object->IsAccessCheckNeeded() && 5896 if (object->IsAccessCheckNeeded() &&
5897 !isolate->MayNamedAccess( 5897 !isolate->MayNamedAccess(
5898 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { 5898 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) {
5899 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS); 5899 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS);
5900 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate); 5900 RETURN_FAILURE_IF_SCHEDULED_EXCEPTION(isolate);
(...skipping 14 matching lines...) Expand all
5915 // Some fast paths through GetKeysInFixedArrayFor reuse a cached 5915 // Some fast paths through GetKeysInFixedArrayFor reuse a cached
5916 // property array and since the result is mutable we have to create 5916 // property array and since the result is mutable we have to create
5917 // a fresh clone on each invocation. 5917 // a fresh clone on each invocation.
5918 int length = contents->length(); 5918 int length = contents->length();
5919 Handle<FixedArray> copy = isolate->factory()->NewFixedArray(length); 5919 Handle<FixedArray> copy = isolate->factory()->NewFixedArray(length);
5920 for (int i = 0; i < length; i++) { 5920 for (int i = 0; i < length; i++) {
5921 Object* entry = contents->get(i); 5921 Object* entry = contents->get(i);
5922 if (entry->IsString()) { 5922 if (entry->IsString()) {
5923 copy->set(i, entry); 5923 copy->set(i, entry);
5924 } else { 5924 } else {
5925 ASSERT(entry->IsNumber()); 5925 DCHECK(entry->IsNumber());
5926 HandleScope scope(isolate); 5926 HandleScope scope(isolate);
5927 Handle<Object> entry_handle(entry, isolate); 5927 Handle<Object> entry_handle(entry, isolate);
5928 Handle<Object> entry_str = 5928 Handle<Object> entry_str =
5929 isolate->factory()->NumberToString(entry_handle); 5929 isolate->factory()->NumberToString(entry_handle);
5930 copy->set(i, *entry_str); 5930 copy->set(i, *entry_str);
5931 } 5931 }
5932 } 5932 }
5933 return *isolate->factory()->NewJSArrayWithElements(copy); 5933 return *isolate->factory()->NewJSArrayWithElements(copy);
5934 } 5934 }
5935 5935
5936 5936
5937 RUNTIME_FUNCTION(Runtime_GetArgumentsProperty) { 5937 RUNTIME_FUNCTION(Runtime_GetArgumentsProperty) {
5938 SealHandleScope shs(isolate); 5938 SealHandleScope shs(isolate);
5939 ASSERT(args.length() == 1); 5939 DCHECK(args.length() == 1);
5940 CONVERT_ARG_HANDLE_CHECKED(Object, raw_key, 0); 5940 CONVERT_ARG_HANDLE_CHECKED(Object, raw_key, 0);
5941 5941
5942 // Compute the frame holding the arguments. 5942 // Compute the frame holding the arguments.
5943 JavaScriptFrameIterator it(isolate); 5943 JavaScriptFrameIterator it(isolate);
5944 it.AdvanceToArgumentsFrame(); 5944 it.AdvanceToArgumentsFrame();
5945 JavaScriptFrame* frame = it.frame(); 5945 JavaScriptFrame* frame = it.frame();
5946 5946
5947 // Get the actual number of provided arguments. 5947 // Get the actual number of provided arguments.
5948 const uint32_t n = frame->ComputeParametersCount(); 5948 const uint32_t n = frame->ComputeParametersCount();
5949 5949
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
6002 Handle<Object> result; 6002 Handle<Object> result;
6003 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6003 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6004 isolate, result, 6004 isolate, result,
6005 Object::GetProperty(isolate->initial_object_prototype(), key)); 6005 Object::GetProperty(isolate->initial_object_prototype(), key));
6006 return *result; 6006 return *result;
6007 } 6007 }
6008 6008
6009 6009
6010 RUNTIME_FUNCTION(Runtime_ToFastProperties) { 6010 RUNTIME_FUNCTION(Runtime_ToFastProperties) {
6011 HandleScope scope(isolate); 6011 HandleScope scope(isolate);
6012 ASSERT(args.length() == 1); 6012 DCHECK(args.length() == 1);
6013 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); 6013 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
6014 if (object->IsJSObject() && !object->IsGlobalObject()) { 6014 if (object->IsJSObject() && !object->IsGlobalObject()) {
6015 JSObject::MigrateSlowToFast(Handle<JSObject>::cast(object), 0); 6015 JSObject::MigrateSlowToFast(Handle<JSObject>::cast(object), 0);
6016 } 6016 }
6017 return *object; 6017 return *object;
6018 } 6018 }
6019 6019
6020 6020
6021 RUNTIME_FUNCTION(Runtime_ToBool) { 6021 RUNTIME_FUNCTION(Runtime_ToBool) {
6022 SealHandleScope shs(isolate); 6022 SealHandleScope shs(isolate);
6023 ASSERT(args.length() == 1); 6023 DCHECK(args.length() == 1);
6024 CONVERT_ARG_CHECKED(Object, object, 0); 6024 CONVERT_ARG_CHECKED(Object, object, 0);
6025 6025
6026 return isolate->heap()->ToBoolean(object->BooleanValue()); 6026 return isolate->heap()->ToBoolean(object->BooleanValue());
6027 } 6027 }
6028 6028
6029 6029
6030 // Returns the type string of a value; see ECMA-262, 11.4.3 (p 47). 6030 // Returns the type string of a value; see ECMA-262, 11.4.3 (p 47).
6031 // Possible optimizations: put the type string into the oddballs. 6031 // Possible optimizations: put the type string into the oddballs.
6032 RUNTIME_FUNCTION(Runtime_Typeof) { 6032 RUNTIME_FUNCTION(Runtime_Typeof) {
6033 SealHandleScope shs(isolate); 6033 SealHandleScope shs(isolate);
6034 ASSERT(args.length() == 1); 6034 DCHECK(args.length() == 1);
6035 CONVERT_ARG_CHECKED(Object, obj, 0); 6035 CONVERT_ARG_CHECKED(Object, obj, 0);
6036 if (obj->IsNumber()) return isolate->heap()->number_string(); 6036 if (obj->IsNumber()) return isolate->heap()->number_string();
6037 HeapObject* heap_obj = HeapObject::cast(obj); 6037 HeapObject* heap_obj = HeapObject::cast(obj);
6038 6038
6039 // typeof an undetectable object is 'undefined' 6039 // typeof an undetectable object is 'undefined'
6040 if (heap_obj->map()->is_undetectable()) { 6040 if (heap_obj->map()->is_undetectable()) {
6041 return isolate->heap()->undefined_string(); 6041 return isolate->heap()->undefined_string();
6042 } 6042 }
6043 6043
6044 InstanceType instance_type = heap_obj->map()->instance_type(); 6044 InstanceType instance_type = heap_obj->map()->instance_type();
6045 if (instance_type < FIRST_NONSTRING_TYPE) { 6045 if (instance_type < FIRST_NONSTRING_TYPE) {
6046 return isolate->heap()->string_string(); 6046 return isolate->heap()->string_string();
6047 } 6047 }
6048 6048
6049 switch (instance_type) { 6049 switch (instance_type) {
6050 case ODDBALL_TYPE: 6050 case ODDBALL_TYPE:
6051 if (heap_obj->IsTrue() || heap_obj->IsFalse()) { 6051 if (heap_obj->IsTrue() || heap_obj->IsFalse()) {
6052 return isolate->heap()->boolean_string(); 6052 return isolate->heap()->boolean_string();
6053 } 6053 }
6054 if (heap_obj->IsNull()) { 6054 if (heap_obj->IsNull()) {
6055 return isolate->heap()->object_string(); 6055 return isolate->heap()->object_string();
6056 } 6056 }
6057 ASSERT(heap_obj->IsUndefined()); 6057 DCHECK(heap_obj->IsUndefined());
6058 return isolate->heap()->undefined_string(); 6058 return isolate->heap()->undefined_string();
6059 case SYMBOL_TYPE: 6059 case SYMBOL_TYPE:
6060 return isolate->heap()->symbol_string(); 6060 return isolate->heap()->symbol_string();
6061 case JS_FUNCTION_TYPE: 6061 case JS_FUNCTION_TYPE:
6062 case JS_FUNCTION_PROXY_TYPE: 6062 case JS_FUNCTION_PROXY_TYPE:
6063 return isolate->heap()->function_string(); 6063 return isolate->heap()->function_string();
6064 default: 6064 default:
6065 // For any kind of object not handled above, the spec rule for 6065 // For any kind of object not handled above, the spec rule for
6066 // host objects gives that it is okay to return "object" 6066 // host objects gives that it is okay to return "object"
6067 return isolate->heap()->object_string(); 6067 return isolate->heap()->object_string();
6068 } 6068 }
6069 } 6069 }
6070 6070
6071 6071
6072 RUNTIME_FUNCTION(Runtime_Booleanize) { 6072 RUNTIME_FUNCTION(Runtime_Booleanize) {
6073 SealHandleScope shs(isolate); 6073 SealHandleScope shs(isolate);
6074 ASSERT(args.length() == 2); 6074 DCHECK(args.length() == 2);
6075 CONVERT_ARG_CHECKED(Object, value_raw, 0); 6075 CONVERT_ARG_CHECKED(Object, value_raw, 0);
6076 CONVERT_SMI_ARG_CHECKED(token_raw, 1); 6076 CONVERT_SMI_ARG_CHECKED(token_raw, 1);
6077 intptr_t value = reinterpret_cast<intptr_t>(value_raw); 6077 intptr_t value = reinterpret_cast<intptr_t>(value_raw);
6078 Token::Value token = static_cast<Token::Value>(token_raw); 6078 Token::Value token = static_cast<Token::Value>(token_raw);
6079 switch (token) { 6079 switch (token) {
6080 case Token::EQ: 6080 case Token::EQ:
6081 case Token::EQ_STRICT: 6081 case Token::EQ_STRICT:
6082 return isolate->heap()->ToBoolean(value == 0); 6082 return isolate->heap()->ToBoolean(value == 0);
6083 case Token::NE: 6083 case Token::NE:
6084 case Token::NE_STRICT: 6084 case Token::NE_STRICT:
(...skipping 16 matching lines...) Expand all
6101 static bool AreDigits(const uint8_t*s, int from, int to) { 6101 static bool AreDigits(const uint8_t*s, int from, int to) {
6102 for (int i = from; i < to; i++) { 6102 for (int i = from; i < to; i++) {
6103 if (s[i] < '0' || s[i] > '9') return false; 6103 if (s[i] < '0' || s[i] > '9') return false;
6104 } 6104 }
6105 6105
6106 return true; 6106 return true;
6107 } 6107 }
6108 6108
6109 6109
6110 static int ParseDecimalInteger(const uint8_t*s, int from, int to) { 6110 static int ParseDecimalInteger(const uint8_t*s, int from, int to) {
6111 ASSERT(to - from < 10); // Overflow is not possible. 6111 DCHECK(to - from < 10); // Overflow is not possible.
6112 ASSERT(from < to); 6112 DCHECK(from < to);
6113 int d = s[from] - '0'; 6113 int d = s[from] - '0';
6114 6114
6115 for (int i = from + 1; i < to; i++) { 6115 for (int i = from + 1; i < to; i++) {
6116 d = 10 * d + (s[i] - '0'); 6116 d = 10 * d + (s[i] - '0');
6117 } 6117 }
6118 6118
6119 return d; 6119 return d;
6120 } 6120 }
6121 6121
6122 6122
6123 RUNTIME_FUNCTION(Runtime_StringToNumber) { 6123 RUNTIME_FUNCTION(Runtime_StringToNumber) {
6124 HandleScope handle_scope(isolate); 6124 HandleScope handle_scope(isolate);
6125 ASSERT(args.length() == 1); 6125 DCHECK(args.length() == 1);
6126 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 6126 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
6127 subject = String::Flatten(subject); 6127 subject = String::Flatten(subject);
6128 6128
6129 // Fast case: short integer or some sorts of junk values. 6129 // Fast case: short integer or some sorts of junk values.
6130 if (subject->IsSeqOneByteString()) { 6130 if (subject->IsSeqOneByteString()) {
6131 int len = subject->length(); 6131 int len = subject->length();
6132 if (len == 0) return Smi::FromInt(0); 6132 if (len == 0) return Smi::FromInt(0);
6133 6133
6134 DisallowHeapAllocation no_gc; 6134 DisallowHeapAllocation no_gc;
6135 uint8_t const* data = Handle<SeqOneByteString>::cast(subject)->GetChars(); 6135 uint8_t const* data = Handle<SeqOneByteString>::cast(subject)->GetChars();
(...skipping 18 matching lines...) Expand all
6154 if (d == 0) return isolate->heap()->minus_zero_value(); 6154 if (d == 0) return isolate->heap()->minus_zero_value();
6155 d = -d; 6155 d = -d;
6156 } else if (!subject->HasHashCode() && 6156 } else if (!subject->HasHashCode() &&
6157 len <= String::kMaxArrayIndexSize && 6157 len <= String::kMaxArrayIndexSize &&
6158 (len == 1 || data[0] != '0')) { 6158 (len == 1 || data[0] != '0')) {
6159 // String hash is not calculated yet but all the data are present. 6159 // String hash is not calculated yet but all the data are present.
6160 // Update the hash field to speed up sequential convertions. 6160 // Update the hash field to speed up sequential convertions.
6161 uint32_t hash = StringHasher::MakeArrayIndexHash(d, len); 6161 uint32_t hash = StringHasher::MakeArrayIndexHash(d, len);
6162 #ifdef DEBUG 6162 #ifdef DEBUG
6163 subject->Hash(); // Force hash calculation. 6163 subject->Hash(); // Force hash calculation.
6164 ASSERT_EQ(static_cast<int>(subject->hash_field()), 6164 DCHECK_EQ(static_cast<int>(subject->hash_field()),
6165 static_cast<int>(hash)); 6165 static_cast<int>(hash));
6166 #endif 6166 #endif
6167 subject->set_hash_field(hash); 6167 subject->set_hash_field(hash);
6168 } 6168 }
6169 return Smi::FromInt(d); 6169 return Smi::FromInt(d);
6170 } 6170 }
6171 } 6171 }
6172 6172
6173 // Slower case. 6173 // Slower case.
6174 int flags = ALLOW_HEX; 6174 int flags = ALLOW_HEX;
6175 if (FLAG_harmony_numeric_literals) { 6175 if (FLAG_harmony_numeric_literals) {
6176 // The current spec draft has not updated "ToNumber Applied to the String 6176 // The current spec draft has not updated "ToNumber Applied to the String
6177 // Type", https://bugs.ecmascript.org/show_bug.cgi?id=1584 6177 // Type", https://bugs.ecmascript.org/show_bug.cgi?id=1584
6178 flags |= ALLOW_OCTAL | ALLOW_BINARY; 6178 flags |= ALLOW_OCTAL | ALLOW_BINARY;
6179 } 6179 }
6180 6180
6181 return *isolate->factory()->NewNumber(StringToDouble( 6181 return *isolate->factory()->NewNumber(StringToDouble(
6182 isolate->unicode_cache(), *subject, flags)); 6182 isolate->unicode_cache(), *subject, flags));
6183 } 6183 }
6184 6184
6185 6185
6186 RUNTIME_FUNCTION(Runtime_NewString) { 6186 RUNTIME_FUNCTION(Runtime_NewString) {
6187 HandleScope scope(isolate); 6187 HandleScope scope(isolate);
6188 ASSERT(args.length() == 2); 6188 DCHECK(args.length() == 2);
6189 CONVERT_SMI_ARG_CHECKED(length, 0); 6189 CONVERT_SMI_ARG_CHECKED(length, 0);
6190 CONVERT_BOOLEAN_ARG_CHECKED(is_one_byte, 1); 6190 CONVERT_BOOLEAN_ARG_CHECKED(is_one_byte, 1);
6191 if (length == 0) return isolate->heap()->empty_string(); 6191 if (length == 0) return isolate->heap()->empty_string();
6192 Handle<String> result; 6192 Handle<String> result;
6193 if (is_one_byte) { 6193 if (is_one_byte) {
6194 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6194 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6195 isolate, result, isolate->factory()->NewRawOneByteString(length)); 6195 isolate, result, isolate->factory()->NewRawOneByteString(length));
6196 } else { 6196 } else {
6197 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6197 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6198 isolate, result, isolate->factory()->NewRawTwoByteString(length)); 6198 isolate, result, isolate->factory()->NewRawTwoByteString(length));
6199 } 6199 }
6200 return *result; 6200 return *result;
6201 } 6201 }
6202 6202
6203 6203
6204 RUNTIME_FUNCTION(Runtime_TruncateString) { 6204 RUNTIME_FUNCTION(Runtime_TruncateString) {
6205 HandleScope scope(isolate); 6205 HandleScope scope(isolate);
6206 ASSERT(args.length() == 2); 6206 DCHECK(args.length() == 2);
6207 CONVERT_ARG_HANDLE_CHECKED(SeqString, string, 0); 6207 CONVERT_ARG_HANDLE_CHECKED(SeqString, string, 0);
6208 CONVERT_SMI_ARG_CHECKED(new_length, 1); 6208 CONVERT_SMI_ARG_CHECKED(new_length, 1);
6209 RUNTIME_ASSERT(new_length >= 0); 6209 RUNTIME_ASSERT(new_length >= 0);
6210 return *SeqString::Truncate(string, new_length); 6210 return *SeqString::Truncate(string, new_length);
6211 } 6211 }
6212 6212
6213 6213
6214 RUNTIME_FUNCTION(Runtime_URIEscape) { 6214 RUNTIME_FUNCTION(Runtime_URIEscape) {
6215 HandleScope scope(isolate); 6215 HandleScope scope(isolate);
6216 ASSERT(args.length() == 1); 6216 DCHECK(args.length() == 1);
6217 CONVERT_ARG_HANDLE_CHECKED(String, source, 0); 6217 CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
6218 Handle<String> string = String::Flatten(source); 6218 Handle<String> string = String::Flatten(source);
6219 ASSERT(string->IsFlat()); 6219 DCHECK(string->IsFlat());
6220 Handle<String> result; 6220 Handle<String> result;
6221 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6221 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6222 isolate, result, 6222 isolate, result,
6223 string->IsOneByteRepresentationUnderneath() 6223 string->IsOneByteRepresentationUnderneath()
6224 ? URIEscape::Escape<uint8_t>(isolate, source) 6224 ? URIEscape::Escape<uint8_t>(isolate, source)
6225 : URIEscape::Escape<uc16>(isolate, source)); 6225 : URIEscape::Escape<uc16>(isolate, source));
6226 return *result; 6226 return *result;
6227 } 6227 }
6228 6228
6229 6229
6230 RUNTIME_FUNCTION(Runtime_URIUnescape) { 6230 RUNTIME_FUNCTION(Runtime_URIUnescape) {
6231 HandleScope scope(isolate); 6231 HandleScope scope(isolate);
6232 ASSERT(args.length() == 1); 6232 DCHECK(args.length() == 1);
6233 CONVERT_ARG_HANDLE_CHECKED(String, source, 0); 6233 CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
6234 Handle<String> string = String::Flatten(source); 6234 Handle<String> string = String::Flatten(source);
6235 ASSERT(string->IsFlat()); 6235 DCHECK(string->IsFlat());
6236 Handle<String> result; 6236 Handle<String> result;
6237 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6237 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6238 isolate, result, 6238 isolate, result,
6239 string->IsOneByteRepresentationUnderneath() 6239 string->IsOneByteRepresentationUnderneath()
6240 ? URIUnescape::Unescape<uint8_t>(isolate, source) 6240 ? URIUnescape::Unescape<uint8_t>(isolate, source)
6241 : URIUnescape::Unescape<uc16>(isolate, source)); 6241 : URIUnescape::Unescape<uc16>(isolate, source));
6242 return *result; 6242 return *result;
6243 } 6243 }
6244 6244
6245 6245
6246 RUNTIME_FUNCTION(Runtime_QuoteJSONString) { 6246 RUNTIME_FUNCTION(Runtime_QuoteJSONString) {
6247 HandleScope scope(isolate); 6247 HandleScope scope(isolate);
6248 CONVERT_ARG_HANDLE_CHECKED(String, string, 0); 6248 CONVERT_ARG_HANDLE_CHECKED(String, string, 0);
6249 ASSERT(args.length() == 1); 6249 DCHECK(args.length() == 1);
6250 Handle<Object> result; 6250 Handle<Object> result;
6251 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6251 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6252 isolate, result, BasicJsonStringifier::StringifyString(isolate, string)); 6252 isolate, result, BasicJsonStringifier::StringifyString(isolate, string));
6253 return *result; 6253 return *result;
6254 } 6254 }
6255 6255
6256 6256
6257 RUNTIME_FUNCTION(Runtime_BasicJSONStringify) { 6257 RUNTIME_FUNCTION(Runtime_BasicJSONStringify) {
6258 HandleScope scope(isolate); 6258 HandleScope scope(isolate);
6259 ASSERT(args.length() == 1); 6259 DCHECK(args.length() == 1);
6260 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); 6260 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
6261 BasicJsonStringifier stringifier(isolate); 6261 BasicJsonStringifier stringifier(isolate);
6262 Handle<Object> result; 6262 Handle<Object> result;
6263 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6263 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6264 isolate, result, stringifier.Stringify(object)); 6264 isolate, result, stringifier.Stringify(object));
6265 return *result; 6265 return *result;
6266 } 6266 }
6267 6267
6268 6268
6269 RUNTIME_FUNCTION(Runtime_StringParseInt) { 6269 RUNTIME_FUNCTION(Runtime_StringParseInt) {
6270 HandleScope handle_scope(isolate); 6270 HandleScope handle_scope(isolate);
6271 ASSERT(args.length() == 2); 6271 DCHECK(args.length() == 2);
6272 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 6272 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
6273 CONVERT_NUMBER_CHECKED(int, radix, Int32, args[1]); 6273 CONVERT_NUMBER_CHECKED(int, radix, Int32, args[1]);
6274 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36)); 6274 RUNTIME_ASSERT(radix == 0 || (2 <= radix && radix <= 36));
6275 6275
6276 subject = String::Flatten(subject); 6276 subject = String::Flatten(subject);
6277 double value; 6277 double value;
6278 6278
6279 { DisallowHeapAllocation no_gc; 6279 { DisallowHeapAllocation no_gc;
6280 String::FlatContent flat = subject->GetFlatContent(); 6280 String::FlatContent flat = subject->GetFlatContent();
6281 6281
6282 // ECMA-262 section 15.1.2.3, empty string is NaN 6282 // ECMA-262 section 15.1.2.3, empty string is NaN
6283 if (flat.IsAscii()) { 6283 if (flat.IsAscii()) {
6284 value = StringToInt( 6284 value = StringToInt(
6285 isolate->unicode_cache(), flat.ToOneByteVector(), radix); 6285 isolate->unicode_cache(), flat.ToOneByteVector(), radix);
6286 } else { 6286 } else {
6287 value = StringToInt( 6287 value = StringToInt(
6288 isolate->unicode_cache(), flat.ToUC16Vector(), radix); 6288 isolate->unicode_cache(), flat.ToUC16Vector(), radix);
6289 } 6289 }
6290 } 6290 }
6291 6291
6292 return *isolate->factory()->NewNumber(value); 6292 return *isolate->factory()->NewNumber(value);
6293 } 6293 }
6294 6294
6295 6295
6296 RUNTIME_FUNCTION(Runtime_StringParseFloat) { 6296 RUNTIME_FUNCTION(Runtime_StringParseFloat) {
6297 HandleScope shs(isolate); 6297 HandleScope shs(isolate);
6298 ASSERT(args.length() == 1); 6298 DCHECK(args.length() == 1);
6299 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 6299 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
6300 6300
6301 subject = String::Flatten(subject); 6301 subject = String::Flatten(subject);
6302 double value = StringToDouble(isolate->unicode_cache(), *subject, 6302 double value = StringToDouble(isolate->unicode_cache(), *subject,
6303 ALLOW_TRAILING_JUNK, base::OS::nan_value()); 6303 ALLOW_TRAILING_JUNK, base::OS::nan_value());
6304 6304
6305 return *isolate->factory()->NewNumber(value); 6305 return *isolate->factory()->NewNumber(value);
6306 } 6306 }
6307 6307
6308 6308
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
6347 bool has_next = stream.HasMore(); 6347 bool has_next = stream.HasMore();
6348 uc32 next = has_next ? stream.GetNext() : 0; 6348 uc32 next = has_next ? stream.GetNext() : 0;
6349 int char_length = mapping->get(current, next, chars); 6349 int char_length = mapping->get(current, next, chars);
6350 if (char_length == 0) { 6350 if (char_length == 0) {
6351 // The case conversion of this character is the character itself. 6351 // The case conversion of this character is the character itself.
6352 result->Set(i, current); 6352 result->Set(i, current);
6353 i++; 6353 i++;
6354 } else if (char_length == 1 && 6354 } else if (char_length == 1 &&
6355 (ignore_overflow || !ToUpperOverflows(current))) { 6355 (ignore_overflow || !ToUpperOverflows(current))) {
6356 // Common case: converting the letter resulted in one character. 6356 // Common case: converting the letter resulted in one character.
6357 ASSERT(static_cast<uc32>(chars[0]) != current); 6357 DCHECK(static_cast<uc32>(chars[0]) != current);
6358 result->Set(i, chars[0]); 6358 result->Set(i, chars[0]);
6359 has_changed_character = true; 6359 has_changed_character = true;
6360 i++; 6360 i++;
6361 } else if (result_length == string->length()) { 6361 } else if (result_length == string->length()) {
6362 bool overflows = ToUpperOverflows(current); 6362 bool overflows = ToUpperOverflows(current);
6363 // We've assumed that the result would be as long as the 6363 // We've assumed that the result would be as long as the
6364 // input but here is a character that converts to several 6364 // input but here is a character that converts to several
6365 // characters. No matter, we calculate the exact length 6365 // characters. No matter, we calculate the exact length
6366 // of the result and try the whole thing again. 6366 // of the result and try the whole thing again.
6367 // 6367 //
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
6425 // Given a word and two range boundaries returns a word with high bit 6425 // Given a word and two range boundaries returns a word with high bit
6426 // set in every byte iff the corresponding input byte was strictly in 6426 // set in every byte iff the corresponding input byte was strictly in
6427 // the range (m, n). All the other bits in the result are cleared. 6427 // the range (m, n). All the other bits in the result are cleared.
6428 // This function is only useful when it can be inlined and the 6428 // This function is only useful when it can be inlined and the
6429 // boundaries are statically known. 6429 // boundaries are statically known.
6430 // Requires: all bytes in the input word and the boundaries must be 6430 // Requires: all bytes in the input word and the boundaries must be
6431 // ASCII (less than 0x7F). 6431 // ASCII (less than 0x7F).
6432 static inline uintptr_t AsciiRangeMask(uintptr_t w, char m, char n) { 6432 static inline uintptr_t AsciiRangeMask(uintptr_t w, char m, char n) {
6433 // Use strict inequalities since in edge cases the function could be 6433 // Use strict inequalities since in edge cases the function could be
6434 // further simplified. 6434 // further simplified.
6435 ASSERT(0 < m && m < n); 6435 DCHECK(0 < m && m < n);
6436 // Has high bit set in every w byte less than n. 6436 // Has high bit set in every w byte less than n.
6437 uintptr_t tmp1 = kOneInEveryByte * (0x7F + n) - w; 6437 uintptr_t tmp1 = kOneInEveryByte * (0x7F + n) - w;
6438 // Has high bit set in every w byte greater than m. 6438 // Has high bit set in every w byte greater than m.
6439 uintptr_t tmp2 = w + kOneInEveryByte * (0x7F - m); 6439 uintptr_t tmp2 = w + kOneInEveryByte * (0x7F - m);
6440 return (tmp1 & tmp2 & (kOneInEveryByte * 0x80)); 6440 return (tmp1 & tmp2 & (kOneInEveryByte * 0x80));
6441 } 6441 }
6442 6442
6443 6443
6444 #ifdef DEBUG 6444 #ifdef DEBUG
6445 static bool CheckFastAsciiConvert(char* dst, 6445 static bool CheckFastAsciiConvert(char* dst,
6446 const char* src, 6446 const char* src,
6447 int length, 6447 int length,
6448 bool changed, 6448 bool changed,
6449 bool is_to_lower) { 6449 bool is_to_lower) {
6450 bool expected_changed = false; 6450 bool expected_changed = false;
6451 for (int i = 0; i < length; i++) { 6451 for (int i = 0; i < length; i++) {
6452 if (dst[i] == src[i]) continue; 6452 if (dst[i] == src[i]) continue;
6453 expected_changed = true; 6453 expected_changed = true;
6454 if (is_to_lower) { 6454 if (is_to_lower) {
6455 ASSERT('A' <= src[i] && src[i] <= 'Z'); 6455 DCHECK('A' <= src[i] && src[i] <= 'Z');
6456 ASSERT(dst[i] == src[i] + ('a' - 'A')); 6456 DCHECK(dst[i] == src[i] + ('a' - 'A'));
6457 } else { 6457 } else {
6458 ASSERT('a' <= src[i] && src[i] <= 'z'); 6458 DCHECK('a' <= src[i] && src[i] <= 'z');
6459 ASSERT(dst[i] == src[i] - ('a' - 'A')); 6459 DCHECK(dst[i] == src[i] - ('a' - 'A'));
6460 } 6460 }
6461 } 6461 }
6462 return (expected_changed == changed); 6462 return (expected_changed == changed);
6463 } 6463 }
6464 #endif 6464 #endif
6465 6465
6466 6466
6467 template<class Converter> 6467 template<class Converter>
6468 static bool FastAsciiConvert(char* dst, 6468 static bool FastAsciiConvert(char* dst,
6469 const char* src, 6469 const char* src,
6470 int length, 6470 int length,
6471 bool* changed_out) { 6471 bool* changed_out) {
6472 #ifdef DEBUG 6472 #ifdef DEBUG
6473 char* saved_dst = dst; 6473 char* saved_dst = dst;
6474 const char* saved_src = src; 6474 const char* saved_src = src;
6475 #endif 6475 #endif
6476 DisallowHeapAllocation no_gc; 6476 DisallowHeapAllocation no_gc;
6477 // We rely on the distance between upper and lower case letters 6477 // We rely on the distance between upper and lower case letters
6478 // being a known power of 2. 6478 // being a known power of 2.
6479 ASSERT('a' - 'A' == (1 << 5)); 6479 DCHECK('a' - 'A' == (1 << 5));
6480 // Boundaries for the range of input characters than require conversion. 6480 // Boundaries for the range of input characters than require conversion.
6481 static const char lo = Converter::kIsToLower ? 'A' - 1 : 'a' - 1; 6481 static const char lo = Converter::kIsToLower ? 'A' - 1 : 'a' - 1;
6482 static const char hi = Converter::kIsToLower ? 'Z' + 1 : 'z' + 1; 6482 static const char hi = Converter::kIsToLower ? 'Z' + 1 : 'z' + 1;
6483 bool changed = false; 6483 bool changed = false;
6484 uintptr_t or_acc = 0; 6484 uintptr_t or_acc = 0;
6485 const char* const limit = src + length; 6485 const char* const limit = src + length;
6486 #ifdef V8_HOST_CAN_READ_UNALIGNED 6486 #ifdef V8_HOST_CAN_READ_UNALIGNED
6487 // Process the prefix of the input that requires no conversion one 6487 // Process the prefix of the input that requires no conversion one
6488 // (machine) word at a time. 6488 // (machine) word at a time.
6489 while (src <= limit - sizeof(uintptr_t)) { 6489 while (src <= limit - sizeof(uintptr_t)) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
6521 changed = true; 6521 changed = true;
6522 } 6522 }
6523 *dst = c; 6523 *dst = c;
6524 ++src; 6524 ++src;
6525 ++dst; 6525 ++dst;
6526 } 6526 }
6527 if ((or_acc & kAsciiMask) != 0) { 6527 if ((or_acc & kAsciiMask) != 0) {
6528 return false; 6528 return false;
6529 } 6529 }
6530 6530
6531 ASSERT(CheckFastAsciiConvert( 6531 DCHECK(CheckFastAsciiConvert(
6532 saved_dst, saved_src, length, changed, Converter::kIsToLower)); 6532 saved_dst, saved_src, length, changed, Converter::kIsToLower));
6533 6533
6534 *changed_out = changed; 6534 *changed_out = changed;
6535 return true; 6535 return true;
6536 } 6536 }
6537 6537
6538 } // namespace 6538 } // namespace
6539 6539
6540 6540
6541 template <class Converter> 6541 template <class Converter>
(...skipping 11 matching lines...) Expand all
6553 // NOTE: This assumes that the upper/lower case of an ASCII 6553 // NOTE: This assumes that the upper/lower case of an ASCII
6554 // character is also ASCII. This is currently the case, but it 6554 // character is also ASCII. This is currently the case, but it
6555 // might break in the future if we implement more context and locale 6555 // might break in the future if we implement more context and locale
6556 // dependent upper/lower conversions. 6556 // dependent upper/lower conversions.
6557 if (s->IsOneByteRepresentationUnderneath()) { 6557 if (s->IsOneByteRepresentationUnderneath()) {
6558 // Same length as input. 6558 // Same length as input.
6559 Handle<SeqOneByteString> result = 6559 Handle<SeqOneByteString> result =
6560 isolate->factory()->NewRawOneByteString(length).ToHandleChecked(); 6560 isolate->factory()->NewRawOneByteString(length).ToHandleChecked();
6561 DisallowHeapAllocation no_gc; 6561 DisallowHeapAllocation no_gc;
6562 String::FlatContent flat_content = s->GetFlatContent(); 6562 String::FlatContent flat_content = s->GetFlatContent();
6563 ASSERT(flat_content.IsFlat()); 6563 DCHECK(flat_content.IsFlat());
6564 bool has_changed_character = false; 6564 bool has_changed_character = false;
6565 bool is_ascii = FastAsciiConvert<Converter>( 6565 bool is_ascii = FastAsciiConvert<Converter>(
6566 reinterpret_cast<char*>(result->GetChars()), 6566 reinterpret_cast<char*>(result->GetChars()),
6567 reinterpret_cast<const char*>(flat_content.ToOneByteVector().start()), 6567 reinterpret_cast<const char*>(flat_content.ToOneByteVector().start()),
6568 length, 6568 length,
6569 &has_changed_character); 6569 &has_changed_character);
6570 // If not ASCII, we discard the result and take the 2 byte path. 6570 // If not ASCII, we discard the result and take the 2 byte path.
6571 if (is_ascii) return has_changed_character ? *result : *s; 6571 if (is_ascii) return has_changed_character ? *result : *s;
6572 } 6572 }
6573 6573
6574 Handle<SeqString> result; // Same length as input. 6574 Handle<SeqString> result; // Same length as input.
6575 if (s->IsOneByteRepresentation()) { 6575 if (s->IsOneByteRepresentation()) {
6576 result = isolate->factory()->NewRawOneByteString(length).ToHandleChecked(); 6576 result = isolate->factory()->NewRawOneByteString(length).ToHandleChecked();
6577 } else { 6577 } else {
6578 result = isolate->factory()->NewRawTwoByteString(length).ToHandleChecked(); 6578 result = isolate->factory()->NewRawTwoByteString(length).ToHandleChecked();
6579 } 6579 }
6580 6580
6581 Object* answer = ConvertCaseHelper(isolate, *s, *result, length, mapping); 6581 Object* answer = ConvertCaseHelper(isolate, *s, *result, length, mapping);
6582 if (answer->IsException() || answer->IsString()) return answer; 6582 if (answer->IsException() || answer->IsString()) return answer;
6583 6583
6584 ASSERT(answer->IsSmi()); 6584 DCHECK(answer->IsSmi());
6585 length = Smi::cast(answer)->value(); 6585 length = Smi::cast(answer)->value();
6586 if (s->IsOneByteRepresentation() && length > 0) { 6586 if (s->IsOneByteRepresentation() && length > 0) {
6587 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6587 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6588 isolate, result, isolate->factory()->NewRawOneByteString(length)); 6588 isolate, result, isolate->factory()->NewRawOneByteString(length));
6589 } else { 6589 } else {
6590 if (length < 0) length = -length; 6590 if (length < 0) length = -length;
6591 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 6591 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
6592 isolate, result, isolate->factory()->NewRawTwoByteString(length)); 6592 isolate, result, isolate->factory()->NewRawTwoByteString(length));
6593 } 6593 }
6594 return ConvertCaseHelper(isolate, *s, *result, length, mapping); 6594 return ConvertCaseHelper(isolate, *s, *result, length, mapping);
6595 } 6595 }
6596 6596
6597 6597
6598 RUNTIME_FUNCTION(Runtime_StringToLowerCase) { 6598 RUNTIME_FUNCTION(Runtime_StringToLowerCase) {
6599 HandleScope scope(isolate); 6599 HandleScope scope(isolate);
6600 ASSERT(args.length() == 1); 6600 DCHECK(args.length() == 1);
6601 CONVERT_ARG_HANDLE_CHECKED(String, s, 0); 6601 CONVERT_ARG_HANDLE_CHECKED(String, s, 0);
6602 return ConvertCase( 6602 return ConvertCase(
6603 s, isolate, isolate->runtime_state()->to_lower_mapping()); 6603 s, isolate, isolate->runtime_state()->to_lower_mapping());
6604 } 6604 }
6605 6605
6606 6606
6607 RUNTIME_FUNCTION(Runtime_StringToUpperCase) { 6607 RUNTIME_FUNCTION(Runtime_StringToUpperCase) {
6608 HandleScope scope(isolate); 6608 HandleScope scope(isolate);
6609 ASSERT(args.length() == 1); 6609 DCHECK(args.length() == 1);
6610 CONVERT_ARG_HANDLE_CHECKED(String, s, 0); 6610 CONVERT_ARG_HANDLE_CHECKED(String, s, 0);
6611 return ConvertCase( 6611 return ConvertCase(
6612 s, isolate, isolate->runtime_state()->to_upper_mapping()); 6612 s, isolate, isolate->runtime_state()->to_upper_mapping());
6613 } 6613 }
6614 6614
6615 6615
6616 RUNTIME_FUNCTION(Runtime_StringTrim) { 6616 RUNTIME_FUNCTION(Runtime_StringTrim) {
6617 HandleScope scope(isolate); 6617 HandleScope scope(isolate);
6618 ASSERT(args.length() == 3); 6618 DCHECK(args.length() == 3);
6619 6619
6620 CONVERT_ARG_HANDLE_CHECKED(String, string, 0); 6620 CONVERT_ARG_HANDLE_CHECKED(String, string, 0);
6621 CONVERT_BOOLEAN_ARG_CHECKED(trimLeft, 1); 6621 CONVERT_BOOLEAN_ARG_CHECKED(trimLeft, 1);
6622 CONVERT_BOOLEAN_ARG_CHECKED(trimRight, 2); 6622 CONVERT_BOOLEAN_ARG_CHECKED(trimRight, 2);
6623 6623
6624 string = String::Flatten(string); 6624 string = String::Flatten(string);
6625 int length = string->length(); 6625 int length = string->length();
6626 6626
6627 int left = 0; 6627 int left = 0;
6628 UnicodeCache* unicode_cache = isolate->unicode_cache(); 6628 UnicodeCache* unicode_cache = isolate->unicode_cache();
(...skipping 12 matching lines...) Expand all
6641 right--; 6641 right--;
6642 } 6642 }
6643 } 6643 }
6644 6644
6645 return *isolate->factory()->NewSubString(string, left, right); 6645 return *isolate->factory()->NewSubString(string, left, right);
6646 } 6646 }
6647 6647
6648 6648
6649 RUNTIME_FUNCTION(Runtime_StringSplit) { 6649 RUNTIME_FUNCTION(Runtime_StringSplit) {
6650 HandleScope handle_scope(isolate); 6650 HandleScope handle_scope(isolate);
6651 ASSERT(args.length() == 3); 6651 DCHECK(args.length() == 3);
6652 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0); 6652 CONVERT_ARG_HANDLE_CHECKED(String, subject, 0);
6653 CONVERT_ARG_HANDLE_CHECKED(String, pattern, 1); 6653 CONVERT_ARG_HANDLE_CHECKED(String, pattern, 1);
6654 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[2]); 6654 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[2]);
6655 RUNTIME_ASSERT(limit > 0); 6655 RUNTIME_ASSERT(limit > 0);
6656 6656
6657 int subject_length = subject->length(); 6657 int subject_length = subject->length();
6658 int pattern_length = pattern->length(); 6658 int pattern_length = pattern->length();
6659 RUNTIME_ASSERT(pattern_length > 0); 6659 RUNTIME_ASSERT(pattern_length > 0);
6660 6660
6661 if (limit == 0xffffffffu) { 6661 if (limit == 0xffffffffu) {
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
6698 6698
6699 // The list indices now contains the end of each part to create. 6699 // The list indices now contains the end of each part to create.
6700 6700
6701 // Create JSArray of substrings separated by separator. 6701 // Create JSArray of substrings separated by separator.
6702 int part_count = indices.length(); 6702 int part_count = indices.length();
6703 6703
6704 Handle<JSArray> result = isolate->factory()->NewJSArray(part_count); 6704 Handle<JSArray> result = isolate->factory()->NewJSArray(part_count);
6705 JSObject::EnsureCanContainHeapObjectElements(result); 6705 JSObject::EnsureCanContainHeapObjectElements(result);
6706 result->set_length(Smi::FromInt(part_count)); 6706 result->set_length(Smi::FromInt(part_count));
6707 6707
6708 ASSERT(result->HasFastObjectElements()); 6708 DCHECK(result->HasFastObjectElements());
6709 6709
6710 if (part_count == 1 && indices.at(0) == subject_length) { 6710 if (part_count == 1 && indices.at(0) == subject_length) {
6711 FixedArray::cast(result->elements())->set(0, *subject); 6711 FixedArray::cast(result->elements())->set(0, *subject);
6712 return *result; 6712 return *result;
6713 } 6713 }
6714 6714
6715 Handle<FixedArray> elements(FixedArray::cast(result->elements())); 6715 Handle<FixedArray> elements(FixedArray::cast(result->elements()));
6716 int part_start = 0; 6716 int part_start = 0;
6717 for (int i = 0; i < part_count; i++) { 6717 for (int i = 0; i < part_count; i++) {
6718 HandleScope local_loop_handle(isolate); 6718 HandleScope local_loop_handle(isolate);
(...skipping 30 matching lines...) Expand all
6749 FixedArray* ascii_cache = heap->single_character_string_cache(); 6749 FixedArray* ascii_cache = heap->single_character_string_cache();
6750 Object* undefined = heap->undefined_value(); 6750 Object* undefined = heap->undefined_value();
6751 int i; 6751 int i;
6752 WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc); 6752 WriteBarrierMode mode = elements->GetWriteBarrierMode(no_gc);
6753 for (i = 0; i < length; ++i) { 6753 for (i = 0; i < length; ++i) {
6754 Object* value = ascii_cache->get(chars[i]); 6754 Object* value = ascii_cache->get(chars[i]);
6755 if (value == undefined) break; 6755 if (value == undefined) break;
6756 elements->set(i, value, mode); 6756 elements->set(i, value, mode);
6757 } 6757 }
6758 if (i < length) { 6758 if (i < length) {
6759 ASSERT(Smi::FromInt(0) == 0); 6759 DCHECK(Smi::FromInt(0) == 0);
6760 memset(elements->data_start() + i, 0, kPointerSize * (length - i)); 6760 memset(elements->data_start() + i, 0, kPointerSize * (length - i));
6761 } 6761 }
6762 #ifdef DEBUG 6762 #ifdef DEBUG
6763 for (int j = 0; j < length; ++j) { 6763 for (int j = 0; j < length; ++j) {
6764 Object* element = elements->get(j); 6764 Object* element = elements->get(j);
6765 ASSERT(element == Smi::FromInt(0) || 6765 DCHECK(element == Smi::FromInt(0) ||
6766 (element->IsString() && String::cast(element)->LooksValid())); 6766 (element->IsString() && String::cast(element)->LooksValid()));
6767 } 6767 }
6768 #endif 6768 #endif
6769 return i; 6769 return i;
6770 } 6770 }
6771 6771
6772 6772
6773 // Converts a String to JSArray. 6773 // Converts a String to JSArray.
6774 // For example, "foo" => ["f", "o", "o"]. 6774 // For example, "foo" => ["f", "o", "o"].
6775 RUNTIME_FUNCTION(Runtime_StringToArray) { 6775 RUNTIME_FUNCTION(Runtime_StringToArray) {
6776 HandleScope scope(isolate); 6776 HandleScope scope(isolate);
6777 ASSERT(args.length() == 2); 6777 DCHECK(args.length() == 2);
6778 CONVERT_ARG_HANDLE_CHECKED(String, s, 0); 6778 CONVERT_ARG_HANDLE_CHECKED(String, s, 0);
6779 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); 6779 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]);
6780 6780
6781 s = String::Flatten(s); 6781 s = String::Flatten(s);
6782 const int length = static_cast<int>(Min<uint32_t>(s->length(), limit)); 6782 const int length = static_cast<int>(Min<uint32_t>(s->length(), limit));
6783 6783
6784 Handle<FixedArray> elements; 6784 Handle<FixedArray> elements;
6785 int position = 0; 6785 int position = 0;
6786 if (s->IsFlat() && s->IsOneByteRepresentation()) { 6786 if (s->IsFlat() && s->IsOneByteRepresentation()) {
6787 // Try using cached chars where possible. 6787 // Try using cached chars where possible.
(...skipping 18 matching lines...) Expand all
6806 elements = isolate->factory()->NewFixedArray(length); 6806 elements = isolate->factory()->NewFixedArray(length);
6807 } 6807 }
6808 for (int i = position; i < length; ++i) { 6808 for (int i = position; i < length; ++i) {
6809 Handle<Object> str = 6809 Handle<Object> str =
6810 isolate->factory()->LookupSingleCharacterStringFromCode(s->Get(i)); 6810 isolate->factory()->LookupSingleCharacterStringFromCode(s->Get(i));
6811 elements->set(i, *str); 6811 elements->set(i, *str);
6812 } 6812 }
6813 6813
6814 #ifdef DEBUG 6814 #ifdef DEBUG
6815 for (int i = 0; i < length; ++i) { 6815 for (int i = 0; i < length; ++i) {
6816 ASSERT(String::cast(elements->get(i))->length() == 1); 6816 DCHECK(String::cast(elements->get(i))->length() == 1);
6817 } 6817 }
6818 #endif 6818 #endif
6819 6819
6820 return *isolate->factory()->NewJSArrayWithElements(elements); 6820 return *isolate->factory()->NewJSArrayWithElements(elements);
6821 } 6821 }
6822 6822
6823 6823
6824 RUNTIME_FUNCTION(Runtime_NewStringWrapper) { 6824 RUNTIME_FUNCTION(Runtime_NewStringWrapper) {
6825 HandleScope scope(isolate); 6825 HandleScope scope(isolate);
6826 ASSERT(args.length() == 1); 6826 DCHECK(args.length() == 1);
6827 CONVERT_ARG_HANDLE_CHECKED(String, value, 0); 6827 CONVERT_ARG_HANDLE_CHECKED(String, value, 0);
6828 return *Object::ToObject(isolate, value).ToHandleChecked(); 6828 return *Object::ToObject(isolate, value).ToHandleChecked();
6829 } 6829 }
6830 6830
6831 6831
6832 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) { 6832 bool Runtime::IsUpperCaseChar(RuntimeState* runtime_state, uint16_t ch) {
6833 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth]; 6833 unibrow::uchar chars[unibrow::ToUppercase::kMaxWidth];
6834 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars); 6834 int char_length = runtime_state->to_upper_mapping()->get(ch, 0, chars);
6835 return char_length == 0; 6835 return char_length == 0;
6836 } 6836 }
6837 6837
6838 6838
6839 RUNTIME_FUNCTION(Runtime_NumberToStringRT) { 6839 RUNTIME_FUNCTION(Runtime_NumberToStringRT) {
6840 HandleScope scope(isolate); 6840 HandleScope scope(isolate);
6841 ASSERT(args.length() == 1); 6841 DCHECK(args.length() == 1);
6842 CONVERT_NUMBER_ARG_HANDLE_CHECKED(number, 0); 6842 CONVERT_NUMBER_ARG_HANDLE_CHECKED(number, 0);
6843 6843
6844 return *isolate->factory()->NumberToString(number); 6844 return *isolate->factory()->NumberToString(number);
6845 } 6845 }
6846 6846
6847 6847
6848 RUNTIME_FUNCTION(Runtime_NumberToStringSkipCache) { 6848 RUNTIME_FUNCTION(Runtime_NumberToStringSkipCache) {
6849 HandleScope scope(isolate); 6849 HandleScope scope(isolate);
6850 ASSERT(args.length() == 1); 6850 DCHECK(args.length() == 1);
6851 CONVERT_NUMBER_ARG_HANDLE_CHECKED(number, 0); 6851 CONVERT_NUMBER_ARG_HANDLE_CHECKED(number, 0);
6852 6852
6853 return *isolate->factory()->NumberToString(number, false); 6853 return *isolate->factory()->NumberToString(number, false);
6854 } 6854 }
6855 6855
6856 6856
6857 RUNTIME_FUNCTION(Runtime_NumberToInteger) { 6857 RUNTIME_FUNCTION(Runtime_NumberToInteger) {
6858 HandleScope scope(isolate); 6858 HandleScope scope(isolate);
6859 ASSERT(args.length() == 1); 6859 DCHECK(args.length() == 1);
6860 6860
6861 CONVERT_DOUBLE_ARG_CHECKED(number, 0); 6861 CONVERT_DOUBLE_ARG_CHECKED(number, 0);
6862 return *isolate->factory()->NewNumber(DoubleToInteger(number)); 6862 return *isolate->factory()->NewNumber(DoubleToInteger(number));
6863 } 6863 }
6864 6864
6865 6865
6866 RUNTIME_FUNCTION(Runtime_NumberToIntegerMapMinusZero) { 6866 RUNTIME_FUNCTION(Runtime_NumberToIntegerMapMinusZero) {
6867 HandleScope scope(isolate); 6867 HandleScope scope(isolate);
6868 ASSERT(args.length() == 1); 6868 DCHECK(args.length() == 1);
6869 6869
6870 CONVERT_DOUBLE_ARG_CHECKED(number, 0); 6870 CONVERT_DOUBLE_ARG_CHECKED(number, 0);
6871 double double_value = DoubleToInteger(number); 6871 double double_value = DoubleToInteger(number);
6872 // Map both -0 and +0 to +0. 6872 // Map both -0 and +0 to +0.
6873 if (double_value == 0) double_value = 0; 6873 if (double_value == 0) double_value = 0;
6874 6874
6875 return *isolate->factory()->NewNumber(double_value); 6875 return *isolate->factory()->NewNumber(double_value);
6876 } 6876 }
6877 6877
6878 6878
6879 RUNTIME_FUNCTION(Runtime_NumberToJSUint32) { 6879 RUNTIME_FUNCTION(Runtime_NumberToJSUint32) {
6880 HandleScope scope(isolate); 6880 HandleScope scope(isolate);
6881 ASSERT(args.length() == 1); 6881 DCHECK(args.length() == 1);
6882 6882
6883 CONVERT_NUMBER_CHECKED(int32_t, number, Uint32, args[0]); 6883 CONVERT_NUMBER_CHECKED(int32_t, number, Uint32, args[0]);
6884 return *isolate->factory()->NewNumberFromUint(number); 6884 return *isolate->factory()->NewNumberFromUint(number);
6885 } 6885 }
6886 6886
6887 6887
6888 RUNTIME_FUNCTION(Runtime_NumberToJSInt32) { 6888 RUNTIME_FUNCTION(Runtime_NumberToJSInt32) {
6889 HandleScope scope(isolate); 6889 HandleScope scope(isolate);
6890 ASSERT(args.length() == 1); 6890 DCHECK(args.length() == 1);
6891 6891
6892 CONVERT_DOUBLE_ARG_CHECKED(number, 0); 6892 CONVERT_DOUBLE_ARG_CHECKED(number, 0);
6893 return *isolate->factory()->NewNumberFromInt(DoubleToInt32(number)); 6893 return *isolate->factory()->NewNumberFromInt(DoubleToInt32(number));
6894 } 6894 }
6895 6895
6896 6896
6897 // Converts a Number to a Smi, if possible. Returns NaN if the number is not 6897 // Converts a Number to a Smi, if possible. Returns NaN if the number is not
6898 // a small integer. 6898 // a small integer.
6899 RUNTIME_FUNCTION(Runtime_NumberToSmi) { 6899 RUNTIME_FUNCTION(Runtime_NumberToSmi) {
6900 SealHandleScope shs(isolate); 6900 SealHandleScope shs(isolate);
6901 ASSERT(args.length() == 1); 6901 DCHECK(args.length() == 1);
6902 CONVERT_ARG_CHECKED(Object, obj, 0); 6902 CONVERT_ARG_CHECKED(Object, obj, 0);
6903 if (obj->IsSmi()) { 6903 if (obj->IsSmi()) {
6904 return obj; 6904 return obj;
6905 } 6905 }
6906 if (obj->IsHeapNumber()) { 6906 if (obj->IsHeapNumber()) {
6907 double value = HeapNumber::cast(obj)->value(); 6907 double value = HeapNumber::cast(obj)->value();
6908 int int_value = FastD2I(value); 6908 int int_value = FastD2I(value);
6909 if (value == FastI2D(int_value) && Smi::IsValid(int_value)) { 6909 if (value == FastI2D(int_value) && Smi::IsValid(int_value)) {
6910 return Smi::FromInt(int_value); 6910 return Smi::FromInt(int_value);
6911 } 6911 }
6912 } 6912 }
6913 return isolate->heap()->nan_value(); 6913 return isolate->heap()->nan_value();
6914 } 6914 }
6915 6915
6916 6916
6917 RUNTIME_FUNCTION(Runtime_AllocateHeapNumber) { 6917 RUNTIME_FUNCTION(Runtime_AllocateHeapNumber) {
6918 HandleScope scope(isolate); 6918 HandleScope scope(isolate);
6919 ASSERT(args.length() == 0); 6919 DCHECK(args.length() == 0);
6920 return *isolate->factory()->NewHeapNumber(0); 6920 return *isolate->factory()->NewHeapNumber(0);
6921 } 6921 }
6922 6922
6923 6923
6924 RUNTIME_FUNCTION(Runtime_NumberAdd) { 6924 RUNTIME_FUNCTION(Runtime_NumberAdd) {
6925 HandleScope scope(isolate); 6925 HandleScope scope(isolate);
6926 ASSERT(args.length() == 2); 6926 DCHECK(args.length() == 2);
6927 6927
6928 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6928 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6929 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6929 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6930 return *isolate->factory()->NewNumber(x + y); 6930 return *isolate->factory()->NewNumber(x + y);
6931 } 6931 }
6932 6932
6933 6933
6934 RUNTIME_FUNCTION(Runtime_NumberSub) { 6934 RUNTIME_FUNCTION(Runtime_NumberSub) {
6935 HandleScope scope(isolate); 6935 HandleScope scope(isolate);
6936 ASSERT(args.length() == 2); 6936 DCHECK(args.length() == 2);
6937 6937
6938 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6938 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6939 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6939 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6940 return *isolate->factory()->NewNumber(x - y); 6940 return *isolate->factory()->NewNumber(x - y);
6941 } 6941 }
6942 6942
6943 6943
6944 RUNTIME_FUNCTION(Runtime_NumberMul) { 6944 RUNTIME_FUNCTION(Runtime_NumberMul) {
6945 HandleScope scope(isolate); 6945 HandleScope scope(isolate);
6946 ASSERT(args.length() == 2); 6946 DCHECK(args.length() == 2);
6947 6947
6948 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6948 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6949 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6949 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6950 return *isolate->factory()->NewNumber(x * y); 6950 return *isolate->factory()->NewNumber(x * y);
6951 } 6951 }
6952 6952
6953 6953
6954 RUNTIME_FUNCTION(Runtime_NumberUnaryMinus) { 6954 RUNTIME_FUNCTION(Runtime_NumberUnaryMinus) {
6955 HandleScope scope(isolate); 6955 HandleScope scope(isolate);
6956 ASSERT(args.length() == 1); 6956 DCHECK(args.length() == 1);
6957 6957
6958 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6958 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6959 return *isolate->factory()->NewNumber(-x); 6959 return *isolate->factory()->NewNumber(-x);
6960 } 6960 }
6961 6961
6962 6962
6963 RUNTIME_FUNCTION(Runtime_NumberDiv) { 6963 RUNTIME_FUNCTION(Runtime_NumberDiv) {
6964 HandleScope scope(isolate); 6964 HandleScope scope(isolate);
6965 ASSERT(args.length() == 2); 6965 DCHECK(args.length() == 2);
6966 6966
6967 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6967 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6968 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6968 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6969 return *isolate->factory()->NewNumber(x / y); 6969 return *isolate->factory()->NewNumber(x / y);
6970 } 6970 }
6971 6971
6972 6972
6973 RUNTIME_FUNCTION(Runtime_NumberMod) { 6973 RUNTIME_FUNCTION(Runtime_NumberMod) {
6974 HandleScope scope(isolate); 6974 HandleScope scope(isolate);
6975 ASSERT(args.length() == 2); 6975 DCHECK(args.length() == 2);
6976 6976
6977 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 6977 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
6978 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 6978 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
6979 return *isolate->factory()->NewNumber(modulo(x, y)); 6979 return *isolate->factory()->NewNumber(modulo(x, y));
6980 } 6980 }
6981 6981
6982 6982
6983 RUNTIME_FUNCTION(Runtime_NumberImul) { 6983 RUNTIME_FUNCTION(Runtime_NumberImul) {
6984 HandleScope scope(isolate); 6984 HandleScope scope(isolate);
6985 ASSERT(args.length() == 2); 6985 DCHECK(args.length() == 2);
6986 6986
6987 // We rely on implementation-defined behavior below, but at least not on 6987 // We rely on implementation-defined behavior below, but at least not on
6988 // undefined behavior. 6988 // undefined behavior.
6989 CONVERT_NUMBER_CHECKED(uint32_t, x, Int32, args[0]); 6989 CONVERT_NUMBER_CHECKED(uint32_t, x, Int32, args[0]);
6990 CONVERT_NUMBER_CHECKED(uint32_t, y, Int32, args[1]); 6990 CONVERT_NUMBER_CHECKED(uint32_t, y, Int32, args[1]);
6991 int32_t product = static_cast<int32_t>(x * y); 6991 int32_t product = static_cast<int32_t>(x * y);
6992 return *isolate->factory()->NewNumberFromInt(product); 6992 return *isolate->factory()->NewNumberFromInt(product);
6993 } 6993 }
6994 6994
6995 6995
6996 RUNTIME_FUNCTION(Runtime_StringAdd) { 6996 RUNTIME_FUNCTION(Runtime_StringAdd) {
6997 HandleScope scope(isolate); 6997 HandleScope scope(isolate);
6998 ASSERT(args.length() == 2); 6998 DCHECK(args.length() == 2);
6999 CONVERT_ARG_HANDLE_CHECKED(String, str1, 0); 6999 CONVERT_ARG_HANDLE_CHECKED(String, str1, 0);
7000 CONVERT_ARG_HANDLE_CHECKED(String, str2, 1); 7000 CONVERT_ARG_HANDLE_CHECKED(String, str2, 1);
7001 isolate->counters()->string_add_runtime()->Increment(); 7001 isolate->counters()->string_add_runtime()->Increment();
7002 Handle<String> result; 7002 Handle<String> result;
7003 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 7003 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
7004 isolate, result, isolate->factory()->NewConsString(str1, str2)); 7004 isolate, result, isolate->factory()->NewConsString(str1, str2));
7005 return *result; 7005 return *result;
7006 } 7006 }
7007 7007
7008 7008
(...skipping 11 matching lines...) Expand all
7020 int encoded_slice = Smi::cast(element)->value(); 7020 int encoded_slice = Smi::cast(element)->value();
7021 int pos; 7021 int pos;
7022 int len; 7022 int len;
7023 if (encoded_slice > 0) { 7023 if (encoded_slice > 0) {
7024 // Position and length encoded in one smi. 7024 // Position and length encoded in one smi.
7025 pos = StringBuilderSubstringPosition::decode(encoded_slice); 7025 pos = StringBuilderSubstringPosition::decode(encoded_slice);
7026 len = StringBuilderSubstringLength::decode(encoded_slice); 7026 len = StringBuilderSubstringLength::decode(encoded_slice);
7027 } else { 7027 } else {
7028 // Position and length encoded in two smis. 7028 // Position and length encoded in two smis.
7029 Object* obj = fixed_array->get(++i); 7029 Object* obj = fixed_array->get(++i);
7030 ASSERT(obj->IsSmi()); 7030 DCHECK(obj->IsSmi());
7031 pos = Smi::cast(obj)->value(); 7031 pos = Smi::cast(obj)->value();
7032 len = -encoded_slice; 7032 len = -encoded_slice;
7033 } 7033 }
7034 String::WriteToFlat(special, 7034 String::WriteToFlat(special,
7035 sink + position, 7035 sink + position,
7036 pos, 7036 pos,
7037 pos + len); 7037 pos + len);
7038 position += len; 7038 position += len;
7039 } else { 7039 } else {
7040 String* string = String::cast(element); 7040 String* string = String::cast(element);
(...skipping 29 matching lines...) Expand all
7070 // Position and length encoded in two smis. 7070 // Position and length encoded in two smis.
7071 len = -smi_value; 7071 len = -smi_value;
7072 // Get the position and check that it is a positive smi. 7072 // Get the position and check that it is a positive smi.
7073 i++; 7073 i++;
7074 if (i >= array_length) return -1; 7074 if (i >= array_length) return -1;
7075 Object* next_smi = fixed_array->get(i); 7075 Object* next_smi = fixed_array->get(i);
7076 if (!next_smi->IsSmi()) return -1; 7076 if (!next_smi->IsSmi()) return -1;
7077 pos = Smi::cast(next_smi)->value(); 7077 pos = Smi::cast(next_smi)->value();
7078 if (pos < 0) return -1; 7078 if (pos < 0) return -1;
7079 } 7079 }
7080 ASSERT(pos >= 0); 7080 DCHECK(pos >= 0);
7081 ASSERT(len >= 0); 7081 DCHECK(len >= 0);
7082 if (pos > special_length || len > special_length - pos) return -1; 7082 if (pos > special_length || len > special_length - pos) return -1;
7083 increment = len; 7083 increment = len;
7084 } else if (elt->IsString()) { 7084 } else if (elt->IsString()) {
7085 String* element = String::cast(elt); 7085 String* element = String::cast(elt);
7086 int element_length = element->length(); 7086 int element_length = element->length();
7087 increment = element_length; 7087 increment = element_length;
7088 if (*one_byte && !element->HasOnlyOneByteChars()) { 7088 if (*one_byte && !element->HasOnlyOneByteChars()) {
7089 *one_byte = false; 7089 *one_byte = false;
7090 } 7090 }
7091 } else { 7091 } else {
7092 return -1; 7092 return -1;
7093 } 7093 }
7094 if (increment > String::kMaxLength - position) { 7094 if (increment > String::kMaxLength - position) {
7095 return kMaxInt; // Provoke throw on allocation. 7095 return kMaxInt; // Provoke throw on allocation.
7096 } 7096 }
7097 position += increment; 7097 position += increment;
7098 } 7098 }
7099 return position; 7099 return position;
7100 } 7100 }
7101 7101
7102 7102
7103 RUNTIME_FUNCTION(Runtime_StringBuilderConcat) { 7103 RUNTIME_FUNCTION(Runtime_StringBuilderConcat) {
7104 HandleScope scope(isolate); 7104 HandleScope scope(isolate);
7105 ASSERT(args.length() == 3); 7105 DCHECK(args.length() == 3);
7106 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); 7106 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
7107 if (!args[1]->IsSmi()) return isolate->ThrowInvalidStringLength(); 7107 if (!args[1]->IsSmi()) return isolate->ThrowInvalidStringLength();
7108 CONVERT_SMI_ARG_CHECKED(array_length, 1); 7108 CONVERT_SMI_ARG_CHECKED(array_length, 1);
7109 CONVERT_ARG_HANDLE_CHECKED(String, special, 2); 7109 CONVERT_ARG_HANDLE_CHECKED(String, special, 2);
7110 7110
7111 size_t actual_array_length = 0; 7111 size_t actual_array_length = 0;
7112 RUNTIME_ASSERT( 7112 RUNTIME_ASSERT(
7113 TryNumberToSize(isolate, array->length(), &actual_array_length)); 7113 TryNumberToSize(isolate, array->length(), &actual_array_length));
7114 RUNTIME_ASSERT(array_length >= 0); 7114 RUNTIME_ASSERT(array_length >= 0);
7115 RUNTIME_ASSERT(static_cast<size_t>(array_length) <= actual_array_length); 7115 RUNTIME_ASSERT(static_cast<size_t>(array_length) <= actual_array_length);
7116 7116
7117 // This assumption is used by the slice encoding in one or two smis. 7117 // This assumption is used by the slice encoding in one or two smis.
7118 ASSERT(Smi::kMaxValue >= String::kMaxLength); 7118 DCHECK(Smi::kMaxValue >= String::kMaxLength);
7119 7119
7120 RUNTIME_ASSERT(array->HasFastElements()); 7120 RUNTIME_ASSERT(array->HasFastElements());
7121 JSObject::EnsureCanContainHeapObjectElements(array); 7121 JSObject::EnsureCanContainHeapObjectElements(array);
7122 7122
7123 int special_length = special->length(); 7123 int special_length = special->length();
7124 if (!array->HasFastObjectElements()) { 7124 if (!array->HasFastObjectElements()) {
7125 return isolate->Throw(isolate->heap()->illegal_argument_string()); 7125 return isolate->Throw(isolate->heap()->illegal_argument_string());
7126 } 7126 }
7127 7127
7128 int length; 7128 int length;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
7167 answer->GetChars(), 7167 answer->GetChars(),
7168 FixedArray::cast(array->elements()), 7168 FixedArray::cast(array->elements()),
7169 array_length); 7169 array_length);
7170 return *answer; 7170 return *answer;
7171 } 7171 }
7172 } 7172 }
7173 7173
7174 7174
7175 RUNTIME_FUNCTION(Runtime_StringBuilderJoin) { 7175 RUNTIME_FUNCTION(Runtime_StringBuilderJoin) {
7176 HandleScope scope(isolate); 7176 HandleScope scope(isolate);
7177 ASSERT(args.length() == 3); 7177 DCHECK(args.length() == 3);
7178 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); 7178 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
7179 if (!args[1]->IsSmi()) return isolate->ThrowInvalidStringLength(); 7179 if (!args[1]->IsSmi()) return isolate->ThrowInvalidStringLength();
7180 CONVERT_SMI_ARG_CHECKED(array_length, 1); 7180 CONVERT_SMI_ARG_CHECKED(array_length, 1);
7181 CONVERT_ARG_HANDLE_CHECKED(String, separator, 2); 7181 CONVERT_ARG_HANDLE_CHECKED(String, separator, 2);
7182 RUNTIME_ASSERT(array->HasFastObjectElements()); 7182 RUNTIME_ASSERT(array->HasFastObjectElements());
7183 RUNTIME_ASSERT(array_length >= 0); 7183 RUNTIME_ASSERT(array_length >= 0);
7184 7184
7185 Handle<FixedArray> fixed_array(FixedArray::cast(array->elements())); 7185 Handle<FixedArray> fixed_array(FixedArray::cast(array->elements()));
7186 if (fixed_array->length() < array_length) { 7186 if (fixed_array->length() < array_length) {
7187 array_length = fixed_array->length(); 7187 array_length = fixed_array->length();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
7229 #endif 7229 #endif
7230 7230
7231 RUNTIME_ASSERT(fixed_array->get(0)->IsString()); 7231 RUNTIME_ASSERT(fixed_array->get(0)->IsString());
7232 String* first = String::cast(fixed_array->get(0)); 7232 String* first = String::cast(fixed_array->get(0));
7233 String* separator_raw = *separator; 7233 String* separator_raw = *separator;
7234 int first_length = first->length(); 7234 int first_length = first->length();
7235 String::WriteToFlat(first, sink, 0, first_length); 7235 String::WriteToFlat(first, sink, 0, first_length);
7236 sink += first_length; 7236 sink += first_length;
7237 7237
7238 for (int i = 1; i < array_length; i++) { 7238 for (int i = 1; i < array_length; i++) {
7239 ASSERT(sink + separator_length <= end); 7239 DCHECK(sink + separator_length <= end);
7240 String::WriteToFlat(separator_raw, sink, 0, separator_length); 7240 String::WriteToFlat(separator_raw, sink, 0, separator_length);
7241 sink += separator_length; 7241 sink += separator_length;
7242 7242
7243 RUNTIME_ASSERT(fixed_array->get(i)->IsString()); 7243 RUNTIME_ASSERT(fixed_array->get(i)->IsString());
7244 String* element = String::cast(fixed_array->get(i)); 7244 String* element = String::cast(fixed_array->get(i));
7245 int element_length = element->length(); 7245 int element_length = element->length();
7246 ASSERT(sink + element_length <= end); 7246 DCHECK(sink + element_length <= end);
7247 String::WriteToFlat(element, sink, 0, element_length); 7247 String::WriteToFlat(element, sink, 0, element_length);
7248 sink += element_length; 7248 sink += element_length;
7249 } 7249 }
7250 ASSERT(sink == end); 7250 DCHECK(sink == end);
7251 7251
7252 // Use %_FastAsciiArrayJoin instead. 7252 // Use %_FastAsciiArrayJoin instead.
7253 ASSERT(!answer->IsOneByteRepresentation()); 7253 DCHECK(!answer->IsOneByteRepresentation());
7254 return *answer; 7254 return *answer;
7255 } 7255 }
7256 7256
7257 template <typename Char> 7257 template <typename Char>
7258 static void JoinSparseArrayWithSeparator(FixedArray* elements, 7258 static void JoinSparseArrayWithSeparator(FixedArray* elements,
7259 int elements_length, 7259 int elements_length,
7260 uint32_t array_length, 7260 uint32_t array_length,
7261 String* separator, 7261 String* separator,
7262 Vector<Char> buffer) { 7262 Vector<Char> buffer) {
7263 DisallowHeapAllocation no_gc; 7263 DisallowHeapAllocation no_gc;
(...skipping 12 matching lines...) Expand all
7276 previous_separator_position++; 7276 previous_separator_position++;
7277 } 7277 }
7278 String::WriteToFlat<Char>(string, &buffer[cursor], 7278 String::WriteToFlat<Char>(string, &buffer[cursor],
7279 0, string_length); 7279 0, string_length);
7280 cursor += string->length(); 7280 cursor += string->length();
7281 } 7281 }
7282 } 7282 }
7283 if (separator_length > 0) { 7283 if (separator_length > 0) {
7284 // Array length must be representable as a signed 32-bit number, 7284 // Array length must be representable as a signed 32-bit number,
7285 // otherwise the total string length would have been too large. 7285 // otherwise the total string length would have been too large.
7286 ASSERT(array_length <= 0x7fffffff); // Is int32_t. 7286 DCHECK(array_length <= 0x7fffffff); // Is int32_t.
7287 int last_array_index = static_cast<int>(array_length - 1); 7287 int last_array_index = static_cast<int>(array_length - 1);
7288 while (previous_separator_position < last_array_index) { 7288 while (previous_separator_position < last_array_index) {
7289 String::WriteToFlat<Char>(separator, &buffer[cursor], 7289 String::WriteToFlat<Char>(separator, &buffer[cursor],
7290 0, separator_length); 7290 0, separator_length);
7291 cursor += separator_length; 7291 cursor += separator_length;
7292 previous_separator_position++; 7292 previous_separator_position++;
7293 } 7293 }
7294 } 7294 }
7295 ASSERT(cursor <= buffer.length()); 7295 DCHECK(cursor <= buffer.length());
7296 } 7296 }
7297 7297
7298 7298
7299 RUNTIME_FUNCTION(Runtime_SparseJoinWithSeparator) { 7299 RUNTIME_FUNCTION(Runtime_SparseJoinWithSeparator) {
7300 HandleScope scope(isolate); 7300 HandleScope scope(isolate);
7301 ASSERT(args.length() == 3); 7301 DCHECK(args.length() == 3);
7302 CONVERT_ARG_HANDLE_CHECKED(JSArray, elements_array, 0); 7302 CONVERT_ARG_HANDLE_CHECKED(JSArray, elements_array, 0);
7303 CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]); 7303 CONVERT_NUMBER_CHECKED(uint32_t, array_length, Uint32, args[1]);
7304 CONVERT_ARG_HANDLE_CHECKED(String, separator, 2); 7304 CONVERT_ARG_HANDLE_CHECKED(String, separator, 2);
7305 // elements_array is fast-mode JSarray of alternating positions 7305 // elements_array is fast-mode JSarray of alternating positions
7306 // (increasing order) and strings. 7306 // (increasing order) and strings.
7307 RUNTIME_ASSERT(elements_array->HasFastSmiOrObjectElements()); 7307 RUNTIME_ASSERT(elements_array->HasFastSmiOrObjectElements());
7308 // array_length is length of original array (used to add separators); 7308 // array_length is length of original array (used to add separators);
7309 // separator is string to put between elements. Assumed to be non-empty. 7309 // separator is string to put between elements. Assumed to be non-empty.
7310 RUNTIME_ASSERT(array_length > 0); 7310 RUNTIME_ASSERT(array_length > 0);
7311 7311
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
7384 array_length, 7384 array_length,
7385 *separator, 7385 *separator,
7386 Vector<uc16>(result->GetChars(), string_length)); 7386 Vector<uc16>(result->GetChars(), string_length));
7387 return *result; 7387 return *result;
7388 } 7388 }
7389 } 7389 }
7390 7390
7391 7391
7392 RUNTIME_FUNCTION(Runtime_NumberOr) { 7392 RUNTIME_FUNCTION(Runtime_NumberOr) {
7393 HandleScope scope(isolate); 7393 HandleScope scope(isolate);
7394 ASSERT(args.length() == 2); 7394 DCHECK(args.length() == 2);
7395 7395
7396 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 7396 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
7397 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 7397 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
7398 return *isolate->factory()->NewNumberFromInt(x | y); 7398 return *isolate->factory()->NewNumberFromInt(x | y);
7399 } 7399 }
7400 7400
7401 7401
7402 RUNTIME_FUNCTION(Runtime_NumberAnd) { 7402 RUNTIME_FUNCTION(Runtime_NumberAnd) {
7403 HandleScope scope(isolate); 7403 HandleScope scope(isolate);
7404 ASSERT(args.length() == 2); 7404 DCHECK(args.length() == 2);
7405 7405
7406 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 7406 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
7407 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 7407 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
7408 return *isolate->factory()->NewNumberFromInt(x & y); 7408 return *isolate->factory()->NewNumberFromInt(x & y);
7409 } 7409 }
7410 7410
7411 7411
7412 RUNTIME_FUNCTION(Runtime_NumberXor) { 7412 RUNTIME_FUNCTION(Runtime_NumberXor) {
7413 HandleScope scope(isolate); 7413 HandleScope scope(isolate);
7414 ASSERT(args.length() == 2); 7414 DCHECK(args.length() == 2);
7415 7415
7416 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 7416 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
7417 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 7417 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
7418 return *isolate->factory()->NewNumberFromInt(x ^ y); 7418 return *isolate->factory()->NewNumberFromInt(x ^ y);
7419 } 7419 }
7420 7420
7421 7421
7422 RUNTIME_FUNCTION(Runtime_NumberShl) { 7422 RUNTIME_FUNCTION(Runtime_NumberShl) {
7423 HandleScope scope(isolate); 7423 HandleScope scope(isolate);
7424 ASSERT(args.length() == 2); 7424 DCHECK(args.length() == 2);
7425 7425
7426 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 7426 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
7427 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 7427 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
7428 return *isolate->factory()->NewNumberFromInt(x << (y & 0x1f)); 7428 return *isolate->factory()->NewNumberFromInt(x << (y & 0x1f));
7429 } 7429 }
7430 7430
7431 7431
7432 RUNTIME_FUNCTION(Runtime_NumberShr) { 7432 RUNTIME_FUNCTION(Runtime_NumberShr) {
7433 HandleScope scope(isolate); 7433 HandleScope scope(isolate);
7434 ASSERT(args.length() == 2); 7434 DCHECK(args.length() == 2);
7435 7435
7436 CONVERT_NUMBER_CHECKED(uint32_t, x, Uint32, args[0]); 7436 CONVERT_NUMBER_CHECKED(uint32_t, x, Uint32, args[0]);
7437 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 7437 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
7438 return *isolate->factory()->NewNumberFromUint(x >> (y & 0x1f)); 7438 return *isolate->factory()->NewNumberFromUint(x >> (y & 0x1f));
7439 } 7439 }
7440 7440
7441 7441
7442 RUNTIME_FUNCTION(Runtime_NumberSar) { 7442 RUNTIME_FUNCTION(Runtime_NumberSar) {
7443 HandleScope scope(isolate); 7443 HandleScope scope(isolate);
7444 ASSERT(args.length() == 2); 7444 DCHECK(args.length() == 2);
7445 7445
7446 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 7446 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
7447 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 7447 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
7448 return *isolate->factory()->NewNumberFromInt( 7448 return *isolate->factory()->NewNumberFromInt(
7449 ArithmeticShiftRight(x, y & 0x1f)); 7449 ArithmeticShiftRight(x, y & 0x1f));
7450 } 7450 }
7451 7451
7452 7452
7453 RUNTIME_FUNCTION(Runtime_NumberEquals) { 7453 RUNTIME_FUNCTION(Runtime_NumberEquals) {
7454 SealHandleScope shs(isolate); 7454 SealHandleScope shs(isolate);
7455 ASSERT(args.length() == 2); 7455 DCHECK(args.length() == 2);
7456 7456
7457 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7457 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7458 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 7458 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
7459 if (std::isnan(x)) return Smi::FromInt(NOT_EQUAL); 7459 if (std::isnan(x)) return Smi::FromInt(NOT_EQUAL);
7460 if (std::isnan(y)) return Smi::FromInt(NOT_EQUAL); 7460 if (std::isnan(y)) return Smi::FromInt(NOT_EQUAL);
7461 if (x == y) return Smi::FromInt(EQUAL); 7461 if (x == y) return Smi::FromInt(EQUAL);
7462 Object* result; 7462 Object* result;
7463 if ((fpclassify(x) == FP_ZERO) && (fpclassify(y) == FP_ZERO)) { 7463 if ((fpclassify(x) == FP_ZERO) && (fpclassify(y) == FP_ZERO)) {
7464 result = Smi::FromInt(EQUAL); 7464 result = Smi::FromInt(EQUAL);
7465 } else { 7465 } else {
7466 result = Smi::FromInt(NOT_EQUAL); 7466 result = Smi::FromInt(NOT_EQUAL);
7467 } 7467 }
7468 return result; 7468 return result;
7469 } 7469 }
7470 7470
7471 7471
7472 RUNTIME_FUNCTION(Runtime_StringEquals) { 7472 RUNTIME_FUNCTION(Runtime_StringEquals) {
7473 HandleScope handle_scope(isolate); 7473 HandleScope handle_scope(isolate);
7474 ASSERT(args.length() == 2); 7474 DCHECK(args.length() == 2);
7475 7475
7476 CONVERT_ARG_HANDLE_CHECKED(String, x, 0); 7476 CONVERT_ARG_HANDLE_CHECKED(String, x, 0);
7477 CONVERT_ARG_HANDLE_CHECKED(String, y, 1); 7477 CONVERT_ARG_HANDLE_CHECKED(String, y, 1);
7478 7478
7479 bool not_equal = !String::Equals(x, y); 7479 bool not_equal = !String::Equals(x, y);
7480 // This is slightly convoluted because the value that signifies 7480 // This is slightly convoluted because the value that signifies
7481 // equality is 0 and inequality is 1 so we have to negate the result 7481 // equality is 0 and inequality is 1 so we have to negate the result
7482 // from String::Equals. 7482 // from String::Equals.
7483 ASSERT(not_equal == 0 || not_equal == 1); 7483 DCHECK(not_equal == 0 || not_equal == 1);
7484 STATIC_ASSERT(EQUAL == 0); 7484 STATIC_ASSERT(EQUAL == 0);
7485 STATIC_ASSERT(NOT_EQUAL == 1); 7485 STATIC_ASSERT(NOT_EQUAL == 1);
7486 return Smi::FromInt(not_equal); 7486 return Smi::FromInt(not_equal);
7487 } 7487 }
7488 7488
7489 7489
7490 RUNTIME_FUNCTION(Runtime_NumberCompare) { 7490 RUNTIME_FUNCTION(Runtime_NumberCompare) {
7491 SealHandleScope shs(isolate); 7491 SealHandleScope shs(isolate);
7492 ASSERT(args.length() == 3); 7492 DCHECK(args.length() == 3);
7493 7493
7494 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7494 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7495 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 7495 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
7496 CONVERT_ARG_HANDLE_CHECKED(Object, uncomparable_result, 2) 7496 CONVERT_ARG_HANDLE_CHECKED(Object, uncomparable_result, 2)
7497 if (std::isnan(x) || std::isnan(y)) return *uncomparable_result; 7497 if (std::isnan(x) || std::isnan(y)) return *uncomparable_result;
7498 if (x == y) return Smi::FromInt(EQUAL); 7498 if (x == y) return Smi::FromInt(EQUAL);
7499 if (isless(x, y)) return Smi::FromInt(LESS); 7499 if (isless(x, y)) return Smi::FromInt(LESS);
7500 return Smi::FromInt(GREATER); 7500 return Smi::FromInt(GREATER);
7501 } 7501 }
7502 7502
7503 7503
7504 // Compare two Smis as if they were converted to strings and then 7504 // Compare two Smis as if they were converted to strings and then
7505 // compared lexicographically. 7505 // compared lexicographically.
7506 RUNTIME_FUNCTION(Runtime_SmiLexicographicCompare) { 7506 RUNTIME_FUNCTION(Runtime_SmiLexicographicCompare) {
7507 SealHandleScope shs(isolate); 7507 SealHandleScope shs(isolate);
7508 ASSERT(args.length() == 2); 7508 DCHECK(args.length() == 2);
7509 CONVERT_SMI_ARG_CHECKED(x_value, 0); 7509 CONVERT_SMI_ARG_CHECKED(x_value, 0);
7510 CONVERT_SMI_ARG_CHECKED(y_value, 1); 7510 CONVERT_SMI_ARG_CHECKED(y_value, 1);
7511 7511
7512 // If the integers are equal so are the string representations. 7512 // If the integers are equal so are the string representations.
7513 if (x_value == y_value) return Smi::FromInt(EQUAL); 7513 if (x_value == y_value) return Smi::FromInt(EQUAL);
7514 7514
7515 // If one of the integers is zero the normal integer order is the 7515 // If one of the integers is zero the normal integer order is the
7516 // same as the lexicographic order of the string representations. 7516 // same as the lexicographic order of the string representations.
7517 if (x_value == 0 || y_value == 0) 7517 if (x_value == 0 || y_value == 0)
7518 return Smi::FromInt(x_value < y_value ? LESS : GREATER); 7518 return Smi::FromInt(x_value < y_value ? LESS : GREATER);
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
7573 } 7573 }
7574 7574
7575 if (x_scaled < y_scaled) return Smi::FromInt(LESS); 7575 if (x_scaled < y_scaled) return Smi::FromInt(LESS);
7576 if (x_scaled > y_scaled) return Smi::FromInt(GREATER); 7576 if (x_scaled > y_scaled) return Smi::FromInt(GREATER);
7577 return Smi::FromInt(tie); 7577 return Smi::FromInt(tie);
7578 } 7578 }
7579 7579
7580 7580
7581 RUNTIME_FUNCTION(Runtime_StringCompare) { 7581 RUNTIME_FUNCTION(Runtime_StringCompare) {
7582 HandleScope handle_scope(isolate); 7582 HandleScope handle_scope(isolate);
7583 ASSERT(args.length() == 2); 7583 DCHECK(args.length() == 2);
7584 7584
7585 CONVERT_ARG_HANDLE_CHECKED(String, x, 0); 7585 CONVERT_ARG_HANDLE_CHECKED(String, x, 0);
7586 CONVERT_ARG_HANDLE_CHECKED(String, y, 1); 7586 CONVERT_ARG_HANDLE_CHECKED(String, y, 1);
7587 7587
7588 isolate->counters()->string_compare_runtime()->Increment(); 7588 isolate->counters()->string_compare_runtime()->Increment();
7589 7589
7590 // A few fast case tests before we flatten. 7590 // A few fast case tests before we flatten.
7591 if (x.is_identical_to(y)) return Smi::FromInt(EQUAL); 7591 if (x.is_identical_to(y)) return Smi::FromInt(EQUAL);
7592 if (y->length() == 0) { 7592 if (y->length() == 0) {
7593 if (x->length() == 0) return Smi::FromInt(EQUAL); 7593 if (x->length() == 0) return Smi::FromInt(EQUAL);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
7641 } else { 7641 } else {
7642 result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER); 7642 result = (r < 0) ? Smi::FromInt(LESS) : Smi::FromInt(GREATER);
7643 } 7643 }
7644 return result; 7644 return result;
7645 } 7645 }
7646 7646
7647 7647
7648 #define RUNTIME_UNARY_MATH(Name, name) \ 7648 #define RUNTIME_UNARY_MATH(Name, name) \
7649 RUNTIME_FUNCTION(Runtime_Math##Name) { \ 7649 RUNTIME_FUNCTION(Runtime_Math##Name) { \
7650 HandleScope scope(isolate); \ 7650 HandleScope scope(isolate); \
7651 ASSERT(args.length() == 1); \ 7651 DCHECK(args.length() == 1); \
7652 isolate->counters()->math_##name()->Increment(); \ 7652 isolate->counters()->math_##name()->Increment(); \
7653 CONVERT_DOUBLE_ARG_CHECKED(x, 0); \ 7653 CONVERT_DOUBLE_ARG_CHECKED(x, 0); \
7654 return *isolate->factory()->NewHeapNumber(std::name(x)); \ 7654 return *isolate->factory()->NewHeapNumber(std::name(x)); \
7655 } 7655 }
7656 7656
7657 RUNTIME_UNARY_MATH(Acos, acos) 7657 RUNTIME_UNARY_MATH(Acos, acos)
7658 RUNTIME_UNARY_MATH(Asin, asin) 7658 RUNTIME_UNARY_MATH(Asin, asin)
7659 RUNTIME_UNARY_MATH(Atan, atan) 7659 RUNTIME_UNARY_MATH(Atan, atan)
7660 RUNTIME_UNARY_MATH(LogRT, log) 7660 RUNTIME_UNARY_MATH(LogRT, log)
7661 #undef RUNTIME_UNARY_MATH 7661 #undef RUNTIME_UNARY_MATH
7662 7662
7663 7663
7664 RUNTIME_FUNCTION(Runtime_DoubleHi) { 7664 RUNTIME_FUNCTION(Runtime_DoubleHi) {
7665 HandleScope scope(isolate); 7665 HandleScope scope(isolate);
7666 ASSERT(args.length() == 1); 7666 DCHECK(args.length() == 1);
7667 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7667 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7668 uint64_t integer = double_to_uint64(x); 7668 uint64_t integer = double_to_uint64(x);
7669 integer = (integer >> 32) & 0xFFFFFFFFu; 7669 integer = (integer >> 32) & 0xFFFFFFFFu;
7670 return *isolate->factory()->NewNumber(static_cast<int32_t>(integer)); 7670 return *isolate->factory()->NewNumber(static_cast<int32_t>(integer));
7671 } 7671 }
7672 7672
7673 7673
7674 RUNTIME_FUNCTION(Runtime_DoubleLo) { 7674 RUNTIME_FUNCTION(Runtime_DoubleLo) {
7675 HandleScope scope(isolate); 7675 HandleScope scope(isolate);
7676 ASSERT(args.length() == 1); 7676 DCHECK(args.length() == 1);
7677 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7677 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7678 return *isolate->factory()->NewNumber( 7678 return *isolate->factory()->NewNumber(
7679 static_cast<int32_t>(double_to_uint64(x) & 0xFFFFFFFFu)); 7679 static_cast<int32_t>(double_to_uint64(x) & 0xFFFFFFFFu));
7680 } 7680 }
7681 7681
7682 7682
7683 RUNTIME_FUNCTION(Runtime_ConstructDouble) { 7683 RUNTIME_FUNCTION(Runtime_ConstructDouble) {
7684 HandleScope scope(isolate); 7684 HandleScope scope(isolate);
7685 ASSERT(args.length() == 2); 7685 DCHECK(args.length() == 2);
7686 CONVERT_NUMBER_CHECKED(uint32_t, hi, Uint32, args[0]); 7686 CONVERT_NUMBER_CHECKED(uint32_t, hi, Uint32, args[0]);
7687 CONVERT_NUMBER_CHECKED(uint32_t, lo, Uint32, args[1]); 7687 CONVERT_NUMBER_CHECKED(uint32_t, lo, Uint32, args[1]);
7688 uint64_t result = (static_cast<uint64_t>(hi) << 32) | lo; 7688 uint64_t result = (static_cast<uint64_t>(hi) << 32) | lo;
7689 return *isolate->factory()->NewNumber(uint64_to_double(result)); 7689 return *isolate->factory()->NewNumber(uint64_to_double(result));
7690 } 7690 }
7691 7691
7692 7692
7693 static const double kPiDividedBy4 = 0.78539816339744830962; 7693 static const double kPiDividedBy4 = 0.78539816339744830962;
7694 7694
7695 7695
7696 RUNTIME_FUNCTION(Runtime_MathAtan2) { 7696 RUNTIME_FUNCTION(Runtime_MathAtan2) {
7697 HandleScope scope(isolate); 7697 HandleScope scope(isolate);
7698 ASSERT(args.length() == 2); 7698 DCHECK(args.length() == 2);
7699 isolate->counters()->math_atan2()->Increment(); 7699 isolate->counters()->math_atan2()->Increment();
7700 7700
7701 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7701 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7702 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 7702 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
7703 double result; 7703 double result;
7704 if (std::isinf(x) && std::isinf(y)) { 7704 if (std::isinf(x) && std::isinf(y)) {
7705 // Make sure that the result in case of two infinite arguments 7705 // Make sure that the result in case of two infinite arguments
7706 // is a multiple of Pi / 4. The sign of the result is determined 7706 // is a multiple of Pi / 4. The sign of the result is determined
7707 // by the first argument (x) and the sign of the second argument 7707 // by the first argument (x) and the sign of the second argument
7708 // determines the multiplier: one or three. 7708 // determines the multiplier: one or three.
7709 int multiplier = (x < 0) ? -1 : 1; 7709 int multiplier = (x < 0) ? -1 : 1;
7710 if (y < 0) multiplier *= 3; 7710 if (y < 0) multiplier *= 3;
7711 result = multiplier * kPiDividedBy4; 7711 result = multiplier * kPiDividedBy4;
7712 } else { 7712 } else {
7713 result = std::atan2(x, y); 7713 result = std::atan2(x, y);
7714 } 7714 }
7715 return *isolate->factory()->NewNumber(result); 7715 return *isolate->factory()->NewNumber(result);
7716 } 7716 }
7717 7717
7718 7718
7719 RUNTIME_FUNCTION(Runtime_MathExpRT) { 7719 RUNTIME_FUNCTION(Runtime_MathExpRT) {
7720 HandleScope scope(isolate); 7720 HandleScope scope(isolate);
7721 ASSERT(args.length() == 1); 7721 DCHECK(args.length() == 1);
7722 isolate->counters()->math_exp()->Increment(); 7722 isolate->counters()->math_exp()->Increment();
7723 7723
7724 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7724 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7725 lazily_initialize_fast_exp(); 7725 lazily_initialize_fast_exp();
7726 return *isolate->factory()->NewNumber(fast_exp(x)); 7726 return *isolate->factory()->NewNumber(fast_exp(x));
7727 } 7727 }
7728 7728
7729 7729
7730 RUNTIME_FUNCTION(Runtime_MathFloorRT) { 7730 RUNTIME_FUNCTION(Runtime_MathFloorRT) {
7731 HandleScope scope(isolate); 7731 HandleScope scope(isolate);
7732 ASSERT(args.length() == 1); 7732 DCHECK(args.length() == 1);
7733 isolate->counters()->math_floor()->Increment(); 7733 isolate->counters()->math_floor()->Increment();
7734 7734
7735 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7735 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7736 return *isolate->factory()->NewNumber(Floor(x)); 7736 return *isolate->factory()->NewNumber(Floor(x));
7737 } 7737 }
7738 7738
7739 7739
7740 // Slow version of Math.pow. We check for fast paths for special cases. 7740 // Slow version of Math.pow. We check for fast paths for special cases.
7741 // Used if VFP3 is not available. 7741 // Used if VFP3 is not available.
7742 RUNTIME_FUNCTION(Runtime_MathPowSlow) { 7742 RUNTIME_FUNCTION(Runtime_MathPowSlow) {
7743 HandleScope scope(isolate); 7743 HandleScope scope(isolate);
7744 ASSERT(args.length() == 2); 7744 DCHECK(args.length() == 2);
7745 isolate->counters()->math_pow()->Increment(); 7745 isolate->counters()->math_pow()->Increment();
7746 7746
7747 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7747 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7748 7748
7749 // If the second argument is a smi, it is much faster to call the 7749 // If the second argument is a smi, it is much faster to call the
7750 // custom powi() function than the generic pow(). 7750 // custom powi() function than the generic pow().
7751 if (args[1]->IsSmi()) { 7751 if (args[1]->IsSmi()) {
7752 int y = args.smi_at(1); 7752 int y = args.smi_at(1);
7753 return *isolate->factory()->NewNumber(power_double_int(x, y)); 7753 return *isolate->factory()->NewNumber(power_double_int(x, y));
7754 } 7754 }
7755 7755
7756 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 7756 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
7757 double result = power_helper(x, y); 7757 double result = power_helper(x, y);
7758 if (std::isnan(result)) return isolate->heap()->nan_value(); 7758 if (std::isnan(result)) return isolate->heap()->nan_value();
7759 return *isolate->factory()->NewNumber(result); 7759 return *isolate->factory()->NewNumber(result);
7760 } 7760 }
7761 7761
7762 7762
7763 // Fast version of Math.pow if we know that y is not an integer and y is not 7763 // Fast version of Math.pow if we know that y is not an integer and y is not
7764 // -0.5 or 0.5. Used as slow case from full codegen. 7764 // -0.5 or 0.5. Used as slow case from full codegen.
7765 RUNTIME_FUNCTION(Runtime_MathPowRT) { 7765 RUNTIME_FUNCTION(Runtime_MathPowRT) {
7766 HandleScope scope(isolate); 7766 HandleScope scope(isolate);
7767 ASSERT(args.length() == 2); 7767 DCHECK(args.length() == 2);
7768 isolate->counters()->math_pow()->Increment(); 7768 isolate->counters()->math_pow()->Increment();
7769 7769
7770 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7770 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7771 CONVERT_DOUBLE_ARG_CHECKED(y, 1); 7771 CONVERT_DOUBLE_ARG_CHECKED(y, 1);
7772 if (y == 0) { 7772 if (y == 0) {
7773 return Smi::FromInt(1); 7773 return Smi::FromInt(1);
7774 } else { 7774 } else {
7775 double result = power_double_double(x, y); 7775 double result = power_double_double(x, y);
7776 if (std::isnan(result)) return isolate->heap()->nan_value(); 7776 if (std::isnan(result)) return isolate->heap()->nan_value();
7777 return *isolate->factory()->NewNumber(result); 7777 return *isolate->factory()->NewNumber(result);
7778 } 7778 }
7779 } 7779 }
7780 7780
7781 7781
7782 RUNTIME_FUNCTION(Runtime_RoundNumber) { 7782 RUNTIME_FUNCTION(Runtime_RoundNumber) {
7783 HandleScope scope(isolate); 7783 HandleScope scope(isolate);
7784 ASSERT(args.length() == 1); 7784 DCHECK(args.length() == 1);
7785 CONVERT_NUMBER_ARG_HANDLE_CHECKED(input, 0); 7785 CONVERT_NUMBER_ARG_HANDLE_CHECKED(input, 0);
7786 isolate->counters()->math_round()->Increment(); 7786 isolate->counters()->math_round()->Increment();
7787 7787
7788 if (!input->IsHeapNumber()) { 7788 if (!input->IsHeapNumber()) {
7789 ASSERT(input->IsSmi()); 7789 DCHECK(input->IsSmi());
7790 return *input; 7790 return *input;
7791 } 7791 }
7792 7792
7793 Handle<HeapNumber> number = Handle<HeapNumber>::cast(input); 7793 Handle<HeapNumber> number = Handle<HeapNumber>::cast(input);
7794 7794
7795 double value = number->value(); 7795 double value = number->value();
7796 int exponent = number->get_exponent(); 7796 int exponent = number->get_exponent();
7797 int sign = number->get_sign(); 7797 int sign = number->get_sign();
7798 7798
7799 if (exponent < -1) { 7799 if (exponent < -1) {
(...skipping 17 matching lines...) Expand all
7817 7817
7818 if (sign && value >= -0.5) return isolate->heap()->minus_zero_value(); 7818 if (sign && value >= -0.5) return isolate->heap()->minus_zero_value();
7819 7819
7820 // Do not call NumberFromDouble() to avoid extra checks. 7820 // Do not call NumberFromDouble() to avoid extra checks.
7821 return *isolate->factory()->NewNumber(Floor(value + 0.5)); 7821 return *isolate->factory()->NewNumber(Floor(value + 0.5));
7822 } 7822 }
7823 7823
7824 7824
7825 RUNTIME_FUNCTION(Runtime_MathSqrtRT) { 7825 RUNTIME_FUNCTION(Runtime_MathSqrtRT) {
7826 HandleScope scope(isolate); 7826 HandleScope scope(isolate);
7827 ASSERT(args.length() == 1); 7827 DCHECK(args.length() == 1);
7828 isolate->counters()->math_sqrt()->Increment(); 7828 isolate->counters()->math_sqrt()->Increment();
7829 7829
7830 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7830 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7831 return *isolate->factory()->NewNumber(fast_sqrt(x)); 7831 return *isolate->factory()->NewNumber(fast_sqrt(x));
7832 } 7832 }
7833 7833
7834 7834
7835 RUNTIME_FUNCTION(Runtime_MathFround) { 7835 RUNTIME_FUNCTION(Runtime_MathFround) {
7836 HandleScope scope(isolate); 7836 HandleScope scope(isolate);
7837 ASSERT(args.length() == 1); 7837 DCHECK(args.length() == 1);
7838 7838
7839 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 7839 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
7840 float xf = static_cast<float>(x); 7840 float xf = static_cast<float>(x);
7841 return *isolate->factory()->NewNumber(xf); 7841 return *isolate->factory()->NewNumber(xf);
7842 } 7842 }
7843 7843
7844 7844
7845 RUNTIME_FUNCTION(Runtime_DateMakeDay) { 7845 RUNTIME_FUNCTION(Runtime_DateMakeDay) {
7846 SealHandleScope shs(isolate); 7846 SealHandleScope shs(isolate);
7847 ASSERT(args.length() == 2); 7847 DCHECK(args.length() == 2);
7848 7848
7849 CONVERT_SMI_ARG_CHECKED(year, 0); 7849 CONVERT_SMI_ARG_CHECKED(year, 0);
7850 CONVERT_SMI_ARG_CHECKED(month, 1); 7850 CONVERT_SMI_ARG_CHECKED(month, 1);
7851 7851
7852 int days = isolate->date_cache()->DaysFromYearMonth(year, month); 7852 int days = isolate->date_cache()->DaysFromYearMonth(year, month);
7853 RUNTIME_ASSERT(Smi::IsValid(days)); 7853 RUNTIME_ASSERT(Smi::IsValid(days));
7854 return Smi::FromInt(days); 7854 return Smi::FromInt(days);
7855 } 7855 }
7856 7856
7857 7857
7858 RUNTIME_FUNCTION(Runtime_DateSetValue) { 7858 RUNTIME_FUNCTION(Runtime_DateSetValue) {
7859 HandleScope scope(isolate); 7859 HandleScope scope(isolate);
7860 ASSERT(args.length() == 3); 7860 DCHECK(args.length() == 3);
7861 7861
7862 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 0); 7862 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 0);
7863 CONVERT_DOUBLE_ARG_CHECKED(time, 1); 7863 CONVERT_DOUBLE_ARG_CHECKED(time, 1);
7864 CONVERT_SMI_ARG_CHECKED(is_utc, 2); 7864 CONVERT_SMI_ARG_CHECKED(is_utc, 2);
7865 7865
7866 DateCache* date_cache = isolate->date_cache(); 7866 DateCache* date_cache = isolate->date_cache();
7867 7867
7868 Handle<Object> value;; 7868 Handle<Object> value;;
7869 bool is_value_nan = false; 7869 bool is_value_nan = false;
7870 if (std::isnan(time)) { 7870 if (std::isnan(time)) {
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
7951 } else { 7951 } else {
7952 // The context index goes in the parameter map with a hole in the 7952 // The context index goes in the parameter map with a hole in the
7953 // arguments array. 7953 // arguments array.
7954 int context_index = -1; 7954 int context_index = -1;
7955 for (int j = 0; j < context_local_count; ++j) { 7955 for (int j = 0; j < context_local_count; ++j) {
7956 if (scope_info->ContextLocalName(j) == *name) { 7956 if (scope_info->ContextLocalName(j) == *name) {
7957 context_index = j; 7957 context_index = j;
7958 break; 7958 break;
7959 } 7959 }
7960 } 7960 }
7961 ASSERT(context_index >= 0); 7961 DCHECK(context_index >= 0);
7962 arguments->set_the_hole(index); 7962 arguments->set_the_hole(index);
7963 parameter_map->set(index + 2, Smi::FromInt( 7963 parameter_map->set(index + 2, Smi::FromInt(
7964 Context::MIN_CONTEXT_SLOTS + context_index)); 7964 Context::MIN_CONTEXT_SLOTS + context_index));
7965 } 7965 }
7966 7966
7967 --index; 7967 --index;
7968 } 7968 }
7969 } else { 7969 } else {
7970 // If there is no aliasing, the arguments object elements are not 7970 // If there is no aliasing, the arguments object elements are not
7971 // special in any way. 7971 // special in any way.
(...skipping 25 matching lines...) Expand all
7997 array->set(i, *--parameters, mode); 7997 array->set(i, *--parameters, mode);
7998 } 7998 }
7999 result->set_elements(*array); 7999 result->set_elements(*array);
8000 } 8000 }
8001 return result; 8001 return result;
8002 } 8002 }
8003 8003
8004 8004
8005 RUNTIME_FUNCTION(Runtime_NewArguments) { 8005 RUNTIME_FUNCTION(Runtime_NewArguments) {
8006 HandleScope scope(isolate); 8006 HandleScope scope(isolate);
8007 ASSERT(args.length() == 1); 8007 DCHECK(args.length() == 1);
8008 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0); 8008 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0);
8009 JavaScriptFrameIterator it(isolate); 8009 JavaScriptFrameIterator it(isolate);
8010 8010
8011 // Find the frame that holds the actual arguments passed to the function. 8011 // Find the frame that holds the actual arguments passed to the function.
8012 it.AdvanceToArgumentsFrame(); 8012 it.AdvanceToArgumentsFrame();
8013 JavaScriptFrame* frame = it.frame(); 8013 JavaScriptFrame* frame = it.frame();
8014 8014
8015 // Determine parameter location on the stack and dispatch on language mode. 8015 // Determine parameter location on the stack and dispatch on language mode.
8016 int argument_count = frame->GetArgumentsLength(); 8016 int argument_count = frame->GetArgumentsLength();
8017 Object** parameters = reinterpret_cast<Object**>(frame->GetParameterSlot(-1)); 8017 Object** parameters = reinterpret_cast<Object**>(frame->GetParameterSlot(-1));
8018 return callee->shared()->strict_mode() == STRICT 8018 return callee->shared()->strict_mode() == STRICT
8019 ? *NewStrictArguments(isolate, callee, parameters, argument_count) 8019 ? *NewStrictArguments(isolate, callee, parameters, argument_count)
8020 : *NewSloppyArguments(isolate, callee, parameters, argument_count); 8020 : *NewSloppyArguments(isolate, callee, parameters, argument_count);
8021 } 8021 }
8022 8022
8023 8023
8024 RUNTIME_FUNCTION(Runtime_NewSloppyArguments) { 8024 RUNTIME_FUNCTION(Runtime_NewSloppyArguments) {
8025 HandleScope scope(isolate); 8025 HandleScope scope(isolate);
8026 ASSERT(args.length() == 3); 8026 DCHECK(args.length() == 3);
8027 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0); 8027 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0);
8028 Object** parameters = reinterpret_cast<Object**>(args[1]); 8028 Object** parameters = reinterpret_cast<Object**>(args[1]);
8029 CONVERT_SMI_ARG_CHECKED(argument_count, 2); 8029 CONVERT_SMI_ARG_CHECKED(argument_count, 2);
8030 return *NewSloppyArguments(isolate, callee, parameters, argument_count); 8030 return *NewSloppyArguments(isolate, callee, parameters, argument_count);
8031 } 8031 }
8032 8032
8033 8033
8034 RUNTIME_FUNCTION(Runtime_NewStrictArguments) { 8034 RUNTIME_FUNCTION(Runtime_NewStrictArguments) {
8035 HandleScope scope(isolate); 8035 HandleScope scope(isolate);
8036 ASSERT(args.length() == 3); 8036 DCHECK(args.length() == 3);
8037 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0) 8037 CONVERT_ARG_HANDLE_CHECKED(JSFunction, callee, 0)
8038 Object** parameters = reinterpret_cast<Object**>(args[1]); 8038 Object** parameters = reinterpret_cast<Object**>(args[1]);
8039 CONVERT_SMI_ARG_CHECKED(argument_count, 2); 8039 CONVERT_SMI_ARG_CHECKED(argument_count, 2);
8040 return *NewStrictArguments(isolate, callee, parameters, argument_count); 8040 return *NewStrictArguments(isolate, callee, parameters, argument_count);
8041 } 8041 }
8042 8042
8043 8043
8044 RUNTIME_FUNCTION(Runtime_NewClosureFromStubFailure) { 8044 RUNTIME_FUNCTION(Runtime_NewClosureFromStubFailure) {
8045 HandleScope scope(isolate); 8045 HandleScope scope(isolate);
8046 ASSERT(args.length() == 1); 8046 DCHECK(args.length() == 1);
8047 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 0); 8047 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 0);
8048 Handle<Context> context(isolate->context()); 8048 Handle<Context> context(isolate->context());
8049 PretenureFlag pretenure_flag = NOT_TENURED; 8049 PretenureFlag pretenure_flag = NOT_TENURED;
8050 return *isolate->factory()->NewFunctionFromSharedFunctionInfo( 8050 return *isolate->factory()->NewFunctionFromSharedFunctionInfo(
8051 shared, context, pretenure_flag); 8051 shared, context, pretenure_flag);
8052 } 8052 }
8053 8053
8054 8054
8055 RUNTIME_FUNCTION(Runtime_NewClosure) { 8055 RUNTIME_FUNCTION(Runtime_NewClosure) {
8056 HandleScope scope(isolate); 8056 HandleScope scope(isolate);
8057 ASSERT(args.length() == 3); 8057 DCHECK(args.length() == 3);
8058 CONVERT_ARG_HANDLE_CHECKED(Context, context, 0); 8058 CONVERT_ARG_HANDLE_CHECKED(Context, context, 0);
8059 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 1); 8059 CONVERT_ARG_HANDLE_CHECKED(SharedFunctionInfo, shared, 1);
8060 CONVERT_BOOLEAN_ARG_CHECKED(pretenure, 2); 8060 CONVERT_BOOLEAN_ARG_CHECKED(pretenure, 2);
8061 8061
8062 // The caller ensures that we pretenure closures that are assigned 8062 // The caller ensures that we pretenure closures that are assigned
8063 // directly to properties. 8063 // directly to properties.
8064 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED; 8064 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED;
8065 return *isolate->factory()->NewFunctionFromSharedFunctionInfo( 8065 return *isolate->factory()->NewFunctionFromSharedFunctionInfo(
8066 shared, context, pretenure_flag); 8066 shared, context, pretenure_flag);
8067 } 8067 }
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
8112 Handle<Object> val = Handle<Object>(frame->GetParameter(i), isolate); 8112 Handle<Object> val = Handle<Object>(frame->GetParameter(i), isolate);
8113 param_data[prefix_argc + i] = val; 8113 param_data[prefix_argc + i] = val;
8114 } 8114 }
8115 return param_data; 8115 return param_data;
8116 } 8116 }
8117 } 8117 }
8118 8118
8119 8119
8120 RUNTIME_FUNCTION(Runtime_FunctionBindArguments) { 8120 RUNTIME_FUNCTION(Runtime_FunctionBindArguments) {
8121 HandleScope scope(isolate); 8121 HandleScope scope(isolate);
8122 ASSERT(args.length() == 4); 8122 DCHECK(args.length() == 4);
8123 CONVERT_ARG_HANDLE_CHECKED(JSFunction, bound_function, 0); 8123 CONVERT_ARG_HANDLE_CHECKED(JSFunction, bound_function, 0);
8124 CONVERT_ARG_HANDLE_CHECKED(Object, bindee, 1); 8124 CONVERT_ARG_HANDLE_CHECKED(Object, bindee, 1);
8125 CONVERT_ARG_HANDLE_CHECKED(Object, this_object, 2); 8125 CONVERT_ARG_HANDLE_CHECKED(Object, this_object, 2);
8126 CONVERT_NUMBER_ARG_HANDLE_CHECKED(new_length, 3); 8126 CONVERT_NUMBER_ARG_HANDLE_CHECKED(new_length, 3);
8127 8127
8128 // TODO(lrn): Create bound function in C++ code from premade shared info. 8128 // TODO(lrn): Create bound function in C++ code from premade shared info.
8129 bound_function->shared()->set_bound(true); 8129 bound_function->shared()->set_bound(true);
8130 // Get all arguments of calling function (Function.prototype.bind). 8130 // Get all arguments of calling function (Function.prototype.bind).
8131 int argc = 0; 8131 int argc = 0;
8132 SmartArrayPointer<Handle<Object> > arguments = 8132 SmartArrayPointer<Handle<Object> > arguments =
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
8181 RETURN_FAILURE_ON_EXCEPTION( 8181 RETURN_FAILURE_ON_EXCEPTION(
8182 isolate, 8182 isolate,
8183 JSObject::SetOwnPropertyIgnoreAttributes( 8183 JSObject::SetOwnPropertyIgnoreAttributes(
8184 bound_function, length_string, new_length, attr)); 8184 bound_function, length_string, new_length, attr));
8185 return *bound_function; 8185 return *bound_function;
8186 } 8186 }
8187 8187
8188 8188
8189 RUNTIME_FUNCTION(Runtime_BoundFunctionGetBindings) { 8189 RUNTIME_FUNCTION(Runtime_BoundFunctionGetBindings) {
8190 HandleScope handles(isolate); 8190 HandleScope handles(isolate);
8191 ASSERT(args.length() == 1); 8191 DCHECK(args.length() == 1);
8192 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, callable, 0); 8192 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, callable, 0);
8193 if (callable->IsJSFunction()) { 8193 if (callable->IsJSFunction()) {
8194 Handle<JSFunction> function = Handle<JSFunction>::cast(callable); 8194 Handle<JSFunction> function = Handle<JSFunction>::cast(callable);
8195 if (function->shared()->bound()) { 8195 if (function->shared()->bound()) {
8196 Handle<FixedArray> bindings(function->function_bindings()); 8196 Handle<FixedArray> bindings(function->function_bindings());
8197 RUNTIME_ASSERT(bindings->map() == isolate->heap()->fixed_cow_array_map()); 8197 RUNTIME_ASSERT(bindings->map() == isolate->heap()->fixed_cow_array_map());
8198 return *isolate->factory()->NewJSArrayWithElements(bindings); 8198 return *isolate->factory()->NewJSArrayWithElements(bindings);
8199 } 8199 }
8200 } 8200 }
8201 return isolate->heap()->undefined_value(); 8201 return isolate->heap()->undefined_value();
8202 } 8202 }
8203 8203
8204 8204
8205 RUNTIME_FUNCTION(Runtime_NewObjectFromBound) { 8205 RUNTIME_FUNCTION(Runtime_NewObjectFromBound) {
8206 HandleScope scope(isolate); 8206 HandleScope scope(isolate);
8207 ASSERT(args.length() == 1); 8207 DCHECK(args.length() == 1);
8208 // First argument is a function to use as a constructor. 8208 // First argument is a function to use as a constructor.
8209 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8209 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8210 RUNTIME_ASSERT(function->shared()->bound()); 8210 RUNTIME_ASSERT(function->shared()->bound());
8211 8211
8212 // The argument is a bound function. Extract its bound arguments 8212 // The argument is a bound function. Extract its bound arguments
8213 // and callable. 8213 // and callable.
8214 Handle<FixedArray> bound_args = 8214 Handle<FixedArray> bound_args =
8215 Handle<FixedArray>(FixedArray::cast(function->function_bindings())); 8215 Handle<FixedArray>(FixedArray::cast(function->function_bindings()));
8216 int bound_argc = bound_args->length() - JSFunction::kBoundArgumentsStartIndex; 8216 int bound_argc = bound_args->length() - JSFunction::kBoundArgumentsStartIndex;
8217 Handle<Object> bound_function( 8217 Handle<Object> bound_function(
8218 JSReceiver::cast(bound_args->get(JSFunction::kBoundFunctionIndex)), 8218 JSReceiver::cast(bound_args->get(JSFunction::kBoundFunctionIndex)),
8219 isolate); 8219 isolate);
8220 ASSERT(!bound_function->IsJSFunction() || 8220 DCHECK(!bound_function->IsJSFunction() ||
8221 !Handle<JSFunction>::cast(bound_function)->shared()->bound()); 8221 !Handle<JSFunction>::cast(bound_function)->shared()->bound());
8222 8222
8223 int total_argc = 0; 8223 int total_argc = 0;
8224 SmartArrayPointer<Handle<Object> > param_data = 8224 SmartArrayPointer<Handle<Object> > param_data =
8225 GetCallerArguments(isolate, bound_argc, &total_argc); 8225 GetCallerArguments(isolate, bound_argc, &total_argc);
8226 for (int i = 0; i < bound_argc; i++) { 8226 for (int i = 0; i < bound_argc; i++) {
8227 param_data[i] = Handle<Object>(bound_args->get( 8227 param_data[i] = Handle<Object>(bound_args->get(
8228 JSFunction::kBoundArgumentsStartIndex + i), isolate); 8228 JSFunction::kBoundArgumentsStartIndex + i), isolate);
8229 } 8229 }
8230 8230
8231 if (!bound_function->IsJSFunction()) { 8231 if (!bound_function->IsJSFunction()) {
8232 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 8232 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
8233 isolate, bound_function, 8233 isolate, bound_function,
8234 Execution::TryGetConstructorDelegate(isolate, bound_function)); 8234 Execution::TryGetConstructorDelegate(isolate, bound_function));
8235 } 8235 }
8236 ASSERT(bound_function->IsJSFunction()); 8236 DCHECK(bound_function->IsJSFunction());
8237 8237
8238 Handle<Object> result; 8238 Handle<Object> result;
8239 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 8239 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
8240 isolate, result, 8240 isolate, result,
8241 Execution::New(Handle<JSFunction>::cast(bound_function), 8241 Execution::New(Handle<JSFunction>::cast(bound_function),
8242 total_argc, param_data.get())); 8242 total_argc, param_data.get()));
8243 return *result; 8243 return *result;
8244 } 8244 }
8245 8245
8246 8246
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
8302 8302
8303 isolate->counters()->constructed_objects()->Increment(); 8303 isolate->counters()->constructed_objects()->Increment();
8304 isolate->counters()->constructed_objects_runtime()->Increment(); 8304 isolate->counters()->constructed_objects_runtime()->Increment();
8305 8305
8306 return *result; 8306 return *result;
8307 } 8307 }
8308 8308
8309 8309
8310 RUNTIME_FUNCTION(Runtime_NewObject) { 8310 RUNTIME_FUNCTION(Runtime_NewObject) {
8311 HandleScope scope(isolate); 8311 HandleScope scope(isolate);
8312 ASSERT(args.length() == 1); 8312 DCHECK(args.length() == 1);
8313 CONVERT_ARG_HANDLE_CHECKED(Object, constructor, 0); 8313 CONVERT_ARG_HANDLE_CHECKED(Object, constructor, 0);
8314 return Runtime_NewObjectHelper(isolate, 8314 return Runtime_NewObjectHelper(isolate,
8315 constructor, 8315 constructor,
8316 Handle<AllocationSite>::null()); 8316 Handle<AllocationSite>::null());
8317 } 8317 }
8318 8318
8319 8319
8320 RUNTIME_FUNCTION(Runtime_NewObjectWithAllocationSite) { 8320 RUNTIME_FUNCTION(Runtime_NewObjectWithAllocationSite) {
8321 HandleScope scope(isolate); 8321 HandleScope scope(isolate);
8322 ASSERT(args.length() == 2); 8322 DCHECK(args.length() == 2);
8323 CONVERT_ARG_HANDLE_CHECKED(Object, constructor, 1); 8323 CONVERT_ARG_HANDLE_CHECKED(Object, constructor, 1);
8324 CONVERT_ARG_HANDLE_CHECKED(Object, feedback, 0); 8324 CONVERT_ARG_HANDLE_CHECKED(Object, feedback, 0);
8325 Handle<AllocationSite> site; 8325 Handle<AllocationSite> site;
8326 if (feedback->IsAllocationSite()) { 8326 if (feedback->IsAllocationSite()) {
8327 // The feedback can be an AllocationSite or undefined. 8327 // The feedback can be an AllocationSite or undefined.
8328 site = Handle<AllocationSite>::cast(feedback); 8328 site = Handle<AllocationSite>::cast(feedback);
8329 } 8329 }
8330 return Runtime_NewObjectHelper(isolate, constructor, site); 8330 return Runtime_NewObjectHelper(isolate, constructor, site);
8331 } 8331 }
8332 8332
8333 8333
8334 RUNTIME_FUNCTION(Runtime_FinalizeInstanceSize) { 8334 RUNTIME_FUNCTION(Runtime_FinalizeInstanceSize) {
8335 HandleScope scope(isolate); 8335 HandleScope scope(isolate);
8336 ASSERT(args.length() == 1); 8336 DCHECK(args.length() == 1);
8337 8337
8338 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8338 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8339 function->CompleteInobjectSlackTracking(); 8339 function->CompleteInobjectSlackTracking();
8340 8340
8341 return isolate->heap()->undefined_value(); 8341 return isolate->heap()->undefined_value();
8342 } 8342 }
8343 8343
8344 8344
8345 RUNTIME_FUNCTION(Runtime_CompileUnoptimized) { 8345 RUNTIME_FUNCTION(Runtime_CompileUnoptimized) {
8346 HandleScope scope(isolate); 8346 HandleScope scope(isolate);
8347 ASSERT(args.length() == 1); 8347 DCHECK(args.length() == 1);
8348 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8348 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8349 #ifdef DEBUG 8349 #ifdef DEBUG
8350 if (FLAG_trace_lazy && !function->shared()->is_compiled()) { 8350 if (FLAG_trace_lazy && !function->shared()->is_compiled()) {
8351 PrintF("[unoptimized: "); 8351 PrintF("[unoptimized: ");
8352 function->PrintName(); 8352 function->PrintName();
8353 PrintF("]\n"); 8353 PrintF("]\n");
8354 } 8354 }
8355 #endif 8355 #endif
8356 8356
8357 // Compile the target function. 8357 // Compile the target function.
8358 ASSERT(function->shared()->allows_lazy_compilation()); 8358 DCHECK(function->shared()->allows_lazy_compilation());
8359 8359
8360 Handle<Code> code; 8360 Handle<Code> code;
8361 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, code, 8361 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, code,
8362 Compiler::GetUnoptimizedCode(function)); 8362 Compiler::GetUnoptimizedCode(function));
8363 function->ReplaceCode(*code); 8363 function->ReplaceCode(*code);
8364 8364
8365 // All done. Return the compiled code. 8365 // All done. Return the compiled code.
8366 ASSERT(function->is_compiled()); 8366 DCHECK(function->is_compiled());
8367 ASSERT(function->code()->kind() == Code::FUNCTION || 8367 DCHECK(function->code()->kind() == Code::FUNCTION ||
8368 (FLAG_always_opt && 8368 (FLAG_always_opt &&
8369 function->code()->kind() == Code::OPTIMIZED_FUNCTION)); 8369 function->code()->kind() == Code::OPTIMIZED_FUNCTION));
8370 return *code; 8370 return *code;
8371 } 8371 }
8372 8372
8373 8373
8374 RUNTIME_FUNCTION(Runtime_CompileOptimized) { 8374 RUNTIME_FUNCTION(Runtime_CompileOptimized) {
8375 HandleScope scope(isolate); 8375 HandleScope scope(isolate);
8376 ASSERT(args.length() == 2); 8376 DCHECK(args.length() == 2);
8377 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8377 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8378 CONVERT_BOOLEAN_ARG_CHECKED(concurrent, 1); 8378 CONVERT_BOOLEAN_ARG_CHECKED(concurrent, 1);
8379 8379
8380 Handle<Code> unoptimized(function->shared()->code()); 8380 Handle<Code> unoptimized(function->shared()->code());
8381 if (!function->shared()->is_compiled()) { 8381 if (!function->shared()->is_compiled()) {
8382 // If the function is not compiled, do not optimize. 8382 // If the function is not compiled, do not optimize.
8383 // This can happen if the debugger is activated and 8383 // This can happen if the debugger is activated and
8384 // the function is returned to the not compiled state. 8384 // the function is returned to the not compiled state.
8385 // TODO(yangguo): reconsider this. 8385 // TODO(yangguo): reconsider this.
8386 function->ReplaceCode(function->shared()->code()); 8386 function->ReplaceCode(function->shared()->code());
(...skipping 15 matching lines...) Expand all
8402 : Compiler::NOT_CONCURRENT; 8402 : Compiler::NOT_CONCURRENT;
8403 Handle<Code> code; 8403 Handle<Code> code;
8404 if (Compiler::GetOptimizedCode( 8404 if (Compiler::GetOptimizedCode(
8405 function, unoptimized, mode).ToHandle(&code)) { 8405 function, unoptimized, mode).ToHandle(&code)) {
8406 function->ReplaceCode(*code); 8406 function->ReplaceCode(*code);
8407 } else { 8407 } else {
8408 function->ReplaceCode(*unoptimized); 8408 function->ReplaceCode(*unoptimized);
8409 } 8409 }
8410 } 8410 }
8411 8411
8412 ASSERT(function->code()->kind() == Code::FUNCTION || 8412 DCHECK(function->code()->kind() == Code::FUNCTION ||
8413 function->code()->kind() == Code::OPTIMIZED_FUNCTION || 8413 function->code()->kind() == Code::OPTIMIZED_FUNCTION ||
8414 function->IsInOptimizationQueue()); 8414 function->IsInOptimizationQueue());
8415 return function->code(); 8415 return function->code();
8416 } 8416 }
8417 8417
8418 8418
8419 class ActivationsFinder : public ThreadVisitor { 8419 class ActivationsFinder : public ThreadVisitor {
8420 public: 8420 public:
8421 Code* code_; 8421 Code* code_;
8422 bool has_code_activations_; 8422 bool has_code_activations_;
(...skipping 11 matching lines...) Expand all
8434 for (; !it->done(); it->Advance()) { 8434 for (; !it->done(); it->Advance()) {
8435 JavaScriptFrame* frame = it->frame(); 8435 JavaScriptFrame* frame = it->frame();
8436 if (code_->contains(frame->pc())) has_code_activations_ = true; 8436 if (code_->contains(frame->pc())) has_code_activations_ = true;
8437 } 8437 }
8438 } 8438 }
8439 }; 8439 };
8440 8440
8441 8441
8442 RUNTIME_FUNCTION(Runtime_NotifyStubFailure) { 8442 RUNTIME_FUNCTION(Runtime_NotifyStubFailure) {
8443 HandleScope scope(isolate); 8443 HandleScope scope(isolate);
8444 ASSERT(args.length() == 0); 8444 DCHECK(args.length() == 0);
8445 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); 8445 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate);
8446 ASSERT(AllowHeapAllocation::IsAllowed()); 8446 DCHECK(AllowHeapAllocation::IsAllowed());
8447 delete deoptimizer; 8447 delete deoptimizer;
8448 return isolate->heap()->undefined_value(); 8448 return isolate->heap()->undefined_value();
8449 } 8449 }
8450 8450
8451 8451
8452 RUNTIME_FUNCTION(Runtime_NotifyDeoptimized) { 8452 RUNTIME_FUNCTION(Runtime_NotifyDeoptimized) {
8453 HandleScope scope(isolate); 8453 HandleScope scope(isolate);
8454 ASSERT(args.length() == 1); 8454 DCHECK(args.length() == 1);
8455 CONVERT_SMI_ARG_CHECKED(type_arg, 0); 8455 CONVERT_SMI_ARG_CHECKED(type_arg, 0);
8456 Deoptimizer::BailoutType type = 8456 Deoptimizer::BailoutType type =
8457 static_cast<Deoptimizer::BailoutType>(type_arg); 8457 static_cast<Deoptimizer::BailoutType>(type_arg);
8458 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); 8458 Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate);
8459 ASSERT(AllowHeapAllocation::IsAllowed()); 8459 DCHECK(AllowHeapAllocation::IsAllowed());
8460 8460
8461 Handle<JSFunction> function = deoptimizer->function(); 8461 Handle<JSFunction> function = deoptimizer->function();
8462 Handle<Code> optimized_code = deoptimizer->compiled_code(); 8462 Handle<Code> optimized_code = deoptimizer->compiled_code();
8463 8463
8464 ASSERT(optimized_code->kind() == Code::OPTIMIZED_FUNCTION); 8464 DCHECK(optimized_code->kind() == Code::OPTIMIZED_FUNCTION);
8465 ASSERT(type == deoptimizer->bailout_type()); 8465 DCHECK(type == deoptimizer->bailout_type());
8466 8466
8467 // Make sure to materialize objects before causing any allocation. 8467 // Make sure to materialize objects before causing any allocation.
8468 JavaScriptFrameIterator it(isolate); 8468 JavaScriptFrameIterator it(isolate);
8469 deoptimizer->MaterializeHeapObjects(&it); 8469 deoptimizer->MaterializeHeapObjects(&it);
8470 delete deoptimizer; 8470 delete deoptimizer;
8471 8471
8472 JavaScriptFrame* frame = it.frame(); 8472 JavaScriptFrame* frame = it.frame();
8473 RUNTIME_ASSERT(frame->function()->IsJSFunction()); 8473 RUNTIME_ASSERT(frame->function()->IsJSFunction());
8474 ASSERT(frame->function() == *function); 8474 DCHECK(frame->function() == *function);
8475 8475
8476 // Avoid doing too much work when running with --always-opt and keep 8476 // Avoid doing too much work when running with --always-opt and keep
8477 // the optimized code around. 8477 // the optimized code around.
8478 if (FLAG_always_opt || type == Deoptimizer::LAZY) { 8478 if (FLAG_always_opt || type == Deoptimizer::LAZY) {
8479 return isolate->heap()->undefined_value(); 8479 return isolate->heap()->undefined_value();
8480 } 8480 }
8481 8481
8482 // Search for other activations of the same function and code. 8482 // Search for other activations of the same function and code.
8483 ActivationsFinder activations_finder(*optimized_code); 8483 ActivationsFinder activations_finder(*optimized_code);
8484 activations_finder.VisitFrames(&it); 8484 activations_finder.VisitFrames(&it);
(...skipping 18 matching lines...) Expand all
8503 // If there is an index by shared function info, all the better. 8503 // If there is an index by shared function info, all the better.
8504 Deoptimizer::DeoptimizeFunction(*function); 8504 Deoptimizer::DeoptimizeFunction(*function);
8505 } 8505 }
8506 8506
8507 return isolate->heap()->undefined_value(); 8507 return isolate->heap()->undefined_value();
8508 } 8508 }
8509 8509
8510 8510
8511 RUNTIME_FUNCTION(Runtime_DeoptimizeFunction) { 8511 RUNTIME_FUNCTION(Runtime_DeoptimizeFunction) {
8512 HandleScope scope(isolate); 8512 HandleScope scope(isolate);
8513 ASSERT(args.length() == 1); 8513 DCHECK(args.length() == 1);
8514 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8514 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8515 if (!function->IsOptimized()) return isolate->heap()->undefined_value(); 8515 if (!function->IsOptimized()) return isolate->heap()->undefined_value();
8516 8516
8517 // TODO(turbofan): Deoptimization is not supported yet. 8517 // TODO(turbofan): Deoptimization is not supported yet.
8518 if (function->code()->is_turbofanned() && !FLAG_turbo_deoptimization) { 8518 if (function->code()->is_turbofanned() && !FLAG_turbo_deoptimization) {
8519 return isolate->heap()->undefined_value(); 8519 return isolate->heap()->undefined_value();
8520 } 8520 }
8521 8521
8522 Deoptimizer::DeoptimizeFunction(*function); 8522 Deoptimizer::DeoptimizeFunction(*function);
8523 8523
8524 return isolate->heap()->undefined_value(); 8524 return isolate->heap()->undefined_value();
8525 } 8525 }
8526 8526
8527 8527
8528 RUNTIME_FUNCTION(Runtime_ClearFunctionTypeFeedback) { 8528 RUNTIME_FUNCTION(Runtime_ClearFunctionTypeFeedback) {
8529 HandleScope scope(isolate); 8529 HandleScope scope(isolate);
8530 ASSERT(args.length() == 1); 8530 DCHECK(args.length() == 1);
8531 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8531 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8532 function->shared()->ClearTypeFeedbackInfo(); 8532 function->shared()->ClearTypeFeedbackInfo();
8533 Code* unoptimized = function->shared()->code(); 8533 Code* unoptimized = function->shared()->code();
8534 if (unoptimized->kind() == Code::FUNCTION) { 8534 if (unoptimized->kind() == Code::FUNCTION) {
8535 unoptimized->ClearInlineCaches(); 8535 unoptimized->ClearInlineCaches();
8536 } 8536 }
8537 return isolate->heap()->undefined_value(); 8537 return isolate->heap()->undefined_value();
8538 } 8538 }
8539 8539
8540 8540
8541 RUNTIME_FUNCTION(Runtime_RunningInSimulator) { 8541 RUNTIME_FUNCTION(Runtime_RunningInSimulator) {
8542 SealHandleScope shs(isolate); 8542 SealHandleScope shs(isolate);
8543 ASSERT(args.length() == 0); 8543 DCHECK(args.length() == 0);
8544 #if defined(USE_SIMULATOR) 8544 #if defined(USE_SIMULATOR)
8545 return isolate->heap()->true_value(); 8545 return isolate->heap()->true_value();
8546 #else 8546 #else
8547 return isolate->heap()->false_value(); 8547 return isolate->heap()->false_value();
8548 #endif 8548 #endif
8549 } 8549 }
8550 8550
8551 8551
8552 RUNTIME_FUNCTION(Runtime_IsConcurrentRecompilationSupported) { 8552 RUNTIME_FUNCTION(Runtime_IsConcurrentRecompilationSupported) {
8553 SealHandleScope shs(isolate); 8553 SealHandleScope shs(isolate);
8554 ASSERT(args.length() == 0); 8554 DCHECK(args.length() == 0);
8555 return isolate->heap()->ToBoolean( 8555 return isolate->heap()->ToBoolean(
8556 isolate->concurrent_recompilation_enabled()); 8556 isolate->concurrent_recompilation_enabled());
8557 } 8557 }
8558 8558
8559 8559
8560 RUNTIME_FUNCTION(Runtime_OptimizeFunctionOnNextCall) { 8560 RUNTIME_FUNCTION(Runtime_OptimizeFunctionOnNextCall) {
8561 HandleScope scope(isolate); 8561 HandleScope scope(isolate);
8562 RUNTIME_ASSERT(args.length() == 1 || args.length() == 2); 8562 RUNTIME_ASSERT(args.length() == 1 || args.length() == 2);
8563 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8563 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8564 8564
8565 if (!function->IsOptimizable() && 8565 if (!function->IsOptimizable() &&
8566 !function->IsMarkedForConcurrentOptimization() && 8566 !function->IsMarkedForConcurrentOptimization() &&
8567 !function->IsInOptimizationQueue()) { 8567 !function->IsInOptimizationQueue()) {
8568 return isolate->heap()->undefined_value(); 8568 return isolate->heap()->undefined_value();
8569 } 8569 }
8570 8570
8571 function->MarkForOptimization(); 8571 function->MarkForOptimization();
8572 8572
8573 Code* unoptimized = function->shared()->code(); 8573 Code* unoptimized = function->shared()->code();
8574 if (args.length() == 2 && 8574 if (args.length() == 2 &&
8575 unoptimized->kind() == Code::FUNCTION) { 8575 unoptimized->kind() == Code::FUNCTION) {
8576 CONVERT_ARG_HANDLE_CHECKED(String, type, 1); 8576 CONVERT_ARG_HANDLE_CHECKED(String, type, 1);
8577 if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("osr")) && FLAG_use_osr) { 8577 if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("osr")) && FLAG_use_osr) {
8578 // Start patching from the currently patched loop nesting level. 8578 // Start patching from the currently patched loop nesting level.
8579 ASSERT(BackEdgeTable::Verify(isolate, unoptimized)); 8579 DCHECK(BackEdgeTable::Verify(isolate, unoptimized));
8580 isolate->runtime_profiler()->AttemptOnStackReplacement( 8580 isolate->runtime_profiler()->AttemptOnStackReplacement(
8581 *function, Code::kMaxLoopNestingMarker); 8581 *function, Code::kMaxLoopNestingMarker);
8582 } else if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("concurrent")) && 8582 } else if (type->IsOneByteEqualTo(STATIC_ASCII_VECTOR("concurrent")) &&
8583 isolate->concurrent_recompilation_enabled()) { 8583 isolate->concurrent_recompilation_enabled()) {
8584 function->MarkForConcurrentOptimization(); 8584 function->MarkForConcurrentOptimization();
8585 } 8585 }
8586 } 8586 }
8587 8587
8588 return isolate->heap()->undefined_value(); 8588 return isolate->heap()->undefined_value();
8589 } 8589 }
8590 8590
8591 8591
8592 RUNTIME_FUNCTION(Runtime_NeverOptimizeFunction) { 8592 RUNTIME_FUNCTION(Runtime_NeverOptimizeFunction) {
8593 HandleScope scope(isolate); 8593 HandleScope scope(isolate);
8594 ASSERT(args.length() == 1); 8594 DCHECK(args.length() == 1);
8595 CONVERT_ARG_CHECKED(JSFunction, function, 0); 8595 CONVERT_ARG_CHECKED(JSFunction, function, 0);
8596 function->shared()->set_optimization_disabled(true); 8596 function->shared()->set_optimization_disabled(true);
8597 return isolate->heap()->undefined_value(); 8597 return isolate->heap()->undefined_value();
8598 } 8598 }
8599 8599
8600 8600
8601 RUNTIME_FUNCTION(Runtime_GetOptimizationStatus) { 8601 RUNTIME_FUNCTION(Runtime_GetOptimizationStatus) {
8602 HandleScope scope(isolate); 8602 HandleScope scope(isolate);
8603 RUNTIME_ASSERT(args.length() == 1 || args.length() == 2); 8603 RUNTIME_ASSERT(args.length() == 1 || args.length() == 2);
8604 if (!isolate->use_crankshaft()) { 8604 if (!isolate->use_crankshaft()) {
(...skipping 25 matching lines...) Expand all
8630 } 8630 }
8631 if (function->IsOptimized() && function->code()->is_turbofanned()) { 8631 if (function->IsOptimized() && function->code()->is_turbofanned()) {
8632 return Smi::FromInt(7); // 7 == "TurboFan compiler". 8632 return Smi::FromInt(7); // 7 == "TurboFan compiler".
8633 } 8633 }
8634 return function->IsOptimized() ? Smi::FromInt(1) // 1 == "yes". 8634 return function->IsOptimized() ? Smi::FromInt(1) // 1 == "yes".
8635 : Smi::FromInt(2); // 2 == "no". 8635 : Smi::FromInt(2); // 2 == "no".
8636 } 8636 }
8637 8637
8638 8638
8639 RUNTIME_FUNCTION(Runtime_UnblockConcurrentRecompilation) { 8639 RUNTIME_FUNCTION(Runtime_UnblockConcurrentRecompilation) {
8640 ASSERT(args.length() == 0); 8640 DCHECK(args.length() == 0);
8641 RUNTIME_ASSERT(FLAG_block_concurrent_recompilation); 8641 RUNTIME_ASSERT(FLAG_block_concurrent_recompilation);
8642 RUNTIME_ASSERT(isolate->concurrent_recompilation_enabled()); 8642 RUNTIME_ASSERT(isolate->concurrent_recompilation_enabled());
8643 isolate->optimizing_compiler_thread()->Unblock(); 8643 isolate->optimizing_compiler_thread()->Unblock();
8644 return isolate->heap()->undefined_value(); 8644 return isolate->heap()->undefined_value();
8645 } 8645 }
8646 8646
8647 8647
8648 RUNTIME_FUNCTION(Runtime_GetOptimizationCount) { 8648 RUNTIME_FUNCTION(Runtime_GetOptimizationCount) {
8649 HandleScope scope(isolate); 8649 HandleScope scope(isolate);
8650 ASSERT(args.length() == 1); 8650 DCHECK(args.length() == 1);
8651 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8651 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8652 return Smi::FromInt(function->shared()->opt_count()); 8652 return Smi::FromInt(function->shared()->opt_count());
8653 } 8653 }
8654 8654
8655 8655
8656 static bool IsSuitableForOnStackReplacement(Isolate* isolate, 8656 static bool IsSuitableForOnStackReplacement(Isolate* isolate,
8657 Handle<JSFunction> function, 8657 Handle<JSFunction> function,
8658 Handle<Code> current_code) { 8658 Handle<Code> current_code) {
8659 // Keep track of whether we've succeeded in optimizing. 8659 // Keep track of whether we've succeeded in optimizing.
8660 if (!isolate->use_crankshaft() || !current_code->optimizable()) return false; 8660 if (!isolate->use_crankshaft() || !current_code->optimizable()) return false;
8661 // If we are trying to do OSR when there are already optimized 8661 // If we are trying to do OSR when there are already optimized
8662 // activations of the function, it means (a) the function is directly or 8662 // activations of the function, it means (a) the function is directly or
8663 // indirectly recursive and (b) an optimized invocation has been 8663 // indirectly recursive and (b) an optimized invocation has been
8664 // deoptimized so that we are currently in an unoptimized activation. 8664 // deoptimized so that we are currently in an unoptimized activation.
8665 // Check for optimized activations of this function. 8665 // Check for optimized activations of this function.
8666 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) { 8666 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) {
8667 JavaScriptFrame* frame = it.frame(); 8667 JavaScriptFrame* frame = it.frame();
8668 if (frame->is_optimized() && frame->function() == *function) return false; 8668 if (frame->is_optimized() && frame->function() == *function) return false;
8669 } 8669 }
8670 8670
8671 return true; 8671 return true;
8672 } 8672 }
8673 8673
8674 8674
8675 RUNTIME_FUNCTION(Runtime_CompileForOnStackReplacement) { 8675 RUNTIME_FUNCTION(Runtime_CompileForOnStackReplacement) {
8676 HandleScope scope(isolate); 8676 HandleScope scope(isolate);
8677 ASSERT(args.length() == 1); 8677 DCHECK(args.length() == 1);
8678 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8678 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8679 Handle<Code> caller_code(function->shared()->code()); 8679 Handle<Code> caller_code(function->shared()->code());
8680 8680
8681 // We're not prepared to handle a function with arguments object. 8681 // We're not prepared to handle a function with arguments object.
8682 ASSERT(!function->shared()->uses_arguments()); 8682 DCHECK(!function->shared()->uses_arguments());
8683 8683
8684 RUNTIME_ASSERT(FLAG_use_osr); 8684 RUNTIME_ASSERT(FLAG_use_osr);
8685 8685
8686 // Passing the PC in the javascript frame from the caller directly is 8686 // Passing the PC in the javascript frame from the caller directly is
8687 // not GC safe, so we walk the stack to get it. 8687 // not GC safe, so we walk the stack to get it.
8688 JavaScriptFrameIterator it(isolate); 8688 JavaScriptFrameIterator it(isolate);
8689 JavaScriptFrame* frame = it.frame(); 8689 JavaScriptFrame* frame = it.frame();
8690 if (!caller_code->contains(frame->pc())) { 8690 if (!caller_code->contains(frame->pc())) {
8691 // Code on the stack may not be the code object referenced by the shared 8691 // Code on the stack may not be the code object referenced by the shared
8692 // function info. It may have been replaced to include deoptimization data. 8692 // function info. It may have been replaced to include deoptimization data.
8693 caller_code = Handle<Code>(frame->LookupCode()); 8693 caller_code = Handle<Code>(frame->LookupCode());
8694 } 8694 }
8695 8695
8696 uint32_t pc_offset = static_cast<uint32_t>( 8696 uint32_t pc_offset = static_cast<uint32_t>(
8697 frame->pc() - caller_code->instruction_start()); 8697 frame->pc() - caller_code->instruction_start());
8698 8698
8699 #ifdef DEBUG 8699 #ifdef DEBUG
8700 ASSERT_EQ(frame->function(), *function); 8700 DCHECK_EQ(frame->function(), *function);
8701 ASSERT_EQ(frame->LookupCode(), *caller_code); 8701 DCHECK_EQ(frame->LookupCode(), *caller_code);
8702 ASSERT(caller_code->contains(frame->pc())); 8702 DCHECK(caller_code->contains(frame->pc()));
8703 #endif // DEBUG 8703 #endif // DEBUG
8704 8704
8705 8705
8706 BailoutId ast_id = caller_code->TranslatePcOffsetToAstId(pc_offset); 8706 BailoutId ast_id = caller_code->TranslatePcOffsetToAstId(pc_offset);
8707 ASSERT(!ast_id.IsNone()); 8707 DCHECK(!ast_id.IsNone());
8708 8708
8709 Compiler::ConcurrencyMode mode = 8709 Compiler::ConcurrencyMode mode =
8710 isolate->concurrent_osr_enabled() && 8710 isolate->concurrent_osr_enabled() &&
8711 (function->shared()->ast_node_count() > 512) ? Compiler::CONCURRENT 8711 (function->shared()->ast_node_count() > 512) ? Compiler::CONCURRENT
8712 : Compiler::NOT_CONCURRENT; 8712 : Compiler::NOT_CONCURRENT;
8713 Handle<Code> result = Handle<Code>::null(); 8713 Handle<Code> result = Handle<Code>::null();
8714 8714
8715 OptimizedCompileJob* job = NULL; 8715 OptimizedCompileJob* job = NULL;
8716 if (mode == Compiler::CONCURRENT) { 8716 if (mode == Compiler::CONCURRENT) {
8717 // Gate the OSR entry with a stack check. 8717 // Gate the OSR entry with a stack check.
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
8754 8754
8755 // Revert the patched back edge table, regardless of whether OSR succeeds. 8755 // Revert the patched back edge table, regardless of whether OSR succeeds.
8756 BackEdgeTable::Revert(isolate, *caller_code); 8756 BackEdgeTable::Revert(isolate, *caller_code);
8757 8757
8758 // Check whether we ended up with usable optimized code. 8758 // Check whether we ended up with usable optimized code.
8759 if (!result.is_null() && result->kind() == Code::OPTIMIZED_FUNCTION) { 8759 if (!result.is_null() && result->kind() == Code::OPTIMIZED_FUNCTION) {
8760 DeoptimizationInputData* data = 8760 DeoptimizationInputData* data =
8761 DeoptimizationInputData::cast(result->deoptimization_data()); 8761 DeoptimizationInputData::cast(result->deoptimization_data());
8762 8762
8763 if (data->OsrPcOffset()->value() >= 0) { 8763 if (data->OsrPcOffset()->value() >= 0) {
8764 ASSERT(BailoutId(data->OsrAstId()->value()) == ast_id); 8764 DCHECK(BailoutId(data->OsrAstId()->value()) == ast_id);
8765 if (FLAG_trace_osr) { 8765 if (FLAG_trace_osr) {
8766 PrintF("[OSR - Entry at AST id %d, offset %d in optimized code]\n", 8766 PrintF("[OSR - Entry at AST id %d, offset %d in optimized code]\n",
8767 ast_id.ToInt(), data->OsrPcOffset()->value()); 8767 ast_id.ToInt(), data->OsrPcOffset()->value());
8768 } 8768 }
8769 // TODO(titzer): this is a massive hack to make the deopt counts 8769 // TODO(titzer): this is a massive hack to make the deopt counts
8770 // match. Fix heuristics for reenabling optimizations! 8770 // match. Fix heuristics for reenabling optimizations!
8771 function->shared()->increment_deopt_count(); 8771 function->shared()->increment_deopt_count();
8772 8772
8773 // TODO(titzer): Do not install code into the function. 8773 // TODO(titzer): Do not install code into the function.
8774 function->ReplaceCode(*result); 8774 function->ReplaceCode(*result);
(...skipping 10 matching lines...) Expand all
8785 8785
8786 if (!function->IsOptimized()) { 8786 if (!function->IsOptimized()) {
8787 function->ReplaceCode(function->shared()->code()); 8787 function->ReplaceCode(function->shared()->code());
8788 } 8788 }
8789 return NULL; 8789 return NULL;
8790 } 8790 }
8791 8791
8792 8792
8793 RUNTIME_FUNCTION(Runtime_SetAllocationTimeout) { 8793 RUNTIME_FUNCTION(Runtime_SetAllocationTimeout) {
8794 SealHandleScope shs(isolate); 8794 SealHandleScope shs(isolate);
8795 ASSERT(args.length() == 2 || args.length() == 3); 8795 DCHECK(args.length() == 2 || args.length() == 3);
8796 #ifdef DEBUG 8796 #ifdef DEBUG
8797 CONVERT_SMI_ARG_CHECKED(interval, 0); 8797 CONVERT_SMI_ARG_CHECKED(interval, 0);
8798 CONVERT_SMI_ARG_CHECKED(timeout, 1); 8798 CONVERT_SMI_ARG_CHECKED(timeout, 1);
8799 isolate->heap()->set_allocation_timeout(timeout); 8799 isolate->heap()->set_allocation_timeout(timeout);
8800 FLAG_gc_interval = interval; 8800 FLAG_gc_interval = interval;
8801 if (args.length() == 3) { 8801 if (args.length() == 3) {
8802 // Enable/disable inline allocation if requested. 8802 // Enable/disable inline allocation if requested.
8803 CONVERT_BOOLEAN_ARG_CHECKED(inline_allocation, 2); 8803 CONVERT_BOOLEAN_ARG_CHECKED(inline_allocation, 2);
8804 if (inline_allocation) { 8804 if (inline_allocation) {
8805 isolate->heap()->EnableInlineAllocation(); 8805 isolate->heap()->EnableInlineAllocation();
8806 } else { 8806 } else {
8807 isolate->heap()->DisableInlineAllocation(); 8807 isolate->heap()->DisableInlineAllocation();
8808 } 8808 }
8809 } 8809 }
8810 #endif 8810 #endif
8811 return isolate->heap()->undefined_value(); 8811 return isolate->heap()->undefined_value();
8812 } 8812 }
8813 8813
8814 8814
8815 RUNTIME_FUNCTION(Runtime_CheckIsBootstrapping) { 8815 RUNTIME_FUNCTION(Runtime_CheckIsBootstrapping) {
8816 SealHandleScope shs(isolate); 8816 SealHandleScope shs(isolate);
8817 ASSERT(args.length() == 0); 8817 DCHECK(args.length() == 0);
8818 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive()); 8818 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive());
8819 return isolate->heap()->undefined_value(); 8819 return isolate->heap()->undefined_value();
8820 } 8820 }
8821 8821
8822 8822
8823 RUNTIME_FUNCTION(Runtime_GetRootNaN) { 8823 RUNTIME_FUNCTION(Runtime_GetRootNaN) {
8824 SealHandleScope shs(isolate); 8824 SealHandleScope shs(isolate);
8825 ASSERT(args.length() == 0); 8825 DCHECK(args.length() == 0);
8826 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive()); 8826 RUNTIME_ASSERT(isolate->bootstrapper()->IsActive());
8827 return isolate->heap()->nan_value(); 8827 return isolate->heap()->nan_value();
8828 } 8828 }
8829 8829
8830 8830
8831 RUNTIME_FUNCTION(Runtime_Call) { 8831 RUNTIME_FUNCTION(Runtime_Call) {
8832 HandleScope scope(isolate); 8832 HandleScope scope(isolate);
8833 ASSERT(args.length() >= 2); 8833 DCHECK(args.length() >= 2);
8834 int argc = args.length() - 2; 8834 int argc = args.length() - 2;
8835 CONVERT_ARG_CHECKED(JSReceiver, fun, argc + 1); 8835 CONVERT_ARG_CHECKED(JSReceiver, fun, argc + 1);
8836 Object* receiver = args[0]; 8836 Object* receiver = args[0];
8837 8837
8838 // If there are too many arguments, allocate argv via malloc. 8838 // If there are too many arguments, allocate argv via malloc.
8839 const int argv_small_size = 10; 8839 const int argv_small_size = 10;
8840 Handle<Object> argv_small_buffer[argv_small_size]; 8840 Handle<Object> argv_small_buffer[argv_small_size];
8841 SmartArrayPointer<Handle<Object> > argv_large_buffer; 8841 SmartArrayPointer<Handle<Object> > argv_large_buffer;
8842 Handle<Object>* argv = argv_small_buffer; 8842 Handle<Object>* argv = argv_small_buffer;
8843 if (argc > argv_small_size) { 8843 if (argc > argv_small_size) {
(...skipping 11 matching lines...) Expand all
8855 Handle<Object> result; 8855 Handle<Object> result;
8856 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 8856 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
8857 isolate, result, 8857 isolate, result,
8858 Execution::Call(isolate, hfun, hreceiver, argc, argv, true)); 8858 Execution::Call(isolate, hfun, hreceiver, argc, argv, true));
8859 return *result; 8859 return *result;
8860 } 8860 }
8861 8861
8862 8862
8863 RUNTIME_FUNCTION(Runtime_Apply) { 8863 RUNTIME_FUNCTION(Runtime_Apply) {
8864 HandleScope scope(isolate); 8864 HandleScope scope(isolate);
8865 ASSERT(args.length() == 5); 8865 DCHECK(args.length() == 5);
8866 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, fun, 0); 8866 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, fun, 0);
8867 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1); 8867 CONVERT_ARG_HANDLE_CHECKED(Object, receiver, 1);
8868 CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2); 8868 CONVERT_ARG_HANDLE_CHECKED(JSObject, arguments, 2);
8869 CONVERT_SMI_ARG_CHECKED(offset, 3); 8869 CONVERT_SMI_ARG_CHECKED(offset, 3);
8870 CONVERT_SMI_ARG_CHECKED(argc, 4); 8870 CONVERT_SMI_ARG_CHECKED(argc, 4);
8871 RUNTIME_ASSERT(offset >= 0); 8871 RUNTIME_ASSERT(offset >= 0);
8872 // Loose upper bound to allow fuzzing. We'll most likely run out of 8872 // Loose upper bound to allow fuzzing. We'll most likely run out of
8873 // stack space before hitting this limit. 8873 // stack space before hitting this limit.
8874 static int kMaxArgc = 1000000; 8874 static int kMaxArgc = 1000000;
8875 RUNTIME_ASSERT(argc >= 0 && argc <= kMaxArgc); 8875 RUNTIME_ASSERT(argc >= 0 && argc <= kMaxArgc);
(...skipping 18 matching lines...) Expand all
8894 Handle<Object> result; 8894 Handle<Object> result;
8895 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 8895 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
8896 isolate, result, 8896 isolate, result,
8897 Execution::Call(isolate, fun, receiver, argc, argv, true)); 8897 Execution::Call(isolate, fun, receiver, argc, argv, true));
8898 return *result; 8898 return *result;
8899 } 8899 }
8900 8900
8901 8901
8902 RUNTIME_FUNCTION(Runtime_GetFunctionDelegate) { 8902 RUNTIME_FUNCTION(Runtime_GetFunctionDelegate) {
8903 HandleScope scope(isolate); 8903 HandleScope scope(isolate);
8904 ASSERT(args.length() == 1); 8904 DCHECK(args.length() == 1);
8905 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); 8905 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
8906 RUNTIME_ASSERT(!object->IsJSFunction()); 8906 RUNTIME_ASSERT(!object->IsJSFunction());
8907 return *Execution::GetFunctionDelegate(isolate, object); 8907 return *Execution::GetFunctionDelegate(isolate, object);
8908 } 8908 }
8909 8909
8910 8910
8911 RUNTIME_FUNCTION(Runtime_GetConstructorDelegate) { 8911 RUNTIME_FUNCTION(Runtime_GetConstructorDelegate) {
8912 HandleScope scope(isolate); 8912 HandleScope scope(isolate);
8913 ASSERT(args.length() == 1); 8913 DCHECK(args.length() == 1);
8914 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); 8914 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
8915 RUNTIME_ASSERT(!object->IsJSFunction()); 8915 RUNTIME_ASSERT(!object->IsJSFunction());
8916 return *Execution::GetConstructorDelegate(isolate, object); 8916 return *Execution::GetConstructorDelegate(isolate, object);
8917 } 8917 }
8918 8918
8919 8919
8920 RUNTIME_FUNCTION(Runtime_NewGlobalContext) { 8920 RUNTIME_FUNCTION(Runtime_NewGlobalContext) {
8921 HandleScope scope(isolate); 8921 HandleScope scope(isolate);
8922 ASSERT(args.length() == 2); 8922 DCHECK(args.length() == 2);
8923 8923
8924 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8924 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8925 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 1); 8925 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 1);
8926 Handle<Context> result = 8926 Handle<Context> result =
8927 isolate->factory()->NewGlobalContext(function, scope_info); 8927 isolate->factory()->NewGlobalContext(function, scope_info);
8928 8928
8929 ASSERT(function->context() == isolate->context()); 8929 DCHECK(function->context() == isolate->context());
8930 ASSERT(function->context()->global_object() == result->global_object()); 8930 DCHECK(function->context()->global_object() == result->global_object());
8931 result->global_object()->set_global_context(*result); 8931 result->global_object()->set_global_context(*result);
8932 return *result; 8932 return *result;
8933 } 8933 }
8934 8934
8935 8935
8936 RUNTIME_FUNCTION(Runtime_NewFunctionContext) { 8936 RUNTIME_FUNCTION(Runtime_NewFunctionContext) {
8937 HandleScope scope(isolate); 8937 HandleScope scope(isolate);
8938 ASSERT(args.length() == 1); 8938 DCHECK(args.length() == 1);
8939 8939
8940 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 8940 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
8941 8941
8942 ASSERT(function->context() == isolate->context()); 8942 DCHECK(function->context() == isolate->context());
8943 int length = function->shared()->scope_info()->ContextLength(); 8943 int length = function->shared()->scope_info()->ContextLength();
8944 return *isolate->factory()->NewFunctionContext(length, function); 8944 return *isolate->factory()->NewFunctionContext(length, function);
8945 } 8945 }
8946 8946
8947 8947
8948 RUNTIME_FUNCTION(Runtime_PushWithContext) { 8948 RUNTIME_FUNCTION(Runtime_PushWithContext) {
8949 HandleScope scope(isolate); 8949 HandleScope scope(isolate);
8950 ASSERT(args.length() == 2); 8950 DCHECK(args.length() == 2);
8951 Handle<JSReceiver> extension_object; 8951 Handle<JSReceiver> extension_object;
8952 if (args[0]->IsJSReceiver()) { 8952 if (args[0]->IsJSReceiver()) {
8953 extension_object = args.at<JSReceiver>(0); 8953 extension_object = args.at<JSReceiver>(0);
8954 } else { 8954 } else {
8955 // Try to convert the object to a proper JavaScript object. 8955 // Try to convert the object to a proper JavaScript object.
8956 MaybeHandle<JSReceiver> maybe_object = 8956 MaybeHandle<JSReceiver> maybe_object =
8957 Object::ToObject(isolate, args.at<Object>(0)); 8957 Object::ToObject(isolate, args.at<Object>(0));
8958 if (!maybe_object.ToHandle(&extension_object)) { 8958 if (!maybe_object.ToHandle(&extension_object)) {
8959 Handle<Object> handle = args.at<Object>(0); 8959 Handle<Object> handle = args.at<Object>(0);
8960 Handle<Object> result = 8960 Handle<Object> result =
(...skipping 16 matching lines...) Expand all
8977 Handle<Context> current(isolate->context()); 8977 Handle<Context> current(isolate->context());
8978 Handle<Context> context = isolate->factory()->NewWithContext( 8978 Handle<Context> context = isolate->factory()->NewWithContext(
8979 function, current, extension_object); 8979 function, current, extension_object);
8980 isolate->set_context(*context); 8980 isolate->set_context(*context);
8981 return *context; 8981 return *context;
8982 } 8982 }
8983 8983
8984 8984
8985 RUNTIME_FUNCTION(Runtime_PushCatchContext) { 8985 RUNTIME_FUNCTION(Runtime_PushCatchContext) {
8986 HandleScope scope(isolate); 8986 HandleScope scope(isolate);
8987 ASSERT(args.length() == 3); 8987 DCHECK(args.length() == 3);
8988 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); 8988 CONVERT_ARG_HANDLE_CHECKED(String, name, 0);
8989 CONVERT_ARG_HANDLE_CHECKED(Object, thrown_object, 1); 8989 CONVERT_ARG_HANDLE_CHECKED(Object, thrown_object, 1);
8990 Handle<JSFunction> function; 8990 Handle<JSFunction> function;
8991 if (args[2]->IsSmi()) { 8991 if (args[2]->IsSmi()) {
8992 // A smi sentinel indicates a context nested inside global code rather 8992 // A smi sentinel indicates a context nested inside global code rather
8993 // than some function. There is a canonical empty function that can be 8993 // than some function. There is a canonical empty function that can be
8994 // gotten from the native context. 8994 // gotten from the native context.
8995 function = handle(isolate->native_context()->closure()); 8995 function = handle(isolate->native_context()->closure());
8996 } else { 8996 } else {
8997 function = args.at<JSFunction>(2); 8997 function = args.at<JSFunction>(2);
8998 } 8998 }
8999 Handle<Context> current(isolate->context()); 8999 Handle<Context> current(isolate->context());
9000 Handle<Context> context = isolate->factory()->NewCatchContext( 9000 Handle<Context> context = isolate->factory()->NewCatchContext(
9001 function, current, name, thrown_object); 9001 function, current, name, thrown_object);
9002 isolate->set_context(*context); 9002 isolate->set_context(*context);
9003 return *context; 9003 return *context;
9004 } 9004 }
9005 9005
9006 9006
9007 RUNTIME_FUNCTION(Runtime_PushBlockContext) { 9007 RUNTIME_FUNCTION(Runtime_PushBlockContext) {
9008 HandleScope scope(isolate); 9008 HandleScope scope(isolate);
9009 ASSERT(args.length() == 2); 9009 DCHECK(args.length() == 2);
9010 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 0); 9010 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 0);
9011 Handle<JSFunction> function; 9011 Handle<JSFunction> function;
9012 if (args[1]->IsSmi()) { 9012 if (args[1]->IsSmi()) {
9013 // A smi sentinel indicates a context nested inside global code rather 9013 // A smi sentinel indicates a context nested inside global code rather
9014 // than some function. There is a canonical empty function that can be 9014 // than some function. There is a canonical empty function that can be
9015 // gotten from the native context. 9015 // gotten from the native context.
9016 function = handle(isolate->native_context()->closure()); 9016 function = handle(isolate->native_context()->closure());
9017 } else { 9017 } else {
9018 function = args.at<JSFunction>(1); 9018 function = args.at<JSFunction>(1);
9019 } 9019 }
9020 Handle<Context> current(isolate->context()); 9020 Handle<Context> current(isolate->context());
9021 Handle<Context> context = isolate->factory()->NewBlockContext( 9021 Handle<Context> context = isolate->factory()->NewBlockContext(
9022 function, current, scope_info); 9022 function, current, scope_info);
9023 isolate->set_context(*context); 9023 isolate->set_context(*context);
9024 return *context; 9024 return *context;
9025 } 9025 }
9026 9026
9027 9027
9028 RUNTIME_FUNCTION(Runtime_IsJSModule) { 9028 RUNTIME_FUNCTION(Runtime_IsJSModule) {
9029 SealHandleScope shs(isolate); 9029 SealHandleScope shs(isolate);
9030 ASSERT(args.length() == 1); 9030 DCHECK(args.length() == 1);
9031 CONVERT_ARG_CHECKED(Object, obj, 0); 9031 CONVERT_ARG_CHECKED(Object, obj, 0);
9032 return isolate->heap()->ToBoolean(obj->IsJSModule()); 9032 return isolate->heap()->ToBoolean(obj->IsJSModule());
9033 } 9033 }
9034 9034
9035 9035
9036 RUNTIME_FUNCTION(Runtime_PushModuleContext) { 9036 RUNTIME_FUNCTION(Runtime_PushModuleContext) {
9037 SealHandleScope shs(isolate); 9037 SealHandleScope shs(isolate);
9038 ASSERT(args.length() == 2); 9038 DCHECK(args.length() == 2);
9039 CONVERT_SMI_ARG_CHECKED(index, 0); 9039 CONVERT_SMI_ARG_CHECKED(index, 0);
9040 9040
9041 if (!args[1]->IsScopeInfo()) { 9041 if (!args[1]->IsScopeInfo()) {
9042 // Module already initialized. Find hosting context and retrieve context. 9042 // Module already initialized. Find hosting context and retrieve context.
9043 Context* host = Context::cast(isolate->context())->global_context(); 9043 Context* host = Context::cast(isolate->context())->global_context();
9044 Context* context = Context::cast(host->get(index)); 9044 Context* context = Context::cast(host->get(index));
9045 ASSERT(context->previous() == isolate->context()); 9045 DCHECK(context->previous() == isolate->context());
9046 isolate->set_context(context); 9046 isolate->set_context(context);
9047 return context; 9047 return context;
9048 } 9048 }
9049 9049
9050 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 1); 9050 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 1);
9051 9051
9052 // Allocate module context. 9052 // Allocate module context.
9053 HandleScope scope(isolate); 9053 HandleScope scope(isolate);
9054 Factory* factory = isolate->factory(); 9054 Factory* factory = isolate->factory();
9055 Handle<Context> context = factory->NewModuleContext(scope_info); 9055 Handle<Context> context = factory->NewModuleContext(scope_info);
9056 Handle<JSModule> module = factory->NewJSModule(context, scope_info); 9056 Handle<JSModule> module = factory->NewJSModule(context, scope_info);
9057 context->set_module(*module); 9057 context->set_module(*module);
9058 Context* previous = isolate->context(); 9058 Context* previous = isolate->context();
9059 context->set_previous(previous); 9059 context->set_previous(previous);
9060 context->set_closure(previous->closure()); 9060 context->set_closure(previous->closure());
9061 context->set_global_object(previous->global_object()); 9061 context->set_global_object(previous->global_object());
9062 isolate->set_context(*context); 9062 isolate->set_context(*context);
9063 9063
9064 // Find hosting scope and initialize internal variable holding module there. 9064 // Find hosting scope and initialize internal variable holding module there.
9065 previous->global_context()->set(index, *context); 9065 previous->global_context()->set(index, *context);
9066 9066
9067 return *context; 9067 return *context;
9068 } 9068 }
9069 9069
9070 9070
9071 RUNTIME_FUNCTION(Runtime_DeclareModules) { 9071 RUNTIME_FUNCTION(Runtime_DeclareModules) {
9072 HandleScope scope(isolate); 9072 HandleScope scope(isolate);
9073 ASSERT(args.length() == 1); 9073 DCHECK(args.length() == 1);
9074 CONVERT_ARG_HANDLE_CHECKED(FixedArray, descriptions, 0); 9074 CONVERT_ARG_HANDLE_CHECKED(FixedArray, descriptions, 0);
9075 Context* host_context = isolate->context(); 9075 Context* host_context = isolate->context();
9076 9076
9077 for (int i = 0; i < descriptions->length(); ++i) { 9077 for (int i = 0; i < descriptions->length(); ++i) {
9078 Handle<ModuleInfo> description(ModuleInfo::cast(descriptions->get(i))); 9078 Handle<ModuleInfo> description(ModuleInfo::cast(descriptions->get(i)));
9079 int host_index = description->host_index(); 9079 int host_index = description->host_index();
9080 Handle<Context> context(Context::cast(host_context->get(host_index))); 9080 Handle<Context> context(Context::cast(host_context->get(host_index)));
9081 Handle<JSModule> module(context->module()); 9081 Handle<JSModule> module(context->module());
9082 9082
9083 for (int j = 0; j < description->length(); ++j) { 9083 for (int j = 0; j < description->length(); ++j) {
9084 Handle<String> name(description->name(j)); 9084 Handle<String> name(description->name(j));
9085 VariableMode mode = description->mode(j); 9085 VariableMode mode = description->mode(j);
9086 int index = description->index(j); 9086 int index = description->index(j);
9087 switch (mode) { 9087 switch (mode) {
9088 case VAR: 9088 case VAR:
9089 case LET: 9089 case LET:
9090 case CONST: 9090 case CONST:
9091 case CONST_LEGACY: { 9091 case CONST_LEGACY: {
9092 PropertyAttributes attr = 9092 PropertyAttributes attr =
9093 IsImmutableVariableMode(mode) ? FROZEN : SEALED; 9093 IsImmutableVariableMode(mode) ? FROZEN : SEALED;
9094 Handle<AccessorInfo> info = 9094 Handle<AccessorInfo> info =
9095 Accessors::MakeModuleExport(name, index, attr); 9095 Accessors::MakeModuleExport(name, index, attr);
9096 Handle<Object> result = 9096 Handle<Object> result =
9097 JSObject::SetAccessor(module, info).ToHandleChecked(); 9097 JSObject::SetAccessor(module, info).ToHandleChecked();
9098 ASSERT(!result->IsUndefined()); 9098 DCHECK(!result->IsUndefined());
9099 USE(result); 9099 USE(result);
9100 break; 9100 break;
9101 } 9101 }
9102 case MODULE: { 9102 case MODULE: {
9103 Object* referenced_context = Context::cast(host_context)->get(index); 9103 Object* referenced_context = Context::cast(host_context)->get(index);
9104 Handle<JSModule> value(Context::cast(referenced_context)->module()); 9104 Handle<JSModule> value(Context::cast(referenced_context)->module());
9105 JSObject::SetOwnPropertyIgnoreAttributes(module, name, value, FROZEN) 9105 JSObject::SetOwnPropertyIgnoreAttributes(module, name, value, FROZEN)
9106 .Assert(); 9106 .Assert();
9107 break; 9107 break;
9108 } 9108 }
9109 case INTERNAL: 9109 case INTERNAL:
9110 case TEMPORARY: 9110 case TEMPORARY:
9111 case DYNAMIC: 9111 case DYNAMIC:
9112 case DYNAMIC_GLOBAL: 9112 case DYNAMIC_GLOBAL:
9113 case DYNAMIC_LOCAL: 9113 case DYNAMIC_LOCAL:
9114 UNREACHABLE(); 9114 UNREACHABLE();
9115 } 9115 }
9116 } 9116 }
9117 9117
9118 JSObject::PreventExtensions(module).Assert(); 9118 JSObject::PreventExtensions(module).Assert();
9119 } 9119 }
9120 9120
9121 ASSERT(!isolate->has_pending_exception()); 9121 DCHECK(!isolate->has_pending_exception());
9122 return isolate->heap()->undefined_value(); 9122 return isolate->heap()->undefined_value();
9123 } 9123 }
9124 9124
9125 9125
9126 RUNTIME_FUNCTION(Runtime_DeleteLookupSlot) { 9126 RUNTIME_FUNCTION(Runtime_DeleteLookupSlot) {
9127 HandleScope scope(isolate); 9127 HandleScope scope(isolate);
9128 ASSERT(args.length() == 2); 9128 DCHECK(args.length() == 2);
9129 9129
9130 CONVERT_ARG_HANDLE_CHECKED(Context, context, 0); 9130 CONVERT_ARG_HANDLE_CHECKED(Context, context, 0);
9131 CONVERT_ARG_HANDLE_CHECKED(String, name, 1); 9131 CONVERT_ARG_HANDLE_CHECKED(String, name, 1);
9132 9132
9133 int index; 9133 int index;
9134 PropertyAttributes attributes; 9134 PropertyAttributes attributes;
9135 ContextLookupFlags flags = FOLLOW_CHAINS; 9135 ContextLookupFlags flags = FOLLOW_CHAINS;
9136 BindingFlags binding_flags; 9136 BindingFlags binding_flags;
9137 Handle<Object> holder = context->Lookup(name, 9137 Handle<Object> holder = context->Lookup(name,
9138 flags, 9138 flags,
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
9211 (reinterpret_cast<ObjectPair>(x) << 32); 9211 (reinterpret_cast<ObjectPair>(x) << 32);
9212 #else 9212 #else
9213 #error Unknown endianness 9213 #error Unknown endianness
9214 #endif 9214 #endif
9215 } 9215 }
9216 #endif 9216 #endif
9217 9217
9218 9218
9219 static Object* ComputeReceiverForNonGlobal(Isolate* isolate, 9219 static Object* ComputeReceiverForNonGlobal(Isolate* isolate,
9220 JSObject* holder) { 9220 JSObject* holder) {
9221 ASSERT(!holder->IsGlobalObject()); 9221 DCHECK(!holder->IsGlobalObject());
9222 Context* top = isolate->context(); 9222 Context* top = isolate->context();
9223 // Get the context extension function. 9223 // Get the context extension function.
9224 JSFunction* context_extension_function = 9224 JSFunction* context_extension_function =
9225 top->native_context()->context_extension_function(); 9225 top->native_context()->context_extension_function();
9226 // If the holder isn't a context extension object, we just return it 9226 // If the holder isn't a context extension object, we just return it
9227 // as the receiver. This allows arguments objects to be used as 9227 // as the receiver. This allows arguments objects to be used as
9228 // receivers, but only if they are put in the context scope chain 9228 // receivers, but only if they are put in the context scope chain
9229 // explicitly via a with-statement. 9229 // explicitly via a with-statement.
9230 Object* constructor = holder->map()->constructor(); 9230 Object* constructor = holder->map()->constructor();
9231 if (constructor != context_extension_function) return holder; 9231 if (constructor != context_extension_function) return holder;
9232 // Fall back to using the global object as the implicit receiver if 9232 // Fall back to using the global object as the implicit receiver if
9233 // the property turns out to be a local variable allocated in a 9233 // the property turns out to be a local variable allocated in a
9234 // context extension object - introduced via eval. 9234 // context extension object - introduced via eval.
9235 return isolate->heap()->undefined_value(); 9235 return isolate->heap()->undefined_value();
9236 } 9236 }
9237 9237
9238 9238
9239 static ObjectPair LoadLookupSlotHelper(Arguments args, Isolate* isolate, 9239 static ObjectPair LoadLookupSlotHelper(Arguments args, Isolate* isolate,
9240 bool throw_error) { 9240 bool throw_error) {
9241 HandleScope scope(isolate); 9241 HandleScope scope(isolate);
9242 ASSERT_EQ(2, args.length()); 9242 DCHECK_EQ(2, args.length());
9243 9243
9244 if (!args[0]->IsContext() || !args[1]->IsString()) { 9244 if (!args[0]->IsContext() || !args[1]->IsString()) {
9245 return MakePair(isolate->ThrowIllegalOperation(), NULL); 9245 return MakePair(isolate->ThrowIllegalOperation(), NULL);
9246 } 9246 }
9247 Handle<Context> context = args.at<Context>(0); 9247 Handle<Context> context = args.at<Context>(0);
9248 Handle<String> name = args.at<String>(1); 9248 Handle<String> name = args.at<String>(1);
9249 9249
9250 int index; 9250 int index;
9251 PropertyAttributes attributes; 9251 PropertyAttributes attributes;
9252 ContextLookupFlags flags = FOLLOW_CHAINS; 9252 ContextLookupFlags flags = FOLLOW_CHAINS;
9253 BindingFlags binding_flags; 9253 BindingFlags binding_flags;
9254 Handle<Object> holder = context->Lookup(name, 9254 Handle<Object> holder = context->Lookup(name,
9255 flags, 9255 flags,
9256 &index, 9256 &index,
9257 &attributes, 9257 &attributes,
9258 &binding_flags); 9258 &binding_flags);
9259 if (isolate->has_pending_exception()) { 9259 if (isolate->has_pending_exception()) {
9260 return MakePair(isolate->heap()->exception(), NULL); 9260 return MakePair(isolate->heap()->exception(), NULL);
9261 } 9261 }
9262 9262
9263 // If the index is non-negative, the slot has been found in a context. 9263 // If the index is non-negative, the slot has been found in a context.
9264 if (index >= 0) { 9264 if (index >= 0) {
9265 ASSERT(holder->IsContext()); 9265 DCHECK(holder->IsContext());
9266 // If the "property" we were looking for is a local variable, the 9266 // If the "property" we were looking for is a local variable, the
9267 // receiver is the global object; see ECMA-262, 3rd., 10.1.6 and 10.2.3. 9267 // receiver is the global object; see ECMA-262, 3rd., 10.1.6 and 10.2.3.
9268 Handle<Object> receiver = isolate->factory()->undefined_value(); 9268 Handle<Object> receiver = isolate->factory()->undefined_value();
9269 Object* value = Context::cast(*holder)->get(index); 9269 Object* value = Context::cast(*holder)->get(index);
9270 // Check for uninitialized bindings. 9270 // Check for uninitialized bindings.
9271 switch (binding_flags) { 9271 switch (binding_flags) {
9272 case MUTABLE_CHECK_INITIALIZED: 9272 case MUTABLE_CHECK_INITIALIZED:
9273 case IMMUTABLE_CHECK_INITIALIZED_HARMONY: 9273 case IMMUTABLE_CHECK_INITIALIZED_HARMONY:
9274 if (value->IsTheHole()) { 9274 if (value->IsTheHole()) {
9275 Handle<Object> reference_error = 9275 Handle<Object> reference_error =
9276 isolate->factory()->NewReferenceError("not_defined", 9276 isolate->factory()->NewReferenceError("not_defined",
9277 HandleVector(&name, 1)); 9277 HandleVector(&name, 1));
9278 return MakePair(isolate->Throw(*reference_error), NULL); 9278 return MakePair(isolate->Throw(*reference_error), NULL);
9279 } 9279 }
9280 // FALLTHROUGH 9280 // FALLTHROUGH
9281 case MUTABLE_IS_INITIALIZED: 9281 case MUTABLE_IS_INITIALIZED:
9282 case IMMUTABLE_IS_INITIALIZED: 9282 case IMMUTABLE_IS_INITIALIZED:
9283 case IMMUTABLE_IS_INITIALIZED_HARMONY: 9283 case IMMUTABLE_IS_INITIALIZED_HARMONY:
9284 ASSERT(!value->IsTheHole()); 9284 DCHECK(!value->IsTheHole());
9285 return MakePair(value, *receiver); 9285 return MakePair(value, *receiver);
9286 case IMMUTABLE_CHECK_INITIALIZED: 9286 case IMMUTABLE_CHECK_INITIALIZED:
9287 if (value->IsTheHole()) { 9287 if (value->IsTheHole()) {
9288 ASSERT((attributes & READ_ONLY) != 0); 9288 DCHECK((attributes & READ_ONLY) != 0);
9289 value = isolate->heap()->undefined_value(); 9289 value = isolate->heap()->undefined_value();
9290 } 9290 }
9291 return MakePair(value, *receiver); 9291 return MakePair(value, *receiver);
9292 case MISSING_BINDING: 9292 case MISSING_BINDING:
9293 UNREACHABLE(); 9293 UNREACHABLE();
9294 return MakePair(NULL, NULL); 9294 return MakePair(NULL, NULL);
9295 } 9295 }
9296 } 9296 }
9297 9297
9298 // Otherwise, if the slot was found the holder is a context extension 9298 // Otherwise, if the slot was found the holder is a context extension
9299 // object, subject of a with, or a global object. We read the named 9299 // object, subject of a with, or a global object. We read the named
9300 // property from it. 9300 // property from it.
9301 if (!holder.is_null()) { 9301 if (!holder.is_null()) {
9302 Handle<JSReceiver> object = Handle<JSReceiver>::cast(holder); 9302 Handle<JSReceiver> object = Handle<JSReceiver>::cast(holder);
9303 #ifdef DEBUG 9303 #ifdef DEBUG
9304 if (!object->IsJSProxy()) { 9304 if (!object->IsJSProxy()) {
9305 Maybe<bool> maybe = JSReceiver::HasProperty(object, name); 9305 Maybe<bool> maybe = JSReceiver::HasProperty(object, name);
9306 ASSERT(maybe.has_value); 9306 DCHECK(maybe.has_value);
9307 ASSERT(maybe.value); 9307 DCHECK(maybe.value);
9308 } 9308 }
9309 #endif 9309 #endif
9310 // GetProperty below can cause GC. 9310 // GetProperty below can cause GC.
9311 Handle<Object> receiver_handle( 9311 Handle<Object> receiver_handle(
9312 object->IsGlobalObject() 9312 object->IsGlobalObject()
9313 ? Object::cast(isolate->heap()->undefined_value()) 9313 ? Object::cast(isolate->heap()->undefined_value())
9314 : object->IsJSProxy() ? static_cast<Object*>(*object) 9314 : object->IsJSProxy() ? static_cast<Object*>(*object)
9315 : ComputeReceiverForNonGlobal(isolate, JSObject::cast(*object)), 9315 : ComputeReceiverForNonGlobal(isolate, JSObject::cast(*object)),
9316 isolate); 9316 isolate);
9317 9317
(...skipping 26 matching lines...) Expand all
9344 } 9344 }
9345 9345
9346 9346
9347 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_LoadLookupSlotNoReferenceError) { 9347 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_LoadLookupSlotNoReferenceError) {
9348 return LoadLookupSlotHelper(args, isolate, false); 9348 return LoadLookupSlotHelper(args, isolate, false);
9349 } 9349 }
9350 9350
9351 9351
9352 RUNTIME_FUNCTION(Runtime_StoreLookupSlot) { 9352 RUNTIME_FUNCTION(Runtime_StoreLookupSlot) {
9353 HandleScope scope(isolate); 9353 HandleScope scope(isolate);
9354 ASSERT(args.length() == 4); 9354 DCHECK(args.length() == 4);
9355 9355
9356 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0); 9356 CONVERT_ARG_HANDLE_CHECKED(Object, value, 0);
9357 CONVERT_ARG_HANDLE_CHECKED(Context, context, 1); 9357 CONVERT_ARG_HANDLE_CHECKED(Context, context, 1);
9358 CONVERT_ARG_HANDLE_CHECKED(String, name, 2); 9358 CONVERT_ARG_HANDLE_CHECKED(String, name, 2);
9359 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 3); 9359 CONVERT_STRICT_MODE_ARG_CHECKED(strict_mode, 3);
9360 9360
9361 int index; 9361 int index;
9362 PropertyAttributes attributes; 9362 PropertyAttributes attributes;
9363 ContextLookupFlags flags = FOLLOW_CHAINS; 9363 ContextLookupFlags flags = FOLLOW_CHAINS;
9364 BindingFlags binding_flags; 9364 BindingFlags binding_flags;
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
9403 9403
9404 RETURN_FAILURE_ON_EXCEPTION( 9404 RETURN_FAILURE_ON_EXCEPTION(
9405 isolate, Object::SetProperty(object, name, value, strict_mode)); 9405 isolate, Object::SetProperty(object, name, value, strict_mode));
9406 9406
9407 return *value; 9407 return *value;
9408 } 9408 }
9409 9409
9410 9410
9411 RUNTIME_FUNCTION(Runtime_Throw) { 9411 RUNTIME_FUNCTION(Runtime_Throw) {
9412 HandleScope scope(isolate); 9412 HandleScope scope(isolate);
9413 ASSERT(args.length() == 1); 9413 DCHECK(args.length() == 1);
9414 9414
9415 return isolate->Throw(args[0]); 9415 return isolate->Throw(args[0]);
9416 } 9416 }
9417 9417
9418 9418
9419 RUNTIME_FUNCTION(Runtime_ReThrow) { 9419 RUNTIME_FUNCTION(Runtime_ReThrow) {
9420 HandleScope scope(isolate); 9420 HandleScope scope(isolate);
9421 ASSERT(args.length() == 1); 9421 DCHECK(args.length() == 1);
9422 9422
9423 return isolate->ReThrow(args[0]); 9423 return isolate->ReThrow(args[0]);
9424 } 9424 }
9425 9425
9426 9426
9427 RUNTIME_FUNCTION(Runtime_PromoteScheduledException) { 9427 RUNTIME_FUNCTION(Runtime_PromoteScheduledException) {
9428 SealHandleScope shs(isolate); 9428 SealHandleScope shs(isolate);
9429 ASSERT(args.length() == 0); 9429 DCHECK(args.length() == 0);
9430 return isolate->PromoteScheduledException(); 9430 return isolate->PromoteScheduledException();
9431 } 9431 }
9432 9432
9433 9433
9434 RUNTIME_FUNCTION(Runtime_ThrowReferenceError) { 9434 RUNTIME_FUNCTION(Runtime_ThrowReferenceError) {
9435 HandleScope scope(isolate); 9435 HandleScope scope(isolate);
9436 ASSERT(args.length() == 1); 9436 DCHECK(args.length() == 1);
9437 CONVERT_ARG_HANDLE_CHECKED(Object, name, 0); 9437 CONVERT_ARG_HANDLE_CHECKED(Object, name, 0);
9438 Handle<Object> reference_error = 9438 Handle<Object> reference_error =
9439 isolate->factory()->NewReferenceError("not_defined", 9439 isolate->factory()->NewReferenceError("not_defined",
9440 HandleVector(&name, 1)); 9440 HandleVector(&name, 1));
9441 return isolate->Throw(*reference_error); 9441 return isolate->Throw(*reference_error);
9442 } 9442 }
9443 9443
9444 9444
9445 RUNTIME_FUNCTION(Runtime_ThrowNotDateError) { 9445 RUNTIME_FUNCTION(Runtime_ThrowNotDateError) {
9446 HandleScope scope(isolate); 9446 HandleScope scope(isolate);
9447 ASSERT(args.length() == 0); 9447 DCHECK(args.length() == 0);
9448 return isolate->Throw(*isolate->factory()->NewTypeError( 9448 return isolate->Throw(*isolate->factory()->NewTypeError(
9449 "not_date_object", HandleVector<Object>(NULL, 0))); 9449 "not_date_object", HandleVector<Object>(NULL, 0)));
9450 } 9450 }
9451 9451
9452 9452
9453 RUNTIME_FUNCTION(Runtime_StackGuard) { 9453 RUNTIME_FUNCTION(Runtime_StackGuard) {
9454 SealHandleScope shs(isolate); 9454 SealHandleScope shs(isolate);
9455 ASSERT(args.length() == 0); 9455 DCHECK(args.length() == 0);
9456 9456
9457 // First check if this is a real stack overflow. 9457 // First check if this is a real stack overflow.
9458 StackLimitCheck check(isolate); 9458 StackLimitCheck check(isolate);
9459 if (check.JsHasOverflowed()) { 9459 if (check.JsHasOverflowed()) {
9460 return isolate->StackOverflow(); 9460 return isolate->StackOverflow();
9461 } 9461 }
9462 9462
9463 return isolate->stack_guard()->HandleInterrupts(); 9463 return isolate->stack_guard()->HandleInterrupts();
9464 } 9464 }
9465 9465
9466 9466
9467 RUNTIME_FUNCTION(Runtime_TryInstallOptimizedCode) { 9467 RUNTIME_FUNCTION(Runtime_TryInstallOptimizedCode) {
9468 HandleScope scope(isolate); 9468 HandleScope scope(isolate);
9469 ASSERT(args.length() == 1); 9469 DCHECK(args.length() == 1);
9470 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 9470 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
9471 9471
9472 // First check if this is a real stack overflow. 9472 // First check if this is a real stack overflow.
9473 StackLimitCheck check(isolate); 9473 StackLimitCheck check(isolate);
9474 if (check.JsHasOverflowed()) { 9474 if (check.JsHasOverflowed()) {
9475 SealHandleScope shs(isolate); 9475 SealHandleScope shs(isolate);
9476 return isolate->StackOverflow(); 9476 return isolate->StackOverflow();
9477 } 9477 }
9478 9478
9479 isolate->optimizing_compiler_thread()->InstallOptimizedFunctions(); 9479 isolate->optimizing_compiler_thread()->InstallOptimizedFunctions();
9480 return (function->IsOptimized()) ? function->code() 9480 return (function->IsOptimized()) ? function->code()
9481 : function->shared()->code(); 9481 : function->shared()->code();
9482 } 9482 }
9483 9483
9484 9484
9485 RUNTIME_FUNCTION(Runtime_Interrupt) { 9485 RUNTIME_FUNCTION(Runtime_Interrupt) {
9486 SealHandleScope shs(isolate); 9486 SealHandleScope shs(isolate);
9487 ASSERT(args.length() == 0); 9487 DCHECK(args.length() == 0);
9488 return isolate->stack_guard()->HandleInterrupts(); 9488 return isolate->stack_guard()->HandleInterrupts();
9489 } 9489 }
9490 9490
9491 9491
9492 static int StackSize(Isolate* isolate) { 9492 static int StackSize(Isolate* isolate) {
9493 int n = 0; 9493 int n = 0;
9494 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) n++; 9494 for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) n++;
9495 return n; 9495 return n;
9496 } 9496 }
9497 9497
(...skipping 15 matching lines...) Expand all
9513 // function result 9513 // function result
9514 PrintF("} -> "); 9514 PrintF("} -> ");
9515 result->ShortPrint(); 9515 result->ShortPrint();
9516 PrintF("\n"); 9516 PrintF("\n");
9517 } 9517 }
9518 } 9518 }
9519 9519
9520 9520
9521 RUNTIME_FUNCTION(Runtime_TraceEnter) { 9521 RUNTIME_FUNCTION(Runtime_TraceEnter) {
9522 SealHandleScope shs(isolate); 9522 SealHandleScope shs(isolate);
9523 ASSERT(args.length() == 0); 9523 DCHECK(args.length() == 0);
9524 PrintTransition(isolate, NULL); 9524 PrintTransition(isolate, NULL);
9525 return isolate->heap()->undefined_value(); 9525 return isolate->heap()->undefined_value();
9526 } 9526 }
9527 9527
9528 9528
9529 RUNTIME_FUNCTION(Runtime_TraceExit) { 9529 RUNTIME_FUNCTION(Runtime_TraceExit) {
9530 SealHandleScope shs(isolate); 9530 SealHandleScope shs(isolate);
9531 ASSERT(args.length() == 1); 9531 DCHECK(args.length() == 1);
9532 CONVERT_ARG_CHECKED(Object, obj, 0); 9532 CONVERT_ARG_CHECKED(Object, obj, 0);
9533 PrintTransition(isolate, obj); 9533 PrintTransition(isolate, obj);
9534 return obj; // return TOS 9534 return obj; // return TOS
9535 } 9535 }
9536 9536
9537 9537
9538 RUNTIME_FUNCTION(Runtime_DebugPrint) { 9538 RUNTIME_FUNCTION(Runtime_DebugPrint) {
9539 SealHandleScope shs(isolate); 9539 SealHandleScope shs(isolate);
9540 ASSERT(args.length() == 1); 9540 DCHECK(args.length() == 1);
9541 9541
9542 OFStream os(stdout); 9542 OFStream os(stdout);
9543 #ifdef DEBUG 9543 #ifdef DEBUG
9544 if (args[0]->IsString()) { 9544 if (args[0]->IsString()) {
9545 // If we have a string, assume it's a code "marker" 9545 // If we have a string, assume it's a code "marker"
9546 // and print some interesting cpu debugging info. 9546 // and print some interesting cpu debugging info.
9547 JavaScriptFrameIterator it(isolate); 9547 JavaScriptFrameIterator it(isolate);
9548 JavaScriptFrame* frame = it.frame(); 9548 JavaScriptFrame* frame = it.frame();
9549 os << "fp = " << frame->fp() << ", sp = " << frame->sp() 9549 os << "fp = " << frame->fp() << ", sp = " << frame->sp()
9550 << ", caller_sp = " << frame->caller_sp() << ": "; 9550 << ", caller_sp = " << frame->caller_sp() << ": ";
(...skipping 10 matching lines...) Expand all
9561 os << Brief(args[0]); 9561 os << Brief(args[0]);
9562 #endif 9562 #endif
9563 os << endl; 9563 os << endl;
9564 9564
9565 return args[0]; // return TOS 9565 return args[0]; // return TOS
9566 } 9566 }
9567 9567
9568 9568
9569 RUNTIME_FUNCTION(Runtime_DebugTrace) { 9569 RUNTIME_FUNCTION(Runtime_DebugTrace) {
9570 SealHandleScope shs(isolate); 9570 SealHandleScope shs(isolate);
9571 ASSERT(args.length() == 0); 9571 DCHECK(args.length() == 0);
9572 isolate->PrintStack(stdout); 9572 isolate->PrintStack(stdout);
9573 return isolate->heap()->undefined_value(); 9573 return isolate->heap()->undefined_value();
9574 } 9574 }
9575 9575
9576 9576
9577 RUNTIME_FUNCTION(Runtime_DateCurrentTime) { 9577 RUNTIME_FUNCTION(Runtime_DateCurrentTime) {
9578 HandleScope scope(isolate); 9578 HandleScope scope(isolate);
9579 ASSERT(args.length() == 0); 9579 DCHECK(args.length() == 0);
9580 if (FLAG_log_timer_events) LOG(isolate, CurrentTimeEvent()); 9580 if (FLAG_log_timer_events) LOG(isolate, CurrentTimeEvent());
9581 9581
9582 // According to ECMA-262, section 15.9.1, page 117, the precision of 9582 // According to ECMA-262, section 15.9.1, page 117, the precision of
9583 // the number in a Date object representing a particular instant in 9583 // the number in a Date object representing a particular instant in
9584 // time is milliseconds. Therefore, we floor the result of getting 9584 // time is milliseconds. Therefore, we floor the result of getting
9585 // the OS time. 9585 // the OS time.
9586 double millis; 9586 double millis;
9587 if (FLAG_verify_predictable) { 9587 if (FLAG_verify_predictable) {
9588 millis = 1388534400000.0; // Jan 1 2014 00:00:00 GMT+0000 9588 millis = 1388534400000.0; // Jan 1 2014 00:00:00 GMT+0000
9589 millis += Floor(isolate->heap()->synthetic_time()); 9589 millis += Floor(isolate->heap()->synthetic_time());
9590 } else { 9590 } else {
9591 millis = Floor(base::OS::TimeCurrentMillis()); 9591 millis = Floor(base::OS::TimeCurrentMillis());
9592 } 9592 }
9593 return *isolate->factory()->NewNumber(millis); 9593 return *isolate->factory()->NewNumber(millis);
9594 } 9594 }
9595 9595
9596 9596
9597 RUNTIME_FUNCTION(Runtime_DateParseString) { 9597 RUNTIME_FUNCTION(Runtime_DateParseString) {
9598 HandleScope scope(isolate); 9598 HandleScope scope(isolate);
9599 ASSERT(args.length() == 2); 9599 DCHECK(args.length() == 2);
9600 CONVERT_ARG_HANDLE_CHECKED(String, str, 0); 9600 CONVERT_ARG_HANDLE_CHECKED(String, str, 0);
9601 CONVERT_ARG_HANDLE_CHECKED(JSArray, output, 1); 9601 CONVERT_ARG_HANDLE_CHECKED(JSArray, output, 1);
9602 9602
9603 RUNTIME_ASSERT(output->HasFastElements()); 9603 RUNTIME_ASSERT(output->HasFastElements());
9604 JSObject::EnsureCanContainHeapObjectElements(output); 9604 JSObject::EnsureCanContainHeapObjectElements(output);
9605 RUNTIME_ASSERT(output->HasFastObjectElements()); 9605 RUNTIME_ASSERT(output->HasFastObjectElements());
9606 Handle<FixedArray> output_array(FixedArray::cast(output->elements())); 9606 Handle<FixedArray> output_array(FixedArray::cast(output->elements()));
9607 RUNTIME_ASSERT(output_array->length() >= DateParser::OUTPUT_SIZE); 9607 RUNTIME_ASSERT(output_array->length() >= DateParser::OUTPUT_SIZE);
9608 9608
9609 str = String::Flatten(str); 9609 str = String::Flatten(str);
9610 DisallowHeapAllocation no_gc; 9610 DisallowHeapAllocation no_gc;
9611 9611
9612 bool result; 9612 bool result;
9613 String::FlatContent str_content = str->GetFlatContent(); 9613 String::FlatContent str_content = str->GetFlatContent();
9614 if (str_content.IsAscii()) { 9614 if (str_content.IsAscii()) {
9615 result = DateParser::Parse(str_content.ToOneByteVector(), 9615 result = DateParser::Parse(str_content.ToOneByteVector(),
9616 *output_array, 9616 *output_array,
9617 isolate->unicode_cache()); 9617 isolate->unicode_cache());
9618 } else { 9618 } else {
9619 ASSERT(str_content.IsTwoByte()); 9619 DCHECK(str_content.IsTwoByte());
9620 result = DateParser::Parse(str_content.ToUC16Vector(), 9620 result = DateParser::Parse(str_content.ToUC16Vector(),
9621 *output_array, 9621 *output_array,
9622 isolate->unicode_cache()); 9622 isolate->unicode_cache());
9623 } 9623 }
9624 9624
9625 if (result) { 9625 if (result) {
9626 return *output; 9626 return *output;
9627 } else { 9627 } else {
9628 return isolate->heap()->null_value(); 9628 return isolate->heap()->null_value();
9629 } 9629 }
9630 } 9630 }
9631 9631
9632 9632
9633 RUNTIME_FUNCTION(Runtime_DateLocalTimezone) { 9633 RUNTIME_FUNCTION(Runtime_DateLocalTimezone) {
9634 HandleScope scope(isolate); 9634 HandleScope scope(isolate);
9635 ASSERT(args.length() == 1); 9635 DCHECK(args.length() == 1);
9636 9636
9637 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 9637 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
9638 RUNTIME_ASSERT(x >= -DateCache::kMaxTimeBeforeUTCInMs && 9638 RUNTIME_ASSERT(x >= -DateCache::kMaxTimeBeforeUTCInMs &&
9639 x <= DateCache::kMaxTimeBeforeUTCInMs); 9639 x <= DateCache::kMaxTimeBeforeUTCInMs);
9640 const char* zone = 9640 const char* zone =
9641 isolate->date_cache()->LocalTimezone(static_cast<int64_t>(x)); 9641 isolate->date_cache()->LocalTimezone(static_cast<int64_t>(x));
9642 Handle<String> result = isolate->factory()->NewStringFromUtf8( 9642 Handle<String> result = isolate->factory()->NewStringFromUtf8(
9643 CStrVector(zone)).ToHandleChecked(); 9643 CStrVector(zone)).ToHandleChecked();
9644 return *result; 9644 return *result;
9645 } 9645 }
9646 9646
9647 9647
9648 RUNTIME_FUNCTION(Runtime_DateToUTC) { 9648 RUNTIME_FUNCTION(Runtime_DateToUTC) {
9649 HandleScope scope(isolate); 9649 HandleScope scope(isolate);
9650 ASSERT(args.length() == 1); 9650 DCHECK(args.length() == 1);
9651 9651
9652 CONVERT_DOUBLE_ARG_CHECKED(x, 0); 9652 CONVERT_DOUBLE_ARG_CHECKED(x, 0);
9653 RUNTIME_ASSERT(x >= -DateCache::kMaxTimeBeforeUTCInMs && 9653 RUNTIME_ASSERT(x >= -DateCache::kMaxTimeBeforeUTCInMs &&
9654 x <= DateCache::kMaxTimeBeforeUTCInMs); 9654 x <= DateCache::kMaxTimeBeforeUTCInMs);
9655 int64_t time = isolate->date_cache()->ToUTC(static_cast<int64_t>(x)); 9655 int64_t time = isolate->date_cache()->ToUTC(static_cast<int64_t>(x));
9656 9656
9657 return *isolate->factory()->NewNumber(static_cast<double>(time)); 9657 return *isolate->factory()->NewNumber(static_cast<double>(time));
9658 } 9658 }
9659 9659
9660 9660
9661 RUNTIME_FUNCTION(Runtime_DateCacheVersion) { 9661 RUNTIME_FUNCTION(Runtime_DateCacheVersion) {
9662 HandleScope hs(isolate); 9662 HandleScope hs(isolate);
9663 ASSERT(args.length() == 0); 9663 DCHECK(args.length() == 0);
9664 if (!isolate->eternal_handles()->Exists(EternalHandles::DATE_CACHE_VERSION)) { 9664 if (!isolate->eternal_handles()->Exists(EternalHandles::DATE_CACHE_VERSION)) {
9665 Handle<FixedArray> date_cache_version = 9665 Handle<FixedArray> date_cache_version =
9666 isolate->factory()->NewFixedArray(1, TENURED); 9666 isolate->factory()->NewFixedArray(1, TENURED);
9667 date_cache_version->set(0, Smi::FromInt(0)); 9667 date_cache_version->set(0, Smi::FromInt(0));
9668 isolate->eternal_handles()->CreateSingleton( 9668 isolate->eternal_handles()->CreateSingleton(
9669 isolate, *date_cache_version, EternalHandles::DATE_CACHE_VERSION); 9669 isolate, *date_cache_version, EternalHandles::DATE_CACHE_VERSION);
9670 } 9670 }
9671 Handle<FixedArray> date_cache_version = 9671 Handle<FixedArray> date_cache_version =
9672 Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton( 9672 Handle<FixedArray>::cast(isolate->eternal_handles()->GetSingleton(
9673 EternalHandles::DATE_CACHE_VERSION)); 9673 EternalHandles::DATE_CACHE_VERSION));
9674 // Return result as a JS array. 9674 // Return result as a JS array.
9675 Handle<JSObject> result = 9675 Handle<JSObject> result =
9676 isolate->factory()->NewJSObject(isolate->array_function()); 9676 isolate->factory()->NewJSObject(isolate->array_function());
9677 JSArray::SetContent(Handle<JSArray>::cast(result), date_cache_version); 9677 JSArray::SetContent(Handle<JSArray>::cast(result), date_cache_version);
9678 return *result; 9678 return *result;
9679 } 9679 }
9680 9680
9681 9681
9682 RUNTIME_FUNCTION(Runtime_GlobalProxy) { 9682 RUNTIME_FUNCTION(Runtime_GlobalProxy) {
9683 SealHandleScope shs(isolate); 9683 SealHandleScope shs(isolate);
9684 ASSERT(args.length() == 1); 9684 DCHECK(args.length() == 1);
9685 CONVERT_ARG_CHECKED(Object, global, 0); 9685 CONVERT_ARG_CHECKED(Object, global, 0);
9686 if (!global->IsJSGlobalObject()) return isolate->heap()->null_value(); 9686 if (!global->IsJSGlobalObject()) return isolate->heap()->null_value();
9687 return JSGlobalObject::cast(global)->global_proxy(); 9687 return JSGlobalObject::cast(global)->global_proxy();
9688 } 9688 }
9689 9689
9690 9690
9691 RUNTIME_FUNCTION(Runtime_IsAttachedGlobal) { 9691 RUNTIME_FUNCTION(Runtime_IsAttachedGlobal) {
9692 SealHandleScope shs(isolate); 9692 SealHandleScope shs(isolate);
9693 ASSERT(args.length() == 1); 9693 DCHECK(args.length() == 1);
9694 CONVERT_ARG_CHECKED(Object, global, 0); 9694 CONVERT_ARG_CHECKED(Object, global, 0);
9695 if (!global->IsJSGlobalObject()) return isolate->heap()->false_value(); 9695 if (!global->IsJSGlobalObject()) return isolate->heap()->false_value();
9696 return isolate->heap()->ToBoolean( 9696 return isolate->heap()->ToBoolean(
9697 !JSGlobalObject::cast(global)->IsDetached()); 9697 !JSGlobalObject::cast(global)->IsDetached());
9698 } 9698 }
9699 9699
9700 9700
9701 RUNTIME_FUNCTION(Runtime_ParseJson) { 9701 RUNTIME_FUNCTION(Runtime_ParseJson) {
9702 HandleScope scope(isolate); 9702 HandleScope scope(isolate);
9703 ASSERT(args.length() == 1); 9703 DCHECK(args.length() == 1);
9704 CONVERT_ARG_HANDLE_CHECKED(String, source, 0); 9704 CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
9705 9705
9706 source = String::Flatten(source); 9706 source = String::Flatten(source);
9707 // Optimized fast case where we only have ASCII characters. 9707 // Optimized fast case where we only have ASCII characters.
9708 Handle<Object> result; 9708 Handle<Object> result;
9709 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 9709 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
9710 isolate, result, 9710 isolate, result,
9711 source->IsSeqOneByteString() ? JsonParser<true>::Parse(source) 9711 source->IsSeqOneByteString() ? JsonParser<true>::Parse(source)
9712 : JsonParser<false>::Parse(source)); 9712 : JsonParser<false>::Parse(source));
9713 return *result; 9713 return *result;
9714 } 9714 }
9715 9715
9716 9716
9717 bool CodeGenerationFromStringsAllowed(Isolate* isolate, 9717 bool CodeGenerationFromStringsAllowed(Isolate* isolate,
9718 Handle<Context> context) { 9718 Handle<Context> context) {
9719 ASSERT(context->allow_code_gen_from_strings()->IsFalse()); 9719 DCHECK(context->allow_code_gen_from_strings()->IsFalse());
9720 // Check with callback if set. 9720 // Check with callback if set.
9721 AllowCodeGenerationFromStringsCallback callback = 9721 AllowCodeGenerationFromStringsCallback callback =
9722 isolate->allow_code_gen_callback(); 9722 isolate->allow_code_gen_callback();
9723 if (callback == NULL) { 9723 if (callback == NULL) {
9724 // No callback set and code generation disallowed. 9724 // No callback set and code generation disallowed.
9725 return false; 9725 return false;
9726 } else { 9726 } else {
9727 // Callback set. Let it decide if code generation is allowed. 9727 // Callback set. Let it decide if code generation is allowed.
9728 VMState<EXTERNAL> state(isolate); 9728 VMState<EXTERNAL> state(isolate);
9729 return callback(v8::Utils::ToLocal(context)); 9729 return callback(v8::Utils::ToLocal(context));
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
9779 } 9779 }
9780 done = true; 9780 done = true;
9781 } 9781 }
9782 } 9782 }
9783 return !exit_handled || tokens_match; 9783 return !exit_handled || tokens_match;
9784 } 9784 }
9785 9785
9786 9786
9787 RUNTIME_FUNCTION(Runtime_CompileString) { 9787 RUNTIME_FUNCTION(Runtime_CompileString) {
9788 HandleScope scope(isolate); 9788 HandleScope scope(isolate);
9789 ASSERT(args.length() == 2); 9789 DCHECK(args.length() == 2);
9790 CONVERT_ARG_HANDLE_CHECKED(String, source, 0); 9790 CONVERT_ARG_HANDLE_CHECKED(String, source, 0);
9791 CONVERT_BOOLEAN_ARG_CHECKED(function_literal_only, 1); 9791 CONVERT_BOOLEAN_ARG_CHECKED(function_literal_only, 1);
9792 9792
9793 // Extract native context. 9793 // Extract native context.
9794 Handle<Context> context(isolate->native_context()); 9794 Handle<Context> context(isolate->native_context());
9795 9795
9796 // Filter cross security context calls. 9796 // Filter cross security context calls.
9797 if (!TokensMatchForCompileString(isolate)) { 9797 if (!TokensMatchForCompileString(isolate)) {
9798 return isolate->heap()->undefined_value(); 9798 return isolate->heap()->undefined_value();
9799 } 9799 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
9847 isolate, compiled, 9847 isolate, compiled,
9848 Compiler::GetFunctionFromEval( 9848 Compiler::GetFunctionFromEval(
9849 source, context, strict_mode, restriction, scope_position), 9849 source, context, strict_mode, restriction, scope_position),
9850 MakePair(isolate->heap()->exception(), NULL)); 9850 MakePair(isolate->heap()->exception(), NULL));
9851 return MakePair(*compiled, *receiver); 9851 return MakePair(*compiled, *receiver);
9852 } 9852 }
9853 9853
9854 9854
9855 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ResolvePossiblyDirectEval) { 9855 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ResolvePossiblyDirectEval) {
9856 HandleScope scope(isolate); 9856 HandleScope scope(isolate);
9857 ASSERT(args.length() == 5); 9857 DCHECK(args.length() == 5);
9858 9858
9859 Handle<Object> callee = args.at<Object>(0); 9859 Handle<Object> callee = args.at<Object>(0);
9860 9860
9861 // If "eval" didn't refer to the original GlobalEval, it's not a 9861 // If "eval" didn't refer to the original GlobalEval, it's not a
9862 // direct call to eval. 9862 // direct call to eval.
9863 // (And even if it is, but the first argument isn't a string, just let 9863 // (And even if it is, but the first argument isn't a string, just let
9864 // execution default to an indirect call to eval, which will also return 9864 // execution default to an indirect call to eval, which will also return
9865 // the first argument without doing anything). 9865 // the first argument without doing anything).
9866 if (*callee != isolate->native_context()->global_eval_fun() || 9866 if (*callee != isolate->native_context()->global_eval_fun() ||
9867 !args[1]->IsString()) { 9867 !args[1]->IsString()) {
9868 return MakePair(*callee, isolate->heap()->undefined_value()); 9868 return MakePair(*callee, isolate->heap()->undefined_value());
9869 } 9869 }
9870 9870
9871 ASSERT(args[3]->IsSmi()); 9871 DCHECK(args[3]->IsSmi());
9872 ASSERT(args.smi_at(3) == SLOPPY || args.smi_at(3) == STRICT); 9872 DCHECK(args.smi_at(3) == SLOPPY || args.smi_at(3) == STRICT);
9873 StrictMode strict_mode = static_cast<StrictMode>(args.smi_at(3)); 9873 StrictMode strict_mode = static_cast<StrictMode>(args.smi_at(3));
9874 ASSERT(args[4]->IsSmi()); 9874 DCHECK(args[4]->IsSmi());
9875 return CompileGlobalEval(isolate, 9875 return CompileGlobalEval(isolate,
9876 args.at<String>(1), 9876 args.at<String>(1),
9877 args.at<Object>(2), 9877 args.at<Object>(2),
9878 strict_mode, 9878 strict_mode,
9879 args.smi_at(4)); 9879 args.smi_at(4));
9880 } 9880 }
9881 9881
9882 9882
9883 RUNTIME_FUNCTION(Runtime_AllocateInNewSpace) { 9883 RUNTIME_FUNCTION(Runtime_AllocateInNewSpace) {
9884 HandleScope scope(isolate); 9884 HandleScope scope(isolate);
9885 ASSERT(args.length() == 1); 9885 DCHECK(args.length() == 1);
9886 CONVERT_SMI_ARG_CHECKED(size, 0); 9886 CONVERT_SMI_ARG_CHECKED(size, 0);
9887 RUNTIME_ASSERT(IsAligned(size, kPointerSize)); 9887 RUNTIME_ASSERT(IsAligned(size, kPointerSize));
9888 RUNTIME_ASSERT(size > 0); 9888 RUNTIME_ASSERT(size > 0);
9889 RUNTIME_ASSERT(size <= Page::kMaxRegularHeapObjectSize); 9889 RUNTIME_ASSERT(size <= Page::kMaxRegularHeapObjectSize);
9890 return *isolate->factory()->NewFillerObject(size, false, NEW_SPACE); 9890 return *isolate->factory()->NewFillerObject(size, false, NEW_SPACE);
9891 } 9891 }
9892 9892
9893 9893
9894 RUNTIME_FUNCTION(Runtime_AllocateInTargetSpace) { 9894 RUNTIME_FUNCTION(Runtime_AllocateInTargetSpace) {
9895 HandleScope scope(isolate); 9895 HandleScope scope(isolate);
9896 ASSERT(args.length() == 2); 9896 DCHECK(args.length() == 2);
9897 CONVERT_SMI_ARG_CHECKED(size, 0); 9897 CONVERT_SMI_ARG_CHECKED(size, 0);
9898 CONVERT_SMI_ARG_CHECKED(flags, 1); 9898 CONVERT_SMI_ARG_CHECKED(flags, 1);
9899 RUNTIME_ASSERT(IsAligned(size, kPointerSize)); 9899 RUNTIME_ASSERT(IsAligned(size, kPointerSize));
9900 RUNTIME_ASSERT(size > 0); 9900 RUNTIME_ASSERT(size > 0);
9901 RUNTIME_ASSERT(size <= Page::kMaxRegularHeapObjectSize); 9901 RUNTIME_ASSERT(size <= Page::kMaxRegularHeapObjectSize);
9902 bool double_align = AllocateDoubleAlignFlag::decode(flags); 9902 bool double_align = AllocateDoubleAlignFlag::decode(flags);
9903 AllocationSpace space = AllocateTargetSpace::decode(flags); 9903 AllocationSpace space = AllocateTargetSpace::decode(flags);
9904 return *isolate->factory()->NewFillerObject(size, double_align, space); 9904 return *isolate->factory()->NewFillerObject(size, double_align, space);
9905 } 9905 }
9906 9906
9907 9907
9908 // Push an object unto an array of objects if it is not already in the 9908 // Push an object unto an array of objects if it is not already in the
9909 // array. Returns true if the element was pushed on the stack and 9909 // array. Returns true if the element was pushed on the stack and
9910 // false otherwise. 9910 // false otherwise.
9911 RUNTIME_FUNCTION(Runtime_PushIfAbsent) { 9911 RUNTIME_FUNCTION(Runtime_PushIfAbsent) {
9912 HandleScope scope(isolate); 9912 HandleScope scope(isolate);
9913 ASSERT(args.length() == 2); 9913 DCHECK(args.length() == 2);
9914 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); 9914 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
9915 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, element, 1); 9915 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, element, 1);
9916 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements()); 9916 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements());
9917 int length = Smi::cast(array->length())->value(); 9917 int length = Smi::cast(array->length())->value();
9918 FixedArray* elements = FixedArray::cast(array->elements()); 9918 FixedArray* elements = FixedArray::cast(array->elements());
9919 for (int i = 0; i < length; i++) { 9919 for (int i = 0; i < length; i++) {
9920 if (elements->get(i) == *element) return isolate->heap()->false_value(); 9920 if (elements->get(i) == *element) return isolate->heap()->false_value();
9921 } 9921 }
9922 9922
9923 // Strict not needed. Used for cycle detection in Array join implementation. 9923 // Strict not needed. Used for cycle detection in Array join implementation.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
9967 storage_->set(index, *elm); 9967 storage_->set(index, *elm);
9968 return; 9968 return;
9969 } 9969 }
9970 // Our initial estimate of length was foiled, possibly by 9970 // Our initial estimate of length was foiled, possibly by
9971 // getters on the arrays increasing the length of later arrays 9971 // getters on the arrays increasing the length of later arrays
9972 // during iteration. 9972 // during iteration.
9973 // This shouldn't happen in anything but pathological cases. 9973 // This shouldn't happen in anything but pathological cases.
9974 SetDictionaryMode(); 9974 SetDictionaryMode();
9975 // Fall-through to dictionary mode. 9975 // Fall-through to dictionary mode.
9976 } 9976 }
9977 ASSERT(!fast_elements_); 9977 DCHECK(!fast_elements_);
9978 Handle<SeededNumberDictionary> dict( 9978 Handle<SeededNumberDictionary> dict(
9979 SeededNumberDictionary::cast(*storage_)); 9979 SeededNumberDictionary::cast(*storage_));
9980 Handle<SeededNumberDictionary> result = 9980 Handle<SeededNumberDictionary> result =
9981 SeededNumberDictionary::AtNumberPut(dict, index, elm); 9981 SeededNumberDictionary::AtNumberPut(dict, index, elm);
9982 if (!result.is_identical_to(dict)) { 9982 if (!result.is_identical_to(dict)) {
9983 // Dictionary needed to grow. 9983 // Dictionary needed to grow.
9984 clear_storage(); 9984 clear_storage();
9985 set_storage(*result); 9985 set_storage(*result);
9986 } 9986 }
9987 } 9987 }
(...skipping 27 matching lines...) Expand all
10015 fast_elements_ ? FAST_HOLEY_ELEMENTS : DICTIONARY_ELEMENTS); 10015 fast_elements_ ? FAST_HOLEY_ELEMENTS : DICTIONARY_ELEMENTS);
10016 array->set_map(*map); 10016 array->set_map(*map);
10017 array->set_length(*length); 10017 array->set_length(*length);
10018 array->set_elements(*storage_); 10018 array->set_elements(*storage_);
10019 return array; 10019 return array;
10020 } 10020 }
10021 10021
10022 private: 10022 private:
10023 // Convert storage to dictionary mode. 10023 // Convert storage to dictionary mode.
10024 void SetDictionaryMode() { 10024 void SetDictionaryMode() {
10025 ASSERT(fast_elements_); 10025 DCHECK(fast_elements_);
10026 Handle<FixedArray> current_storage(*storage_); 10026 Handle<FixedArray> current_storage(*storage_);
10027 Handle<SeededNumberDictionary> slow_storage( 10027 Handle<SeededNumberDictionary> slow_storage(
10028 SeededNumberDictionary::New(isolate_, current_storage->length())); 10028 SeededNumberDictionary::New(isolate_, current_storage->length()));
10029 uint32_t current_length = static_cast<uint32_t>(current_storage->length()); 10029 uint32_t current_length = static_cast<uint32_t>(current_storage->length());
10030 for (uint32_t i = 0; i < current_length; i++) { 10030 for (uint32_t i = 0; i < current_length; i++) {
10031 HandleScope loop_scope(isolate_); 10031 HandleScope loop_scope(isolate_);
10032 Handle<Object> element(current_storage->get(i), isolate_); 10032 Handle<Object> element(current_storage->get(i), isolate_);
10033 if (!element->IsTheHole()) { 10033 if (!element->IsTheHole()) {
10034 Handle<SeededNumberDictionary> new_storage = 10034 Handle<SeededNumberDictionary> new_storage =
10035 SeededNumberDictionary::AtNumberPut(slow_storage, i, element); 10035 SeededNumberDictionary::AtNumberPut(slow_storage, i, element);
(...skipping 29 matching lines...) Expand all
10065 static uint32_t EstimateElementCount(Handle<JSArray> array) { 10065 static uint32_t EstimateElementCount(Handle<JSArray> array) {
10066 uint32_t length = static_cast<uint32_t>(array->length()->Number()); 10066 uint32_t length = static_cast<uint32_t>(array->length()->Number());
10067 int element_count = 0; 10067 int element_count = 0;
10068 switch (array->GetElementsKind()) { 10068 switch (array->GetElementsKind()) {
10069 case FAST_SMI_ELEMENTS: 10069 case FAST_SMI_ELEMENTS:
10070 case FAST_HOLEY_SMI_ELEMENTS: 10070 case FAST_HOLEY_SMI_ELEMENTS:
10071 case FAST_ELEMENTS: 10071 case FAST_ELEMENTS:
10072 case FAST_HOLEY_ELEMENTS: { 10072 case FAST_HOLEY_ELEMENTS: {
10073 // Fast elements can't have lengths that are not representable by 10073 // Fast elements can't have lengths that are not representable by
10074 // a 32-bit signed integer. 10074 // a 32-bit signed integer.
10075 ASSERT(static_cast<int32_t>(FixedArray::kMaxLength) >= 0); 10075 DCHECK(static_cast<int32_t>(FixedArray::kMaxLength) >= 0);
10076 int fast_length = static_cast<int>(length); 10076 int fast_length = static_cast<int>(length);
10077 Handle<FixedArray> elements(FixedArray::cast(array->elements())); 10077 Handle<FixedArray> elements(FixedArray::cast(array->elements()));
10078 for (int i = 0; i < fast_length; i++) { 10078 for (int i = 0; i < fast_length; i++) {
10079 if (!elements->get(i)->IsTheHole()) element_count++; 10079 if (!elements->get(i)->IsTheHole()) element_count++;
10080 } 10080 }
10081 break; 10081 break;
10082 } 10082 }
10083 case FAST_DOUBLE_ELEMENTS: 10083 case FAST_DOUBLE_ELEMENTS:
10084 case FAST_HOLEY_DOUBLE_ELEMENTS: { 10084 case FAST_HOLEY_DOUBLE_ELEMENTS: {
10085 // Fast elements can't have lengths that are not representable by 10085 // Fast elements can't have lengths that are not representable by
10086 // a 32-bit signed integer. 10086 // a 32-bit signed integer.
10087 ASSERT(static_cast<int32_t>(FixedDoubleArray::kMaxLength) >= 0); 10087 DCHECK(static_cast<int32_t>(FixedDoubleArray::kMaxLength) >= 0);
10088 int fast_length = static_cast<int>(length); 10088 int fast_length = static_cast<int>(length);
10089 if (array->elements()->IsFixedArray()) { 10089 if (array->elements()->IsFixedArray()) {
10090 ASSERT(FixedArray::cast(array->elements())->length() == 0); 10090 DCHECK(FixedArray::cast(array->elements())->length() == 0);
10091 break; 10091 break;
10092 } 10092 }
10093 Handle<FixedDoubleArray> elements( 10093 Handle<FixedDoubleArray> elements(
10094 FixedDoubleArray::cast(array->elements())); 10094 FixedDoubleArray::cast(array->elements()));
10095 for (int i = 0; i < fast_length; i++) { 10095 for (int i = 0; i < fast_length; i++) {
10096 if (!elements->is_the_hole(i)) element_count++; 10096 if (!elements->is_the_hole(i)) element_count++;
10097 } 10097 }
10098 break; 10098 break;
10099 } 10099 }
10100 case DICTIONARY_ELEMENTS: { 10100 case DICTIONARY_ELEMENTS: {
(...skipping 28 matching lines...) Expand all
10129 template<class ExternalArrayClass, class ElementType> 10129 template<class ExternalArrayClass, class ElementType>
10130 static void IterateExternalArrayElements(Isolate* isolate, 10130 static void IterateExternalArrayElements(Isolate* isolate,
10131 Handle<JSObject> receiver, 10131 Handle<JSObject> receiver,
10132 bool elements_are_ints, 10132 bool elements_are_ints,
10133 bool elements_are_guaranteed_smis, 10133 bool elements_are_guaranteed_smis,
10134 ArrayConcatVisitor* visitor) { 10134 ArrayConcatVisitor* visitor) {
10135 Handle<ExternalArrayClass> array( 10135 Handle<ExternalArrayClass> array(
10136 ExternalArrayClass::cast(receiver->elements())); 10136 ExternalArrayClass::cast(receiver->elements()));
10137 uint32_t len = static_cast<uint32_t>(array->length()); 10137 uint32_t len = static_cast<uint32_t>(array->length());
10138 10138
10139 ASSERT(visitor != NULL); 10139 DCHECK(visitor != NULL);
10140 if (elements_are_ints) { 10140 if (elements_are_ints) {
10141 if (elements_are_guaranteed_smis) { 10141 if (elements_are_guaranteed_smis) {
10142 for (uint32_t j = 0; j < len; j++) { 10142 for (uint32_t j = 0; j < len; j++) {
10143 HandleScope loop_scope(isolate); 10143 HandleScope loop_scope(isolate);
10144 Handle<Smi> e(Smi::FromInt(static_cast<int>(array->get_scalar(j))), 10144 Handle<Smi> e(Smi::FromInt(static_cast<int>(array->get_scalar(j))),
10145 isolate); 10145 isolate);
10146 visitor->visit(j, e); 10146 visitor->visit(j, e);
10147 } 10147 }
10148 } else { 10148 } else {
10149 for (uint32_t j = 0; j < len; j++) { 10149 for (uint32_t j = 0; j < len; j++) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
10204 break; 10204 break;
10205 } 10205 }
10206 case DICTIONARY_ELEMENTS: { 10206 case DICTIONARY_ELEMENTS: {
10207 Handle<SeededNumberDictionary> dict( 10207 Handle<SeededNumberDictionary> dict(
10208 SeededNumberDictionary::cast(object->elements())); 10208 SeededNumberDictionary::cast(object->elements()));
10209 uint32_t capacity = dict->Capacity(); 10209 uint32_t capacity = dict->Capacity();
10210 for (uint32_t j = 0; j < capacity; j++) { 10210 for (uint32_t j = 0; j < capacity; j++) {
10211 HandleScope loop_scope(isolate); 10211 HandleScope loop_scope(isolate);
10212 Handle<Object> k(dict->KeyAt(j), isolate); 10212 Handle<Object> k(dict->KeyAt(j), isolate);
10213 if (dict->IsKey(*k)) { 10213 if (dict->IsKey(*k)) {
10214 ASSERT(k->IsNumber()); 10214 DCHECK(k->IsNumber());
10215 uint32_t index = static_cast<uint32_t>(k->Number()); 10215 uint32_t index = static_cast<uint32_t>(k->Number());
10216 if (index < range) { 10216 if (index < range) {
10217 indices->Add(index); 10217 indices->Add(index);
10218 } 10218 }
10219 } 10219 }
10220 } 10220 }
10221 break; 10221 break;
10222 } 10222 }
10223 default: { 10223 default: {
10224 int dense_elements_length; 10224 int dense_elements_length;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
10280 uint32_t length = static_cast<uint32_t>(receiver->length()->Number()); 10280 uint32_t length = static_cast<uint32_t>(receiver->length()->Number());
10281 switch (receiver->GetElementsKind()) { 10281 switch (receiver->GetElementsKind()) {
10282 case FAST_SMI_ELEMENTS: 10282 case FAST_SMI_ELEMENTS:
10283 case FAST_ELEMENTS: 10283 case FAST_ELEMENTS:
10284 case FAST_HOLEY_SMI_ELEMENTS: 10284 case FAST_HOLEY_SMI_ELEMENTS:
10285 case FAST_HOLEY_ELEMENTS: { 10285 case FAST_HOLEY_ELEMENTS: {
10286 // Run through the elements FixedArray and use HasElement and GetElement 10286 // Run through the elements FixedArray and use HasElement and GetElement
10287 // to check the prototype for missing elements. 10287 // to check the prototype for missing elements.
10288 Handle<FixedArray> elements(FixedArray::cast(receiver->elements())); 10288 Handle<FixedArray> elements(FixedArray::cast(receiver->elements()));
10289 int fast_length = static_cast<int>(length); 10289 int fast_length = static_cast<int>(length);
10290 ASSERT(fast_length <= elements->length()); 10290 DCHECK(fast_length <= elements->length());
10291 for (int j = 0; j < fast_length; j++) { 10291 for (int j = 0; j < fast_length; j++) {
10292 HandleScope loop_scope(isolate); 10292 HandleScope loop_scope(isolate);
10293 Handle<Object> element_value(elements->get(j), isolate); 10293 Handle<Object> element_value(elements->get(j), isolate);
10294 if (!element_value->IsTheHole()) { 10294 if (!element_value->IsTheHole()) {
10295 visitor->visit(j, element_value); 10295 visitor->visit(j, element_value);
10296 } else { 10296 } else {
10297 Maybe<bool> maybe = JSReceiver::HasElement(receiver, j); 10297 Maybe<bool> maybe = JSReceiver::HasElement(receiver, j);
10298 if (!maybe.has_value) return false; 10298 if (!maybe.has_value) return false;
10299 if (maybe.value) { 10299 if (maybe.value) {
10300 // Call GetElement on receiver, not its prototype, or getters won't 10300 // Call GetElement on receiver, not its prototype, or getters won't
10301 // have the correct receiver. 10301 // have the correct receiver.
10302 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 10302 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
10303 isolate, element_value, 10303 isolate, element_value,
10304 Object::GetElement(isolate, receiver, j), false); 10304 Object::GetElement(isolate, receiver, j), false);
10305 visitor->visit(j, element_value); 10305 visitor->visit(j, element_value);
10306 } 10306 }
10307 } 10307 }
10308 } 10308 }
10309 break; 10309 break;
10310 } 10310 }
10311 case FAST_HOLEY_DOUBLE_ELEMENTS: 10311 case FAST_HOLEY_DOUBLE_ELEMENTS:
10312 case FAST_DOUBLE_ELEMENTS: { 10312 case FAST_DOUBLE_ELEMENTS: {
10313 // Empty array is FixedArray but not FixedDoubleArray. 10313 // Empty array is FixedArray but not FixedDoubleArray.
10314 if (length == 0) break; 10314 if (length == 0) break;
10315 // Run through the elements FixedArray and use HasElement and GetElement 10315 // Run through the elements FixedArray and use HasElement and GetElement
10316 // to check the prototype for missing elements. 10316 // to check the prototype for missing elements.
10317 if (receiver->elements()->IsFixedArray()) { 10317 if (receiver->elements()->IsFixedArray()) {
10318 ASSERT(receiver->elements()->length() == 0); 10318 DCHECK(receiver->elements()->length() == 0);
10319 break; 10319 break;
10320 } 10320 }
10321 Handle<FixedDoubleArray> elements( 10321 Handle<FixedDoubleArray> elements(
10322 FixedDoubleArray::cast(receiver->elements())); 10322 FixedDoubleArray::cast(receiver->elements()));
10323 int fast_length = static_cast<int>(length); 10323 int fast_length = static_cast<int>(length);
10324 ASSERT(fast_length <= elements->length()); 10324 DCHECK(fast_length <= elements->length());
10325 for (int j = 0; j < fast_length; j++) { 10325 for (int j = 0; j < fast_length; j++) {
10326 HandleScope loop_scope(isolate); 10326 HandleScope loop_scope(isolate);
10327 if (!elements->is_the_hole(j)) { 10327 if (!elements->is_the_hole(j)) {
10328 double double_value = elements->get_scalar(j); 10328 double double_value = elements->get_scalar(j);
10329 Handle<Object> element_value = 10329 Handle<Object> element_value =
10330 isolate->factory()->NewNumber(double_value); 10330 isolate->factory()->NewNumber(double_value);
10331 visitor->visit(j, element_value); 10331 visitor->visit(j, element_value);
10332 } else { 10332 } else {
10333 Maybe<bool> maybe = JSReceiver::HasElement(receiver, j); 10333 Maybe<bool> maybe = JSReceiver::HasElement(receiver, j);
10334 if (!maybe.has_value) return false; 10334 if (!maybe.has_value) return false;
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
10429 10429
10430 10430
10431 /** 10431 /**
10432 * Array::concat implementation. 10432 * Array::concat implementation.
10433 * See ECMAScript 262, 15.4.4.4. 10433 * See ECMAScript 262, 15.4.4.4.
10434 * TODO(581): Fix non-compliance for very large concatenations and update to 10434 * TODO(581): Fix non-compliance for very large concatenations and update to
10435 * following the ECMAScript 5 specification. 10435 * following the ECMAScript 5 specification.
10436 */ 10436 */
10437 RUNTIME_FUNCTION(Runtime_ArrayConcat) { 10437 RUNTIME_FUNCTION(Runtime_ArrayConcat) {
10438 HandleScope handle_scope(isolate); 10438 HandleScope handle_scope(isolate);
10439 ASSERT(args.length() == 1); 10439 DCHECK(args.length() == 1);
10440 10440
10441 CONVERT_ARG_HANDLE_CHECKED(JSArray, arguments, 0); 10441 CONVERT_ARG_HANDLE_CHECKED(JSArray, arguments, 0);
10442 int argument_count = static_cast<int>(arguments->length()->Number()); 10442 int argument_count = static_cast<int>(arguments->length()->Number());
10443 RUNTIME_ASSERT(arguments->HasFastObjectElements()); 10443 RUNTIME_ASSERT(arguments->HasFastObjectElements());
10444 Handle<FixedArray> elements(FixedArray::cast(arguments->elements())); 10444 Handle<FixedArray> elements(FixedArray::cast(arguments->elements()));
10445 10445
10446 // Pass 1: estimate the length and number of elements of the result. 10446 // Pass 1: estimate the length and number of elements of the result.
10447 // The actual length can be larger if any of the arguments have getters 10447 // The actual length can be larger if any of the arguments have getters
10448 // that mutate other arguments (but will otherwise be precise). 10448 // that mutate other arguments (but will otherwise be precise).
10449 // The number of elements is precise if there are no inherited elements. 10449 // The number of elements is precise if there are no inherited elements.
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
10548 failure = true; 10548 failure = true;
10549 break; 10549 break;
10550 } 10550 }
10551 int32_t int_value = Smi::cast(element)->value(); 10551 int32_t int_value = Smi::cast(element)->value();
10552 double_storage->set(j, int_value); 10552 double_storage->set(j, int_value);
10553 j++; 10553 j++;
10554 } 10554 }
10555 break; 10555 break;
10556 } 10556 }
10557 case FAST_HOLEY_ELEMENTS: 10557 case FAST_HOLEY_ELEMENTS:
10558 ASSERT_EQ(0, length); 10558 DCHECK_EQ(0, length);
10559 break; 10559 break;
10560 default: 10560 default:
10561 UNREACHABLE(); 10561 UNREACHABLE();
10562 } 10562 }
10563 } 10563 }
10564 if (failure) break; 10564 if (failure) break;
10565 } 10565 }
10566 } 10566 }
10567 Handle<JSArray> array = isolate->factory()->NewJSArray(0); 10567 Handle<JSArray> array = isolate->factory()->NewJSArray(0);
10568 Smi* length = Smi::FromInt(j); 10568 Smi* length = Smi::FromInt(j);
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
10609 HandleVector<Object>(NULL, 0))); 10609 HandleVector<Object>(NULL, 0)));
10610 } 10610 }
10611 return *visitor.ToArray(); 10611 return *visitor.ToArray();
10612 } 10612 }
10613 10613
10614 10614
10615 // This will not allocate (flatten the string), but it may run 10615 // This will not allocate (flatten the string), but it may run
10616 // very slowly for very deeply nested ConsStrings. For debugging use only. 10616 // very slowly for very deeply nested ConsStrings. For debugging use only.
10617 RUNTIME_FUNCTION(Runtime_GlobalPrint) { 10617 RUNTIME_FUNCTION(Runtime_GlobalPrint) {
10618 SealHandleScope shs(isolate); 10618 SealHandleScope shs(isolate);
10619 ASSERT(args.length() == 1); 10619 DCHECK(args.length() == 1);
10620 10620
10621 CONVERT_ARG_CHECKED(String, string, 0); 10621 CONVERT_ARG_CHECKED(String, string, 0);
10622 ConsStringIteratorOp op; 10622 ConsStringIteratorOp op;
10623 StringCharacterStream stream(string, &op); 10623 StringCharacterStream stream(string, &op);
10624 while (stream.HasMore()) { 10624 while (stream.HasMore()) {
10625 uint16_t character = stream.GetNext(); 10625 uint16_t character = stream.GetNext();
10626 PrintF("%c", character); 10626 PrintF("%c", character);
10627 } 10627 }
10628 return string; 10628 return string;
10629 } 10629 }
10630 10630
10631 10631
10632 // Moves all own elements of an object, that are below a limit, to positions 10632 // Moves all own elements of an object, that are below a limit, to positions
10633 // starting at zero. All undefined values are placed after non-undefined values, 10633 // starting at zero. All undefined values are placed after non-undefined values,
10634 // and are followed by non-existing element. Does not change the length 10634 // and are followed by non-existing element. Does not change the length
10635 // property. 10635 // property.
10636 // Returns the number of non-undefined elements collected. 10636 // Returns the number of non-undefined elements collected.
10637 // Returns -1 if hole removal is not supported by this method. 10637 // Returns -1 if hole removal is not supported by this method.
10638 RUNTIME_FUNCTION(Runtime_RemoveArrayHoles) { 10638 RUNTIME_FUNCTION(Runtime_RemoveArrayHoles) {
10639 HandleScope scope(isolate); 10639 HandleScope scope(isolate);
10640 ASSERT(args.length() == 2); 10640 DCHECK(args.length() == 2);
10641 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 10641 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
10642 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]); 10642 CONVERT_NUMBER_CHECKED(uint32_t, limit, Uint32, args[1]);
10643 return *JSObject::PrepareElementsForSort(object, limit); 10643 return *JSObject::PrepareElementsForSort(object, limit);
10644 } 10644 }
10645 10645
10646 10646
10647 // Move contents of argument 0 (an array) to argument 1 (an array) 10647 // Move contents of argument 0 (an array) to argument 1 (an array)
10648 RUNTIME_FUNCTION(Runtime_MoveArrayContents) { 10648 RUNTIME_FUNCTION(Runtime_MoveArrayContents) {
10649 HandleScope scope(isolate); 10649 HandleScope scope(isolate);
10650 ASSERT(args.length() == 2); 10650 DCHECK(args.length() == 2);
10651 CONVERT_ARG_HANDLE_CHECKED(JSArray, from, 0); 10651 CONVERT_ARG_HANDLE_CHECKED(JSArray, from, 0);
10652 CONVERT_ARG_HANDLE_CHECKED(JSArray, to, 1); 10652 CONVERT_ARG_HANDLE_CHECKED(JSArray, to, 1);
10653 JSObject::ValidateElements(from); 10653 JSObject::ValidateElements(from);
10654 JSObject::ValidateElements(to); 10654 JSObject::ValidateElements(to);
10655 10655
10656 Handle<FixedArrayBase> new_elements(from->elements()); 10656 Handle<FixedArrayBase> new_elements(from->elements());
10657 ElementsKind from_kind = from->GetElementsKind(); 10657 ElementsKind from_kind = from->GetElementsKind();
10658 Handle<Map> new_map = JSObject::GetElementsTransitionMap(to, from_kind); 10658 Handle<Map> new_map = JSObject::GetElementsTransitionMap(to, from_kind);
10659 JSObject::SetMapAndElements(to, new_map, new_elements); 10659 JSObject::SetMapAndElements(to, new_map, new_elements);
10660 to->set_length(from->length()); 10660 to->set_length(from->length());
10661 10661
10662 JSObject::ResetElements(from); 10662 JSObject::ResetElements(from);
10663 from->set_length(Smi::FromInt(0)); 10663 from->set_length(Smi::FromInt(0));
10664 10664
10665 JSObject::ValidateElements(to); 10665 JSObject::ValidateElements(to);
10666 return *to; 10666 return *to;
10667 } 10667 }
10668 10668
10669 10669
10670 // How many elements does this object/array have? 10670 // How many elements does this object/array have?
10671 RUNTIME_FUNCTION(Runtime_EstimateNumberOfElements) { 10671 RUNTIME_FUNCTION(Runtime_EstimateNumberOfElements) {
10672 HandleScope scope(isolate); 10672 HandleScope scope(isolate);
10673 ASSERT(args.length() == 1); 10673 DCHECK(args.length() == 1);
10674 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0); 10674 CONVERT_ARG_HANDLE_CHECKED(JSArray, array, 0);
10675 Handle<FixedArrayBase> elements(array->elements(), isolate); 10675 Handle<FixedArrayBase> elements(array->elements(), isolate);
10676 SealHandleScope shs(isolate); 10676 SealHandleScope shs(isolate);
10677 if (elements->IsDictionary()) { 10677 if (elements->IsDictionary()) {
10678 int result = 10678 int result =
10679 Handle<SeededNumberDictionary>::cast(elements)->NumberOfElements(); 10679 Handle<SeededNumberDictionary>::cast(elements)->NumberOfElements();
10680 return Smi::FromInt(result); 10680 return Smi::FromInt(result);
10681 } else { 10681 } else {
10682 ASSERT(array->length()->IsSmi()); 10682 DCHECK(array->length()->IsSmi());
10683 // For packed elements, we know the exact number of elements 10683 // For packed elements, we know the exact number of elements
10684 int length = elements->length(); 10684 int length = elements->length();
10685 ElementsKind kind = array->GetElementsKind(); 10685 ElementsKind kind = array->GetElementsKind();
10686 if (IsFastPackedElementsKind(kind)) { 10686 if (IsFastPackedElementsKind(kind)) {
10687 return Smi::FromInt(length); 10687 return Smi::FromInt(length);
10688 } 10688 }
10689 // For holey elements, take samples from the buffer checking for holes 10689 // For holey elements, take samples from the buffer checking for holes
10690 // to generate the estimate. 10690 // to generate the estimate.
10691 const int kNumberOfHoleCheckSamples = 97; 10691 const int kNumberOfHoleCheckSamples = 97;
10692 int increment = (length < kNumberOfHoleCheckSamples) 10692 int increment = (length < kNumberOfHoleCheckSamples)
(...skipping 13 matching lines...) Expand all
10706 } 10706 }
10707 10707
10708 10708
10709 // Returns an array that tells you where in the [0, length) interval an array 10709 // Returns an array that tells you where in the [0, length) interval an array
10710 // might have elements. Can either return an array of keys (positive integers 10710 // might have elements. Can either return an array of keys (positive integers
10711 // or undefined) or a number representing the positive length of an interval 10711 // or undefined) or a number representing the positive length of an interval
10712 // starting at index 0. 10712 // starting at index 0.
10713 // Intervals can span over some keys that are not in the object. 10713 // Intervals can span over some keys that are not in the object.
10714 RUNTIME_FUNCTION(Runtime_GetArrayKeys) { 10714 RUNTIME_FUNCTION(Runtime_GetArrayKeys) {
10715 HandleScope scope(isolate); 10715 HandleScope scope(isolate);
10716 ASSERT(args.length() == 2); 10716 DCHECK(args.length() == 2);
10717 CONVERT_ARG_HANDLE_CHECKED(JSObject, array, 0); 10717 CONVERT_ARG_HANDLE_CHECKED(JSObject, array, 0);
10718 CONVERT_NUMBER_CHECKED(uint32_t, length, Uint32, args[1]); 10718 CONVERT_NUMBER_CHECKED(uint32_t, length, Uint32, args[1]);
10719 if (array->elements()->IsDictionary()) { 10719 if (array->elements()->IsDictionary()) {
10720 Handle<FixedArray> keys = isolate->factory()->empty_fixed_array(); 10720 Handle<FixedArray> keys = isolate->factory()->empty_fixed_array();
10721 for (PrototypeIterator iter(isolate, array, 10721 for (PrototypeIterator iter(isolate, array,
10722 PrototypeIterator::START_AT_RECEIVER); 10722 PrototypeIterator::START_AT_RECEIVER);
10723 !iter.IsAtEnd(); iter.Advance()) { 10723 !iter.IsAtEnd(); iter.Advance()) {
10724 if (PrototypeIterator::GetCurrent(iter)->IsJSProxy() || 10724 if (PrototypeIterator::GetCurrent(iter)->IsJSProxy() ||
10725 JSObject::cast(*PrototypeIterator::GetCurrent(iter)) 10725 JSObject::cast(*PrototypeIterator::GetCurrent(iter))
10726 ->HasIndexedInterceptor()) { 10726 ->HasIndexedInterceptor()) {
(...skipping 20 matching lines...) Expand all
10747 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements() || 10747 RUNTIME_ASSERT(array->HasFastSmiOrObjectElements() ||
10748 array->HasFastDoubleElements()); 10748 array->HasFastDoubleElements());
10749 uint32_t actual_length = static_cast<uint32_t>(array->elements()->length()); 10749 uint32_t actual_length = static_cast<uint32_t>(array->elements()->length());
10750 return *isolate->factory()->NewNumberFromUint(Min(actual_length, length)); 10750 return *isolate->factory()->NewNumberFromUint(Min(actual_length, length));
10751 } 10751 }
10752 } 10752 }
10753 10753
10754 10754
10755 RUNTIME_FUNCTION(Runtime_LookupAccessor) { 10755 RUNTIME_FUNCTION(Runtime_LookupAccessor) {
10756 HandleScope scope(isolate); 10756 HandleScope scope(isolate);
10757 ASSERT(args.length() == 3); 10757 DCHECK(args.length() == 3);
10758 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0); 10758 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, receiver, 0);
10759 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 10759 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
10760 CONVERT_SMI_ARG_CHECKED(flag, 2); 10760 CONVERT_SMI_ARG_CHECKED(flag, 2);
10761 AccessorComponent component = flag == 0 ? ACCESSOR_GETTER : ACCESSOR_SETTER; 10761 AccessorComponent component = flag == 0 ? ACCESSOR_GETTER : ACCESSOR_SETTER;
10762 if (!receiver->IsJSObject()) return isolate->heap()->undefined_value(); 10762 if (!receiver->IsJSObject()) return isolate->heap()->undefined_value();
10763 Handle<Object> result; 10763 Handle<Object> result;
10764 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 10764 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
10765 isolate, result, 10765 isolate, result,
10766 JSObject::GetAccessor(Handle<JSObject>::cast(receiver), name, component)); 10766 JSObject::GetAccessor(Handle<JSObject>::cast(receiver), name, component));
10767 return *result; 10767 return *result;
10768 } 10768 }
10769 10769
10770 10770
10771 RUNTIME_FUNCTION(Runtime_DebugBreak) { 10771 RUNTIME_FUNCTION(Runtime_DebugBreak) {
10772 SealHandleScope shs(isolate); 10772 SealHandleScope shs(isolate);
10773 ASSERT(args.length() == 0); 10773 DCHECK(args.length() == 0);
10774 isolate->debug()->HandleDebugBreak(); 10774 isolate->debug()->HandleDebugBreak();
10775 return isolate->heap()->undefined_value(); 10775 return isolate->heap()->undefined_value();
10776 } 10776 }
10777 10777
10778 10778
10779 // Helper functions for wrapping and unwrapping stack frame ids. 10779 // Helper functions for wrapping and unwrapping stack frame ids.
10780 static Smi* WrapFrameId(StackFrame::Id id) { 10780 static Smi* WrapFrameId(StackFrame::Id id) {
10781 ASSERT(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4))); 10781 DCHECK(IsAligned(OffsetFrom(id), static_cast<intptr_t>(4)));
10782 return Smi::FromInt(id >> 2); 10782 return Smi::FromInt(id >> 2);
10783 } 10783 }
10784 10784
10785 10785
10786 static StackFrame::Id UnwrapFrameId(int wrapped) { 10786 static StackFrame::Id UnwrapFrameId(int wrapped) {
10787 return static_cast<StackFrame::Id>(wrapped << 2); 10787 return static_cast<StackFrame::Id>(wrapped << 2);
10788 } 10788 }
10789 10789
10790 10790
10791 // Adds a JavaScript function as a debug event listener. 10791 // Adds a JavaScript function as a debug event listener.
10792 // args[0]: debug event listener function to set or null or undefined for 10792 // args[0]: debug event listener function to set or null or undefined for
10793 // clearing the event listener function 10793 // clearing the event listener function
10794 // args[1]: object supplied during callback 10794 // args[1]: object supplied during callback
10795 RUNTIME_FUNCTION(Runtime_SetDebugEventListener) { 10795 RUNTIME_FUNCTION(Runtime_SetDebugEventListener) {
10796 SealHandleScope shs(isolate); 10796 SealHandleScope shs(isolate);
10797 ASSERT(args.length() == 2); 10797 DCHECK(args.length() == 2);
10798 RUNTIME_ASSERT(args[0]->IsJSFunction() || 10798 RUNTIME_ASSERT(args[0]->IsJSFunction() ||
10799 args[0]->IsUndefined() || 10799 args[0]->IsUndefined() ||
10800 args[0]->IsNull()); 10800 args[0]->IsNull());
10801 CONVERT_ARG_HANDLE_CHECKED(Object, callback, 0); 10801 CONVERT_ARG_HANDLE_CHECKED(Object, callback, 0);
10802 CONVERT_ARG_HANDLE_CHECKED(Object, data, 1); 10802 CONVERT_ARG_HANDLE_CHECKED(Object, data, 1);
10803 isolate->debug()->SetEventListener(callback, data); 10803 isolate->debug()->SetEventListener(callback, data);
10804 10804
10805 return isolate->heap()->undefined_value(); 10805 return isolate->heap()->undefined_value();
10806 } 10806 }
10807 10807
10808 10808
10809 RUNTIME_FUNCTION(Runtime_Break) { 10809 RUNTIME_FUNCTION(Runtime_Break) {
10810 SealHandleScope shs(isolate); 10810 SealHandleScope shs(isolate);
10811 ASSERT(args.length() == 0); 10811 DCHECK(args.length() == 0);
10812 isolate->stack_guard()->RequestDebugBreak(); 10812 isolate->stack_guard()->RequestDebugBreak();
10813 return isolate->heap()->undefined_value(); 10813 return isolate->heap()->undefined_value();
10814 } 10814 }
10815 10815
10816 10816
10817 static Handle<Object> DebugLookupResultValue(Isolate* isolate, 10817 static Handle<Object> DebugLookupResultValue(Isolate* isolate,
10818 Handle<Object> receiver, 10818 Handle<Object> receiver,
10819 Handle<Name> name, 10819 Handle<Name> name,
10820 LookupResult* result, 10820 LookupResult* result,
10821 bool* has_caught = NULL) { 10821 bool* has_caught = NULL) {
10822 Handle<Object> value = isolate->factory()->undefined_value(); 10822 Handle<Object> value = isolate->factory()->undefined_value();
10823 if (!result->IsFound()) return value; 10823 if (!result->IsFound()) return value;
10824 switch (result->type()) { 10824 switch (result->type()) {
10825 case NORMAL: 10825 case NORMAL:
10826 return JSObject::GetNormalizedProperty(handle(result->holder(), isolate), 10826 return JSObject::GetNormalizedProperty(handle(result->holder(), isolate),
10827 result); 10827 result);
10828 case FIELD: 10828 case FIELD:
10829 return JSObject::FastPropertyAt(handle(result->holder(), isolate), 10829 return JSObject::FastPropertyAt(handle(result->holder(), isolate),
10830 result->representation(), 10830 result->representation(),
10831 result->GetFieldIndex()); 10831 result->GetFieldIndex());
10832 case CONSTANT: 10832 case CONSTANT:
10833 return handle(result->GetConstant(), isolate); 10833 return handle(result->GetConstant(), isolate);
10834 case CALLBACKS: { 10834 case CALLBACKS: {
10835 Handle<Object> structure(result->GetCallbackObject(), isolate); 10835 Handle<Object> structure(result->GetCallbackObject(), isolate);
10836 ASSERT(!structure->IsForeign()); 10836 DCHECK(!structure->IsForeign());
10837 if (structure->IsAccessorInfo()) { 10837 if (structure->IsAccessorInfo()) {
10838 MaybeHandle<Object> obj = JSObject::GetPropertyWithAccessor( 10838 MaybeHandle<Object> obj = JSObject::GetPropertyWithAccessor(
10839 receiver, name, handle(result->holder(), isolate), structure); 10839 receiver, name, handle(result->holder(), isolate), structure);
10840 if (!obj.ToHandle(&value)) { 10840 if (!obj.ToHandle(&value)) {
10841 value = handle(isolate->pending_exception(), isolate); 10841 value = handle(isolate->pending_exception(), isolate);
10842 isolate->clear_pending_exception(); 10842 isolate->clear_pending_exception();
10843 if (has_caught != NULL) *has_caught = true; 10843 if (has_caught != NULL) *has_caught = true;
10844 return value; 10844 return value;
10845 } 10845 }
10846 } 10846 }
(...skipping 18 matching lines...) Expand all
10865 // 0: Property value 10865 // 0: Property value
10866 // 1: Property details 10866 // 1: Property details
10867 // 2: Property value is exception 10867 // 2: Property value is exception
10868 // 3: Getter function if defined 10868 // 3: Getter function if defined
10869 // 4: Setter function if defined 10869 // 4: Setter function if defined
10870 // Items 2-4 are only filled if the property has either a getter or a setter 10870 // Items 2-4 are only filled if the property has either a getter or a setter
10871 // defined through __defineGetter__ and/or __defineSetter__. 10871 // defined through __defineGetter__ and/or __defineSetter__.
10872 RUNTIME_FUNCTION(Runtime_DebugGetPropertyDetails) { 10872 RUNTIME_FUNCTION(Runtime_DebugGetPropertyDetails) {
10873 HandleScope scope(isolate); 10873 HandleScope scope(isolate);
10874 10874
10875 ASSERT(args.length() == 2); 10875 DCHECK(args.length() == 2);
10876 10876
10877 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 10877 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
10878 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 10878 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
10879 10879
10880 // Make sure to set the current context to the context before the debugger was 10880 // Make sure to set the current context to the context before the debugger was
10881 // entered (if the debugger is entered). The reason for switching context here 10881 // entered (if the debugger is entered). The reason for switching context here
10882 // is that for some property lookups (accessors and interceptors) callbacks 10882 // is that for some property lookups (accessors and interceptors) callbacks
10883 // into the embedding application can occour, and the embedding application 10883 // into the embedding application can occour, and the embedding application
10884 // could have the assumption that its own native context is the current 10884 // could have the assumption that its own native context is the current
10885 // context and not some internal debugger context. 10885 // context and not some internal debugger context.
(...skipping 16 matching lines...) Expand all
10902 1, PropertyDetails(NONE, NORMAL, Representation::None()).AsSmi()); 10902 1, PropertyDetails(NONE, NORMAL, Representation::None()).AsSmi());
10903 return *isolate->factory()->NewJSArrayWithElements(details); 10903 return *isolate->factory()->NewJSArrayWithElements(details);
10904 } 10904 }
10905 10905
10906 // Find the number of objects making up this. 10906 // Find the number of objects making up this.
10907 int length = OwnPrototypeChainLength(*obj); 10907 int length = OwnPrototypeChainLength(*obj);
10908 10908
10909 // Try own lookup on each of the objects. 10909 // Try own lookup on each of the objects.
10910 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER); 10910 PrototypeIterator iter(isolate, obj, PrototypeIterator::START_AT_RECEIVER);
10911 for (int i = 0; i < length; i++) { 10911 for (int i = 0; i < length; i++) {
10912 ASSERT(!iter.IsAtEnd()); 10912 DCHECK(!iter.IsAtEnd());
10913 Handle<JSObject> jsproto = 10913 Handle<JSObject> jsproto =
10914 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter)); 10914 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter));
10915 LookupResult result(isolate); 10915 LookupResult result(isolate);
10916 jsproto->LookupOwn(name, &result); 10916 jsproto->LookupOwn(name, &result);
10917 if (result.IsFound()) { 10917 if (result.IsFound()) {
10918 // LookupResult is not GC safe as it holds raw object pointers. 10918 // LookupResult is not GC safe as it holds raw object pointers.
10919 // GC can happen later in this code so put the required fields into 10919 // GC can happen later in this code so put the required fields into
10920 // local variables using handles when required for later use. 10920 // local variables using handles when required for later use.
10921 Handle<Object> result_callback_obj; 10921 Handle<Object> result_callback_obj;
10922 if (result.IsPropertyCallbacks()) { 10922 if (result.IsPropertyCallbacks()) {
(...skipping 26 matching lines...) Expand all
10949 iter.Advance(); 10949 iter.Advance();
10950 } 10950 }
10951 10951
10952 return isolate->heap()->undefined_value(); 10952 return isolate->heap()->undefined_value();
10953 } 10953 }
10954 10954
10955 10955
10956 RUNTIME_FUNCTION(Runtime_DebugGetProperty) { 10956 RUNTIME_FUNCTION(Runtime_DebugGetProperty) {
10957 HandleScope scope(isolate); 10957 HandleScope scope(isolate);
10958 10958
10959 ASSERT(args.length() == 2); 10959 DCHECK(args.length() == 2);
10960 10960
10961 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 10961 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
10962 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 10962 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
10963 10963
10964 LookupResult result(isolate); 10964 LookupResult result(isolate);
10965 obj->Lookup(name, &result); 10965 obj->Lookup(name, &result);
10966 return *DebugLookupResultValue(isolate, obj, name, &result); 10966 return *DebugLookupResultValue(isolate, obj, name, &result);
10967 } 10967 }
10968 10968
10969 10969
10970 // Return the property type calculated from the property details. 10970 // Return the property type calculated from the property details.
10971 // args[0]: smi with property details. 10971 // args[0]: smi with property details.
10972 RUNTIME_FUNCTION(Runtime_DebugPropertyTypeFromDetails) { 10972 RUNTIME_FUNCTION(Runtime_DebugPropertyTypeFromDetails) {
10973 SealHandleScope shs(isolate); 10973 SealHandleScope shs(isolate);
10974 ASSERT(args.length() == 1); 10974 DCHECK(args.length() == 1);
10975 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); 10975 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0);
10976 return Smi::FromInt(static_cast<int>(details.type())); 10976 return Smi::FromInt(static_cast<int>(details.type()));
10977 } 10977 }
10978 10978
10979 10979
10980 // Return the property attribute calculated from the property details. 10980 // Return the property attribute calculated from the property details.
10981 // args[0]: smi with property details. 10981 // args[0]: smi with property details.
10982 RUNTIME_FUNCTION(Runtime_DebugPropertyAttributesFromDetails) { 10982 RUNTIME_FUNCTION(Runtime_DebugPropertyAttributesFromDetails) {
10983 SealHandleScope shs(isolate); 10983 SealHandleScope shs(isolate);
10984 ASSERT(args.length() == 1); 10984 DCHECK(args.length() == 1);
10985 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); 10985 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0);
10986 return Smi::FromInt(static_cast<int>(details.attributes())); 10986 return Smi::FromInt(static_cast<int>(details.attributes()));
10987 } 10987 }
10988 10988
10989 10989
10990 // Return the property insertion index calculated from the property details. 10990 // Return the property insertion index calculated from the property details.
10991 // args[0]: smi with property details. 10991 // args[0]: smi with property details.
10992 RUNTIME_FUNCTION(Runtime_DebugPropertyIndexFromDetails) { 10992 RUNTIME_FUNCTION(Runtime_DebugPropertyIndexFromDetails) {
10993 SealHandleScope shs(isolate); 10993 SealHandleScope shs(isolate);
10994 ASSERT(args.length() == 1); 10994 DCHECK(args.length() == 1);
10995 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0); 10995 CONVERT_PROPERTY_DETAILS_CHECKED(details, 0);
10996 // TODO(verwaest): Depends on the type of details. 10996 // TODO(verwaest): Depends on the type of details.
10997 return Smi::FromInt(details.dictionary_index()); 10997 return Smi::FromInt(details.dictionary_index());
10998 } 10998 }
10999 10999
11000 11000
11001 // Return property value from named interceptor. 11001 // Return property value from named interceptor.
11002 // args[0]: object 11002 // args[0]: object
11003 // args[1]: property name 11003 // args[1]: property name
11004 RUNTIME_FUNCTION(Runtime_DebugNamedInterceptorPropertyValue) { 11004 RUNTIME_FUNCTION(Runtime_DebugNamedInterceptorPropertyValue) {
11005 HandleScope scope(isolate); 11005 HandleScope scope(isolate);
11006 ASSERT(args.length() == 2); 11006 DCHECK(args.length() == 2);
11007 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 11007 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
11008 RUNTIME_ASSERT(obj->HasNamedInterceptor()); 11008 RUNTIME_ASSERT(obj->HasNamedInterceptor());
11009 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1); 11009 CONVERT_ARG_HANDLE_CHECKED(Name, name, 1);
11010 11010
11011 Handle<Object> result; 11011 Handle<Object> result;
11012 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 11012 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
11013 isolate, result, JSObject::GetProperty(obj, name)); 11013 isolate, result, JSObject::GetProperty(obj, name));
11014 return *result; 11014 return *result;
11015 } 11015 }
11016 11016
11017 11017
11018 // Return element value from indexed interceptor. 11018 // Return element value from indexed interceptor.
11019 // args[0]: object 11019 // args[0]: object
11020 // args[1]: index 11020 // args[1]: index
11021 RUNTIME_FUNCTION(Runtime_DebugIndexedInterceptorElementValue) { 11021 RUNTIME_FUNCTION(Runtime_DebugIndexedInterceptorElementValue) {
11022 HandleScope scope(isolate); 11022 HandleScope scope(isolate);
11023 ASSERT(args.length() == 2); 11023 DCHECK(args.length() == 2);
11024 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 11024 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
11025 RUNTIME_ASSERT(obj->HasIndexedInterceptor()); 11025 RUNTIME_ASSERT(obj->HasIndexedInterceptor());
11026 CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]); 11026 CONVERT_NUMBER_CHECKED(uint32_t, index, Uint32, args[1]);
11027 Handle<Object> result; 11027 Handle<Object> result;
11028 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 11028 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
11029 isolate, result, JSObject::GetElementWithInterceptor(obj, obj, index)); 11029 isolate, result, JSObject::GetElementWithInterceptor(obj, obj, index));
11030 return *result; 11030 return *result;
11031 } 11031 }
11032 11032
11033 11033
11034 static bool CheckExecutionState(Isolate* isolate, int break_id) { 11034 static bool CheckExecutionState(Isolate* isolate, int break_id) {
11035 return !isolate->debug()->debug_context().is_null() && 11035 return !isolate->debug()->debug_context().is_null() &&
11036 isolate->debug()->break_id() != 0 && 11036 isolate->debug()->break_id() != 0 &&
11037 isolate->debug()->break_id() == break_id; 11037 isolate->debug()->break_id() == break_id;
11038 } 11038 }
11039 11039
11040 11040
11041 RUNTIME_FUNCTION(Runtime_CheckExecutionState) { 11041 RUNTIME_FUNCTION(Runtime_CheckExecutionState) {
11042 SealHandleScope shs(isolate); 11042 SealHandleScope shs(isolate);
11043 ASSERT(args.length() == 1); 11043 DCHECK(args.length() == 1);
11044 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 11044 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
11045 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 11045 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
11046 return isolate->heap()->true_value(); 11046 return isolate->heap()->true_value();
11047 } 11047 }
11048 11048
11049 11049
11050 RUNTIME_FUNCTION(Runtime_GetFrameCount) { 11050 RUNTIME_FUNCTION(Runtime_GetFrameCount) {
11051 HandleScope scope(isolate); 11051 HandleScope scope(isolate);
11052 ASSERT(args.length() == 1); 11052 DCHECK(args.length() == 1);
11053 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 11053 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
11054 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 11054 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
11055 11055
11056 // Count all frames which are relevant to debugging stack trace. 11056 // Count all frames which are relevant to debugging stack trace.
11057 int n = 0; 11057 int n = 0;
11058 StackFrame::Id id = isolate->debug()->break_frame_id(); 11058 StackFrame::Id id = isolate->debug()->break_frame_id();
11059 if (id == StackFrame::NO_ID) { 11059 if (id == StackFrame::NO_ID) {
11060 // If there is no JavaScript stack frame count is 0. 11060 // If there is no JavaScript stack frame count is 0.
11061 return Smi::FromInt(0); 11061 return Smi::FromInt(0);
11062 } 11062 }
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
11120 } 11120 }
11121 bool IsConstructor() { 11121 bool IsConstructor() {
11122 return is_optimized_ && !is_bottommost_ 11122 return is_optimized_ && !is_bottommost_
11123 ? deoptimized_frame_->HasConstructStub() 11123 ? deoptimized_frame_->HasConstructStub()
11124 : frame_->IsConstructor(); 11124 : frame_->IsConstructor();
11125 } 11125 }
11126 11126
11127 // To inspect all the provided arguments the frame might need to be 11127 // To inspect all the provided arguments the frame might need to be
11128 // replaced with the arguments frame. 11128 // replaced with the arguments frame.
11129 void SetArgumentsFrame(JavaScriptFrame* frame) { 11129 void SetArgumentsFrame(JavaScriptFrame* frame) {
11130 ASSERT(has_adapted_arguments_); 11130 DCHECK(has_adapted_arguments_);
11131 frame_ = frame; 11131 frame_ = frame;
11132 is_optimized_ = frame_->is_optimized(); 11132 is_optimized_ = frame_->is_optimized();
11133 ASSERT(!is_optimized_); 11133 DCHECK(!is_optimized_);
11134 } 11134 }
11135 11135
11136 private: 11136 private:
11137 JavaScriptFrame* frame_; 11137 JavaScriptFrame* frame_;
11138 DeoptimizedFrameInfo* deoptimized_frame_; 11138 DeoptimizedFrameInfo* deoptimized_frame_;
11139 Isolate* isolate_; 11139 Isolate* isolate_;
11140 bool is_optimized_; 11140 bool is_optimized_;
11141 bool is_bottommost_; 11141 bool is_bottommost_;
11142 bool has_adapted_arguments_; 11142 bool has_adapted_arguments_;
11143 11143
(...skipping 12 matching lines...) Expand all
11156 static const int kFrameDetailsFlagsIndex = 8; 11156 static const int kFrameDetailsFlagsIndex = 8;
11157 static const int kFrameDetailsFirstDynamicIndex = 9; 11157 static const int kFrameDetailsFirstDynamicIndex = 9;
11158 11158
11159 11159
11160 static SaveContext* FindSavedContextForFrame(Isolate* isolate, 11160 static SaveContext* FindSavedContextForFrame(Isolate* isolate,
11161 JavaScriptFrame* frame) { 11161 JavaScriptFrame* frame) {
11162 SaveContext* save = isolate->save_context(); 11162 SaveContext* save = isolate->save_context();
11163 while (save != NULL && !save->IsBelowFrame(frame)) { 11163 while (save != NULL && !save->IsBelowFrame(frame)) {
11164 save = save->prev(); 11164 save = save->prev();
11165 } 11165 }
11166 ASSERT(save != NULL); 11166 DCHECK(save != NULL);
11167 return save; 11167 return save;
11168 } 11168 }
11169 11169
11170 11170
11171 RUNTIME_FUNCTION(Runtime_IsOptimized) { 11171 RUNTIME_FUNCTION(Runtime_IsOptimized) {
11172 SealHandleScope shs(isolate); 11172 SealHandleScope shs(isolate);
11173 ASSERT(args.length() == 0); 11173 DCHECK(args.length() == 0);
11174 JavaScriptFrameIterator it(isolate); 11174 JavaScriptFrameIterator it(isolate);
11175 JavaScriptFrame* frame = it.frame(); 11175 JavaScriptFrame* frame = it.frame();
11176 return isolate->heap()->ToBoolean(frame->is_optimized()); 11176 return isolate->heap()->ToBoolean(frame->is_optimized());
11177 } 11177 }
11178 11178
11179 11179
11180 // Return an array with frame details 11180 // Return an array with frame details
11181 // args[0]: number: break id 11181 // args[0]: number: break id
11182 // args[1]: number: frame index 11182 // args[1]: number: frame index
11183 // 11183 //
11184 // The array returned contains the following information: 11184 // The array returned contains the following information:
11185 // 0: Frame id 11185 // 0: Frame id
11186 // 1: Receiver 11186 // 1: Receiver
11187 // 2: Function 11187 // 2: Function
11188 // 3: Argument count 11188 // 3: Argument count
11189 // 4: Local count 11189 // 4: Local count
11190 // 5: Source position 11190 // 5: Source position
11191 // 6: Constructor call 11191 // 6: Constructor call
11192 // 7: Is at return 11192 // 7: Is at return
11193 // 8: Flags 11193 // 8: Flags
11194 // Arguments name, value 11194 // Arguments name, value
11195 // Locals name, value 11195 // Locals name, value
11196 // Return value if any 11196 // Return value if any
11197 RUNTIME_FUNCTION(Runtime_GetFrameDetails) { 11197 RUNTIME_FUNCTION(Runtime_GetFrameDetails) {
11198 HandleScope scope(isolate); 11198 HandleScope scope(isolate);
11199 ASSERT(args.length() == 2); 11199 DCHECK(args.length() == 2);
11200 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 11200 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
11201 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 11201 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
11202 11202
11203 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); 11203 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]);
11204 Heap* heap = isolate->heap(); 11204 Heap* heap = isolate->heap();
11205 11205
11206 // Find the relevant frame with the requested index. 11206 // Find the relevant frame with the requested index.
11207 StackFrame::Id id = isolate->debug()->break_frame_id(); 11207 StackFrame::Id id = isolate->debug()->break_frame_id();
11208 if (id == StackFrame::NO_ID) { 11208 if (id == StackFrame::NO_ID) {
11209 // If there are no JavaScript stack frames return undefined. 11209 // If there are no JavaScript stack frames return undefined.
(...skipping 27 matching lines...) Expand all
11237 // Find source position in unoptimized code. 11237 // Find source position in unoptimized code.
11238 int position = frame_inspector.GetSourcePosition(); 11238 int position = frame_inspector.GetSourcePosition();
11239 11239
11240 // Check for constructor frame. 11240 // Check for constructor frame.
11241 bool constructor = frame_inspector.IsConstructor(); 11241 bool constructor = frame_inspector.IsConstructor();
11242 11242
11243 // Get scope info and read from it for local variable information. 11243 // Get scope info and read from it for local variable information.
11244 Handle<JSFunction> function(JSFunction::cast(frame_inspector.GetFunction())); 11244 Handle<JSFunction> function(JSFunction::cast(frame_inspector.GetFunction()));
11245 Handle<SharedFunctionInfo> shared(function->shared()); 11245 Handle<SharedFunctionInfo> shared(function->shared());
11246 Handle<ScopeInfo> scope_info(shared->scope_info()); 11246 Handle<ScopeInfo> scope_info(shared->scope_info());
11247 ASSERT(*scope_info != ScopeInfo::Empty(isolate)); 11247 DCHECK(*scope_info != ScopeInfo::Empty(isolate));
11248 11248
11249 // Get the locals names and values into a temporary array. 11249 // Get the locals names and values into a temporary array.
11250 int local_count = scope_info->LocalCount(); 11250 int local_count = scope_info->LocalCount();
11251 for (int slot = 0; slot < scope_info->LocalCount(); ++slot) { 11251 for (int slot = 0; slot < scope_info->LocalCount(); ++slot) {
11252 // Hide compiler-introduced temporary variables, whether on the stack or on 11252 // Hide compiler-introduced temporary variables, whether on the stack or on
11253 // the context. 11253 // the context.
11254 if (scope_info->LocalIsSynthetic(slot)) 11254 if (scope_info->LocalIsSynthetic(slot))
11255 local_count--; 11255 local_count--;
11256 } 11256 }
11257 11257
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
11431 // If the receiver is not a JSObject and the function is not a 11431 // If the receiver is not a JSObject and the function is not a
11432 // builtin or strict-mode we have hit an optimization where a 11432 // builtin or strict-mode we have hit an optimization where a
11433 // value object is not converted into a wrapped JS objects. To 11433 // value object is not converted into a wrapped JS objects. To
11434 // hide this optimization from the debugger, we wrap the receiver 11434 // hide this optimization from the debugger, we wrap the receiver
11435 // by creating correct wrapper object based on the calling frame's 11435 // by creating correct wrapper object based on the calling frame's
11436 // native context. 11436 // native context.
11437 it.Advance(); 11437 it.Advance();
11438 if (receiver->IsUndefined()) { 11438 if (receiver->IsUndefined()) {
11439 receiver = handle(function->global_proxy()); 11439 receiver = handle(function->global_proxy());
11440 } else { 11440 } else {
11441 ASSERT(!receiver->IsNull()); 11441 DCHECK(!receiver->IsNull());
11442 Context* context = Context::cast(it.frame()->context()); 11442 Context* context = Context::cast(it.frame()->context());
11443 Handle<Context> native_context(Context::cast(context->native_context())); 11443 Handle<Context> native_context(Context::cast(context->native_context()));
11444 receiver = Object::ToObject( 11444 receiver = Object::ToObject(
11445 isolate, receiver, native_context).ToHandleChecked(); 11445 isolate, receiver, native_context).ToHandleChecked();
11446 } 11446 }
11447 } 11447 }
11448 details->set(kFrameDetailsReceiverIndex, *receiver); 11448 details->set(kFrameDetailsReceiverIndex, *receiver);
11449 11449
11450 ASSERT_EQ(details_size, details_index); 11450 DCHECK_EQ(details_size, details_index);
11451 return *isolate->factory()->NewJSArrayWithElements(details); 11451 return *isolate->factory()->NewJSArrayWithElements(details);
11452 } 11452 }
11453 11453
11454 11454
11455 static bool ParameterIsShadowedByContextLocal(Handle<ScopeInfo> info, 11455 static bool ParameterIsShadowedByContextLocal(Handle<ScopeInfo> info,
11456 Handle<String> parameter_name) { 11456 Handle<String> parameter_name) {
11457 VariableMode mode; 11457 VariableMode mode;
11458 InitializationFlag init_flag; 11458 InitializationFlag init_flag;
11459 MaybeAssignedFlag maybe_assigned_flag; 11459 MaybeAssignedFlag maybe_assigned_flag;
11460 return ScopeInfo::ContextSlotIndex(info, parameter_name, &mode, &init_flag, 11460 return ScopeInfo::ContextSlotIndex(info, parameter_name, &mode, &init_flag,
(...skipping 16 matching lines...) Expand all
11477 for (int i = 0; i < scope_info->ParameterCount(); ++i) { 11477 for (int i = 0; i < scope_info->ParameterCount(); ++i) {
11478 // Do not materialize the parameter if it is shadowed by a context local. 11478 // Do not materialize the parameter if it is shadowed by a context local.
11479 Handle<String> name(scope_info->ParameterName(i)); 11479 Handle<String> name(scope_info->ParameterName(i));
11480 if (ParameterIsShadowedByContextLocal(scope_info, name)) continue; 11480 if (ParameterIsShadowedByContextLocal(scope_info, name)) continue;
11481 11481
11482 HandleScope scope(isolate); 11482 HandleScope scope(isolate);
11483 Handle<Object> value(i < frame_inspector->GetParametersCount() 11483 Handle<Object> value(i < frame_inspector->GetParametersCount()
11484 ? frame_inspector->GetParameter(i) 11484 ? frame_inspector->GetParameter(i)
11485 : isolate->heap()->undefined_value(), 11485 : isolate->heap()->undefined_value(),
11486 isolate); 11486 isolate);
11487 ASSERT(!value->IsTheHole()); 11487 DCHECK(!value->IsTheHole());
11488 11488
11489 RETURN_ON_EXCEPTION( 11489 RETURN_ON_EXCEPTION(
11490 isolate, 11490 isolate,
11491 Runtime::SetObjectProperty(isolate, target, name, value, SLOPPY), 11491 Runtime::SetObjectProperty(isolate, target, name, value, SLOPPY),
11492 JSObject); 11492 JSObject);
11493 } 11493 }
11494 11494
11495 // Second fill all stack locals. 11495 // Second fill all stack locals.
11496 for (int i = 0; i < scope_info->StackLocalCount(); ++i) { 11496 for (int i = 0; i < scope_info->StackLocalCount(); ++i) {
11497 if (scope_info->LocalIsSynthetic(i)) continue; 11497 if (scope_info->LocalIsSynthetic(i)) continue;
(...skipping 25 matching lines...) Expand all
11523 11523
11524 Handle<SharedFunctionInfo> shared(function->shared()); 11524 Handle<SharedFunctionInfo> shared(function->shared());
11525 Handle<ScopeInfo> scope_info(shared->scope_info()); 11525 Handle<ScopeInfo> scope_info(shared->scope_info());
11526 11526
11527 // Parameters. 11527 // Parameters.
11528 for (int i = 0; i < scope_info->ParameterCount(); ++i) { 11528 for (int i = 0; i < scope_info->ParameterCount(); ++i) {
11529 // Shadowed parameters were not materialized. 11529 // Shadowed parameters were not materialized.
11530 Handle<String> name(scope_info->ParameterName(i)); 11530 Handle<String> name(scope_info->ParameterName(i));
11531 if (ParameterIsShadowedByContextLocal(scope_info, name)) continue; 11531 if (ParameterIsShadowedByContextLocal(scope_info, name)) continue;
11532 11532
11533 ASSERT(!frame->GetParameter(i)->IsTheHole()); 11533 DCHECK(!frame->GetParameter(i)->IsTheHole());
11534 HandleScope scope(isolate); 11534 HandleScope scope(isolate);
11535 Handle<Object> value = 11535 Handle<Object> value =
11536 Object::GetPropertyOrElement(target, name).ToHandleChecked(); 11536 Object::GetPropertyOrElement(target, name).ToHandleChecked();
11537 frame->SetParameterValue(i, *value); 11537 frame->SetParameterValue(i, *value);
11538 } 11538 }
11539 11539
11540 // Stack locals. 11540 // Stack locals.
11541 for (int i = 0; i < scope_info->StackLocalCount(); ++i) { 11541 for (int i = 0; i < scope_info->StackLocalCount(); ++i) {
11542 if (scope_info->LocalIsSynthetic(i)) continue; 11542 if (scope_info->LocalIsSynthetic(i)) continue;
11543 if (frame->GetExpression(i)->IsTheHole()) continue; 11543 if (frame->GetExpression(i)->IsTheHole()) continue;
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
11576 !function_context->IsNativeContext()) { 11576 !function_context->IsNativeContext()) {
11577 Handle<JSObject> ext(JSObject::cast(function_context->extension())); 11577 Handle<JSObject> ext(JSObject::cast(function_context->extension()));
11578 Handle<FixedArray> keys; 11578 Handle<FixedArray> keys;
11579 ASSIGN_RETURN_ON_EXCEPTION( 11579 ASSIGN_RETURN_ON_EXCEPTION(
11580 isolate, keys, 11580 isolate, keys,
11581 JSReceiver::GetKeys(ext, JSReceiver::INCLUDE_PROTOS), 11581 JSReceiver::GetKeys(ext, JSReceiver::INCLUDE_PROTOS),
11582 JSObject); 11582 JSObject);
11583 11583
11584 for (int i = 0; i < keys->length(); i++) { 11584 for (int i = 0; i < keys->length(); i++) {
11585 // Names of variables introduced by eval are strings. 11585 // Names of variables introduced by eval are strings.
11586 ASSERT(keys->get(i)->IsString()); 11586 DCHECK(keys->get(i)->IsString());
11587 Handle<String> key(String::cast(keys->get(i))); 11587 Handle<String> key(String::cast(keys->get(i)));
11588 Handle<Object> value; 11588 Handle<Object> value;
11589 ASSIGN_RETURN_ON_EXCEPTION( 11589 ASSIGN_RETURN_ON_EXCEPTION(
11590 isolate, value, Object::GetPropertyOrElement(ext, key), JSObject); 11590 isolate, value, Object::GetPropertyOrElement(ext, key), JSObject);
11591 RETURN_ON_EXCEPTION( 11591 RETURN_ON_EXCEPTION(
11592 isolate, 11592 isolate,
11593 Runtime::SetObjectProperty(isolate, target, key, value, SLOPPY), 11593 Runtime::SetObjectProperty(isolate, target, key, value, SLOPPY),
11594 JSObject); 11594 JSObject);
11595 } 11595 }
11596 } 11596 }
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
11686 return true; 11686 return true;
11687 } 11687 }
11688 11688
11689 // Function context extension. These are variables introduced by eval. 11689 // Function context extension. These are variables introduced by eval.
11690 if (function_context->closure() == *function) { 11690 if (function_context->closure() == *function) {
11691 if (function_context->has_extension() && 11691 if (function_context->has_extension() &&
11692 !function_context->IsNativeContext()) { 11692 !function_context->IsNativeContext()) {
11693 Handle<JSObject> ext(JSObject::cast(function_context->extension())); 11693 Handle<JSObject> ext(JSObject::cast(function_context->extension()));
11694 11694
11695 Maybe<bool> maybe = JSReceiver::HasProperty(ext, variable_name); 11695 Maybe<bool> maybe = JSReceiver::HasProperty(ext, variable_name);
11696 ASSERT(maybe.has_value); 11696 DCHECK(maybe.has_value);
11697 if (maybe.value) { 11697 if (maybe.value) {
11698 // We don't expect this to do anything except replacing 11698 // We don't expect this to do anything except replacing
11699 // property value. 11699 // property value.
11700 Runtime::SetObjectProperty(isolate, ext, variable_name, new_value, 11700 Runtime::SetObjectProperty(isolate, ext, variable_name, new_value,
11701 SLOPPY).Assert(); 11701 SLOPPY).Assert();
11702 return true; 11702 return true;
11703 } 11703 }
11704 } 11704 }
11705 } 11705 }
11706 } 11706 }
11707 11707
11708 return default_result; 11708 return default_result;
11709 } 11709 }
11710 11710
11711 11711
11712 // Create a plain JSObject which materializes the closure content for the 11712 // Create a plain JSObject which materializes the closure content for the
11713 // context. 11713 // context.
11714 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeClosure( 11714 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeClosure(
11715 Isolate* isolate, 11715 Isolate* isolate,
11716 Handle<Context> context) { 11716 Handle<Context> context) {
11717 ASSERT(context->IsFunctionContext()); 11717 DCHECK(context->IsFunctionContext());
11718 11718
11719 Handle<SharedFunctionInfo> shared(context->closure()->shared()); 11719 Handle<SharedFunctionInfo> shared(context->closure()->shared());
11720 Handle<ScopeInfo> scope_info(shared->scope_info()); 11720 Handle<ScopeInfo> scope_info(shared->scope_info());
11721 11721
11722 // Allocate and initialize a JSObject with all the content of this function 11722 // Allocate and initialize a JSObject with all the content of this function
11723 // closure. 11723 // closure.
11724 Handle<JSObject> closure_scope = 11724 Handle<JSObject> closure_scope =
11725 isolate->factory()->NewJSObject(isolate->object_function()); 11725 isolate->factory()->NewJSObject(isolate->object_function());
11726 11726
11727 // Fill all context locals to the context extension. 11727 // Fill all context locals to the context extension.
11728 if (!ScopeInfo::CopyContextLocalsToScopeObject( 11728 if (!ScopeInfo::CopyContextLocalsToScopeObject(
11729 scope_info, context, closure_scope)) { 11729 scope_info, context, closure_scope)) {
11730 return MaybeHandle<JSObject>(); 11730 return MaybeHandle<JSObject>();
11731 } 11731 }
11732 11732
11733 // Finally copy any properties from the function context extension. This will 11733 // Finally copy any properties from the function context extension. This will
11734 // be variables introduced by eval. 11734 // be variables introduced by eval.
11735 if (context->has_extension()) { 11735 if (context->has_extension()) {
11736 Handle<JSObject> ext(JSObject::cast(context->extension())); 11736 Handle<JSObject> ext(JSObject::cast(context->extension()));
11737 Handle<FixedArray> keys; 11737 Handle<FixedArray> keys;
11738 ASSIGN_RETURN_ON_EXCEPTION( 11738 ASSIGN_RETURN_ON_EXCEPTION(
11739 isolate, keys, 11739 isolate, keys,
11740 JSReceiver::GetKeys(ext, JSReceiver::INCLUDE_PROTOS), JSObject); 11740 JSReceiver::GetKeys(ext, JSReceiver::INCLUDE_PROTOS), JSObject);
11741 11741
11742 for (int i = 0; i < keys->length(); i++) { 11742 for (int i = 0; i < keys->length(); i++) {
11743 HandleScope scope(isolate); 11743 HandleScope scope(isolate);
11744 // Names of variables introduced by eval are strings. 11744 // Names of variables introduced by eval are strings.
11745 ASSERT(keys->get(i)->IsString()); 11745 DCHECK(keys->get(i)->IsString());
11746 Handle<String> key(String::cast(keys->get(i))); 11746 Handle<String> key(String::cast(keys->get(i)));
11747 Handle<Object> value; 11747 Handle<Object> value;
11748 ASSIGN_RETURN_ON_EXCEPTION( 11748 ASSIGN_RETURN_ON_EXCEPTION(
11749 isolate, value, Object::GetPropertyOrElement(ext, key), JSObject); 11749 isolate, value, Object::GetPropertyOrElement(ext, key), JSObject);
11750 RETURN_ON_EXCEPTION( 11750 RETURN_ON_EXCEPTION(
11751 isolate, 11751 isolate,
11752 Runtime::DefineObjectProperty(closure_scope, key, value, NONE), 11752 Runtime::DefineObjectProperty(closure_scope, key, value, NONE),
11753 JSObject); 11753 JSObject);
11754 } 11754 }
11755 } 11755 }
11756 11756
11757 return closure_scope; 11757 return closure_scope;
11758 } 11758 }
11759 11759
11760 11760
11761 // This method copies structure of MaterializeClosure method above. 11761 // This method copies structure of MaterializeClosure method above.
11762 static bool SetClosureVariableValue(Isolate* isolate, 11762 static bool SetClosureVariableValue(Isolate* isolate,
11763 Handle<Context> context, 11763 Handle<Context> context,
11764 Handle<String> variable_name, 11764 Handle<String> variable_name,
11765 Handle<Object> new_value) { 11765 Handle<Object> new_value) {
11766 ASSERT(context->IsFunctionContext()); 11766 DCHECK(context->IsFunctionContext());
11767 11767
11768 Handle<SharedFunctionInfo> shared(context->closure()->shared()); 11768 Handle<SharedFunctionInfo> shared(context->closure()->shared());
11769 Handle<ScopeInfo> scope_info(shared->scope_info()); 11769 Handle<ScopeInfo> scope_info(shared->scope_info());
11770 11770
11771 // Context locals to the context extension. 11771 // Context locals to the context extension.
11772 if (SetContextLocalValue( 11772 if (SetContextLocalValue(
11773 isolate, scope_info, context, variable_name, new_value)) { 11773 isolate, scope_info, context, variable_name, new_value)) {
11774 return true; 11774 return true;
11775 } 11775 }
11776 11776
11777 // Properties from the function context extension. This will 11777 // Properties from the function context extension. This will
11778 // be variables introduced by eval. 11778 // be variables introduced by eval.
11779 if (context->has_extension()) { 11779 if (context->has_extension()) {
11780 Handle<JSObject> ext(JSObject::cast(context->extension())); 11780 Handle<JSObject> ext(JSObject::cast(context->extension()));
11781 Maybe<bool> maybe = JSReceiver::HasProperty(ext, variable_name); 11781 Maybe<bool> maybe = JSReceiver::HasProperty(ext, variable_name);
11782 ASSERT(maybe.has_value); 11782 DCHECK(maybe.has_value);
11783 if (maybe.value) { 11783 if (maybe.value) {
11784 // We don't expect this to do anything except replacing property value. 11784 // We don't expect this to do anything except replacing property value.
11785 Runtime::DefineObjectProperty( 11785 Runtime::DefineObjectProperty(
11786 ext, variable_name, new_value, NONE).Assert(); 11786 ext, variable_name, new_value, NONE).Assert();
11787 return true; 11787 return true;
11788 } 11788 }
11789 } 11789 }
11790 11790
11791 return false; 11791 return false;
11792 } 11792 }
11793 11793
11794 11794
11795 // Create a plain JSObject which materializes the scope for the specified 11795 // Create a plain JSObject which materializes the scope for the specified
11796 // catch context. 11796 // catch context.
11797 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeCatchScope( 11797 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeCatchScope(
11798 Isolate* isolate, 11798 Isolate* isolate,
11799 Handle<Context> context) { 11799 Handle<Context> context) {
11800 ASSERT(context->IsCatchContext()); 11800 DCHECK(context->IsCatchContext());
11801 Handle<String> name(String::cast(context->extension())); 11801 Handle<String> name(String::cast(context->extension()));
11802 Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX), 11802 Handle<Object> thrown_object(context->get(Context::THROWN_OBJECT_INDEX),
11803 isolate); 11803 isolate);
11804 Handle<JSObject> catch_scope = 11804 Handle<JSObject> catch_scope =
11805 isolate->factory()->NewJSObject(isolate->object_function()); 11805 isolate->factory()->NewJSObject(isolate->object_function());
11806 RETURN_ON_EXCEPTION( 11806 RETURN_ON_EXCEPTION(
11807 isolate, 11807 isolate,
11808 Runtime::DefineObjectProperty(catch_scope, name, thrown_object, NONE), 11808 Runtime::DefineObjectProperty(catch_scope, name, thrown_object, NONE),
11809 JSObject); 11809 JSObject);
11810 return catch_scope; 11810 return catch_scope;
11811 } 11811 }
11812 11812
11813 11813
11814 static bool SetCatchVariableValue(Isolate* isolate, 11814 static bool SetCatchVariableValue(Isolate* isolate,
11815 Handle<Context> context, 11815 Handle<Context> context,
11816 Handle<String> variable_name, 11816 Handle<String> variable_name,
11817 Handle<Object> new_value) { 11817 Handle<Object> new_value) {
11818 ASSERT(context->IsCatchContext()); 11818 DCHECK(context->IsCatchContext());
11819 Handle<String> name(String::cast(context->extension())); 11819 Handle<String> name(String::cast(context->extension()));
11820 if (!String::Equals(name, variable_name)) { 11820 if (!String::Equals(name, variable_name)) {
11821 return false; 11821 return false;
11822 } 11822 }
11823 context->set(Context::THROWN_OBJECT_INDEX, *new_value); 11823 context->set(Context::THROWN_OBJECT_INDEX, *new_value);
11824 return true; 11824 return true;
11825 } 11825 }
11826 11826
11827 11827
11828 // Create a plain JSObject which materializes the block scope for the specified 11828 // Create a plain JSObject which materializes the block scope for the specified
11829 // block context. 11829 // block context.
11830 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeBlockScope( 11830 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeBlockScope(
11831 Isolate* isolate, 11831 Isolate* isolate,
11832 Handle<Context> context) { 11832 Handle<Context> context) {
11833 ASSERT(context->IsBlockContext()); 11833 DCHECK(context->IsBlockContext());
11834 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension())); 11834 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension()));
11835 11835
11836 // Allocate and initialize a JSObject with all the arguments, stack locals 11836 // Allocate and initialize a JSObject with all the arguments, stack locals
11837 // heap locals and extension properties of the debugged function. 11837 // heap locals and extension properties of the debugged function.
11838 Handle<JSObject> block_scope = 11838 Handle<JSObject> block_scope =
11839 isolate->factory()->NewJSObject(isolate->object_function()); 11839 isolate->factory()->NewJSObject(isolate->object_function());
11840 11840
11841 // Fill all context locals. 11841 // Fill all context locals.
11842 if (!ScopeInfo::CopyContextLocalsToScopeObject( 11842 if (!ScopeInfo::CopyContextLocalsToScopeObject(
11843 scope_info, context, block_scope)) { 11843 scope_info, context, block_scope)) {
11844 return MaybeHandle<JSObject>(); 11844 return MaybeHandle<JSObject>();
11845 } 11845 }
11846 11846
11847 return block_scope; 11847 return block_scope;
11848 } 11848 }
11849 11849
11850 11850
11851 // Create a plain JSObject which materializes the module scope for the specified 11851 // Create a plain JSObject which materializes the module scope for the specified
11852 // module context. 11852 // module context.
11853 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeModuleScope( 11853 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeModuleScope(
11854 Isolate* isolate, 11854 Isolate* isolate,
11855 Handle<Context> context) { 11855 Handle<Context> context) {
11856 ASSERT(context->IsModuleContext()); 11856 DCHECK(context->IsModuleContext());
11857 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension())); 11857 Handle<ScopeInfo> scope_info(ScopeInfo::cast(context->extension()));
11858 11858
11859 // Allocate and initialize a JSObject with all the members of the debugged 11859 // Allocate and initialize a JSObject with all the members of the debugged
11860 // module. 11860 // module.
11861 Handle<JSObject> module_scope = 11861 Handle<JSObject> module_scope =
11862 isolate->factory()->NewJSObject(isolate->object_function()); 11862 isolate->factory()->NewJSObject(isolate->object_function());
11863 11863
11864 // Fill all context locals. 11864 // Fill all context locals.
11865 if (!ScopeInfo::CopyContextLocalsToScopeObject( 11865 if (!ScopeInfo::CopyContextLocalsToScopeObject(
11866 scope_info, context, module_scope)) { 11866 scope_info, context, module_scope)) {
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
11955 Scope* scope = NULL; 11955 Scope* scope = NULL;
11956 11956
11957 // Check whether we are in global, eval or function code. 11957 // Check whether we are in global, eval or function code.
11958 Handle<ScopeInfo> scope_info(shared_info->scope_info()); 11958 Handle<ScopeInfo> scope_info(shared_info->scope_info());
11959 if (scope_info->scope_type() != FUNCTION_SCOPE) { 11959 if (scope_info->scope_type() != FUNCTION_SCOPE) {
11960 // Global or eval code. 11960 // Global or eval code.
11961 CompilationInfoWithZone info(script); 11961 CompilationInfoWithZone info(script);
11962 if (scope_info->scope_type() == GLOBAL_SCOPE) { 11962 if (scope_info->scope_type() == GLOBAL_SCOPE) {
11963 info.MarkAsGlobal(); 11963 info.MarkAsGlobal();
11964 } else { 11964 } else {
11965 ASSERT(scope_info->scope_type() == EVAL_SCOPE); 11965 DCHECK(scope_info->scope_type() == EVAL_SCOPE);
11966 info.MarkAsEval(); 11966 info.MarkAsEval();
11967 info.SetContext(Handle<Context>(function_->context())); 11967 info.SetContext(Handle<Context>(function_->context()));
11968 } 11968 }
11969 if (Parser::Parse(&info) && Scope::Analyze(&info)) { 11969 if (Parser::Parse(&info) && Scope::Analyze(&info)) {
11970 scope = info.function()->scope(); 11970 scope = info.function()->scope();
11971 } 11971 }
11972 RetrieveScopeChain(scope, shared_info); 11972 RetrieveScopeChain(scope, shared_info);
11973 } else { 11973 } else {
11974 // Function code 11974 // Function code
11975 CompilationInfoWithZone info(shared_info); 11975 CompilationInfoWithZone info(shared_info);
(...skipping 13 matching lines...) Expand all
11989 function_(function), 11989 function_(function),
11990 context_(function->context()), 11990 context_(function->context()),
11991 failed_(false) { 11991 failed_(false) {
11992 if (function->IsBuiltin()) { 11992 if (function->IsBuiltin()) {
11993 context_ = Handle<Context>(); 11993 context_ = Handle<Context>();
11994 } 11994 }
11995 } 11995 }
11996 11996
11997 // More scopes? 11997 // More scopes?
11998 bool Done() { 11998 bool Done() {
11999 ASSERT(!failed_); 11999 DCHECK(!failed_);
12000 return context_.is_null(); 12000 return context_.is_null();
12001 } 12001 }
12002 12002
12003 bool Failed() { return failed_; } 12003 bool Failed() { return failed_; }
12004 12004
12005 // Move to the next scope. 12005 // Move to the next scope.
12006 void Next() { 12006 void Next() {
12007 ASSERT(!failed_); 12007 DCHECK(!failed_);
12008 ScopeType scope_type = Type(); 12008 ScopeType scope_type = Type();
12009 if (scope_type == ScopeTypeGlobal) { 12009 if (scope_type == ScopeTypeGlobal) {
12010 // The global scope is always the last in the chain. 12010 // The global scope is always the last in the chain.
12011 ASSERT(context_->IsNativeContext()); 12011 DCHECK(context_->IsNativeContext());
12012 context_ = Handle<Context>(); 12012 context_ = Handle<Context>();
12013 return; 12013 return;
12014 } 12014 }
12015 if (nested_scope_chain_.is_empty()) { 12015 if (nested_scope_chain_.is_empty()) {
12016 context_ = Handle<Context>(context_->previous(), isolate_); 12016 context_ = Handle<Context>(context_->previous(), isolate_);
12017 } else { 12017 } else {
12018 if (nested_scope_chain_.last()->HasContext()) { 12018 if (nested_scope_chain_.last()->HasContext()) {
12019 ASSERT(context_->previous() != NULL); 12019 DCHECK(context_->previous() != NULL);
12020 context_ = Handle<Context>(context_->previous(), isolate_); 12020 context_ = Handle<Context>(context_->previous(), isolate_);
12021 } 12021 }
12022 nested_scope_chain_.RemoveLast(); 12022 nested_scope_chain_.RemoveLast();
12023 } 12023 }
12024 } 12024 }
12025 12025
12026 // Return the type of the current scope. 12026 // Return the type of the current scope.
12027 ScopeType Type() { 12027 ScopeType Type() {
12028 ASSERT(!failed_); 12028 DCHECK(!failed_);
12029 if (!nested_scope_chain_.is_empty()) { 12029 if (!nested_scope_chain_.is_empty()) {
12030 Handle<ScopeInfo> scope_info = nested_scope_chain_.last(); 12030 Handle<ScopeInfo> scope_info = nested_scope_chain_.last();
12031 switch (scope_info->scope_type()) { 12031 switch (scope_info->scope_type()) {
12032 case FUNCTION_SCOPE: 12032 case FUNCTION_SCOPE:
12033 ASSERT(context_->IsFunctionContext() || 12033 DCHECK(context_->IsFunctionContext() ||
12034 !scope_info->HasContext()); 12034 !scope_info->HasContext());
12035 return ScopeTypeLocal; 12035 return ScopeTypeLocal;
12036 case MODULE_SCOPE: 12036 case MODULE_SCOPE:
12037 ASSERT(context_->IsModuleContext()); 12037 DCHECK(context_->IsModuleContext());
12038 return ScopeTypeModule; 12038 return ScopeTypeModule;
12039 case GLOBAL_SCOPE: 12039 case GLOBAL_SCOPE:
12040 ASSERT(context_->IsNativeContext()); 12040 DCHECK(context_->IsNativeContext());
12041 return ScopeTypeGlobal; 12041 return ScopeTypeGlobal;
12042 case WITH_SCOPE: 12042 case WITH_SCOPE:
12043 ASSERT(context_->IsWithContext()); 12043 DCHECK(context_->IsWithContext());
12044 return ScopeTypeWith; 12044 return ScopeTypeWith;
12045 case CATCH_SCOPE: 12045 case CATCH_SCOPE:
12046 ASSERT(context_->IsCatchContext()); 12046 DCHECK(context_->IsCatchContext());
12047 return ScopeTypeCatch; 12047 return ScopeTypeCatch;
12048 case BLOCK_SCOPE: 12048 case BLOCK_SCOPE:
12049 ASSERT(!scope_info->HasContext() || 12049 DCHECK(!scope_info->HasContext() ||
12050 context_->IsBlockContext()); 12050 context_->IsBlockContext());
12051 return ScopeTypeBlock; 12051 return ScopeTypeBlock;
12052 case EVAL_SCOPE: 12052 case EVAL_SCOPE:
12053 UNREACHABLE(); 12053 UNREACHABLE();
12054 } 12054 }
12055 } 12055 }
12056 if (context_->IsNativeContext()) { 12056 if (context_->IsNativeContext()) {
12057 ASSERT(context_->global_object()->IsGlobalObject()); 12057 DCHECK(context_->global_object()->IsGlobalObject());
12058 return ScopeTypeGlobal; 12058 return ScopeTypeGlobal;
12059 } 12059 }
12060 if (context_->IsFunctionContext()) { 12060 if (context_->IsFunctionContext()) {
12061 return ScopeTypeClosure; 12061 return ScopeTypeClosure;
12062 } 12062 }
12063 if (context_->IsCatchContext()) { 12063 if (context_->IsCatchContext()) {
12064 return ScopeTypeCatch; 12064 return ScopeTypeCatch;
12065 } 12065 }
12066 if (context_->IsBlockContext()) { 12066 if (context_->IsBlockContext()) {
12067 return ScopeTypeBlock; 12067 return ScopeTypeBlock;
12068 } 12068 }
12069 if (context_->IsModuleContext()) { 12069 if (context_->IsModuleContext()) {
12070 return ScopeTypeModule; 12070 return ScopeTypeModule;
12071 } 12071 }
12072 ASSERT(context_->IsWithContext()); 12072 DCHECK(context_->IsWithContext());
12073 return ScopeTypeWith; 12073 return ScopeTypeWith;
12074 } 12074 }
12075 12075
12076 // Return the JavaScript object with the content of the current scope. 12076 // Return the JavaScript object with the content of the current scope.
12077 MaybeHandle<JSObject> ScopeObject() { 12077 MaybeHandle<JSObject> ScopeObject() {
12078 ASSERT(!failed_); 12078 DCHECK(!failed_);
12079 switch (Type()) { 12079 switch (Type()) {
12080 case ScopeIterator::ScopeTypeGlobal: 12080 case ScopeIterator::ScopeTypeGlobal:
12081 return Handle<JSObject>(CurrentContext()->global_object()); 12081 return Handle<JSObject>(CurrentContext()->global_object());
12082 case ScopeIterator::ScopeTypeLocal: 12082 case ScopeIterator::ScopeTypeLocal:
12083 // Materialize the content of the local scope into a JSObject. 12083 // Materialize the content of the local scope into a JSObject.
12084 ASSERT(nested_scope_chain_.length() == 1); 12084 DCHECK(nested_scope_chain_.length() == 1);
12085 return MaterializeLocalScope(isolate_, frame_, inlined_jsframe_index_); 12085 return MaterializeLocalScope(isolate_, frame_, inlined_jsframe_index_);
12086 case ScopeIterator::ScopeTypeWith: 12086 case ScopeIterator::ScopeTypeWith:
12087 // Return the with object. 12087 // Return the with object.
12088 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension())); 12088 return Handle<JSObject>(JSObject::cast(CurrentContext()->extension()));
12089 case ScopeIterator::ScopeTypeCatch: 12089 case ScopeIterator::ScopeTypeCatch:
12090 return MaterializeCatchScope(isolate_, CurrentContext()); 12090 return MaterializeCatchScope(isolate_, CurrentContext());
12091 case ScopeIterator::ScopeTypeClosure: 12091 case ScopeIterator::ScopeTypeClosure:
12092 // Materialize the content of the closure scope into a JSObject. 12092 // Materialize the content of the closure scope into a JSObject.
12093 return MaterializeClosure(isolate_, CurrentContext()); 12093 return MaterializeClosure(isolate_, CurrentContext());
12094 case ScopeIterator::ScopeTypeBlock: 12094 case ScopeIterator::ScopeTypeBlock:
12095 return MaterializeBlockScope(isolate_, CurrentContext()); 12095 return MaterializeBlockScope(isolate_, CurrentContext());
12096 case ScopeIterator::ScopeTypeModule: 12096 case ScopeIterator::ScopeTypeModule:
12097 return MaterializeModuleScope(isolate_, CurrentContext()); 12097 return MaterializeModuleScope(isolate_, CurrentContext());
12098 } 12098 }
12099 UNREACHABLE(); 12099 UNREACHABLE();
12100 return Handle<JSObject>(); 12100 return Handle<JSObject>();
12101 } 12101 }
12102 12102
12103 bool SetVariableValue(Handle<String> variable_name, 12103 bool SetVariableValue(Handle<String> variable_name,
12104 Handle<Object> new_value) { 12104 Handle<Object> new_value) {
12105 ASSERT(!failed_); 12105 DCHECK(!failed_);
12106 switch (Type()) { 12106 switch (Type()) {
12107 case ScopeIterator::ScopeTypeGlobal: 12107 case ScopeIterator::ScopeTypeGlobal:
12108 break; 12108 break;
12109 case ScopeIterator::ScopeTypeLocal: 12109 case ScopeIterator::ScopeTypeLocal:
12110 return SetLocalVariableValue(isolate_, frame_, inlined_jsframe_index_, 12110 return SetLocalVariableValue(isolate_, frame_, inlined_jsframe_index_,
12111 variable_name, new_value); 12111 variable_name, new_value);
12112 case ScopeIterator::ScopeTypeWith: 12112 case ScopeIterator::ScopeTypeWith:
12113 break; 12113 break;
12114 case ScopeIterator::ScopeTypeCatch: 12114 case ScopeIterator::ScopeTypeCatch:
12115 return SetCatchVariableValue(isolate_, CurrentContext(), 12115 return SetCatchVariableValue(isolate_, CurrentContext(),
12116 variable_name, new_value); 12116 variable_name, new_value);
12117 case ScopeIterator::ScopeTypeClosure: 12117 case ScopeIterator::ScopeTypeClosure:
12118 return SetClosureVariableValue(isolate_, CurrentContext(), 12118 return SetClosureVariableValue(isolate_, CurrentContext(),
12119 variable_name, new_value); 12119 variable_name, new_value);
12120 case ScopeIterator::ScopeTypeBlock: 12120 case ScopeIterator::ScopeTypeBlock:
12121 // TODO(2399): should we implement it? 12121 // TODO(2399): should we implement it?
12122 break; 12122 break;
12123 case ScopeIterator::ScopeTypeModule: 12123 case ScopeIterator::ScopeTypeModule:
12124 // TODO(2399): should we implement it? 12124 // TODO(2399): should we implement it?
12125 break; 12125 break;
12126 } 12126 }
12127 return false; 12127 return false;
12128 } 12128 }
12129 12129
12130 Handle<ScopeInfo> CurrentScopeInfo() { 12130 Handle<ScopeInfo> CurrentScopeInfo() {
12131 ASSERT(!failed_); 12131 DCHECK(!failed_);
12132 if (!nested_scope_chain_.is_empty()) { 12132 if (!nested_scope_chain_.is_empty()) {
12133 return nested_scope_chain_.last(); 12133 return nested_scope_chain_.last();
12134 } else if (context_->IsBlockContext()) { 12134 } else if (context_->IsBlockContext()) {
12135 return Handle<ScopeInfo>(ScopeInfo::cast(context_->extension())); 12135 return Handle<ScopeInfo>(ScopeInfo::cast(context_->extension()));
12136 } else if (context_->IsFunctionContext()) { 12136 } else if (context_->IsFunctionContext()) {
12137 return Handle<ScopeInfo>(context_->closure()->shared()->scope_info()); 12137 return Handle<ScopeInfo>(context_->closure()->shared()->scope_info());
12138 } 12138 }
12139 return Handle<ScopeInfo>::null(); 12139 return Handle<ScopeInfo>::null();
12140 } 12140 }
12141 12141
12142 // Return the context for this scope. For the local context there might not 12142 // Return the context for this scope. For the local context there might not
12143 // be an actual context. 12143 // be an actual context.
12144 Handle<Context> CurrentContext() { 12144 Handle<Context> CurrentContext() {
12145 ASSERT(!failed_); 12145 DCHECK(!failed_);
12146 if (Type() == ScopeTypeGlobal || 12146 if (Type() == ScopeTypeGlobal ||
12147 nested_scope_chain_.is_empty()) { 12147 nested_scope_chain_.is_empty()) {
12148 return context_; 12148 return context_;
12149 } else if (nested_scope_chain_.last()->HasContext()) { 12149 } else if (nested_scope_chain_.last()->HasContext()) {
12150 return context_; 12150 return context_;
12151 } else { 12151 } else {
12152 return Handle<Context>(); 12152 return Handle<Context>();
12153 } 12153 }
12154 } 12154 }
12155 12155
12156 #ifdef DEBUG 12156 #ifdef DEBUG
12157 // Debug print of the content of the current scope. 12157 // Debug print of the content of the current scope.
12158 void DebugPrint() { 12158 void DebugPrint() {
12159 OFStream os(stdout); 12159 OFStream os(stdout);
12160 ASSERT(!failed_); 12160 DCHECK(!failed_);
12161 switch (Type()) { 12161 switch (Type()) {
12162 case ScopeIterator::ScopeTypeGlobal: 12162 case ScopeIterator::ScopeTypeGlobal:
12163 os << "Global:\n"; 12163 os << "Global:\n";
12164 CurrentContext()->Print(os); 12164 CurrentContext()->Print(os);
12165 break; 12165 break;
12166 12166
12167 case ScopeIterator::ScopeTypeLocal: { 12167 case ScopeIterator::ScopeTypeLocal: {
12168 os << "Local:\n"; 12168 os << "Local:\n";
12169 function_->shared()->scope_info()->Print(); 12169 function_->shared()->scope_info()->Print();
12170 if (!CurrentContext().is_null()) { 12170 if (!CurrentContext().is_null()) {
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
12222 if (scope != NULL) { 12222 if (scope != NULL) {
12223 int source_position = shared_info->code()->SourcePosition(frame_->pc()); 12223 int source_position = shared_info->code()->SourcePosition(frame_->pc());
12224 scope->GetNestedScopeChain(&nested_scope_chain_, source_position); 12224 scope->GetNestedScopeChain(&nested_scope_chain_, source_position);
12225 } else { 12225 } else {
12226 // A failed reparse indicates that the preparser has diverged from the 12226 // A failed reparse indicates that the preparser has diverged from the
12227 // parser or that the preparse data given to the initial parse has been 12227 // parser or that the preparse data given to the initial parse has been
12228 // faulty. We fail in debug mode but in release mode we only provide the 12228 // faulty. We fail in debug mode but in release mode we only provide the
12229 // information we get from the context chain but nothing about 12229 // information we get from the context chain but nothing about
12230 // completely stack allocated scopes or stack allocated locals. 12230 // completely stack allocated scopes or stack allocated locals.
12231 // Or it could be due to stack overflow. 12231 // Or it could be due to stack overflow.
12232 ASSERT(isolate_->has_pending_exception()); 12232 DCHECK(isolate_->has_pending_exception());
12233 failed_ = true; 12233 failed_ = true;
12234 } 12234 }
12235 } 12235 }
12236 12236
12237 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator); 12237 DISALLOW_IMPLICIT_CONSTRUCTORS(ScopeIterator);
12238 }; 12238 };
12239 12239
12240 12240
12241 RUNTIME_FUNCTION(Runtime_GetScopeCount) { 12241 RUNTIME_FUNCTION(Runtime_GetScopeCount) {
12242 HandleScope scope(isolate); 12242 HandleScope scope(isolate);
12243 ASSERT(args.length() == 2); 12243 DCHECK(args.length() == 2);
12244 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 12244 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
12245 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 12245 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
12246 12246
12247 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); 12247 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
12248 12248
12249 // Get the frame where the debugging is performed. 12249 // Get the frame where the debugging is performed.
12250 StackFrame::Id id = UnwrapFrameId(wrapped_id); 12250 StackFrame::Id id = UnwrapFrameId(wrapped_id);
12251 JavaScriptFrameIterator it(isolate, id); 12251 JavaScriptFrameIterator it(isolate, id);
12252 JavaScriptFrame* frame = it.frame(); 12252 JavaScriptFrame* frame = it.frame();
12253 12253
12254 // Count the visible scopes. 12254 // Count the visible scopes.
12255 int n = 0; 12255 int n = 0;
12256 for (ScopeIterator it(isolate, frame, 0); 12256 for (ScopeIterator it(isolate, frame, 0);
12257 !it.Done(); 12257 !it.Done();
12258 it.Next()) { 12258 it.Next()) {
12259 n++; 12259 n++;
12260 } 12260 }
12261 12261
12262 return Smi::FromInt(n); 12262 return Smi::FromInt(n);
12263 } 12263 }
12264 12264
12265 12265
12266 // Returns the list of step-in positions (text offset) in a function of the 12266 // Returns the list of step-in positions (text offset) in a function of the
12267 // stack frame in a range from the current debug break position to the end 12267 // stack frame in a range from the current debug break position to the end
12268 // of the corresponding statement. 12268 // of the corresponding statement.
12269 RUNTIME_FUNCTION(Runtime_GetStepInPositions) { 12269 RUNTIME_FUNCTION(Runtime_GetStepInPositions) {
12270 HandleScope scope(isolate); 12270 HandleScope scope(isolate);
12271 ASSERT(args.length() == 2); 12271 DCHECK(args.length() == 2);
12272 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 12272 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
12273 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 12273 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
12274 12274
12275 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); 12275 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
12276 12276
12277 // Get the frame where the debugging is performed. 12277 // Get the frame where the debugging is performed.
12278 StackFrame::Id id = UnwrapFrameId(wrapped_id); 12278 StackFrame::Id id = UnwrapFrameId(wrapped_id);
12279 JavaScriptFrameIterator frame_it(isolate, id); 12279 JavaScriptFrameIterator frame_it(isolate, id);
12280 RUNTIME_ASSERT(!frame_it.done()); 12280 RUNTIME_ASSERT(!frame_it.done());
12281 12281
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
12368 // args[0]: number: break id 12368 // args[0]: number: break id
12369 // args[1]: number: frame index 12369 // args[1]: number: frame index
12370 // args[2]: number: inlined frame index 12370 // args[2]: number: inlined frame index
12371 // args[3]: number: scope index 12371 // args[3]: number: scope index
12372 // 12372 //
12373 // The array returned contains the following information: 12373 // The array returned contains the following information:
12374 // 0: Scope type 12374 // 0: Scope type
12375 // 1: Scope object 12375 // 1: Scope object
12376 RUNTIME_FUNCTION(Runtime_GetScopeDetails) { 12376 RUNTIME_FUNCTION(Runtime_GetScopeDetails) {
12377 HandleScope scope(isolate); 12377 HandleScope scope(isolate);
12378 ASSERT(args.length() == 4); 12378 DCHECK(args.length() == 4);
12379 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 12379 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
12380 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 12380 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
12381 12381
12382 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); 12382 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
12383 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); 12383 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]);
12384 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); 12384 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]);
12385 12385
12386 // Get the frame where the debugging is performed. 12386 // Get the frame where the debugging is performed.
12387 StackFrame::Id id = UnwrapFrameId(wrapped_id); 12387 StackFrame::Id id = UnwrapFrameId(wrapped_id);
12388 JavaScriptFrameIterator frame_it(isolate, id); 12388 JavaScriptFrameIterator frame_it(isolate, id);
(...skipping 19 matching lines...) Expand all
12408 // args[0]: number: break id 12408 // args[0]: number: break id
12409 // args[1]: number: frame index 12409 // args[1]: number: frame index
12410 // args[2]: number: inlined frame index 12410 // args[2]: number: inlined frame index
12411 // args[3]: boolean: ignore nested scopes 12411 // args[3]: boolean: ignore nested scopes
12412 // 12412 //
12413 // The array returned contains arrays with the following information: 12413 // The array returned contains arrays with the following information:
12414 // 0: Scope type 12414 // 0: Scope type
12415 // 1: Scope object 12415 // 1: Scope object
12416 RUNTIME_FUNCTION(Runtime_GetAllScopesDetails) { 12416 RUNTIME_FUNCTION(Runtime_GetAllScopesDetails) {
12417 HandleScope scope(isolate); 12417 HandleScope scope(isolate);
12418 ASSERT(args.length() == 3 || args.length() == 4); 12418 DCHECK(args.length() == 3 || args.length() == 4);
12419 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 12419 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
12420 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 12420 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
12421 12421
12422 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); 12422 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
12423 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); 12423 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]);
12424 12424
12425 bool ignore_nested_scopes = false; 12425 bool ignore_nested_scopes = false;
12426 if (args.length() == 4) { 12426 if (args.length() == 4) {
12427 CONVERT_BOOLEAN_ARG_CHECKED(flag, 3); 12427 CONVERT_BOOLEAN_ARG_CHECKED(flag, 3);
12428 ignore_nested_scopes = flag; 12428 ignore_nested_scopes = flag;
(...skipping 16 matching lines...) Expand all
12445 Handle<FixedArray> array = isolate->factory()->NewFixedArray(result.length()); 12445 Handle<FixedArray> array = isolate->factory()->NewFixedArray(result.length());
12446 for (int i = 0; i < result.length(); ++i) { 12446 for (int i = 0; i < result.length(); ++i) {
12447 array->set(i, *result[i]); 12447 array->set(i, *result[i]);
12448 } 12448 }
12449 return *isolate->factory()->NewJSArrayWithElements(array); 12449 return *isolate->factory()->NewJSArrayWithElements(array);
12450 } 12450 }
12451 12451
12452 12452
12453 RUNTIME_FUNCTION(Runtime_GetFunctionScopeCount) { 12453 RUNTIME_FUNCTION(Runtime_GetFunctionScopeCount) {
12454 HandleScope scope(isolate); 12454 HandleScope scope(isolate);
12455 ASSERT(args.length() == 1); 12455 DCHECK(args.length() == 1);
12456 12456
12457 // Check arguments. 12457 // Check arguments.
12458 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); 12458 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0);
12459 12459
12460 // Count the visible scopes. 12460 // Count the visible scopes.
12461 int n = 0; 12461 int n = 0;
12462 for (ScopeIterator it(isolate, fun); !it.Done(); it.Next()) { 12462 for (ScopeIterator it(isolate, fun); !it.Done(); it.Next()) {
12463 n++; 12463 n++;
12464 } 12464 }
12465 12465
12466 return Smi::FromInt(n); 12466 return Smi::FromInt(n);
12467 } 12467 }
12468 12468
12469 12469
12470 RUNTIME_FUNCTION(Runtime_GetFunctionScopeDetails) { 12470 RUNTIME_FUNCTION(Runtime_GetFunctionScopeDetails) {
12471 HandleScope scope(isolate); 12471 HandleScope scope(isolate);
12472 ASSERT(args.length() == 2); 12472 DCHECK(args.length() == 2);
12473 12473
12474 // Check arguments. 12474 // Check arguments.
12475 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); 12475 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0);
12476 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); 12476 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]);
12477 12477
12478 // Find the requested scope. 12478 // Find the requested scope.
12479 int n = 0; 12479 int n = 0;
12480 ScopeIterator it(isolate, fun); 12480 ScopeIterator it(isolate, fun);
12481 for (; !it.Done() && n < index; it.Next()) { 12481 for (; !it.Done() && n < index; it.Next()) {
12482 n++; 12482 n++;
(...skipping 26 matching lines...) Expand all
12509 // args[0]: number or JsFunction: break id or function 12509 // args[0]: number or JsFunction: break id or function
12510 // args[1]: number: frame index (when arg[0] is break id) 12510 // args[1]: number: frame index (when arg[0] is break id)
12511 // args[2]: number: inlined frame index (when arg[0] is break id) 12511 // args[2]: number: inlined frame index (when arg[0] is break id)
12512 // args[3]: number: scope index 12512 // args[3]: number: scope index
12513 // args[4]: string: variable name 12513 // args[4]: string: variable name
12514 // args[5]: object: new value 12514 // args[5]: object: new value
12515 // 12515 //
12516 // Return true if success and false otherwise 12516 // Return true if success and false otherwise
12517 RUNTIME_FUNCTION(Runtime_SetScopeVariableValue) { 12517 RUNTIME_FUNCTION(Runtime_SetScopeVariableValue) {
12518 HandleScope scope(isolate); 12518 HandleScope scope(isolate);
12519 ASSERT(args.length() == 6); 12519 DCHECK(args.length() == 6);
12520 12520
12521 // Check arguments. 12521 // Check arguments.
12522 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]); 12522 CONVERT_NUMBER_CHECKED(int, index, Int32, args[3]);
12523 CONVERT_ARG_HANDLE_CHECKED(String, variable_name, 4); 12523 CONVERT_ARG_HANDLE_CHECKED(String, variable_name, 4);
12524 CONVERT_ARG_HANDLE_CHECKED(Object, new_value, 5); 12524 CONVERT_ARG_HANDLE_CHECKED(Object, new_value, 5);
12525 12525
12526 bool res; 12526 bool res;
12527 if (args[0]->IsNumber()) { 12527 if (args[0]->IsNumber()) {
12528 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 12528 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
12529 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 12529 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
(...skipping 13 matching lines...) Expand all
12543 ScopeIterator it(isolate, fun); 12543 ScopeIterator it(isolate, fun);
12544 res = SetScopeVariableValue(&it, index, variable_name, new_value); 12544 res = SetScopeVariableValue(&it, index, variable_name, new_value);
12545 } 12545 }
12546 12546
12547 return isolate->heap()->ToBoolean(res); 12547 return isolate->heap()->ToBoolean(res);
12548 } 12548 }
12549 12549
12550 12550
12551 RUNTIME_FUNCTION(Runtime_DebugPrintScopes) { 12551 RUNTIME_FUNCTION(Runtime_DebugPrintScopes) {
12552 HandleScope scope(isolate); 12552 HandleScope scope(isolate);
12553 ASSERT(args.length() == 0); 12553 DCHECK(args.length() == 0);
12554 12554
12555 #ifdef DEBUG 12555 #ifdef DEBUG
12556 // Print the scopes for the top frame. 12556 // Print the scopes for the top frame.
12557 StackFrameLocator locator(isolate); 12557 StackFrameLocator locator(isolate);
12558 JavaScriptFrame* frame = locator.FindJavaScriptFrame(0); 12558 JavaScriptFrame* frame = locator.FindJavaScriptFrame(0);
12559 for (ScopeIterator it(isolate, frame, 0); 12559 for (ScopeIterator it(isolate, frame, 0);
12560 !it.Done(); 12560 !it.Done();
12561 it.Next()) { 12561 it.Next()) {
12562 it.DebugPrint(); 12562 it.DebugPrint();
12563 } 12563 }
12564 #endif 12564 #endif
12565 return isolate->heap()->undefined_value(); 12565 return isolate->heap()->undefined_value();
12566 } 12566 }
12567 12567
12568 12568
12569 RUNTIME_FUNCTION(Runtime_GetThreadCount) { 12569 RUNTIME_FUNCTION(Runtime_GetThreadCount) {
12570 HandleScope scope(isolate); 12570 HandleScope scope(isolate);
12571 ASSERT(args.length() == 1); 12571 DCHECK(args.length() == 1);
12572 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 12572 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
12573 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 12573 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
12574 12574
12575 // Count all archived V8 threads. 12575 // Count all archived V8 threads.
12576 int n = 0; 12576 int n = 0;
12577 for (ThreadState* thread = 12577 for (ThreadState* thread =
12578 isolate->thread_manager()->FirstThreadStateInUse(); 12578 isolate->thread_manager()->FirstThreadStateInUse();
12579 thread != NULL; 12579 thread != NULL;
12580 thread = thread->Next()) { 12580 thread = thread->Next()) {
12581 n++; 12581 n++;
(...skipping 10 matching lines...) Expand all
12592 12592
12593 // Return an array with thread details 12593 // Return an array with thread details
12594 // args[0]: number: break id 12594 // args[0]: number: break id
12595 // args[1]: number: thread index 12595 // args[1]: number: thread index
12596 // 12596 //
12597 // The array returned contains the following information: 12597 // The array returned contains the following information:
12598 // 0: Is current thread? 12598 // 0: Is current thread?
12599 // 1: Thread id 12599 // 1: Thread id
12600 RUNTIME_FUNCTION(Runtime_GetThreadDetails) { 12600 RUNTIME_FUNCTION(Runtime_GetThreadDetails) {
12601 HandleScope scope(isolate); 12601 HandleScope scope(isolate);
12602 ASSERT(args.length() == 2); 12602 DCHECK(args.length() == 2);
12603 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 12603 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
12604 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 12604 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
12605 12605
12606 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); 12606 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]);
12607 12607
12608 // Allocate array for result. 12608 // Allocate array for result.
12609 Handle<FixedArray> details = 12609 Handle<FixedArray> details =
12610 isolate->factory()->NewFixedArray(kThreadDetailsSize); 12610 isolate->factory()->NewFixedArray(kThreadDetailsSize);
12611 12611
12612 // Thread index 0 is current thread. 12612 // Thread index 0 is current thread.
(...skipping 25 matching lines...) Expand all
12638 12638
12639 // Convert to JS array and return. 12639 // Convert to JS array and return.
12640 return *isolate->factory()->NewJSArrayWithElements(details); 12640 return *isolate->factory()->NewJSArrayWithElements(details);
12641 } 12641 }
12642 12642
12643 12643
12644 // Sets the disable break state 12644 // Sets the disable break state
12645 // args[0]: disable break state 12645 // args[0]: disable break state
12646 RUNTIME_FUNCTION(Runtime_SetDisableBreak) { 12646 RUNTIME_FUNCTION(Runtime_SetDisableBreak) {
12647 HandleScope scope(isolate); 12647 HandleScope scope(isolate);
12648 ASSERT(args.length() == 1); 12648 DCHECK(args.length() == 1);
12649 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 0); 12649 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 0);
12650 isolate->debug()->set_disable_break(disable_break); 12650 isolate->debug()->set_disable_break(disable_break);
12651 return isolate->heap()->undefined_value(); 12651 return isolate->heap()->undefined_value();
12652 } 12652 }
12653 12653
12654 12654
12655 static bool IsPositionAlignmentCodeCorrect(int alignment) { 12655 static bool IsPositionAlignmentCodeCorrect(int alignment) {
12656 return alignment == STATEMENT_ALIGNED || alignment == BREAK_POSITION_ALIGNED; 12656 return alignment == STATEMENT_ALIGNED || alignment == BREAK_POSITION_ALIGNED;
12657 } 12657 }
12658 12658
12659 12659
12660 RUNTIME_FUNCTION(Runtime_GetBreakLocations) { 12660 RUNTIME_FUNCTION(Runtime_GetBreakLocations) {
12661 HandleScope scope(isolate); 12661 HandleScope scope(isolate);
12662 ASSERT(args.length() == 2); 12662 DCHECK(args.length() == 2);
12663 12663
12664 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0); 12664 CONVERT_ARG_HANDLE_CHECKED(JSFunction, fun, 0);
12665 CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[1]); 12665 CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[1]);
12666 12666
12667 if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { 12667 if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) {
12668 return isolate->ThrowIllegalOperation(); 12668 return isolate->ThrowIllegalOperation();
12669 } 12669 }
12670 BreakPositionAlignment alignment = 12670 BreakPositionAlignment alignment =
12671 static_cast<BreakPositionAlignment>(statement_aligned_code); 12671 static_cast<BreakPositionAlignment>(statement_aligned_code);
12672 12672
12673 Handle<SharedFunctionInfo> shared(fun->shared()); 12673 Handle<SharedFunctionInfo> shared(fun->shared());
12674 // Find the number of break points 12674 // Find the number of break points
12675 Handle<Object> break_locations = 12675 Handle<Object> break_locations =
12676 Debug::GetSourceBreakLocations(shared, alignment); 12676 Debug::GetSourceBreakLocations(shared, alignment);
12677 if (break_locations->IsUndefined()) return isolate->heap()->undefined_value(); 12677 if (break_locations->IsUndefined()) return isolate->heap()->undefined_value();
12678 // Return array as JS array 12678 // Return array as JS array
12679 return *isolate->factory()->NewJSArrayWithElements( 12679 return *isolate->factory()->NewJSArrayWithElements(
12680 Handle<FixedArray>::cast(break_locations)); 12680 Handle<FixedArray>::cast(break_locations));
12681 } 12681 }
12682 12682
12683 12683
12684 // Set a break point in a function. 12684 // Set a break point in a function.
12685 // args[0]: function 12685 // args[0]: function
12686 // args[1]: number: break source position (within the function source) 12686 // args[1]: number: break source position (within the function source)
12687 // args[2]: number: break point object 12687 // args[2]: number: break point object
12688 RUNTIME_FUNCTION(Runtime_SetFunctionBreakPoint) { 12688 RUNTIME_FUNCTION(Runtime_SetFunctionBreakPoint) {
12689 HandleScope scope(isolate); 12689 HandleScope scope(isolate);
12690 ASSERT(args.length() == 3); 12690 DCHECK(args.length() == 3);
12691 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 12691 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
12692 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); 12692 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
12693 RUNTIME_ASSERT(source_position >= function->shared()->start_position() && 12693 RUNTIME_ASSERT(source_position >= function->shared()->start_position() &&
12694 source_position <= function->shared()->end_position()); 12694 source_position <= function->shared()->end_position());
12695 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 2); 12695 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 2);
12696 12696
12697 // Set break point. 12697 // Set break point.
12698 RUNTIME_ASSERT(isolate->debug()->SetBreakPoint( 12698 RUNTIME_ASSERT(isolate->debug()->SetBreakPoint(
12699 function, break_point_object_arg, &source_position)); 12699 function, break_point_object_arg, &source_position));
12700 12700
12701 return Smi::FromInt(source_position); 12701 return Smi::FromInt(source_position);
12702 } 12702 }
12703 12703
12704 12704
12705 // Changes the state of a break point in a script and returns source position 12705 // Changes the state of a break point in a script and returns source position
12706 // where break point was set. NOTE: Regarding performance see the NOTE for 12706 // where break point was set. NOTE: Regarding performance see the NOTE for
12707 // GetScriptFromScriptData. 12707 // GetScriptFromScriptData.
12708 // args[0]: script to set break point in 12708 // args[0]: script to set break point in
12709 // args[1]: number: break source position (within the script source) 12709 // args[1]: number: break source position (within the script source)
12710 // args[2]: number, breakpoint position alignment 12710 // args[2]: number, breakpoint position alignment
12711 // args[3]: number: break point object 12711 // args[3]: number: break point object
12712 RUNTIME_FUNCTION(Runtime_SetScriptBreakPoint) { 12712 RUNTIME_FUNCTION(Runtime_SetScriptBreakPoint) {
12713 HandleScope scope(isolate); 12713 HandleScope scope(isolate);
12714 ASSERT(args.length() == 4); 12714 DCHECK(args.length() == 4);
12715 CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0); 12715 CONVERT_ARG_HANDLE_CHECKED(JSValue, wrapper, 0);
12716 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); 12716 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
12717 RUNTIME_ASSERT(source_position >= 0); 12717 RUNTIME_ASSERT(source_position >= 0);
12718 CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[2]); 12718 CONVERT_NUMBER_CHECKED(int32_t, statement_aligned_code, Int32, args[2]);
12719 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 3); 12719 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 3);
12720 12720
12721 if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) { 12721 if (!IsPositionAlignmentCodeCorrect(statement_aligned_code)) {
12722 return isolate->ThrowIllegalOperation(); 12722 return isolate->ThrowIllegalOperation();
12723 } 12723 }
12724 BreakPositionAlignment alignment = 12724 BreakPositionAlignment alignment =
(...skipping 11 matching lines...) Expand all
12736 } 12736 }
12737 12737
12738 return Smi::FromInt(source_position); 12738 return Smi::FromInt(source_position);
12739 } 12739 }
12740 12740
12741 12741
12742 // Clear a break point 12742 // Clear a break point
12743 // args[0]: number: break point object 12743 // args[0]: number: break point object
12744 RUNTIME_FUNCTION(Runtime_ClearBreakPoint) { 12744 RUNTIME_FUNCTION(Runtime_ClearBreakPoint) {
12745 HandleScope scope(isolate); 12745 HandleScope scope(isolate);
12746 ASSERT(args.length() == 1); 12746 DCHECK(args.length() == 1);
12747 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 0); 12747 CONVERT_ARG_HANDLE_CHECKED(Object, break_point_object_arg, 0);
12748 12748
12749 // Clear break point. 12749 // Clear break point.
12750 isolate->debug()->ClearBreakPoint(break_point_object_arg); 12750 isolate->debug()->ClearBreakPoint(break_point_object_arg);
12751 12751
12752 return isolate->heap()->undefined_value(); 12752 return isolate->heap()->undefined_value();
12753 } 12753 }
12754 12754
12755 12755
12756 // Change the state of break on exceptions. 12756 // Change the state of break on exceptions.
12757 // args[0]: Enum value indicating whether to affect caught/uncaught exceptions. 12757 // args[0]: Enum value indicating whether to affect caught/uncaught exceptions.
12758 // args[1]: Boolean indicating on/off. 12758 // args[1]: Boolean indicating on/off.
12759 RUNTIME_FUNCTION(Runtime_ChangeBreakOnException) { 12759 RUNTIME_FUNCTION(Runtime_ChangeBreakOnException) {
12760 HandleScope scope(isolate); 12760 HandleScope scope(isolate);
12761 ASSERT(args.length() == 2); 12761 DCHECK(args.length() == 2);
12762 CONVERT_NUMBER_CHECKED(uint32_t, type_arg, Uint32, args[0]); 12762 CONVERT_NUMBER_CHECKED(uint32_t, type_arg, Uint32, args[0]);
12763 CONVERT_BOOLEAN_ARG_CHECKED(enable, 1); 12763 CONVERT_BOOLEAN_ARG_CHECKED(enable, 1);
12764 12764
12765 // If the number doesn't match an enum value, the ChangeBreakOnException 12765 // If the number doesn't match an enum value, the ChangeBreakOnException
12766 // function will default to affecting caught exceptions. 12766 // function will default to affecting caught exceptions.
12767 ExceptionBreakType type = static_cast<ExceptionBreakType>(type_arg); 12767 ExceptionBreakType type = static_cast<ExceptionBreakType>(type_arg);
12768 // Update break point state. 12768 // Update break point state.
12769 isolate->debug()->ChangeBreakOnException(type, enable); 12769 isolate->debug()->ChangeBreakOnException(type, enable);
12770 return isolate->heap()->undefined_value(); 12770 return isolate->heap()->undefined_value();
12771 } 12771 }
12772 12772
12773 12773
12774 // Returns the state of break on exceptions 12774 // Returns the state of break on exceptions
12775 // args[0]: boolean indicating uncaught exceptions 12775 // args[0]: boolean indicating uncaught exceptions
12776 RUNTIME_FUNCTION(Runtime_IsBreakOnException) { 12776 RUNTIME_FUNCTION(Runtime_IsBreakOnException) {
12777 HandleScope scope(isolate); 12777 HandleScope scope(isolate);
12778 ASSERT(args.length() == 1); 12778 DCHECK(args.length() == 1);
12779 CONVERT_NUMBER_CHECKED(uint32_t, type_arg, Uint32, args[0]); 12779 CONVERT_NUMBER_CHECKED(uint32_t, type_arg, Uint32, args[0]);
12780 12780
12781 ExceptionBreakType type = static_cast<ExceptionBreakType>(type_arg); 12781 ExceptionBreakType type = static_cast<ExceptionBreakType>(type_arg);
12782 bool result = isolate->debug()->IsBreakOnException(type); 12782 bool result = isolate->debug()->IsBreakOnException(type);
12783 return Smi::FromInt(result); 12783 return Smi::FromInt(result);
12784 } 12784 }
12785 12785
12786 12786
12787 // Prepare for stepping 12787 // Prepare for stepping
12788 // args[0]: break id for checking execution state 12788 // args[0]: break id for checking execution state
12789 // args[1]: step action from the enumeration StepAction 12789 // args[1]: step action from the enumeration StepAction
12790 // args[2]: number of times to perform the step, for step out it is the number 12790 // args[2]: number of times to perform the step, for step out it is the number
12791 // of frames to step down. 12791 // of frames to step down.
12792 RUNTIME_FUNCTION(Runtime_PrepareStep) { 12792 RUNTIME_FUNCTION(Runtime_PrepareStep) {
12793 HandleScope scope(isolate); 12793 HandleScope scope(isolate);
12794 ASSERT(args.length() == 4); 12794 DCHECK(args.length() == 4);
12795 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 12795 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
12796 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 12796 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
12797 12797
12798 if (!args[1]->IsNumber() || !args[2]->IsNumber()) { 12798 if (!args[1]->IsNumber() || !args[2]->IsNumber()) {
12799 return isolate->Throw(isolate->heap()->illegal_argument_string()); 12799 return isolate->Throw(isolate->heap()->illegal_argument_string());
12800 } 12800 }
12801 12801
12802 CONVERT_NUMBER_CHECKED(int, wrapped_frame_id, Int32, args[3]); 12802 CONVERT_NUMBER_CHECKED(int, wrapped_frame_id, Int32, args[3]);
12803 12803
12804 StackFrame::Id frame_id; 12804 StackFrame::Id frame_id;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
12836 isolate->debug()->PrepareStep(static_cast<StepAction>(step_action), 12836 isolate->debug()->PrepareStep(static_cast<StepAction>(step_action),
12837 step_count, 12837 step_count,
12838 frame_id); 12838 frame_id);
12839 return isolate->heap()->undefined_value(); 12839 return isolate->heap()->undefined_value();
12840 } 12840 }
12841 12841
12842 12842
12843 // Clear all stepping set by PrepareStep. 12843 // Clear all stepping set by PrepareStep.
12844 RUNTIME_FUNCTION(Runtime_ClearStepping) { 12844 RUNTIME_FUNCTION(Runtime_ClearStepping) {
12845 HandleScope scope(isolate); 12845 HandleScope scope(isolate);
12846 ASSERT(args.length() == 0); 12846 DCHECK(args.length() == 0);
12847 isolate->debug()->ClearStepping(); 12847 isolate->debug()->ClearStepping();
12848 return isolate->heap()->undefined_value(); 12848 return isolate->heap()->undefined_value();
12849 } 12849 }
12850 12850
12851 12851
12852 // Helper function to find or create the arguments object for 12852 // Helper function to find or create the arguments object for
12853 // Runtime_DebugEvaluate. 12853 // Runtime_DebugEvaluate.
12854 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeArgumentsObject( 12854 MUST_USE_RESULT static MaybeHandle<JSObject> MaterializeArgumentsObject(
12855 Isolate* isolate, 12855 Isolate* isolate,
12856 Handle<JSObject> target, 12856 Handle<JSObject> target,
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
12920 // Evaluate a piece of JavaScript in the context of a stack frame for 12920 // Evaluate a piece of JavaScript in the context of a stack frame for
12921 // debugging. Things that need special attention are: 12921 // debugging. Things that need special attention are:
12922 // - Parameters and stack-allocated locals need to be materialized. Altered 12922 // - Parameters and stack-allocated locals need to be materialized. Altered
12923 // values need to be written back to the stack afterwards. 12923 // values need to be written back to the stack afterwards.
12924 // - The arguments object needs to materialized. 12924 // - The arguments object needs to materialized.
12925 RUNTIME_FUNCTION(Runtime_DebugEvaluate) { 12925 RUNTIME_FUNCTION(Runtime_DebugEvaluate) {
12926 HandleScope scope(isolate); 12926 HandleScope scope(isolate);
12927 12927
12928 // Check the execution state and decode arguments frame and source to be 12928 // Check the execution state and decode arguments frame and source to be
12929 // evaluated. 12929 // evaluated.
12930 ASSERT(args.length() == 6); 12930 DCHECK(args.length() == 6);
12931 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 12931 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
12932 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 12932 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
12933 12933
12934 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1); 12934 CONVERT_SMI_ARG_CHECKED(wrapped_id, 1);
12935 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]); 12935 CONVERT_NUMBER_CHECKED(int, inlined_jsframe_index, Int32, args[2]);
12936 CONVERT_ARG_HANDLE_CHECKED(String, source, 3); 12936 CONVERT_ARG_HANDLE_CHECKED(String, source, 3);
12937 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 4); 12937 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 4);
12938 CONVERT_ARG_HANDLE_CHECKED(Object, context_extension, 5); 12938 CONVERT_ARG_HANDLE_CHECKED(Object, context_extension, 5);
12939 12939
12940 // Handle the processing of break. 12940 // Handle the processing of break.
12941 DisableBreak disable_break_scope(isolate->debug(), disable_break); 12941 DisableBreak disable_break_scope(isolate->debug(), disable_break);
12942 12942
12943 // Get the frame where the debugging is performed. 12943 // Get the frame where the debugging is performed.
12944 StackFrame::Id id = UnwrapFrameId(wrapped_id); 12944 StackFrame::Id id = UnwrapFrameId(wrapped_id);
12945 JavaScriptFrameIterator it(isolate, id); 12945 JavaScriptFrameIterator it(isolate, id);
12946 JavaScriptFrame* frame = it.frame(); 12946 JavaScriptFrame* frame = it.frame();
12947 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate); 12947 FrameInspector frame_inspector(frame, inlined_jsframe_index, isolate);
12948 Handle<JSFunction> function(JSFunction::cast(frame_inspector.GetFunction())); 12948 Handle<JSFunction> function(JSFunction::cast(frame_inspector.GetFunction()));
12949 12949
12950 // Traverse the saved contexts chain to find the active context for the 12950 // Traverse the saved contexts chain to find the active context for the
12951 // selected frame. 12951 // selected frame.
12952 SaveContext* save = FindSavedContextForFrame(isolate, frame); 12952 SaveContext* save = FindSavedContextForFrame(isolate, frame);
12953 12953
12954 SaveContext savex(isolate); 12954 SaveContext savex(isolate);
12955 isolate->set_context(*(save->context())); 12955 isolate->set_context(*(save->context()));
12956 12956
12957 // Evaluate on the context of the frame. 12957 // Evaluate on the context of the frame.
12958 Handle<Context> context(Context::cast(frame->context())); 12958 Handle<Context> context(Context::cast(frame->context()));
12959 ASSERT(!context.is_null()); 12959 DCHECK(!context.is_null());
12960 12960
12961 // Materialize stack locals and the arguments object. 12961 // Materialize stack locals and the arguments object.
12962 Handle<JSObject> materialized = 12962 Handle<JSObject> materialized =
12963 isolate->factory()->NewJSObject(isolate->object_function()); 12963 isolate->factory()->NewJSObject(isolate->object_function());
12964 12964
12965 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 12965 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
12966 isolate, materialized, 12966 isolate, materialized,
12967 MaterializeStackLocalsWithFrameInspector( 12967 MaterializeStackLocalsWithFrameInspector(
12968 isolate, materialized, function, &frame_inspector)); 12968 isolate, materialized, function, &frame_inspector));
12969 12969
(...skipping 16 matching lines...) Expand all
12986 12986
12987 return *result; 12987 return *result;
12988 } 12988 }
12989 12989
12990 12990
12991 RUNTIME_FUNCTION(Runtime_DebugEvaluateGlobal) { 12991 RUNTIME_FUNCTION(Runtime_DebugEvaluateGlobal) {
12992 HandleScope scope(isolate); 12992 HandleScope scope(isolate);
12993 12993
12994 // Check the execution state and decode arguments frame and source to be 12994 // Check the execution state and decode arguments frame and source to be
12995 // evaluated. 12995 // evaluated.
12996 ASSERT(args.length() == 4); 12996 DCHECK(args.length() == 4);
12997 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 12997 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
12998 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 12998 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
12999 12999
13000 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); 13000 CONVERT_ARG_HANDLE_CHECKED(String, source, 1);
13001 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 2); 13001 CONVERT_BOOLEAN_ARG_CHECKED(disable_break, 2);
13002 CONVERT_ARG_HANDLE_CHECKED(Object, context_extension, 3); 13002 CONVERT_ARG_HANDLE_CHECKED(Object, context_extension, 3);
13003 13003
13004 // Handle the processing of break. 13004 // Handle the processing of break.
13005 DisableBreak disable_break_scope(isolate->debug(), disable_break); 13005 DisableBreak disable_break_scope(isolate->debug(), disable_break);
13006 13006
(...skipping 14 matching lines...) Expand all
13021 Handle<Object> result; 13021 Handle<Object> result;
13022 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 13022 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
13023 isolate, result, 13023 isolate, result,
13024 DebugEvaluate(isolate, context, context_extension, receiver, source)); 13024 DebugEvaluate(isolate, context, context_extension, receiver, source));
13025 return *result; 13025 return *result;
13026 } 13026 }
13027 13027
13028 13028
13029 RUNTIME_FUNCTION(Runtime_DebugGetLoadedScripts) { 13029 RUNTIME_FUNCTION(Runtime_DebugGetLoadedScripts) {
13030 HandleScope scope(isolate); 13030 HandleScope scope(isolate);
13031 ASSERT(args.length() == 0); 13031 DCHECK(args.length() == 0);
13032 13032
13033 // Fill the script objects. 13033 // Fill the script objects.
13034 Handle<FixedArray> instances = isolate->debug()->GetLoadedScripts(); 13034 Handle<FixedArray> instances = isolate->debug()->GetLoadedScripts();
13035 13035
13036 // Convert the script objects to proper JS objects. 13036 // Convert the script objects to proper JS objects.
13037 for (int i = 0; i < instances->length(); i++) { 13037 for (int i = 0; i < instances->length(); i++) {
13038 Handle<Script> script = Handle<Script>(Script::cast(instances->get(i))); 13038 Handle<Script> script = Handle<Script>(Script::cast(instances->get(i)));
13039 // Get the script wrapper in a local handle before calling GetScriptWrapper, 13039 // Get the script wrapper in a local handle before calling GetScriptWrapper,
13040 // because using 13040 // because using
13041 // instances->set(i, *GetScriptWrapper(script)) 13041 // instances->set(i, *GetScriptWrapper(script))
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
13118 return count; 13118 return count;
13119 } 13119 }
13120 13120
13121 13121
13122 // Scan the heap for objects with direct references to an object 13122 // Scan the heap for objects with direct references to an object
13123 // args[0]: the object to find references to 13123 // args[0]: the object to find references to
13124 // args[1]: constructor function for instances to exclude (Mirror) 13124 // args[1]: constructor function for instances to exclude (Mirror)
13125 // args[2]: the the maximum number of objects to return 13125 // args[2]: the the maximum number of objects to return
13126 RUNTIME_FUNCTION(Runtime_DebugReferencedBy) { 13126 RUNTIME_FUNCTION(Runtime_DebugReferencedBy) {
13127 HandleScope scope(isolate); 13127 HandleScope scope(isolate);
13128 ASSERT(args.length() == 3); 13128 DCHECK(args.length() == 3);
13129 13129
13130 // Check parameters. 13130 // Check parameters.
13131 CONVERT_ARG_HANDLE_CHECKED(JSObject, target, 0); 13131 CONVERT_ARG_HANDLE_CHECKED(JSObject, target, 0);
13132 CONVERT_ARG_HANDLE_CHECKED(Object, instance_filter, 1); 13132 CONVERT_ARG_HANDLE_CHECKED(Object, instance_filter, 1);
13133 RUNTIME_ASSERT(instance_filter->IsUndefined() || 13133 RUNTIME_ASSERT(instance_filter->IsUndefined() ||
13134 instance_filter->IsJSObject()); 13134 instance_filter->IsJSObject());
13135 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[2]); 13135 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[2]);
13136 RUNTIME_ASSERT(max_references >= 0); 13136 RUNTIME_ASSERT(max_references >= 0);
13137 13137
13138 13138
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
13203 // Return the number of referencing objects found. 13203 // Return the number of referencing objects found.
13204 return count; 13204 return count;
13205 } 13205 }
13206 13206
13207 13207
13208 // Scan the heap for objects constructed by a specific function. 13208 // Scan the heap for objects constructed by a specific function.
13209 // args[0]: the constructor to find instances of 13209 // args[0]: the constructor to find instances of
13210 // args[1]: the the maximum number of objects to return 13210 // args[1]: the the maximum number of objects to return
13211 RUNTIME_FUNCTION(Runtime_DebugConstructedBy) { 13211 RUNTIME_FUNCTION(Runtime_DebugConstructedBy) {
13212 HandleScope scope(isolate); 13212 HandleScope scope(isolate);
13213 ASSERT(args.length() == 2); 13213 DCHECK(args.length() == 2);
13214 13214
13215 13215
13216 // Check parameters. 13216 // Check parameters.
13217 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 0); 13217 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, 0);
13218 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]); 13218 CONVERT_NUMBER_CHECKED(int32_t, max_references, Int32, args[1]);
13219 RUNTIME_ASSERT(max_references >= 0); 13219 RUNTIME_ASSERT(max_references >= 0);
13220 13220
13221 // Get the number of referencing objects. 13221 // Get the number of referencing objects.
13222 int count; 13222 int count;
13223 // First perform a full GC in order to avoid dead objects and to make the heap 13223 // First perform a full GC in order to avoid dead objects and to make the heap
(...skipping 27 matching lines...) Expand all
13251 Handle<JSObject> result = isolate->factory()->NewJSObject(array_function); 13251 Handle<JSObject> result = isolate->factory()->NewJSObject(array_function);
13252 JSArray::SetContent(Handle<JSArray>::cast(result), instances); 13252 JSArray::SetContent(Handle<JSArray>::cast(result), instances);
13253 return *result; 13253 return *result;
13254 } 13254 }
13255 13255
13256 13256
13257 // Find the effective prototype object as returned by __proto__. 13257 // Find the effective prototype object as returned by __proto__.
13258 // args[0]: the object to find the prototype for. 13258 // args[0]: the object to find the prototype for.
13259 RUNTIME_FUNCTION(Runtime_DebugGetPrototype) { 13259 RUNTIME_FUNCTION(Runtime_DebugGetPrototype) {
13260 HandleScope shs(isolate); 13260 HandleScope shs(isolate);
13261 ASSERT(args.length() == 1); 13261 DCHECK(args.length() == 1);
13262 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0); 13262 CONVERT_ARG_HANDLE_CHECKED(JSObject, obj, 0);
13263 return *GetPrototypeSkipHiddenPrototypes(isolate, obj); 13263 return *GetPrototypeSkipHiddenPrototypes(isolate, obj);
13264 } 13264 }
13265 13265
13266 13266
13267 // Patches script source (should be called upon BeforeCompile event). 13267 // Patches script source (should be called upon BeforeCompile event).
13268 RUNTIME_FUNCTION(Runtime_DebugSetScriptSource) { 13268 RUNTIME_FUNCTION(Runtime_DebugSetScriptSource) {
13269 HandleScope scope(isolate); 13269 HandleScope scope(isolate);
13270 ASSERT(args.length() == 2); 13270 DCHECK(args.length() == 2);
13271 13271
13272 CONVERT_ARG_HANDLE_CHECKED(JSValue, script_wrapper, 0); 13272 CONVERT_ARG_HANDLE_CHECKED(JSValue, script_wrapper, 0);
13273 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); 13273 CONVERT_ARG_HANDLE_CHECKED(String, source, 1);
13274 13274
13275 RUNTIME_ASSERT(script_wrapper->value()->IsScript()); 13275 RUNTIME_ASSERT(script_wrapper->value()->IsScript());
13276 Handle<Script> script(Script::cast(script_wrapper->value())); 13276 Handle<Script> script(Script::cast(script_wrapper->value()));
13277 13277
13278 int compilation_state = script->compilation_state(); 13278 int compilation_state = script->compilation_state();
13279 RUNTIME_ASSERT(compilation_state == Script::COMPILATION_STATE_INITIAL); 13279 RUNTIME_ASSERT(compilation_state == Script::COMPILATION_STATE_INITIAL);
13280 script->set_source(*source); 13280 script->set_source(*source);
13281 13281
13282 return isolate->heap()->undefined_value(); 13282 return isolate->heap()->undefined_value();
13283 } 13283 }
13284 13284
13285 13285
13286 RUNTIME_FUNCTION(Runtime_SystemBreak) { 13286 RUNTIME_FUNCTION(Runtime_SystemBreak) {
13287 SealHandleScope shs(isolate); 13287 SealHandleScope shs(isolate);
13288 ASSERT(args.length() == 0); 13288 DCHECK(args.length() == 0);
13289 base::OS::DebugBreak(); 13289 base::OS::DebugBreak();
13290 return isolate->heap()->undefined_value(); 13290 return isolate->heap()->undefined_value();
13291 } 13291 }
13292 13292
13293 13293
13294 RUNTIME_FUNCTION(Runtime_DebugDisassembleFunction) { 13294 RUNTIME_FUNCTION(Runtime_DebugDisassembleFunction) {
13295 HandleScope scope(isolate); 13295 HandleScope scope(isolate);
13296 #ifdef DEBUG 13296 #ifdef DEBUG
13297 ASSERT(args.length() == 1); 13297 DCHECK(args.length() == 1);
13298 // Get the function and make sure it is compiled. 13298 // Get the function and make sure it is compiled.
13299 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); 13299 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0);
13300 if (!Compiler::EnsureCompiled(func, KEEP_EXCEPTION)) { 13300 if (!Compiler::EnsureCompiled(func, KEEP_EXCEPTION)) {
13301 return isolate->heap()->exception(); 13301 return isolate->heap()->exception();
13302 } 13302 }
13303 OFStream os(stdout); 13303 OFStream os(stdout);
13304 func->code()->Print(os); 13304 func->code()->Print(os);
13305 os << endl; 13305 os << endl;
13306 #endif // DEBUG 13306 #endif // DEBUG
13307 return isolate->heap()->undefined_value(); 13307 return isolate->heap()->undefined_value();
13308 } 13308 }
13309 13309
13310 13310
13311 RUNTIME_FUNCTION(Runtime_DebugDisassembleConstructor) { 13311 RUNTIME_FUNCTION(Runtime_DebugDisassembleConstructor) {
13312 HandleScope scope(isolate); 13312 HandleScope scope(isolate);
13313 #ifdef DEBUG 13313 #ifdef DEBUG
13314 ASSERT(args.length() == 1); 13314 DCHECK(args.length() == 1);
13315 // Get the function and make sure it is compiled. 13315 // Get the function and make sure it is compiled.
13316 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0); 13316 CONVERT_ARG_HANDLE_CHECKED(JSFunction, func, 0);
13317 if (!Compiler::EnsureCompiled(func, KEEP_EXCEPTION)) { 13317 if (!Compiler::EnsureCompiled(func, KEEP_EXCEPTION)) {
13318 return isolate->heap()->exception(); 13318 return isolate->heap()->exception();
13319 } 13319 }
13320 OFStream os(stdout); 13320 OFStream os(stdout);
13321 func->shared()->construct_stub()->Print(os); 13321 func->shared()->construct_stub()->Print(os);
13322 os << endl; 13322 os << endl;
13323 #endif // DEBUG 13323 #endif // DEBUG
13324 return isolate->heap()->undefined_value(); 13324 return isolate->heap()->undefined_value();
13325 } 13325 }
13326 13326
13327 13327
13328 RUNTIME_FUNCTION(Runtime_FunctionGetInferredName) { 13328 RUNTIME_FUNCTION(Runtime_FunctionGetInferredName) {
13329 SealHandleScope shs(isolate); 13329 SealHandleScope shs(isolate);
13330 ASSERT(args.length() == 1); 13330 DCHECK(args.length() == 1);
13331 13331
13332 CONVERT_ARG_CHECKED(JSFunction, f, 0); 13332 CONVERT_ARG_CHECKED(JSFunction, f, 0);
13333 return f->shared()->inferred_name(); 13333 return f->shared()->inferred_name();
13334 } 13334 }
13335 13335
13336 13336
13337 static int FindSharedFunctionInfosForScript(HeapIterator* iterator, 13337 static int FindSharedFunctionInfosForScript(HeapIterator* iterator,
13338 Script* script, 13338 Script* script,
13339 FixedArray* buffer) { 13339 FixedArray* buffer) {
13340 DisallowHeapAllocation no_allocation; 13340 DisallowHeapAllocation no_allocation;
13341 int counter = 0; 13341 int counter = 0;
13342 int buffer_size = buffer->length(); 13342 int buffer_size = buffer->length();
13343 for (HeapObject* obj = iterator->next(); 13343 for (HeapObject* obj = iterator->next();
13344 obj != NULL; 13344 obj != NULL;
13345 obj = iterator->next()) { 13345 obj = iterator->next()) {
13346 ASSERT(obj != NULL); 13346 DCHECK(obj != NULL);
13347 if (!obj->IsSharedFunctionInfo()) { 13347 if (!obj->IsSharedFunctionInfo()) {
13348 continue; 13348 continue;
13349 } 13349 }
13350 SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj); 13350 SharedFunctionInfo* shared = SharedFunctionInfo::cast(obj);
13351 if (shared->script() != script) { 13351 if (shared->script() != script) {
13352 continue; 13352 continue;
13353 } 13353 }
13354 if (counter < buffer_size) { 13354 if (counter < buffer_size) {
13355 buffer->set(counter, shared); 13355 buffer->set(counter, shared);
13356 } 13356 }
13357 counter++; 13357 counter++;
13358 } 13358 }
13359 return counter; 13359 return counter;
13360 } 13360 }
13361 13361
13362 13362
13363 // For a script finds all SharedFunctionInfo's in the heap that points 13363 // For a script finds all SharedFunctionInfo's in the heap that points
13364 // to this script. Returns JSArray of SharedFunctionInfo wrapped 13364 // to this script. Returns JSArray of SharedFunctionInfo wrapped
13365 // in OpaqueReferences. 13365 // in OpaqueReferences.
13366 RUNTIME_FUNCTION(Runtime_LiveEditFindSharedFunctionInfosForScript) { 13366 RUNTIME_FUNCTION(Runtime_LiveEditFindSharedFunctionInfosForScript) {
13367 HandleScope scope(isolate); 13367 HandleScope scope(isolate);
13368 CHECK(isolate->debug()->live_edit_enabled()); 13368 CHECK(isolate->debug()->live_edit_enabled());
13369 ASSERT(args.length() == 1); 13369 DCHECK(args.length() == 1);
13370 CONVERT_ARG_CHECKED(JSValue, script_value, 0); 13370 CONVERT_ARG_CHECKED(JSValue, script_value, 0);
13371 13371
13372 RUNTIME_ASSERT(script_value->value()->IsScript()); 13372 RUNTIME_ASSERT(script_value->value()->IsScript());
13373 Handle<Script> script = Handle<Script>(Script::cast(script_value->value())); 13373 Handle<Script> script = Handle<Script>(Script::cast(script_value->value()));
13374 13374
13375 const int kBufferSize = 32; 13375 const int kBufferSize = 32;
13376 13376
13377 Handle<FixedArray> array; 13377 Handle<FixedArray> array;
13378 array = isolate->factory()->NewFixedArray(kBufferSize); 13378 array = isolate->factory()->NewFixedArray(kBufferSize);
13379 int number; 13379 int number;
(...skipping 24 matching lines...) Expand all
13404 // For a script calculates compilation information about all its functions. 13404 // For a script calculates compilation information about all its functions.
13405 // The script source is explicitly specified by the second argument. 13405 // The script source is explicitly specified by the second argument.
13406 // The source of the actual script is not used, however it is important that 13406 // The source of the actual script is not used, however it is important that
13407 // all generated code keeps references to this particular instance of script. 13407 // all generated code keeps references to this particular instance of script.
13408 // Returns a JSArray of compilation infos. The array is ordered so that 13408 // Returns a JSArray of compilation infos. The array is ordered so that
13409 // each function with all its descendant is always stored in a continues range 13409 // each function with all its descendant is always stored in a continues range
13410 // with the function itself going first. The root function is a script function. 13410 // with the function itself going first. The root function is a script function.
13411 RUNTIME_FUNCTION(Runtime_LiveEditGatherCompileInfo) { 13411 RUNTIME_FUNCTION(Runtime_LiveEditGatherCompileInfo) {
13412 HandleScope scope(isolate); 13412 HandleScope scope(isolate);
13413 CHECK(isolate->debug()->live_edit_enabled()); 13413 CHECK(isolate->debug()->live_edit_enabled());
13414 ASSERT(args.length() == 2); 13414 DCHECK(args.length() == 2);
13415 CONVERT_ARG_CHECKED(JSValue, script, 0); 13415 CONVERT_ARG_CHECKED(JSValue, script, 0);
13416 CONVERT_ARG_HANDLE_CHECKED(String, source, 1); 13416 CONVERT_ARG_HANDLE_CHECKED(String, source, 1);
13417 13417
13418 RUNTIME_ASSERT(script->value()->IsScript()); 13418 RUNTIME_ASSERT(script->value()->IsScript());
13419 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value())); 13419 Handle<Script> script_handle = Handle<Script>(Script::cast(script->value()));
13420 13420
13421 Handle<JSArray> result; 13421 Handle<JSArray> result;
13422 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 13422 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
13423 isolate, result, LiveEdit::GatherCompileInfo(script_handle, source)); 13423 isolate, result, LiveEdit::GatherCompileInfo(script_handle, source));
13424 return *result; 13424 return *result;
13425 } 13425 }
13426 13426
13427 13427
13428 // Changes the source of the script to a new_source. 13428 // Changes the source of the script to a new_source.
13429 // If old_script_name is provided (i.e. is a String), also creates a copy of 13429 // If old_script_name is provided (i.e. is a String), also creates a copy of
13430 // the script with its original source and sends notification to debugger. 13430 // the script with its original source and sends notification to debugger.
13431 RUNTIME_FUNCTION(Runtime_LiveEditReplaceScript) { 13431 RUNTIME_FUNCTION(Runtime_LiveEditReplaceScript) {
13432 HandleScope scope(isolate); 13432 HandleScope scope(isolate);
13433 CHECK(isolate->debug()->live_edit_enabled()); 13433 CHECK(isolate->debug()->live_edit_enabled());
13434 ASSERT(args.length() == 3); 13434 DCHECK(args.length() == 3);
13435 CONVERT_ARG_CHECKED(JSValue, original_script_value, 0); 13435 CONVERT_ARG_CHECKED(JSValue, original_script_value, 0);
13436 CONVERT_ARG_HANDLE_CHECKED(String, new_source, 1); 13436 CONVERT_ARG_HANDLE_CHECKED(String, new_source, 1);
13437 CONVERT_ARG_HANDLE_CHECKED(Object, old_script_name, 2); 13437 CONVERT_ARG_HANDLE_CHECKED(Object, old_script_name, 2);
13438 13438
13439 RUNTIME_ASSERT(original_script_value->value()->IsScript()); 13439 RUNTIME_ASSERT(original_script_value->value()->IsScript());
13440 Handle<Script> original_script(Script::cast(original_script_value->value())); 13440 Handle<Script> original_script(Script::cast(original_script_value->value()));
13441 13441
13442 Handle<Object> old_script = LiveEdit::ChangeScriptSource( 13442 Handle<Object> old_script = LiveEdit::ChangeScriptSource(
13443 original_script, new_source, old_script_name); 13443 original_script, new_source, old_script_name);
13444 13444
13445 if (old_script->IsScript()) { 13445 if (old_script->IsScript()) {
13446 Handle<Script> script_handle = Handle<Script>::cast(old_script); 13446 Handle<Script> script_handle = Handle<Script>::cast(old_script);
13447 return *Script::GetWrapper(script_handle); 13447 return *Script::GetWrapper(script_handle);
13448 } else { 13448 } else {
13449 return isolate->heap()->null_value(); 13449 return isolate->heap()->null_value();
13450 } 13450 }
13451 } 13451 }
13452 13452
13453 13453
13454 RUNTIME_FUNCTION(Runtime_LiveEditFunctionSourceUpdated) { 13454 RUNTIME_FUNCTION(Runtime_LiveEditFunctionSourceUpdated) {
13455 HandleScope scope(isolate); 13455 HandleScope scope(isolate);
13456 CHECK(isolate->debug()->live_edit_enabled()); 13456 CHECK(isolate->debug()->live_edit_enabled());
13457 ASSERT(args.length() == 1); 13457 DCHECK(args.length() == 1);
13458 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 0); 13458 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 0);
13459 RUNTIME_ASSERT(SharedInfoWrapper::IsInstance(shared_info)); 13459 RUNTIME_ASSERT(SharedInfoWrapper::IsInstance(shared_info));
13460 13460
13461 LiveEdit::FunctionSourceUpdated(shared_info); 13461 LiveEdit::FunctionSourceUpdated(shared_info);
13462 return isolate->heap()->undefined_value(); 13462 return isolate->heap()->undefined_value();
13463 } 13463 }
13464 13464
13465 13465
13466 // Replaces code of SharedFunctionInfo with a new one. 13466 // Replaces code of SharedFunctionInfo with a new one.
13467 RUNTIME_FUNCTION(Runtime_LiveEditReplaceFunctionCode) { 13467 RUNTIME_FUNCTION(Runtime_LiveEditReplaceFunctionCode) {
13468 HandleScope scope(isolate); 13468 HandleScope scope(isolate);
13469 CHECK(isolate->debug()->live_edit_enabled()); 13469 CHECK(isolate->debug()->live_edit_enabled());
13470 ASSERT(args.length() == 2); 13470 DCHECK(args.length() == 2);
13471 CONVERT_ARG_HANDLE_CHECKED(JSArray, new_compile_info, 0); 13471 CONVERT_ARG_HANDLE_CHECKED(JSArray, new_compile_info, 0);
13472 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 1); 13472 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_info, 1);
13473 RUNTIME_ASSERT(SharedInfoWrapper::IsInstance(shared_info)); 13473 RUNTIME_ASSERT(SharedInfoWrapper::IsInstance(shared_info));
13474 13474
13475 LiveEdit::ReplaceFunctionCode(new_compile_info, shared_info); 13475 LiveEdit::ReplaceFunctionCode(new_compile_info, shared_info);
13476 return isolate->heap()->undefined_value(); 13476 return isolate->heap()->undefined_value();
13477 } 13477 }
13478 13478
13479 13479
13480 // Connects SharedFunctionInfo to another script. 13480 // Connects SharedFunctionInfo to another script.
13481 RUNTIME_FUNCTION(Runtime_LiveEditFunctionSetScript) { 13481 RUNTIME_FUNCTION(Runtime_LiveEditFunctionSetScript) {
13482 HandleScope scope(isolate); 13482 HandleScope scope(isolate);
13483 CHECK(isolate->debug()->live_edit_enabled()); 13483 CHECK(isolate->debug()->live_edit_enabled());
13484 ASSERT(args.length() == 2); 13484 DCHECK(args.length() == 2);
13485 CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0); 13485 CONVERT_ARG_HANDLE_CHECKED(Object, function_object, 0);
13486 CONVERT_ARG_HANDLE_CHECKED(Object, script_object, 1); 13486 CONVERT_ARG_HANDLE_CHECKED(Object, script_object, 1);
13487 13487
13488 if (function_object->IsJSValue()) { 13488 if (function_object->IsJSValue()) {
13489 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object); 13489 Handle<JSValue> function_wrapper = Handle<JSValue>::cast(function_object);
13490 if (script_object->IsJSValue()) { 13490 if (script_object->IsJSValue()) {
13491 RUNTIME_ASSERT(JSValue::cast(*script_object)->value()->IsScript()); 13491 RUNTIME_ASSERT(JSValue::cast(*script_object)->value()->IsScript());
13492 Script* script = Script::cast(JSValue::cast(*script_object)->value()); 13492 Script* script = Script::cast(JSValue::cast(*script_object)->value());
13493 script_object = Handle<Object>(script, isolate); 13493 script_object = Handle<Object>(script, isolate);
13494 } 13494 }
13495 RUNTIME_ASSERT(function_wrapper->value()->IsSharedFunctionInfo()); 13495 RUNTIME_ASSERT(function_wrapper->value()->IsSharedFunctionInfo());
13496 LiveEdit::SetFunctionScript(function_wrapper, script_object); 13496 LiveEdit::SetFunctionScript(function_wrapper, script_object);
13497 } else { 13497 } else {
13498 // Just ignore this. We may not have a SharedFunctionInfo for some functions 13498 // Just ignore this. We may not have a SharedFunctionInfo for some functions
13499 // and we check it in this function. 13499 // and we check it in this function.
13500 } 13500 }
13501 13501
13502 return isolate->heap()->undefined_value(); 13502 return isolate->heap()->undefined_value();
13503 } 13503 }
13504 13504
13505 13505
13506 // In a code of a parent function replaces original function as embedded object 13506 // In a code of a parent function replaces original function as embedded object
13507 // with a substitution one. 13507 // with a substitution one.
13508 RUNTIME_FUNCTION(Runtime_LiveEditReplaceRefToNestedFunction) { 13508 RUNTIME_FUNCTION(Runtime_LiveEditReplaceRefToNestedFunction) {
13509 HandleScope scope(isolate); 13509 HandleScope scope(isolate);
13510 CHECK(isolate->debug()->live_edit_enabled()); 13510 CHECK(isolate->debug()->live_edit_enabled());
13511 ASSERT(args.length() == 3); 13511 DCHECK(args.length() == 3);
13512 13512
13513 CONVERT_ARG_HANDLE_CHECKED(JSValue, parent_wrapper, 0); 13513 CONVERT_ARG_HANDLE_CHECKED(JSValue, parent_wrapper, 0);
13514 CONVERT_ARG_HANDLE_CHECKED(JSValue, orig_wrapper, 1); 13514 CONVERT_ARG_HANDLE_CHECKED(JSValue, orig_wrapper, 1);
13515 CONVERT_ARG_HANDLE_CHECKED(JSValue, subst_wrapper, 2); 13515 CONVERT_ARG_HANDLE_CHECKED(JSValue, subst_wrapper, 2);
13516 RUNTIME_ASSERT(parent_wrapper->value()->IsSharedFunctionInfo()); 13516 RUNTIME_ASSERT(parent_wrapper->value()->IsSharedFunctionInfo());
13517 RUNTIME_ASSERT(orig_wrapper->value()->IsSharedFunctionInfo()); 13517 RUNTIME_ASSERT(orig_wrapper->value()->IsSharedFunctionInfo());
13518 RUNTIME_ASSERT(subst_wrapper->value()->IsSharedFunctionInfo()); 13518 RUNTIME_ASSERT(subst_wrapper->value()->IsSharedFunctionInfo());
13519 13519
13520 LiveEdit::ReplaceRefToNestedFunction( 13520 LiveEdit::ReplaceRefToNestedFunction(
13521 parent_wrapper, orig_wrapper, subst_wrapper); 13521 parent_wrapper, orig_wrapper, subst_wrapper);
13522 return isolate->heap()->undefined_value(); 13522 return isolate->heap()->undefined_value();
13523 } 13523 }
13524 13524
13525 13525
13526 // Updates positions of a shared function info (first parameter) according 13526 // Updates positions of a shared function info (first parameter) according
13527 // to script source change. Text change is described in second parameter as 13527 // to script source change. Text change is described in second parameter as
13528 // array of groups of 3 numbers: 13528 // array of groups of 3 numbers:
13529 // (change_begin, change_end, change_end_new_position). 13529 // (change_begin, change_end, change_end_new_position).
13530 // Each group describes a change in text; groups are sorted by change_begin. 13530 // Each group describes a change in text; groups are sorted by change_begin.
13531 RUNTIME_FUNCTION(Runtime_LiveEditPatchFunctionPositions) { 13531 RUNTIME_FUNCTION(Runtime_LiveEditPatchFunctionPositions) {
13532 HandleScope scope(isolate); 13532 HandleScope scope(isolate);
13533 CHECK(isolate->debug()->live_edit_enabled()); 13533 CHECK(isolate->debug()->live_edit_enabled());
13534 ASSERT(args.length() == 2); 13534 DCHECK(args.length() == 2);
13535 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0); 13535 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0);
13536 CONVERT_ARG_HANDLE_CHECKED(JSArray, position_change_array, 1); 13536 CONVERT_ARG_HANDLE_CHECKED(JSArray, position_change_array, 1);
13537 RUNTIME_ASSERT(SharedInfoWrapper::IsInstance(shared_array)) 13537 RUNTIME_ASSERT(SharedInfoWrapper::IsInstance(shared_array))
13538 13538
13539 LiveEdit::PatchFunctionPositions(shared_array, position_change_array); 13539 LiveEdit::PatchFunctionPositions(shared_array, position_change_array);
13540 return isolate->heap()->undefined_value(); 13540 return isolate->heap()->undefined_value();
13541 } 13541 }
13542 13542
13543 13543
13544 // For array of SharedFunctionInfo's (each wrapped in JSValue) 13544 // For array of SharedFunctionInfo's (each wrapped in JSValue)
13545 // checks that none of them have activations on stacks (of any thread). 13545 // checks that none of them have activations on stacks (of any thread).
13546 // Returns array of the same length with corresponding results of 13546 // Returns array of the same length with corresponding results of
13547 // LiveEdit::FunctionPatchabilityStatus type. 13547 // LiveEdit::FunctionPatchabilityStatus type.
13548 RUNTIME_FUNCTION(Runtime_LiveEditCheckAndDropActivations) { 13548 RUNTIME_FUNCTION(Runtime_LiveEditCheckAndDropActivations) {
13549 HandleScope scope(isolate); 13549 HandleScope scope(isolate);
13550 CHECK(isolate->debug()->live_edit_enabled()); 13550 CHECK(isolate->debug()->live_edit_enabled());
13551 ASSERT(args.length() == 2); 13551 DCHECK(args.length() == 2);
13552 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0); 13552 CONVERT_ARG_HANDLE_CHECKED(JSArray, shared_array, 0);
13553 CONVERT_BOOLEAN_ARG_CHECKED(do_drop, 1); 13553 CONVERT_BOOLEAN_ARG_CHECKED(do_drop, 1);
13554 RUNTIME_ASSERT(shared_array->length()->IsSmi()); 13554 RUNTIME_ASSERT(shared_array->length()->IsSmi());
13555 RUNTIME_ASSERT(shared_array->HasFastElements()) 13555 RUNTIME_ASSERT(shared_array->HasFastElements())
13556 int array_length = Smi::cast(shared_array->length())->value(); 13556 int array_length = Smi::cast(shared_array->length())->value();
13557 for (int i = 0; i < array_length; i++) { 13557 for (int i = 0; i < array_length; i++) {
13558 Handle<Object> element = 13558 Handle<Object> element =
13559 Object::GetElement(isolate, shared_array, i).ToHandleChecked(); 13559 Object::GetElement(isolate, shared_array, i).ToHandleChecked();
13560 RUNTIME_ASSERT( 13560 RUNTIME_ASSERT(
13561 element->IsJSValue() && 13561 element->IsJSValue() &&
13562 Handle<JSValue>::cast(element)->value()->IsSharedFunctionInfo()); 13562 Handle<JSValue>::cast(element)->value()->IsSharedFunctionInfo());
13563 } 13563 }
13564 13564
13565 return *LiveEdit::CheckAndDropActivations(shared_array, do_drop); 13565 return *LiveEdit::CheckAndDropActivations(shared_array, do_drop);
13566 } 13566 }
13567 13567
13568 13568
13569 // Compares 2 strings line-by-line, then token-wise and returns diff in form 13569 // Compares 2 strings line-by-line, then token-wise and returns diff in form
13570 // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list 13570 // of JSArray of triplets (pos1, pos1_end, pos2_end) describing list
13571 // of diff chunks. 13571 // of diff chunks.
13572 RUNTIME_FUNCTION(Runtime_LiveEditCompareStrings) { 13572 RUNTIME_FUNCTION(Runtime_LiveEditCompareStrings) {
13573 HandleScope scope(isolate); 13573 HandleScope scope(isolate);
13574 CHECK(isolate->debug()->live_edit_enabled()); 13574 CHECK(isolate->debug()->live_edit_enabled());
13575 ASSERT(args.length() == 2); 13575 DCHECK(args.length() == 2);
13576 CONVERT_ARG_HANDLE_CHECKED(String, s1, 0); 13576 CONVERT_ARG_HANDLE_CHECKED(String, s1, 0);
13577 CONVERT_ARG_HANDLE_CHECKED(String, s2, 1); 13577 CONVERT_ARG_HANDLE_CHECKED(String, s2, 1);
13578 13578
13579 return *LiveEdit::CompareStrings(s1, s2); 13579 return *LiveEdit::CompareStrings(s1, s2);
13580 } 13580 }
13581 13581
13582 13582
13583 // Restarts a call frame and completely drops all frames above. 13583 // Restarts a call frame and completely drops all frames above.
13584 // Returns true if successful. Otherwise returns undefined or an error message. 13584 // Returns true if successful. Otherwise returns undefined or an error message.
13585 RUNTIME_FUNCTION(Runtime_LiveEditRestartFrame) { 13585 RUNTIME_FUNCTION(Runtime_LiveEditRestartFrame) {
13586 HandleScope scope(isolate); 13586 HandleScope scope(isolate);
13587 CHECK(isolate->debug()->live_edit_enabled()); 13587 CHECK(isolate->debug()->live_edit_enabled());
13588 ASSERT(args.length() == 2); 13588 DCHECK(args.length() == 2);
13589 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]); 13589 CONVERT_NUMBER_CHECKED(int, break_id, Int32, args[0]);
13590 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id)); 13590 RUNTIME_ASSERT(CheckExecutionState(isolate, break_id));
13591 13591
13592 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]); 13592 CONVERT_NUMBER_CHECKED(int, index, Int32, args[1]);
13593 Heap* heap = isolate->heap(); 13593 Heap* heap = isolate->heap();
13594 13594
13595 // Find the relevant frame with the requested index. 13595 // Find the relevant frame with the requested index.
13596 StackFrame::Id id = isolate->debug()->break_frame_id(); 13596 StackFrame::Id id = isolate->debug()->break_frame_id();
13597 if (id == StackFrame::NO_ID) { 13597 if (id == StackFrame::NO_ID) {
13598 // If there are no JavaScript stack frames return undefined. 13598 // If there are no JavaScript stack frames return undefined.
(...skipping 14 matching lines...) Expand all
13613 } 13613 }
13614 return heap->true_value(); 13614 return heap->true_value();
13615 } 13615 }
13616 13616
13617 13617
13618 // A testing entry. Returns statement position which is the closest to 13618 // A testing entry. Returns statement position which is the closest to
13619 // source_position. 13619 // source_position.
13620 RUNTIME_FUNCTION(Runtime_GetFunctionCodePositionFromSource) { 13620 RUNTIME_FUNCTION(Runtime_GetFunctionCodePositionFromSource) {
13621 HandleScope scope(isolate); 13621 HandleScope scope(isolate);
13622 CHECK(isolate->debug()->live_edit_enabled()); 13622 CHECK(isolate->debug()->live_edit_enabled());
13623 ASSERT(args.length() == 2); 13623 DCHECK(args.length() == 2);
13624 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 13624 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
13625 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]); 13625 CONVERT_NUMBER_CHECKED(int32_t, source_position, Int32, args[1]);
13626 13626
13627 Handle<Code> code(function->code(), isolate); 13627 Handle<Code> code(function->code(), isolate);
13628 13628
13629 if (code->kind() != Code::FUNCTION && 13629 if (code->kind() != Code::FUNCTION &&
13630 code->kind() != Code::OPTIMIZED_FUNCTION) { 13630 code->kind() != Code::OPTIMIZED_FUNCTION) {
13631 return isolate->heap()->undefined_value(); 13631 return isolate->heap()->undefined_value();
13632 } 13632 }
13633 13633
(...skipping 16 matching lines...) Expand all
13650 13650
13651 return Smi::FromInt(closest_pc); 13651 return Smi::FromInt(closest_pc);
13652 } 13652 }
13653 13653
13654 13654
13655 // Calls specified function with or without entering the debugger. 13655 // Calls specified function with or without entering the debugger.
13656 // This is used in unit tests to run code as if debugger is entered or simply 13656 // This is used in unit tests to run code as if debugger is entered or simply
13657 // to have a stack with C++ frame in the middle. 13657 // to have a stack with C++ frame in the middle.
13658 RUNTIME_FUNCTION(Runtime_ExecuteInDebugContext) { 13658 RUNTIME_FUNCTION(Runtime_ExecuteInDebugContext) {
13659 HandleScope scope(isolate); 13659 HandleScope scope(isolate);
13660 ASSERT(args.length() == 2); 13660 DCHECK(args.length() == 2);
13661 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 13661 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
13662 CONVERT_BOOLEAN_ARG_CHECKED(without_debugger, 1); 13662 CONVERT_BOOLEAN_ARG_CHECKED(without_debugger, 1);
13663 13663
13664 MaybeHandle<Object> maybe_result; 13664 MaybeHandle<Object> maybe_result;
13665 if (without_debugger) { 13665 if (without_debugger) {
13666 maybe_result = Execution::Call(isolate, 13666 maybe_result = Execution::Call(isolate,
13667 function, 13667 function,
13668 handle(function->global_proxy()), 13668 handle(function->global_proxy()),
13669 0, 13669 0,
13670 NULL); 13670 NULL);
13671 } else { 13671 } else {
13672 DebugScope debug_scope(isolate->debug()); 13672 DebugScope debug_scope(isolate->debug());
13673 maybe_result = Execution::Call(isolate, 13673 maybe_result = Execution::Call(isolate,
13674 function, 13674 function,
13675 handle(function->global_proxy()), 13675 handle(function->global_proxy()),
13676 0, 13676 0,
13677 NULL); 13677 NULL);
13678 } 13678 }
13679 Handle<Object> result; 13679 Handle<Object> result;
13680 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, maybe_result); 13680 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, maybe_result);
13681 return *result; 13681 return *result;
13682 } 13682 }
13683 13683
13684 13684
13685 // Sets a v8 flag. 13685 // Sets a v8 flag.
13686 RUNTIME_FUNCTION(Runtime_SetFlags) { 13686 RUNTIME_FUNCTION(Runtime_SetFlags) {
13687 SealHandleScope shs(isolate); 13687 SealHandleScope shs(isolate);
13688 ASSERT(args.length() == 1); 13688 DCHECK(args.length() == 1);
13689 CONVERT_ARG_CHECKED(String, arg, 0); 13689 CONVERT_ARG_CHECKED(String, arg, 0);
13690 SmartArrayPointer<char> flags = 13690 SmartArrayPointer<char> flags =
13691 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL); 13691 arg->ToCString(DISALLOW_NULLS, ROBUST_STRING_TRAVERSAL);
13692 FlagList::SetFlagsFromString(flags.get(), StrLength(flags.get())); 13692 FlagList::SetFlagsFromString(flags.get(), StrLength(flags.get()));
13693 return isolate->heap()->undefined_value(); 13693 return isolate->heap()->undefined_value();
13694 } 13694 }
13695 13695
13696 13696
13697 // Performs a GC. 13697 // Performs a GC.
13698 // Presently, it only does a full GC. 13698 // Presently, it only does a full GC.
13699 RUNTIME_FUNCTION(Runtime_CollectGarbage) { 13699 RUNTIME_FUNCTION(Runtime_CollectGarbage) {
13700 SealHandleScope shs(isolate); 13700 SealHandleScope shs(isolate);
13701 ASSERT(args.length() == 1); 13701 DCHECK(args.length() == 1);
13702 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, "%CollectGarbage"); 13702 isolate->heap()->CollectAllGarbage(Heap::kNoGCFlags, "%CollectGarbage");
13703 return isolate->heap()->undefined_value(); 13703 return isolate->heap()->undefined_value();
13704 } 13704 }
13705 13705
13706 13706
13707 // Gets the current heap usage. 13707 // Gets the current heap usage.
13708 RUNTIME_FUNCTION(Runtime_GetHeapUsage) { 13708 RUNTIME_FUNCTION(Runtime_GetHeapUsage) {
13709 SealHandleScope shs(isolate); 13709 SealHandleScope shs(isolate);
13710 ASSERT(args.length() == 0); 13710 DCHECK(args.length() == 0);
13711 int usage = static_cast<int>(isolate->heap()->SizeOfObjects()); 13711 int usage = static_cast<int>(isolate->heap()->SizeOfObjects());
13712 if (!Smi::IsValid(usage)) { 13712 if (!Smi::IsValid(usage)) {
13713 return *isolate->factory()->NewNumberFromInt(usage); 13713 return *isolate->factory()->NewNumberFromInt(usage);
13714 } 13714 }
13715 return Smi::FromInt(usage); 13715 return Smi::FromInt(usage);
13716 } 13716 }
13717 13717
13718 13718
13719 #ifdef V8_I18N_SUPPORT 13719 #ifdef V8_I18N_SUPPORT
13720 RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) { 13720 RUNTIME_FUNCTION(Runtime_CanonicalizeLanguageTag) {
13721 HandleScope scope(isolate); 13721 HandleScope scope(isolate);
13722 Factory* factory = isolate->factory(); 13722 Factory* factory = isolate->factory();
13723 13723
13724 ASSERT(args.length() == 1); 13724 DCHECK(args.length() == 1);
13725 CONVERT_ARG_HANDLE_CHECKED(String, locale_id_str, 0); 13725 CONVERT_ARG_HANDLE_CHECKED(String, locale_id_str, 0);
13726 13726
13727 v8::String::Utf8Value locale_id(v8::Utils::ToLocal(locale_id_str)); 13727 v8::String::Utf8Value locale_id(v8::Utils::ToLocal(locale_id_str));
13728 13728
13729 // Return value which denotes invalid language tag. 13729 // Return value which denotes invalid language tag.
13730 const char* const kInvalidTag = "invalid-tag"; 13730 const char* const kInvalidTag = "invalid-tag";
13731 13731
13732 UErrorCode error = U_ZERO_ERROR; 13732 UErrorCode error = U_ZERO_ERROR;
13733 char icu_result[ULOC_FULLNAME_CAPACITY]; 13733 char icu_result[ULOC_FULLNAME_CAPACITY];
13734 int icu_length = 0; 13734 int icu_length = 0;
(...skipping 14 matching lines...) Expand all
13749 } 13749 }
13750 13750
13751 return *factory->NewStringFromAsciiChecked(result); 13751 return *factory->NewStringFromAsciiChecked(result);
13752 } 13752 }
13753 13753
13754 13754
13755 RUNTIME_FUNCTION(Runtime_AvailableLocalesOf) { 13755 RUNTIME_FUNCTION(Runtime_AvailableLocalesOf) {
13756 HandleScope scope(isolate); 13756 HandleScope scope(isolate);
13757 Factory* factory = isolate->factory(); 13757 Factory* factory = isolate->factory();
13758 13758
13759 ASSERT(args.length() == 1); 13759 DCHECK(args.length() == 1);
13760 CONVERT_ARG_HANDLE_CHECKED(String, service, 0); 13760 CONVERT_ARG_HANDLE_CHECKED(String, service, 0);
13761 13761
13762 const icu::Locale* available_locales = NULL; 13762 const icu::Locale* available_locales = NULL;
13763 int32_t count = 0; 13763 int32_t count = 0;
13764 13764
13765 if (service->IsUtf8EqualTo(CStrVector("collator"))) { 13765 if (service->IsUtf8EqualTo(CStrVector("collator"))) {
13766 available_locales = icu::Collator::getAvailableLocales(count); 13766 available_locales = icu::Collator::getAvailableLocales(count);
13767 } else if (service->IsUtf8EqualTo(CStrVector("numberformat"))) { 13767 } else if (service->IsUtf8EqualTo(CStrVector("numberformat"))) {
13768 available_locales = icu::NumberFormat::getAvailableLocales(count); 13768 available_locales = icu::NumberFormat::getAvailableLocales(count);
13769 } else if (service->IsUtf8EqualTo(CStrVector("dateformat"))) { 13769 } else if (service->IsUtf8EqualTo(CStrVector("dateformat"))) {
(...skipping 27 matching lines...) Expand all
13797 } 13797 }
13798 13798
13799 return *locales; 13799 return *locales;
13800 } 13800 }
13801 13801
13802 13802
13803 RUNTIME_FUNCTION(Runtime_GetDefaultICULocale) { 13803 RUNTIME_FUNCTION(Runtime_GetDefaultICULocale) {
13804 HandleScope scope(isolate); 13804 HandleScope scope(isolate);
13805 Factory* factory = isolate->factory(); 13805 Factory* factory = isolate->factory();
13806 13806
13807 ASSERT(args.length() == 0); 13807 DCHECK(args.length() == 0);
13808 13808
13809 icu::Locale default_locale; 13809 icu::Locale default_locale;
13810 13810
13811 // Set the locale 13811 // Set the locale
13812 char result[ULOC_FULLNAME_CAPACITY]; 13812 char result[ULOC_FULLNAME_CAPACITY];
13813 UErrorCode status = U_ZERO_ERROR; 13813 UErrorCode status = U_ZERO_ERROR;
13814 uloc_toLanguageTag( 13814 uloc_toLanguageTag(
13815 default_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status); 13815 default_locale.getName(), result, ULOC_FULLNAME_CAPACITY, FALSE, &status);
13816 if (U_SUCCESS(status)) { 13816 if (U_SUCCESS(status)) {
13817 return *factory->NewStringFromAsciiChecked(result); 13817 return *factory->NewStringFromAsciiChecked(result);
13818 } 13818 }
13819 13819
13820 return *factory->NewStringFromStaticAscii("und"); 13820 return *factory->NewStringFromStaticAscii("und");
13821 } 13821 }
13822 13822
13823 13823
13824 RUNTIME_FUNCTION(Runtime_GetLanguageTagVariants) { 13824 RUNTIME_FUNCTION(Runtime_GetLanguageTagVariants) {
13825 HandleScope scope(isolate); 13825 HandleScope scope(isolate);
13826 Factory* factory = isolate->factory(); 13826 Factory* factory = isolate->factory();
13827 13827
13828 ASSERT(args.length() == 1); 13828 DCHECK(args.length() == 1);
13829 13829
13830 CONVERT_ARG_HANDLE_CHECKED(JSArray, input, 0); 13830 CONVERT_ARG_HANDLE_CHECKED(JSArray, input, 0);
13831 13831
13832 uint32_t length = static_cast<uint32_t>(input->length()->Number()); 13832 uint32_t length = static_cast<uint32_t>(input->length()->Number());
13833 // Set some limit to prevent fuzz tests from going OOM. 13833 // Set some limit to prevent fuzz tests from going OOM.
13834 // Can be bumped when callers' requirements change. 13834 // Can be bumped when callers' requirements change.
13835 RUNTIME_ASSERT(length < 100); 13835 RUNTIME_ASSERT(length < 100);
13836 Handle<FixedArray> output = factory->NewFixedArray(length); 13836 Handle<FixedArray> output = factory->NewFixedArray(length);
13837 Handle<Name> maximized = factory->NewStringFromStaticAscii("maximized"); 13837 Handle<Name> maximized = factory->NewStringFromStaticAscii("maximized");
13838 Handle<Name> base = factory->NewStringFromStaticAscii("base"); 13838 Handle<Name> base = factory->NewStringFromStaticAscii("base");
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
13902 13902
13903 Handle<JSArray> result = factory->NewJSArrayWithElements(output); 13903 Handle<JSArray> result = factory->NewJSArrayWithElements(output);
13904 result->set_length(Smi::FromInt(length)); 13904 result->set_length(Smi::FromInt(length));
13905 return *result; 13905 return *result;
13906 } 13906 }
13907 13907
13908 13908
13909 RUNTIME_FUNCTION(Runtime_IsInitializedIntlObject) { 13909 RUNTIME_FUNCTION(Runtime_IsInitializedIntlObject) {
13910 HandleScope scope(isolate); 13910 HandleScope scope(isolate);
13911 13911
13912 ASSERT(args.length() == 1); 13912 DCHECK(args.length() == 1);
13913 13913
13914 CONVERT_ARG_HANDLE_CHECKED(Object, input, 0); 13914 CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
13915 13915
13916 if (!input->IsJSObject()) return isolate->heap()->false_value(); 13916 if (!input->IsJSObject()) return isolate->heap()->false_value();
13917 Handle<JSObject> obj = Handle<JSObject>::cast(input); 13917 Handle<JSObject> obj = Handle<JSObject>::cast(input);
13918 13918
13919 Handle<String> marker = isolate->factory()->intl_initialized_marker_string(); 13919 Handle<String> marker = isolate->factory()->intl_initialized_marker_string();
13920 Handle<Object> tag(obj->GetHiddenProperty(marker), isolate); 13920 Handle<Object> tag(obj->GetHiddenProperty(marker), isolate);
13921 return isolate->heap()->ToBoolean(!tag->IsTheHole()); 13921 return isolate->heap()->ToBoolean(!tag->IsTheHole());
13922 } 13922 }
13923 13923
13924 13924
13925 RUNTIME_FUNCTION(Runtime_IsInitializedIntlObjectOfType) { 13925 RUNTIME_FUNCTION(Runtime_IsInitializedIntlObjectOfType) {
13926 HandleScope scope(isolate); 13926 HandleScope scope(isolate);
13927 13927
13928 ASSERT(args.length() == 2); 13928 DCHECK(args.length() == 2);
13929 13929
13930 CONVERT_ARG_HANDLE_CHECKED(Object, input, 0); 13930 CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
13931 CONVERT_ARG_HANDLE_CHECKED(String, expected_type, 1); 13931 CONVERT_ARG_HANDLE_CHECKED(String, expected_type, 1);
13932 13932
13933 if (!input->IsJSObject()) return isolate->heap()->false_value(); 13933 if (!input->IsJSObject()) return isolate->heap()->false_value();
13934 Handle<JSObject> obj = Handle<JSObject>::cast(input); 13934 Handle<JSObject> obj = Handle<JSObject>::cast(input);
13935 13935
13936 Handle<String> marker = isolate->factory()->intl_initialized_marker_string(); 13936 Handle<String> marker = isolate->factory()->intl_initialized_marker_string();
13937 Handle<Object> tag(obj->GetHiddenProperty(marker), isolate); 13937 Handle<Object> tag(obj->GetHiddenProperty(marker), isolate);
13938 return isolate->heap()->ToBoolean( 13938 return isolate->heap()->ToBoolean(
13939 tag->IsString() && String::cast(*tag)->Equals(*expected_type)); 13939 tag->IsString() && String::cast(*tag)->Equals(*expected_type));
13940 } 13940 }
13941 13941
13942 13942
13943 RUNTIME_FUNCTION(Runtime_MarkAsInitializedIntlObjectOfType) { 13943 RUNTIME_FUNCTION(Runtime_MarkAsInitializedIntlObjectOfType) {
13944 HandleScope scope(isolate); 13944 HandleScope scope(isolate);
13945 13945
13946 ASSERT(args.length() == 3); 13946 DCHECK(args.length() == 3);
13947 13947
13948 CONVERT_ARG_HANDLE_CHECKED(JSObject, input, 0); 13948 CONVERT_ARG_HANDLE_CHECKED(JSObject, input, 0);
13949 CONVERT_ARG_HANDLE_CHECKED(String, type, 1); 13949 CONVERT_ARG_HANDLE_CHECKED(String, type, 1);
13950 CONVERT_ARG_HANDLE_CHECKED(JSObject, impl, 2); 13950 CONVERT_ARG_HANDLE_CHECKED(JSObject, impl, 2);
13951 13951
13952 Handle<String> marker = isolate->factory()->intl_initialized_marker_string(); 13952 Handle<String> marker = isolate->factory()->intl_initialized_marker_string();
13953 JSObject::SetHiddenProperty(input, marker, type); 13953 JSObject::SetHiddenProperty(input, marker, type);
13954 13954
13955 marker = isolate->factory()->intl_impl_object_string(); 13955 marker = isolate->factory()->intl_impl_object_string();
13956 JSObject::SetHiddenProperty(input, marker, impl); 13956 JSObject::SetHiddenProperty(input, marker, impl);
13957 13957
13958 return isolate->heap()->undefined_value(); 13958 return isolate->heap()->undefined_value();
13959 } 13959 }
13960 13960
13961 13961
13962 RUNTIME_FUNCTION(Runtime_GetImplFromInitializedIntlObject) { 13962 RUNTIME_FUNCTION(Runtime_GetImplFromInitializedIntlObject) {
13963 HandleScope scope(isolate); 13963 HandleScope scope(isolate);
13964 13964
13965 ASSERT(args.length() == 1); 13965 DCHECK(args.length() == 1);
13966 13966
13967 CONVERT_ARG_HANDLE_CHECKED(Object, input, 0); 13967 CONVERT_ARG_HANDLE_CHECKED(Object, input, 0);
13968 13968
13969 if (!input->IsJSObject()) { 13969 if (!input->IsJSObject()) {
13970 Vector< Handle<Object> > arguments = HandleVector(&input, 1); 13970 Vector< Handle<Object> > arguments = HandleVector(&input, 1);
13971 Handle<Object> type_error = 13971 Handle<Object> type_error =
13972 isolate->factory()->NewTypeError("not_intl_object", arguments); 13972 isolate->factory()->NewTypeError("not_intl_object", arguments);
13973 return isolate->Throw(*type_error); 13973 return isolate->Throw(*type_error);
13974 } 13974 }
13975 13975
13976 Handle<JSObject> obj = Handle<JSObject>::cast(input); 13976 Handle<JSObject> obj = Handle<JSObject>::cast(input);
13977 13977
13978 Handle<String> marker = isolate->factory()->intl_impl_object_string(); 13978 Handle<String> marker = isolate->factory()->intl_impl_object_string();
13979 Handle<Object> impl(obj->GetHiddenProperty(marker), isolate); 13979 Handle<Object> impl(obj->GetHiddenProperty(marker), isolate);
13980 if (impl->IsTheHole()) { 13980 if (impl->IsTheHole()) {
13981 Vector< Handle<Object> > arguments = HandleVector(&obj, 1); 13981 Vector< Handle<Object> > arguments = HandleVector(&obj, 1);
13982 Handle<Object> type_error = 13982 Handle<Object> type_error =
13983 isolate->factory()->NewTypeError("not_intl_object", arguments); 13983 isolate->factory()->NewTypeError("not_intl_object", arguments);
13984 return isolate->Throw(*type_error); 13984 return isolate->Throw(*type_error);
13985 } 13985 }
13986 return *impl; 13986 return *impl;
13987 } 13987 }
13988 13988
13989 13989
13990 RUNTIME_FUNCTION(Runtime_CreateDateTimeFormat) { 13990 RUNTIME_FUNCTION(Runtime_CreateDateTimeFormat) {
13991 HandleScope scope(isolate); 13991 HandleScope scope(isolate);
13992 13992
13993 ASSERT(args.length() == 3); 13993 DCHECK(args.length() == 3);
13994 13994
13995 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); 13995 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0);
13996 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); 13996 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1);
13997 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); 13997 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
13998 13998
13999 Handle<ObjectTemplateInfo> date_format_template = 13999 Handle<ObjectTemplateInfo> date_format_template =
14000 I18N::GetTemplate(isolate); 14000 I18N::GetTemplate(isolate);
14001 14001
14002 // Create an empty object wrapper. 14002 // Create an empty object wrapper.
14003 Handle<JSObject> local_object; 14003 Handle<JSObject> local_object;
(...skipping 19 matching lines...) Expand all
14023 GlobalHandles::MakeWeak(wrapper.location(), 14023 GlobalHandles::MakeWeak(wrapper.location(),
14024 reinterpret_cast<void*>(wrapper.location()), 14024 reinterpret_cast<void*>(wrapper.location()),
14025 DateFormat::DeleteDateFormat); 14025 DateFormat::DeleteDateFormat);
14026 return *local_object; 14026 return *local_object;
14027 } 14027 }
14028 14028
14029 14029
14030 RUNTIME_FUNCTION(Runtime_InternalDateFormat) { 14030 RUNTIME_FUNCTION(Runtime_InternalDateFormat) {
14031 HandleScope scope(isolate); 14031 HandleScope scope(isolate);
14032 14032
14033 ASSERT(args.length() == 2); 14033 DCHECK(args.length() == 2);
14034 14034
14035 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); 14035 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0);
14036 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 1); 14036 CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 1);
14037 14037
14038 Handle<Object> value; 14038 Handle<Object> value;
14039 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 14039 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
14040 isolate, value, Execution::ToNumber(isolate, date)); 14040 isolate, value, Execution::ToNumber(isolate, date));
14041 14041
14042 icu::SimpleDateFormat* date_format = 14042 icu::SimpleDateFormat* date_format =
14043 DateFormat::UnpackDateFormat(isolate, date_format_holder); 14043 DateFormat::UnpackDateFormat(isolate, date_format_holder);
14044 if (!date_format) return isolate->ThrowIllegalOperation(); 14044 if (!date_format) return isolate->ThrowIllegalOperation();
14045 14045
14046 icu::UnicodeString result; 14046 icu::UnicodeString result;
14047 date_format->format(value->Number(), result); 14047 date_format->format(value->Number(), result);
14048 14048
14049 Handle<String> result_str; 14049 Handle<String> result_str;
14050 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 14050 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
14051 isolate, result_str, 14051 isolate, result_str,
14052 isolate->factory()->NewStringFromTwoByte( 14052 isolate->factory()->NewStringFromTwoByte(
14053 Vector<const uint16_t>( 14053 Vector<const uint16_t>(
14054 reinterpret_cast<const uint16_t*>(result.getBuffer()), 14054 reinterpret_cast<const uint16_t*>(result.getBuffer()),
14055 result.length()))); 14055 result.length())));
14056 return *result_str; 14056 return *result_str;
14057 } 14057 }
14058 14058
14059 14059
14060 RUNTIME_FUNCTION(Runtime_InternalDateParse) { 14060 RUNTIME_FUNCTION(Runtime_InternalDateParse) {
14061 HandleScope scope(isolate); 14061 HandleScope scope(isolate);
14062 14062
14063 ASSERT(args.length() == 2); 14063 DCHECK(args.length() == 2);
14064 14064
14065 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0); 14065 CONVERT_ARG_HANDLE_CHECKED(JSObject, date_format_holder, 0);
14066 CONVERT_ARG_HANDLE_CHECKED(String, date_string, 1); 14066 CONVERT_ARG_HANDLE_CHECKED(String, date_string, 1);
14067 14067
14068 v8::String::Utf8Value utf8_date(v8::Utils::ToLocal(date_string)); 14068 v8::String::Utf8Value utf8_date(v8::Utils::ToLocal(date_string));
14069 icu::UnicodeString u_date(icu::UnicodeString::fromUTF8(*utf8_date)); 14069 icu::UnicodeString u_date(icu::UnicodeString::fromUTF8(*utf8_date));
14070 icu::SimpleDateFormat* date_format = 14070 icu::SimpleDateFormat* date_format =
14071 DateFormat::UnpackDateFormat(isolate, date_format_holder); 14071 DateFormat::UnpackDateFormat(isolate, date_format_holder);
14072 if (!date_format) return isolate->ThrowIllegalOperation(); 14072 if (!date_format) return isolate->ThrowIllegalOperation();
14073 14073
14074 UErrorCode status = U_ZERO_ERROR; 14074 UErrorCode status = U_ZERO_ERROR;
14075 UDate date = date_format->parse(u_date, status); 14075 UDate date = date_format->parse(u_date, status);
14076 if (U_FAILURE(status)) return isolate->heap()->undefined_value(); 14076 if (U_FAILURE(status)) return isolate->heap()->undefined_value();
14077 14077
14078 Handle<Object> result; 14078 Handle<Object> result;
14079 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 14079 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
14080 isolate, result, 14080 isolate, result,
14081 Execution::NewDate(isolate, static_cast<double>(date))); 14081 Execution::NewDate(isolate, static_cast<double>(date)));
14082 ASSERT(result->IsJSDate()); 14082 DCHECK(result->IsJSDate());
14083 return *result; 14083 return *result;
14084 } 14084 }
14085 14085
14086 14086
14087 RUNTIME_FUNCTION(Runtime_CreateNumberFormat) { 14087 RUNTIME_FUNCTION(Runtime_CreateNumberFormat) {
14088 HandleScope scope(isolate); 14088 HandleScope scope(isolate);
14089 14089
14090 ASSERT(args.length() == 3); 14090 DCHECK(args.length() == 3);
14091 14091
14092 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); 14092 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0);
14093 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); 14093 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1);
14094 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); 14094 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
14095 14095
14096 Handle<ObjectTemplateInfo> number_format_template = 14096 Handle<ObjectTemplateInfo> number_format_template =
14097 I18N::GetTemplate(isolate); 14097 I18N::GetTemplate(isolate);
14098 14098
14099 // Create an empty object wrapper. 14099 // Create an empty object wrapper.
14100 Handle<JSObject> local_object; 14100 Handle<JSObject> local_object;
(...skipping 18 matching lines...) Expand all
14119 GlobalHandles::MakeWeak(wrapper.location(), 14119 GlobalHandles::MakeWeak(wrapper.location(),
14120 reinterpret_cast<void*>(wrapper.location()), 14120 reinterpret_cast<void*>(wrapper.location()),
14121 NumberFormat::DeleteNumberFormat); 14121 NumberFormat::DeleteNumberFormat);
14122 return *local_object; 14122 return *local_object;
14123 } 14123 }
14124 14124
14125 14125
14126 RUNTIME_FUNCTION(Runtime_InternalNumberFormat) { 14126 RUNTIME_FUNCTION(Runtime_InternalNumberFormat) {
14127 HandleScope scope(isolate); 14127 HandleScope scope(isolate);
14128 14128
14129 ASSERT(args.length() == 2); 14129 DCHECK(args.length() == 2);
14130 14130
14131 CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0); 14131 CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0);
14132 CONVERT_ARG_HANDLE_CHECKED(Object, number, 1); 14132 CONVERT_ARG_HANDLE_CHECKED(Object, number, 1);
14133 14133
14134 Handle<Object> value; 14134 Handle<Object> value;
14135 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 14135 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
14136 isolate, value, Execution::ToNumber(isolate, number)); 14136 isolate, value, Execution::ToNumber(isolate, number));
14137 14137
14138 icu::DecimalFormat* number_format = 14138 icu::DecimalFormat* number_format =
14139 NumberFormat::UnpackNumberFormat(isolate, number_format_holder); 14139 NumberFormat::UnpackNumberFormat(isolate, number_format_holder);
14140 if (!number_format) return isolate->ThrowIllegalOperation(); 14140 if (!number_format) return isolate->ThrowIllegalOperation();
14141 14141
14142 icu::UnicodeString result; 14142 icu::UnicodeString result;
14143 number_format->format(value->Number(), result); 14143 number_format->format(value->Number(), result);
14144 14144
14145 Handle<String> result_str; 14145 Handle<String> result_str;
14146 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 14146 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
14147 isolate, result_str, 14147 isolate, result_str,
14148 isolate->factory()->NewStringFromTwoByte( 14148 isolate->factory()->NewStringFromTwoByte(
14149 Vector<const uint16_t>( 14149 Vector<const uint16_t>(
14150 reinterpret_cast<const uint16_t*>(result.getBuffer()), 14150 reinterpret_cast<const uint16_t*>(result.getBuffer()),
14151 result.length()))); 14151 result.length())));
14152 return *result_str; 14152 return *result_str;
14153 } 14153 }
14154 14154
14155 14155
14156 RUNTIME_FUNCTION(Runtime_InternalNumberParse) { 14156 RUNTIME_FUNCTION(Runtime_InternalNumberParse) {
14157 HandleScope scope(isolate); 14157 HandleScope scope(isolate);
14158 14158
14159 ASSERT(args.length() == 2); 14159 DCHECK(args.length() == 2);
14160 14160
14161 CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0); 14161 CONVERT_ARG_HANDLE_CHECKED(JSObject, number_format_holder, 0);
14162 CONVERT_ARG_HANDLE_CHECKED(String, number_string, 1); 14162 CONVERT_ARG_HANDLE_CHECKED(String, number_string, 1);
14163 14163
14164 v8::String::Utf8Value utf8_number(v8::Utils::ToLocal(number_string)); 14164 v8::String::Utf8Value utf8_number(v8::Utils::ToLocal(number_string));
14165 icu::UnicodeString u_number(icu::UnicodeString::fromUTF8(*utf8_number)); 14165 icu::UnicodeString u_number(icu::UnicodeString::fromUTF8(*utf8_number));
14166 icu::DecimalFormat* number_format = 14166 icu::DecimalFormat* number_format =
14167 NumberFormat::UnpackNumberFormat(isolate, number_format_holder); 14167 NumberFormat::UnpackNumberFormat(isolate, number_format_holder);
14168 if (!number_format) return isolate->ThrowIllegalOperation(); 14168 if (!number_format) return isolate->ThrowIllegalOperation();
14169 14169
(...skipping 18 matching lines...) Expand all
14188 static_cast<double>(result.getInt64())); 14188 static_cast<double>(result.getInt64()));
14189 default: 14189 default:
14190 return isolate->heap()->undefined_value(); 14190 return isolate->heap()->undefined_value();
14191 } 14191 }
14192 } 14192 }
14193 14193
14194 14194
14195 RUNTIME_FUNCTION(Runtime_CreateCollator) { 14195 RUNTIME_FUNCTION(Runtime_CreateCollator) {
14196 HandleScope scope(isolate); 14196 HandleScope scope(isolate);
14197 14197
14198 ASSERT(args.length() == 3); 14198 DCHECK(args.length() == 3);
14199 14199
14200 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); 14200 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0);
14201 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); 14201 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1);
14202 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); 14202 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
14203 14203
14204 Handle<ObjectTemplateInfo> collator_template = I18N::GetTemplate(isolate); 14204 Handle<ObjectTemplateInfo> collator_template = I18N::GetTemplate(isolate);
14205 14205
14206 // Create an empty object wrapper. 14206 // Create an empty object wrapper.
14207 Handle<JSObject> local_object; 14207 Handle<JSObject> local_object;
14208 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 14208 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
(...skipping 16 matching lines...) Expand all
14225 GlobalHandles::MakeWeak(wrapper.location(), 14225 GlobalHandles::MakeWeak(wrapper.location(),
14226 reinterpret_cast<void*>(wrapper.location()), 14226 reinterpret_cast<void*>(wrapper.location()),
14227 Collator::DeleteCollator); 14227 Collator::DeleteCollator);
14228 return *local_object; 14228 return *local_object;
14229 } 14229 }
14230 14230
14231 14231
14232 RUNTIME_FUNCTION(Runtime_InternalCompare) { 14232 RUNTIME_FUNCTION(Runtime_InternalCompare) {
14233 HandleScope scope(isolate); 14233 HandleScope scope(isolate);
14234 14234
14235 ASSERT(args.length() == 3); 14235 DCHECK(args.length() == 3);
14236 14236
14237 CONVERT_ARG_HANDLE_CHECKED(JSObject, collator_holder, 0); 14237 CONVERT_ARG_HANDLE_CHECKED(JSObject, collator_holder, 0);
14238 CONVERT_ARG_HANDLE_CHECKED(String, string1, 1); 14238 CONVERT_ARG_HANDLE_CHECKED(String, string1, 1);
14239 CONVERT_ARG_HANDLE_CHECKED(String, string2, 2); 14239 CONVERT_ARG_HANDLE_CHECKED(String, string2, 2);
14240 14240
14241 icu::Collator* collator = Collator::UnpackCollator(isolate, collator_holder); 14241 icu::Collator* collator = Collator::UnpackCollator(isolate, collator_holder);
14242 if (!collator) return isolate->ThrowIllegalOperation(); 14242 if (!collator) return isolate->ThrowIllegalOperation();
14243 14243
14244 v8::String::Value string_value1(v8::Utils::ToLocal(string1)); 14244 v8::String::Value string_value1(v8::Utils::ToLocal(string1));
14245 v8::String::Value string_value2(v8::Utils::ToLocal(string2)); 14245 v8::String::Value string_value2(v8::Utils::ToLocal(string2));
14246 const UChar* u_string1 = reinterpret_cast<const UChar*>(*string_value1); 14246 const UChar* u_string1 = reinterpret_cast<const UChar*>(*string_value1);
14247 const UChar* u_string2 = reinterpret_cast<const UChar*>(*string_value2); 14247 const UChar* u_string2 = reinterpret_cast<const UChar*>(*string_value2);
14248 UErrorCode status = U_ZERO_ERROR; 14248 UErrorCode status = U_ZERO_ERROR;
14249 UCollationResult result = collator->compare(u_string1, 14249 UCollationResult result = collator->compare(u_string1,
14250 string_value1.length(), 14250 string_value1.length(),
14251 u_string2, 14251 u_string2,
14252 string_value2.length(), 14252 string_value2.length(),
14253 status); 14253 status);
14254 if (U_FAILURE(status)) return isolate->ThrowIllegalOperation(); 14254 if (U_FAILURE(status)) return isolate->ThrowIllegalOperation();
14255 14255
14256 return *isolate->factory()->NewNumberFromInt(result); 14256 return *isolate->factory()->NewNumberFromInt(result);
14257 } 14257 }
14258 14258
14259 14259
14260 RUNTIME_FUNCTION(Runtime_StringNormalize) { 14260 RUNTIME_FUNCTION(Runtime_StringNormalize) {
14261 HandleScope scope(isolate); 14261 HandleScope scope(isolate);
14262 static const UNormalizationMode normalizationForms[] = 14262 static const UNormalizationMode normalizationForms[] =
14263 { UNORM_NFC, UNORM_NFD, UNORM_NFKC, UNORM_NFKD }; 14263 { UNORM_NFC, UNORM_NFD, UNORM_NFKC, UNORM_NFKD };
14264 14264
14265 ASSERT(args.length() == 2); 14265 DCHECK(args.length() == 2);
14266 14266
14267 CONVERT_ARG_HANDLE_CHECKED(String, stringValue, 0); 14267 CONVERT_ARG_HANDLE_CHECKED(String, stringValue, 0);
14268 CONVERT_NUMBER_CHECKED(int, form_id, Int32, args[1]); 14268 CONVERT_NUMBER_CHECKED(int, form_id, Int32, args[1]);
14269 RUNTIME_ASSERT(form_id >= 0 && 14269 RUNTIME_ASSERT(form_id >= 0 &&
14270 static_cast<size_t>(form_id) < ARRAY_SIZE(normalizationForms)); 14270 static_cast<size_t>(form_id) < ARRAY_SIZE(normalizationForms));
14271 14271
14272 v8::String::Value string_value(v8::Utils::ToLocal(stringValue)); 14272 v8::String::Value string_value(v8::Utils::ToLocal(stringValue));
14273 const UChar* u_value = reinterpret_cast<const UChar*>(*string_value); 14273 const UChar* u_value = reinterpret_cast<const UChar*>(*string_value);
14274 14274
14275 // TODO(mnita): check Normalizer2 (not available in ICU 46) 14275 // TODO(mnita): check Normalizer2 (not available in ICU 46)
(...skipping 12 matching lines...) Expand all
14288 Vector<const uint16_t>( 14288 Vector<const uint16_t>(
14289 reinterpret_cast<const uint16_t*>(result.getBuffer()), 14289 reinterpret_cast<const uint16_t*>(result.getBuffer()),
14290 result.length()))); 14290 result.length())));
14291 return *result_str; 14291 return *result_str;
14292 } 14292 }
14293 14293
14294 14294
14295 RUNTIME_FUNCTION(Runtime_CreateBreakIterator) { 14295 RUNTIME_FUNCTION(Runtime_CreateBreakIterator) {
14296 HandleScope scope(isolate); 14296 HandleScope scope(isolate);
14297 14297
14298 ASSERT(args.length() == 3); 14298 DCHECK(args.length() == 3);
14299 14299
14300 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0); 14300 CONVERT_ARG_HANDLE_CHECKED(String, locale, 0);
14301 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1); 14301 CONVERT_ARG_HANDLE_CHECKED(JSObject, options, 1);
14302 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2); 14302 CONVERT_ARG_HANDLE_CHECKED(JSObject, resolved, 2);
14303 14303
14304 Handle<ObjectTemplateInfo> break_iterator_template = 14304 Handle<ObjectTemplateInfo> break_iterator_template =
14305 I18N::GetTemplate2(isolate); 14305 I18N::GetTemplate2(isolate);
14306 14306
14307 // Create an empty object wrapper. 14307 // Create an empty object wrapper.
14308 Handle<JSObject> local_object; 14308 Handle<JSObject> local_object;
(...skipping 22 matching lines...) Expand all
14331 GlobalHandles::MakeWeak(wrapper.location(), 14331 GlobalHandles::MakeWeak(wrapper.location(),
14332 reinterpret_cast<void*>(wrapper.location()), 14332 reinterpret_cast<void*>(wrapper.location()),
14333 BreakIterator::DeleteBreakIterator); 14333 BreakIterator::DeleteBreakIterator);
14334 return *local_object; 14334 return *local_object;
14335 } 14335 }
14336 14336
14337 14337
14338 RUNTIME_FUNCTION(Runtime_BreakIteratorAdoptText) { 14338 RUNTIME_FUNCTION(Runtime_BreakIteratorAdoptText) {
14339 HandleScope scope(isolate); 14339 HandleScope scope(isolate);
14340 14340
14341 ASSERT(args.length() == 2); 14341 DCHECK(args.length() == 2);
14342 14342
14343 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); 14343 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0);
14344 CONVERT_ARG_HANDLE_CHECKED(String, text, 1); 14344 CONVERT_ARG_HANDLE_CHECKED(String, text, 1);
14345 14345
14346 icu::BreakIterator* break_iterator = 14346 icu::BreakIterator* break_iterator =
14347 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); 14347 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder);
14348 if (!break_iterator) return isolate->ThrowIllegalOperation(); 14348 if (!break_iterator) return isolate->ThrowIllegalOperation();
14349 14349
14350 icu::UnicodeString* u_text = reinterpret_cast<icu::UnicodeString*>( 14350 icu::UnicodeString* u_text = reinterpret_cast<icu::UnicodeString*>(
14351 break_iterator_holder->GetInternalField(1)); 14351 break_iterator_holder->GetInternalField(1));
14352 delete u_text; 14352 delete u_text;
14353 14353
14354 v8::String::Value text_value(v8::Utils::ToLocal(text)); 14354 v8::String::Value text_value(v8::Utils::ToLocal(text));
14355 u_text = new icu::UnicodeString( 14355 u_text = new icu::UnicodeString(
14356 reinterpret_cast<const UChar*>(*text_value), text_value.length()); 14356 reinterpret_cast<const UChar*>(*text_value), text_value.length());
14357 break_iterator_holder->SetInternalField(1, reinterpret_cast<Smi*>(u_text)); 14357 break_iterator_holder->SetInternalField(1, reinterpret_cast<Smi*>(u_text));
14358 14358
14359 break_iterator->setText(*u_text); 14359 break_iterator->setText(*u_text);
14360 14360
14361 return isolate->heap()->undefined_value(); 14361 return isolate->heap()->undefined_value();
14362 } 14362 }
14363 14363
14364 14364
14365 RUNTIME_FUNCTION(Runtime_BreakIteratorFirst) { 14365 RUNTIME_FUNCTION(Runtime_BreakIteratorFirst) {
14366 HandleScope scope(isolate); 14366 HandleScope scope(isolate);
14367 14367
14368 ASSERT(args.length() == 1); 14368 DCHECK(args.length() == 1);
14369 14369
14370 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); 14370 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0);
14371 14371
14372 icu::BreakIterator* break_iterator = 14372 icu::BreakIterator* break_iterator =
14373 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); 14373 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder);
14374 if (!break_iterator) return isolate->ThrowIllegalOperation(); 14374 if (!break_iterator) return isolate->ThrowIllegalOperation();
14375 14375
14376 return *isolate->factory()->NewNumberFromInt(break_iterator->first()); 14376 return *isolate->factory()->NewNumberFromInt(break_iterator->first());
14377 } 14377 }
14378 14378
14379 14379
14380 RUNTIME_FUNCTION(Runtime_BreakIteratorNext) { 14380 RUNTIME_FUNCTION(Runtime_BreakIteratorNext) {
14381 HandleScope scope(isolate); 14381 HandleScope scope(isolate);
14382 14382
14383 ASSERT(args.length() == 1); 14383 DCHECK(args.length() == 1);
14384 14384
14385 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); 14385 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0);
14386 14386
14387 icu::BreakIterator* break_iterator = 14387 icu::BreakIterator* break_iterator =
14388 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); 14388 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder);
14389 if (!break_iterator) return isolate->ThrowIllegalOperation(); 14389 if (!break_iterator) return isolate->ThrowIllegalOperation();
14390 14390
14391 return *isolate->factory()->NewNumberFromInt(break_iterator->next()); 14391 return *isolate->factory()->NewNumberFromInt(break_iterator->next());
14392 } 14392 }
14393 14393
14394 14394
14395 RUNTIME_FUNCTION(Runtime_BreakIteratorCurrent) { 14395 RUNTIME_FUNCTION(Runtime_BreakIteratorCurrent) {
14396 HandleScope scope(isolate); 14396 HandleScope scope(isolate);
14397 14397
14398 ASSERT(args.length() == 1); 14398 DCHECK(args.length() == 1);
14399 14399
14400 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); 14400 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0);
14401 14401
14402 icu::BreakIterator* break_iterator = 14402 icu::BreakIterator* break_iterator =
14403 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); 14403 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder);
14404 if (!break_iterator) return isolate->ThrowIllegalOperation(); 14404 if (!break_iterator) return isolate->ThrowIllegalOperation();
14405 14405
14406 return *isolate->factory()->NewNumberFromInt(break_iterator->current()); 14406 return *isolate->factory()->NewNumberFromInt(break_iterator->current());
14407 } 14407 }
14408 14408
14409 14409
14410 RUNTIME_FUNCTION(Runtime_BreakIteratorBreakType) { 14410 RUNTIME_FUNCTION(Runtime_BreakIteratorBreakType) {
14411 HandleScope scope(isolate); 14411 HandleScope scope(isolate);
14412 14412
14413 ASSERT(args.length() == 1); 14413 DCHECK(args.length() == 1);
14414 14414
14415 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0); 14415 CONVERT_ARG_HANDLE_CHECKED(JSObject, break_iterator_holder, 0);
14416 14416
14417 icu::BreakIterator* break_iterator = 14417 icu::BreakIterator* break_iterator =
14418 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder); 14418 BreakIterator::UnpackBreakIterator(isolate, break_iterator_holder);
14419 if (!break_iterator) return isolate->ThrowIllegalOperation(); 14419 if (!break_iterator) return isolate->ThrowIllegalOperation();
14420 14420
14421 // TODO(cira): Remove cast once ICU fixes base BreakIterator class. 14421 // TODO(cira): Remove cast once ICU fixes base BreakIterator class.
14422 icu::RuleBasedBreakIterator* rule_based_iterator = 14422 icu::RuleBasedBreakIterator* rule_based_iterator =
14423 static_cast<icu::RuleBasedBreakIterator*>(break_iterator); 14423 static_cast<icu::RuleBasedBreakIterator*>(break_iterator);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
14473 return Script::GetWrapper(script); 14473 return Script::GetWrapper(script);
14474 } 14474 }
14475 14475
14476 14476
14477 // Get the script object from script data. NOTE: Regarding performance 14477 // Get the script object from script data. NOTE: Regarding performance
14478 // see the NOTE for GetScriptFromScriptData. 14478 // see the NOTE for GetScriptFromScriptData.
14479 // args[0]: script data for the script to find the source for 14479 // args[0]: script data for the script to find the source for
14480 RUNTIME_FUNCTION(Runtime_GetScript) { 14480 RUNTIME_FUNCTION(Runtime_GetScript) {
14481 HandleScope scope(isolate); 14481 HandleScope scope(isolate);
14482 14482
14483 ASSERT(args.length() == 1); 14483 DCHECK(args.length() == 1);
14484 14484
14485 CONVERT_ARG_CHECKED(String, script_name, 0); 14485 CONVERT_ARG_CHECKED(String, script_name, 0);
14486 14486
14487 // Find the requested script. 14487 // Find the requested script.
14488 Handle<Object> result = 14488 Handle<Object> result =
14489 Runtime_GetScriptFromScriptName(Handle<String>(script_name)); 14489 Runtime_GetScriptFromScriptName(Handle<String>(script_name));
14490 return *result; 14490 return *result;
14491 } 14491 }
14492 14492
14493 14493
14494 // Collect the raw data for a stack trace. Returns an array of 4 14494 // Collect the raw data for a stack trace. Returns an array of 4
14495 // element segments each containing a receiver, function, code and 14495 // element segments each containing a receiver, function, code and
14496 // native code offset. 14496 // native code offset.
14497 RUNTIME_FUNCTION(Runtime_CollectStackTrace) { 14497 RUNTIME_FUNCTION(Runtime_CollectStackTrace) {
14498 HandleScope scope(isolate); 14498 HandleScope scope(isolate);
14499 ASSERT(args.length() == 2); 14499 DCHECK(args.length() == 2);
14500 CONVERT_ARG_HANDLE_CHECKED(JSObject, error_object, 0); 14500 CONVERT_ARG_HANDLE_CHECKED(JSObject, error_object, 0);
14501 CONVERT_ARG_HANDLE_CHECKED(Object, caller, 1); 14501 CONVERT_ARG_HANDLE_CHECKED(Object, caller, 1);
14502 14502
14503 if (!isolate->bootstrapper()->IsActive()) { 14503 if (!isolate->bootstrapper()->IsActive()) {
14504 // Optionally capture a more detailed stack trace for the message. 14504 // Optionally capture a more detailed stack trace for the message.
14505 isolate->CaptureAndSetDetailedStackTrace(error_object); 14505 isolate->CaptureAndSetDetailedStackTrace(error_object);
14506 // Capture a simple stack trace for the stack property. 14506 // Capture a simple stack trace for the stack property.
14507 isolate->CaptureAndSetSimpleStackTrace(error_object, caller); 14507 isolate->CaptureAndSetSimpleStackTrace(error_object, caller);
14508 } 14508 }
14509 return isolate->heap()->undefined_value(); 14509 return isolate->heap()->undefined_value();
14510 } 14510 }
14511 14511
14512 14512
14513 // Returns V8 version as a string. 14513 // Returns V8 version as a string.
14514 RUNTIME_FUNCTION(Runtime_GetV8Version) { 14514 RUNTIME_FUNCTION(Runtime_GetV8Version) {
14515 HandleScope scope(isolate); 14515 HandleScope scope(isolate);
14516 ASSERT(args.length() == 0); 14516 DCHECK(args.length() == 0);
14517 14517
14518 const char* version_string = v8::V8::GetVersion(); 14518 const char* version_string = v8::V8::GetVersion();
14519 14519
14520 return *isolate->factory()->NewStringFromAsciiChecked(version_string); 14520 return *isolate->factory()->NewStringFromAsciiChecked(version_string);
14521 } 14521 }
14522 14522
14523 14523
14524 RUNTIME_FUNCTION(Runtime_Abort) { 14524 RUNTIME_FUNCTION(Runtime_Abort) {
14525 SealHandleScope shs(isolate); 14525 SealHandleScope shs(isolate);
14526 ASSERT(args.length() == 1); 14526 DCHECK(args.length() == 1);
14527 CONVERT_SMI_ARG_CHECKED(message_id, 0); 14527 CONVERT_SMI_ARG_CHECKED(message_id, 0);
14528 const char* message = GetBailoutReason( 14528 const char* message = GetBailoutReason(
14529 static_cast<BailoutReason>(message_id)); 14529 static_cast<BailoutReason>(message_id));
14530 base::OS::PrintError("abort: %s\n", message); 14530 base::OS::PrintError("abort: %s\n", message);
14531 isolate->PrintStack(stderr); 14531 isolate->PrintStack(stderr);
14532 base::OS::Abort(); 14532 base::OS::Abort();
14533 UNREACHABLE(); 14533 UNREACHABLE();
14534 return NULL; 14534 return NULL;
14535 } 14535 }
14536 14536
14537 14537
14538 RUNTIME_FUNCTION(Runtime_AbortJS) { 14538 RUNTIME_FUNCTION(Runtime_AbortJS) {
14539 HandleScope scope(isolate); 14539 HandleScope scope(isolate);
14540 ASSERT(args.length() == 1); 14540 DCHECK(args.length() == 1);
14541 CONVERT_ARG_HANDLE_CHECKED(String, message, 0); 14541 CONVERT_ARG_HANDLE_CHECKED(String, message, 0);
14542 base::OS::PrintError("abort: %s\n", message->ToCString().get()); 14542 base::OS::PrintError("abort: %s\n", message->ToCString().get());
14543 isolate->PrintStack(stderr); 14543 isolate->PrintStack(stderr);
14544 base::OS::Abort(); 14544 base::OS::Abort();
14545 UNREACHABLE(); 14545 UNREACHABLE();
14546 return NULL; 14546 return NULL;
14547 } 14547 }
14548 14548
14549 14549
14550 RUNTIME_FUNCTION(Runtime_FlattenString) { 14550 RUNTIME_FUNCTION(Runtime_FlattenString) {
14551 HandleScope scope(isolate); 14551 HandleScope scope(isolate);
14552 ASSERT(args.length() == 1); 14552 DCHECK(args.length() == 1);
14553 CONVERT_ARG_HANDLE_CHECKED(String, str, 0); 14553 CONVERT_ARG_HANDLE_CHECKED(String, str, 0);
14554 return *String::Flatten(str); 14554 return *String::Flatten(str);
14555 } 14555 }
14556 14556
14557 14557
14558 RUNTIME_FUNCTION(Runtime_NotifyContextDisposed) { 14558 RUNTIME_FUNCTION(Runtime_NotifyContextDisposed) {
14559 HandleScope scope(isolate); 14559 HandleScope scope(isolate);
14560 ASSERT(args.length() == 0); 14560 DCHECK(args.length() == 0);
14561 isolate->heap()->NotifyContextDisposed(); 14561 isolate->heap()->NotifyContextDisposed();
14562 return isolate->heap()->undefined_value(); 14562 return isolate->heap()->undefined_value();
14563 } 14563 }
14564 14564
14565 14565
14566 RUNTIME_FUNCTION(Runtime_LoadMutableDouble) { 14566 RUNTIME_FUNCTION(Runtime_LoadMutableDouble) {
14567 HandleScope scope(isolate); 14567 HandleScope scope(isolate);
14568 ASSERT(args.length() == 2); 14568 DCHECK(args.length() == 2);
14569 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 14569 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
14570 CONVERT_ARG_HANDLE_CHECKED(Smi, index, 1); 14570 CONVERT_ARG_HANDLE_CHECKED(Smi, index, 1);
14571 RUNTIME_ASSERT((index->value() & 1) == 1); 14571 RUNTIME_ASSERT((index->value() & 1) == 1);
14572 FieldIndex field_index = 14572 FieldIndex field_index =
14573 FieldIndex::ForLoadByFieldIndex(object->map(), index->value()); 14573 FieldIndex::ForLoadByFieldIndex(object->map(), index->value());
14574 if (field_index.is_inobject()) { 14574 if (field_index.is_inobject()) {
14575 RUNTIME_ASSERT(field_index.property_index() < 14575 RUNTIME_ASSERT(field_index.property_index() <
14576 object->map()->inobject_properties()); 14576 object->map()->inobject_properties());
14577 } else { 14577 } else {
14578 RUNTIME_ASSERT(field_index.outobject_array_index() < 14578 RUNTIME_ASSERT(field_index.outobject_array_index() <
14579 object->properties()->length()); 14579 object->properties()->length());
14580 } 14580 }
14581 Handle<Object> raw_value(object->RawFastPropertyAt(field_index), isolate); 14581 Handle<Object> raw_value(object->RawFastPropertyAt(field_index), isolate);
14582 RUNTIME_ASSERT(raw_value->IsMutableHeapNumber()); 14582 RUNTIME_ASSERT(raw_value->IsMutableHeapNumber());
14583 return *Object::WrapForRead(isolate, raw_value, Representation::Double()); 14583 return *Object::WrapForRead(isolate, raw_value, Representation::Double());
14584 } 14584 }
14585 14585
14586 14586
14587 RUNTIME_FUNCTION(Runtime_TryMigrateInstance) { 14587 RUNTIME_FUNCTION(Runtime_TryMigrateInstance) {
14588 HandleScope scope(isolate); 14588 HandleScope scope(isolate);
14589 ASSERT(args.length() == 1); 14589 DCHECK(args.length() == 1);
14590 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0); 14590 CONVERT_ARG_HANDLE_CHECKED(Object, object, 0);
14591 if (!object->IsJSObject()) return Smi::FromInt(0); 14591 if (!object->IsJSObject()) return Smi::FromInt(0);
14592 Handle<JSObject> js_object = Handle<JSObject>::cast(object); 14592 Handle<JSObject> js_object = Handle<JSObject>::cast(object);
14593 if (!js_object->map()->is_deprecated()) return Smi::FromInt(0); 14593 if (!js_object->map()->is_deprecated()) return Smi::FromInt(0);
14594 // This call must not cause lazy deopts, because it's called from deferred 14594 // This call must not cause lazy deopts, because it's called from deferred
14595 // code where we can't handle lazy deopts for lack of a suitable bailout 14595 // code where we can't handle lazy deopts for lack of a suitable bailout
14596 // ID. So we just try migration and signal failure if necessary, 14596 // ID. So we just try migration and signal failure if necessary,
14597 // which will also trigger a deopt. 14597 // which will also trigger a deopt.
14598 if (!JSObject::TryMigrateInstance(js_object)) return Smi::FromInt(0); 14598 if (!JSObject::TryMigrateInstance(js_object)) return Smi::FromInt(0);
14599 return *object; 14599 return *object;
(...skipping 20 matching lines...) Expand all
14620 i >= JSFunctionResultCache::kEntriesIndex; 14620 i >= JSFunctionResultCache::kEntriesIndex;
14621 i -= 2) { 14621 i -= 2) {
14622 o = cache->get(i); 14622 o = cache->get(i);
14623 if (o == key) { 14623 if (o == key) {
14624 cache->set_finger_index(i); 14624 cache->set_finger_index(i);
14625 return cache->get(i + 1); 14625 return cache->get(i + 1);
14626 } 14626 }
14627 } 14627 }
14628 14628
14629 int size = cache->size(); 14629 int size = cache->size();
14630 ASSERT(size <= cache->length()); 14630 DCHECK(size <= cache->length());
14631 14631
14632 for (int i = size - 2; i > finger_index; i -= 2) { 14632 for (int i = size - 2; i > finger_index; i -= 2) {
14633 o = cache->get(i); 14633 o = cache->get(i);
14634 if (o == key) { 14634 if (o == key) {
14635 cache->set_finger_index(i); 14635 cache->set_finger_index(i);
14636 return cache->get(i + 1); 14636 return cache->get(i + 1);
14637 } 14637 }
14638 } 14638 }
14639 } 14639 }
14640 14640
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
14672 if (size < cache_handle->length()) { 14672 if (size < cache_handle->length()) {
14673 cache_handle->set_size(size + JSFunctionResultCache::kEntrySize); 14673 cache_handle->set_size(size + JSFunctionResultCache::kEntrySize);
14674 index = size; 14674 index = size;
14675 } else { 14675 } else {
14676 index = finger_index + JSFunctionResultCache::kEntrySize; 14676 index = finger_index + JSFunctionResultCache::kEntrySize;
14677 if (index == cache_handle->length()) { 14677 if (index == cache_handle->length()) {
14678 index = JSFunctionResultCache::kEntriesIndex; 14678 index = JSFunctionResultCache::kEntriesIndex;
14679 } 14679 }
14680 } 14680 }
14681 14681
14682 ASSERT(index % 2 == 0); 14682 DCHECK(index % 2 == 0);
14683 ASSERT(index >= JSFunctionResultCache::kEntriesIndex); 14683 DCHECK(index >= JSFunctionResultCache::kEntriesIndex);
14684 ASSERT(index < cache_handle->length()); 14684 DCHECK(index < cache_handle->length());
14685 14685
14686 cache_handle->set(index, *key_handle); 14686 cache_handle->set(index, *key_handle);
14687 cache_handle->set(index + 1, *value); 14687 cache_handle->set(index + 1, *value);
14688 cache_handle->set_finger_index(index); 14688 cache_handle->set_finger_index(index);
14689 14689
14690 #ifdef VERIFY_HEAP 14690 #ifdef VERIFY_HEAP
14691 if (FLAG_verify_heap) { 14691 if (FLAG_verify_heap) {
14692 cache_handle->JSFunctionResultCacheVerify(); 14692 cache_handle->JSFunctionResultCacheVerify();
14693 } 14693 }
14694 #endif 14694 #endif
14695 14695
14696 return *value; 14696 return *value;
14697 } 14697 }
14698 14698
14699 14699
14700 RUNTIME_FUNCTION(Runtime_MessageGetStartPosition) { 14700 RUNTIME_FUNCTION(Runtime_MessageGetStartPosition) {
14701 SealHandleScope shs(isolate); 14701 SealHandleScope shs(isolate);
14702 ASSERT(args.length() == 1); 14702 DCHECK(args.length() == 1);
14703 CONVERT_ARG_CHECKED(JSMessageObject, message, 0); 14703 CONVERT_ARG_CHECKED(JSMessageObject, message, 0);
14704 return Smi::FromInt(message->start_position()); 14704 return Smi::FromInt(message->start_position());
14705 } 14705 }
14706 14706
14707 14707
14708 RUNTIME_FUNCTION(Runtime_MessageGetScript) { 14708 RUNTIME_FUNCTION(Runtime_MessageGetScript) {
14709 SealHandleScope shs(isolate); 14709 SealHandleScope shs(isolate);
14710 ASSERT(args.length() == 1); 14710 DCHECK(args.length() == 1);
14711 CONVERT_ARG_CHECKED(JSMessageObject, message, 0); 14711 CONVERT_ARG_CHECKED(JSMessageObject, message, 0);
14712 return message->script(); 14712 return message->script();
14713 } 14713 }
14714 14714
14715 14715
14716 #ifdef DEBUG 14716 #ifdef DEBUG
14717 // ListNatives is ONLY used by the fuzz-natives.js in debug mode 14717 // ListNatives is ONLY used by the fuzz-natives.js in debug mode
14718 // Exclude the code in release mode. 14718 // Exclude the code in release mode.
14719 RUNTIME_FUNCTION(Runtime_ListNatives) { 14719 RUNTIME_FUNCTION(Runtime_ListNatives) {
14720 HandleScope scope(isolate); 14720 HandleScope scope(isolate);
14721 ASSERT(args.length() == 0); 14721 DCHECK(args.length() == 0);
14722 #define COUNT_ENTRY(Name, argc, ressize) + 1 14722 #define COUNT_ENTRY(Name, argc, ressize) + 1
14723 int entry_count = 0 14723 int entry_count = 0
14724 RUNTIME_FUNCTION_LIST(COUNT_ENTRY) 14724 RUNTIME_FUNCTION_LIST(COUNT_ENTRY)
14725 INLINE_FUNCTION_LIST(COUNT_ENTRY) 14725 INLINE_FUNCTION_LIST(COUNT_ENTRY)
14726 INLINE_OPTIMIZED_FUNCTION_LIST(COUNT_ENTRY); 14726 INLINE_OPTIMIZED_FUNCTION_LIST(COUNT_ENTRY);
14727 #undef COUNT_ENTRY 14727 #undef COUNT_ENTRY
14728 Factory* factory = isolate->factory(); 14728 Factory* factory = isolate->factory();
14729 Handle<FixedArray> elements = factory->NewFixedArray(entry_count); 14729 Handle<FixedArray> elements = factory->NewFixedArray(entry_count);
14730 int index = 0; 14730 int index = 0;
14731 bool inline_runtime_functions = false; 14731 bool inline_runtime_functions = false;
(...skipping 12 matching lines...) Expand all
14744 pair_elements->set(1, Smi::FromInt(argc)); \ 14744 pair_elements->set(1, Smi::FromInt(argc)); \
14745 Handle<JSArray> pair = factory->NewJSArrayWithElements(pair_elements); \ 14745 Handle<JSArray> pair = factory->NewJSArrayWithElements(pair_elements); \
14746 elements->set(index++, *pair); \ 14746 elements->set(index++, *pair); \
14747 } 14747 }
14748 inline_runtime_functions = false; 14748 inline_runtime_functions = false;
14749 RUNTIME_FUNCTION_LIST(ADD_ENTRY) 14749 RUNTIME_FUNCTION_LIST(ADD_ENTRY)
14750 INLINE_OPTIMIZED_FUNCTION_LIST(ADD_ENTRY) 14750 INLINE_OPTIMIZED_FUNCTION_LIST(ADD_ENTRY)
14751 inline_runtime_functions = true; 14751 inline_runtime_functions = true;
14752 INLINE_FUNCTION_LIST(ADD_ENTRY) 14752 INLINE_FUNCTION_LIST(ADD_ENTRY)
14753 #undef ADD_ENTRY 14753 #undef ADD_ENTRY
14754 ASSERT_EQ(index, entry_count); 14754 DCHECK_EQ(index, entry_count);
14755 Handle<JSArray> result = factory->NewJSArrayWithElements(elements); 14755 Handle<JSArray> result = factory->NewJSArrayWithElements(elements);
14756 return *result; 14756 return *result;
14757 } 14757 }
14758 #endif 14758 #endif
14759 14759
14760 14760
14761 RUNTIME_FUNCTION(Runtime_IS_VAR) { 14761 RUNTIME_FUNCTION(Runtime_IS_VAR) {
14762 UNREACHABLE(); // implemented as macro in the parser 14762 UNREACHABLE(); // implemented as macro in the parser
14763 return NULL; 14763 return NULL;
14764 } 14764 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
14801 return isolate->heap()->ToBoolean(obj->HasFixed##Type##Elements()); \ 14801 return isolate->heap()->ToBoolean(obj->HasFixed##Type##Elements()); \
14802 } 14802 }
14803 14803
14804 TYPED_ARRAYS(FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION) 14804 TYPED_ARRAYS(FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION)
14805 14805
14806 #undef FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION 14806 #undef FIXED_TYPED_ARRAYS_CHECK_RUNTIME_FUNCTION
14807 14807
14808 14808
14809 RUNTIME_FUNCTION(Runtime_HaveSameMap) { 14809 RUNTIME_FUNCTION(Runtime_HaveSameMap) {
14810 SealHandleScope shs(isolate); 14810 SealHandleScope shs(isolate);
14811 ASSERT(args.length() == 2); 14811 DCHECK(args.length() == 2);
14812 CONVERT_ARG_CHECKED(JSObject, obj1, 0); 14812 CONVERT_ARG_CHECKED(JSObject, obj1, 0);
14813 CONVERT_ARG_CHECKED(JSObject, obj2, 1); 14813 CONVERT_ARG_CHECKED(JSObject, obj2, 1);
14814 return isolate->heap()->ToBoolean(obj1->map() == obj2->map()); 14814 return isolate->heap()->ToBoolean(obj1->map() == obj2->map());
14815 } 14815 }
14816 14816
14817 14817
14818 RUNTIME_FUNCTION(Runtime_IsJSGlobalProxy) { 14818 RUNTIME_FUNCTION(Runtime_IsJSGlobalProxy) {
14819 SealHandleScope shs(isolate); 14819 SealHandleScope shs(isolate);
14820 ASSERT(args.length() == 1); 14820 DCHECK(args.length() == 1);
14821 CONVERT_ARG_CHECKED(Object, obj, 0); 14821 CONVERT_ARG_CHECKED(Object, obj, 0);
14822 return isolate->heap()->ToBoolean(obj->IsJSGlobalProxy()); 14822 return isolate->heap()->ToBoolean(obj->IsJSGlobalProxy());
14823 } 14823 }
14824 14824
14825 14825
14826 RUNTIME_FUNCTION(Runtime_IsObserved) { 14826 RUNTIME_FUNCTION(Runtime_IsObserved) {
14827 SealHandleScope shs(isolate); 14827 SealHandleScope shs(isolate);
14828 ASSERT(args.length() == 1); 14828 DCHECK(args.length() == 1);
14829 14829
14830 if (!args[0]->IsJSReceiver()) return isolate->heap()->false_value(); 14830 if (!args[0]->IsJSReceiver()) return isolate->heap()->false_value();
14831 CONVERT_ARG_CHECKED(JSReceiver, obj, 0); 14831 CONVERT_ARG_CHECKED(JSReceiver, obj, 0);
14832 ASSERT(!obj->IsJSGlobalProxy() || !obj->map()->is_observed()); 14832 DCHECK(!obj->IsJSGlobalProxy() || !obj->map()->is_observed());
14833 return isolate->heap()->ToBoolean(obj->map()->is_observed()); 14833 return isolate->heap()->ToBoolean(obj->map()->is_observed());
14834 } 14834 }
14835 14835
14836 14836
14837 RUNTIME_FUNCTION(Runtime_SetIsObserved) { 14837 RUNTIME_FUNCTION(Runtime_SetIsObserved) {
14838 HandleScope scope(isolate); 14838 HandleScope scope(isolate);
14839 ASSERT(args.length() == 1); 14839 DCHECK(args.length() == 1);
14840 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, obj, 0); 14840 CONVERT_ARG_HANDLE_CHECKED(JSReceiver, obj, 0);
14841 RUNTIME_ASSERT(!obj->IsJSGlobalProxy()); 14841 RUNTIME_ASSERT(!obj->IsJSGlobalProxy());
14842 if (obj->IsJSProxy()) return isolate->heap()->undefined_value(); 14842 if (obj->IsJSProxy()) return isolate->heap()->undefined_value();
14843 RUNTIME_ASSERT(!obj->map()->is_observed()); 14843 RUNTIME_ASSERT(!obj->map()->is_observed());
14844 14844
14845 ASSERT(obj->IsJSObject()); 14845 DCHECK(obj->IsJSObject());
14846 JSObject::SetObserved(Handle<JSObject>::cast(obj)); 14846 JSObject::SetObserved(Handle<JSObject>::cast(obj));
14847 return isolate->heap()->undefined_value(); 14847 return isolate->heap()->undefined_value();
14848 } 14848 }
14849 14849
14850 14850
14851 RUNTIME_FUNCTION(Runtime_EnqueueMicrotask) { 14851 RUNTIME_FUNCTION(Runtime_EnqueueMicrotask) {
14852 HandleScope scope(isolate); 14852 HandleScope scope(isolate);
14853 ASSERT(args.length() == 1); 14853 DCHECK(args.length() == 1);
14854 CONVERT_ARG_HANDLE_CHECKED(JSFunction, microtask, 0); 14854 CONVERT_ARG_HANDLE_CHECKED(JSFunction, microtask, 0);
14855 isolate->EnqueueMicrotask(microtask); 14855 isolate->EnqueueMicrotask(microtask);
14856 return isolate->heap()->undefined_value(); 14856 return isolate->heap()->undefined_value();
14857 } 14857 }
14858 14858
14859 14859
14860 RUNTIME_FUNCTION(Runtime_RunMicrotasks) { 14860 RUNTIME_FUNCTION(Runtime_RunMicrotasks) {
14861 HandleScope scope(isolate); 14861 HandleScope scope(isolate);
14862 ASSERT(args.length() == 0); 14862 DCHECK(args.length() == 0);
14863 isolate->RunMicrotasks(); 14863 isolate->RunMicrotasks();
14864 return isolate->heap()->undefined_value(); 14864 return isolate->heap()->undefined_value();
14865 } 14865 }
14866 14866
14867 14867
14868 RUNTIME_FUNCTION(Runtime_GetObservationState) { 14868 RUNTIME_FUNCTION(Runtime_GetObservationState) {
14869 SealHandleScope shs(isolate); 14869 SealHandleScope shs(isolate);
14870 ASSERT(args.length() == 0); 14870 DCHECK(args.length() == 0);
14871 return isolate->heap()->observation_state(); 14871 return isolate->heap()->observation_state();
14872 } 14872 }
14873 14873
14874 14874
14875 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) { 14875 RUNTIME_FUNCTION(Runtime_ObservationWeakMapCreate) {
14876 HandleScope scope(isolate); 14876 HandleScope scope(isolate);
14877 ASSERT(args.length() == 0); 14877 DCHECK(args.length() == 0);
14878 // TODO(adamk): Currently this runtime function is only called three times per 14878 // TODO(adamk): Currently this runtime function is only called three times per
14879 // isolate. If it's called more often, the map should be moved into the 14879 // isolate. If it's called more often, the map should be moved into the
14880 // strong root list. 14880 // strong root list.
14881 Handle<Map> map = 14881 Handle<Map> map =
14882 isolate->factory()->NewMap(JS_WEAK_MAP_TYPE, JSWeakMap::kSize); 14882 isolate->factory()->NewMap(JS_WEAK_MAP_TYPE, JSWeakMap::kSize);
14883 Handle<JSWeakMap> weakmap = 14883 Handle<JSWeakMap> weakmap =
14884 Handle<JSWeakMap>::cast(isolate->factory()->NewJSObjectFromMap(map)); 14884 Handle<JSWeakMap>::cast(isolate->factory()->NewJSObjectFromMap(map));
14885 return *WeakCollectionInitialize(isolate, weakmap); 14885 return *WeakCollectionInitialize(isolate, weakmap);
14886 } 14886 }
14887 14887
14888 14888
14889 static bool ContextsHaveSameOrigin(Handle<Context> context1, 14889 static bool ContextsHaveSameOrigin(Handle<Context> context1,
14890 Handle<Context> context2) { 14890 Handle<Context> context2) {
14891 return context1->security_token() == context2->security_token(); 14891 return context1->security_token() == context2->security_token();
14892 } 14892 }
14893 14893
14894 14894
14895 RUNTIME_FUNCTION(Runtime_ObserverObjectAndRecordHaveSameOrigin) { 14895 RUNTIME_FUNCTION(Runtime_ObserverObjectAndRecordHaveSameOrigin) {
14896 HandleScope scope(isolate); 14896 HandleScope scope(isolate);
14897 ASSERT(args.length() == 3); 14897 DCHECK(args.length() == 3);
14898 CONVERT_ARG_HANDLE_CHECKED(JSFunction, observer, 0); 14898 CONVERT_ARG_HANDLE_CHECKED(JSFunction, observer, 0);
14899 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 1); 14899 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 1);
14900 CONVERT_ARG_HANDLE_CHECKED(JSObject, record, 2); 14900 CONVERT_ARG_HANDLE_CHECKED(JSObject, record, 2);
14901 14901
14902 Handle<Context> observer_context(observer->context()->native_context()); 14902 Handle<Context> observer_context(observer->context()->native_context());
14903 Handle<Context> object_context(object->GetCreationContext()); 14903 Handle<Context> object_context(object->GetCreationContext());
14904 Handle<Context> record_context(record->GetCreationContext()); 14904 Handle<Context> record_context(record->GetCreationContext());
14905 14905
14906 return isolate->heap()->ToBoolean( 14906 return isolate->heap()->ToBoolean(
14907 ContextsHaveSameOrigin(object_context, observer_context) && 14907 ContextsHaveSameOrigin(object_context, observer_context) &&
14908 ContextsHaveSameOrigin(object_context, record_context)); 14908 ContextsHaveSameOrigin(object_context, record_context));
14909 } 14909 }
14910 14910
14911 14911
14912 RUNTIME_FUNCTION(Runtime_ObjectWasCreatedInCurrentOrigin) { 14912 RUNTIME_FUNCTION(Runtime_ObjectWasCreatedInCurrentOrigin) {
14913 HandleScope scope(isolate); 14913 HandleScope scope(isolate);
14914 ASSERT(args.length() == 1); 14914 DCHECK(args.length() == 1);
14915 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 14915 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
14916 14916
14917 Handle<Context> creation_context(object->GetCreationContext(), isolate); 14917 Handle<Context> creation_context(object->GetCreationContext(), isolate);
14918 return isolate->heap()->ToBoolean( 14918 return isolate->heap()->ToBoolean(
14919 ContextsHaveSameOrigin(creation_context, isolate->native_context())); 14919 ContextsHaveSameOrigin(creation_context, isolate->native_context()));
14920 } 14920 }
14921 14921
14922 14922
14923 RUNTIME_FUNCTION(Runtime_GetObjectContextObjectObserve) { 14923 RUNTIME_FUNCTION(Runtime_GetObjectContextObjectObserve) {
14924 HandleScope scope(isolate); 14924 HandleScope scope(isolate);
14925 ASSERT(args.length() == 1); 14925 DCHECK(args.length() == 1);
14926 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 14926 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
14927 14927
14928 Handle<Context> context(object->GetCreationContext(), isolate); 14928 Handle<Context> context(object->GetCreationContext(), isolate);
14929 return context->native_object_observe(); 14929 return context->native_object_observe();
14930 } 14930 }
14931 14931
14932 14932
14933 RUNTIME_FUNCTION(Runtime_GetObjectContextObjectGetNotifier) { 14933 RUNTIME_FUNCTION(Runtime_GetObjectContextObjectGetNotifier) {
14934 HandleScope scope(isolate); 14934 HandleScope scope(isolate);
14935 ASSERT(args.length() == 1); 14935 DCHECK(args.length() == 1);
14936 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0); 14936 CONVERT_ARG_HANDLE_CHECKED(JSObject, object, 0);
14937 14937
14938 Handle<Context> context(object->GetCreationContext(), isolate); 14938 Handle<Context> context(object->GetCreationContext(), isolate);
14939 return context->native_object_get_notifier(); 14939 return context->native_object_get_notifier();
14940 } 14940 }
14941 14941
14942 14942
14943 RUNTIME_FUNCTION(Runtime_GetObjectContextNotifierPerformChange) { 14943 RUNTIME_FUNCTION(Runtime_GetObjectContextNotifierPerformChange) {
14944 HandleScope scope(isolate); 14944 HandleScope scope(isolate);
14945 ASSERT(args.length() == 1); 14945 DCHECK(args.length() == 1);
14946 CONVERT_ARG_HANDLE_CHECKED(JSObject, object_info, 0); 14946 CONVERT_ARG_HANDLE_CHECKED(JSObject, object_info, 0);
14947 14947
14948 Handle<Context> context(object_info->GetCreationContext(), isolate); 14948 Handle<Context> context(object_info->GetCreationContext(), isolate);
14949 return context->native_object_notifier_perform_change(); 14949 return context->native_object_notifier_perform_change();
14950 } 14950 }
14951 14951
14952 14952
14953 static Object* ArrayConstructorCommon(Isolate* isolate, 14953 static Object* ArrayConstructorCommon(Isolate* isolate,
14954 Handle<JSFunction> constructor, 14954 Handle<JSFunction> constructor,
14955 Handle<AllocationSite> site, 14955 Handle<AllocationSite> site,
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
15030 15030
15031 RUNTIME_FUNCTION(Runtime_ArrayConstructor) { 15031 RUNTIME_FUNCTION(Runtime_ArrayConstructor) {
15032 HandleScope scope(isolate); 15032 HandleScope scope(isolate);
15033 // If we get 2 arguments then they are the stub parameters (constructor, type 15033 // If we get 2 arguments then they are the stub parameters (constructor, type
15034 // info). If we get 4, then the first one is a pointer to the arguments 15034 // info). If we get 4, then the first one is a pointer to the arguments
15035 // passed by the caller, and the last one is the length of the arguments 15035 // passed by the caller, and the last one is the length of the arguments
15036 // passed to the caller (redundant, but useful to check on the deoptimizer 15036 // passed to the caller (redundant, but useful to check on the deoptimizer
15037 // with an assert). 15037 // with an assert).
15038 Arguments empty_args(0, NULL); 15038 Arguments empty_args(0, NULL);
15039 bool no_caller_args = args.length() == 2; 15039 bool no_caller_args = args.length() == 2;
15040 ASSERT(no_caller_args || args.length() == 4); 15040 DCHECK(no_caller_args || args.length() == 4);
15041 int parameters_start = no_caller_args ? 0 : 1; 15041 int parameters_start = no_caller_args ? 0 : 1;
15042 Arguments* caller_args = no_caller_args 15042 Arguments* caller_args = no_caller_args
15043 ? &empty_args 15043 ? &empty_args
15044 : reinterpret_cast<Arguments*>(args[0]); 15044 : reinterpret_cast<Arguments*>(args[0]);
15045 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, parameters_start); 15045 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, parameters_start);
15046 CONVERT_ARG_HANDLE_CHECKED(Object, type_info, parameters_start + 1); 15046 CONVERT_ARG_HANDLE_CHECKED(Object, type_info, parameters_start + 1);
15047 #ifdef DEBUG 15047 #ifdef DEBUG
15048 if (!no_caller_args) { 15048 if (!no_caller_args) {
15049 CONVERT_SMI_ARG_CHECKED(arg_count, parameters_start + 2); 15049 CONVERT_SMI_ARG_CHECKED(arg_count, parameters_start + 2);
15050 ASSERT(arg_count == caller_args->length()); 15050 DCHECK(arg_count == caller_args->length());
15051 } 15051 }
15052 #endif 15052 #endif
15053 15053
15054 Handle<AllocationSite> site; 15054 Handle<AllocationSite> site;
15055 if (!type_info.is_null() && 15055 if (!type_info.is_null() &&
15056 *type_info != isolate->heap()->undefined_value()) { 15056 *type_info != isolate->heap()->undefined_value()) {
15057 site = Handle<AllocationSite>::cast(type_info); 15057 site = Handle<AllocationSite>::cast(type_info);
15058 ASSERT(!site->SitePointsToLiteral()); 15058 DCHECK(!site->SitePointsToLiteral());
15059 } 15059 }
15060 15060
15061 return ArrayConstructorCommon(isolate, 15061 return ArrayConstructorCommon(isolate,
15062 constructor, 15062 constructor,
15063 site, 15063 site,
15064 caller_args); 15064 caller_args);
15065 } 15065 }
15066 15066
15067 15067
15068 RUNTIME_FUNCTION(Runtime_InternalArrayConstructor) { 15068 RUNTIME_FUNCTION(Runtime_InternalArrayConstructor) {
15069 HandleScope scope(isolate); 15069 HandleScope scope(isolate);
15070 Arguments empty_args(0, NULL); 15070 Arguments empty_args(0, NULL);
15071 bool no_caller_args = args.length() == 1; 15071 bool no_caller_args = args.length() == 1;
15072 ASSERT(no_caller_args || args.length() == 3); 15072 DCHECK(no_caller_args || args.length() == 3);
15073 int parameters_start = no_caller_args ? 0 : 1; 15073 int parameters_start = no_caller_args ? 0 : 1;
15074 Arguments* caller_args = no_caller_args 15074 Arguments* caller_args = no_caller_args
15075 ? &empty_args 15075 ? &empty_args
15076 : reinterpret_cast<Arguments*>(args[0]); 15076 : reinterpret_cast<Arguments*>(args[0]);
15077 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, parameters_start); 15077 CONVERT_ARG_HANDLE_CHECKED(JSFunction, constructor, parameters_start);
15078 #ifdef DEBUG 15078 #ifdef DEBUG
15079 if (!no_caller_args) { 15079 if (!no_caller_args) {
15080 CONVERT_SMI_ARG_CHECKED(arg_count, parameters_start + 1); 15080 CONVERT_SMI_ARG_CHECKED(arg_count, parameters_start + 1);
15081 ASSERT(arg_count == caller_args->length()); 15081 DCHECK(arg_count == caller_args->length());
15082 } 15082 }
15083 #endif 15083 #endif
15084 return ArrayConstructorCommon(isolate, 15084 return ArrayConstructorCommon(isolate,
15085 constructor, 15085 constructor,
15086 Handle<AllocationSite>::null(), 15086 Handle<AllocationSite>::null(),
15087 caller_args); 15087 caller_args);
15088 } 15088 }
15089 15089
15090 15090
15091 RUNTIME_FUNCTION(Runtime_NormalizeElements) { 15091 RUNTIME_FUNCTION(Runtime_NormalizeElements) {
15092 HandleScope scope(isolate); 15092 HandleScope scope(isolate);
15093 ASSERT(args.length() == 1); 15093 DCHECK(args.length() == 1);
15094 CONVERT_ARG_HANDLE_CHECKED(JSObject, array, 0); 15094 CONVERT_ARG_HANDLE_CHECKED(JSObject, array, 0);
15095 RUNTIME_ASSERT(!array->HasExternalArrayElements() && 15095 RUNTIME_ASSERT(!array->HasExternalArrayElements() &&
15096 !array->HasFixedTypedArrayElements()); 15096 !array->HasFixedTypedArrayElements());
15097 JSObject::NormalizeElements(array); 15097 JSObject::NormalizeElements(array);
15098 return *array; 15098 return *array;
15099 } 15099 }
15100 15100
15101 15101
15102 RUNTIME_FUNCTION(Runtime_MaxSmi) { 15102 RUNTIME_FUNCTION(Runtime_MaxSmi) {
15103 SealHandleScope shs(isolate); 15103 SealHandleScope shs(isolate);
15104 ASSERT(args.length() == 0); 15104 DCHECK(args.length() == 0);
15105 return Smi::FromInt(Smi::kMaxValue); 15105 return Smi::FromInt(Smi::kMaxValue);
15106 } 15106 }
15107 15107
15108 15108
15109 // TODO(dcarney): remove this function when TurboFan supports it. 15109 // TODO(dcarney): remove this function when TurboFan supports it.
15110 // Takes the object to be iterated over and the result of GetPropertyNamesFast 15110 // Takes the object to be iterated over and the result of GetPropertyNamesFast
15111 // Returns pair (cache_array, cache_type). 15111 // Returns pair (cache_array, cache_type).
15112 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ForInInit) { 15112 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ForInInit) {
15113 SealHandleScope scope(isolate); 15113 SealHandleScope scope(isolate);
15114 ASSERT(args.length() == 2); 15114 DCHECK(args.length() == 2);
15115 // This simulates CONVERT_ARG_HANDLE_CHECKED for calls returning pairs. 15115 // This simulates CONVERT_ARG_HANDLE_CHECKED for calls returning pairs.
15116 // Not worth creating a macro atm as this function should be removed. 15116 // Not worth creating a macro atm as this function should be removed.
15117 if (!args[0]->IsJSReceiver() || !args[1]->IsObject()) { 15117 if (!args[0]->IsJSReceiver() || !args[1]->IsObject()) {
15118 Object* error = isolate->ThrowIllegalOperation(); 15118 Object* error = isolate->ThrowIllegalOperation();
15119 return MakePair(error, isolate->heap()->undefined_value()); 15119 return MakePair(error, isolate->heap()->undefined_value());
15120 } 15120 }
15121 Handle<JSReceiver> object = args.at<JSReceiver>(0); 15121 Handle<JSReceiver> object = args.at<JSReceiver>(0);
15122 Handle<Object> cache_type = args.at<Object>(1); 15122 Handle<Object> cache_type = args.at<Object>(1);
15123 if (cache_type->IsMap()) { 15123 if (cache_type->IsMap()) {
15124 // Enum cache case. 15124 // Enum cache case.
(...skipping 10 matching lines...) Expand all
15135 // FixedArray case. 15135 // FixedArray case.
15136 Smi* new_cache_type = Smi::FromInt(object->IsJSProxy() ? 0 : 1); 15136 Smi* new_cache_type = Smi::FromInt(object->IsJSProxy() ? 0 : 1);
15137 return MakePair(*Handle<FixedArray>::cast(cache_type), new_cache_type); 15137 return MakePair(*Handle<FixedArray>::cast(cache_type), new_cache_type);
15138 } 15138 }
15139 } 15139 }
15140 15140
15141 15141
15142 // TODO(dcarney): remove this function when TurboFan supports it. 15142 // TODO(dcarney): remove this function when TurboFan supports it.
15143 RUNTIME_FUNCTION(Runtime_ForInCacheArrayLength) { 15143 RUNTIME_FUNCTION(Runtime_ForInCacheArrayLength) {
15144 SealHandleScope shs(isolate); 15144 SealHandleScope shs(isolate);
15145 ASSERT(args.length() == 2); 15145 DCHECK(args.length() == 2);
15146 CONVERT_ARG_HANDLE_CHECKED(Object, cache_type, 0); 15146 CONVERT_ARG_HANDLE_CHECKED(Object, cache_type, 0);
15147 CONVERT_ARG_HANDLE_CHECKED(FixedArray, array, 1); 15147 CONVERT_ARG_HANDLE_CHECKED(FixedArray, array, 1);
15148 int length = 0; 15148 int length = 0;
15149 if (cache_type->IsMap()) { 15149 if (cache_type->IsMap()) {
15150 length = Map::cast(*cache_type)->EnumLength(); 15150 length = Map::cast(*cache_type)->EnumLength();
15151 } else { 15151 } else {
15152 ASSERT(cache_type->IsSmi()); 15152 DCHECK(cache_type->IsSmi());
15153 length = array->length(); 15153 length = array->length();
15154 } 15154 }
15155 return Smi::FromInt(length); 15155 return Smi::FromInt(length);
15156 } 15156 }
15157 15157
15158 15158
15159 // TODO(dcarney): remove this function when TurboFan supports it. 15159 // TODO(dcarney): remove this function when TurboFan supports it.
15160 // Takes (the object to be iterated over, 15160 // Takes (the object to be iterated over,
15161 // cache_array from ForInInit, 15161 // cache_array from ForInInit,
15162 // cache_type from ForInInit, 15162 // cache_type from ForInInit,
15163 // the current index) 15163 // the current index)
15164 // Returns pair (array[index], needs_filtering). 15164 // Returns pair (array[index], needs_filtering).
15165 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ForInNext) { 15165 RUNTIME_FUNCTION_RETURN_PAIR(Runtime_ForInNext) {
15166 SealHandleScope scope(isolate); 15166 SealHandleScope scope(isolate);
15167 ASSERT(args.length() == 4); 15167 DCHECK(args.length() == 4);
15168 // This simulates CONVERT_ARG_HANDLE_CHECKED for calls returning pairs. 15168 // This simulates CONVERT_ARG_HANDLE_CHECKED for calls returning pairs.
15169 // Not worth creating a macro atm as this function should be removed. 15169 // Not worth creating a macro atm as this function should be removed.
15170 if (!args[0]->IsJSReceiver() || !args[1]->IsFixedArray() || 15170 if (!args[0]->IsJSReceiver() || !args[1]->IsFixedArray() ||
15171 !args[2]->IsObject() || !args[3]->IsSmi()) { 15171 !args[2]->IsObject() || !args[3]->IsSmi()) {
15172 Object* error = isolate->ThrowIllegalOperation(); 15172 Object* error = isolate->ThrowIllegalOperation();
15173 return MakePair(error, isolate->heap()->undefined_value()); 15173 return MakePair(error, isolate->heap()->undefined_value());
15174 } 15174 }
15175 Handle<JSReceiver> object = args.at<JSReceiver>(0); 15175 Handle<JSReceiver> object = args.at<JSReceiver>(0);
15176 Handle<FixedArray> array = args.at<FixedArray>(1); 15176 Handle<FixedArray> array = args.at<FixedArray>(1);
15177 Handle<Object> cache_type = args.at<Object>(2); 15177 Handle<Object> cache_type = args.at<Object>(2);
(...skipping 30 matching lines...) Expand all
15208 U(IsStringWrapperSafeForDefaultValueOf) 15208 U(IsStringWrapperSafeForDefaultValueOf)
15209 U(GeneratorNext) 15209 U(GeneratorNext)
15210 U(GeneratorThrow) 15210 U(GeneratorThrow)
15211 U(DebugBreakInOptimizedCode) 15211 U(DebugBreakInOptimizedCode)
15212 15212
15213 #undef U 15213 #undef U
15214 15214
15215 15215
15216 RUNTIME_FUNCTION(RuntimeReference_IsSmi) { 15216 RUNTIME_FUNCTION(RuntimeReference_IsSmi) {
15217 SealHandleScope shs(isolate); 15217 SealHandleScope shs(isolate);
15218 ASSERT(args.length() == 1); 15218 DCHECK(args.length() == 1);
15219 CONVERT_ARG_CHECKED(Object, obj, 0); 15219 CONVERT_ARG_CHECKED(Object, obj, 0);
15220 return isolate->heap()->ToBoolean(obj->IsSmi()); 15220 return isolate->heap()->ToBoolean(obj->IsSmi());
15221 } 15221 }
15222 15222
15223 15223
15224 RUNTIME_FUNCTION(RuntimeReference_IsNonNegativeSmi) { 15224 RUNTIME_FUNCTION(RuntimeReference_IsNonNegativeSmi) {
15225 SealHandleScope shs(isolate); 15225 SealHandleScope shs(isolate);
15226 ASSERT(args.length() == 1); 15226 DCHECK(args.length() == 1);
15227 CONVERT_ARG_CHECKED(Object, obj, 0); 15227 CONVERT_ARG_CHECKED(Object, obj, 0);
15228 return isolate->heap()->ToBoolean(obj->IsSmi() && 15228 return isolate->heap()->ToBoolean(obj->IsSmi() &&
15229 Smi::cast(obj)->value() >= 0); 15229 Smi::cast(obj)->value() >= 0);
15230 } 15230 }
15231 15231
15232 15232
15233 RUNTIME_FUNCTION(RuntimeReference_IsArray) { 15233 RUNTIME_FUNCTION(RuntimeReference_IsArray) {
15234 SealHandleScope shs(isolate); 15234 SealHandleScope shs(isolate);
15235 ASSERT(args.length() == 1); 15235 DCHECK(args.length() == 1);
15236 CONVERT_ARG_CHECKED(Object, obj, 0); 15236 CONVERT_ARG_CHECKED(Object, obj, 0);
15237 return isolate->heap()->ToBoolean(obj->IsJSArray()); 15237 return isolate->heap()->ToBoolean(obj->IsJSArray());
15238 } 15238 }
15239 15239
15240 15240
15241 RUNTIME_FUNCTION(RuntimeReference_IsRegExp) { 15241 RUNTIME_FUNCTION(RuntimeReference_IsRegExp) {
15242 SealHandleScope shs(isolate); 15242 SealHandleScope shs(isolate);
15243 ASSERT(args.length() == 1); 15243 DCHECK(args.length() == 1);
15244 CONVERT_ARG_CHECKED(Object, obj, 0); 15244 CONVERT_ARG_CHECKED(Object, obj, 0);
15245 return isolate->heap()->ToBoolean(obj->IsJSRegExp()); 15245 return isolate->heap()->ToBoolean(obj->IsJSRegExp());
15246 } 15246 }
15247 15247
15248 15248
15249 RUNTIME_FUNCTION(RuntimeReference_IsConstructCall) { 15249 RUNTIME_FUNCTION(RuntimeReference_IsConstructCall) {
15250 SealHandleScope shs(isolate); 15250 SealHandleScope shs(isolate);
15251 ASSERT(args.length() == 0); 15251 DCHECK(args.length() == 0);
15252 JavaScriptFrameIterator it(isolate); 15252 JavaScriptFrameIterator it(isolate);
15253 JavaScriptFrame* frame = it.frame(); 15253 JavaScriptFrame* frame = it.frame();
15254 return isolate->heap()->ToBoolean(frame->IsConstructor()); 15254 return isolate->heap()->ToBoolean(frame->IsConstructor());
15255 } 15255 }
15256 15256
15257 15257
15258 RUNTIME_FUNCTION(RuntimeReference_CallFunction) { 15258 RUNTIME_FUNCTION(RuntimeReference_CallFunction) {
15259 SealHandleScope shs(isolate); 15259 SealHandleScope shs(isolate);
15260 return __RT_impl_Runtime_Call(args, isolate); 15260 return __RT_impl_Runtime_Call(args, isolate);
15261 } 15261 }
15262 15262
15263 15263
15264 RUNTIME_FUNCTION(RuntimeReference_ArgumentsLength) { 15264 RUNTIME_FUNCTION(RuntimeReference_ArgumentsLength) {
15265 SealHandleScope shs(isolate); 15265 SealHandleScope shs(isolate);
15266 ASSERT(args.length() == 0); 15266 DCHECK(args.length() == 0);
15267 JavaScriptFrameIterator it(isolate); 15267 JavaScriptFrameIterator it(isolate);
15268 JavaScriptFrame* frame = it.frame(); 15268 JavaScriptFrame* frame = it.frame();
15269 return Smi::FromInt(frame->GetArgumentsLength()); 15269 return Smi::FromInt(frame->GetArgumentsLength());
15270 } 15270 }
15271 15271
15272 15272
15273 RUNTIME_FUNCTION(RuntimeReference_Arguments) { 15273 RUNTIME_FUNCTION(RuntimeReference_Arguments) {
15274 SealHandleScope shs(isolate); 15274 SealHandleScope shs(isolate);
15275 return __RT_impl_Runtime_GetArgumentsProperty(args, isolate); 15275 return __RT_impl_Runtime_GetArgumentsProperty(args, isolate);
15276 } 15276 }
15277 15277
15278 15278
15279 RUNTIME_FUNCTION(RuntimeReference_ValueOf) { 15279 RUNTIME_FUNCTION(RuntimeReference_ValueOf) {
15280 SealHandleScope shs(isolate); 15280 SealHandleScope shs(isolate);
15281 ASSERT(args.length() == 1); 15281 DCHECK(args.length() == 1);
15282 CONVERT_ARG_CHECKED(Object, obj, 0); 15282 CONVERT_ARG_CHECKED(Object, obj, 0);
15283 if (!obj->IsJSValue()) return obj; 15283 if (!obj->IsJSValue()) return obj;
15284 return JSValue::cast(obj)->value(); 15284 return JSValue::cast(obj)->value();
15285 } 15285 }
15286 15286
15287 15287
15288 RUNTIME_FUNCTION(RuntimeReference_SetValueOf) { 15288 RUNTIME_FUNCTION(RuntimeReference_SetValueOf) {
15289 SealHandleScope shs(isolate); 15289 SealHandleScope shs(isolate);
15290 ASSERT(args.length() == 2); 15290 DCHECK(args.length() == 2);
15291 CONVERT_ARG_CHECKED(Object, obj, 0); 15291 CONVERT_ARG_CHECKED(Object, obj, 0);
15292 CONVERT_ARG_CHECKED(Object, value, 1); 15292 CONVERT_ARG_CHECKED(Object, value, 1);
15293 if (!obj->IsJSValue()) return value; 15293 if (!obj->IsJSValue()) return value;
15294 JSValue::cast(obj)->set_value(value); 15294 JSValue::cast(obj)->set_value(value);
15295 return value; 15295 return value;
15296 } 15296 }
15297 15297
15298 15298
15299 RUNTIME_FUNCTION(RuntimeReference_DateField) { 15299 RUNTIME_FUNCTION(RuntimeReference_DateField) {
15300 SealHandleScope shs(isolate); 15300 SealHandleScope shs(isolate);
15301 ASSERT(args.length() == 2); 15301 DCHECK(args.length() == 2);
15302 CONVERT_ARG_CHECKED(Object, obj, 0); 15302 CONVERT_ARG_CHECKED(Object, obj, 0);
15303 CONVERT_SMI_ARG_CHECKED(index, 1); 15303 CONVERT_SMI_ARG_CHECKED(index, 1);
15304 if (!obj->IsJSDate()) { 15304 if (!obj->IsJSDate()) {
15305 HandleScope scope(isolate); 15305 HandleScope scope(isolate);
15306 return isolate->Throw(*isolate->factory()->NewTypeError( 15306 return isolate->Throw(*isolate->factory()->NewTypeError(
15307 "not_date_object", HandleVector<Object>(NULL, 0))); 15307 "not_date_object", HandleVector<Object>(NULL, 0)));
15308 } 15308 }
15309 JSDate* date = JSDate::cast(obj); 15309 JSDate* date = JSDate::cast(obj);
15310 if (index == 0) return date->value(); 15310 if (index == 0) return date->value();
15311 return JSDate::GetField(date, Smi::FromInt(index)); 15311 return JSDate::GetField(date, Smi::FromInt(index));
15312 } 15312 }
15313 15313
15314 15314
15315 RUNTIME_FUNCTION(RuntimeReference_StringCharFromCode) { 15315 RUNTIME_FUNCTION(RuntimeReference_StringCharFromCode) {
15316 SealHandleScope shs(isolate); 15316 SealHandleScope shs(isolate);
15317 return __RT_impl_Runtime_CharFromCode(args, isolate); 15317 return __RT_impl_Runtime_CharFromCode(args, isolate);
15318 } 15318 }
15319 15319
15320 15320
15321 RUNTIME_FUNCTION(RuntimeReference_StringCharAt) { 15321 RUNTIME_FUNCTION(RuntimeReference_StringCharAt) {
15322 SealHandleScope shs(isolate); 15322 SealHandleScope shs(isolate);
15323 ASSERT(args.length() == 2); 15323 DCHECK(args.length() == 2);
15324 if (!args[0]->IsString()) return Smi::FromInt(0); 15324 if (!args[0]->IsString()) return Smi::FromInt(0);
15325 if (!args[1]->IsNumber()) return Smi::FromInt(0); 15325 if (!args[1]->IsNumber()) return Smi::FromInt(0);
15326 if (std::isinf(args.number_at(1))) return isolate->heap()->empty_string(); 15326 if (std::isinf(args.number_at(1))) return isolate->heap()->empty_string();
15327 Object* code = __RT_impl_Runtime_StringCharCodeAtRT(args, isolate); 15327 Object* code = __RT_impl_Runtime_StringCharCodeAtRT(args, isolate);
15328 if (code->IsNaN()) return isolate->heap()->empty_string(); 15328 if (code->IsNaN()) return isolate->heap()->empty_string();
15329 return __RT_impl_Runtime_CharFromCode(Arguments(1, &code), isolate); 15329 return __RT_impl_Runtime_CharFromCode(Arguments(1, &code), isolate);
15330 } 15330 }
15331 15331
15332 15332
15333 RUNTIME_FUNCTION(RuntimeReference_OneByteSeqStringSetChar) { 15333 RUNTIME_FUNCTION(RuntimeReference_OneByteSeqStringSetChar) {
15334 SealHandleScope shs(isolate); 15334 SealHandleScope shs(isolate);
15335 ASSERT(args.length() == 3); 15335 DCHECK(args.length() == 3);
15336 CONVERT_ARG_CHECKED(SeqOneByteString, string, 0); 15336 CONVERT_ARG_CHECKED(SeqOneByteString, string, 0);
15337 CONVERT_SMI_ARG_CHECKED(index, 1); 15337 CONVERT_SMI_ARG_CHECKED(index, 1);
15338 CONVERT_SMI_ARG_CHECKED(value, 2); 15338 CONVERT_SMI_ARG_CHECKED(value, 2);
15339 string->SeqOneByteStringSet(index, value); 15339 string->SeqOneByteStringSet(index, value);
15340 return string; 15340 return string;
15341 } 15341 }
15342 15342
15343 15343
15344 RUNTIME_FUNCTION(RuntimeReference_TwoByteSeqStringSetChar) { 15344 RUNTIME_FUNCTION(RuntimeReference_TwoByteSeqStringSetChar) {
15345 SealHandleScope shs(isolate); 15345 SealHandleScope shs(isolate);
15346 ASSERT(args.length() == 3); 15346 DCHECK(args.length() == 3);
15347 CONVERT_ARG_CHECKED(SeqTwoByteString, string, 0); 15347 CONVERT_ARG_CHECKED(SeqTwoByteString, string, 0);
15348 CONVERT_SMI_ARG_CHECKED(index, 1); 15348 CONVERT_SMI_ARG_CHECKED(index, 1);
15349 CONVERT_SMI_ARG_CHECKED(value, 2); 15349 CONVERT_SMI_ARG_CHECKED(value, 2);
15350 string->SeqTwoByteStringSet(index, value); 15350 string->SeqTwoByteStringSet(index, value);
15351 return string; 15351 return string;
15352 } 15352 }
15353 15353
15354 15354
15355 RUNTIME_FUNCTION(RuntimeReference_ObjectEquals) { 15355 RUNTIME_FUNCTION(RuntimeReference_ObjectEquals) {
15356 SealHandleScope shs(isolate); 15356 SealHandleScope shs(isolate);
15357 ASSERT(args.length() == 2); 15357 DCHECK(args.length() == 2);
15358 CONVERT_ARG_CHECKED(Object, obj1, 0); 15358 CONVERT_ARG_CHECKED(Object, obj1, 0);
15359 CONVERT_ARG_CHECKED(Object, obj2, 1); 15359 CONVERT_ARG_CHECKED(Object, obj2, 1);
15360 return isolate->heap()->ToBoolean(obj1 == obj2); 15360 return isolate->heap()->ToBoolean(obj1 == obj2);
15361 } 15361 }
15362 15362
15363 15363
15364 RUNTIME_FUNCTION(RuntimeReference_IsObject) { 15364 RUNTIME_FUNCTION(RuntimeReference_IsObject) {
15365 SealHandleScope shs(isolate); 15365 SealHandleScope shs(isolate);
15366 ASSERT(args.length() == 1); 15366 DCHECK(args.length() == 1);
15367 CONVERT_ARG_CHECKED(Object, obj, 0); 15367 CONVERT_ARG_CHECKED(Object, obj, 0);
15368 if (!obj->IsHeapObject()) return isolate->heap()->false_value(); 15368 if (!obj->IsHeapObject()) return isolate->heap()->false_value();
15369 if (obj->IsNull()) return isolate->heap()->true_value(); 15369 if (obj->IsNull()) return isolate->heap()->true_value();
15370 if (obj->IsUndetectableObject()) return isolate->heap()->false_value(); 15370 if (obj->IsUndetectableObject()) return isolate->heap()->false_value();
15371 Map* map = HeapObject::cast(obj)->map(); 15371 Map* map = HeapObject::cast(obj)->map();
15372 bool is_non_callable_spec_object = 15372 bool is_non_callable_spec_object =
15373 map->instance_type() >= FIRST_NONCALLABLE_SPEC_OBJECT_TYPE && 15373 map->instance_type() >= FIRST_NONCALLABLE_SPEC_OBJECT_TYPE &&
15374 map->instance_type() <= LAST_NONCALLABLE_SPEC_OBJECT_TYPE; 15374 map->instance_type() <= LAST_NONCALLABLE_SPEC_OBJECT_TYPE;
15375 return isolate->heap()->ToBoolean(is_non_callable_spec_object); 15375 return isolate->heap()->ToBoolean(is_non_callable_spec_object);
15376 } 15376 }
15377 15377
15378 15378
15379 RUNTIME_FUNCTION(RuntimeReference_IsFunction) { 15379 RUNTIME_FUNCTION(RuntimeReference_IsFunction) {
15380 SealHandleScope shs(isolate); 15380 SealHandleScope shs(isolate);
15381 ASSERT(args.length() == 1); 15381 DCHECK(args.length() == 1);
15382 CONVERT_ARG_CHECKED(Object, obj, 0); 15382 CONVERT_ARG_CHECKED(Object, obj, 0);
15383 return isolate->heap()->ToBoolean(obj->IsJSFunction()); 15383 return isolate->heap()->ToBoolean(obj->IsJSFunction());
15384 } 15384 }
15385 15385
15386 15386
15387 RUNTIME_FUNCTION(RuntimeReference_IsUndetectableObject) { 15387 RUNTIME_FUNCTION(RuntimeReference_IsUndetectableObject) {
15388 SealHandleScope shs(isolate); 15388 SealHandleScope shs(isolate);
15389 ASSERT(args.length() == 1); 15389 DCHECK(args.length() == 1);
15390 CONVERT_ARG_CHECKED(Object, obj, 0); 15390 CONVERT_ARG_CHECKED(Object, obj, 0);
15391 return isolate->heap()->ToBoolean(obj->IsUndetectableObject()); 15391 return isolate->heap()->ToBoolean(obj->IsUndetectableObject());
15392 } 15392 }
15393 15393
15394 15394
15395 RUNTIME_FUNCTION(RuntimeReference_IsSpecObject) { 15395 RUNTIME_FUNCTION(RuntimeReference_IsSpecObject) {
15396 SealHandleScope shs(isolate); 15396 SealHandleScope shs(isolate);
15397 ASSERT(args.length() == 1); 15397 DCHECK(args.length() == 1);
15398 CONVERT_ARG_CHECKED(Object, obj, 0); 15398 CONVERT_ARG_CHECKED(Object, obj, 0);
15399 return isolate->heap()->ToBoolean(obj->IsSpecObject()); 15399 return isolate->heap()->ToBoolean(obj->IsSpecObject());
15400 } 15400 }
15401 15401
15402 15402
15403 RUNTIME_FUNCTION(RuntimeReference_MathPow) { 15403 RUNTIME_FUNCTION(RuntimeReference_MathPow) {
15404 SealHandleScope shs(isolate); 15404 SealHandleScope shs(isolate);
15405 return __RT_impl_Runtime_MathPowSlow(args, isolate); 15405 return __RT_impl_Runtime_MathPowSlow(args, isolate);
15406 } 15406 }
15407 15407
15408 15408
15409 RUNTIME_FUNCTION(RuntimeReference_IsMinusZero) { 15409 RUNTIME_FUNCTION(RuntimeReference_IsMinusZero) {
15410 SealHandleScope shs(isolate); 15410 SealHandleScope shs(isolate);
15411 ASSERT(args.length() == 1); 15411 DCHECK(args.length() == 1);
15412 CONVERT_ARG_CHECKED(Object, obj, 0); 15412 CONVERT_ARG_CHECKED(Object, obj, 0);
15413 if (!obj->IsHeapNumber()) return isolate->heap()->false_value(); 15413 if (!obj->IsHeapNumber()) return isolate->heap()->false_value();
15414 HeapNumber* number = HeapNumber::cast(obj); 15414 HeapNumber* number = HeapNumber::cast(obj);
15415 return isolate->heap()->ToBoolean(IsMinusZero(number->value())); 15415 return isolate->heap()->ToBoolean(IsMinusZero(number->value()));
15416 } 15416 }
15417 15417
15418 15418
15419 RUNTIME_FUNCTION(RuntimeReference_HasCachedArrayIndex) { 15419 RUNTIME_FUNCTION(RuntimeReference_HasCachedArrayIndex) {
15420 SealHandleScope shs(isolate); 15420 SealHandleScope shs(isolate);
15421 ASSERT(args.length() == 1); 15421 DCHECK(args.length() == 1);
15422 return isolate->heap()->false_value(); 15422 return isolate->heap()->false_value();
15423 } 15423 }
15424 15424
15425 15425
15426 RUNTIME_FUNCTION(RuntimeReference_GetCachedArrayIndex) { 15426 RUNTIME_FUNCTION(RuntimeReference_GetCachedArrayIndex) {
15427 SealHandleScope shs(isolate); 15427 SealHandleScope shs(isolate);
15428 ASSERT(args.length() == 1); 15428 DCHECK(args.length() == 1);
15429 return isolate->heap()->undefined_value(); 15429 return isolate->heap()->undefined_value();
15430 } 15430 }
15431 15431
15432 15432
15433 RUNTIME_FUNCTION(RuntimeReference_FastAsciiArrayJoin) { 15433 RUNTIME_FUNCTION(RuntimeReference_FastAsciiArrayJoin) {
15434 SealHandleScope shs(isolate); 15434 SealHandleScope shs(isolate);
15435 ASSERT(args.length() == 2); 15435 DCHECK(args.length() == 2);
15436 return isolate->heap()->undefined_value(); 15436 return isolate->heap()->undefined_value();
15437 } 15437 }
15438 15438
15439 15439
15440 RUNTIME_FUNCTION(RuntimeReference_ClassOf) { 15440 RUNTIME_FUNCTION(RuntimeReference_ClassOf) {
15441 SealHandleScope shs(isolate); 15441 SealHandleScope shs(isolate);
15442 ASSERT(args.length() == 1); 15442 DCHECK(args.length() == 1);
15443 CONVERT_ARG_CHECKED(Object, obj, 0); 15443 CONVERT_ARG_CHECKED(Object, obj, 0);
15444 if (!obj->IsJSReceiver()) return isolate->heap()->null_value(); 15444 if (!obj->IsJSReceiver()) return isolate->heap()->null_value();
15445 return JSReceiver::cast(obj)->class_name(); 15445 return JSReceiver::cast(obj)->class_name();
15446 } 15446 }
15447 15447
15448 15448
15449 RUNTIME_FUNCTION(RuntimeReference_StringCharCodeAt) { 15449 RUNTIME_FUNCTION(RuntimeReference_StringCharCodeAt) {
15450 SealHandleScope shs(isolate); 15450 SealHandleScope shs(isolate);
15451 ASSERT(args.length() == 2); 15451 DCHECK(args.length() == 2);
15452 if (!args[0]->IsString()) return isolate->heap()->undefined_value(); 15452 if (!args[0]->IsString()) return isolate->heap()->undefined_value();
15453 if (!args[1]->IsNumber()) return isolate->heap()->undefined_value(); 15453 if (!args[1]->IsNumber()) return isolate->heap()->undefined_value();
15454 if (std::isinf(args.number_at(1))) return isolate->heap()->nan_value(); 15454 if (std::isinf(args.number_at(1))) return isolate->heap()->nan_value();
15455 return __RT_impl_Runtime_StringCharCodeAtRT(args, isolate); 15455 return __RT_impl_Runtime_StringCharCodeAtRT(args, isolate);
15456 } 15456 }
15457 15457
15458 15458
15459 RUNTIME_FUNCTION(RuntimeReference_StringAdd) { 15459 RUNTIME_FUNCTION(RuntimeReference_StringAdd) {
15460 SealHandleScope shs(isolate); 15460 SealHandleScope shs(isolate);
15461 return __RT_impl_Runtime_StringAdd(args, isolate); 15461 return __RT_impl_Runtime_StringAdd(args, isolate);
(...skipping 19 matching lines...) Expand all
15481 15481
15482 15482
15483 RUNTIME_FUNCTION(RuntimeReference_RegExpConstructResult) { 15483 RUNTIME_FUNCTION(RuntimeReference_RegExpConstructResult) {
15484 SealHandleScope shs(isolate); 15484 SealHandleScope shs(isolate);
15485 return __RT_impl_Runtime_RegExpConstructResult(args, isolate); 15485 return __RT_impl_Runtime_RegExpConstructResult(args, isolate);
15486 } 15486 }
15487 15487
15488 15488
15489 RUNTIME_FUNCTION(RuntimeReference_GetFromCache) { 15489 RUNTIME_FUNCTION(RuntimeReference_GetFromCache) {
15490 HandleScope scope(isolate); 15490 HandleScope scope(isolate);
15491 ASSERT(args.length() == 2); 15491 DCHECK(args.length() == 2);
15492 CONVERT_SMI_ARG_CHECKED(id, 0); 15492 CONVERT_SMI_ARG_CHECKED(id, 0);
15493 args[0] = isolate->native_context()->jsfunction_result_caches()->get(id); 15493 args[0] = isolate->native_context()->jsfunction_result_caches()->get(id);
15494 return __RT_impl_Runtime_GetFromCache(args, isolate); 15494 return __RT_impl_Runtime_GetFromCache(args, isolate);
15495 } 15495 }
15496 15496
15497 15497
15498 RUNTIME_FUNCTION(RuntimeReference_NumberToString) { 15498 RUNTIME_FUNCTION(RuntimeReference_NumberToString) {
15499 SealHandleScope shs(isolate); 15499 SealHandleScope shs(isolate);
15500 return __RT_impl_Runtime_NumberToStringRT(args, isolate); 15500 return __RT_impl_Runtime_NumberToStringRT(args, isolate);
15501 } 15501 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
15541 INLINE_OPTIMIZED_FUNCTION_LIST(IO) 15541 INLINE_OPTIMIZED_FUNCTION_LIST(IO)
15542 }; 15542 };
15543 15543
15544 #undef IO 15544 #undef IO
15545 #undef I 15545 #undef I
15546 #undef F 15546 #undef F
15547 15547
15548 15548
15549 void Runtime::InitializeIntrinsicFunctionNames(Isolate* isolate, 15549 void Runtime::InitializeIntrinsicFunctionNames(Isolate* isolate,
15550 Handle<NameDictionary> dict) { 15550 Handle<NameDictionary> dict) {
15551 ASSERT(dict->NumberOfElements() == 0); 15551 DCHECK(dict->NumberOfElements() == 0);
15552 HandleScope scope(isolate); 15552 HandleScope scope(isolate);
15553 for (int i = 0; i < kNumFunctions; ++i) { 15553 for (int i = 0; i < kNumFunctions; ++i) {
15554 const char* name = kIntrinsicFunctions[i].name; 15554 const char* name = kIntrinsicFunctions[i].name;
15555 if (name == NULL) continue; 15555 if (name == NULL) continue;
15556 Handle<NameDictionary> new_dict = NameDictionary::Add( 15556 Handle<NameDictionary> new_dict = NameDictionary::Add(
15557 dict, 15557 dict,
15558 isolate->factory()->InternalizeUtf8String(name), 15558 isolate->factory()->InternalizeUtf8String(name),
15559 Handle<Smi>(Smi::FromInt(i), isolate), 15559 Handle<Smi>(Smi::FromInt(i), isolate),
15560 PropertyDetails(NONE, NORMAL, Representation::None())); 15560 PropertyDetails(NONE, NORMAL, Representation::None()));
15561 // The dictionary does not need to grow. 15561 // The dictionary does not need to grow.
(...skipping 22 matching lines...) Expand all
15584 } 15584 }
15585 return NULL; 15585 return NULL;
15586 } 15586 }
15587 15587
15588 15588
15589 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) { 15589 const Runtime::Function* Runtime::FunctionForId(Runtime::FunctionId id) {
15590 return &(kIntrinsicFunctions[static_cast<int>(id)]); 15590 return &(kIntrinsicFunctions[static_cast<int>(id)]);
15591 } 15591 }
15592 15592
15593 } } // namespace v8::internal 15593 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/rewriter.cc ('k') | src/runtime-profiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698